I Love Trios π
Three coding assistants, one desk. Same notes, same rules, same review path β and still no bake-off.
I used to have two coding assistants that shared a setup, and a third one that lived next door. That was a nuisance. If I wanted the same notes, the same rules, and a second opinion, I had to remember which machine was which.
That is no longer the case. Claude Code, Codex and Grok Build now sit in the same personal setup. I can hand any of them a job in the same projects, with the same notes and the same review path. The rest of this article is how that actually works, what broke on the way, and what I still have not measured.
Three seats, one desk
The names still need separating.
Claude Code is the program. Fable 5.1 is the model, at max. Codex is the program. GPT-6 Astra is the model, at ultra. Grok Build is the program. Grok 4.6 is the model, at xhigh.
max, ultra and xhigh are each vendorβs highest advertised reasoning setting. They are not a shared scale. I am not claiming one of them thinks harder than the others.
I pay for three subscriptions: Claude Max at $200, ChatGPT Pro at $200, SuperGrok Heavy at $300. That is $700 a month of my actual bills, not a quote for your region, and not a conversion of API token math into a credit-card charge. SuperGrok Heavy is the plan. Grok Build is the program. They are not the same thing. I am not going to pretend the invoice is a benchmark.
I already wrote about adding Grok to the machine and about putting Astra and Fable on full power. This piece is the missing joint: making the three of them interchangeable enough that I can pick any one without changing the rest of the desk.
They can still all be wrong. Agreement is a correlation, not evidence. Tests and reading the actual diff remain part of the job.
What βthe deskβ is
Three words get used as if everyone already knows them. They are ordinary.
A harness is the code and instructions around the model: launchers, permissions, hooks, review helpers. The model decides. The harness is the hands and the rules for using them.
QMD is the local search over my notes. It finds passages by words and by meaning. It does not grant permission to change a file, and a matching chunk is not automatically the current rule.
A graph, here, is a small list of recorded links: this instruction replaced that one; this procedure depends on that source. It is a map, not a manager. A link never starts a job.
The useful picture is boring. Search first. Follow a recorded link if the question is about current versus retired guidance. Then read the original. I wrote the longer version of that map in Graph Engineering: Evidence In, Guesswork Out.
Same notes, same rules, same review
Before this work, Grok was installed and configured. It was not on the common policy. Hooks, skills, the review helper and the search guard had Claude and Codex shapes. Grok had to be taught those shapes without pretending the three programs are the same binary.
The result is one maintained source for the shared rules, and a thin native adapter for each program. Claude, Codex and Grok each keep the capabilities they actually have. A Claude-only tool is not assumed to exist in Grok. A Grok-only flag is not assumed to exist in Codex.
Practical consequences:
- I can open any of the three in the same project and get the same notes and the same standing instructions.
- User-level skills for shared jobs inherit into a checkout without dropping personal harness files into someone elseβs repository.
- Search guards understand Grokβs and Codexβs search tools as well as Claudeβs, including awkward cases like an omitted path, a symlink, or a nested working directory.
- When I ask one of them for another AIβs opinion, the helper now knows all three callers.
That last point is the one I use constantly.
A second opinion is a different pair of hands
The request is the same from every seat. Randomize the other two providers. Try the first. On a classified outage β installation, login, credits, rate limit, or the one native Codex input-size error β try the remaining other provider. If both are unavailable, start a fresh independent child from the same provider and label it as such. Never call that last result a cross-provider agreement.
An explicit pin is different: one provider, no fallback. I used that for the implementation reviews on this work.
The child is text-only. No tools, no notes discovery, no ability to publish. I have to put the evidence in the prompt. A path is not the file. The parent keeps its normal tools.
A few rules that exist because they were broken in testing:
- A stream that claims success but contains a malformed line is a contract failure, even if a later diagnostic looks like a rate limit.
- Availability is classified from error fields and stderr, not from a usage counter that happens to contain
429. - On a failed child, the receipt now keeps a short sanitized tail and a classified reason, including a published reset time when the vendor sends one. The public answer stays empty. Credentials are stripped.
- Claudeβs review child runs in the default permission mode. On the installed 2.1.263 CLI, plan mode injected a plan-mode directive into a child that had no tools. Default mode did not.
- Isolation is tools, memory and extra instructions. It is not the native program itself. A Claude child still receives the CLIβs own system reminders.
Agreement between models is not verification. Disagreement is a reason to open the source. There is no recursive βkeep asking until they agreeβ loop.
I already had the two-provider version of this in Astra Γ Fable. The change is that Grok is a first-class caller and a first-class reviewer, not a guest.
The bugs that were actually there
A setup article that only lists flags is a configuration dump. The useful part is what failed.
Hook installers used to treat a whole-line marker as a boundary even when that line sat inside a quoted string or a heredoc. A successful rewrite could delete unrelated shell. They now refuse to write when a managed marker is nested, and they leave the original bytes and permissions alone. A quoted heredoc word keeps its backslashes; a bare word still has them stripped, which is what the shell does. This is not a shell parser. An ugly $(( x << 2 )) can still look like a heredoc opener and refuse a rewrite. That refusal is the safe direction.
Review routing had a hole where a malformed successful stream could fall back because a later line looked like an outage. That is closed. A real usage-limit banner on a nonzero exit is classified as credits, including Codex writing that banner as JSON on stdout. A 429 inside a counter still is not.
Process cleanup had a hole where a helper could exit while its child group was still alive. Owned groups are now signalled even after the leader has gone, with a bounded grace then a kill. That does not claim crash-proof erasure of every temporary file.
Stopped work stays stopped. βThe task endedβ is not βthe task succeeded.β A halted automation is still halted.
Native versions for this write-up: Codex 0.153.4, Grok Build 1.0.13, Claude Code 2.1.263. A later patch release can change a flag. The tests are against these.
What I am not claiming
I have not measured whether three assistants produce better answers than two. I have not measured whether they are faster. I have not measured whether $700 is βworth it.β API-equivalent cost fields in a log are not a bill.
I have measured that the review helper, the hook installers, the search guard and the shared launch path behave the way the tests say on this machine. That is a smaller claim, and it is the one I can defend.
Codex hit a usage limit during the later review rounds. The native message named 13 September 2026 as the reset. An explicit pin correctly refused to substitute another model. Claude also failed a later pinned review with an invalid result and no model identity in four seconds. I am not going to relabel that as a credits outage without the classified reason. Those gaps are part of the record, not a reason to pretend three independent approvals landed on every amendment.
Why I wanted the trio anyway
Two assistants that share a desk give you βthe other one.β A third is how independent review still has somewhere to go when one vendor is the worker, and another way to be wrong in a different direction. That is useful on a change that already survived one reviewer, and it is useful when one vendor is out of quota.
The cost is real. The setup work is real. The unmeasured part is whether the extra seat earns the extra $300. I will judge that from completed tasks, not from this article.
For now: three programs, one desk, same notes, same rules, same review path. That is the change.
Related Reading
- Grok Joins the Party β adding Grok Build, with the model pin and the launcher.
- Astra Γ Fable: Full Power, Less Waste β maximum settings for the other two, and the two-provider review helper.
- Graph Engineering: Evidence In, Guesswork Out β the instruction map and the difference between a link and permission.