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
| Person | Harness | Models |
|---|---|---|
| Dario | Claude Code, desktop app, opencode | Fable / Opus / Sonnet + OpenRouter |
| colleague A | Cursor | whatever Cursor offers |
| colleague B | opencode only | DeepSeek via OpenRouter |
| colleague C | Copilot CLI, VS Code | Copilot |
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
// 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
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:
| Task | the words of whoever asked, verbatim |
| Scope | which folders and files it may touch |
| Don't break | what must keep working |
| The changes | how 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
| Harness | Rendered 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
| Backend | How the role gets in | Permissions "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 |
| opencode | inline agent in OPENCODE_CONFIG_CONTENT: touches neither the repo nor ~/.config | permission: {"edit":"allow","bash":{"*":"allow","git push*":"deny"}} | --format json, JSONL events |
| cursor | no system-prompt hook: the role is prefixed to the prompt | -f + a rule in the prompt (advisory, and doctor says so) | --output-format json |
| copilot | per-job agent file (dedicated COPILOT_HOME) | --allow-all-tools --deny-tool "shell(git push)" | --output-format json, JSONL |
| api | system message = role body; no tools | n/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.
github.com/orlodax/Claustrum
MIT licence
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.