Issue Lifecycle — State Machine
This document describes the automated lifecycle for issues filed in JeffSteinbok/octo — from Jeff’s approval through planning, implementation, PR review, and merge.
State Machine
⚠️ Nothing merges without Jeff’s approval. Two manual gates are always required:
- Jeff adds
ilc:approvedto kick off planning- Jeff adds
ilc:plan-approvedto kick off implementation- Jeff clicks Merge on the PR — no auto-merge, ever
Code goes in only when Jeff says so.
stateDiagram-v2
[*] --> Opened : issue opened
Opened --> [*] : nothing happens automatically
Opened --> PlanWorking : Jeff adds ilc:approved\nOcto starts writing plan (ilc:plan-working)
PlanWorking --> PlanComplete : plan written + commented (ilc:plan-complete)
PlanComplete --> NeedsInput : Jeff adds ilc:needs-input
NeedsInput --> PlanWorking : Jeff clarifies
PlanComplete --> Implementing : Jeff adds ilc:plan-approved\nOcto spawns coding agent (ilc:impl-working)
Implementing --> ImplComplete : code committed (ilc:impl-complete)
ImplComplete --> PRReview : PR opened (ilc:pr-review)
PRReview --> Merged : Jeff merges PR
PRReview --> Implementing : Jeff adds ilc:pr-needs-work\nloop back to impl-working
Merged --> [*]
Opened --> [*] : closed / wontfix
Labels
All lifecycle labels are namespaced with the ilc: prefix (issue lifecycle) so they group together and never collide with ad-hoc labels. Only one lifecycle label should be active at a time.
Plan phase
| Label | Set by | Meaning |
|---|---|---|
ilc:approved | Jeff | Start planning — Octo picks this up and writes a plan |
ilc:plan-working | Octo | Actively writing the plan |
ilc:plan-complete | Octo | Plan written and commented — awaiting Jeff’s review |
ilc:needs-input | Jeff or Octo | Blocked — waiting on info or a decision before proceeding |
ilc:plan-approved | Jeff | Plan approved — implementation can start |
Implementation phase
| Label | Set by | Meaning |
|---|---|---|
ilc:impl-working | Octo | Coding subagent is actively implementing |
ilc:impl-complete | Octo | Implementation done, PR not yet open |
PR phase
| Label | Set by | Meaning |
|---|---|---|
ilc:pr-draft | Octo | Draft PR open |
ilc:pr-review | Octo | PR ready for Jeff’s review and merge |
ilc:pr-needs-work | Jeff | PR has review comments — loop back to impl-working |
What Octo does at each step
ilc:approved label added by Jeff
- Removes
ilc:approved, addsilc:plan-working - Reads the issue body
- Writes a plan comment — what changes, which files, approach, risks
- Replaces
ilc:plan-workingwithilc:plan-complete - Pings Jeff in the issue’s
#codingthread
ilc:plan-approved label added by Jeff
- Removes
ilc:plan-complete, addsilc:impl-working - Spawns the coding agent into the
#codingthread - Coding agent implements the fix, commits, sets
ilc:impl-complete, opens a PR - Adds
ilc:pr-review - Pings Jeff in the thread
ilc:pr-needs-work label added by Jeff
- Removes
ilc:pr-review, addsilc:impl-working - Coding agent reads PR comments, fixes issues, pushes
- Restores
ilc:pr-review - Pings Jeff in the thread
Skill
The coding agent’s issue-lifecycle skill implements this flow. It is invoked by the github-issues webhook hook mapping whenever a relevant issue or PR event fires.