Skip to content

Commit 6de7a2d

Browse files
os-justinclaude
andauthored
docs(pm-skills): a repo with zero legacy statuses reads the combined-status endpoint as an empty-set default (#18775)
Fixes #18733 `Clause-②: no` One file: `.claude/skills/pm-dispatch/references/platform-readings.md`, held at **466 / 466** (ceiling 466, headroom 0; widest line in the file still 120 B at `:464`, untouched). No ceiling raised, net line change **0**: one row added, one row retired in the same file. `skip-changeset` — `.claude/**` is shipped by no package's `files[]`, so nothing published moves. ## The trap `:28` is the row that sends a reader to `GET /commits/{sha}/status`. On a commit that carries **no legacy commit statuses at all**, that endpoint answers `state: "pending"` with `total_count: 0` — the API's default for an empty set, not a verdict about anything. In a repo whose gates are all check-runs the field is `pending` forever and means nothing, while reading exactly like "gates still running": a seat that waits on it waits forever, and a seat that reads `pending` as not-yet-red can read a red PR as merely unfinished. The gate reading is `/commits/{sha}/check-runs`. ## Measurements **Three `objectstack-ai/cloud` heads — the card's table, verbatim** (all fully green): | PR | head | check-runs | combined status | |:--|:--|:--|:--| | `objectstack-ai/cloud#2319` | `03c170ec` | 2/2 `completed/success` (2026-09-16T16:13:44Z) | `state: "pending"`, `total_count: 0` | | `objectstack-ai/cloud#2320` | `b4b1c5c4` | 2/2 `completed/success` (2026-09-17T15:47:03Z) | `state: "pending"`, `total_count: 0` | | `objectstack-ai/cloud#2321` | `23e928b7` | 2/2 `completed/success` (2026-09-17T17:14:33Z) | `state: "pending"`, `total_count: 0` | **This repo, fetched through the REST proxy at 2026-09-17T19:57Z–19:59Z** — measured here, ⛔ not retyped from the card. Raw `state` / `total_count` on both sides: | commit | `/commits/{sha}/status` | its `statuses[]` | `/commits/{sha}/check-runs` | |:--|:--|:--|:--| | `d852dae1` (PR #18750 head) | `state: "success"`, `total_count: 1` | `Vercel` / `success` | `total_count: 40`, 29 `completed/success` + 11 `completed/skipped` | | `702b4241` (PR #18756 head) | `state: "success"`, `total_count: 1` | `Vercel` / `success` | `total_count: 39`, 28 `completed/success` + 11 `completed/skipped` | | `2f38ee0d` (PR #18758 head) | `state: "success"`, `total_count: 1` | `Vercel` / `success` | `total_count: 32`, 24 `completed/success` + 8 `completed/skipped` | | `95e17452` (`main` tip at branch point) | `state: "success"`, `total_count: 1` | `Vercel` / `success` | `total_count: 59` | | `e2050cef` (`main`) | `state: "success"`, `total_count: 1` | `Vercel` / `success` | `total_count: 71` | | `bc2ec806` (`main`) | `state: "success"`, `total_count: 1` | `Vercel` / `success` | `total_count: 64` | **The reading that scopes the row**: `objectstack-ai/objectstack` posts a legacy `Vercel` status on every commit, so the empty-set default never arises here. One further control makes that exact, taken on this branch's own first commit `55c8e844` at 19:59:48Z, seconds after the push and before any workflow had started: | commit | `/commits/{sha}/status` | its `statuses[]` | `/commits/{sha}/check-runs` | |:--|:--|:--|:--| | `55c8e844` (this branch, pre-CI) | `state: "pending"`, `total_count: 1` | `Vercel` / `pending` | `total_count: 0` | This repo answers `pending` too — for the opposite reason. There, `total_count: 1` and a real `Vercel` status genuinely in flight; in the card's three cloud heads, `total_count: 0` and no status at all. **`total_count` is the discriminant, `state` is not**, which is why the row names both fields rather than the word `pending` alone. ⇒ the row is scoped 「零 legacy status 的仓」, ⛔ not 「所有仓」. ## The row added — `:29`, 118 B ```text - 零 legacy status 的仓恒答空集默认值 `pending`+`total_count: 0`,⛔ 非门禁读数,门禁读 check-runs。 ``` It sits directly under `:28` 「`unstable` 可源自 check-runs 看不见的 commit STATUS(如 `Vercel`)⇒ ③ 另读 `/commits/{sha}/status`」, which names this repo's legacy status and points at the endpoint. The new row inherits that subject — the idiom the block already uses at `:30`, `:63`, `:65`, `:67` — and states the condition under which the endpoint stops answering the question. Against the card's proposed line, at the file's ≤ 120 B cap: 「那是空 legacy 集合的默认值」 is kept as 「空集默认值」 (「legacy」 already stands in the row's first clause), 「⛔ 不是门禁读数」 as 「⛔ 非门禁读数」, and 「门禁只认 `/commits/{sha}/check-runs` 的 `completed/success`」 as 「门禁读 check-runs」. What changed on purpose is the scope: the card wrote 「在只有 check-runs 的 commit 上」, and the measurement above makes it a property of the **repo**, which is where the legacy status is configured. ## The payment — `:343` retired, 85 B **before** (`:343`, pre-edit numbering): ```text - 署名页脚的写侧变异按通道与输入双重定域,⛔ 不是一条定律。 ``` Why the tree no longer needs it as a separate line: it is a **preamble that states the block's own conclusion**, which the same block states again at its end, more precisely. It carried two clauses, and both are held: | the retired clause | where it is held (post-edit numbering) | |:--|:--| | 「按通道与输入双重定域」 | `:355` 「⇒ 形态随动作与送出体尾部变,改侧还随通道变」 — three loci named where the retired row named two, and `:342` 「⇒ 失效既依拼写又依载体:评论里验过页脚对 PR 正文什么都没证明」 states the same localisation at the point of use | | 「⛔ 不是一条定律」 | `:355` 「⛔ 不由任一条推其余,写后必回读」, and `:351` 「⛔ 无受控对照(同通道只差该块两送)⇒ 是拟合不是定论,⛔ 不外推到别的动作」 | No fact leaves the corpus: every reading the block holds (`:340`–`:343`, `:344`–`:354`) is untouched, and the row that generalises them — the one a reader reaches **after** the evidence rather than before it — keeps the generalisation with the read-back prescription attached. The retired row is not one of the nine PR #18689 adopted, not one of the three `配额` rows #18744 names (`:137`, `:145`, `:146`), and not one of the four PR #18741 landed today (`:47`–`:49`, `:163`). The ratchet's standing one-file exception 「唯一例外:`platform-readings.md` 增量抬上限到落地行数,免 决策卡,记 `ruledRaises` 引常设裁决」 (`scripts/pm/check-skill-line-ratchet.mjs`) was **not** taken: a payment with zero fact loss was available, so the ceiling stays at 466 and no ruling is spent. ## ② re-read — CARRIED, no row, and a premise correction to the card The card's ② says: "The existing entry says `/search/*` is refused by the egress proxy. What it does not say is the **shape** of the refusal." On `main` that sentence is false. Three consecutive rows say exactly the shape (pre-edit numbering, the seat's `:209`–`:211`): ```text - 会话代理只服务 repo-scoped 路径,`/search/*` 的 403 体解析成净零。 - 代理回 403 加体 sessions are bound to their configured repositories,而那是合法 JSON。 - 读 `total_count` 得 None、打印成 total: None,与真空集只差一个字符,而请求根本没跑。 ``` Mapped against the card's proposed addition, clause by clause: 「它的拒绝是成功形状的」 is `:209`'s 「403 体解析成净零」; 「回 JSON」 is `:210`'s 「而那是合法 JSON」; 「`total_count` 键缺失 ⇒ `.get()` 读成 `None`、打印出来像 0」 is `:211`, which adds the measurement the card does not have — 「与真空集只差一个字符,而请求根本没跑」. The only residual is the card's **prescription** 「断言键在,⛔ 不断言值」, and that is precisely what the open PR #18666 (for #18454, governed, awaiting the maintainer) lands on that same line. Its hunk on this file is one line, `@@ -209,7 +209,7 @@`: ```text -- 读 `total_count` 得 None、打印成 total: None,与真空集只差一个字符,而请求根本没跑。 +- 读 `total_count` 得 None、打印成 total: None,与空集只差一字符;缺键即拒绝,判别式是状态码。 ``` 「缺键即拒绝」 is the assert-the-key prescription in the file's own voice, and 「判别式是状态码」 is one notch sharper than the card asked for: it names the discriminant rather than the symptom. So the residual is zero once #18666 lands, and the line a residual row would have to touch is #18666's own hunk — a reserved line. ⇒ **no row for ②**, and the `search_issues` block `:192`–`:201` is untouched. The card's own attribution note observes that the `domain:spec @ objectui` seat recorded the same shape independently and argues that is the reason to put it in the shared table. It is in the shared table; what the card measured is that a reader did not find it there. ## Reserved rows — verified against the open PRs' hunks, by content - `:10`–`:12` (#18469 PR-A) — byte-identical before and after; the diff's two hunks are at `:26`–`:32` and `:341`–`:347`, so these lines are in neither. - `:208`–`:212` (PR #18666) — the only open PR touching this file, confirmed by reading all 26 open PRs' file lists at 2026-09-17T19:50Z; its hunk's changed line is the `total_count` row. **The band moves by the insertion**: on `main` the changed line is `:211` and the hunk's full context window is `:208`–`:214`; on this head they are `:212` and `:209`–`:215`. Every byte in the band is unchanged, so #18666 still applies. - `:431` (#18469 PR-A) — **this number was already stale before this diff**. The row the card names, 「harness 按内容拒写:同会话派发 PR 上 PASS 拒为 `[Self-Approval]`」, reads `:432` on `main`, and read `:432` at `7636cd9b81^` too, so PR #18741's body carried the off-by-one rather than the row having moved. `:431` is a different row (「分支删除被拒有第二形态:代理回 403」). After this diff the `[Self-Approval]` row is still at `:432`: the insertion at `:29` and the retirement at `:344` cancel across it. ## Ratchet before / after `node scripts/pm/check-skill-line-ratchet.mjs`, both pins, exit 0 on both sides: ```text main 447e2e8 ✓ .claude/skills/pm-dispatch/references/platform-readings.md: widest table row is 0 bytes (pin 0; headroom 0). main 447e2e8 ✓ .claude/skills/pm-dispatch/references/platform-readings.md is 466 lines (ceiling 466; headroom 0). head d6bc477 ✓ .claude/skills/pm-dispatch/references/platform-readings.md: widest table row is 0 bytes (pin 0; headroom 0). head d6bc477 ✓ .claude/skills/pm-dispatch/references/platform-readings.md is 466 lines (ceiling 466; headroom 0). ``` Widest line in the file, measured per row in bytes: **120 B at `:464` on both sides**, unchanged; no row exceeds 120 B on either side; the added row is 118 B. ```text .claude/skills/pm-dispatch/references/platform-readings.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) ``` ## Derived gates `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` from the worktree, no hand-fed path list — 18 families, all re-run at the final head `d6bc4775e5` with `$?` captured before any pipe: ```text 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 node scripts/pm/check-harness-current.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-half-states :: 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:required-contexts :: exit 0 pnpm check:skill-frame-sync :: exit 0 pnpm check:watch-hint-literal :: exit 0 ``` Reconciled: `dispatch-gates.mjs --ran` reads 「18 derived famil(ies) accounted for — 18 run, 0 NOT-MEASURED (a DERIVED zero — all 18 recorded an exit code and none of them is 3)」. On the first pass `check:doc-formula-expressions` exited **3 — PREREQUISITE NOT MET**, its own text 「Nothing was measured: this gate exited before running a single check」; its two declared prerequisites were built under `scripts/pm/os-verify-lock.sh` (`VERDICT command-exit 0`, held 158 s, waited 0 s) and it then exited 0, which is the reading recorded above. Also run, outside the derived 18: `pnpm check:pm-settings-deny-roster` exit 0 — the derivation marks it 「roster under .claude, which one of your paths is in」, where silence is evidence in neither direction. Repo-wide `pnpm lint` (`eslint . --no-inline-config`): **exit 0** at `d6bc4775e5`. --- _Generated by [Claude Code](https://claude.ai/code/session_01Gqi43smmqjJ5sUrhfoPeKu)_ Co-authored-by: Claude <noreply@anthropic.com>
1 parent e5705a8 commit 6de7a2d

1 file changed

Lines changed: 1 addition & 1 deletion

File tree

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
- `needs:contract-review` 是合并闸:实测 `blocked` 而 `mergeable: true`,无标签同形兄弟回 `clean`。
2727
- ready 翻转实测两序列 `clean→blocked→clean` 与 `blocked→unstable→clean`;`unstable` 瞬态非失败。
2828
- `unstable` 可源自 check-runs 看不见的 commit STATUS(如 `Vercel`)⇒ ③ 另读 `/commits/{sha}/status`。
29+
- 零 legacy status 的仓恒答空集默认值 `pending`+`total_count: 0`,⛔ 非门禁读数,门禁读 check-runs。
2930
- 判头脏走零配额本地试合并:fetch PR ref 后 `git merge-tree --write-tree origin/main <ref>`。
3031
- 它直接列出冲突文件;读数随 fetch 老化,重跑先 fetch。
3132
- 它跑 `git merge` 的 merge-ort ⇒ 注册 `merge=os-regen` 的克隆照用驱动,未注册的退回文本合并。
@@ -340,7 +341,6 @@
340341
- 去掉横线只写页脚则原样存活;评论不受影响,两种拼法都活。
341342
- ⇒ 失效既依拼写又依载体:评论里验过页脚对 PR 正文什么都没证明。
342343
- ⇒ PR 正文页脚不带前置横线,且写后回读正文 —— 那是唯一检测手段;评论两形皆可。
343-
- 署名页脚的写侧变异按通道与输入双重定域,⛔ 不是一条定律。
344344
- MCP `update_pull_request` 包装器删掉 PR 正文的页脚块;该通道锁 1 已拒,读作历史。
345345
- 裸 REST `PATCH /pulls` 追加一个裸页脚并保留既有 session-URL 页脚,差恰 58 字节。
346346
- 同路送无页脚正文存回恰一条(平台裸形)⇒ 该格处方是不送页脚,⛔ 不是不重送正文。

0 commit comments

Comments
 (0)