/ticket:new¶
Codex: $ticket-new · Antigravity / Gemini CLI / Copilot: /ticket-new
The single entry point to capture work — one ticket, or a dependency-ordered slate of several — with a mandatory alignment-interview pass before scope locks in. See Aligned by design for why that pass exists.
Precondition: valid config.yaml; a description of the work, either as
$ARGUMENTS or given inline when asked.
Flow¶
flowchart TD
Start(["/ticket:new <description>"]) --> ID["Reserve next ticket ID"]
ID --> Understand["Restate the request<br/>(type, milestone guess)"]
Understand --> G1{"Gate: Continue / Edit /<br/>Save as inbox / Abort"}
G1 -->|edit| Understand
G1 -->|save as inbox| Inbox(["Saved to inbox stage"])
G1 -->|abort| Aborted(["Nothing committed"])
G1 -->|continue| Analyze
Analyze["Read affected files"] --> Research{{"Dispatch registered<br/>research agents in parallel<br/>(docs / precedent / perf / language)"}}
Research --> NFR{{"Dispatch nfr-analyst<br/>(always, every type)"}}
NFR --> G2{"Gate: Continue / Edit /<br/>Save as inbox / Abort"}
G2 -->|edit| Analyze
G2 -->|save as inbox| Inbox
G2 -->|abort| Aborted
G2 -->|continue| Grill
Grill["Alignment grilling —<br/>AskUserQuestion chain,<br/>walks the decision tree<br/>branch by branch<br/>(NFR decisions included)"] --> Decisions["Folds every answer + assumption<br/>into '## Decisions & assumptions'<br/>and '## Non-functional requirements'"]
Decisions --> G3{"Gate: decomposition plan —<br/>Continue / Edit the split /<br/>Save as inbox / Abort"}
G3 -->|edit| Grill
G3 -->|save as inbox| Inbox
G3 -->|abort| Aborted
G3 -->|single ticket| ResearchApproach
G3 -->|slate| SlateDraft
ResearchApproach["feature type only:<br/>up to 3 candidate approaches,<br/>license-filtered"] --> G4{"Gate: Continue / Edit /<br/>Save as inbox / Abort"}
G4 -->|edit| ResearchApproach
G4 -->|save as inbox| Inbox
G4 -->|abort| Aborted
G4 -->|continue| Body
Body["Draft body sections<br/>(per-type required + Decisions + NFRs)"] --> G5{"Gate: Continue / Edit /<br/>Save as inbox"}
G5 -->|edit| Body
G5 -->|save as inbox| Inbox
G5 -->|continue| Frontmatter
Frontmatter["Set priority / effort / risk /<br/>depends_on / related,<br/>validate against effort cap"] --> G6{"Gate: Commit to backlog /<br/>Edit / Save as inbox"}
G6 -->|edit| Frontmatter
G6 -->|save as inbox| Inbox
G6 -->|commit| Create["create_artifact(target_role: pickable)"]
Create --> Report(["Report ticket path / issue URL"])
SlateDraft["Draft research + body + frontmatter<br/>silently, per ticket in the slate;<br/>wire intra-slate depends_on"] --> SlateShow["Show the whole slate as one block"]
SlateShow --> G7{"Gate: Commit all / Modify<br/>(edit or drop, loop) /<br/>Save all to inbox / Abort"}
G7 -->|modify| SlateDraft
G7 -->|save as inbox| Inbox
G7 -->|abort| Aborted
G7 -->|commit all| CreateSlate["Create in dependency order,<br/>resolving NEW-k handles<br/>to real IDs as it goes"]
CreateSlate --> Report
Reads / writes¶
- Reads: affected source files; registered research agents (parallel dispatch); the fixed
nfr-analyst, dispatched on every ticket; the optionalnfr:config profile. - Writes:
create_artifact(filesystem: new ticket file + ledger entry, one commit per ticket; GitHub:gh issue create+ labels + Project item), orsave_as_inboxif diverted at any gate.
Exit states¶
| Outcome | Result |
|---|---|
| Committed | Ticket(s) land in the pickable stage, ready for /ticket:pick |
| Saved to inbox | Requires a configured inbox role; resume later with /ticket:refine |
| Aborted | Nothing committed; any reserved slate IDs are not reclaimed |
| Slate partially modified | User drops or edits individual tickets before the single slate-wide commit gate |
See also¶
/ticket:refine— resumes anything saved to inbox- Configuration reference § Types — per-type required body sections and the effort cap
nfr-analyst— how the## Non-functional requirementssection is derived, and why each line names its verification