Skip to content

patch-cc 0.1.3

Choose a tag to compare

@anfreire anfreire released this 22 Jul 17:43
· 39 commits to main since this release

Added

  • thinking-summaries — thinking that stayed blank on some accounts now renders. Same binary, same config, same model: thinking rendered under one account and not another. It was never a rendering bug — the text was never sent. Claude Code caches a server-side A/B assignment (clientDataCacheSlots[...].atis in ~/.claude.json) and replays it to the API in an x-cc-atis header so the server applies the same bucket. An account in a suppressing bucket is served thinking blocks carrying a signature and an empty string; no display mode, effort level or thinking.type moves it, so every other thinking patch renders that empty string faithfully. The patch empties the getter the header is built from, letting the set-site's existing if(value!==void 0) guard skip it — nothing is sent, and no branch was added to stop it.

    Established against a pristine 2.1.217 with the full request body and headers dumped and diffed: two accounts, byte-identical thinking: {type:"adaptive", display:"summarized"}, identical betas, identical output_config.effort — one returned summaries, the other empty blocks. Stripping the one differing header restored them, in alternating runs.

    Note the breadth: this drops the bucket for every server-side experiment the account is enrolled in, not only the one that empties thinking. Local feature values still come from the on-disk cache, so only the server's view of the assignment changes.

  • Expectations. A sub-step now declares what its own absence means — expect=True for a link the feature cannot live without, or a named group of alternates of which at least one must land. Absence is checked rather than noted, so a green tick can no longer cover a dead feature. live-thinking's two load-bearing state updates are credited by the markers their builders emit, not by "some rewrite happened", after a reducer whose incidental edits applied reported hits and streamed nothing.

Changed

  • One verdict, and apply acts on it. apply, doctor and the menu now read a single Outcome.health (ok / partial / broken) instead of each re-deriving it from raw counts — doctor once printed a red cross and "all patches still match this build" in the same report. A broken patch is re-run out of the final pass, so its orphan edits never reach the binary, the manifest never claims it, and the command exits non-zero; the healthy patches still apply. That re-run is a fixpoint, not one retry: patches see each other's output, so dropping one can change what the next finds, and each patch is reported by the last run it took part in.

  • Defaults. subagent-prompt is on again, reverting 0.1.2. spinner-tips is now opt-in.

Fixed

  • The CLI and the menu draw findings from one renderer. Each had worded its own, and the menu's copy had quietly lost the exception that broke a patch, along with every note.

  • The manifest records brand, suffix and models only when their patch actually landed, so status can never assert a name the bundle does not contain.

  • docs/PLAYBOOK.md documented branding as opt-in; it is on by default, deriving <username>'s Code.

Install: uv tool install patch-cc or pipx install patch-cc