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
3of3
Moves
plan.transitionWhat 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.