Skip to content

docs(pm): an entry-.d.ts byte-identity claim needs a positive control in the same block - #12901

Merged
os-litant merged 1 commit into
mainfrom
claude/issue-ui5914-byte-identity-control
Aug 28, 2026
Merged

docs(pm): an entry-.d.ts byte-identity claim needs a positive control in the same block#12901
os-litant merged 1 commit into
mainfrom
claude/issue-ui5914-byte-identity-control

Conversation

@os-litant

Copy link
Copy Markdown
Collaborator

Fixesobjectstack-ai/objectui#5914

Three times in one day a PR justified "this re-export widened nothing" by reporting that a
package's entry dist/index.d.ts was byte-identical across the change. Nothing in the review
discipline told a reviewer that reading apart from a calibrated one. This lands the row that
does, in the review-evidence home — .claude/skills/pm-dispatch/references/review-checklist.md.

The rule as landed

Placed directly under the existing positive-control row (测量类交付先看阳性对照), of which it
is the specialization — the kinship is structural rather than spelled out, which is also how the
house's sibling idiom reads (⛔ 零命中必须用确定存在的邻近词反查: a negative reading needs a
positive control):

- **引 entry `.d.ts` 逐字节相同,必须同块带阳性对照**:该读数只判**名字集**(增删再导
出名会移动 barrel 字节),对 barrel 已转发符号的**形状**恒无效 —— `export *` 与
`export type { X } from` 都不复述形状。判据:同块点名**声明**该符号的模块那份移动了的
产物,或本会移动它的具名探针;缺则记 INCONCLUSIVE。实测 2026-08-24(清 dist 与
tsbuildinfo 的三腿重建):声明包 `dist/base.d.ts` 随探针移动又移回,转发文件与 entry
barrel 三腿全同;同日三处误用。

The name-set-vs-shape nuance a naive rule gets wrong

The gauge is not dead in general, and a rule that simply banned the phrase would red-flag sound
prose. Both halves are stated in the row, because only the pair is actionable:

  • Informative for NAME-SET claims. Adding or removing a re-exported name moves the barrel's
    bytes. Released CHANGELOG prose already leans on exactly this, correctly.
  • Never informative for the SHAPE of a symbol the barrel already forwards. Forwarding never
    restates a shape — export * and export type { X } from '…' alike. Only the module that
    declares the symbol can move.

So the required control is a positive one: name the declaring module's emitted file whose
hash DID move, or a named probe that would have moved it. Absent that, the reading is recorded
INCONCLUSIVE rather than counted as evidence — the same disposition the parent row already gives
a measurement whose control failed.

Measured demonstration carried into the row by date (2026-08-24), three rebuild legs each from a
cleared dist/ and a cleared tsconfig.tsbuildinfo: the declaring package's dist/base.d.ts
hash moved with the probe and moved back, while the forwarding file and the entry barrel stayed
byte-identical through all three legs.

Cut ledger — net 0 lines, ceiling holds at zero headroom

The file is ratcheted at 84 lines with headroom 0, so the 6 added lines are paid by 6 cut. No
re-wrap line-buying: every cut is a consolidation whose content survives in a named home, and
each surviving home is more complete than the copy removed here.

cutlineswhat was removedsurviving home
闭合关键词两读 row compressed 5 → 2−3the parser facts (keyword list, negation-blindness, safe spellings, body-vs-commit dual source, mis-closed cards hidden from open-only filters) and the post-merge read as an actionfacts: references/platform-readings.md §闭合关键词解析(PR 正文写侧) — carries the three measured boundaries this copy never had. Action: references/landing-operations.md, whose inventory-reconciliation paragraph is what actually caught a silent mis-close. What survives here is the reviewer-of-record duty the other two do not own: the pre-ready body scan, still named as the only human gate before merge.
被取代 head 上的 run 永不重跑 row folded into the head-pinning row above it−2a separate bullet for a clause that is the same discipline — pin the reading to the current headsame file, one row up: the cancelled-on-superseded-head clause is now the tail of 每个门禁读数先钉到 PR 的当前 head, with the "burns a heavyweight cycle" half dropped and the load-bearing half (a rerun faithfully reproduces a defect the current head already fixed ⇒ a false red on a green PR) kept verbatim in substance. Expected-signature fact at references/platform-readings.md.
Part of 收口 row compressed 3 → 2−1the pointer's long form and the "下次巡检看到再说" restatementreferences/landing-operations.md, whose 确认 MERGED 的同一动作 paragraph owns the action and comment requirements the row now points to.

Line-byte budget respected: widest line in the file is 120 bytes, no line added or edited exceeds
it, and the file carries no table row (its MAX_TABLE_ROW_BYTES pin is 0), so the measured example
is compressed to the file's bullet idiom rather than tabulated. No issue numbers in the protocol
prose — provenance is carried by date.

Gates — union derived mechanically, run after the final commit

node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (repo assertion held against
this checkout's origin), derived from the change set vs merge base 96732b03a. All readings are
on 308a9af55, which is this branch's head and byte-identical to the worktree. Exit codes captured
before any pipe.

gateverdict lineexit
check:pm-skill-ratchet✓ …/review-checklist.md is 84 lines (ceiling 84; headroom 0). and ✓ …/review-checklist.md: widest table row is 0 bytes (pin 0; headroom 0).0
check:pm-skill-id-lint✓ check-skill-id-lint: 23 file(s) clean (pattern /#[0-9]{3,}/g).0
check:pm-governed-prose✓ check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces … and claim no others.0
check:skill-frame-sync✓ check-skill-frame-sync: 4 copies of the decision frame are structurally isomorphic across 3 files0
check:skill-frame-freshness✓ check-skill-frame-freshness: the decision frame in this tree is current with origin/main (fetched just now).0
check:pm-governed-merges✓ check-governed-merges --self-test: 206 assertions …0
check:doc-authoring✓ doc authoring guard: 48 published skill files clean — no internal issue-id references.0
check:agent-test-spelling✓ check-agent-test-spelling: 0 violations — 391 file(s) …0
check:required-contexts✓ check-required-contexts: 6 required context name(s) pinned across 2 workflow(s) …0
node scripts/check-required-contexts.mjssame check via its required-set-patrol.yml entry point0
pnpm --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.0

The last one first exited 1 with PREREQUISITE NOT MET — the workspace package @objectstack/formula is not built, which the gate itself declares is not a measurement ("Nothing was measured: this
gate exited before running a single check"). Built @objectstack/formula then @objectstack/lint
(pnpm exec turbo run build --filter=… --concurrency=2, both exit 0) and re-ran for the real green
above. Recorded here rather than reported as a red, per the gate's own verdict text.

check:pm-governed-prose and check:skill-frame-freshness are not in the mechanically derived
nine; they were named in the dispatch and run anyway.

Positive control on the ratchet — this PR's own claim, calibrated

The ceiling verdict above is a green on a file whose ceiling has zero headroom, so on its own it
cannot distinguish "the gate read this file and it fits" from "the gate never read this file". The
control, run from the committed state so the restore leg has a real reference:

  • Probe appended (PROBE-CONTROL-LINE-ui5914), confirmed on diskgrep -c = 1, file at 85
    lines — not inferred from an editor's exit code.
  • check-skill-line-ratchet went RED, exit 1, naming this exact file:
    ✗ … /review-checklist.md is 85 lines; the ratchet ceiling is 84.
  • Restore leg git checkout HEAD -- ABS_PATH (absolute path, HEAD named so the write does not
    come back out of a polluted index), proven by state, not by exit code: git hash-object of the
    worktree file equals the HEAD blob 78a592331c7373e998cef03640e9673c6eb5b11f (non-empty, compared),
    probe hits back to 0, git diff HEAD empty.
  • Ratchet green again, exit 0, at 84 lines.

Scope

.claude/** only — releases nothing, so skip-changeset rather than a changeset (this repo's
route; the derivation's "once a changeset exists, 8 more families apply" note is the docs-only
branch of that same instruction). No content/docs/releases/ change. No files outside the one
home.


Generated by Claude Code

… in the same block
The gauge is real for NAME-SET claims and vacuous for the SHAPE of a symbol
the barrel already forwards. New review row states both halves and requires
the control; net 0 lines, paid by three consolidations whose content survives
in platform-readings and landing-operations.
Co-Authored-By: Claude <noreply@anthropic.com>
@github-actionsgithub-actionsBot added size/s documentation Improvements or additions to documentation labels Aug 28, 2026
@os-litantos-litant added skip-changeset PR has no user-facing published change; bypasses the changeset gate and removed documentation Improvements or additions to documentation size/s labels Aug 28, 2026 — with Claude
@os-zhuang
os-zhuang marked this pull request as ready for review August 28, 2026 07:53
@os-zhuang
os-zhuang added this pull request to the merge queueAug 28, 2026
@github-merge-queue
github-merge-queueBot removed this pull request from the merge queue due to failed status checks Aug 28, 2026
@os-litant
os-litant added this pull request to the merge queueAug 28, 2026
Merged via the queue into main with commit 54c5f91Aug 28, 2026
35 checks passed
@os-litant
os-litant deleted the claude/issue-ui5914-byte-identity-control branch August 28, 2026 09:32
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

skip-changesetPR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Nothing distinguishes a calibrated entry-.d.ts byte-identity claim from a vacuous one, and three landed in one day

3 participants

@os-litant@os-zhuang@claude