Skip to content

I3240 — A pull request's browser audit visits the pages its change can reach, and a shared-layout change sweeps them all

Map each route to the templates, styles and scripts it renders from, and audit on a pull request only the routes whose inputs changed plus one representative per route class. Any change to the shared layout, CSS or JS escalates to the full sweep, which also runs on the combined top.

BLOCKED wave 6 · p2 · implementation profile · parallel safe

Part of a-change-is-judged-in-minutes — A change is derived in under a second and judged in minutes, and nothing that could have changed is skipped.

Blocked. This issue cannot start until I2350, I3242 are done. The status is derived from that, not declared.

Objective

Map each route to the templates, styles and scripts it renders from, and audit on a pull request only the routes whose inputs changed plus one representative per route class. Any change to the shared layout, CSS or JS escalates to the full sweep, which also runs on the combined top.

Why

c228#3: ui-audit was about 39 min on 2026-10-11; its bound is 3600 s in validate.yml. It extends milestone ci-critical-path. Proposed in ADR 0186 (A pull request's required verdict is the feedback lane, a gate whose inputs did not change is reused as inputs_unchanged, and the proof lane judges the combined top before it lands); ADR 0187 (Tests are selected by the impact of a change, derived from what each case declares it reads, and a change of unknown impact runs every case) (proposed; it carries no authority until the owner accepts it). Sources: chatgpt-majordomus:c228#3, chatgpt-majordomus:c019#4.

Current state

On master 707a04c, 2026-10-18 the ui job runs `scripts/ci/timed --bound 3600 ui-audit ... scripts/ui audit --report` over every page and width.

Desired state

The route-class map is derived from templates, not a hand list, and the selection is printed.

Scope

  • scripts/ui
  • scripts/lib/ui-routes.mjs
  • .github/workflows/validate.yml
  • test/cases/334_ui_audit_hears_uncaught_errors.sh
  • test/cases/349_a_step_reports_its_own_time.sh

Out of scope

  • Lowering what a full sweep checks

Dependencies

Acceptance criteria

  • A leaf-page change audits that page and its class representatives
  • A shared CSS change audits every page
  • An empty selection is a failure, never a pass
  • Validation runs 349_a_step_reports_its_own_time, 334_ui_audit_hears_uncaught_errors and the ui_audit_selection case this issue adds, in place of 3220_the_idd_loop_is_walked_in_a_browser

Validation

  • bash test/run.sh 349_a_step_reports_its_own_time 334_ui_audit_hears_uncaught_errors

Evidence required

  • ui_audit_selection_case

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/I3240.yaml. Read it back with majordomus plan show I3240.

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