Architectural refactor unifying three previously-independent pages
around a single shared event-log model:
rubric-fusion-model.js — the shared model. One log of scored
events keyed by (rubric, runtime, timestamp), plus a small set
of derivations (recent-scores window, per-rubric aggregates,
per-runtime rubric grid) that all three views subscribe to.
rubric-fusion-seed.js — fixture seed used by tests and the
isolation-machine screenshots below.
The three page views:
Rubrics — now leads with a hint card (recent pass/fail streaks,
stalest rubric) and a stats strip (7-run rolling pass rate,
latest score, delta vs. previous). Rubric list is unchanged.
Growth — rewritten. The old compact-window event feed is gone;
the page is now a pure SVG time-series curve over the event
log (score-y × time-x), with per-rubric coloring and a
hover-time tooltip. -420 lines of the old feed → +630 of the
curve renderer.
Runtime — adds a "Rubric grid" tab next to the existing Status
tab. Grid is one row per rubric × one column per runtime;
cells are pass/fail/unrun, click-through to the raw event.
Wiring is careful about the five hot zones the parallel lanes are
each touching (nav / chat / context / trace / artifact) — Lane D
stays entirely inside rubric/growth/runtime and their shared model,
so this composes with the C/A lanes without stepping on their
finishTurnContainer or chat-triple regions. style.css conflict
against the C+A combined append was tail-append vs tail-append and
resolved by concatenation (brace balance verified).
rubric-fusion-model.js 419 +
rubric-fusion-seed.js 624 +
rubric-fusion-model.test.js 181 +
rubric-fusion-views.test.js 189 +
growth-v2.js +631/-420 (SVG time-series rewrite)
rubrics-page.js +89 -0 (hint + stats strip)
runtimes-page.js +198 -0 (rubric-grid tab)
index.html +7 (three mount points)
style.css +252 (new page sections)
rubric-fusion-fixture.json +94 (test/screenshot seed)
Test suite: 1704/1704 pass (+22 over Lane C+A baseline). Isolation-
machine fixture screenshots (rubrics/growth/runtimes,
docs/rubric-fusion-shots/0{1,2,3}-*.png) reproduce from the merged
HEAD.
Examples
Runnable demos (not workspaces) that showcase how the harness is wired. Each example is a thin leaf: a cordis.yml that picks the swappable backends (an LLM adapter, a bash executor), loads one app package, and may add optional product tools or demo-only mocks. The composition — the spine, the front-door cluster, and the boot glue — lives in the app packages (@deepseek-ai/dsh-stdio-demo, @deepseek-ai/dsh-acp-demo) and the @deepseek-ai/dsh-agent-spine-demo bundle they share. There is no start.ts; the demo:* scripts invoke each app package's bin.
echo-agent
A mock model + echo tool on the stdio chat app — the all-mock skeleton. The leaf swaps dsh-stdio-demo's LLM backend to a local mock-echo adapter and adds a local echo tool. Demonstrates:
- A thin leaf
cordis.ymlloading the@deepseek-ai/dsh-stdio-demoapp - Registering a mock
LlmAdapter(streaming scripted responses) - Registering a tool via
ctx.tools.register() - "Swap the backend, keep the app" — the only difference from
coding-agentis the adapter
Run with: pnpm run demo:echo. When prompted, type "echo " to trigger a tool call round-trip.
coding-agent
A REPL agent demo: DeepSeek V4 + the read/write/edit filesystem tools + the bash tool suite, subagent delegation, and the todo_write task tracker on the same @deepseek-ai/dsh-stdio-demo app. The UI is a terminal readline REPL.
Run with: pnpm run demo:repl (needs DEEPSEEK_API_KEY in the environment or a gitignored repo-root .env). See coding-agent/README.md for details.
Run the Code Mode overlay with pnpm run demo:code-mode, or pass acp for the ACP example. See the Code Mode example for its composition and a sample task.
cordis-agent
The self-referential demo: the coding spine plus @deepseek-ai/dsh-tool-cordis, whose three tools (cordis_inspect / cordis_mount / cordis_unmount) let the agent inspect the live cordis runtime it runs inside, mount model-written plugins into it (an event listener, a brand-new tool for itself, or a service another mount injects), and dispose them again — all dynamic mounts grouped under one cordis-dynamic fiber subtree. The ctx.fs/ctx.web services ride along provider-only, as the capabilities those plugins build on.
Run with: pnpm run demo:cordis (needs DEEPSEEK_API_KEY). See cordis-agent/README.md for the staged demo script and the toolset RFC for the design and sandbox caveats.
acp-agent
An agent demo exposed as an Agent Client Protocol (ACP) server over JSON-RPC stdio, via the @deepseek-ai/dsh-acp-demo app — drive it from Zed or any other ACP client. Also the home of the keyless snapshot tests.
Run with: pnpm run demo:acp (needs DEEPSEEK_API_KEY); pnpm run demo:code-mode acp boots the same server in Code Mode via the code-mode.cordis.yml overlay. See acp-agent/README.md for the Zed setup and the snapshot-test design.
The default cordis.yml composes @deepseek-ai/dsh-sandbox-local, @deepseek-ai/dsh-bash-sandbox, @deepseek-ai/dsh-user-approval, and @deepseek-ai/dsh-permission. A capable client gets one Permissions select: workspace-write confines bash to the configured workspace and asks before a wider retry, while danger-full-access removes file confinement and disables approval prompts. A denied command can therefore surface a one-shot session/request_permission prompt in the editor; "Allow once" runs exactly that retry under the requested wider mode.