Skip to content

pm-dispatch: the pre-dispatch in-flight read covers every lane's pm:dispatched claims - #19792

Merged
huangyiirene merged 1 commit into
mainfrom
claude/issue-18964-in-flight-read-across-lanes
Sep 23, 2026
Merged

huangyiirene merged 1 commit into
mainfrom
claude/issue-18964-in-flight-read-across-lanes

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #18964

维护者速读(草稿)

改了什么:.claude/skills/pm-dispatch/SKILL.md 第 266 行删掉一个词「本车道」,其余一字不动,文件行数 815 不变。改前:「- 派发前在飞检查:读本车道 pm:dispatched 卡认领评论申报的文件面,本地求交、不另发查询。」改后:「- 派发前在飞检查:读 pm:dispatched 卡认领评论申报的文件面,本地求交、不另发查询。」references/core-rules.md 没有这句话的对应行,本 PR 不动它。

为什么改:执行裁决记录 5780497628(字母 B)。席位认领前的在飞检查原来只读本车道已派发卡申报的文件面,所以另一个车道里已认领、已推分支、但还没开 PR 的同文件工作单对它不可见。#18314(spec 车道)与 #18844(skills 车道)的双重派发就是这样漏掉的,#17518 也是同一形态。改成读所有车道的已派发认领之后,申报的文件面会直接点名文件,两个实例都能命中。卡上原来提议的「按文件名词干扫描分支名」经实测证伪(两个实例 0 命中,开放 PR 上召回率 29%),裁决明确不采用(A、C 均不取)。

风险与代价(含回滚):每次认领要多读其它车道已派发卡的认领评论,仍是本地求交、不另发查询;这项读取成本裁决没有实测,如果某个车道觉得太慢,另立一张带数字的卡,⛔ 不悄悄把这个词加回来。没有代码、门禁或发布面变化。回滚 = revert 这一个提交。

席位意见:(待席位填写)

你要做的:无需操作。本 PR 属 Tier S(.claude/**),由席位出具 ## Contract review 记录、全部检查通过后经合并队列落地。

Clause-②: no

Summary

Ruling record 5780497628 on the card (letter B, complete; A and C not taken) removes the lane qualifier from the pre-dispatch in-flight read, so a seat about to claim reads every lane's pm:dispatched claim comments for their declared file surfaces, still intersected locally with no extra query. One word, one line, net 0 lines.

- - 派发前在飞检查:读本车道 `pm:dispatched` 卡认领评论申报的文件面,本地求交、不另发查询。
+ - 派发前在飞检查:读 `pm:dispatched` 卡认领评论申报的文件面,本地求交、不另发查询。
site before after
.claude/skills/pm-dispatch/SKILL.md :266 121 bytes, contains 本车道 (anchor count 1) 112 bytes, anchor gone (count 0), new sentence count 1
file length 815 lines (ceiling 819) 815 lines (ceiling 819)

Premise re-measured on base 2cf9db7c4 (the current origin/main): the sentence sat at :266 unchanged after PR #19737 landed.

Verification (head 8ead063f3, the only commit)

Family set derived with node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands (21 commands, 1 path) and reconciled with --ran: 21 derived, 21 run, 0 NOT-MEASURED, 0 UNRUN, every line carrying its captured exit. All exits captured before any pipe.

command exit verdict line (excerpt)
pnpm check:pm-skill-ratchet 0 SKILL.md is 815 lines (ceiling 819; headroom 4); widest table row is 342 bytes (pin 342; headroom 0)
pnpm check:pm-skill-id-lint 0 30 file(s) clean
pnpm check:skill-frame-sync 0 the one declared copy of the decision frame is internally coherent
pnpm check:skill-frame-freshness (named by the dispatch, outside the derivation) 0 the decision frame in this tree is current with origin/main
pnpm check:doc-authoring 0 16196 customer-facing strings clean; sibling-package prose ids hold the baseline
pnpm check:nul-bytes 0 9262 text files, no raw ASCII control bytes
pnpm check:pm-governed-prose 0 2 instruction surfaces name all 6 registered governed surfaces
pnpm check:pm-settings-deny-roster (roster under .claude, outside the derivation) 0 17 content-write tools declared = enforced
pnpm --filter @objectstack/lint run check:doc-formula-expressions 0 first run exit 3 PREREQUISITE NOT MET (formula and lint unbuilt, nothing measured); built both under the verify lock (VERDICT command-exit 0), re-run exit 0
node scripts/check-closing-keyword-parity.mjs and --self-test 0 / 0 3 parsers agree on all 9 keywords
node scripts/check-comment-mask-corpus.mjs 0 7015 files, 0 disagree
self-tests: governed-queue-guard, harness-current, pm-expected-skips, pm-governed-merges, pm-half-states 0 each 279 / 26 / 99 / 441 assertions / 4897 cases pass
pnpm check:agent-test-spelling, check:cross-package-test-inputs, check:driver-memory-census, check:gitlink-declared, check:refd-timer-probe, check:watch-hint-literal 0 each OK

No package is touched, so there is no dependency-closure build and no package test or typecheck owed. There is no core-rules twin gate (check:core-rules-* does not exist in package.json).

Changeset

skip-changeset: the only path is under .claude/**, which is in no package's files[] and publishes nothing.

Acceptance notes

  • references/core-rules.md is untouched. grep -n '本车道' there gives 1 hit, at :18, which is the round-opening mutex reading (the twin of SKILL.md :80), not this sentence. The core-rules line that summarises the cross-domain path (:68, 「跨域单 PR 由分诊席指定一个车道 PM 认领并申报完整文件面,在飞检查同域跨域皆跑。」) stays true after this change.
  • SKILL.md :267 (the cross-domain exception path adds every touched domain's in-flight cards) is now covered by :266 reading every lane. It is still true, and it stays as it is because the ruling moves nothing else.
  • The other 本车道 readings (SKILL.md :36, :80, :82, :230, :586, :587; dispatch-runbook.md :61; seat-post-protocol.md :28) are different rules (claim scope, round mutex, liveness baseline) and are outside the ruling.
  • The empty probe branch claude/issue-18964-claim-time-branch-stem-scan is neither reused nor deleted; the seat removes it.
  • Serial check at open: 16 open PRs, 308 file rows, 0 unreadable, none on SKILL.md or core-rules.md (control: 112 .changeset/ rows read). origin/main has not moved from the base.

This PR stays draft: .claude/** is Tier S, and the seat lands it after its contract-review record and a fully green run.


Generated by Claude Code

…s claims

The in-flight check before a dispatch read only the seat's own lane's
`pm:dispatched` claims, so a claimed-and-pushed sibling card in another
lane, with no PR open yet, was invisible to it. Drop the lane qualifier
from that one sentence; the local-intersection clause stays as it was.

Claude-Session: https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/xs documentation Improvements or additions to documentation labels Sep 23, 2026
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 23, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 8ead063f350d1c1ff3e22408d92370523dfbeab1

① Derived judgments

Rendered in-seat by the skills seat 1 session at the served tier the maintainer named (ruling record 5771798588; 「契约复审继续用 fable 不变」 5788482806 of this date). The contract is ruling 5780497628 on #18964 (batch #214 item 1, letter B): .claude/skills/pm-dispatch/SKILL.md :266 loses the word 「本车道」 so the claim-time in-flight read covers every lane's pm:dispatched claim surfaces; ⛔ no runbook line, ⛔ nothing else.

  • (a) The diff — measured by this seat on a review worktree at the head. One single-parent commit on 2cf9db7c4; one file, +1 / −1: :266 「- 派发前在飞检查:读本车道 pm:dispatched 卡认领评论申报的文件面,本地求交、不另发查询。」 → 「- 派发前在飞检查:读 pm:dispatched 卡认领评论申报的文件面,本地求交、不另发查询。」; the old sentence 0 hits on the head, the new one at :266; 815 / 819 lines, the widest table row untouched (the line is a bullet, not a table row).
  • (b) The twin rule. references/core-rules.md carries no copy of the sentence — its one 「本车道」 at :18 is the round-opening mutex reading, the twin of SKILL.md :80, a different rule, correctly untouched; SKILL.md :267's cross-domain exception path stays true and is now subsumed by :266 reading every lane — the dev's out-of-scope note, left as is per the ruling.
  • (c) Acceptance — the ruling's own Done-when. Letter B is complete in one word; A (a runbook line) and C (a probe) were not taken, as ruled; the empty probe branch claude/issue-18964-claim-time-branch-stem-scan is untouched, the seat's to reap.
  • (d) Gates — re-run by this seat on the review worktree at the head after pnpm install --frozen-lockfile --offline. check:pm-skill-ratchet 0 (815 / 819); check:pm-skill-id-lint 0 (30 files clean); check:skill-frame-sync 0 and check:skill-frame-freshness 0 (the four-axis block untouched); check:doc-authoring 0; check:pm-governed-prose 0; check-governed-merges.mjs --pr 19792 exit 3 — GOVERNED, Tier S (.claude/** ×1; 2 changed lines, under the human-merge threshold). The dev's derivation: 21 families by --commands, --ran 21 / 21 / 0 NOT-MEASURED (the check:doc-formula-expressions first pass exit 3 cured by the declared build, re-run 0). CI at the head at the seat's read: 26 latest-per-name check runs — 14 success, 11 skipped, 1 in progress; the landing waits for green and the expected-skips roster.

② Semver level

None — no release. .claude/** is in no package's files[]; skip-changeset written through label-write.mjs with read-back (the dev's report).

③ Boundary flags

  • Tier S (.claude/** on the register): this record PASS plus every check green ⇒ the seat readies the PR and arms auto-merge through the CCR routes; the post-merge audit is the compensating control.
  • The tier exit on the claim (5789531283): the file is MANDATORY at CONTRACT_REVIEW_TIER for semantic edits; a one-word mechanical deletion on a ruled line was built at the default tier under the --tier exit quoted on the claim and is reviewed here at tier — the maintainer's 「fable 当审计师用,不当施工队用」.
  • Report 5789694799 on the card parses; mcp_calls 0; three REST writes through the fleet-write relay (the PR create, skip-changeset, the report) plus two pushes; no body PATCH by the dev; the dev's two named deviations are spelling differences of gate names (check:pm-skill-ratchet / check:pm-skill-id-lint, both ran) and a core-rules probe that read one hit of a different sentence — both correct readings.
  • Out of scope, noted by the dev, ⛔ not touched: SKILL.md :267 (the cross-domain exception path) — still true, subsumed, no edit owed.

Implemented-by: claude/issue-18964-in-flight-read-across-lanes
Reviewed-by: session_01Wnstp2kTth7sGXfr8fXypc

VERDICT: PASS

@huangyiirene
huangyiirene marked this pull request as ready for review September 23, 2026 06:00
@huangyiirene
huangyiirene added this pull request to the merge queue Sep 23, 2026
Merged via the queue into main with commit 98d8336 Sep 23, 2026
32 checks passed
@huangyiirene
huangyiirene deleted the claude/issue-18964-in-flight-read-across-lanes branch September 23, 2026 06:24
akarma-synetal pushed a commit to akarma-synetal/framework that referenced this pull request Sep 28, 2026
…eview / landing detail relocated into per-phase references, core-rules.md retired (objectstack-ai#19805)

Fixes objectstack-ai#19716

Clause-②: no

## 维护者速读(草稿)

**改了什么**:PM 协议主文 `.claude/skills/pm-dispatch/SKILL.md` 从 815 行压到 319
行,只留原则——红线、优先级、入口与角色(含参数表)、新增的「阶段细则索引」表、全体座位的不变量、状态模型、域车道、受管面的「路径分叉」块、升级与决策(含四轴框架单源)、报告契约、机械守卫索引、模板与表。派发
/ 分诊 / 座位生命周期 / 读数纪律 / 多仓协调 / 入队与落地的细则逐字搬进六份按阶段读的
references(五份新建:`seat-lifecycle.md`、`reading-discipline.md`、`cross-repo-coordination.md`、`triage-duties.md`、`execution-duties.md`;既有的
`landing-operations.md` 吸收「入队与落地」),每份第一行写明哪个座位在哪个 fire
读它。`references/core-rules.md`(SKILL.md 的人读摘要副本,151
行)删除,所有指向它和被搬章节的指针重定向。行数棘轮把 SKILL.md 上限从 819 降到 319,新文件按落地行数入表,棘轮总量下降。

**为什么改**:决策批 objectstack-ai#213 第 4 项,维护者原话「1 2 4 同意」,项目原文「协议主文 819 → 约 300 行(红线 +
状态模型 + 入口 + 索引),派发 / 复核 / 入队细则各成一份按阶段读的 reference;同时删 core-rules.md
双份」。目的是每个座位每次 fire 只读本阶段的文件,不再整本重读 815 行外加 151 行的副本。

**风险与代价(含回滚)**:纯搬迁,无语义变化——被搬的 465 条规则行里 459 条逐字相同,5 条只改了指针拼写(指向新家),1
条自指指针删除;「⛔」行数搬前搬后相等(对合并基点 558 对 558,对派发基点 559 对 559;都不计被删副本自带的 59
行)。代价落在指针:部分 references 的指针行受 120
字节行宽与零余量约束,只写文件名不写章节名(章节标题在新文件里原样保留);两个门禁脚本各改了一处指向路径(自测通过)。SKILL.md 落在
319 行——高于「约 300」但低于 340 上限——多出的部分是 `check:pm-governed-prose` 锚定在
SKILL.md 里的受管面路径分叉块(28 行)加索引表(11 行)。回滚 = revert 本 PR(一个 squash
commit);棘轮上限已降,回滚时抬回需维护者裁决引用。

**席位意见**:(席位填写)

**你要做的**:本 PR 属 Tier S(路径全在 `.claude/**` 与 `scripts/pm/**`),由 skills
席在席内契约复审 PASS 后走队列落地,不需要你点击。若对新文件命名、或 SKILL.md 保留 319 行而非约 300 行有异议,在本
PR 评论一句即可。

## What this PR does

Relocation, not deletion — decision batch objectstack-ai#213 item 4 (maintainer,
verbatim: 「1 2 4 同意」). Every rule line of `SKILL.md` on the base
(`fae870352`, 815 lines) ends up in exactly one place: `SKILL.md` if it
is principle, otherwise one per-phase reference.
`references/core-rules.md` (the declared subset / human digest, 151
lines) is deleted. No rule added, no rule dropped, no gate / hook /
ratchet / roster added; `os-dev.md`, `AGENTS.md` and `skills/**`
untouched.

Six destination files, one commit each (the branch is bisectable by
destination):

| destination | opens with (which seat reads it on which fire) | lines |
|:--|:--|--:|
| `references/execution-duties.md` (new) | 执行席每次 fire
读本文:候选、认领、派发、收集、复核;落地窗口另读 `landing-operations.md`。 | 183 |
| `references/seat-lifecycle.md` (new) | 每个座位每次 fire
读本文:开轮互斥读数之前读〈开轮互斥〉,收班之前读其余各节。 | 96 |
| `references/triage-duties.md` (new) | 分诊席每次 fire 开局读本文;本文是分诊座位的全部职责。 |
120 |
| `references/reading-discipline.md` (new) | 任一座位在取读数、引读数或核验 main
的那一刻读本文,所有 fire、所有阶段。 | 37 |
| `references/cross-repo-coordination.md` (new) | 分诊席每次 fire
路由与查重前读本文;执行席跨仓认领、派发或转移时读本文。 | 51 |
| `references/landing-operations.md` (existing, absorbs 入队与落地) |
执行席在落地窗口(ACCEPT 之后至 MERGED)读本文;入队与落地条款与 A–D 操作细则都在此。 | 69 → 101 |

Why two files beyond the card's suggested shape: 平台读数纪律 and 多仓协调 are
read by BOTH seats (readings are taken on every fire; cross-repo routing
is triage's, cross-repo claiming/dispatch is execution's). Folding
either into one seat's phase file would make the other seat skip it — a
rule dropped in effect — and keeping both in `SKILL.md` lands it at 367
lines, over the 340 ceiling. Each gets a single-section file whose title
is the section heading, so every 〈heading〉 pointer still resolves.

## Section → destination (base line spans of `SKILL.md` at `fae870352`)

| base span | section | destination |
|:--|:--|:--|
| 1–76 | frontmatter, intro, 红线, 优先级 (42–44 rewritten, see pointers),
入口与角色 | stays (SKILL.md) |
| 77–92 | 入口与角色 · the 开轮互斥 bullets | `seat-lifecycle.md` 〈开轮互斥〉 |
| 94–158 | 全体座位的不变量, 状态模型 (table + bullets) | stays |
| 159–194 | 平台读数纪律 | `reading-discipline.md` |
| 195–244 | 多仓协调 | `cross-repo-coordination.md` |
| 245–271 | 域车道 (table + bullets) | stays |
| 272–296 | 座位贴协议 | `seat-lifecycle.md` 〈座位贴协议〉 |
| 297–312 | Epic 子树车道 | `seat-lifecycle.md` 〈Epic 子树车道〉 |
| 313–431 | 分诊座位职责 | `triage-duties.md` |
| 432–435 | 执行座位职责 heading + intro bullet | `execution-duties.md` |
| 436–481 / 482–511 / 512–573 / 574–597 | 候选与批次 / 认领 / 派发 / 收集 |
`execution-duties.md` 〈候选与批次〉〈认领〉〈派发〉〈收集〉 |
| 598–612 | 复核 (the verdict rules) | `execution-duties.md` 〈复核〉 |
| 613–641 | 复核 · **ACCEPT 之后的路径分叉** … 本段只适用本循环派发的 dev PR | stays, under
the new heading `## 路径分叉` — `check:pm-governed-prose` anchors its
SKILL.md region on exactly these two lines, and
`check-expected-skips.mjs`'s self-test pins the 入队资格 line at 637 |
| 642–674 | 入队与落地 | `landing-operations.md` 〈入队与落地〉 (644, a self-pointer
to that very file, dropped) |
| 675–690 / 691–698 / 699–707 | 轮次报告与节奏 / 停止条件与待命 / 断粮与跨墙恢复 |
`seat-lifecycle.md` (收班) |
| 708–815 | 升级与决策 (frame block 737–757 byte-identical, md5
`abff5f852c8fd09b79ec0623439aa4f0`), 报告契约, 机械守卫索引, 模板与表 | stays |

New in `SKILL.md`: `## 阶段细则索引` (a 6-row table: file · which seat reads
it on which fire · sections it carries), one pointer line in 入口与角色 to
〈开轮互斥〉, and the `## 路径分叉` heading. SKILL.md: 815 → 319 lines (≈ 300
target, ≤ 340 ceiling; the excess over 300 is the retained 28-line
governed-prose block plus the 11-line index).

## Proof: relocation, not deletion

Measured by an independent verifier over the working tree against `git
show de4ed33:…` (the merge base; script in the report):

- Moved content lines (non-blank, non-heading, in the spans above):
**465** — **459 verbatim**, **5 rewritten** (pointer retargets inside
moved text, listed below), **1 dropped** (644, the self-pointer), **0
missing**.
- Retained `SKILL.md` lines: **302 / 302** present in their original
order (the three rewritten and the one dropped 优先级 line excepted, listed
below).
- 「⛔」 lines, against the PR's merge base `de4ed33fd`: before **617**
(`SKILL.md` 194 + `references/**` 423, of which `core-rules.md` 59) —
after **558** (`SKILL.md` 68 + `references/**` 490). Excluding the
deleted duplicate's own 59 lines: **558 == 558**. (Against the dispatch
base `fae870352` the same proof reads 618 → 559, the one-line difference
being objectstack-ai#19795's edit to `seat-post-protocol.md`, merged in.)
- Decision frame block: byte-identical, only its line position changed
(`check:skill-frame-sync` and `-freshness` green).

## Pointer retargets (every one in place, same line count, ≤ 120 bytes)

Inside moved text (the 5 rewrites): 89
「三章程(本文、core-rules、本席章程)」→「SKILL.md、阶段 references、本席章程」(the touch-check
set follows where the rules now live; core-rules gone); 183 「(见认领节)」→「(见
execution-duties.md 认领)」; 491 「照抄 模板与表 节」→「照抄 SKILL.md 模板」; 612 「见 升级与决策
节」→「见 SKILL.md 〈升级与决策〉」; 694 「按收集节②」→「按 `execution-duties.md` 收集节②」.

In `SKILL.md`: 42 drops the 「核心条款」 tier from the priority chain (the
file it named is deleted; no new tier introduced); 43 now points at
`references/**` and 〈阶段细则索引〉 instead of `core-rules.md`; 44
「一条规则在本文与核心条款一处改动,另一处同 PR 同改」 dropped — its whole object is the deleted
duplicate; 56 「见 Epic 子树车道 节」→ `references/seat-lifecycle.md` 〈Epic
子树车道〉.

In references (line 3 unless noted): `review-checklist.md` →
`execution-duties.md` 〈复核〉; `compile-surfaces.md` →
`execution-duties.md`; `true-green.md`, `lanes/devx.md`:19,
`lanes/skills.md`:10 → SKILL.md 〈路径分叉〉;
`lanes/{cli,devx,engine,services,skills,spec}.md` → `seat-lifecycle.md`;
`seat-post-protocol.md` → `seat-lifecycle.md` 〈座位贴协议〉;
`lanes/triage.md`:2 → `triage-duties.md`; `instrument-discipline.md`,
`platform-readings.md` → `reading-discipline.md`; `filing-gate.md` →
`triage-duties.md` 与 `reading-discipline.md`; `lanes/hotcrm.md`,
`lanes/ui.md`:3/13/19/21 → `cross-repo-coordination.md`;
`contract-review.md`:3 → `landing-operations.md` 〈入队与落地〉 (lines 13 / 19
byte-identical, objectstack-ai#19061 step ④'s); `external-contributions.md` →
`landing-operations.md`. Where the retargeted line sits at the 120-byte
cap in a headroom-0 file, it cites the file without the 〈heading〉; the
heading itself is unchanged inside the destination.

In scripts: `scripts/pm/dispatch-gates.mjs` 25403 / 26508 — the two
self-test specimens that named `references/core-rules.md` now name
`references/state-machine.md` (an internal references file that exists;
the assertion, "carries no mandate", is unchanged);
`scripts/pm/check-half-states.mjs` 15523 (H65 prescription) plus its two
docblock lines 15104 / 15171 — `SKILL.md 〈分诊座位职责〉` →
`references/triage-duties.md 〈分诊座位职责〉`.

## Ceiling map (`scripts/pm/check-skill-line-ratchet.mjs`), before →
after

| entry | before | after |
|:--|--:|--:|
| `SKILL.md` | 819 | 319 (降恒合法) |
| `references/landing-operations.md` | 69 | 101 — declared CROSS-FILE
MOVE, source `SKILL.md` 819 → 319: +32 against −500, authorised by
objectstack-ai#14685 item 5 (comment 5520452691) |
| `references/core-rules.md` | 151 | row and table-row pin removed with
the file |
| `references/seat-lifecycle.md` · `reading-discipline.md` ·
`cross-repo-coordination.md` · `triage-duties.md` ·
`execution-duties.md` | — | 96 · 37 · 51 · 120 · 183 (new rows at landed
count; table-row pins 0, they carry no table) |
| map total | | down 132 lines (−500 −151 +32 +487); the gate reports
the declared moves' total down 477 |

## Gates (exits captured before any pipe)

All families below ran on `8df1e7e52`; after merging `origin/main`
(`de4ed33fd`, three commits: objectstack-ai#19792, objectstack-ai#19795 and a spec changeset, none
touching `scripts/pm/**`) the ratchet family, `check:pm-skill-id-lint`,
`check:skill-frame-sync`, `check:skill-frame-freshness`,
`check:pm-governed-prose` and `check:nul-bytes` were re-run on the
merged head `f20de6220`, all exit 0, and `--ran` re-reconciled there
(derived list unchanged).

The five the card names: `check:pm-skill-ratchet` exit 0 (`SKILL.md is
319 lines (ceiling 319; headroom 0)`; `declared cross-file moves: 2,
total ceilings down 477 lines`; self-test 157 cases) ·
`check:pm-skill-id-lint` exit 0 (34 files clean) ·
`check:skill-frame-sync` exit 0 (one declared copy, coherent) ·
`check:skill-frame-freshness` exit 0 (current with origin/main) ·
`check:pm-governed-prose` exit 0 (2 instruction surfaces name all 6
governed surfaces).

Derived by `node scripts/pm/dispatch-gates.mjs --repo
objectstack-ai/objectstack --commands` (50 families from the merge-base
change set, 29 paths) and reconciled with `--ran`: `Run reconciliation —
50 derived, 50 run, 0 NOT-MEASURED, 0 UNRUN`, every family recorded with
its exit code (`dispatch-gates --ran` exit 0; the one extra,
`check:skill-frame-freshness`, is outside the derivation). Among them
`check:pm-half-states` exit 0 (4897 cases; the H65 battery reads the
retargeted prescription), `check:pm-governed-merges` exit 0,
`check:pm-expected-skips` exit 0 (its SKILL.md enqueue-bar pin still
holds — the line stayed), `check-governed-queue-guard.mjs --self-test`
exit 0, `check-harness-current.mjs --self-test` exit 0,
`check:doc-authoring` exit 0, `check:nul-bytes` exit 0,
`check:commit-card-trailers` exit 0. `check:pm-dispatch-gates` exit 0 —
`✓ dispatch-gates self-test: 1905 cases pass` (`the battery took 713.0s
on this box`; run detached as its header prescribes, exit captured to a
file). `check:doc-formula-expressions` (derived only because
`dispatch-gates.mjs` is edited) exit 0 after its prerequisite `turbo run
build --filter=@objectstack/formula --filter=@objectstack/lint` under
the verify lock (`VERDICT command-exit 0`): 22 record-scoped examples
across 456 files clean.

Changed lines: 623 additions + 710 deletions = 1,333 (under the 5,000
human-merge threshold). `check-governed-merges.mjs --branch
claude/issue-19716-skill-md-principle-only` (offline, merge-base): exit
3 GOVERNED — Tier S(席内达档复核落地), `.claude/** ×26`, `scripts/pm/*` not on
the register, size 1,333 ≤ 5,000; the `--pr` reading (head repo) is in
the report.

## Readings on the base that differ from the card

- `references/lanes/director.md` and `scripts/pm/git-history.mjs` carry
no `core-rules` reference on `fae870352` (`git grep -c core-rules` → 0
for both). The 「三章程 touch list」 the card attributes to `git-history.mjs`
is SKILL.md line 89 (the tool is `git-history.mjs touch`); it is
rewritten as listed above.
- The 「本车道」 sentence (base line 266) stays in 域车道 and was left
untouched; PR objectstack-ai#19792 landed on `origin/main` while this branch was in
flight and the merge brought the ruled wording in cleanly (now SKILL.md
line 175). Nothing of another card's is pre-applied here.

## Acceptance notes

- Two gate docblocks — `scripts/pm/check-clause2-carriers.mjs` 3940–3941
and `scripts/pm/check-governed-queue-guard.mjs` 272–273 — attribute 「记录
= 同形评论落 PR 或卡」 to `SKILL.md 〈入队与落地〉`; the phrase is nowhere in
`SKILL.md` on the base (pre-existing staleness). Left untouched:
retargeting the pointer would keep a false claim. 承接者: skills seat (a
one-line docblock correction when either file is next edited).
- `scripts/pm/check-clause2-carriers.mjs` prose that says "SKILL.md's
handover sentence" (its `CLAIM_HANDOVER_SENTENCE_LINES` twin now lives
in `execution-duties.md` 〈认领〉, byte-identical) — file-name-only prose,
no heading pointer; left. 承接者: same.
- `check:doc-formula-expressions` is derived for this change set only
through `dispatch-gates.mjs` being edited; it needs
`@objectstack/formula` and `@objectstack/lint` built first (exit 3 =
prerequisite, not a finding, until built).

## Changeset

`skip-changeset`: every changed path is under `.claude/**` or
`scripts/pm/**`, which are in no package's `files[]` — nothing published
moves.

---
_Generated by [Claude
Code](https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc)_

---------

Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/xs skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants