Uh oh!
There was an error while loading. Please reload this page.
docs(pm-dispatch): widen the stored-body exclamation-deletion clause to the measured bracket trigger - #13088
Merged
Merged
Conversation
…to the measured bracket trigger
This was referenced Aug 29, 2026
os-zhuang
approved these changes
Aug 29, 2026
os-zhuang
marked this pull request as ready for review
August 29, 2026 06:58
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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#13071
The
写侧实测行为 · issue bodybullet in.claude/skills/pm-dispatch/references/platform-readings.mdrecorded the exclamation-mark deletion with a less-than precondition, naming the sequence as the
markup-declaration open tag. An author reading it concluded that text with no less-than in it was not
exposed.
Measured 2026-08-29 on a PR body: the less-than is not required. The trigger is an exclamation mark
immediately followed by a left bracket — the TypeScript non-null assertion before an index, an ordinary
identifier in front of it, and no less-than anywhere in the span. Two independent read channels agreed the
character is gone from the STORED body (MCP read-back, and the rendered page fetched with curl), while the
files on disk were unchanged: write-side storage loss, not a read artifact. All four occurrences lost the
character — two inside a triple-backtick fence, two in inline code spans — so neither carrier protects it.
This is a correction to an existing clause, not a new section. The bullet is rewritten in place at
net-0 lines: the widened trigger strictly subsumes the less-than-prefixed sequence the clause used to
name, and the author-side remedy (spell the operator out in words, or use a placeholder token defined once)
is added beside the existing ones.
Discipline note, since this clause is about its own hazard: the sequence is described in words
throughout — in the file and in this body — and is never written as a literal adjacency. That is also why
this PR carries no reproduction sample.
Before / after
Seven lines out, seven lines in — the whole bullet,
.claude/skills/pm-dispatch/references/platform-readings.mdlines 247-253.
Before (741 bytes over 7 lines):
After (829 bytes over 7 lines):
Bullet bytes 741 to 829 (+88); file bytes 33279 to 33367 (+88); lines 7 to 7. The line breaks are the
canonical greedy wrap produced by the ratchet's own
wrapLineexport, so every break is one the gateitself would offer — no break lands after an ASCII comma/semicolon/colon that follows a Han character.
Ratchet
.claude/.../references/platform-readings.md.claude/.../references/platform-readings.md.claude/.../references/platform-readings.mdZero-headroom in, zero-headroom out. No re-pin, and no re-wrap of any paragraph outside the edited bullet.
Cut ledger
Everything trimmed to fund the widened clause, with the home each fact survives in. All of them stay inside
the same bullet.
读作未知 HTML 标签者to未知标签形issue bodyinside the2026-08-18/20 … 四写实测provenance写侧实测行为 · issue body, which already scopes every reading in it.入围栏in入围栏照删围栏不防护and its other half is留空围栏, so the carrier is still named twice.tag 形状 tokenqualifier on⛔ 围栏不防护围栏/行内代码四处全丢.在行内代码/在围栏中亦phrasing on the two survival cases(行内)and(围栏)— the carrier qualification is preserved, not generalised.序列(markup-declaration 开标记)framing, and the「less-than + 感叹号 + 左方括号」spelling裸「less-than + 感叹号」存活感叹号不接左方括号则存活, which covers the bare less-than-plus-exclamation case and states the real boundary: what survives is an exclamation mark with no bracket after it.在存储层被删落库丢字符in the tail, alongside the on-disk-unchanged evidence that makes it a write-side loss.Gates
Derived, not recalled:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstackatcommit
db39dfc1c, change set1 path(s)— re-derived after the commit and unchanged(
committed 1, working tree 0, untracked 0). All runs below are at68cb59e0e, working tree clean,exit codes captured by redirect-then-capture (never through a pipe).
pnpm check:pm-skill-ratchet✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/platform-readings.md is 314 lines (ceiling 314; headroom 0).and✓ … : widest table row is 0 bytes (pin 0; headroom 0).;✓ check-skill-line-ratchet self-test: 111 cases pass.pnpm check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).pnpm check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 398 file(s) · 4558 bare -- token(s) · 1223 launcher-rooted run(s) · 9 separator(s) JUDGED · 5 vitest-backed script name(s) derived from 80 manifest(s)pnpm check:doc-authoring✓ doc authoring guard: 392 files clean — no bare metadata literals.and✓ doc authoring guard: 48 published skill files clean — no internal issue-id references.pnpm check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 filespnpm check:pm-governed-merges✓ check-governed-merges --self-test: 206 assertions (…)·live: the real generator declared 9 output(s) and certified this treepnpm --filter @objectstack/lint run check:doc-formula-expressions✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 425 files / 1453 TS blocks judged clean by @objectstack/formula.pnpm check:nul-bytescheck-nul-bytes: OK (scanned 7281 text file(s) -- 7281 tracked, 0 untracked-not-ignored; skipped 7 binary; no raw ASCII control bytes).node scripts/pm/check-governed-queue-guard.mjs⛔ Governed Surface Queue Guard: could not read GITHUB_EVENT_PATH (ENOENT …)— the guard reads the workflow event payload and nothing else, so it can only run inside itsgoverned-surface-guard.ymljob. Nothing was measured locally; CI runs it for real.check:doc-formula-expressionsfirst exited 1 withPREREQUISITE NOT MET — the workspace package @objectstack/formula is not built, then again with the same for@objectstack/lint. Both are"nothing was measured", not findings. Built both through the shared verify lock
(
bash scripts/pm/os-verify-lock.sh -c 'pnpm exec turbo run build --filter=… --concurrency=2',VERDICT command-exit 0) and re-ran to the exit 0 above.Changeset
None, deliberately. The diff is one file under
.claude/, a closed list that publishes nothing, soskip-changesetapplies and is requested at PR open.Governed surface
The diff touches
.claude/**, so this PR is a governed surface under Prime Directive #14: opened as adraft, no ready flip, no reviewers, no auto-merge, no merge queue. Landing is the maintainer's, by hand.
Generated by Claude Code
Generated by Claude Code