patch-cc 0.3.2 — repair the 2.1.235 identity drift
Repairs live thinking on Claude 2.1.235. On that build live-thinking
lost its required prop-threading step, so the fixpoint dropped the whole
patch and thinking stopped streaming mid-turn — every other patch landed.
Upgrade and re-bake (patch-cc apply --from-cache, or re-run the menu).
What broke
Nothing behavioural. 2.1.235 retired agentDefinitions from the
conversation-render props bags — the prop still occurs 97 times in the bundle,
as other components' prop. The matcher used it as witness and insertion point
in one, so an identity resting on a neighbour read a build that plainly drew
four conversation renders as drawing none, with every anchor count standing.
Third break of one class in eleven releases: 2.1.224 took the .enum( callee,
2.1.234 the resolver's exact return null, 2.1.235 the neighbouring prop —
each an identity conjunct beyond the semantic essence, kept only for as long
as upstream happened to keep it.
The fix
prop-threading's identity is now the pair that makes a render a conversation
render — conversationId and messages — carried by a bag handed to a
component: an argument. The bound is part of what a render is, spelled as
grammar rather than as a neighbour's name; it is what keeps a module-level
literal, a return-value payload, or a config object carrying the pair from
being read as a render. Insertion sits before conversationId, one of the
identity's own props, so it cannot be absent from a bag the identity admitted.
Along the way:
transcript-signaturesheds the same triple-role conjunct one prop over:
showAllInTranscriptwas find-anchor, identity and insertion point in one,
and discriminates nothing on any archived build —messagesplus
streamingToolUsesnames the same one renderer, so the pair is the identity
and the insertion point moved inside it;- the pair-and-argument identity sees all four conversation renders — the
neighbour-based one silently saw two.
Swept over all 13 archived pristine builds (2.1.216 → 2.1.235): 2.1.235 flips
to green at cand=14 — level with 2.1.234 — and no candidate count moves on
any older build. Verified at runtime on patched 2.1.234 and 2.1.235: thinking
streams mid-turn.
Also in this release
- Declaring a step is the API's shape now, not a discipline.
Outcome.declare(required=, optional=)is the only way a step comes to
exist, andoutcome.step(name)only retrieves — an undeclared name is a
broken patch, a code path that never runs leaves a required step at0/0
with a verdict to fail, and a typo cannot mint a silently optional step.
All five patch modules declare up front;live-thinking's dispatch points
now fail by name on a build whose reducer is gone, instead of never
having existed. - A verification card for
create-diffin the PLAYBOOK: the paths that
legitimately show no diff (Bash-created files, plan previews, condensed
contexts, non-verbose scratchpad re-renders) are named next to the patch,
so an "is it alive?" check by eye has an oracle. Measured on 2.1.234:
every reachable path drew the diff.