Issue Tracking Guidelines
Ticket Hierarchy
- One issue = one commit (atomic)
- No skip-level parenting (issue cannot be direct child of Legendary)
- No orphan issues (every issue must belong to at least one Epic)
- Epics: no parent → Legendary; Issues: parent → Epic
- Legendaries: no parent (root nodes)
Issue Quality Criteria (all must be met)
- Atomicity: smallest meaningful unit of work
- Single Commit: one issue = one commit
- Single Responsibility: one concern only
- Assignability: one developer, no synchronization needed
- Verifiability: clear binary verification criterion
- Self-Containment: all context present in issue + parent Epic
- Implementation Independence: ideally no blocking on sibling issues
- Subtask Decomposition: checkbox list (unless trivially simple)
- Leaf Node: no child tickets (promote to Epic if decomposition needed)
- Mandatory Parent: belongs to at least one Epic
Epic Quality Criteria (all must be met)
- Demonstrable Outcome: can show to stakeholder when complete
- Thematic Coherence: all child issues share unified goal
- Own Acceptance Criteria: beyond "all children closed"
- Full Decomposability: can be broken into issues at planning time
- Bounded Scope: clear finite endpoint
- Minimum Composition: at least 2 child issues
- Coordination Boundary: where cross-developer dependencies are managed
- Milestone Affinity: typically aligns with single milestone
- Mandatory Parent: must belong to at least one Legendary
- Finite Completion: closed permanently when done
Legendary Quality Criteria (all must be met)
- Strategic Alignment: major architectural/business pillar
- Articulated End State: concrete verifiable terminal condition
- Multi-Milestone Span: naturally spans multiple milestones
- Epic Grouping: groups Epics by strategic theme
- Minimum Composition: at least 2 child Epics
- Relative Independence: minimal cross-Legendary blocking
- Progress Measurability: measured by Epic completion
- Owner Accountability: project owner level concern
- No Parent: root of hierarchy
- Finite Completion: closed permanently when done
Mandatory Issue Sections
Label System
State/ labels (exactly one always required)
| Label |
Meaning |
| State/Unverified |
Just created, not yet reviewed (initial state for ALL new issues) |
| State/Verified |
Maintainer confirmed valid, ready to work |
| State/In progress |
Someone actively working on it |
| State/Paused |
Work stopped, usually blocked (add Blocked label too) |
| State/In review |
PR submitted, awaiting peer review |
| State/Completed |
PR merged, all work done |
| State/Wont Do |
Won't be addressed (comment explaining reason required) |
| Duplicate |
Duplicate issue (link to original, close) |
Type/ labels (exactly one required)
| Label |
Meaning |
| Type/Bug |
Defect in existing functionality |
| Type/Feature |
New capability or user story |
| Type/Task |
Technical/admin work (refactor, deps, docs, infra) |
| Type/Testing |
TDD issue-capture test or standalone test work |
| Type/Epic |
Large body of work composed of multiple issues |
| Type/Legendary |
Strategic pillar composed of multiple Epics |
Priority/ labels (required for non-Epic, non-Legendary)
| Label |
Meaning |
| Priority/Critical |
Immediate; outages, data loss, security vulnerabilities |
| Priority/High |
Current or next development cycle |
| Priority/Medium |
Valid, not urgent |
| Priority/Low |
Nice to have, time-insensitive |
| Priority/Backlog |
Default; not yet pulled into sprint |
Note: Bug issues are ALWAYS Priority/Critical
MoSCoW/ labels (project owner only — contributors must NOT set these)
| Label |
Meaning |
| MoSCoW/Must Have |
Milestone cannot complete without it |
| MoSCoW/Should Have |
Important but not blocking milestone |
| MoSCoW/Could Have |
Nice to have if time permits |
No "Won't Have" label — use State/Wont Do instead
Special labels
| Label |
Meaning |
| Blocked |
Cannot proceed (must link blocking issue in comment) |
| Signed-off:Owner |
Project owner sign-off on Epic/Legendary |
| Signed-off:scrum master |
Scrum master sign-off on Epic/Legendary |
| Signed-off:Tech Lead |
Tech lead sign-off on Epic/Legendary |
Linking and Dependencies (CRITICAL)
Direction rule
- Ticket that must complete FIRST = the BLOCKER
- Ticket that cannot proceed until blocker resolves = the DEPENDENT
- BLOCKER "blocks" DEPENDENT
- DEPENDENT "depends on" BLOCKER
PR to Issue (most critical case)
- PR → blocks → Issue (PR must complete before issue can close)
- Issue → depends on → PR
- WRONG DIRECTION: Issue blocks PR → creates unresolvable deadlock in Forgejo
(Issue can't close until PR merges; PR can't merge until issue closes)
Parent-child hierarchy
- Child issue → blocks → parent Epic (child must complete for parent to complete)
- Parent Epic → depends on → child issue
- Set by: open child, add parent under "blocks" (OR open parent, add child under "depends on")
- NEVER reference parent by number in description body text
Blocked issues
- Add Blocked label
- Link to blocking issue in a comment
- Add Forgejo dependency (blocking issue blocks dependent; dependent depends on blocking)
- If no ticket for blocker → create one immediately
- Move blocked issue to State/Paused
Ticket Lifecycle Flow