docs(pm-skills): the multi-label page truncates into a false-empty lane, and the arming echo is not the landing method - #18713
Conversation
…ne, and the arming echo is not the landing method Claude-Session: https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu Co-authored-by: Claude <[email protected]>
Contract reviewServed-tier: Review of record on the PR thread (the Governed Surface Guard's merge_group leg reads this thread alone — #18701). In-seat review of PR #18713 (#18461) by the dispatching ① Derived judgments
② Semver levelNone — no package is touched; ③ Boundary flags
Implemented-by: VERDICT: PASS Generated by Claude Code |
Fixes #18461
Clause-②: noOne file:
.claude/skills/pm-dispatch/references/platform-readings.md, held at 466 / 466 (headroom 0,widest line 120 B). No ceiling raised. Net line change 0: one row rewritten in place, one row added, one
payment taken in the same file.
skip-changeset—.claude/**is shipped by no package'sfiles[], sonothing published moves.
Reserved rows are untouched and verified by content:
:10–:12and:431(#18469 PR-A's pending patch),:209(PR #18666's one-line change, awaiting the maintainer — it rides at:208after the payment, byteidentical), and the nine rows PR #18689 adopted an hour before this branch (
:28,:85,:249,:277–:278,:291,:347,:357,:393,:410— none appears in any hunk of this diff).Row ② — rewritten in place at
:50Ruling reference: the maintainer's letter A on #18421, comment 5716260764 (2026-09-17T14:41Z, 「同意」).
Its operative conclusion is the one this row carries:
auto_merge.merge_methodis not a reading of what willland — the landing shape is the merge queue's to decide.
before (120 B, the falsified form):
after (117 B):
Why 「不恒定」 and not either constant. 「恒为
merge」 is falsified by this card's four PRs; 「恒为squash」 is falsified by the same table's first row and by the ruling's own measurement. Same endpoint(
PUT .../pulls/{n}/ccr/auto_merge), same{"merge_method":"SQUASH"}payload:merge_methodmergesquashsquashsquashThe #18421 ruling measured the same endpoint answering
merge(both arming channels, MCP and CCR), and thedispatching seat's own arms today echoed
squashon PR #18689 / #18690 / #18700 andmergeon earlier ones.Four landings, two echoes, one landing shape ⇒ the echo varies and decides nothing. A row asserting either
constant would teach a seat to investigate a read-back that is simply not a signal.
Neighbours left as they are.
:49is about the barePATCHdraft bit — unrelated.:51(「仓库
allow_merge_commit:false时同样读回merge」) does not restate 「恒」: it is one conditionedmeasurement, and 「同样」 now attaches to
merge, which the rewritten row names as one of the two observedvalues.
:53–:55already carry the landing half (the branch rule decides; three carriers agreeing provesnothing) and are untouched — the row above them no longer contradicts them.
Row ① — added at
:272after (118 B):
Placement — a declared deviation from the dispatch. The dispatch named the
:247–:248neighbourhood(the MCP
list_issuesrows). The OR half of this reading is already in the file, in the 读数陷阱 cluster at:269–:274::269「labels数组是并集」,:270「⛔ 永不读作交集」,:272「失效全静默」,:273「正确读法 = 整车道单标签一次读全加本地对 labels 求交」. Writing the new row at
:247would have put a secondhome for the labels-OR fact six rows away from the first — the same duplication the dispatch forbids for row ②
(one row for one fact, never two). So the row is placed where the fact it compounds already lives: directly
between the silent-failure row
:272and the prescription:273, which it is the reason for. The factdelivered is unchanged; only the address is.
What the row adds over
:269–:274. Those rows carry the OR semantics and the prescription. They do notcarry the truncation, and the two compound: the returned page is a fraction of the set with nothing in the
response saying which fraction, so a local intersection taken over that page can return zero and read as
「本车道无活」. The measurement is inside the row:
labels=["domain:cli","pm:queue"]answeredtotalCount=231with
returned=30, while the single-label query on the same lane in the same minute answered 24 / 24 —complete, and intersectable. That is what makes
:273load-bearing rather than a style preference.The payment — one dedup,
:202+:203become one row:202+:203GET /repos/{o}/{r}/issues?state=open&labels=a,b&per_page=N。」 + 「它走 core 桶且labels是真 AND;⛔ 完整性自证靠&page=N加总数核对。」labels真 AND;拼写与自证见rest-channel.md。」 (118 B)&page=N-plus-total spelling — both held verbatim inrest-channel.md〈读侧〉, which:137already names as their single home (「逐操作通道归属、写侧配方与队列路由三读法见rest-channel.md,⛔ 不在本表复述」). The two facts the row keeps inline are the ones a seat needs before it switches channel;labelsbeing a true AND on REST is also stated in-file at:274, and the core bucket at:115/:128.Net: 3 lines changed, 466 in, 466 out.
Gate readings
node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/references/platform-readings.mdexits 3 = GOVERNED (
.claude/**×1) — recorded as the verdict it is. This PR stays draft; no seat flips itready, enqueues it or arms auto-merge. The references tier applies: the skills seat's
## Contract reviewrecord goes on this thread, and the seat lands it.
pnpm check:pm-skill-ratchet:: exit 0 — 「platform-readings.md is 466 lines (ceiling 466; headroom 0)」,「widest table row is 0 bytes (pin 0; headroom 0)」; no line over 120 B (
awk 'length > 120'returns nothing).pnpm check:skill-frame-sync:: exit 0 — 「the one declared copy of the decision frame is internallycoherent … 4 axes … 74 markdown files scanned for undeclared copies」.
pnpm lint(repo-wide,eslint . --no-inline-config) :: exit 0.grep -naPfor control characters over the file: no hits. No tag-shaped fragment in either new row.Derived gate list, with exit codes
Derived from the worktree with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no hand-fed paths; change set 1 path vs merge base
72dd95fa5), every command run, each exit code captured byredirect-then-
$?:check:doc-formula-expressionsfirst exited 3 — PREREQUISITE NOT MET (@objectstack/formulaand@objectstack/lintnot built, 「Nothing was measured」). It was re-run to a real verdict afterpnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lintthroughscripts/pm/os-verify-lock.sh(VERDICT command-exit 0, held 1s, waited 0s); only the exit 0 is recorded above.Reconciliation:
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran.txt→「18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED (a DERIVED zero — all 18 recorded an exit code
and none of them is 3)」. Outside that union: the 53 artifact-roster families, 11 wide-population families,
14 changeset-pending families and the CI-only families (
--verify-required-set,check-half-states --provenance) — CI's, not this branch's, and named here so their absence is not read as a clearance.Out of scope, reported not written
The card's third item —
scripts/pm/check-expected-skips.mjscannot run in a seat container(
ERR_MODULE_NOT_FOUND: Cannot find package 'yaml') — is not a references line and is not written here. In thisworktree, after
pnpm install,[email protected]is present; the crash is a property of the container the seat runsit from, not of the script.
Generated by Claude Code
Generated by Claude Code