# 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, [search all issues](http://code.google.com/p/soc/issues/list?can=1&q=-status:Verified,Duplicate&sort=-id), 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_

| [AJaxy Table](http://code.google.com/p/soc/issues/list?can=1&q=%22201%22&sort=id&colspec=ID+Summary) | An issue into which many component issues have been merged |
|:-----------------------------------------------------------------------------------------------------|:-----------------------------------------------------------|
| [The 1000 records issue](http://code.google.com/p/soc/issues/list?can=1&q=Issue+357&sort=id&colspec=ID+Summary) | A limitation with GAE that needs a workaround              |
| [Due date](http://code.google.com/p/soc/issues/list?can=2&q=&sort=dueby+id&colspec=ID%20DueBy%20Summary%20Owner%20Status) | 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 **[NeedInfo Issues](http://code.google.com/p/soc/issues/list?can=1&q=Status%3ANeedInfo&sort=id&colspec=ID+Summary)**

# Special Tags and Statuses

  * **[Verbiage](http://code.google.com/p/soc/issues/list?can=2&q=Label%3AVerbiage&sort=id&colspec=ID+Summary):** 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.

  * **[Security](http://code.google.com/p/soc/issues/list?can=2&q=Label%3ASecurity&sort=id&colspec=ID+Summary):** 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.

  * **[Can't Fix](http://code.google.com/p/soc/issues/list?can=1&q=status%3Acantfix&sort=id&colspec=ID+Summary):** 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.

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

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

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


---


---


## 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:

  1. We quickly sync within 24 hours about who is going to review a patch.
  1. 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.
  1. 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|[PatchReceived](http://code.google.com/p/soc/issues/list?can=2&q=PatchReceived&sort=id&colspec=ID+DueBy+Summary+Priority+Owner+Status)|[Security](http://code.google.com/p/soc/issues/list?can=2&q=Label%3ASecurity&sort=dueby+id&colspec=ID+DueBy+Summary+Owner+Status)|[Verbiage](http://code.google.com/p/soc/issues/list?can=2&q=Label%3AVerbiage&sort=id&colspec=ID+Summary)|[NeedInfo](http://code.google.com/p/soc/issues/list?can=1&q=Status%3ANeedInfo&sort=id&colspec=ID+Summary)|[CantFix](http://code.google.com/p/soc/issues/list?can=1&q=status%3Acantfix&sort=id&colspec=ID+Summary)|
|:---|:-------------------------------------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------------------------------|:-------------------------------------------------------------------------------------------------------|:--------------------------------------------------------------------------------------------------------|:------------------------------------------------------------------------------------------------------|
|2009-May-02| 3                                                                                                                                    | 5                                                                                                                               | 3                                                                                                      | 4                                                                                                       | 3                                                                                                     |
|2009-May-21| 0                                                                                                                                    | 4                                                                                                                               | 3                                                                                                      | 4                                                                                                       | 3                                                                                                     |

# Related Pages
  * [TestingGuidelines](TestingGuidelines.md)
  * [PendingUserStories](PendingUserStories.md)
  * [WikiDiscuss](WikiDiscuss.md)