Ticket Lifecycle Workflow
Complete workflow from starting a ticket to delivering work.
Prerequisites
- CLI installed and authenticated
- Access to GitHub workspace
GitHub Issues
Workflow Overview
In GitHub Issues, tickets flow through these statuses:
- Backlog - New issues created by anyone. Product maintains the backlog, ordering items so top items are ready to work on.
- Ready - Tickets ready to be picked up. Both Product and Engineers can move tickets from Backlog to Ready.
- Planning - Engineer is planning the implementation (auto-transitioned when you run
wseng start). - In Progress - Active development (auto-transitioned when you save your plan via
wseng ws save-plan). - Review - Code is ready for review. PRs are linked via keywords (automatically) or manually in GitHub UI.
- Done - Development complete, awaiting product acceptance.
- Accepted - Product has accepted the work.
Project Board
All tickets across products and teams are tracked in a single GitHub Project. Tickets created in any of our repositories automatically appear here.
Built-in views:
| View | Scope | Description |
|---|---|---|
| My Board | Personal | Kanban board of your active tickets |
| My Backlog | Personal | Your upcoming/unstarted tickets |
| Completed by me | Personal | Tickets you've finished |
| Board | Team-wide | All active tickets across the department |
| Backlog | Team-wide | All upcoming tickets across the department |
| Completed | Team-wide | All completed tickets across the department |
Custom views: Each team or project can create additional views by clicking "Add view" in the project. Filter by labels, assignees, milestones, or any combination to match your workflow.
Working with Ticket Fields
Ticket data lives in three places: project custom fields on the right-hand panel, a computed fields comment, and an output comment. Each has different editability and purpose.
Project Custom Fields
All issues across all products and teams share a single GitHub Project (#553). Custom fields are visible and editable from the right-hand panel in GitHub Issues — expand the project section to see them.
| Field | Type | Description | Auto-managed |
|---|---|---|---|
| Status | Single select | Workflow status | Mostly — CLI transitions it, but you can change it manually too |
| Project | Single select | Product assignment (e.g., WS, Acely) | Yes, defaulted on creation |
| Priority | Single select | Issue priority | Yes, defaulted on creation |
| Story Points | Number | Effort estimation | Yes, calculated by wseng infer-breakdown |
| Demo Recording URL | Text | Link to demo video | Yes, set by wseng demo |
| Demo Environment URL | Text | Link to deployed demo environment | Yes, set by CLI |
| Estimation URL | Text | Link to estimation/plan PR | Yes, set by wseng ws save-plan |
| RCA URL | Text | Root cause analysis document link | Yes, set by CLI |
| Epic Design URL | Text | Epic design document link | Yes, set by CLI |
| Completed At | Date | When work was completed | Yes, set on status transition |
| Accepted At | Date | When work was accepted | Yes, set on status transition |
Most fields are auto-filled or defaulted by the CLI. Status is the one you'll change manually most often. Date fields like Completed At and Accepted At are auto-set on status transitions but exist as project fields (rather than only in the computed fields comment) so they can be used for sorting and filtering in project views.
Computed Fields Comment
A read-only comment marked with <!-- TICKET_COMPUTED_FIELDS --> that the CLI maintains automatically. It renders as a markdown table:
| Field | Source |
|---|---|
| Implementer | GitHub assignee history |
| Reviewer | QC assignment |
| Approver | Timeline |
| Created At | Issue creation date |
| Completed At | Status transition to Done |
| Delivered At | Status transition to Delivered |
| Accepted At | Status transition to Accepted |
| LoC | Code change stats |
| LoC - AI | AI-generated code stats |
| QC Status | QC workflow outcomes (e.g., First Time Pass ✅, Failed ❌) |
Do not edit this comment. These fields are recomputed from status transitions, assignee changes, and QC outcomes. They update when you run CLI workflow commands (wseng qc start, wseng qc pass, etc.) or explicitly via wseng tk update-computed-fields.
Output Comment
A comment at the top of the issue marked with <!-- TICKET_OUTPUT_SECTION -->. The CLI creates it automatically when you start a ticket so it stays pinned near the top of the conversation, not buried under activity.
What to put here:
- Testing instructions for reviewers
- Links to deployed environments
- Key implementation notes
Note: demo video links go in the Demo Recording URL project custom field, not here. The Output section is for content that doesn't fit a single URL field — detailed testing steps, multiple environment links, etc.
How to edit: Find the comment with the # Output header on the issue, click the ··· menu → Edit. Keep the HTML marker as the first line:
<!-- TICKET_OUTPUT_SECTION -->
# Output
## Testing Instructions
1. Run `npm test` to verify all tests pass
2. Start dev server: `npm run dev`
3. Navigate to http://localhost:3000/profile
4. Verify the new profile icon appears
CLI automation: Commands like wseng demo and wseng changelog automatically prepend content to this comment with a --- separator. Your manual content is preserved below.
Time Tracking
Time tracking is not managed in GitHub. Previously tracked via Jira custom fields (billed time, etc.), these metrics now live in the Personal Dashboards spreadsheet, which includes delivery metrics, time spent breakdowns, and per-ticket efficiency data.
The Standard Flow
# 1. Start ticket (transitions Backlog/Ready → Planning)
wseng start ws-eng-cli/123
# Or just use issue number if in current repo:
wseng start 123
# 2. Plan implementation
# Edit .context/plan/plan.md with your approach
# 3. Save plan (transitions Planning → In Progress)
wseng ws save-plan
# 4. Make code changes
# 5. Commit
wseng commit
# 6. Generate changelog
wseng changelog
# 7. Record demo
wseng demo
# 8. Move ticket to Review (manual in GitHub UI)
Step 1: Start the Ticket
wseng start ws-eng-cli/123
# Or just the issue number if working in the repo:
wseng start 123
What this does:
- Creates branch and pull request
- Downloads ticket description to
.context/ticket.md - Auto-generates blank plan at
.context/plan/plan.md - Transitions ticket from Backlog or Ready to Planning status
- Links PR to the issue (via keywords)
Step 2: Write the Plan
Open .context/plan/plan.md and document your implementation approach. Use Cursor or your IDE to explore the codebase and understand requirements from .context/ticket.md.
Good plan structure:
## Files to Create/Modify
- src/services/user.service.ts
- src/resolvers/user.resolver.ts
## Implementation Steps
1. Add getUserProfile method to UserService
2. Expose via GraphQL resolver
3. Add unit tests for service
4. Add E2E test for GraphQL query
Step 3: Save the Plan
wseng ws save-plan
Saves plan to repository and transitions ticket from Planning to In Progress.
Step 4-6: Implement, Commit, Document
Make your changes, then:
# AI-generated commit messages
wseng commit
# Generate summary of changes
wseng changelog
Step 7: Record Demo
wseng demo
Records screen with OBS Studio, uploads to Google Drive, links to ticket/PR. See command reference for OBS setup.
Common Variations
NO-TICKET branches:
wseng start NO-TICKET "quick fix description"
Create new ticket:
wseng start NEW "feature description"
This creates a GitHub Issue in the current repository. The issue is automatically added to the shared GitHub Project, and ticket types/defaults are filled automatically.
Sub-Issues (Subtasks)
GitHub sub-issues are hierarchical - you can create sub-issues of sub-issues up to 8 levels deep, with up to 100 sub-issues per parent. Sub-issues can span repositories (parent and child can be in different repos).
Create sub-issue via CLI:
wseng subtask ws-eng-cli/123 --type backend --start
Create sub-issue via GitHub UI:
Click the "Create sub-issue" button at the bottom of any issue description. You can also add existing issues as sub-issues via the dropdown.
Auto-create sub-issues from plan:
The save-plan command can automatically create sub-issues if you set subtasks: true in the plan frontmatter.
Key differences from old Jira subtasks:
- Sub-issues are fully-featured issues (not a limited subtask type)
- Hierarchical: sub-issues can have their own sub-issues
- Cross-repo: parent and child issues can be in different repositories
- Progress tracking: GitHub Projects shows sub-issue completion progress automatically
Ticket ID Format
GitHub Issues use the format repo/number (e.g., ws-eng-cli/123). If you're working in the current repository, you can just use the issue number (e.g., 123). This can be overridden using project-level or repository-level configuration.
Common Pitfalls
❌ Bad: Starting ticket assigned to someone else
wseng start ws-eng-cli/123
# Error: Ticket assigned to another engineer
Solution: Use --force-assignment to override.
❌ Bad: Skipping the plan
Starting to code immediately without writing a plan leaves the ticket in "Planning" status and makes story point calculation inaccurate.
Solution: Always write and save your plan before coding. It forces you to think through the approach.
Related Docs
RCA Workflow
Special workflow for bugs requiring root cause analysis.
Code Review Workflow
What happens during QC and how to address feedback.
Command Reference
Full reference for all commands used in this workflow.
