Skip to content
Cockpit0.29.0
A snapshot: read at commit 707a04c7ce8 on 2026-10-18T00:06:01Z by majordomus 0.29.0. Nothing on this page is read again. See it live

I2489

A screen over its budget fails the build: the UI's latency budgets are benchmark policy, and bench --check holds them

Where it stands

devtask.issue
Readiness
complete completion is recorded and every required evidence token is present
Status
DONE
Can start
not now
Milestone
Milestone status
ACTIVE
Wave
2
Waiting on
none
Holds back
Behind it in all
2
Evidence
3 of 3
A move writes the repository: it stamps one field of this issue's record and appends one event to the ledger, and a commit will carry both.
The same moves from a terminal

majordomus plan start I2489

majordomus plan verify I2489

majordomus plan done I2489

What it is

Objective
Make the owner's UI latency budget something CI enforces: the benchmark policy declares absolute bounds, bench --check holds them with or without a baseline and on every host, and the ui job runs that check on every change that can slow a screen.
Why
ADR 0142, part 4. The owner's pack set the budgets (a cached capability under 50 ms at p95, a warm server-rendered page under 100 ms, a live update under 250 ms) and said they are 'measured, never invented'. Today nothing holds them: the bench times the UI's screens since the UI-performance batch, and reports; it refuses nothing. The UI was eight seconds slow on master for a day before a person said so.
Now
majordomus bench times every screen of the UI (system.http.ui.* over a pinned context, system.http.live.ui.* over the live view) and bench --check compares a run with a baseline of the same host. A target that was always too slow never regresses, and a platform with no baseline compares nothing, so nothing held a screen to a bound. Measured before this change, debug build at load 57: every warm screen at 1-21 ms p95 except /ui/command at 400-660 ms.
Wanted
.ai/repo/benchmarks/rust/policy.yaml gains budgets: each a prefix of target keys, a cache mode, a metric, a bound in milliseconds and a minimum number of samples, every key but the last required and a malformed one a policy error that names it. Check::compare judges every measurement a budget bounds, whether or not a baseline exists and whatever host recorded it, as PASS, OVER or SHORT; bench --check prints the budget lines with the target, its value and its bound, says within or over budget, and exits 10 when anything is over. The policy declares a warm screen of the UI within 100 ms at p95 for both views. The ui job of validate runs bench system.http. --check before the browser audit, as a step of the ui-audit gate. /ui/command no longer walks the registry once per command: it indexes command lines once per screen. Not done here: measuring the first request after the repository moved, which is I2485.
Done when
unknown: the record declares no `completion`
Risk
unknown: the record declares no `risk`

Acceptance

  • A warm screen measured over its budget fails bench --check with exit 10 and no baseline to compare, and the report names the screen, its value and its bound
  • A budget bounds only the prefix and the cache mode it names, and a measurement of fewer samples than its minimum is SHORT and does not fail
  • A budget with a required key missing, or a cache mode that is not one, is a policy error that names the key
  • The repository's policy declares the UI's budget for the pinned and the live view, and every screen is within it
  • The ui job runs the check before the browser audit, under a bound smaller than the job's
Validation
bin/majordomus plan validatecargo test --test bench_unitsMJ_TEST_JOBS=2 bash test/run.sh 1099_a_screen_over_its_budget_failsmajordomus bench system.http. --transport system --profile ci --no-write --check
Evidence required
bench_budget_unit_testsui_budget_gate_case_1099ui_budget_bench_results
Evidence present
bench_budget_unit_testsui_budget_gate_case_1099ui_budget_bench_results

Scope

Touches
apps/majordomus-cli/src/bench/baseline.rsapps/majordomus-cli/src/ui/command.rsapps/majordomus-cli/tests/bench_units.rs.ai/repo/benchmarks/rust/policy.yaml.ai/repo/ci/gates.yaml.github/workflows/validate.yml.ai/repo/benchmarks/rust/README.mddocs/MAJORDOMUS_UI.mdtest/cases/1099_a_screen_over_its_budget_fails.sh.ai/repo/project/issues/I2489.yaml
Not
unknown: the record declares no `non_scope`
Depends on
Priority
p1
Profile
implementation
Parallel safe
true
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-10-12
Updated
2026-10-13T12:50:44Z
Started
2026-10-13T12:50:07Z
Verified
2026-10-13T12:50:24Z
Completed
2026-10-13T12:50:44Z

Synchronisation

Adapter
scripts/github-sync
Repository
unknown: the derived plan's header carries no repository
External issue
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it
State there
unknown: a live GitHub state; this executable makes no network call, so only `scripts/github-sync --check` can answer it

Findings

Nothing is wrong with these records.