Skip to content

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.

issuestatuswavedepends ontitle
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

intent-lifecycle dependency graphfrom .ai/repo/project
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:2px

Canonical record: .ai/repo/project/milestones/intent-lifecycle.yaml. Read it back with majordomus plan show intent-lifecycle.

Searches the titles and descriptions of every page this site publishes.