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
| covers | type | command | result | at commit |
|---|---|---|---|---|
| no_unlisted_route | test | cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --lib cockpit::tests::every_area_has_a_route_and_every_route_its_area | test result: ok. 1 passed; 0 failed (run 2026-10-14 between 07:40Z and 07:58Z on master ce5959db59) | ce5959d |
| route_table_is_checked | test | cargo test --locked --manifest-path apps/majordomus-cli/Cargo.toml --lib cockpit::tests::the_documented_route_table_is_the_dispatchers | test 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.