a-finish-reads-the-criteria-its-work-serves — A finish reads what its work serves
The completion policy asks the intent engine what stands for the work a task named, refuses completed while a served criterion is unmet or a guard is violated where the policy says completed means complete, and decides nothing about any intent.
BLOCKED 0 of 1 issues done
- ready
- 0
- blocked
- 1
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
A task now starts bound to the issue and the intent it serves, and the intent engine says which criteria are met and which guards are violated. Finish asks neither. A worker can finish completed while the criterion the work exists for has no evidence.
Outcome
The completion policy asks the intent engine what stands for the work a task named, refuses completed while a served criterion is unmet or a guard is violated where the policy says completed means complete, and decides nothing about any intent.
Current state
The completion policy and finish semantics are pull request 821; the binding, the opposition, the verdict with guards and evaluations are the intent stack. The two meet in no line of code. Revived on 2026-10-18 from the rescue of 2026-10-09, because the milestone never landed; its dependency on intent-satisfaction was dropped, because no milestone of that id exists on master. Re-read on 2026-10-18 for the IDD plan, against master of 2026-10-17: ADR 0107 and case 895 keep completion and intent satisfaction apart; the #821 completion policy exists only on rescue refs. It revives milestone finish-reads-what-its-work-serves of origin/rescue/d1/feature/a-finish-reads-what-its-work-serves (2026-10-09) under its own id, because that record's order, its dependency on a milestone master does not have, and the ADR number it names do not hold on master.
Desired state
An ADR records the decision and its measurement, under a number allocated above the high-water mark when it is written (0115 on the unlanded rescue, which master never received); a policy key says whether an owed answer refuses; two questions of the completion policy are answered from intents.binding; the documents and the claim say what finish asks.
Scope
- apps/majordomus-cli/src/gates
- apps/majordomus-cli/src/capability/builtin/gates.rs
- apps/majordomus-cli/tests
- share/completion.yaml
- lib/gates.sh
- test/cases
- .ai/repo
- docs
- site
Out of scope
- Any change to how a criterion, a guard or a verdict is derived
- Recording evidence at finish
Acceptance criteria
- Where the policy requires it, finish with the outcome completed is refused while a served required criterion is unmet or a guard is violated
- A partial finish is always available and the refusal says so
- No intent record, stage or verdict is written by any finish
Validation
- bash test/run.sh 966_a_finish_reads_what_its_work_serves
- bash test/run.sh 895_a_finished_task_does_not_satisfy_an_intent
Risks
- Evidence is current only for a recorded passing run at a commit in history. Measured: none of the 22 serving issues here has it for every served criterion, so the policy is advisory until recording a run is part of how work is finished.
- Several issues can serve one criterion, and each is held to it until the last.
- A criterion of a kind the ledger cannot derive reads unknown and keeps completed out of reach for the issues serving it.
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 |
|---|---|---|---|---|
| I3259 | BLOCKED | 1 | I3255 | Where the policy says completed means complete, finish refuses completed while a criterion the task serves is unmet, and writes no intent state |
The graph
flowchart LR
I3259["I3259<br/>Where the policy says completed means complete, finish refuses completed while a criterion the task serves is unmet, and writes no intent state"]:::blocked
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:2pxCanonical record: .ai/repo/project/milestones/a-finish-reads-the-criteria-its-work-serves.yaml. Read it back with majordomus plan show a-finish-reads-the-criteria-its-work-serves.