intent-lifecycle — Work is traceable to the intent it serves, and an intent is satisfied only by evidence
An intent is a typed record above the milestones that realise it: a statement, its invariants, and satisfaction criteria each naming the evidence that settles it. Its stage is derived from the plan's milestone status and its satisfaction from the evidence ledger, never stored. A gate refuses an intent that names no milestone or evidence that resolves to nothing, a session's preflight names the intent its work serves or refuses, the Cockpit shows intents with measured and enforced coverage of its scripts, and a milestone closes on GitHub only when the intents it serves are satisfied.
PLANNED 0 of 3 issues done
- ready
- 2
- blocked
- 1
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
This repository models the work: milestones are outcomes, issues are execution contracts, commits trace to issues and claims trace to recorded runs. Nothing above the milestone records what must become true for a person, so no command can say which outcome a change serves, whether a set of finished milestones achieved what they were for, or which intents have no work and which work has no intent. The public site stated as much: 'There is no intent object, no intent registry and no intent id.' An intent lived only in a prompt, and a prompt is unversioned, unenforced and gone when the session ends.
Outcome
An intent is a typed record above the milestones that realise it: a statement, its invariants, and satisfaction criteria each naming the evidence that settles it. Its stage is derived from the plan's milestone status and its satisfaction from the evidence ledger, never stored. A gate refuses an intent that names no milestone or evidence that resolves to nothing, a session's preflight names the intent its work serves or refuses, the Cockpit shows intents with measured and enforced coverage of its scripts, and a milestone closes on GitHub only when the intents it serves are satisfied.
Current state
Milestones and issues are validated by `majordomus plan validate`; claims are joined to recorded runs by `majordomus evidence`. There is no intent kind, no intent capability and no gate that relates work to an intent.
Desired state
A worker asks which intent a change serves and one capability answers from the plan, or refuses naming the missing link. A reader asks whether an intent is satisfied and the answer is derived from recorded evidence, not from a merged pull request.
Scope
- .ai/repo/project
- .ai/repo/ci/gates.yaml
- .ai/repo/rules/project
- .ai/repo/adrs
- apps/majordomus-cli/src
- share/schemas/majordomus/intent
- share/kinds.yaml
- share/cockpit
- site/data
- test/cases
Out of scope
- A second task lifecycle beside the plan; the stage is derived and nothing transitions
- Storing an intent status, or stamping an intent from a merge
- Deriving a plan from an intent automatically
Acceptance criteria
- Slice 1 — typed record and gate: the intent kind, its schema in the distribution and the skeleton, the read-only capabilities intents.list, intents.record, intents.validate and intents.preflight on every surface, and the intent-check gate refusing an invalid intent model
- Slice 2 — satisfaction is decided by evidence alone (ADR 0107): completion discharges obligations and never decides whether an intent is satisfied; the intent engine is the one authority for a criterion's verdict, and a derived `verdict` answers satisfaction separately from the plan-derived stage
- Slice 3 — preflight join: devcontext and the session start name the intent the task serves, from intents.preflight, and load its governance
- Slice 4 — Cockpit Intent view, with the Cockpit's JavaScript coverage measured and enforced by a gate
- Slice 5 — GitHub reconciliation: milestones projected with the intent they serve, and a closure gate that refuses to close a milestone whose intents are unsatisfied
Validation
- majordomus intent validate
- cargo test --test intent
- bash test/run.sh 367_an_intent_is_satisfied_only_by_evidence
Risks
- An intent model that grows a status or a transition becomes a second lifecycle beside the plan, and the two would disagree the first time an issue is re-planned.
- Satisfaction criteria backed by commands or deployments are not derivable from the ledger yet, so an intent resting only on them can never read satisfied; its verdict reads unknown until those kinds become derivable.
Issues
Each one is an execution contract with its own acceptance criteria, validation command and required evidence. The wave column is the layer of the dependency graph it sits in.
| issue | status | wave | depends on | title |
|---|---|---|---|---|
| I1900 | READY | 0 | — | An intent is a typed record whose stage and satisfaction are derived |
| I1903 | BLOCKED | 1 | I1900 | The work realising an intent is joined across episodes, providers and handovers |
| I3258 | READY | 0 | — | Evidence for and against one criterion is kept and named, and the criterion reads unknown until it is settled |
The graph
flowchart LR
I1900["I1900<br/>An intent is a typed record whose stage and satisfaction are derived"]:::ready
I1903["I1903<br/>The work realising an intent is joined across episodes, providers and handovers"]:::blocked
I3258["I3258<br/>Evidence for and against one criterion is kept and named, and the criterion reads unknown until it is settled"]:::ready
I1900 --> I1903
classDef done stroke:#16a34a,fill:#dcfce7,color:#14532d,stroke-width:2px
classDef active stroke:#2563eb,fill:#eff6ff,color:#1e3a8a,stroke-width:2px
classDef verify stroke:#7c3aed,fill:#f5f3ff,color:#4c1d95,stroke-width:2px
classDef ready stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef planned stroke:#0891b2,fill:#ecfeff,color:#164e63,stroke-width:2px
classDef blocked stroke:#b45309,fill:#fffbeb,color:#78350f,stroke-width:2px
classDef cancelled stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2px
classDef superseded stroke:#6b7280,fill:#f9fafb,color:#374151,stroke-width:2pxLinked from this diagram (3)
Canonical record: .ai/repo/project/milestones/intent-lifecycle.yaml. Read it back with majordomus plan show intent-lifecycle.