Skip to content

patch-cc 0.3.2 — repair the 2.1.235 identity drift

Choose a tag to compare

@anfreire anfreire released this 19 Aug 12:03
· 20 commits to main since this release

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-signature sheds the same triple-role conjunct one prop over:
    showAllInTranscript was find-anchor, identity and insertion point in one,
    and discriminates nothing on any archived build — messages plus
    streamingToolUses names 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, and outcome.step(name) only retrieves — an undeclared name is a
    broken patch, a code path that never runs leaves a required step at 0/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-diff in 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.