I3132 — /ui shows what finish caught beside what being caught cost, and says not observed where there is no ledger
Add one card to the /ui dashboard that reads the gates aggregate: false dones caught, unanswered refusals, refusals by doctrine, median time from first refusal to acceptance, each linking to the tasks it counted, with the kit's not-observed rendering for an absent ledger and in the published snapshot.
BLOCKED wave 2 · p2 · implementation profile · parallel safe
Blocked. This issue cannot start until I3130 is done. The status is derived from that, not declared.
Objective
Add one card to the /ui dashboard that reads the gates aggregate: false dones caught, unanswered refusals, refusals by doctrine, median time from first refusal to acceptance, each linking to the tasks it counted, with the kit's not-observed rendering for an absent ledger and in the published snapshot.
Why
The owner's standing order of 2026-09-11 asks for charts and metrics of the current state; a figure only in a CLI answers nobody who follows the work in a browser. I2943's record exists only on branch fix/an-unobserved-mesh-is-not-zero, so it is named in an acceptance criterion and not in depends_on, which must name a record on the plan's tree. 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#10.
Current state
apps/majordomus-cli/src/ui/dashboard.rs draws the Overview; apps/majordomus-cli/src/ui/view.rs on master has kpi, kpi_count and kpi_state; view::kpi_not_observed exists only on the unlanded branch of I2943.
Desired state
The card renders from the capability alone; the snapshot shows not observed.
Scope
- apps/majordomus-cli/src/ui/dashboard.rs
- docs/MAJORDOMUS_UI.md
- apps/majordomus-cli/src/ui/view.rs
- .ai/repo/project/intents
Out of scope
- A new screen
- Charts over time, which need history the ledger reader does not yet bound
- The /cockpit overview and the dashboard.overview capability (MCP majordomus_dashboard_overview), whose Count measure renders absence as 0, until that capability has an absence-aware measure
Dependencies
Acceptance criteria
- With a fixture ledger the card shows the aggregate's numbers and links each to its tasks
- Without a ledger, live and in the snapshot, the card reads not observed
- The ui audit passes on the dashboard at every width
- The card uses view::kpi_not_observed from I2943 once that issue is on master; no local copy of it is written, and work does not start before it lands
- The card's label says it counts finish refusals only
- Adding the aggregate to FIRST_PAINT updates every_source_is_named_and_the_queue_waits_for_its_own_route in ui/dashboard.rs
- Criterion ui-shows-caught-beside-cost of the intent carries evidence: test with ref apps/majordomus-cli/tests/ui_caught.rs
Validation
- cargo test --test dashboard
- scripts/ui audit --only /ui/
Evidence required
- test_ui_caught
Evidence
None recorded. Every token above needs a command or an artifact behind it before this issue can be completed; narrative is refused.
Timeline
- started
- —
- verified
- —
- completed
- —
Those three fields, the evidence above and the state of the dependencies are all the status is made of. There is no status field to disagree with them.
Canonical record: .ai/repo/project/issues/I3132.yaml. Read it back with majordomus plan show I3132.