the-product-shows-what-it-caught — What finish caught is counted from the ledger and compared on the benchmark, never asserted
One read over the ledger answers what finish caught and what it cost, a refusal nobody answered is separated from a caught one, /ui shows it, and the benchmark gains an acceptance metric beside its token metric.
BLOCKED 0 of 4 issues done
- ready
- 0
- blocked
- 4
- active
- 0
- verify
- 0
- done
- 0
- cancelled
- 0
Problem
task.refused was added to the ledger so that the tool's own benefit could be counted (share/events.yaml: 'a refusal that was later satisfied is a false done that was caught'), but no capability, page or report reads it. The economics benchmark compares tokens and states that the finish contract's effect is not measured (docs/ECONOMICS.md, 'What this does not measure'), and no live pair has been recorded (docs/generated/economics.md at 707a04c7ce8: 0 valid pairs under methodology 1). So the one product metric every assessment named has a producer and no reader. Proposed in ADR 0208 (The product's value is stated as the false dones its finish caught, beside the friction it cost) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c119#7, chatgpt-majordomus:c119#10, chatgpt-majordomus:c256#2, chatgpt-majordomus:c277#1.
Outcome
One read over the ledger answers what finish caught and what it cost, a refusal nobody answered is separated from a caught one, /ui shows it, and the benchmark gains an acceptance metric beside its token metric.
Current state
lib/finish.sh:108 appends task.refused (task_id, outcome, unmet, refused, contract) to each checkout's $MJ_STATE_DIR/ledger.jsonl, which is checkout-local and lost when a worktree is removed; task.finished already records verify.tree from mj_worktree_tree_id; lib/history.sh:158 only prints the line. gates.completion judges one task; no capability aggregates, and the Rust side already reads the ledger through apps/majordomus-cli/src/ledger.rs. .ai/repo/benchmarks/economics/methodology.yaml measures effective_token_reduction, and its pairing treats a failed run as invalid; tasks carry hidden acceptance tests already.
Desired state
A gates capability (one capability! declaration, every transport generated) aggregates task.refused and task.finished; events carry a tree digest; /ui dashboard draws it with view::kpi_not_observed for absence; the methodology names an acceptance metric over the existing pilot corpus.
Scope
- apps/majordomus-cli/src/capability/builtin/gates.rs
- lib/finish.sh
- share/events.yaml
- apps/majordomus-cli/src/ui/dashboard.rs
- .ai/repo/benchmarks/economics/methodology.yaml
- docs/ECONOMICS.md
- apps/majordomus-cli/src/ledger.rs
Out of scope
- Token economics (ADR 0082)
- Cost per accepted outcome, which waits on execution-telemetry
- Publishing checkout-local ledger figures on the public site
- The /cockpit overview card (dashboard.overview), until its measure renders absence as not observed
Acceptance criteria
- Every criterion of intent the-product-shows-what-it-caught has its evidence
- No second ledger, registry or hand-written OpenAPI entry is added
Validation
- majordomus plan validate
Risks
- The ledger is checkout-local, so a figure covers one checkout; it must say which
- A counted refusal invites gaming by refusing more; the figure is shown beside the unanswered-refusal count
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 |
|---|---|---|---|---|
| I3130 | BLOCKED | 1 | I0401 | The ledger answers how many false dones finish caught, by doctrine, with the tasks it counted |
| I3131 | BLOCKED | 2 | I3130 | A refusal answered by no change to the tree is not counted as a caught false done |
| I3132 | BLOCKED | 2 | I3130 | /ui shows what finish caught beside what being caught cost, and says not observed where there is no ledger |
| I3133 | BLOCKED | 1 | I0401 | The economics benchmark measures acceptance: how many sessions declared done while the task's hidden tests fail, with and without the finish contract |
The graph
flowchart LR
I3130["I3130<br/>The ledger answers how many false dones finish caught, by doctrine, with the tasks it counted"]:::blocked
I3131["I3131<br/>A refusal answered by no change to the tree is not counted as a caught false done"]:::blocked
I3132["I3132<br/>/ui shows what finish caught beside what being caught cost, and says not observed where there is no ledger"]:::blocked
I3133["I3133<br/>The economics benchmark measures acceptance: how many sessions declared done while the task's hidden tests fail, with and without the finish contract"]:::blocked
I3130 --> I3131
I3130 --> I3132
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 (4)
- I3130 The ledger answers how many false dones finish caught, by doctrine, with the tasks it counted
- I3131 A refusal answered by no change to the tree is not counted as a caught false done
- I3132 /ui shows what finish caught beside what being caught cost, and says not observed where there is no ledger
- I3133 The economics benchmark measures acceptance: how many sessions declared done while the task's hidden tests fail, with and without the finish contract
Canonical record: .ai/repo/project/milestones/the-product-shows-what-it-caught.yaml. Read it back with majordomus plan show the-product-shows-what-it-caught.