Repository navigation
fix(console): the injection assertion reads the plain runs inside long or escaped describe literals, so a .objectstack-sha pin gets a real witness - #24672
Merged
objectstack-fleet[bot] merged 1 commit intoOct 19, 2026
Conversation
… escaped describe literals describeCandidates skipped every describe literal over 160 characters or carrying an escape. At a pin whose reference differs from this tree only in such literals (objectui 12dc7b47 against objectstack f4755a6: the flow runAs text) both pools were empty, the stamp recorded freshWitness null, and the assertion passed the control bundle. A skipped literal is now cut at each escape and quote, and each run of 32 characters or more is a candidate. Self-test battery 16 pins the pin's shape. Claude-Session: https://claude.ai/code/session_019oG4xEYrGxr5n2cdSNbWMK Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
Seat review ·
|
objectstack-fleet
Bot
deleted the
claude/issue-24663-injection-witness
branch
October 19, 2026 23:08
This was referenced Oct 19, 2026
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.
Fixes #24663
Clause-②: no
The in-build console spec-injection assertion was vacuous at
.objectui-sha12dc7b47and passed the control bundle (exit 0). The cause is indescribeCandidates(scripts/console-spec-probes.mjs): it took only.describe()literals of 32 to 160 characters with no escape. Between objectui's.objectstack-shaf4755a68a797and this tree, the one describe that changed (the flowrunAstext) is over 160 characters, and its em dash is a backslash-u escape (a backslash, thenu2014) in the built dist. So both candidate pools came out empty and the stamp recordedfreshWitness: null.The change
A second candidate source. A describe literal the old rule skips is cut at every escape sequence and every quote character. Each run of 32 characters or more is now a candidate.
pickProbe's substring rule would drop them.Old candidates are unchanged. A literal the old rule accepted is still taken whole, so every candidate it produced is still produced.
chooseProbes, the stamp shape and the cache-hit replay (check-console-injection.mjs) are unchanged.The fixture. Self-test battery 16 in
scripts/check-console-injection.mjs(16 cases) is shaped like this pin:.objectstack-shapin, with the reference as objectui's own build of it;u2014);It asserts that the stamp carries the changed run as
freshWitness, that the assertion exits 1 on the control bundle, and that the good stamp replayed over the control exits 1. The roster floor is 13 → 14.No release workflow and nothing under
.github/workflows/**changed. The diff is 2 files underscripts/.Reverse verification
The fix was committed first. Then the
literalSegmentscall was replaced by a comment, andnode scripts/check-console-injection.mjs --self-testexited 1 with 8 failures. Among them: the control bundle "expected 1, got 0", the witness "expected … got null", and the replay "expected 1, got 0". Restored withgit restore --source=HEAD, the porcelain was clean and the self-test exited 0 with 100 assertions.Proof on a real build (pin
12dc7b47c340)PR #24660 has not landed, so
.objectui-shaonmainis still4016370af3c9. The build ran in a throwaway worktree: this branch at50f12801merged locally with #24660's head0b45222fef. Nothing from that merge is pushed. I will mergemaininto this branch once #24660 lands.The build ran
turbo run build --filter=@objectstack/client... --concurrency=2 && bash scripts/build-console.sh, which is whatpnpm objectui:buildruns, and it exited 0. It took the.objectstack-shabranch, built objectui's own@objectstack/*atf4755a68a797as the reference (.stamp.json:source: pin,shaf4755a68a797…), and packed this tree in throughOBJECTSTACK_ROOT. Its log:The stamp records
skew: true,vendoredPinf4755a68a797…,freshWitnessthe run quoted above (wasnull), andstaleDetectorthe pin-only run.main's probes)pnpm check:console-injection --require-stampon the injected distassert-console-spec-injection.mjson the control bundlecheck-console-injection.mjs --dist … --require-stamp)OBJECTSTACK_ROOTunset (objectstack-pin.mjs status: "built at the pin f4755a6"). The bundle has no stamp.assets/*.js(grep -lF): the full witness is in 1 injected asset and 0 control assets; the full detector is in 0 injected assets and 1 control asset.Gates
node scripts/pm/check-governed-merges.mjs --branch claude/issue-24663-injection-witness: NOT governed; 134 changed lines.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commandsderived 35 commands, and all 35 exited 0. The--ranreconciliation reports "35 run, 0 NOT-MEASURED".pnpm exec eslinton both files exited 0.scripts/), as with PR fix(release): judge a .objectstack-sha console bundle against objectui's own build of that commit #24532. Labelskip-changeset.main's battery after the merge.Acceptance notes
description:text (for example thesharing_ruleentry), is not added. The describe runs alone give a non-null witness at this pin.🤖 Generated with Claude Code
Generated by Claude Code