Skip to content

Commit fcba191

Browse files
os-elon-muskclaude
andauthored
docs(pm-skill): carry the enqueue-row lag caveat on the queue-membership rows (#18457)
Fixes #18439 An in-place re-key of `.claude/skills/pm-dispatch/references/platform-readings.md` rows :10–:12 (the 队列成员资格与 auto-merge opening block). The rows are TRUE as written and stay decisive; what they lacked is the enqueue row's read-back caveat. No new row, no other row, and the timeline pair stays the decisive re-readable reading. File holds at 466 / 466 (ceiling 466, headroom 0); every changed row is under the 120-byte cap. ## 维护者速读(草稿) **改了什么** — pm-dispatch 事实表里判「这个 PR 在不在合并队列」的三行(:10–:12)原地重排,总行数不变。新增的是入队行的读回窗口这一事实:入队行通常即时可读,但曾实测在入队后 +75 s 仍读不到、随后以入队时刻回填出现。三行现在同时说清:决断读数仍是 timeline 的那对事件、它可重查、短窗内读不到不算否定读数、要复读。 **为什么改** — 这不是某行写错了,是事实表对一个已被两个席位撞上的失败模式保持沉默。席位在自己入队后立刻读 timeline,读到空就当成「没入队」,然后照这个假读数行动;文件从未授权这么读。两次代价已经发生:一张卡因此立错(前提随后被证伪),另一份读数因此写偏。补上这一行等于把「再读一次」变成写死的处置,而不是每个席位自己踩一遍。 **风险与代价(含回滚)** — 风险低:只改事实表的三行散文,无代码、无产物、无发布面。代价是三行都被压到 120 字节上限附近(119 / 118 / 119),后续要往这个区块加字得先腾地方;`可重查` 从 :11 挪到了 :10,`分得开未入队与被踢` 从 :12 挪到了 :11,读这几行的人看到的顺序会变。回滚 = revert 这一个 commit,文件回到原样,行数与上限都不动。 **席位意见** — (留空,待席位定稿) **你要做的** — 读下面的 before / after 三行,确认措辞与你读这张表时的用法一致;认可就把这个 draft 转正并按队列落地。 ## Rows, before → after Bytes measured with `wc -c` on the on-disk line (cap `MAX_LINE_BYTES` = 120, `scripts/pm/check-skill-line-ratchet.mjs`). | Row | Before | After | |:---|---:|---:| | :10 | 115 B | 119 B | | :11 | 93 B | 118 B | | :12 | 114 B | 119 B | | file | 466 lines | 466 lines (ceiling 466, headroom 0) | Before: ```text - 判在不在合并队列的决断读数是 timeline 事件 `added_to_merge_queue` / `removed_from_merge_queue`。 - 拼写 `GET /repos/{o}/{r}/issues/{pr}/timeline`:可按需重查、一次调用双向答。 - 它分得开从未入队与入队后被踢;`pull_request.enqueued` webhook 推送式不可重读,只作旁证。 ``` After: ```text - 判在不在队列的决断读数是 timeline 事件 `added_to_merge_queue` / `removed_from_merge_queue`,可重查。 - 拼写 `GET /repos/{o}/{r}/issues/{pr}/timeline`:一次双向答,分得开未入队与被踢;webhook 不可重读。 - 入队行通常即时可读,曾实测 +75 s 缺席 ⇒ 短窗缺席非读数,复读;`pull_request.enqueued` 旁证。 ``` Every fact the three rows carried before is still carried: the decisive timeline events and their two spellings, the REST spelling, re-readability, the one-call-both-directions property, the never-enqueued / kicked discrimination, the `pull_request.enqueued` name, that the webhook cannot be re-read, and that it is corroboration only. Three facts are new, all measured and recorded on the card: the enqueue row is normally readable at once; it was once measured absent at +75 s; therefore a short-window absence is not a reading and the prescription is to re-read. Wording that had to give to pay for the three new facts, none of it a fact: - `合并队列` → `队列` on :10 (the block heading already reads 队列成员资格与 auto-merge). - `可按需重查` → `可重查`, and the clause moved from :11 up to :10. - `一次调用双向答` → `一次双向答` (「一次…答」 already says one call). - `它分得开从未入队与入队后被踢` → `分得开未入队与被踢`, moved from :12 up to :11. - `推送式不可重读,只作旁证` split: `不可重读` stays on :11 next to the timeline's `可重查` (that is the contrast the new 复读 prescription rests on), the role shrinks to the one word `旁证` on :12 beside the event name. ## The two measured facts and where they come from Both were read through the row's own REST spelling, on this repository, and both live on the card: - **Normally readable at once** — present at +10 s and again at +46 s (comment 5696739885), at +27 s (comment 5696508188), and at +8 min (issue body). Row `created_at` is one second *before* the `pull_request.enqueued` webhook reached the reading seat in both of the short-window cases. - **Once measured absent at +75 s** — two PRs read no enqueued row at +0 s and +75 s, then read back backdated to the enqueue instant (the spec seat's reading, cited in the card body). The row states both and invents no bound: 「通常即时可读」 and 「曾实测 +75 s 缺席」 are exactly what was measured. Nothing in the range between +75 s and +8 min was measured and the row claims nothing there. ## Deviation from the dispatch's suggested wording The dispatch suggested the consequence read 「复读,或以队列 ref + 落地为再读对」. The second half is **not** in the landed row, for two reasons, and no row was added to resolve it (the card forbids that): 1. **Budget.** The caveat alone costs about 98 bytes on its own row; `:12` after it holds 119 of 120. The queue-ref-plus-landing clause is roughly another 40 bytes and there is no row in :10–:12 with that much slack — the only way to buy it is to drop a measured fact that has no other home. 2. **It would make `:12` contradict `:60`–`:61`, which the card says stay as they are.** Row :60 reads 「队列 ref 答 BUILD 不答成员资格:`gh-readonly-queue/*` 只在存在时有意义,即有 build 在跑。」 and :61 reads 「⛔ 它的缺席不是任何方向的读数。」 Promoting the queue ref to the fallback membership pair reads straight across those two. The fallbacks a reader needs are already in the file and unchanged: :19 (落地检查恒两个读数), :59 (效果读数 = 阳性探针、timeline 入队事件、最终落地) and the two positive membership probes at :63–:66. `复读` is the prescription the new facts actually license, and it is the one the row carries. ## Gates `node scripts/pm/dispatch-gates.mjs --commands` from this worktree, no paths, derived against merge base `66abef3fd`: **16 families, 16 run, 0 NOT-MEASURED, 0 UNRUN** — reconciled with `--ran` recording `command :: exit code`, and the tool reports the zero as DERIVED, not claimed. All 16 exit 0. Named on the card and green: `pnpm check:pm-skill-ratchet` (`platform-readings.md is 466 lines (ceiling 466; headroom 0)` and `every line is within 120 bytes`), `pnpm check:pm-skill-id-lint`, `pnpm check:skill-frame-sync`. `pnpm check:pm-governed-prose` is not in the derived set (it is one of the 53 artifact-roster families whose silence is a fact about a list, not about these paths) — run anyway, exit 0. `pnpm check:pm-settings-deny-roster` is the one roster family whose list sits under `.claude`, where the derivation says silence is evidence in neither direction — run anyway, exit 0. `node scripts/check-skills-token-ratchet.mjs` (published `skills/`, not this tree) also run, exit 0. One gate first refused rather than failed: `pnpm --filter @objectstack/lint run check:doc-formula-expressions` exited **3** with `PREREQUISITE NOT MET — the workspace package @objectstack/formula is not built`. That is NOT MEASURED, not a finding. Built its two prerequisites through the shared verify lock (`VERDICT command-exit 0 · held the lock 147s`) and re-ran it: exit 0, `9 @example(s) judged clean`. Repo-wide scans (`pnpm lint` and the 11 wide-population families, the 14 changeset-derived families, the CI-measured and workflow-valued families) are CI's run, not this worktree's. ## Changeset None — `skip-changeset`, on AGENTS.md Post-Task Checklist step 3's own arm: 「⛔ never `skip-changeset`: that label is for a diff that publishes nothing from any released package」. Measured rather than assumed: 24 workspace manifests scanned, **0** declare anything under `.claude` in `files[]`; positive control, `packages/spec`'s `files[]` resolves to real shipped paths (`dist`, `json-schema`, `api-surface`, …). The diff is one file under `.claude/skills/`, which no released package ships. ## Acceptance notes - Scope held to this card: rows :10–:12 of one file, one commit, 3 lines changed, 0 added, 0 removed. - `premise_still_valid: true` — the three rows were re-read on this branch's base (`origin/main` had advanced from `b6fe311a` to `66abef3f` between dispatch and worktree creation; `git diff b6fe311..HEAD` on this path is empty, so the quoted wording is byte-identical to what the card quotes). - The timeline pair is not demoted and no row was added — both explicit stop conditions on the card. - ⛔ Not addressed here and left open on purpose: nothing. No out-of-scope defect was found in this block. - Note, not a filing: rows :10–:12 now sit at 119 / 118 / 119 of 120 bytes and the file at 466 / 466, so this block has no slack left in either dimension. The next fact that has to land here needs the ceiling raise the file's own quota section governs, not a squeeze. 承接者:the next PR that re-keys this block. - No model identifier appears in this branch's title, body, commit messages or comments; the commit carries the model-free trailer pair and no card relation (AGENTS.md). --- _Generated by [Claude Code](https://claude.ai/code/session_01HPfcjvF23QBoBj7P47DDxs)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent bdd0570 commit fcba191

1 file changed

Lines changed: 3 additions & 3 deletions

File tree

.claude/skills/pm-dispatch/references/platform-readings.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,9 @@
77
- 本仓是否强制队列是仓库 ruleset 事实;`grep merge_group` 答的是队列内是否重跑 CI,两者独立。
88
- 缺席不构成反证:有仓 ruleset 强制而无 trigger,队列照收 PR;新仓靠实测,⛔ 不由缺席推断。
99
- 权威读数 = 合并尝试本身(回 405 `Changes must be made through the merge queue`)或 rulesets API。
10-
- 判在不在合并队列的决断读数是 timeline 事件 `added_to_merge_queue` / `removed_from_merge_queue`
11-
- 拼写 `GET /repos/{o}/{r}/issues/{pr}/timeline`:可按需重查、一次调用双向答
12-
- 它分得开从未入队与入队后被踢;`pull_request.enqueued` webhook 推送式不可重读,只作旁证
10+
- 判在不在队列的决断读数是 timeline 事件 `added_to_merge_queue` / `removed_from_merge_queue`,可重查
11+
- 拼写 `GET /repos/{o}/{r}/issues/{pr}/timeline`:一次双向答,分得开未入队与被踢;webhook 不可重读
12+
- 入队行通常即时可读,曾实测 +75 s 缺席 ⇒ 短窗缺席非读数,复读;`pull_request.enqueued` 旁证
1313
- `auto_merge` 字段不只是空,是不稳定:同一 PR 一分钟内先 set 后 None,入队后又回落 off。
1414
- ⛔ 永不据它判没挂上而重挂 —— 重挂踢队重排。
1515
- 推送重折已挂 auto-merge 的 PR 可静默掉挂,无字段说明 ⇒ 重折后重发,再按队列 ref 探。

0 commit comments

Comments
 (0)