Repository navigation
Pair the handler with context editing, and catch the rule nothing was watching - #8
Merged
Merged
Conversation
… watching Reviewed the module against the current memory-tool and context-editing documentation. The response strings, the four security asks and every version pin were already correct and are unchanged; what was missing was the pairing this store exists for, and an instrument for the one design rule that admits it has none. Context editing. `clear_tool_uses_20250919` alongside the memory tool is the configuration a durable store is for, and the README said nothing about it. It now shows the configuration on the example already there, and carries the three consequences that belong to this implementation rather than to the feature: the pre-clearing flush is bursty and meets `createOverwrites = false` head-on, `memory` does not belong in `exclude_tools` because its results are the cheapest thing in a transcript to discard, and the burst is still one writing thread under the same cap. Every SDK symbol shown was read out of the pinned 2.54.0 sources, including the check that betas and `contextManagement` do reach the API through the runner. checkDeleteDoesNotCompact. `delete` writes its batch and stops; reclaiming tombstones is `expireBefore`'s job. A breach shows up as latency rather than a wrong answer, so no assertion about behaviour can see it — and "delete should free space" is the intuitive position with the correct code for it living in the same file. The task fails `check` if `compact()` appears anywhere but `expireBefore`, and was verified against a deliberate breach rather than assumed to work. CLAUDE.md no longer claims the rule is unguarded. Also: say which half of the tool is beta, since the tool is GA and only the handler and runner helpers are not; write out the manual loop that has always been named as the escape hatch for `is_error` fidelity, compiled before it was published, with the note that keying off the `Error: ` prefix misses `view`'s deliberately unprefixed string; document a `.png` path as the text memory it is; add `-Drabosh.memory.smoke.model` so a release can spend one canary run on a larger model without editing the file; take JUnit 6.1.3, which the catalogue's own "latest stable" claim had gone stale against. No behaviour changed, no main source changed, and no public signature moved. Co-Authored-By: Claude Opus 5 <noreply@anthropic.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.
Reviewed the module against the current
memory-tool and
context-editing
documentation.
Most of the answer was that nothing needed doing: every response string still matches the
specification, including the ones it has tightened since this was written (the 999,999-line limit,
the
str_replacesnippet, the 16,000-characterviewcap, the empty-root listing); all four of itssecurity asks already have both an implementation and a public explanation; and
anthropic-java,rabosh-api, Kotlin and Dokka are each pinned at the current stable release. None of that changed.Two things were missing.
Context editing
clear_tool_uses_20250919alongside the memory tool is the configuration a durable store existsfor, and the README said nothing about it — the word "compaction" appeared four times in this
repository and meant the engine's LSM compaction every time.
The new section shows the configuration on the example already in the file, and then carries the
three consequences that belong to this implementation rather than to the feature:
createerrors. It meetscreateOverwrites = falsehead-on. The model recovers by reading the file back and editing it, sothe default is unchanged — but that is the shape to expect in a transcript, not a bug to report.
memorydoes not belong inexclude_tools. That option is for results expensive to obtainagain. Memory results are the cheapest thing in a transcript to discard, because each one can be
read back off disk with a
view.maxMemoryBytescap.Every SDK symbol in the snippet was read out of the pinned 2.54.0 sources rather than recalled, and
the one claim that was an inference — that betas and
contextManagementreach the API through therunner — was checked before it went in:
BetaToolRunnerrebuilds each request fromparams.initialMessageParams.toBuilder().checkDeleteDoesNotCompactCLAUDE.mdlists the design rules that fail silently, and each one names the instrument thatcatches it. Exactly one named its absence instead:
deletemust not callcompact(), and a breachwould show up as latency rather than a wrong answer, so no assertion about behaviour can see it. It
is also the rule most likely to be broken in good faith — "delete should free space" is the
intuitive position, and the correct code for it lives in the same file.
The task fails
checkifcompact()appears anywhere butexpireBefore, in the same shape ascheckNoNioPath. It was verified against a deliberate breach rather than assumed to work: withdatabase.compact()inserted intodoDeleteit failed naming the exact line, and that was thenreverted.
CLAUDE.mdno longer claims the rule is unguarded.Also
runner helpers are not. A reader could reasonably have concluded from the example that adopting
this handler meant adopting a beta API.
is_errorfidelity and never shown. It was compiled before it was published, and it names what keying
is_erroroff theError:prefix misses —view's deliberately unprefixed missing-path string..pngpath as the text memory it is, since Claude's tool description promisesviewrenders image files andcreateonly takesfile_text.-Drabosh.memory.smoke.model, so a release can spend one canary run on a larger model withoutediting the file. The default is unchanged.
that claim had gone stale.
.claude/settings.jsonallowlisting the documented./gradlewinvocations. Thelive smoke test and
bundleForCentralare deliberately not on it — one spends money, the otheris the last step before an irreversible upload.
Verification
./gradlew buildpasses on the branch, withcheckNoNioPath,checkDeleteDoesNotCompactandcheckKotlinAbiall running undercheck. No main source changed, no behaviour changed, and nopublic signature moved, so
api/rabosh-memory.apiis untouched.Two things worth a reviewer's judgement rather than a rubber stamp:
.claude/settings.jsonis not covered by.gitignore— onlysettings.local.jsonis — so thispublishes contributor tooling into the tree. That is what a project-scoped settings file is for,
but it is a new kind of file for this repository.
build.gradle.kts:142(
val crashDemo by tasks.registering(...)), found while verifying the new task and unrelated toit. Left alone deliberately; it is one line whenever the Gradle 10 bump is taken.
🤖 Generated with Claude Code