Skip to content

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

Part of the-product-shows-what-it-caught — What finish caught is counted from the ledger and compared on the benchmark, never asserted.

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.

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