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

I2461

majordomus ui is served at /ui as its own product, with screens composed from capabilities

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
0
Waiting on
none
Holds back
Behind it in all
22
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 I2461

majordomus plan verify I2461

majordomus plan done I2461

What it is

Objective
Serve the UI, the primary human surface the owner names `majordomus ui`, as its own native surface on the shared server: its own mount, shell, delivery-vocabulary navigation and assets, with a first Dashboard composed only from capabilities, each value citing the capability and pointer it was read from.
Why
The owner's unified real-data UI pack (campaigns/majordomus-ui-unified-real-data-v2-20261011) asks for eleven screens. On 2026-10-11 the owner settled where they live: 'it is majordomus ui primary, not cockpit (low level)'. ADR 0135 records the decision. The M00 audit (tmp/owner-packs/majordomus-ui-unified-real-data-v2-20261011/AUDIT-M00.md) found that the data for most panels exists but the Cockpit's overview needed 13-18 s to paint, and that integration.queue alone takes 50 s, so the first screen must ask only fast sources and draw the queue as a panel of its own. Before this change `majordomus ui` was an unknown command and no surface of the server was the high-level one.
Now
The shared server serves the Cockpit (/cockpit), the API, Swagger, MCP and the home page. There is no high-level surface.
Wanted
A native surface `ui` is mounted at /ui (topology, binding, router; Feature::Ui) and served by the shared server beside the Cockpit, which it refers to only as the technical view of a source. Its frame follows the owner's references: a sidebar of screens with the kit's icons (compiled from site/data/kit/icons.toml by majordomus generate) and a version card read from distribution.releases, a top bar with the search, the time the screen was read and the other surfaces, and a menu that opens without JavaScript. Seven screens — Dashboard, Roadmap, Issues & PRs, Mesh, CI/CD & Releases, Evidence, Governance — each a hero band with KPI tiles and a grid of panels, compose only capability answers asked at once. Every panel names its sources with the API route, CLI command and MCP tool capabilities.describe declares. Tiles, panels and rows lead to the screen holding the whole. Milestone dependencies are drawn as a graph with the vendored Cytoscape over a table fallback. Donuts, meters and timelines are drawn server-side from the counts they list, and a missing value reads none, unknown or not answered, never zero. The pull-request queue is the panel /ui/panels/pull-requests, pulled in after paint. A visible screen is read again every minute and says when. ui-integrity and the ADR 0012 index check cover src/ui (cases 389 and 547), and the CI class ui selects the asset check whenever share/ui or src/ui changes. Not done here: the majordomus ui command (I2231, to be amended), and the Command, Capabilities, Deployments, Documentation and Settings screens.
Done when
unknown: the record declares no `completion`
Risk
unknown: the record declares no `risk`

Acceptance

  • GET /ui on a shared server answers 200 text/html with the Cockpit's CSP, and with JavaScript disabled shows the six tiles and every panel or its link
  • Every tile and panel of the Dashboard cites the capability it read, and a source that fails makes its tile 'not answered', never 0
  • The Dashboard's first paint never asks integration.queue; /ui/panels/pull-requests answers the queue as a page, and with ?fragment as the panel alone
  • The rail lists exactly the screens the dispatcher answers, and a test fails when the two differ
  • scripts/cockpit-assets --check fails when share/ui/ui.css is stale
  • scripts/ci/cockpit-projection-check --ui-integrity fails on a registry read or a zero-count default in src/ui (case 547)
  • Every panel names its sources with the API route, CLI command and MCP tool capabilities.describe declares, and the Cockpit only as their technical view
Validation
bin/majordomus plan validatecargo test --lib ui::cargo test --lib cockpit::assetsscripts/cockpit-assets --check
Evidence required
ui_surface_served_testui_dashboard_cites_sources_testui_screenshots_1440_768_375
Evidence present
ui_surface_served_testui_dashboard_cites_sources_testui_screenshots_1440_768_375

Scope

Touches
apps/majordomus-cli/src/uiapps/majordomus-cli/src/generate.rsscripts/ci/cockpit-projection-check.ai/repo/ci/gates.yaml.ai/repo/features/ui.mdtest/cases/389_cockpit_projection.shtest/cases/547_the_ui_says_only_what_is_derived.shdocs/MAJORDOMUS_UI.mddocs/README.md.gitignoreapps/majordomus-cli/src/cockpit/assets.rsapps/majordomus-cli/src/lib.rsapps/majordomus-cli/src/http/router.rsapps/majordomus-cli/src/http/surfaces.rsapps/majordomus-cli/src/shared.rsapps/majordomus-cli/src/web/discover.rsapps/majordomus-cli/src/web/model.rsshare/uiscripts/cockpit-assets.ai/repo/adrs/0135-majordomus-ui-is-the-primary-surface.md.ai/repo/project/issues/I2461.yaml
Not
unknown: the record declares no `non_scope`
Depends on
none
Priority
p1
Profile
implementation
Parallel safe
false
Owner
unknown: the record declares no `owner`

The work so far

Branches
none
Merged
none
Commits
0
Trunk
master
Sessions
none
Created
2026-10-11
Updated
2026-10-12T10:59:30Z
Started
2026-10-12T10:58:53Z
Verified
2026-10-12T10:59:05Z
Completed
2026-10-12T10:59:30Z

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.