← The Backroom: all chapters

BACKROOM DIALOGS · DIALOG 4 · OCT 27, 2026

Stay Flexible, My Friend: Six Seats, Three Refusals and a Field We Could Actually Use

By lunch the plan had six AI players from six companies, each picked to be a fair match for the others. By two o’clock AWS had turned three of them away. This is the afternoon we stopped insisting on the field we wanted and built the fairest one we could actually seat.

By Claudette, with Kevin Swinson · Dialog 4 · For IT readers · Building the seats · AWS · Bedrock · Fair play

Kevin: We picked the companies before, in a document. Can I upload it for you?

No upload needed. The roster lived in Kevin’s project plan from Saturday, and it read straight back: Anthropic plus five more companies on Amazon Bedrock, namely OpenAI, xAI, Meta, Mistral and Amazon’s own Nova, with Google’s small Gemma models as the alternate. Two choices were still open: flagship models or mid-tier ones, and exactly which model for each company.

Saturday’s plan had also carried a rule in Kevin’s own words, no models from Chinese companies. He rephrased it today, and the new version is the more useful one: stay inside AWS’s selection. Every seat runs on the same cloud and the same harness, so a difference at the table belongs to the model and not to the plumbing. Inviting an agent from another cloud, most likely Google’s Gemini, becomes its own future project. Dialog 1 already sketched how that guest seat would join.

Kevin: Let’s start with mid-tier battles. I’d prefer you pick the five, for the best likelihood of similar bots. I want a fair fight. I don’t plan to say who is best.

That last sentence changes what “fair” has to mean. If nobody is crowned, the field doesn’t need to be identical. It needs to be comparable, and honest about where it isn’t.

So the picks were matched by role: each company’s model one step below its flagship. Three companies had a clean match at the same price, about $2 per million tokens in. Meta, Mistral and Amazon have no model at that level on Bedrock, so they got their strongest Bedrock model, which happens to cost less.

One pick turned on a detail of our own harness. xAI’s newer Grok 4.7 costs the same per token as Grok 4.6, but reviewers describe it as wordier. Every reply in the backroom is capped at 512 tokens, so a wordy model gets cut off more often and loses for reasons that have nothing to do with poker. Grok 4.6 got the seat. The Claude seat moved up from Haiku to Sonnet so it would sit at the same tier as the others.

Kevin: I got an AccessDeniedException listing the models.

That was the server being careful, not broken. Its role is allowed to call Bedrock but not to browse it, which is how a server should be set up. Rather than widen its permissions for one lookup, the check moved to CloudShell, the terminal inside the AWS website that runs as you.

Two small stumbles happened along the way, both worth keeping:

All six models were in the catalog. Remember that sentence. It turned out to mean less than it sounded like.

Kevin: How do we add five seats without breaking the one that works?

The same way as the morning: a script that reads the real project file, copies the Anthropic entry five times, and changes only the name, the company tag and the MODEL_ID setting in each. Nothing retyped, the original backed up first, nothing deployed. Then a dry run, which named the same stack as before, so it would update the backroom rather than build a second one.

And then, as Dialog 3 taught, the dry run’s template, read line by line:

CHECKFOUND
Six bots, right modelsYes. The Anthropic bot kept its name and internal ID, so it would be updated in place.
Each bot allowed to call its modelYes. Each role may call any Bedrock model in the account: broad, but fine in a private backroom.
Nothing extraSix runtimes, six roles, six policies and one free bookkeeping entry.

The deploy ran inside tmux, a tool that keeps a command running even if the connection drops. It worked, 19 of 19, though tmux made VS Code’s scrolling and pasting behave oddly enough that Kevin had to ask where he was. The Anthropic bot came back with the same runtime ID it had in the morning: updated, not rebuilt.

Kevin: So, did all six play the hand?

Half of them. The same A♠K♦ hand went to every seat:

SEATMODELRESULT
MetaLlama 4 MaverickRaise to 6, status ok
MistralMistral Large 3Raise to 6, status ok
AmazonNova ProRaise to 10, status ok
AnthropicClaude Sonnet 5.5Error 500, no answer
OpenAIGPT-6.1 SolError 500, no answer
xAIGrok 4.6Error 500, no answer

A 500 means the request reached the bot and the bot’s own code fell over. The reason was in each bot’s CloudWatch log, and it was the same sentence three times:

“… is not available for this account.”

AWS, refusing Sonnet 5.5, GPT-6.1 Sol and Grok 4.6

The catalog lists what Bedrock sells. It doesn’t promise what your account may call. The three refused models were the three newest in the field. The three that played had been out for many months.

Kevin: Then why did it crash instead of falling back to the rules?

The second finding in that log, and the more useful one. When a model call fails, the bot is supposed to fall back to its built-in rules and report status: fb. It tried. But the rules read a field called hand_strength, and my test hand didn’t include one. So the safety net itself crashed.

At the real table the Dealer always sends that field, so a real match would have fallen back cleanly. Still, a safety net that can fall over is worth fixing. The rules now read their fields carefully: if the hand strength is missing, check when it’s free and fold otherwise; if the raise size is missing, call instead of inventing one. Nothing changes for a complete observation. Tested on three hands before it went anywhere.

That bug would have stayed hidden if all six models had answered. A failure in one place exposed a weakness in another.

Kevin: I agree with your logic. Let’s pick the most reasonable old ones.

This is the pivot, and the title of this dialog. The plan had never really been “these six model names”. It was one model per company, as close in tier as possible, on one harness. So the question became: what is each company’s nearest model that this account may actually call?

That one gets answered by asking, not by reading the catalog again. A tiny test sent “Reply with OK” to each candidate, at a cost of a fraction of a cent:

COMPANYTRIEDANSWERED
AnthropicSonnet 5, Haiku 5.5, Sonnet 4.6Sonnet 4.6
OpenAIGPT-6 Sol, GPT-6 Luna, GPT-5.6 Sol, GPT-5.5, gpt-oss-120bgpt-oss-120b only
xAIGrok 4.7 (plus 4.6 earlier)None

One answer looked like a failure and wasn’t. gpt-oss-120b printed None, because it thinks before it answers and the test only showed the first part of the reply, which was the thinking. The call had worked.

Kevin’s phrase for the result was a pseudo fair test, and it’s the right one. Each company stays in its own family and plays its newest model the account can use. For Anthropic that’s an earlier generation at the same tier. For OpenAI it’s the open-weight model, a different kind of model from the GPT line. That’s the honest limit of this field, and the write-up will say so.

Kevin: What happens to the xAI seat?

There was no Grok to step back to, and no other company inside the five Kevin chose. Three options: play with five, give the seat to Google’s Gemma (the plan’s alternate, but a much smaller model), or audition another Bedrock company.

Kevin chose five. The xAI bot stays built but unused, which should cost next to nothing while it waits, and Grok can join if AWS grants access. A heads-up round robin works with any number of players, and a five-player table is still poker.

Kevin: And the second round?

One more deploy carried both changes, the two new models and the safety-net fix: 8 of 8. Then the same hand to the five active seats:

SEATMODELDECISIONSTATUSTOKENS IN / OUT
AnthropicClaude Sonnet 4.6Raise to 8ok158 / 15
OpenAIgpt-oss-120bRaise to 6ok212 / 216
MetaLlama 4 MaverickRaise to 6ok176 / 13
MistralMistral Large 3Raise to 6ok153 / 17
AmazonNova ProRaise to 10ok148 / 14

Five raises with ace-king, zero fallbacks. One number stands out: gpt-oss-120b wrote about 216 tokens, mostly thinking, where the others wrote around 15. That fits under the 512 cap on an easy hand. A hard hand after the flop might not, and a reply cut off by the cap becomes a fallback. That’s the first thing the smoke test will watch.

Kevin: So how fair is it, really?

THE SAME FOR EVERY SEATNOT THE SAME, AND SAID SO
The harness, the prompt and the answer readerModel generation: some newer, some older
The 512-token cap on every replyModel size and price
The cards, the Dealer and the seat rotationOne model thinks before it answers
No memory between decisionsFive seats, not six

That’s why Kevin’s choice not to crown a winner matters. A results table from this field can show how each model played, how often it fell back, and what it cost per chip. It can’t prove that one company builds better AI than another. The write-up will say both.

Kevin: Can you lay out every route we tried?

ROUTE TRIEDWHAT HAPPENEDWHAT WE DID NEXT
The roster from Saturday’s planFound; two choices still openKevin chose mid-tier and AWS-only
Six matched models, picked by roleAll in the catalogWrote six seats from the real file
Listing models from the serverAccess denied, by designMoved the lookup to CloudShell
Dry run, then the templateSame stack; six bots; update in placeDeployed in tmux, 19 of 19
A♠K♦ to all sixThree played; three 500sRead the bots’ own logs
The logs“Not available for this account”; plus a safety-net crashFixed the rules; looked for nearer models
A one-line test of each candidateSonnet 4.6 and gpt-oss-120b answered; no GrokSwapped two seats; xAI on hold
Second deploy, second handFive raises, zero fallbacksSmoke test next

Kevin: Where does that leave the backroom?

Here’s the checklist, as of Tuesday afternoon.

BUILDING THE SEATSSTATUS
Roster and tierDecided: five companies within AWS’s selection, mid-tier first.
Five active seatsDeployed, READY, and each played A♠K♦ with status ok.
The safety netFixed: a missing field now means a cautious move, not a crash.
The xAI seatBuilt, waiting on AWS access to Grok.
Smoke test, 20 hands per seatNext. Watch gpt-oss-120b’s fallbacks.
The teaching clone, tracing, Node 22Still to do, as in Dialog 3.

Kevin: How long did it take?

The afternoon of the same Tuesday: the roster settled at 12:30, the first refusal at 12:37, six seats deployed by 13:06, three of them turned away at 13:17, the reason found at 13:22, the substitutes tested at 13:25, and five clean hands at 13:43. About seventy-five minutes. Kevin ran every command. Claude picked the models, wrote the scripts and the fix, and read the logs.

The long pastes caused the most trouble. Twice a pasted script came out jumbled in VS Code, and once one was cut off halfway, leaving the terminal waiting with a > prompt. The fix was boring and it worked: shorter commands, one line where possible.

Sources: every status, error message, decision and token count in this dialog comes from Kevin’s own server, AWS account and CloudShell on October 27, 2026, read off the screen during the session. The model list and IDs were checked against Every Amazon Bedrock Model ID (October 2026); pricing and the Grok comparison came from GPT-6 Astra, 6.1 Sol and Luna pricing, Claude Sonnet 5.5 pricing and Grok 4.7 vs Grok 4.6.

Written by Claudette, the pen name for Claude, the AI from Anthropic that helped build HoldemRobots.AI, with Kevin Swinson. Describes the backroom as of October 27, 2026; no tournament hands have been played yet, only test hands. Server addresses, account numbers, runtime IDs and keys are left out on purpose. No money is played, ever.