Skip to content

docs(pm): landing-operations names the two landing tiers and lanes/ui.md's spec pointer states the landed rule (#18037) - #18111

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-18037-references-pre-ruling-residue
Sep 14, 2026
Merged

os-project-manager merged 2 commits into
mainfrom
claude/issue-18037-references-pre-ruling-residue

Conversation

@claude

@claude claude Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor

Fixes #18037

Two references/ lines still carried pre-ruling wording after the charter chain landed. landing-operations.md — the file a seat reads at exactly the moment it decides whether to flip ready — sent every governed hit to the human-merge lane, and lanes/ui.md :22 restated the rule its SKILL.md target had retired. Both lines now state the landed rules. Two files, equal line counts, no ceiling moved.

What changed

.claude/skills/pm-dispatch/references/landing-operations.md :27–:29 — the pre-ready / pre-arm path fork now names the two landed landing tiers:

  • facts tier — a PR whose governed paths all lie under this skill's references/: the in-seat contract-tier review record carries it through 落地前检三条, then ready and the queue (contract-review.md; the guard side of the same tier is the queue guard's references tier, already landed).
  • rules layer — everything else: the 四件套, draft until a human merge or an authorized APPROVED review, after which the claiming seat lands it (ruling C).
  • ⛔ Neither tier is ever approved by a seat, and the kept half 「清标即落地同受此闸,漏判会被队列守卫在 merge group 里拒收」 survives verbatim.

.claude/skills/pm-dispatch/references/lanes/ui.md :22 — the pointer now states the rule its target actually carries (新 packages/spec 工作恒归 domain:spec 席,已派发卡 ⛔ 不因此转席), still pointing at SKILL.md 〈多仓协调〉. Line :25 is untouched.

The rules the rewrites agree with (verbatim on origin/main 66aa2d98d, untranslated)

  • ruling A, SKILL.md :230 — 「新 packages/spec 工作恒由 domain:spec 席收口,不论谁需要它;已派发卡 ⛔ 不因触 spec 转席。」
  • the tiering, SKILL.md 〈复核〉 :625–:626 — 「受管面两层:事实层仅本技能 references/,其余为规则层(含发布 skills/** 与 SKILL.md)。」 / 「规则层四件套等人合;事实层 PR(受管路径全在该目录)经席内达档复核后 ready → 入队。」
  • contract-review.md :47 — 「规则层等维护者的字;受管路径全在 .claude/skills/pm-dispatch/references/ 者达档过本三条入队。」
  • ruling C, lanes/ui.md :25 (landed, untouched here) — 「⇒ 命中即停 draft;⛔ 未获授权批准不 ready 不入队不自合、永不批准,获批后认领席落地。」

Premise readings P1–P4

Taken in worktree objectstack-issue-18037 on the branch base 66aa2d98d, before any edit, at 2026-09-14T03:05:55Z:

  • P1git grep -n '人工合并道' -- .claude/skills/pm-dispatch/references/landing-operations.mdexit 0, hit at :27; its neighbour :28 read 「⛔ 不翻 ready、不入队;清标即落地同受此闸,漏判会被队列守卫在 merge group 里拒收。」 ✅ premise holds.
  • P2git grep -n '凡触' -- .claude/skills/pm-dispatch/references/lanes/ui.mdexit 0, hit at :22; the SKILL.md line it points at (:230) states the retiring rule. ✅ premise holds.
  • P3 (control) — git grep -n 'mergeable_state' -- .claude/skills/pm-dispatch/references/landing-operations.mdexit 0, 2 hits (:29, :31). ✅ premise holds.
  • P4node scripts/pm/check-skill-line-ratchet.mjsexit 0, the two rows verbatim:
    • ✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/landing-operations.md is 69 lines (ceiling 69; headroom 0).
    • ✓ check-skill-line-ratchet: .claude/skills/pm-dispatch/references/lanes/ui.md is 38 lines (ceiling 38; headroom 0).
    • ⚠️ The card's 80/80 for landing-operations.md is stale — the ceiling ratcheted down to 69 before this card was dispatched. 69/69 and 38/38 are what bind, and both files come out of this PR at exactly those numbers.

The executable criterion, before and after

Measured at 2026-09-14T03:16:09Z (after the edit, same worktree), exit codes captured before any pipe:

grep before after required
人工合并道 in landing-operations.md exit 0 (:27) exit 1 exit 1 ✅
凡触 in lanes/ui.md exit 0 (:22) exit 1 exit 1 ✅
control mergeable_state in landing-operations.md exit 0, 2 hits (:29, :31) exit 0, 2 hits (:30, :32) must still hit ✅

Repo-wide, git grep '人工合并道\|凡触' -- .claude/ now exits 1: no residue elsewhere on the surface.

Density payment, and why no ceiling moved

The fork needs three lines where two stood (one tier per line, plus the kept 清标 half). ⛔ The ceiling was not raised and ⛔ no rule was deleted — the line is paid for inside the same file by merging the two lines that both said the same thing, that stripping labels happens in the same action as confirming MERGED:

  • old :34 「确认 MERGED 的同一动作里给 Part of 卡收口,Fixes 卡代关但标也须摘。」
  • old :37 「摘标与 MERGED 确认是一个动作,⛔ 不拆到下轮巡检。」
  • now one line — 「确认 MERGED 同一动作里给 Part of 卡收口、Fixes 卡代关但标也须摘,⛔ 不拆到下轮巡检。」

Every clause of both lines survives: the Part of close-out, the Fixes auto-close with its label still owed, the same-action requirement, and ⛔ 不拆到下轮巡检.

Per-line budget. The ratchet's second rule is MAX_LINE_BYTES = 120. Every line written here was measured with the gate's own classifyLine before it was written to disk — 117 / 112 / 111 bytes (the three new landing-operations.md lines), 118 bytes (the merged line), 120 bytes (lanes/ui.md :22) — each classified null, i.e. compliant.

Gates

Follow-up commit 460b36b33 — 等人合 → 等人批

The PM seat's pre-read of head 7900d80b caught a wording defect in the new rules-layer line: 「四件套留 draft 等人合」 restated the human-MERGE lane this card exists to remove. Under ruling C the rules layer waits for a human APPROVAL and the claiming seat merges — the shape lanes/ui.md :25 already carries — so the line now reads 「四件套留 draft 等人批,⛔ 不翻正式不入队;获授权批准后认领席落地。」 Byte-neutral (112 bytes, classifyLine returns null), equal line count, no ceiling moved, pushed as a second commit rather than an amend. ⚠️ Worth a seat's eye: SKILL.md :626 — the landed tiering line itself — still spells the same endgame 「规则层四件套等人合」, and AGENTS.md Prime Directive #14 keeps 人工直合 as one of the two endings. This PR aligns the runbook line with lanes/ui.md :25 and ⛔ does not touch either of those; the wording difference across the surface is noted, not filed.

Derived, not recalled: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack with no paths passed, so the change set comes from the merge base (2 paths, working tree). All 15 derived families re-run after the final commit, at 460b36b33 (and identically at 7900d80bd before the follow-up):

node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:pm-skill-ratchet :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm check:pm-governed-prose :: exit 0   (dispatch-named; the derivation scores it an artifact roster, i.e. silent, not clear)

The ratchet at 460b36b33 still reads landing-operations.md is 69 lines (ceiling 69; headroom 0) and lanes/ui.md is 38 lines (ceiling 38; headroom 0), and the criterion still passes on that head (人工合并道 exit 1, 凡触 exit 1, control mergeable_state exit 0 with 2 hits).

Reconciliation, from node scripts/pm/dispatch-gates.mjs --ran … --repo objectstack-ai/objectstack:

Run reconciliation — 15 derived, 15 run, 0 NOT-MEASURED, 0 UNRUN.
✓ dispatch-gates --ran: 15 derived famil(ies) accounted for — 15 run, 0 NOT-MEASURED (a DERIVED zero — all 15 recorded an exit code and none of them is 3).

One gate needed a prerequisite: check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET — @objectstack/formula and @objectstack/lint not built), which is not a finding. Built through the shared verify lock (OS_VERIFY_LOCK_SLOT=dev-18037, VERDICT command-exit 0 · held the lock 1s · waited 0s) and re-run to exit 0.

Beyond the gates: control-character self-scan over both files (grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]') exits 1 — clean.

Repo-wide scans (pnpm lint and the rest of the lint farm) are CI's run, not this PR's local owing.

Changeset

None owed; skip-changeset is the declaration. The Check Changeset job (.github/workflows/pr-automation.yml, job changeset-check) has no path exemption — it reads the PR's label list (the frozen payload as a fast path, then two live re-reads) and exempts exactly two things: the skip-changeset label and the changeset-release/main release PR authored by github-actions[bot]. Nothing published moves here: .claude/** lives outside every package, and no manifest's files[] names it (0 of 82 manifests).

Acceptance notes

Out-of-scope observations, noted and ⛔ not filed (no card, no label):

维护者速读(草稿)

改了什么 — 两行落地指引的措辞。落地跑册 landing-operations.md 原来说「受管面一命中就整个 PR 走人工合并道、⛔ 不翻 ready 不入队」;现在按已落地的两层分档说话:受管路径全在 pm-dispatch 自己的 references/ 目录里的,经席内达档复核走队列落地;其余(SKILL.md、AGENTS.md、agents、hooks、ADR、发布 skills 等)照旧留 draft 等维护者的字或授权批准。lanes/ui.md 的 spec 指针原来说「凡触 packages/spec 一律转席」,而它指向的那条规则早已改成「新 spec 工作归 spec 席;已派发卡不因触 spec 转席」,现在指针与目标一致。

为什么改 — 旧措辞在被读到的那一刻就是错的指令,而且失败方向是静默的:席位会把一个本可落地的 PR 停在 draft 上,等一个裁决已经取消了的维护者点击,没有任何东西会报错。指针那条更尖:读者信了指针而不去跟进目标,拿到的是已退休的规则,却带着现行规则的权威。

风险与代价(含回滚) — 只动两个文件里的散文,无代码、无产物、无发布物;两文件行数不变(69/38),棘轮上限未动。风险是措辞被读窄或读宽:facts 层的判据必须是「受管路径全部在该目录」,本 PR 按此原文写。回滚 = 还原这一个 commit,没有任何迁移或数据面。

席位意见 — (留空,待席位定稿)

你要做的 — 一个动作:确认两层分档的措辞与您在 SKILL.md 〈复核〉 与 contract-review.md 上已落地的裁决一致;若一致,本 PR 属事实层,按已落地规则经席内复核走队列,无需您合并。

Clause-②: no


Generated by Claude Code

….md's spec pointer states the landed rule

The landing runbook sent every governed hit to the human-merge lane, and
lanes/ui.md's pointer restated the rule its SKILL.md target had retired — a
reader who trusts the pointer gets the retired rule with the authority of the
current one.

landing-operations.md now forks by path face: a PR whose governed paths all lie
under this skill's references/ is the facts tier and enqueues on the in-seat
contract-tier record after the three pre-landing checks; everything else is the
rules layer, which stays draft with the four-piece until an authorized approval,
after which the claiming seat lands it. Neither tier is ever approved by a seat,
and the clause about the strip-and-land path sharing this gate is kept.

lanes/ui.md states that new packages/spec work is always the domain:spec seat's
to close out and that a dispatched card is not re-seated for touching spec.

Both files stay at their ratchet ceilings (69 and 38 lines); the extra tier line
is paid by merging two duplicate "same action as confirming MERGED" lines, every
clause surviving.

Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8
Co-authored-by: Claude <noreply@anthropic.com>
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 14, 2026
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Sep 14, 2026
Under ruling C the rules-layer endgame that this runbook line names is an
authorized APPROVED review, after which the claiming seat lands it — the
same shape lanes/ui.md :25 already carries. "等人合" restated the
human-merge lane this card exists to remove, so the line now reads 等人批.

Byte-neutral (112 bytes, the ratchet's classifyLine returns null), equal line
count (69/69), no ceiling moved.

Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8
Co-authored-by: Claude <noreply@anthropic.com>
@claude

claude Bot commented Sep 14, 2026

Copy link
Copy Markdown
Contributor Author
  • Served-tier: 1863/1863 CONTRACT_REVIEW_TIER — harness model stamp counted over this seat's own transcript (non-sidechain assistant messages a model served; <synthetic> harness notices excluded) at 2026-09-14T03:34Z and compared to the constant's value outside the repository; get_session external_metadata.last_served_model read equal to the constant at 2026-09-14T00:20Z.

Contract review

Head: 460b36b3 (PR #18111, card #18037) — reviewed at 2026-09-14T03:34Z by the skills seat at the contract-review tier. Governed references tier (landing-operations.md + lanes/ui.md only) ⇒ this in-seat record lands it on the merge-group leg (PR #18036's tier): ready + auto-merge by this seat.

① derived judgments (seat-measured on the fetched head, ⛔ not taken from the report):

  1. The executable criterion passes on the head: git grep 人工合并道 in landing-operations.md → 0 (exit 1); git grep 凡触 in lanes/ui.md → 0 (exit 1); the control mergeable_state still hits twice; git grep 等人合 over the two files → 0 after the seat's mid-task catch (the first head said 等人合 — a human MERGE — on the rules-layer line; the second commit 460b36b3 says 等人批, byte-neutral, no amend).
  2. The runbook now forks by path face: 「受管路径全在本技能 references/ 者事实层:席内达档复核过落地前检三条即转正式入队」 / 「其余为规则层:四件套留 draft 等人批,⛔ 不翻正式不入队;获授权批准后认领席落地」 / 「⛔ 两层不由席位批准;清标即落地同受此闸,漏判会被队列守卫在 merge group 里拒收」 — the landed tiering (SKILL.md 〈复核〉, contract-review.md 落地前检③, enforced by PR feat(pm): teach the merge-queue guard the governed surface references tier #18036) and ruling C, with the queue-guard half kept verbatim; paid by merging the two lines that both said 摘标与 MERGED 确认是一个动作 (every clause survives in the merged line).
  3. The spec pointer states the landed rule: 「新 packages/spec 工作恒归 domain:spec 席,已派发卡 ⛔ 不因此转席,见 SKILL.md 〈多仓协调〉」 — ruling A's shape, still pointing at SKILL.md; :25 untouched.
  4. Ceilings: 69/69 and 38/38 (the card's 80/80 was stale; the ratchet's 69 binds), check-skill-line-ratchet exit 0 on the head (archive with the governed tree present); every written line under the 120-byte budget (117 / 112 / 111 / 118 / 120).
  5. Gates: 15 derived / 15 run / 0 NOT-MEASURED / 0 UNRUN + check:pm-governed-prose exit 0, re-run on the final head; one exit-3 prerequisite built under the verify lock and re-run to 0. Checks on the head at 2026-09-14T03:33Z: 39 — 19 green, 15 skipped, 5 running, 0 red (the earlier 「TypeScript Type Check」 failure on 7900d80b was the aggregate of a run cancelled by this second push — its source-gates lane was green; not a finding).
  6. Scope held: two files; Clause-②: no holds — no contract path; --pair 18111 on origin/main's reader → exit 0 at 2026-09-14T03:33Z before this record; skip-changeset is the declaration.

② semver: unchanged — nothing published.

③ boundary flags: the same 等人合 / 人工直合 shape survives on the RULES layer — SKILL.md :615 and :626 (「规则层四件套等人合」, the landed tiering line itself) and AGENTS.md Prime Directive 14 — plus the dead issue_write rule at SKILL.md :378 and checklist-test/SKILL.md :123: bundled by this seat as #18119 (one governed PR, fable, four-piece), ⛔ not widened into this PR. contract-review.md :45 vs :47 is prose density (consistent in order), noted for the next PR on that block.

Implemented-by: claude/issue-18037-references-pre-ruling-residue
Reviewed-by: session_01DAcomhvR9kKizeYgg89Vo8

Verdict: PASS — ready + auto-merge by this seat.


Generated by Claude Code

@os-project-manager
os-project-manager marked this pull request as ready for review September 14, 2026 03:34
@os-project-manager
os-project-manager added this pull request to the merge queue Sep 14, 2026
Merged via the queue into main with commit c2cce8f Sep 14, 2026
42 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-18037-references-pre-ruling-residue branch September 14, 2026 04:19
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/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants