fix(sse): preserve Claude Code cache breakpoints - #8934
Merged
diegosouzapw merged 2 commits intoAug 6, 2026
Merged
diegosouzapw merged 2 commits into
diegosouzapw merged 2 commits into
Conversation
cryptiklemur
marked this pull request as ready for review
July 29, 2026 23:18
diegosouzapw
added a commit
that referenced
this pull request
Aug 6, 2026
…9554) * fix(quality): reconcile inherited file-size drift on the release tip 13 files sit above their frozen LOC on the clean tip 8180b49 (measured by the gate itself). The PR-mode base-relative check (#8522) correctly lets innocent PRs pass, but per-PR rebaselines were lost across successive conflict resolutions of this hot file during the 08-05/06 merge batch — so the absolute mode (nightly, local runs) is permanently red and stops distinguishing real growth from inherited drift. Frozen values updated to the measured tip, each annotated with the merged PR that grew the file (#9024 #9324 #9329 #9193 #9332 #9228 #9236 #9314 #9260 #8934 #9196 #9163); executors default.ts and kiro.ts (above the 1000 cap with no frozen entry) join the frozen set. * fix(quality): prune orphaned ESLint suppressions and clear the 5 unsuppressed errors The 'No new ESLint warnings' job reds the whole queue with exit 2: 'There are suppressions left that do not occur anymore' — the 08-05 merge batch removed code whose violations were frozen in eslint-suppressions.json, leaving orphaned entries (673->670 files, 4338->4333 violations after eslint --prune-suppressions). The full-tree run also surfaced 5 real unsuppressed errors merged with the batch, fixed here instead of suppressed (new violations must be fixed, per policy): 4x no-explicit-any in tests/unit/catalog-order-contract.test.ts ((conn as any).id -> typed cast) and 1x react/no-unescaped-entities in the agent-bridge SetupWizard (#9095). Also restores the _comment policy header the successive hot-file conflict resolutions had dropped (TS7 debt freeze provenance + prune policy). * fix(quality): absorb the two file-size growths merged while this PR was in CI The base kept moving during the reconcile cycle: #9184 grew src/sse/handlers/chat.ts 1857->1877 and #9005 grew open-sse/executors/default.ts 1027->1042. Re-measured on the merged tree; gate back to 0 violations. * fix(tests): move the orphaned RTL ratchet test to a collected path as node:test #8828 added tests/unit/scripts/check-rtl-ratchet.test.ts — a path no runner collects (the node:test globs enumerate an explicit subdir list without scripts/, and vitest.config.ts never included it), so the file NEVER ran and the test-discovery orphan gate reds the queue. Moved to tests/unit/ (collected by node:test) and converted from vitest describe/it/expect to node:test+assert to match the runner and the sibling check-*.test.ts files. 5/5 green under the real runner. --------- Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
Validated in local merge-train (devbox-vm-06-dev002) @ combined-tip (FAST gates green: static + changed tests + vitest — only pre-existing audit.test.ts flake). Evidence: /home/diegosouzapw/dev/proxys/OmniRoute/.claude/worktrees/merge-train-20260805-213228-suite.log
muhamadgalihsaputra
pushed a commit
to niyatna/NiyatnaRoute
that referenced
this pull request
Sep 27, 2026
…iegosouzapw#9554) * fix(quality): reconcile inherited file-size drift on the release tip 13 files sit above their frozen LOC on the clean tip 30be158 (measured by the gate itself). The PR-mode base-relative check (diegosouzapw#8522) correctly lets innocent PRs pass, but per-PR rebaselines were lost across successive conflict resolutions of this hot file during the 08-05/06 merge batch — so the absolute mode (nightly, local runs) is permanently red and stops distinguishing real growth from inherited drift. Frozen values updated to the measured tip, each annotated with the merged PR that grew the file (diegosouzapw#9024 diegosouzapw#9324 diegosouzapw#9329 diegosouzapw#9193 diegosouzapw#9332 diegosouzapw#9228 diegosouzapw#9236 diegosouzapw#9314 diegosouzapw#9260 diegosouzapw#8934 diegosouzapw#9196 diegosouzapw#9163); executors default.ts and kiro.ts (above the 1000 cap with no frozen entry) join the frozen set. * fix(quality): prune orphaned ESLint suppressions and clear the 5 unsuppressed errors The 'No new ESLint warnings' job reds the whole queue with exit 2: 'There are suppressions left that do not occur anymore' — the 08-05 merge batch removed code whose violations were frozen in eslint-suppressions.json, leaving orphaned entries (673->670 files, 4338->4333 violations after eslint --prune-suppressions). The full-tree run also surfaced 5 real unsuppressed errors merged with the batch, fixed here instead of suppressed (new violations must be fixed, per policy): 4x no-explicit-any in tests/unit/catalog-order-contract.test.ts ((conn as any).id -> typed cast) and 1x react/no-unescaped-entities in the agent-bridge SetupWizard (diegosouzapw#9095). Also restores the _comment policy header the successive hot-file conflict resolutions had dropped (TS7 debt freeze provenance + prune policy). * fix(quality): absorb the two file-size growths merged while this PR was in CI The base kept moving during the reconcile cycle: diegosouzapw#9184 grew src/sse/handlers/chat.ts 1857->1877 and diegosouzapw#9005 grew open-sse/executors/default.ts 1027->1042. Re-measured on the merged tree; gate back to 0 violations. * fix(tests): move the orphaned RTL ratchet test to a collected path as node:test diegosouzapw#8828 added tests/unit/scripts/check-rtl-ratchet.test.ts — a path no runner collects (the node:test globs enumerate an explicit subdir list without scripts/, and vitest.config.ts never included it), so the file NEVER ran and the test-discovery orphan gate reds the queue. Moved to tests/unit/ (collected by node:test) and converted from vitest describe/it/expect to node:test+assert to match the runner and the sibling check-*.test.ts files. 5/5 green under the real runner. --------- Co-authored-by: diegosouzapw <diegosouzapw@users.noreply.github.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
messages[].system, which invalidates the cached conversation prefix.Why this change
Anthropic documents two cache behaviors that apply to the affected Claude Code requests.
First, "Cache writes happen only at your breakpoint." Anthropic checks up to 20 blocks behind each breakpoint for a prior write and supports up to four breakpoints. A request with cache markers on static system or tool content, but none in
messages[], does not write a recent conversation-prefix entry. As the conversation grows, the last usable write can fall outside the lookback window. This patch adds a marker to the latest user content only when no message marker exists and a breakpoint slot remains. See Anthropic prompt caching.Second, Anthropic hashes the prompt in
tools,system, thenmessagesorder. Its documentation says, "A cache hit requires the prefix to match a recent request exactly, byte for byte." Hoisting a system message from the middle ofmessages[]into top-levelsystemchanges an earlier part of that hash and invalidates every cached message after it. Anthropic recommends appending the instruction as arole: "system"message instead because "The cached prefix stays the same." This patch preserves that structure for eligible Opus full-agent requests while retaining the legacy hoist elsewhere. See Anthropic mid-conversation system messages.The cost difference is material. Anthropic prices a 5-minute cache write at 1.25 times the base input-token rate and a cache read at 0.1 times that rate. Rewriting a large prefix instead of reading it can cost 12.5 times as much for those tokens. See Anthropic prompt caching pricing.
Related issues
Validation
npm run typecheck:coreTests added or updated
tests/unit/chatcore-translation-paths.test.tstests/unit/claude-code-parity.test.tsCoverage notes
The request-path regression runs native Claude passthrough through the executor and inspects the final upstream body. It verifies that Opus 5 keeps the original message order, preserves the mid-conversation cache marker, does not hoist that block into top-level
system, and does not add a redundant marker to the latest user turn.The existing Sonnet and generic-client tests continue to cover the legacy hoisting path. The parity tests cover existing message markers and the four surviving-breakpoint limit.
Reviewer notes
The new behavior is limited to native Claude full-agent requests for supported Opus models. The same eligibility helper controls both the payload behavior and the Anthropic beta header, so unsupported request shapes keep the old normalization.
This PR does not change database state, migrations, or user settings.