docs(pm): landing-operations names the two landing tiers and lanes/ui.md's spec pointer states the landed rule (#18037) - #18111
Conversation
….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>
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>
Contract reviewHead: ① derived judgments (seat-measured on the fetched head, ⛔ not taken from the report):
② 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 Implemented-by: Verdict: PASS — ready + auto-merge by this seat. Generated by Claude Code |
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, andlanes/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: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)..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/main66aa2d98d, untranslated)packages/spec工作恒由domain:spec席收口,不论谁需要它;已派发卡 ⛔ 不因触 spec 转席。」references/,其余为规则层(含发布skills/**与 SKILL.md)。」 / 「规则层四件套等人合;事实层 PR(受管路径全在该目录)经席内达档复核后 ready → 入队。」contract-review.md:47 — 「规则层等维护者的字;受管路径全在.claude/skills/pm-dispatch/references/者达档过本三条入队。」lanes/ui.md:25 (landed, untouched here) — 「⇒ 命中即停 draft;⛔ 未获授权批准不 ready 不入队不自合、永不批准,获批后认领席落地。」Premise readings P1–P4
Taken in worktree
objectstack-issue-18037on the branch base66aa2d98d, before any edit, at 2026-09-14T03:05:55Z:git grep -n '人工合并道' -- .claude/skills/pm-dispatch/references/landing-operations.md→ exit 0, hit at:27; its neighbour:28read 「⛔ 不翻 ready、不入队;清标即落地同受此闸,漏判会被队列守卫在 merge group 里拒收。」 ✅ premise holds.git grep -n '凡触' -- .claude/skills/pm-dispatch/references/lanes/ui.md→ exit 0, hit at:22; the SKILL.md line it points at (:230) states the retiring rule. ✅ premise holds.git grep -n 'mergeable_state' -- .claude/skills/pm-dispatch/references/landing-operations.md→ exit 0, 2 hits (:29,:31). ✅ premise holds.node scripts/pm/check-skill-line-ratchet.mjs→ exit 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).80/80forlanding-operations.mdis 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:
人工合并道inlanding-operations.md:27)凡触inlanes/ui.md:22)mergeable_stateinlanding-operations.md:29,:31):30,:32)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:
:34「确认 MERGED 的同一动作里给Part of卡收口,Fixes卡代关但标也须摘。」:37「摘标与 MERGED 确认是一个动作,⛔ 不拆到下轮巡检。」Part of卡收口、Fixes卡代关但标也须摘,⛔ 不拆到下轮巡检。」Every clause of both lines survives: the
Part ofclose-out, theFixesauto-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 ownclassifyLinebefore it was written to disk — 117 / 112 / 111 bytes (the three newlanding-operations.mdlines), 118 bytes (the merged line), 120 bytes (lanes/ui.md:22) — each classifiednull, i.e. compliant.Gates
Follow-up commit
460b36b33— 等人合 → 等人批The PM seat's pre-read of head⚠️ 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
7900d80bcaught 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 shapelanes/ui.md:25 already carries — so the line now reads 「四件套留 draft 等人批,⛔ 不翻正式不入队;获授权批准后认领席落地。」 Byte-neutral (112 bytes,classifyLinereturnsnull), equal line count, no ceiling moved, pushed as a second commit rather than an amend.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/objectstackwith 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, at460b36b33(and identically at7900d80bdbefore the follow-up):The ratchet at
460b36b33still readslanding-operations.md is 69 lines (ceiling 69; headroom 0)andlanes/ui.md is 38 lines (ceiling 38; headroom 0), and the criterion still passes on that head (人工合并道 exit 1, 凡触 exit 1, controlmergeable_stateexit 0 with 2 hits).Reconciliation, from
node scripts/pm/dispatch-gates.mjs --ran … --repo objectstack-ai/objectstack:One gate needed a prerequisite:
check:doc-formula-expressionsfirst exited 3 (PREREQUISITE NOT MET —@objectstack/formulaand@objectstack/lintnot 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 lintand the rest of the lint farm) are CI's run, not this PR's local owing.Changeset
None owed;
skip-changesetis the declaration. The Check Changeset job (.github/workflows/pr-automation.yml, jobchangeset-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: theskip-changesetlabel and thechangeset-release/mainrelease PR authored bygithub-actions[bot]. Nothing published moves here:.claude/**lives outside every package, and no manifest'sfiles[]names it (0 of 82 manifests).Acceptance notes
Out-of-scope observations, noted and ⛔ not filed (no card, no label):
contract-review.md:45 still reads 「③ PR 全部 check 全绿,⛔ 非 required 子集;受管面不适用,draft-only 终局不变。」 while :47 immediately below carves the references tier out of that 「受管面不适用」. The two lines are consistent read in order — :47 is the refinement — but a reader who greps only for 落地前检③ meets the older half first. Noted, not filed: the next PR that touchescontract-review.md's 落地前检 block is the carrier. It is prose density, not a defect, and it is not this card's surface.lanes/ui.md:25,os-dev.md先搜再立, the SKILL.md table rows) — not addressed here and left open; out of scope: pm-dispatch: the merge-queue guard still demands an approval for areferences/-only governed PR — #17950's tier is declared, not enforced #18020, the queue-guard half — not addressed here, and this PR does not depend on it.维护者速读(草稿)
改了什么 — 两行落地指引的措辞。落地跑册
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