Menu ↔ feature ↔ CLI map (nornir + dwarves)
The CLI-mirrors-UI law: every UI tab/pane should have a text CLI verb that produces the same data. This maps each nornir viz tab and each dwarves pane to its mirroring nornir/dwarves verb, and flags the tabs that have no CLI verb yet (gaps to close).
- Owner: nornir (warehouse/introspection) · ⚒ dwarves (CI/CD forge) · ⇄ shared / cross-app pane · edda (engine moved to
nordisk/edda). - Embed pattern: direct = compiled-in Rust (in-process, e.g.
holger_embed.rs); gRPC = thin client (e.g.nornir-funnel-embed→Funnel.Show).
nornir — 27 tabs
| Tab | What it does | CLI verb (mirror) | Owner | Embeddable pane |
| Nornir | root/server ops: workspace add/kill/populate/refresh + server status | nornir root · workspace · serve |
⇄ | server ops (shared framework) |
| Timeline | per-repo release timeline | GAP: no CLI verb (viz-only) | nornir | — |
| DepGraph | dependency graph | nornir map · diagram |
nornir | facett-view candidate |
| CallGraph | call graph over symbols | nornir graph |
nornir | facett-view candidate |
| Architecture | architecture wiring board | nornir arch |
nornir | — |
| Metro | coverage CHAINS as transit lines | nornir coverage |
nornir | — |
| Helix | release timelines as a time-helix | GAP: no CLI verb (viz-only) | nornir | — |
| Bloodstream | workspace as circulatory system | GAP: no CLI verb (viz-only) | nornir | — |
| Funnel | idea→plan-DAG intake + planner | nornir funnel (prompt --llm, idea, history…) |
⇄ | dwarves hosts it — gRPC (nornir-funnel-embed) ✅ |
| TimeTravel | warehouse snapshot time-travel | GAP (data via nornir warehouse) |
nornir | — |
| LiveRun | live run monitor | GAP: no CLI verb | nornir | share w/ dwarves candidate |
| Release | release-doctor / publish DAG | nornir release |
nornir | share candidate |
| Knowledge | symbol/knowledge graph + lookup | nornir knowledge |
nornir | facett-view candidate |
| Warehouse | warehouse tables/browser | nornir warehouse |
nornir | — |
| WarehouseDeck | multi-pane warehouse wall | GAP (composite of nornir warehouse) |
nornir | — |
| Mcp | MCP server status | served by nornir-mcp bin (not a nornir subcmd) |
nornir | — |
| Search | semantic/symbol search | nornir mimir · knowledge (soft) |
nornir | — |
| Gates | release/completeness gates | nornir guard (soft) |
nornir | — |
| Bench | benchmark runs + mashups | nornir bench |
edda (nornir-bench) |
engine in edda |
| Test | test-matrix / coverage | nornir test |
edda (nornir-testmatrix) |
engine in edda |
| Leaderboard | bench leaderboard | GAP (part of nornir bench) |
edda | — |
| Security | modgunn VERDICT scan | nornir security |
modgunn | cross-app candidate |
| ⚒ Dwarves | build runner + brokkr forge = the pipeline | nornir build · nornir brokkr |
⚒ dwarves | nornir should host dwarves — gRPC (dwarves daemonizes: dwarves serve + durable cron ✅ — daemonize-and-durable-cron.md) |
| 📦 Holger | in-process registry pane | no nornir holger verb (holger has own CLI) |
holger | nornir hosts holger — direct (holger_embed.rs) ✅ |
| Manual | docs/manual browser | nornir docs · dwarves docs render/check/book (assembly engine moved to edda nornir-docgen; dwarves renders, nornir keeps the doc_exports history/search) |
nornir ⇄ dwarves | — |
| 🤖 Claude | direct Claude chat pane | GAP: no CLI verb (interactive) | ⇄ | needs facett-claude extraction → any host |
| 🧠 Models | LLM/embed model download (as jobs) | GAP: no CLI verb | nornir/shared | — |
Gaps — tabs with NO mirroring CLI verb (close these)
Timeline · Helix · Bloodstream · TimeTravel · LiveRun · WarehouseDeck · Leaderboard · Claude · Models (9 clear gaps). Soft/served-elsewhere: Mcp (via nornir-mcp bin), Holger (holger's own CLI), Search→mimir, Gates→guard.
dwarves — small on purpose
Real CLI today (SHIPPED): dwarves doctor · pipelines · validate · plan · run · trigger · pipeline · history · badge · repo · vault · login · whoami · logout · serve · release · crate-release · workspace-release · deps · holger-build · agents · agent · saga — a real thin/fat clap CLI (--server/$DWARVES_SERVER routes every verb to dwarves-server over gRPC; else FAT against a repo's brokkr.toml). The D2 parity item is done (badge renders a pipeline's latest-run status SVG via the Badge RPC; release/deps CONSUME the shared nornir-release/nornir-depgraph edda leaves — deps-first publish waves + can_skip_republish + the cross-repo dep graph — behind --features release). crate-release/workspace-release are the standalone release-doctor cascade (DRY-RUN default; --execute opt-in). pipeline is the AGENT-callable half of the CI/CD wizard (generate a *.runa.ron from BUILD·TEST·DEPLOY·TRIGGER, run it — DRY by default). vault keeps secrets encrypted-at-rest; login/whoami/logout are OIDC SSO (RFC 8628 device-authorization) via the SHARED nornir-auth-client (edda) — no hand-rolled auth. holger-build <path> resolves the holger build target — the pipeline that builds holger's three deployment executables (embedded·mini·full) — against holger's declared build-space (crate::holger_build, reusing nornir-build-thing); compile-free plan check, exit 0 iff all three tiers resolve.
Panes — the dwarves-gui tabbed shell (native + wasm) now ships 17 tabs (full list + data paths in three-pane-shell.md): Warehouse · Forge · Pipeline · CI/CD · Builds · Funnel · Claude · Jera · Tools · Status · Release · Benches · Binary · Coderoom · Saga · Settings · Profile. A warehouse-selector header re-binds every warehouse-bound tab on change. Highlights:
| Pane | Mirror CLI verb | State |
| ⚒ Forge (owns it) | dwarves run · plan · trigger · history · badge |
✅ LIVE thin gRPC to dwarves-server (run history + DAG, auto-polls) |
| CI/CD (owns it) | dwarves pipeline … |
✅ the quick-setup wizard — same generator/runner as the CLI |
| Funnel ⇄ (guest of nornir) | mirrors nornir funnel |
✅ always embedded / in-process (renders with nornir-server DOWN, no network dial); host-only — the UI knows no nornir address, so there is no $NORNIR_SERVER thin path |
| Jera (shared) | jera ledger | ✅ facett_zoneui::JeraCentral over the jera ledger, read live (fixture fallback), per-job zone column |
| Status (owns it) | dwarves badge <pipeline> |
✅ badge health-wall reusing brokkr::badge; robot-tested |
| 🤖 Claude ⇄ (shared) | (interactive; no verb) | ✅ facett-claude over the shared nornir-claude edda leaf — offline stub default, live HTTP behind --features claude-http |
Bottom line: the thin/fat CLI (D2) and the dwarf.v1 server (D1) have LANDED, the dwarves-gui shell has grown to the full 17-tab cockpit, and "CLI mirrors UI" holds for the Forge/CI-CD panes. The remaining gap is repointing the remaining fixture-fed tabs onto live server data.