Skip to content

fix(pm): one reading of the 席位核对 record for fleet-roster and H69 - #26635

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-r9abpq
Oct 27, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/project-thread-r9abpq

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Steve · project thread
Fixes #26335
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:车队总表(fleet-roster)判断 PR 是否带落地结论时,和 H69 巡查判断有没有席位记录时,现在读同一条 ## 席位核对 规则;标题行内写 — ACCEPT 的记录也算 ACCEPT。
  • 为什么改:席位实际发的记录是 ## 席位核对 — ACCEPT · …,H69 认得,总表却认不得,导致总表把已 ACCEPT 的 PR 报成"无结论"。
  • 风险与回滚:只动 PM 工具脚本、不发布任何包;总表与 H69 都是只报告不拦截。回滚 = revert 本 PR。
  • 先看:scripts/pm/seat-record.mjs(新的共享规则),scripts/pm/fleet-roster.mjs 的 hasLandingVerdict,scripts/pm/check-half-states.mjs 的 SEAT_RECORD_MARKER 导入处。
  • 两分钟验证:node scripts/pm/fleet-roster.mjs --self-test && node scripts/pm/check-half-states.mjs --self-test,预期两行 ✓(78 例 / 5034 例全过)。
  • 需要你做的:无,席位落地。

What changes

  • New scripts/pm/seat-record.mjs, no imports and no I/O: SEAT_RECORD_MARKER (moved verbatim from check-half-states.mjs), SEAT_RECORD_VERDICTS (ACCEPT, REWORK, REJECT), seatRecordOf(body) and seatRecordAccepts(body). The verdict is read inline on the heading line first (## 席位核对 — ACCEPT · …), else from the first line below the heading that opens with a verdict word (**ACCEPT** · …). Only ACCEPT lands a pull.
  • fleet-roster.mjs hasLandingVerdict: the 席位核对 arm is now seatRecordAccepts(body). The ## Contract review PASS arm is unchanged.
  • check-half-states.mjs: SEAT_RECORD_MARKER is imported from the shared module and re-exported under its old name. H69's reading is byte-identical: the same regex object source, still read through latestMarkedComment.
  • The module is a sibling of its two readers, not under scripts/pm/lib/. A multi-segment import specifier counts as a dispatch-gates watch hint, and gate files that import one lose the hint (measured on an earlier card). The card's hypothesis allowed either place.

Behaviour changes in the roster read, all intended:

  1. The inline — ACCEPT heading counts (the defect).
  2. A blockquoted record (> ## 席位核对) counts, as H69 already read it.
  3. The verdict must sit on the heading or below it. A line-initial ACCEPT above the heading no longer counts, and an inline REWORK is never overridden by a later ACCEPT line.

Tests

  • fleet-roster.mjs --self-test: 5 new cases (inline ACCEPT, inline REWORK, blockquoted record, ACCEPT above the heading, and the three measured bodies read through the imported marker). 73 → 78 cases, 8 batteries.
  • check-half-states.mjs --self-test: 4 new cases in the H69 battery (the marker reads the inline heading; H69 is clean on an inline record newer than the head; the three measured bodies read record/ACCEPT as true/true, true/true, false/false; inline REWORK and REJECT below are records that never accept). H69 66 → 70 cases (floor 40), 5030 → 5034 total.
  • No forced test edits: every existing case passes unchanged.

Acceptance notes

  • The card asks that "the two recognisers answer the same on the three measured bodies". They ask different questions: H69 asks whether a record is there, and the roster asks whether the pull may land. So the shared question, the seat record and its ACCEPT, is pinned in both self-tests. On the ## Contract review PASS body both read "no seat record". The roster still answers true there through its separate Contract review arm, which is correct.
  • H69 reads the marker through markerMatches, which also undecorates bold or backtick-wrapped lines. The roster tests the raw body. A decorated heading such as **## 席位核对** would still read differently. No live record has that shape. It is noted here and not widened, because markerMatches lives inside check-half-states.mjs.
  • No pm-dispatch skill text changed: .claude/skills/pm-dispatch/SKILL.md is held by another card, so this PR is not on a governed surface. Whether the skill needs a sentence stating the heading spelling is listed in the report's open questions.

Verification

All readings on head f9a39c24 (the last commit), local.

Self-tests and reverse verification
  • node scripts/pm/fleet-roster.mjs --self-test: ✓ fleet-roster self-test: 78 cases in 8 batteries pass. (main 7c34e5dc: 73 cases)
  • node scripts/pm/check-half-states.mjs --self-test: ✓ check-half-states self-test: 5034 cases pass., H69 battery 70/40 (main: 5030, 66/40)
  • Reverse verification, after the fix was committed: with the old bare-heading regex put back in hasLandingVerdict on disk, the roster self-test exits 1 with 4 failures (inline ACCEPT, blockquoted record, ACCEPT above the heading, the three measured bodies). Restored with git checkout HEAD --; git diff HEAD is empty, and the self-test is green again.
dispatch-gates: 47 derived, 47 run, all exit 0

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 47 commands for the three paths. Every one exited 0, captured before any pipe. --ran with COMMAND :: exit CODE lines: Run reconciliation — 47 derived, 47 run, 0 NOT-MEASURED, 0 UNRUN. and 47 of 47 recorded an exit code and none of them is 3. Among them: pnpm check:pm-dispatch-gates, pnpm check:pm-half-states, pnpm check:self-test-wired, pnpm check:watch-hint-literal, pnpm check:scripts-symbol-anchors, pnpm check:nul-bytes. Families outside the derived total are CI's.


Generated by Claude Code

fleet-roster's hasLandingVerdict required a bare `## 席位核对` heading, so
the seat's live inline records (`## 席位核对 — ACCEPT · …`) read as no
verdict while check-half-states' H69 marker read them as records. Both now
import the heading marker and the verdict reading from scripts/pm/seat-record.mjs:
the inline verdict on the heading line, else the first line below it that
opens with a verdict word; only ACCEPT lands. Self-test cases for the inline
form in both scripts.

Claude-Session: https://claude.ai/code/session_01ADHkmPquMegy4jNfKiBsAf
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 27, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT · domain:skills#1 · session_01ADHkmSrRBdu9MdC6fc33Uu · head f9a39c24 · 2026-10-27T11:21Z

  1. 形态 — scripts/pm only (3 files, +105/−3); check-governed-merges --pr 26635: NOT governed, ordinary queue landing. One new sibling module scripts/pm/seat-record.mjs holds the heading marker (moved verbatim) and the verdict reading; fleet-roster and check-half-states import it, H69's export name is kept by re-export.
  2. 前提实测 — seat read the diff: the inline ## 席位核对 — ACCEPT · … heading now reads as a verdict in both readers; inline REWORK, a REJECT below and an ACCEPT line above the heading do not. Local on this head: fleet-roster --self-test 78 pass, check-half-states --self-test 5034 pass (H69 70/40).
  3. 门禁 check-runs — head f9a39c24: 31 success, 17 skipped, 0 failing.
  4. 接受的偏差 — a third file beyond the claim's surface (the delta's hypothesis allowed it: neither reader imports the other); sibling rather than lib/ (watch-hint trap, stated in its header).
  5. 范围外去向 — open question (A) no skill sentence needed: agreed, the template already names the bare heading and both spellings now read alike; (B) H69's bold-heading undecoration stays local: agreed. Skills-docs: none (no metadata surface).
  6. 落地条款 — not governed: ready + auto-merge through the queue by this seat.

Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 27, 2026 11:22
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 27, 2026 11:22
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 27, 2026
Merged via the queue into main with commit 498e8f4 Oct 27, 2026
49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-r9abpq branch October 27, 2026 11:36
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/m skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants