#summary For discussions about the issue tracker
#labels Importance-Useful,Phase-Guidelines,Contents-Draft

= Introduction =

Here's the place to discuss ways to improve our use of the issue tracker.  We also use this page to capture information that we've wanted to shoe horn into the issue tracker but haven't yet been able to.


= General Tips =

  * When adding a new issue to the issue tracker, [http://code.google.com/p/soc/issues/list?can=1&q=-status:Verified,Duplicate&sort=-id search all issues], not just the open issues to see if it has been reported before.  There can be a lag between an issue being fixed and it being deployed in a running version of Melange.

  * When merging issues, you may need to change the title summary of the issue.  Generally *don't be shy of changing the title of an issue* to make it clearer to someone reading the list what the issue is about.  

  * *Merging:* Most often we merge new (duplicate) issues into older issues.
  
  * If you want to change the status or title of an issue and don't have the edit-rights to do so, ask on our IRC channel, #melange. 

= Canned Searches =

_See also the specific tags for searches for those tags_

|| [http://code.google.com/p/soc/issues/list?can=1&q=%22201%22&sort=id&colspec=ID+Summary AJaxy Table] || An issue into which many component issues have been merged ||
|| [http://code.google.com/p/soc/issues/list?can=1&q=Issue+357&sort=id&colspec=ID+Summary The 1000 records issue] || A limitation with GAE that needs a workaround ||
|| [http://code.google.com/p/soc/issues/list?can=2&q=&sort=dueby+id&colspec=ID%20DueBy%20Summary%20Owner%20Status Due date] || Issues sorted by due date ||



= Issue Tracker Activities _(Terminology)_ =
  * *Triage:* Deciding what needs to happen for ALL live issues in the tracker.

  * *Cherry Picking:* Going through fixing and closing trivial issues (i.e. quick to fix issues) so that they do not clutter up the tracker.  Often leads to trivial issues changing status (e.g. to !NeedInfo ).

  * *Dredging:* Going through issues which are 6 months+ old, checking they are still valid, ensuring there is some policy in place so that they don't clog up the tracker.  Check for example that old issues which are not live have milestone 'future'.  'Dredging' can also be used for learning from closed issues, for example a spate of related invalid issues may indicate a need for some documentation changes.


= !NeedInfo Status =

  * It is very easy for an issue to get 'stuck' in !NeedsInfo status.  When changing an issue to !NeedsInfo status, it is a good idea to in the comment say what information is needed, so that it is easy to assess whether the issue is still in that status after a number of comments have arrived.

Search for *[http://code.google.com/p/soc/issues/list?can=1&q=Status%3ANeedInfo&sort=id&colspec=ID+Summary NeedInfo Issues]*

= Special Tags and Statuses =

  * *[http://code.google.com/p/soc/issues/list?can=2&q=Label%3AVerbiage&sort=id&colspec=ID+Summary Verbiage]:* This item is a change in wording and if it also has the tag '!NeedsInfo' then likely it needs a decision on the wording to progress.

  * *[http://code.google.com/p/soc/issues/list?can=2&q=Label%3ASecurity&sort=id&colspec=ID+Summary Security]:* At least some part of this issue is security related.  If a security issue is given a low priority some explanation about why it's not something to worry about will usually be given in the comments.

  * *[http://code.google.com/p/soc/issues/list?can=1&q=status%3Acantfix&sort=id&colspec=ID+Summary Can't Fix]:* We won't fix this issue because it's not possible to.  This tag rarely survives long and there currently are just three 'Cant Fix' tags in the tracker. 

  * *[http://code.google.com/p/soc/issues/list?can=1&q=WikiDiscuss&sort=id&colspec=ID+Summary WikiDiscuss]:* Conversation has been taken to the wiki.  If no link is given in the issue tracker comments then visit page [WikiDiscuss].

  * *[http://code.google.com/p/soc/issues/list?can=2&q=&sort=dueby+id&colspec=ID%20DueBy%20Summary%20Owner%20Status DueBy-YEAR-MONTH-DAY]:* Date by which developer with issue assigned intends to have fix committed to mainline.

  * *[http://code.google.com/p/soc/issues/list?can=2&q=PatchReceived&sort=id&colspec=ID+DueBy+Summary+Priority+Owner+Status PatchReceived]:* This issue has had a patch submitted. The patch is under review per these guidelines (taken from [MeetingAgendasNotes 27 April Team Meeting Notes])

----
----

==Patch Reviews==

We want to get a lot *better about reviewing and committing patches*. Right now we are not doing this well enough. New strategy:

  # We quickly sync within 24 hours about who is going to review a patch.
  # All patches will be ack'ed within 48 hours, which means that we say at least "hey thanks we got your patch." Person ack'ing the patch is the person who will review it.
  # Patch will be reviewed and feedback sent to submitter and relevant issue in the tracker updated within 5 days (read: 120 hours). 
----
----

 _Add suggestions for new tags and statuses here..._

=Issue Tracker Stats=

||Date||[http://code.google.com/p/soc/issues/list?can=2&q=PatchReceived&sort=id&colspec=ID+DueBy+Summary+Priority+Owner+Status PatchReceived]||[http://code.google.com/p/soc/issues/list?can=2&q=Label%3ASecurity&sort=dueby+id&colspec=ID+DueBy+Summary+Owner+Status Security]||[http://code.google.com/p/soc/issues/list?can=2&q=Label%3AVerbiage&sort=id&colspec=ID+Summary Verbiage]||[http://code.google.com/p/soc/issues/list?can=1&q=Status%3ANeedInfo&sort=id&colspec=ID+Summary NeedInfo]||[http://code.google.com/p/soc/issues/list?can=1&q=status%3Acantfix&sort=id&colspec=ID+Summary CantFix]||
||2009-May-02|| 3 || 5 || 3 || 4 || 3 ||
||2009-May-21|| 0 || 4 || 3 || 4 || 3 ||

= Related Pages =
  * [TestingGuidelines]
  * [PendingUserStories]
  * [WikiDiscuss]