Skip to content

I1508 — The navigation is derived from the dispatcher, not kept beside it

Reconcile the Cockpit's area list against the routes the dispatcher actually answers, and derive or check the route table in docs/COCKPIT.md, so that a routed page cannot be invisible.

DONE wave 0 · p1 · implementation profile · parallel safe

Part of development-runtime — The runtime has a development surface.

Objective

Reconcile the Cockpit's area list against the routes the dispatcher actually answers, and derive or check the route table in docs/COCKPIT.md, so that a routed page cannot be invisible.

Why

F5 of the audit's failure table, and it is independent of every other issue here, which is why it is cheap and should not wait. The literal area list in nav.rs is already behind the dispatcher — Executions and Quality are declared in the Area enum, rendered by pages and routed, and absent from the list — and three surfaces read the stale list: the sidebar, the product model's area validation, and the site's cockpit-areas dataset. The public route table in docs/COCKPIT.md is missing five routes the dispatcher answers. The compounding failure is that the Cockpit probe crawls out of the navigation, so a page absent from the navigation is a page nothing checks: new pages are invisible by default and the mechanism that would notice cannot see them.

Current state

nav.rs::areas() is a hand-kept literal. docs/COCKPIT.md's route table is missing commands, continuity, directories, artifacts and quality. Page URLs and API endpoints are written as literals throughout pages.rs, including a hand-written mirror of the navigation on the 404 page.

Desired state

One declaration decides which areas exist. The sidebar, the product model, the site dataset and the documented route table are projections of it, and a routed page that no area names is a reported failure rather than an unreachable page.

Scope

  • apps/majordomus-cli/src/cockpit
  • docs/COCKPIT.md
  • test/cases

Out of scope

  • Adding any page. This issue makes the existing ones reachable and checkable.
  • The design of the sidebar. Nothing here changes how it looks.

Dependencies

None. This issue is a root of the graph.

Acceptance criteria

  • A route the dispatcher answers and no area names is a reported failure
  • The sidebar, the product model's area validation and the site dataset read one declaration
  • The route table in docs/COCKPIT.md is generated or checked against the dispatcher
  • The probe reaches every routed page

Validation

  • bash test/run.sh
  • bin/majordomus-cli product validate
  • bin/majordomus-cli generate --check

Evidence required

  • no_unlisted_route
  • route_table_is_checked

Evidence

coverstypecommandresultat commit
no_unlisted_routetestcargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --lib cockpit::tests::every_area_has_a_route_and_every_route_its_areatest result: ok. 1 passed; 0 failed (run 2026-10-14 between 07:40Z and 07:58Z on master ce5959db59)ce5959d
route_table_is_checkedtestcargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --lib cockpit::tests::the_documented_route_table_is_the_dispatcherstest result: ok. 1 passed; 0 failed (run 2026-10-14 between 07:40Z and 07:58Z on master ce5959db59)ce5959d

Risk

Low. The one trap is that the route table lives in a file that is currently hand-written and public; deriving it changes who may edit it, and that must be said in the file itself.

Timeline

started
2026-10-14T07:58:39Z
verified
—
completed
2026-10-14T07:58:48Z

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

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