Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Ticket management best practices for Linear or equivalent project tracker. Use when creating issues, updating ticket status, attaching evidence, parsing acceptance criteria, or working with ticket UUIDs. Provides evidence templates for dev/staging/done phases.
.claude/skills/bybren-llc-linear-sop/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-05 | ✗→✓ | ▲ Improved | 48% | 0% |
| case-02 | ✗→✓ | ▲ Improved | 10% | 0% |
| case-03 | ✗→✓ | ▲ Improved | 38% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 26% | 0% |
| case-06 | ✗→✓ | ▲ Improved | -6% | 0% |
Guide consistent Linear ticket management. Provides evidence templates for the mandatory dev/staging/UAT evidence policy.
Since Gemini CLI doesn't have native Linear integration, use the Linear web UI or CLI for these operations:
bash# Via Linear Web UI # Navigate to: https://linear.app/team/{{PROJECT_TEAM_NAME}}/issue/{{TICKET_PREFIX}}-XXX # Or use Linear CLI if installed linear issue view {{TICKET_PREFIX}}-XXX
bash# Via Linear Web UI: Click "New Issue" or press C # Or use Linear CLI: linear issue create --title "feat(scope): description" --team {{PROJECT_TEAM_NAME}}
bash# Via Linear Web UI: Open issue and update status # Or use Linear CLI: linear issue update {{TICKET_PREFIX}}-XXX --state "Done"
bash# Via Linear Web UI: Open issue and add comment # Or use Linear CLI: linear issue comment {{TICKET_PREFIX}}-XXX "**Dev Evidence**\n\n..."
For work that spans many issues, Linear has objects above the issue. Use them; do not flatten a program into a flat list of tickets.
textInitiative the program (one per program) └── Project a Unit of Work — one coherent outcome ├── Milestone an AI-DLC phase: Inception, Construction, Operations └── Issue a Story └── Sub-issue a Mob Elaboration task (created during Inception, not before)
Program build-out assumes these label namespaces are pre-created in the workspace. Create them before building the program, not during:
bolt:0 … bolt:N — which Bolt an issue belongs toagent:* — the lead role (must match an actual agent role defined for the project)Labels are workspace-scoped in Linear — do not create team-scoped duplicates.
Linear sub-initiatives require an Enterprise plan. If your workspace has it, model program streams as sub-initiatives under the initiative. If it does not, encode the stream as project priority instead — highest-risk stream gets Urgent/High, follow-up stream gets Medium.
bash# Create the initiative # Linear Web UI: Initiatives → New initiative # Add a project (Unit of Work) to the initiative # Linear Web UI: Initiative → Add project # Add the three AI-DLC phase milestones to each project # Linear Web UI: Project → Milestones → New milestone # Wire dependencies between issues # Linear Web UI: Issue → Add relation → "Blocks" / "Blocked by"
Use relatedTo ("Related") for soft links that inform but do not block.
Wire so the enforcement lands before the thing it enforces — see the safe-ai-dlc skill for the four dependency-wiring heuristics.
When a program absorbs tickets that already exist, update them into the project — never recreate them. Duplicates break traceability and split the evidence trail.
Every issue requires evidence at each phase:
| Phase | Required? | Content | | ----------- | --------- | ----------------------- | | Dev | MUST | Implementation proof | | Staging | MUST | UAT validation (or N/A) | | Done | MUST | Final verification |
markdown**Dev Evidence** **PR**: https://github.com/{{ORG_NAME}}/{{REPO_NAME}}/pull/XXX **Commit**: [short-hash] **Branch**: {{TICKET_PREFIX}}-XXX-description **Implementation:** - [x] Feature implemented - [x] Tests passing - [x] Lint passing **Verification:** \`\`\`bash yarn ci:validate # Output: All checks passed \`\`\`
markdown**Staging Evidence** **Environment**: Pop OS dev server **URL**: http://pop-os:3000 **Validation Steps:** 1. Deployed to staging: [timestamp] 2. Smoke test passed: [yes/no] 3. Feature verified: [description] **UAT Status:** [Passed/Pending/N/A] If N/A, reason: [e.g., "Dev tooling only - no user-facing changes"]
markdown**Done Evidence** **PR Merged**: https://github.com/{{ORG_NAME}}/{{REPO_NAME}}/pull/XXX **Merge Commit**: [hash] **Final Checklist:** - [x] All acceptance criteria met - [x] Documentation updated (if applicable) - [x] No regressions detected
When reading issue descriptions, extract ACs:
markdown## Acceptance Criteria - [ ] User can perform action X - [ ] System responds with Y - [ ] Error handling for Z
Convert to testable checklist:
typescriptconst acceptanceCriteria = [ { criterion: "User can perform action X", verified: false }, { criterion: "System responds with Y", verified: false }, { criterion: "Error handling for Z", verified: false }, ];
textBacklog -> Ready -> In Progress -> Testing -> Ready for Review -> Done
Tickets referenced in commit messages (e.g., [{{TICKET_PREFIX}}-123]) automatically move to Done when the PR merges. Child stories not referenced in any commit message must be manually closed after merge.
Best practice: Reference Feature-level tickets in commit messages. After merge, manually close orphaned child stories that weren't referenced.
| From | To | When | | ---------------- | ---------------- | ------------------------ | | Backlog | Ready | Sprint planning | | Ready | In Progress | Work starts | | In Progress | Testing | PR created | | Testing | Ready for Review | Tests pass, UAT complete | | Ready for Review | Done | POPM approval or auto-sync via PR merge |
Linear uses UUIDs internally. When working with APIs:
typescript// Issue identifiers (human-readable) const issueId = "{{TICKET_PREFIX}}-459"; // UUIDs (API operations) const uuid = "ef6a5fa0-2b46-417f-8266-dea2d187b10a"; // Get UUID from identifier via Linear web UI or API // The issue URL contains the UUID
PRs are automatically linked when:
{{TICKET_PREFIX}}-XXX[{{TICKET_PREFIX}}-XXX]Use Linear web UI: Click "Add sub-issue" on parent issue
Use Linear web UI filters:
docs/sop/AGENT_WORKFLOW_SOP.md| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-05 | fail→pass | 10,621 | 4,231 | -60% | 1 | 1 | 0% | 1,658 | 2,447 | +48% | 0 | 0 | — |
case-01 | pass→pass | 9,191 | 3,254 | -65% | 1 | 1 | 0% | 1,497 | 2,384 | +59% | 0 | 0 | — |
case-02 | fail→pass | 15,945 | 5,951 | -63% | 1 | 1 | 0% | 2,505 | 2,765 | +10% | 0 | 0 | — |
case-03 | fail→pass | 11,649 | 6,379 | -45% | 1 | 1 | 0% | 2,092 | 2,884 | +38% | 0 | 0 | — |
case-04 | fail→pass | 12,660 | 4,302 | -66% | 1 | 1 | 0% | 1,956 | 2,472 | +26% | 0 | 0 | — |
case-06 | fail→pass | 16,118 | 3,719 | -77% | 1 | 1 | 0% | 2,541 | 2,377 | -6% | 0 | 0 | — |
case-07 | pass→pass | 12,348 | 5,353 | -57% | 1 | 1 | 0% | 1,930 | 2,612 | +35% | 0 | 0 | — |
case-08 | fail→pass | 13,630 | 3,371 | -75% | 1 | 1 | 0% | 2,061 | 2,341 | +14% | 0 | 0 | — |
case-09 | fail→pass | 11,173 | 4,039 | -64% | 1 | 1 | 0% | 1,837 | 2,364 | +29% | 0 | 0 | — |
case-10 | fail→pass | 11,390 | 6,684 | -41% | 1 | 1 | 0% | 1,804 | 2,870 | +59% | 0 | 0 | — |
case-11 | pass→pass | 17,614 | 2,781 | -84% | 1 | 1 | 0% | 1,531 | 2,170 | +42% | 0 | 0 | — |
case-12 | fail→pass | 7,386 | 2,485 | -66% | 1 | 1 | 0% | 1,055 | 2,091 | +98% | 0 | 0 | — |
case-13 | fail→pass | 14,048 | 3,114 | -78% | 1 | 1 | 0% | 2,264 | 2,300 | +2% | 0 | 0 | — |
case-14 | pass→pass | 11,761 | 2,459 | -79% | 1 | 1 | 0% | 1,801 | 2,083 | +16% | 0 | 0 | — |
case-15 | fail→pass | 9,777 | 1,355 | -86% | 1 | 1 | 0% | 1,475 | 1,925 | +31% | 0 | 0 | — |
case-16 | pass→pass | 8,326 | 2,105 | -75% | 1 | 1 | 0% | 1,378 | 2,015 | +46% | 0 | 0 | — |
case-17 | pass→pass | 9,198 | 4,876 | -47% | 1 | 1 | 0% | 1,384 | 2,524 | +82% | 0 | 0 | — |
case-18 | pass→pass | 9,553 | 1,898 | -80% | 1 | 1 | 0% | 1,387 | 2,024 | +46% | 0 | 0 | — |
case-19 | pass→pass | 4,971 | 1,780 | -64% | 1 | 1 | 0% | 739 | 1,965 | +166% | 0 | 0 | — |
case-20 | pass→pass | 12,847 | 8,782 | -32% | 1 | 1 | 0% | 1,962 | 3,118 | +59% | 0 | 0 | — |
case-21 | pass→pass | 12,425 | 9,851 | -21% | 1 | 1 | 0% | 2,328 | 3,632 | +56% | 0 | 0 | — |
case-22 | pass→pass | 16,814 | 16,061 | -4% | 1 | 1 | 0% | 2,497 | 4,192 | +68% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of +50 percentage points is the difference between those two pass rates over the 22 comparable cases.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.