Skip to content

Commit ce95164

Browse files
huangyiireneclaude
andauthored
docs(pm): name the landing flow's wait state when the ccr undraft route answers 429 (#19717)
Fixes #18743 ## What lands One rule line in `.claude/skills/pm-dispatch/references/landing-operations.md` §B — the landing flow's own state list — naming what an arming run IS when the ccr undraft route (`POST .../pulls/{n}/ccr/ready_for_review`) answers 429. Before this, a seat that met that 429 held a fact (the body's `resets at` instant), a prohibition (never retry before the reset, never busy-poll, never blind-retry) and **no declared outcome**, so its only exits were to report a dated wait as a blocked landing or to invent a cadence — the thing the rules forbid. Added at line 22, 120 bytes (the ratchet's per-line cap is 120, and a line of exactly 120 bytes passes — 34 lines of the corpus already sit at exactly 120): ```text - undraft 撞 429 ⇒ 落地入等 `resets at` 态:该刻记卡,到点一次重试;⛔ 不报阻塞、不自定节奏。 ``` It carries the three parts the card's contract asks for — the named wait on the instant, the instant recorded on the card, one retry at it — plus both prohibitions (⛔ not a blocked landing, ⛔ no self-chosen cadence). The facts stay where they are: `platform-readings.md` is not edited. ## Where it goes, and why there rather than the alternatives Measured, not assumed. Three homes were on the table. 1. **Beside the arm act (chosen).** The 429 is returned **by the ready flip itself** — zero bytes written, `draft` unmoved. So the line belongs in the block that performs the flip (the flip-定点 → `绿即转 ready + 挂 auto-merge` → the no-busy-poll discipline). It sits immediately after the CI-webhook line so that the pair `绿即转 ready…` ↔ `CI success webhook 不可靠…` stays intact, and so the new state reads as the **permitted action** under that line's ⛔ 不坐等 / ⛔ 不忙轮询: the wait is a 定点 the platform names, not one the seat picks. 2. **Beside the three-step enqueue check — rejected.** That check is gated on `ready + 全绿 ≠ 已入队`. A 429 leaves the PR *not ready at all*, so that precondition is false and the three-step ladder never starts. Filing the state there would put it behind a door the 429 can never open. 3. **`rest-channel.md` — rejected.** That file is a per-operation **channel** table ("which route does this act take"), and it already carries the route. What is missing is not a route but a **landing state**, and the landing flow's state list is §B here. ## How the line is paid: the retired duplicate `landing-operations.md` is at ceiling 69 with headroom 0, so the line is paid in-file by retiring one. Retired: ```text - ⛔ 不放宽其它任何 PR 的 queue-only 落地。 ``` Two independent covers, both checkable: - **It restates a rule that lives in `SKILL.md`.** `SKILL.md` already states `路径面干净的才转 ready → 入队;队列是唯一被认可的落地路径,⛔ 永不队列外合并。` — unconditional, and strictly stronger than "don't relax it for any other PR". This file's own ceiling convention, quoted in the ratchet's `CEILINGS` comment for the 80 → 69 lowering, is verbatim **"no rule already stated in SKILL.md"**. So the line is a duplicate by the file's declared standard, not by my reading of it. - **Inside this file it has no residual work.** Its only possible job was bounding the two main-red exceptions directly above it, and both already carry their own bounds in their own text — `限 p0、机械、根因已核实的止血 PR` and `仅限 main-red 修复`. Nothing normative is lost with it gone. Net: 69 lines before, 69 after. The ceiling is **not** raised and no cross-file move is declared. ## Verification Derived with `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` (no paths — the script takes its own change set from the merge base), then reconciled with `--ran`. Exit codes captured before any pipe, into a file. ```text dispatch-gates --ran: 17 derived famil(ies) accounted for — 17 run, 0 NOT-MEASURED (a DERIVED zero — all 17 recorded an exit code and none of them is 3). ``` The families the dispatch named, with the verdict each printed: | gate | exit | verdict line | |:---|:---|:---| | `pnpm check:pm-skill-ratchet` | 0 | `landing-operations.md is 69 lines (ceiling 69; headroom 0)` · `widest table row is 0 bytes (pin 0; headroom 0)` | | `pnpm check:pm-skill-id-lint` | 0 | `30 file(s) clean (pattern /#[0-9]{3,}/g)` | | `pnpm check:skill-frame-sync` | 0 | `the one declared copy of the decision frame is internally coherent` · 77 md files scanned for undeclared copies | | `pnpm check:pm-governed-prose` | 0 | `2 instruction surface(s) name all 6 registered governed surfaces and claim no others` | | `pnpm check:doc-authoring` | 0 | `403 files clean — no bare metadata literals` | | `pnpm check:nul-bytes` | 0 | `scanned 9210 text file(s) … no raw ASCII control bytes` | The other eleven derived families also exited 0: `check:pm-governed-merges`, `check:cross-package-test-inputs`, `check:driver-memory-census`, `check:agent-test-spelling`, `check:gitlink-declared`, `check:refd-timer-probe`, `check:watch-hint-literal`, `@objectstack/lint run check:doc-formula-expressions`, `check-closing-keyword-parity.mjs` (both with and without `--self-test`), `check-comment-mask-corpus.mjs` and `check-harness-current.mjs --self-test`. Four of them first answered **exit 3** in the fresh worktree (prerequisite not met — no `node_modules`; one also needed `@objectstack/formula` + `@objectstack/lint` built). Exit 3 is not a finding and was not recorded as one: `pnpm install` and a locked `turbo run build --filter=@objectstack/formula --filter=@objectstack/lint` cleared it and all four were re-run to a real verdict. The build ran through `scripts/pm/os-verify-lock.sh`, which printed `VERDICT command-exit 0 · held the lock 177s · waited 0s`. Beyond the gate: a direct control-character sweep of the edited file, `grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'`, exited 1 (no match). No ablation or reverse-verification run is claimed here: the change is one line of governed prose with no executable behaviour, so there is nothing whose removal a test could be shown to detect. The ratchet is the instrument that would have caught a miscount, and it is green at 69/69. ## Changeset `skip-changeset`. Measured rather than asserted: `.claude` exists as exactly **one** directory in the tree, at the repo root. The only package at the repo root is `@objectstack/spec-monorepo`, which is `private: true` and declares no `files[]`. Of the 83 tracked `package.json` files, 70 declare a `files[]` and **zero** of their entries names `.claude` under any spelling; the remaining 13 are all `private: true`. So nothing in this diff reaches a published tarball. ## Acceptance notes No out-of-scope cards are owed from this round. One boundary worth recording, deliberately **not** filed: - `SKILL.md` and `references/filing-gate.md` each already carry a 429 rule (`429 即停写` / `收到 429 或次级限流 ⇒ 该席本 fire 停写`). Those govern the **write budget** on the claude[bot] token, a different pool from the session credential's GraphQL hourly pool that the undraft route draws on, and they prescribe *stopping writes* — which is precisely what would push a seat toward reporting the landing as blocked. They are near neighbours of the gap this PR closes, not statements of it, and they are correct as written. An observation, so no card. --- _Generated by [Claude Code](https://claude.ai/code/session_01Wnstp2kTth7sGXfr8fXypc)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent e2c55ed commit ce95164

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

‎.claude/skills/pm-dispatch/references/landing-operations.md‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
- 首次入队:ACCEPT 后挂 6–9 分钟 flip 定点,到点核门禁 job 结论。
2020
- 绿即转 ready + 挂 auto-merge;未绿按阶梯重挂定点。
2121
- CI success webhook 不可靠:⛔ 不坐等,也 ⛔ 不忙轮询;定点文本照定时器写法纪律。
22+
- undraft 撞 429 ⇒ 落地入等 `resets at` 态:该刻记卡,到点一次重试;⛔ 不报阻塞、不自定节奏。
2223
- 确认 MERGED 要两个读数:每轮同时读队列分支与 `origin/main`。
2324
- 契约复核 PASS 落地的 PR 到窗口时已 ready 且 auto-merge 在挂,见 `contract-review.md`。
2425
- 窗口自身权责不变:跟到 MERGED、踢出处置、落地后对账。
@@ -47,7 +48,6 @@
4748
- 暂停或交接时把在挂订阅清点进座位贴,⛔ 不留孤儿订阅。
4849
- main-red 约定①:p0 fix-forward 允许跳队,限 p0、机械、根因已核实的止血 PR。
4950
- 也可按既有 governed 例外由维护者人工直合一行修复;仅限 main-red 修复。
50-
- ⛔ 不放宽其它任何 PR 的 queue-only 落地。
5151
- main-red 约定②:一个失败 check 只锚一张卡,先立者赢,后见者评论到锚卡,⛔ 不另立。
5252

5353
## C. 依赖前棒才能转绿的 PR:draft 停放 + 签名级预期红清单

0 commit comments

Comments
 (0)