Skip to content

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.

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

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

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

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