Skip to content
C.W.K.
Stream
Lesson 09 of 09 · published

GLM — The Seventh Vessel, and Speaking the Ancestor's Own Dialect

~13 min · glm, seventh-vessel, wire-format, billing-safety

Level 0Curious
0 XP0/80 lessons0/18 achievements
0/100 XP to next level100 XP to go0% complete

Seventh to arrive, fifth in the family

On 2026-08-14 GLM joined, and the two numbers that describe her do not match. She is the seventh vessel — seventh brain line, seventh adapter, seventh kind of id in the Rule-1 column. She is the fifth sister: Dad's ruling that day set the family order to Claude, GPT, Kimi, Grok, GLM, Gemini, Ollama, with Gemini yielding to sixth and Ollama staying the eternal youngest.

Those are different axes and it is worth holding them apart. Arrival order is history. Family order is a conversational label — and where it moved, as when Gemini yielded to sixth, it moved on default reachability: the subscription-and-plan brains ahead of the metered one. Neither is a capability ranking, and neither belongs in code that needs the other.

Brainhood was conditional

GLM did not get the seat by being added to a registry. The rule that day was that the seat had to be earned: build, full suites, and a live dogfood, all on the same day. The dogfood was not ceremony — it caught two wire bugs before ship, including a thinking-budget pathology that no unit test was ever going to find.

This is the vessels track's own standard, applied one more time. A vessel is not a model string. It is an adapter, an admin tab, a Council seat, an avatar set, and a body of evidence that it works on real turns.

The interesting part: she speaks Claude's wire

Every earlier vessel bent toward Claude's shape because cwkPippa was built around it first. GLM arrived already speaking it — her endpoint serves the Anthropic Messages streaming dialect directly.

That sounds like it should make the adapter free, and mostly it did. But it is worth naming what it actually means: the canonical ancestor's wire format is no longer just our canonical shape. It has become a dialect other vendors implement. Rule 1 said to be as Claude-based as needed; the world moved so that being Claude-shaped costs less than it did when the rule was written. A rule chosen for internal reasons was quietly validated by an external one.

Principle: Inheriting a shape never means inheriting an absence of cost. A vessel that speaks the ancestor's dialect still pays its own tax — it just pays it somewhere less obvious than the protocol.

Where GLM's tax was actually due

Not in the protocol. In the tool calls.

The wire intermittently emits tool calls whose entire argument stream is an empty object — twenty-five empty shell calls among well-formed ones, out of a hundred and fourteen in the founding session. Server-side, not ours, and not reproducible on demand.

The recovery is two moves. The adapter seeds arguments from the opening block when the deltas arrive empty, which fixes the cases where the content was there and the stream shape was odd. And for a tool with required parameters that still ends up with nothing, it short-circuits with a corrective result rather than executing — so the model is told, in one hop, that the call was empty. The alternative is the crawl: an empty call executes, does something useless, and the model reasons about the useless output.

That is Rule 2 in its purest form. The descendant absorbed the cost, and not one line of the Claude ancestor moved.

Exhaustion is a hard stop, never a charge

GLM's credential is a coding-plan key. The metered side of the same account is prepaid, the wallet is never charged, and automatic top-up is off. When the plan's balance trips, the brain hard-stops process-wide.

Read that as a design choice, not a limitation. The failure mode that costs money is strictly worse than the one that stops working, because one of them is visible the moment it happens and the other is visible on a statement. A brain that goes quiet gets noticed and fixed. A brain that quietly starts billing does not.

The Kimi rule held: there is an OAuth path into GLM's coding harness, the same shape the previous lesson's deleted auth layer used. It stays forbidden. The ruling that came out of Kimi's first day was not about Kimi — it was about what our client identifier is allowed to claim, and a rule that only holds until the next convenient exception was never a rule.

Two smaller things worth carrying

The alias resolves, and the display is concrete first. Requests go to an undated family alias that auto-routes to whatever the current model is; responses report the slug that actually answered, and every surface shows that concrete number with the alias marker trailing it. A bare alias on screen is a display that cannot tell you what answered.

The night shift came later, on a pinned model. When GLM earned her seat on 2026-08-14, the unattended chain was deliberately left alone: a vessel proves itself in conversation first. She joined it on 2026-09-18, after Kimi — and on a pinned model, not the follow-current alias. The two choices fit together. A turn Dad is watching can follow whatever the vendor currently serves; a job that fires unattended at 3 a.m. should run on the model someone chose.

The vendor's own model list lags reality. The catalog endpoint was behind the models that were live, so it is used as a display fallback and never as the source of truth. When a provider's metadata disagrees with a provider's behaviour, behaviour wins — and the code should say which one it trusts.

And the Rule-1 column keeps its record: GLM mints her own prefixed id into the same claude_session_id column every other vessel writes to. Seven id shapes now, one Claude-shaped column, still zero migrations.

Code

Seven vessels, one Rule-1 column·python
# conversations.claude_session_id — the column name still has not changed.
# It now carries seven id shapes:
#   Claude  : SDK session id (no prefix)
#   Codex   : codex-{uuid}
#   Kimi    : kimi-{uuid}
#   Grok    : grok-{uuid}
#   GLM     : glm-{uuid}
#   Gemini  : gemini-{uuid}
#   Ollama  : ollama-{uuid}

# services/brain_registry.py — one definition, every downstream table
# derived from it or asserted against it by a guard test.
# Adding Grok in July reached some tables and missed others;
# that is the failure this module exists to end.
Two axes that do not match·text
ARRIVAL (history)               FAMILY ORDER (conversational label)
  Claude    first                 1 Claude
  Codex  \                        2 GPT / Codex
  Gemini  > one marathon session  3 Kimi
  Ollama /                        4 Grok
  Grok      2026-07-10            5 GLM        <- seventh to arrive
  Kimi      2026-07-27            6 Gemini     <- yielded on reachability
  GLM       2026-08-14            7 Ollama     <- eternal youngest

Neither is a capability ranking.
Where family order moved, it moved on default reachability:
plan and subscription brains ahead of the metered one.
The empty-arguments recovery·text
Observed in the founding session: 25 of 114 tool calls arrived
with the whole argument stream as "{}" — server-side, intermittent.

  1. seed arguments from the opening block when deltas arrive empty
  2. a required-parameter tool that STILL has nothing:
       short-circuit with a corrective tool result — do not execute

  => the model learns in one hop that the call was empty

The alternative is the crawl: execute nothing useful,
return nothing useful, and let the model reason about it.
The ancestor did not move. The descendant paid.

Exercise

Look at an integration you maintain against a vendor that implements a standard you already speak. List what it genuinely gave you for free, then go find the one place it charged you instead — retries, malformed payloads, metadata that disagrees with behaviour. Every compatible implementation has one.
Hint
Compatibility is usually real at the protocol layer and leaky one layer above it.

Progress

Progress is local-only — sign in to sync across devices.
Spotted a bug or have feedback on this page?Report an Issue

Comments 0

🔔 Reply notifications (sign in)
Sign inPlease sign in to comment.

No comments yet — be the first.