Back to home@SilasSolivagus

MetaBoard

Execution trajectories for work that isn't code — a DeepSeek Harness plugin, starting with content production.

Stars
0
Language
Python
Created
Aug 20, 2026
Updated
Aug 20, 2026

Introduction

MetaBoard

Execution trajectories for work that isn't code.

English | 简体中文

Coding agents produce something most other tools don't: a durable, inspectable record of how the work actually happened. Every retrieval, every tool call, every retry lands as a structured event — because the executor emits it, not because anyone remembered to log it.

Content creation has no such record. A task board tells you a draft moved from todo to in_review. It cannot tell you which twenty articles the outline was derived from, how long the second revision took, or what the editor's rejection actually said. Those are the facts you need when a piece underperforms and you want to know why.

MetaBoard brings the agent trajectory to non-coding work, starting with content production.


Status

Design complete. Implementation not started.

This repository currently contains no product code. What it does contain is a design grounded in verified constraints of the host system — see What's already verified.

If you are looking for something to install today, come back later. If you are interested in how execution trajectories generalize beyond software, read on.


The idea

MetaBoard is a plugin for DeepSeek Harness (dsh). It reuses the part of dsh that is genuinely hard and genuinely domain-neutral — the conversation node assembler — and replaces the part that is coding-specific.

The assembler turns a raw event stream into materialized business objects: each registered definition extracts a stable business ID from a single event, folds state across matching events, and emits view nodes. When an older page of history loads, only the contexts whose answers changed are replayed. That incremental-replay behavior is what makes a long trajectory stay responsive, and it is the piece you would least want to reimplement.

Nothing in that machinery knows about tokens, tool schemas, or TTFT. Those live one layer up, in the trajectory UI's own definitions. Swap that layer and the same engine renders a different domain.

What a content trajectory looks like

A content trajectory: two turns of tool calls with a human review between them, and blue derivation edges showing which sources each artifact came from

The vertical order is time. The blue edges are what a task board cannot express: which sources the draft came from, which draft the revision rewrote. They are not inferred — each tool records them on its own result.

Selecting a row opens the full payload: the retrieved sources, the complete draft, what it was derived from, how long it took.


How it works

Architecture: MetaBoard tools and a review writer emit core session events; the shared conversation assembler feeds Chat, Trajectory, and MetaBoard definitions, each rendering its own tab

MetaBoard ships as an ordinary out-of-repo npm package with two halves:

Host half registers content-production tools. Each call produces the core tool/call and tool/result events; the domain payload rides on tool/result.meta, a tool-private, core-opaque, durably persisted JSON channel that dsh already provides.

Client half registers its own conversation definitions and a view tab. Definitions claim only MetaBoard's own calls, assemble them into domain objects, and render them.

No fork. No changes to the host. No new event types.

That last constraint is not a stylistic preference — it is a boundary discovered by testing, and it shaped the entire design. See below.


What's already verified

Before writing product code, the feasibility boundary was probed directly against the upstream codebase, with a test that persists to a real JSONL log and reads it back through a freshly mounted stack. Six propositions, all confirmed:

#PropositionResult
1Does Session.append let a plugin mark its event ignorable?No. The public write API cannot set the marker.
2What happens to a log containing a plugin's own event type?Whole log refusedSessionFormatUnsupportedError, not a skipped row.
3Does the same event survive when marked ignorable?Yes, byte-identical. The storage layer supports it; only the write path is closed.
4Does a 50 KB tool/result.meta round-trip through a real file?Yes. Not spilled, not truncated.
5Does a plugin-appended user/message round-trip?Yes — no model involvement required.
6Do plugin event types enter model context?No. They are not surface-eligible.

Probe 2 is why MetaBoard defines no event types of its own. Probes 4 and 5 are why it doesn't need to. Probe 3 documents an escape hatch that exists in storage but is deliberately closed at the write API — upstream records that Session.append gains that surface "with its first user."


Design

The full design document lives outside this repository for now. The decisions that matter:

Data placement is decided by one question — is it an event or a state?

KindExampleWhere it lives
Event, model-originatedretrieved sources, draft text, revision difftool/result.meta
Event, human-originatededitorial rejection, urgent instructionuser/message (plugin source)
Statetopic status, assignee, board column, view countsMetaBoard's own store

Context identity is the call, not the topic. One context per tool call keeps live appends O(1) and keeps a prepend from invalidating an entire topic's history. The topic ID rides in the node payload and grouping happens at snapshot assembly.

Failed calls must still write their envelope. A tool/result payload carries no tool name — only tool/call does — and matching cannot consult history. The envelope is the sole claim signal. A tool that omits it on failure leaves a row that reports "running" forever, and a reload will not fix it, because that is what the log says.

References resolve at render time, not through the dependency reader. Using the reader would record window-gap dependencies and replay chains on every prepend. Reference targets never change value — they are merely sometimes unloaded. Rendering an unresolved reference costs a moment of grey; the alternative costs scroll performance on every long trajectory.


Roadmap

Phase 1 — feasibility slice. Three tools, two definitions, one tab, one plain row table. No inspector, no timeline, no board, no storage layer. The bar: hierarchy assembles, references resolve, a 50 KB payload survives a reopen, and a failed call renders as a complete failure rather than a stuck row.

Phase 2 — work items. The board view, its own store, cross-session aggregation, platform metrics ingestion.

Phase 3 — other domains. The data placement rules and the envelope are not specific to content production. Legal review, research synthesis, and design iteration have the same shape: a multi-step process whose intermediate artifacts matter more than its final state.


Prior art and credit

MetaBoard exists because of two projects:

  • deepseek-ai/deepseek-harness — the assembler, the event stream, the trajectory ledger this design learns from. MIT.
  • chuspeeism/dashi-taskboard — a local-first task board with a workflow graph and third-party publishing nodes. Its separation of field-level audit from AI session records is what made the missing layer obvious.

MetaBoard is not affiliated with either project.


License

MIT