TEKSISTEMI // TECHNICAL NEWSLETTER ← Archive 008 · CLAUSTRUM ITEN tty1 · online

Teksistemi · Technical newsletter · issue 008 · September 12, 2026

$

A team split across Claude, Cursor, opencode and Copilot. An agent pipeline that only worked inside one of the four. And a cost sheet that said: stop picking models by vendor.

This issue tells the need first, then the tool that grew out of it: one core, two doors, any harness.

Arrows ← → to navigate · m opens the contents · swipe on mobile

orlodax@tks:~/claustrum$ cat team.txt

Four harnesses, one discipline — and the discipline lives in only one of them

PersonHarnessModels
DarioClaude Code, desktop app, opencodeFable / Opus / Sonnet + OpenRouter
colleague ACursorwhatever Cursor offers
colleague Bopencode onlyDeepSeek via OpenRouter
colleague CCopilot CLI, VS CodeCopilot

Nobody is wrong: every choice is a subscription, a habit, or a client that dictates the tool.

 architect
     │  designs, delegates, triages
     ▼
 builder ×N ──► blind reviewer ‖ ui-reviewer
                      │  sees only task + diff
                      ▼
                   tester

Fixed order, blind review, an honest builder report: three rules that in a month saved us more than they cost.

The problem: delegation is Claude Code's Agent tool, and the roles are files in Claude's format. Outside it, the pipeline does not exist.

Whoever is on Cursor works well, but alone. Whoever is on opencode has the cheapest model on the market and no blind review. The discipline belongs to one person, not to the team — and a discipline of one is not a discipline.

orlodax@tks:~/claustrum$ ./cost --per-solved-task --with-cleanup

Cheap tokens stop being cheap at eighteen minutes

$0$9$18$27$36 $0$10$20$30$40 human cleanup cost per failed run (c) $6.75 — Sonnet 5 takes the lead $17.60 — Opus 5 takes the lead DeepSeek V4 Pro Claude Sonnet 5 Claude Opus 5
// cost per solved task, c = human cleanup per failure
Opus 5    = 8.67 + 0.45·c
Sonnet 5  = 3.78 + 0.58·c
V4 Pro    = 2.16 + 0.82·c

// break-even Opus ↔ V4 Pro
c ≈ $17.60  ≈ 18 min at €60/h

On token price alone DeepSeek wins four to one. But a failed run does not only cost a retry: it costs a person working out what went wrong. Past eighteen minutes of triage, the expensive model is the one that costs less.

Success rates from SWE-bench Pro (V4 Pro 55.4% · Sonnet 5 63.2% · Opus 69.2%). Token volumes are assumptions to be replaced with measurements. Full analysis: internal note "Claude vs DeepSeek", September 2026.

orlodax@tks:~/claustrum$ route --by role # not --by vendor

Error propagates asymmetrically: route by role

ArchitectA bad plan is inherited by every builder downstream; unrecoverable without a full re-run. Few tokens, so the premium is cheap in absolute terms.
Opus 5
Blind reviewerMust be more capable than what it reviews, or it rubber-stamps. Never a cheaper model than the one that wrote the code.
Opus 5 / Sonnet 5
Builders ×NHigh volume, output verified downstream, errors contained locally. This is where routing pays.
Sonnet 5 · DeepSeek V4
TesterMechanically checkable output, the highest volume of all. The cheapest model that can do it wins.
V4 Flash

Putting the cheap model in the reviewer seat. A reviewer less capable than the builder produces confident approvals of broken work: it turns the verification layer into a fluency generator, and the ledger will show a falling divergence rate that means the opposite of what it looks like.

Hence the note's conclusion: hybrid, routed by role. Captures roughly 80% of the available savings while keeping the unrecoverable-error roles on the capable model.

And this is where the sheet collides with the team: routing by role requires that one conductor can speak to every model, from whichever podium they happen to be conducting.

orlodax@tks:~/claustrum$ diff wish reality

The spec, before a single line was written

  • Work from anywhere: the Claude desktop app, VS Code, Cursor, and the CLIs — Claude Code, opencode, Copilot CLI.
  • Delegate to any backend: Claude, DeepSeek via opencode/OpenRouter, Cursor, Copilot, or a bare API call.
  • Keep the three rules: blind review, honest report, fixed order.
  • A spending cap — that can be switched off.
  • N builders in parallel without treading on each other.
  • Be an IDE plugin. We would need four, and they would lag.
  • Trust prompt discipline. What matters is enforced, not requested.
  • Translate paths between Windows and WSL. Each copy launches its own system's backends.
  • Be a state machine in C#. The pipeline is the architect's prompt.

Every host on the list — desktop, IDE, CLI — gives an in-chat agent exactly two universal hooks: a shell tool and MCP. Nothing else is common to all of them. So the tool has two doors, and nothing else.

orlodax@tks:~/claustrum$ man claustrum

Claustrum — harness-neutral agent delegation

An "architect" in any host delegates builds, reviews and test runs to agents running on any other harness and model, and gets back one normalized result.

The name is a thin sheet of neurons under the cortex, connected to nearly every region of the brain. In their last paper together, Crick and Koch proposed it as the conductor of the orchestra that binds the specialised areas into a single coherent act. That is exactly the job: it plays no instrument, it makes the others play together.

Crick & Koch, "What is the function of the claustrum?", Phil. Trans. R. Soc. B, 2005.

claustrum run <role> --brief-file <md> [--cast <name>] [--json]
claustrum cast new | questions | create | list | use
claustrum coordinate --cast <name> --issues 12,13
claustrum sync [--only claude,opencode] [--global] [--check]
claustrum backends list | doctor
claustrum jobs list | show | logs | clean
claustrum mcp                      # MCP server on stdio

Single binary, .NET 10 NativeAOT: Windows, macOS, Linux.
No runtime to install. ~3 MB.

orlodax@tks:~/claustrum$ claustrum --help | head

How you talk to it: two doors, one room

Any assistant you are chatting with can always do two things: run a command in the terminal, and use a tool through MCP — the standard socket an assistant uses to plug in external programs. Claustrum offers itself both ways. Whichever door you come in through, you end up in the same room.

   you, in chat ─────► "delegate this to a cheap builder"
                                     │
                 ┌───────────────────┴───────────────────┐
                 │ door 1: a command        door 2: an MCP tool      │
                 └───────────────────┬───────────────────┘
                                     ▼
                              [ claustrum ]
             prepare · photograph · launch · photograph again · read the report
                                     ▼
                          one receipt, always the same

The assistant types one line in the terminal and waits for it to finish. Works in every host today, with nothing installed in the IDE.

The assistant calls delegate the way it would call a calculator. More convenient, but the host must speak MCP — and by now they all do.

  • prepares the instructions for the delegated agent: who it is, what it may touch, how it must report
  • photographs the repository with git
  • launches the agent on the chosen harness and waits
  • photographs again: the difference is what it really changed
  • reads the final report and hands back the receipt

orlodax@tks:~/claustrum$ claustrum run builder --brief-file order.md

What you give, what you get: the work order and the receipt

Like the sheet you leave for a contractor. Four fixed lines, always the same:

Taskthe words of whoever asked, verbatim
Scopewhich folders and files it may touch
Don't breakwhat must keep working
The changeshow to see them, for whoever has to judge them

Whoever wrote the plan may add a "Context" line. The blind reviewer may not: its copy of the order has no such line, by construction.

RECEIPT · job 20260912-1403
outcome .......... success
who .............. builder on DeepSeek V4 Flash, via opencode
files changed .... 2    ← git says so, not the agent
   + Backends/OpencodeBackend.cs
   ~ Backends/Registry.cs
the agent's report
   what I did ......... added the opencode backend
   to be tested ....... reading the JSONL events
   decided alone ...... nothing, the sheet was enough
   shaky .............. the event names are unconfirmed
cost ............. $0.012 · 41 s

In reality it is JSON, for machines. This is the translation — but the lines are exactly these.

Two details make the difference. "Files changed" is git speaking, from the before-and-after photographs: the agent can neither forget them nor invent them. And the report has four mandatory lines — the last one, "shaky", is the one nobody would write unprompted and the one worth the most: it is where the coordinator looks first.

orlodax@tks:~/claustrum$ /claustrum # in any chat

The cast: who plays which role, decided once

You say "use claustrum to coordinate issues 12 and 13 with an Opus architect, three DeepSeek builders, Opus review, Flash tester", or simply /claustrum. Either way the tool asks seven questions, always the same, in any host:

  • architect: host (that's you) or spawned on…
  • builders: model + max in parallel
  • code reviewer · UI reviewer · tester — or "not needed"
  • spending cap — or "no cap"

If they lived in each harness's prompt they would drift, and every model would phrase them its own way. claustrum cast questions --json returns them with real options: only the backends that are installed and authenticated, only the aliases you configured. The chat is the interface, not the source.

{ "architect":     { "mode": "host" },
  "builder":       { "model": "opencode:openrouter/deepseek/deepseek-v4-pro",
                     "max_parallel": 3 },
  "code-reviewer": { "model": "claude:opus", "tier": "xhigh" },
  "ui-reviewer":   null,                       ← not needed this time
  "tester":        { "model": "opencode:openrouter/deepseek/deepseek-v4-flash" },
  "budget_usd":    10 }                         ← null ⇒ no cap

The cast is a file, not a memory of the chat: it survives context compaction, it gets committed, it gets shared. Next morning /claustrum says "cast default found — use it, or recast?".

orlodax@tks:~/claustrum$ claustrum sync --only claude,opencode,cursor,copilot

Roles: one source, rendered into every harness

roles/builder/ROLE.md         neutral body, with {{tokens}}
roles/builder/role.json       tier → model class, permissions
roles/builder/parts/delegation.claude.md
roles/builder/parts/delegation.default.md
roles/_shared/house-rules.md   "AGENTS.md and CLAUDE.md are law"
roles/_shared/report/builder.mdreport schema
HarnessRendered into
Claude Code.claude/agents/*.md + generated -xhigh/-max stubs
opencode.opencode/agents/*.md
Cursor.cursor/agents/*.md
Copilot / VS Code.github/agents/*.agent.md

The five roles we had (architect, builder, code-reviewer, ui-reviewer, tester) become one text each. The only genuinely Claude-specific content was the delegation mechanism — "use the Agent tool with subagent_type: builder" — and that becomes a per-harness part.

Roles do not name models: they name classes — frontier-coding, cheap-coding, fast — that each developer maps onto their own models in claustrum.json. The same role file serves someone with only Claude and someone with only DeepSeek.

Every generated file carries a marker on its first line; sync --check flags in CI whoever edited one by hand, and a file without the marker is never overwritten. The original ~/.claude/agents/ folder becomes an output of sync --global.

orlodax@tks:~/claustrum$ claustrum backends list

Five backends, one interface: adding one is one class

BackendHow the role gets inPermissions "edit + shell, never push"What it reads
claude--append-system-prompt-file (a file — never inline JSON through npm's .cmd shim)--permission-mode acceptEdits --permission-prompts none --disallowedTools "Bash(git push*)"--output-format json: result, session, cost
opencodeinline agent in OPENCODE_CONFIG_CONTENT: touches neither the repo nor ~/.configpermission: {"edit":"allow","bash":{"*":"allow","git push*":"deny"}}--format json, JSONL events
cursorno system-prompt hook: the role is prefixed to the prompt-f + a rule in the prompt (advisory, and doctor says so)--output-format json
copilotper-job agent file (dedicated COPILOT_HOME)--allow-all-tools --deny-tool "shell(git push)"--output-format json, JSONL
apisystem message = role body; no toolsn/a — pure reasoning (reviewer, planner)OpenRouter or Anthropic, by model prefix
interface IBackend {
  Task<Doctor> DetectAsync(…);
  ProcessSpec  Build(ResolvedRun run);
  ParsedOutput Parse(stdout, stderr, exit);
}

The backend hints at which files it touched; git decides. Snapshot before and after the spawn: changed_files and diff are correct even for a harness whose JSON does not list edits.

Claustrum launches backends on the OS it runs on: the Windows binary talks to Windows harnesses, the WSL one to Linux ones. Never a D:\ ↔ /mnt/d translation. doctor warns when the two get mixed.

orlodax@tks:~/claustrum$ grep -rn "enforced" NOTES.md

The rules that matter are enforced, not requested

The reviewer must see only the task and the diff. It used to be a sentence in the architect's prompt, entrusted to its discipline.

Now, for a role with blind: true, the runner refuses a brief containing ## Context, ## Plan, ## Rationale or a pasted claustrum-report block — exit 2, "blind role: brief carries rationale".

N builders in the same checkout overwrite each other. With max_parallel > 1 every job gets its own git worktree on a claustrum/<job> branch; the architect integrates by rebase, never a merge commit.

The parallel cap is a semaphore in the job manager, shared by CLI and MCP: a spawned architect that over-fans waits.

Accounted over the whole tree of jobs: a child that would exceed the remainder is refused with BudgetExceeded, not launched.

And it can be switched off: "budget_usd": null, or "no cap" in the questionnaire. When it is off, cast show prints budget: unlimited — the choice stays visible.

The same philosophy as "Factory settings", part V: a process that holds does not rely on the vigilance of whoever runs it. Here the membrane is not a prompt, it is an if.

orlodax@tks:~/claustrum$ claustrum coordinate --cast default --issues 12,13

Two ways to conduct: from the podium or spawned

The agent you are talking to is the architect: it adopts the synced role and issues the delegations itself. Works in every host, uses the host's subscription. It is the normal case: you in chat, it calling delegate.

claustrum coordinate launches the architect too, headless, on the backend the cast chose — claude -p uses the Claude subscription — with the cast injected and Bash(claustrum *) allowed. The architect calls Claustrum recursively for builders, reviewers, tester.

The pipeline is the architect's prompt. Claustrum supplies the cast, the blind gate, the semaphore, the tree-wide budget, and progress through job_status. No state machine.

gh issue view <n> --json title,body becomes the brief's ## Task; the final commit cites Closes #n. An issue that is not on the board does not exist — and this one is closed by whoever resolved it, in the same pass.

The target sentence, which is also the acceptance test: "use claustrum to coordinate these issues with an Opus architect from my subscription, which spawns three DeepSeek V4 Pro builders from OpenRouter, then reviews with Opus, and runs the tester on Flash". One line in chat, the rest hands-off.

orlodax@tks:~/claustrum$ exit

The measurement that would settle it

Not another table of benchmarks that contradict each other. The divergence rate per role, read from the ledger the blind reviewers already produce: Flash in the builder seats, Opus in the architect's, and the falsification layer answering in our place.

Claustrum exists precisely so that experiment can run without anyone changing tools. The cast is a file: next week we try one together, each from our own podium.

Text and tool by orlodax. Theme: phosphor terminal, CRT scanlines and glyph rain; JetBrains Mono. The logo is set in "ANSI Shadow", the same face as the Kriss Journey cover. Cost figures from the internal note "Claude vs DeepSeek", September 2026 — assumptions to be replaced with measurements.

End. Home returns to the cover.