Vox GUI ↔ CLI / Scientia Coverage Audit (2026-06-03)
Vox GUI ↔ CLI / Scientia Coverage Audit (2026-06-03)
Section titled “Vox GUI ↔ CLI / Scientia Coverage Audit (2026-06-03)”Companion to
vox-gui-capability-audit-2026.mdandcli-gui-surface-coverage-map-2026.md. This audit was produced by a five-agent verified sweep ofcrates/vox-gui,crates/vox-scientia,crates/vox-research-shim,crates/vox-gamify, and thevox ciGUI-coverage checks. Every claim below is anchored to a file path.
Headline finding
Section titled “Headline finding”The GUI represents commands well and surfaces poorly, and the asymmetry is structural:
Commands → form is ~90 % automatic. Surfaces → panel / nav is 100 % manual and unenforced.
- The clap tree is reflected into a typed catalog (
crates/vox-cli/src/command_catalog.rs::build_catalog) andcrates/vox-gui/ui/src/components/CommandCatalogForm.tsxrenders a typed form for any command. A new CLI subcommand is runnable in the GUI with zero GUI code. - A new surface (a curated dashboard like Scientia) requires three hand-synced edits with no generator and
no parity check:
crates/vox-gui/ui/src/components/surfaces/decoratorRegistry.ts, the 20 hand-written<NavItem>rows incrates/vox-gui/ui/src/components/layout/Sidebar.tsx:88-108, and therenderViewswitch incrates/vox-gui/ui/src/App.tsx:517-588(plus a fourth, the duplicate validation array atApp.tsx:230). - There is no single surface-registry SSOT.
crates/vox-cli/src/commands/ci/gui_surface_coverage.rsclassifies only 8 hardcoded capabilities andenforce_policyhard-fails on just 4 of them (gui_surface_coverage.rs:197-218). Nothing fails the build when a new CLI group has no curated home.
Coverage scorecard
Section titled “Coverage scorecard”| Dimension | Reality |
|---|---|
| Top-level CLI groups | ~66 (Cli enum, crates/vox-cli/src/lib.rs) |
| GUI sidebar views | ~20 (several thin proxies) |
| Scientia subcommands surfaced | ~3–4 of ~31 |
Vox-language toolchain (build/compile/check/test/run/fmt/lsp/doc) | No panel — generic form only |
| AI plan family, pkg-mgmt, audit/doctor, auth/login/config | No panels |
Gamification (vox-gamify) | Backend mature, GUI shows a raw text dump |
Manifest safety metadata (safety_class/confirmation_policy/reversible/scope) | Computed, never rendered — used only for dispatch routing in transport.ts |
| Dead code | ui/src/claude-dashboard/* + 7 orphaned top-level components, unreachable from App.tsx |
Scientia is two pipelines, both mostly CLI-only
Section titled “Scientia is two pipelines, both mostly CLI-only”Pipeline A — deep-research runtime (crates/vox-research-shim/src/research/orchestrator/pipeline.rs). The GUI
surfaces only status/history/config (three arg-free cards in decoratorRegistry.ts). Missing: run,
preview (the plan is marked editable:true but there is no editor), show/result (durable artifacts in
scientia_research_artifacts are never rendered), watch, eval.
Reality check: there is no typed session-status enum. The eight progress states (
queued → planning → retrieving → verifying_claims → synthesizing → auditing_citations → persisting_artifact → completed) exist only as a hardcoded JSON string array atcrates/vox-cli/src/commands/research/mod.rs:234-243. The persisted DB status is a free-formStringwith a different vocabulary (active/completed/failed/orphaned).research run --asynconly inserts a session row — no executor consumes it. A real run surface must run inline.
Pipeline B — self-publication cluster (crates/vox-scientia/src/lib.rs, Phases A–H). The GUI surfaces
the Phase H QueueSnapshot (ScientiaDashboard.tsx) and the claims ledger (ClaimsView.tsx). Missing:
scout, replay, manuscript/LaTeX/arXiv, critic-gate, venue routing, findings-page, the cost rollup
(build_cost_rollup exists but has no live-data producer), the publication lifecycle board
(scientia_publication_queue stages), discovery/novelty, pre-registration, feeds, and the external-jobs
dead-letter queue.
Reality check: the documented
GET /api/v2/scientia/queue,/cost, and WS topicscientia.queue.changed(crates/vox-scientia/src/dashboard/mod.rs:13-17) do not exist. The HTTP gateway (crates/vox-orchestrator-mcp/src/http_gateway/) is real but disabled by default (VOX_MCP_HTTP_ENABLED), and its/v1/wshas no topic multiplex. The GUI talks to Scientia by shelling the CLI (execute_command) and parsing stdout — not over REST/WS.
Gamification is mature in the backend and dead in the GUI
Section titled “Gamification is mature in the backend and dead in the GUI”crates/vox-gamify implements XP, infinite quadratic levels, crystals, lumens, energy, streaks, prestige,
trust-tier multipliers, achievements, quests, battles, leaderboards, and companions with SVG sprites. The
GUI shows a raw vox ludus profile text dump (GamifyView.tsx). Three concrete breaks:
- The banner alert source is hardcoded
alerts: Vec::new()(crates/vox-gui/src/commands/orchestrator.rs:222), so persisted level-ups and unlocks never display — even though the whole UI pipeline (mapAlert→Dashboard→LudusBanner→handleAckAlert) already exists. - There is no typed
get_ludus_profileTauri command; the richLudusProfileis never rendered. - Gamify config (
gamify_enabled,gamify_mode=Balanced|Serious|Learning) is settable only via the CLI (VoxConfig::save());set_gui_preferencewrites a different store and there is no Settings gamify section.
Reality check:
vox_gamify_notification_ackis not a missing backend — it is a working MCP tool (crates/vox-orchestrator-mcp/src/gamify_tools.rs:386) the GUI already reaches via the MCP bridge. The high-value fix is wiringlist_unread_notificationsinto the hardcoded-emptyalertsvector.
What is missing from the CLI (the inverse gap)
Section titled “What is missing from the CLI (the inverse gap)”- ~35
vox_scientia_*MCP tools, some MCP-only, with no CLI peer. - Per-event reward tuning (
event_configoverrides /set_event_config_override) has no clear CLI surface. - The Phase H REST/WS routes are documented but unimplemented.
Recommendation — a three-part self-surfacing loop
Section titled “Recommendation — a three-part self-surfacing loop”The hard half already exists (clap → typed form). The missing half is the signal that a new piece needs curation, plus a single source to drive nav from:
- One typed surface-registry SSOT the GUI enumerates to build the sidebar, routes, and palette — instead of three hand-synced lists.
- A CI parity gate that iterates every top-level CLI group (it already has the catalog) and fails the
build when a group is not classified into a representation tier
(
none/generic_form/curated_decorator/live_backend). - An in-GUI coverage view that renders the ledger so contributors discover what still needs curation.
Net effect: add a CLI command → it is instantly runnable as a typed form, the palette finds it, and CI tells you whether it deserves a curated panel.
Implementation plans
Section titled “Implementation plans”This audit is executed by three independently-shippable plans:
- Track A — self-surfacing gate (the keystone):
docs/superpowers/plans/2026-06-03-gui-track-a-self-surfacing-gate.md - Track C — gamification surfacing (low-risk wins):
docs/superpowers/plans/2026-06-03-gui-track-c-gamification-surfacing.md - Track B — Scientia pipeline UI (largest; typed reads, no speculative REST/WS):
docs/superpowers/plans/2026-06-03-gui-track-b-scientia-pipeline-ui.md
Recommended order: A → C → B (A establishes the registry the other two register into; C is the lowest-risk visible win; B is the largest and depends on the typed-command pattern C exercises first).