intent-bound-work — A task is bound to the intent it serves
`start` names an issue, an intent or a declared exemption, asks the binding capability what the task serves, and refuses a refused binding where the policy requires binding. The task record carries what was named and the revision it resolved at. `context` briefs the worker from the binding, `handover` pins the revision, and `handover --resolve` reports drift.
BLOCKED 0 of 5 issues done
- ready
- 0
- blocked
- 5
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
The intent engine can say which intent an issue or a set of paths serves (intent preflight), and nothing asks it. `start` takes a description and a scope; the task record names no issue and no intent; the context a worker is handed says nothing of the criteria the work is for; a handover carries a commit and no trace of the intent it was written under. Work under an intent whose plan was never critiqued is found by `intent validate` after it began, not refused before.
Outcome
`start` names an issue, an intent or a declared exemption, asks the binding capability what the task serves, and refuses a refused binding where the policy requires binding. The task record carries what was named and the revision it resolved at. `context` briefs the worker from the binding, `handover` pins the revision, and `handover --resolve` reports drift.
Current state
intents.preflight exists with no caller. The task record has no issue, intent or exemption field. No exemption class exists anywhere. Nothing computes a revision of an intent, its plan or its critique.
Desired state
One derivation, `Intents::binding`, answered by `intents.binding` on every surface and asked by start, context and handover.
Scope
- apps/majordomus-cli/src/intent.rs
- apps/majordomus-cli/src/intent_binding.rs
- apps/majordomus-cli/src/capability/builtin/intents.rs
- apps/majordomus-cli/src/capability/builtin/continuity.rs
- apps/majordomus-cli/src/commands/intent.rs
- apps/majordomus-cli/src/cli.rs
- apps/majordomus-cli/src/policy.rs
- apps/majordomus-cli/tests
- lib/start.sh
- lib/context.sh
- lib/handover.sh
- lib/common.sh
- lib/intent_binding.sh
- lib/plan.sh
- apps/majordomus-cli/src/plan.rs
- apps/majordomus-cli/src/intent_realization.rs
- share
- .ai/repo/policy.yaml
- .ai/repo/project
- .ai/repo/adrs
- .ai/repo/rules/project
- docs
- test/cases
Out of scope
- Refusing a finish on unmet criteria
- Producing or executing a critique
- Moving the task lifecycle from shell to Rust (ADR 0047)
Acceptance criteria
- A task started with --issue, --intent or by scope resolves through intents.binding, and an ambiguous or refused binding does not start where the policy requires binding
- An exemption is a policy-declared class with a reason, recorded in the task record and the ledger
- The context of a bound task carries the intent section, from the binding
- A handover carries the binding revision and --resolve reports drift
- The command line, HTTP and MCP answer the same binding
Validation
- majordomus intent validate
- cargo test --test intent_binding
- bash test/run.sh 960_a_task_starts_bound_to_what_it_serves
- bash test/run.sh 961_a_resumed_task_is_told_its_intent_moved
Risks
- The records, the ADR and the tests they name land in one change: a criterion whose evidence reference does not resolve fails intent validate, so no part of this milestone reaches the trunk without the rest.
- Requiring binding in this repository refuses the scope-only `start` every session uses today; the refusal must name the three ways through (an issue, an intent, an exemption) or it reads as the tool being broken.
- A pin stored in a task is one step from stored intent state; it must stay a hash compared on read and never a stage or a verdict (rule project.an-intent-outlives-its-sessions).
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 |
|---|---|---|---|---|
| I2000 | BLOCKED | 0 | — | What a piece of work serves is one derivation, with a revision |
| I2001 | BLOCKED | 1 | I2000 | start asks what the task serves and refuses a refused binding where the policy requires it |
| I2002 | BLOCKED | 2 | I2001 | The context of a bound task says what the intent asks of this work |
| I2003 | BLOCKED | 2 | I2001 | A handover pins the binding it was written under, and resolving it reports drift |
| I2004 | BLOCKED | 1 | I2000 | plan start refuses an issue whose binding is refused, in both engines |
The graph
flowchart LR
I2000["I2000<br/>What a piece of work serves is one derivation, with a revision"]:::blocked
I2001["I2001<br/>start asks what the task serves and refuses a refused binding where the policy requires it"]:::blocked
I2002["I2002<br/>The context of a bound task says what the intent asks of this work"]:::blocked
I2003["I2003<br/>A handover pins the binding it was written under, and resolving it reports drift"]:::blocked
I2004["I2004<br/>plan start refuses an issue whose binding is refused, in both engines"]:::blocked
I2000 --> I2001
I2000 --> I2004
I2001 --> I2002
I2001 --> I2003
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 (5)
- I2000 What a piece of work serves is one derivation, with a revision
- I2001 start asks what the task serves and refuses a refused binding where the policy requires it
- I2002 The context of a bound task says what the intent asks of this work
- I2003 A handover pins the binding it was written under, and resolving it reports drift
- I2004 plan start refuses an issue whose binding is refused, in both engines
Canonical record: .ai/repo/project/milestones/intent-bound-work.yaml. Read it back with majordomus plan show intent-bound-work.