Lightweight D agent runtime with persisted actor graphs, Mixr routing, and a local desk UI.
Harness is D only, enables tgc (thread-local GC) by default, persists its node graph on disk, and uses Mixr for model routing.
| Phase | Ships |
|---|---|
| v0 | graph.json, per-node meta.json + chat.jsonl, orchestrator metathread, CLI |
| v0.5 | Mixr on-device + suppress lists; /api/health, OpenAI-compat stub, /api/provider/* for t3code |
| v1 | Mixr router, wait-graph (warn default), HTTP desk (harness serve) |
| v2 | Temporal layout engine — scrubber, fade, heatmap, scoped bookmarks |
| desk PM | Status colors for awaiting_user / failed; Mark completed + Archive (POST /api/hide) |
| desk views | Linear / Grid / Tree — discussion vs workers separation; fork drill-in for full node transcript |
| plan queue | Cross-cutting plan-stack dock (GET /api/plan-queue) — ETA-sized speculative waits; not a 4th view mode |
See CHANGELOG.adoc.
Requires DUB and LDC/DMD. Thread-local GC via dependency on dlang-supplemental/tgc (Tgc_default → --DRT-gcopt=gc:tgc embedded in the binary).
cd $env:code\github.com\dev-centr\harness
dub build
dub test.\harness.exe init .\my-chat
.\harness.exe spawn .\my-chat --parent=coordinator --type=task --title=docs-sync
.\harness.exe serve .\my-chat --port=8765Open http://127.0.0.1:8765 for the desk UI. Toggle Linear, Grid, or Tree in the shell bar — discussion chat stays in the main panel; task workers live in the workers region (or the tree canvas in Tree mode). The timeline scrubber and plan-stack dock work in every mode (start plan-stackd on :17358 for live queues).
Matches actor-model-agentic-ui:
$CHAT_ROOT/
graph.json
orchestrator/meta.jsonl
nodes/{id}/meta.json
nodes/{id}/chat.jsonl
timeline/bookmarks.jsonl
Set HARNESS_NAME = harness in $CODE_ROOT/harness.md.
Parallel / swarm close-out (see agent-rules general/parallel-git-closeout.md):
GIT_CLOSEOUT = coordinator-batch
Task nodes spawn with gitCloseout=coordinator-batch and a system brief: commit locally, do not push; the coordinator batches push after the wave.
- Long-lived:
harness serve— supervisor + HTTP desk (future:harnessdRPC for thin CLI clients). - One-shot: CLI subcommands touch disk directly (git-shaped); no Python, no embedded interpreter per invoke.
- tgc: per-thread heaps; collections do not stop-the-world sibling threads — fits actor swarms +
@nogcworkers. - Discovery vs routing: Open Provider Registry / UniProvider finds endpoints; Mixr chooses models. Prefer OPR manifests over hard-coding a single local runner brand.
Runtime
Interface
- Browser-native HTML, CSS, and JavaScript — local desk UI