Skip to content

fix(pm): the enqueue bar names expected skips — a path-filtered job's skip is not a failure, and a check reports the skips outside the declared roster - #18357

Merged
hotlong merged 1 commit into
mainfrom
claude/issue-18308-enqueue-bar-expected-skips
Sep 16, 2026
Merged

hotlong merged 1 commit into
mainfrom
claude/issue-18308-enqueue-bar-expected-skips

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Fixes #18308

What

.claude/skills/pm-dispatch/SKILL.md :629 read 「入队资格 = PR 上每一个 check 全绿,⛔ 不是 required 子集;required 集是队列强制的地板。」 — a bar no landing on this repository can satisfy, because skipped is the ordinary conclusion of a path-filtered job and the charter defined no state for it. Measured over the ten most recent landed heads (below), every head carried 8–19 skipped check-runs beside its successes; the seat's landings read 「success = green, skipped = not failed」 by an unstated convention.

Two changes, both inside the claimed file surface:

  1. SKILL.md :629, re-keyed in place (112 B → 119 B, ≤120 B; 812 → 812 lines; no issue number):

    - 入队资格 = 每个 check 为 success 或预期 skip(名单:check-expected-skips.mjs),⛔ 不是 required 子集。

    The bar now names the two states a check may be in — success, or an expected skip — and points at the one machine-readable roster of expected skips. The third clause of the old line (「required 集是队列强制的地板」) did not fit the byte ceiling and is carried by AGENTS.md §7 (「the queue enforces only the required set」); the ⛔ clause is kept verbatim.

  2. scripts/pm/check-expected-skips.mjs (new; package.json gains check:pm-expected-skips = its --self-test): given --pr N or --head SHA (or a pre-fetched payload via --check-runs-json FILE|-), it reads the head's check-runs and judges every skipped run against a roster declared once, in the file, as data with a one-line reason per row. Exit register: 0 every skip is in the roster · 4 a skip is outside it (each named and classified: a filter miss, or a dependency skip when the same check suite holds a failed run; a raw matrix template in the name is read as "skipped before matrix expansion, i.e. a job-level gate — never a workflow-level paths: filter, which creates no check-run at all") · 3 NOT MEASURED (unresolvable sha, 404, network, no check-runs on the head, or a check-run still running — the skip set is not final). Report-only; the self-test pins structurally that the file carries no method: key and imports no writer.

The roster is tied to the workflows, not remembered: --self-test parses each row's workflow with the yaml package and asserts the job exists, carries the row's name, carries an if:, that the if: spells the declared gate (needs.filter.outputs.X != 'false', the github.event.action exclusion, or the label literal), and — for ci.yml rows — that the filter job's output keeps its || 'true' widening, which is what makes "the merge-queue build runs it" true. The audit is driven red in the self-test on a deleted, renamed, un-gated and re-gated job, a lost widening and an unreadable workflow.

The roster (11 names), measured over ten landed heads

name workflow › job mechanism over the ten heads
Build Core ci.yml › build-core filter output core said false; REQUIRED context, judged on the queue build skipped 10/10
Temporal Conformance (live PG + MySQL) ci.yml › temporal-conformance same, REQUIRED context skipped 10/10
Dogfood Regression Gate (${{ matrix.shard }}/3) ci.yml › dogfood same; raw matrix template = pre-expansion name (the aggregate Dogfood Regression Gate runs if: always(), never skips) skipped 10/10
Dogfood Verify CLI ci.yml › dogfood-verify same skipped 10/10
Test Core (${{ matrix.shard }}/6) ci.yml › test core OR crosspkg both false (scripts/** is in crosspkg, so scripts/pm heads RUN it) skipped 3/10 — only the .md-only heads
Build Docs ci.yml › build-docs filter output docs skipped 10/10
Console Pin Gate ci.yml › console-pin filter output console skipped 10/10
Check PR Size pr-automation.yml › pr-size if: excludes labeled / unlabeled / edited events; each event is its own run on the same head skipped 9/10, success beside it 10/10
Auto Label pr-automation.yml › auto-label same skipped 9/10, success beside it 10/10
Check Changeset pr-automation.yml › changeset-check if: skips a PR carrying skip-changeset skipped 10/10 (every head carried the label), success beside it 9/10 (the run before the label)
Packed-tarball smoke (opt-in) pack-smoke-optin.yml › pack-smoke opt-in by needs:pack-smoke skipped 10/10

Never skipped on any of the ten heads (and carrying no if:): Lint & Repo Gates, the four Type Check · lanes, TypeScript Type Check, Test Core and Dogfood Regression Gate (the aggregates), Governed Surface Queue Guard, filter, the four claim/keyword guards, Check Documentation Links, Close issues referenced in other repositories. Workflows with a workflow-level paths: filter (half-state-patrol.yml, board-snapshot.yml) produce no check-run at all on a non-matching head — they are absent on 6 of the ten heads, never skipped — which is the measured basis for the "a skipped check-run is never a paths: filter" reading.

Reverse verification (all at 7a1f99ea)

leg result
--head on the ten landed heads #18298 · #18307 · #18311 · #18315 · #18316 · #18322 · #18326 · #18327 · #18328 · #18332 exit 0 on every one; accepted skips per head: 11 · 12 · 11 · 19 · 12 · 8 · 11 · 18 · 18 · 11, every name in the roster; e.g. #18322 (the 8-skip head): Build Core, Build Docs, Check Changeset, Console Pin Gate, Dogfood Regression Gate (…/3), Dogfood Verify CLI, Packed-tarball smoke (opt-in), Temporal Conformance
constructed fixture: the real #18322 payload with Lint & Repo Gates mutated to skipped exit 4, naming Lint & Repo Gates (check suite 94780297729) and classifying it filter-miss
garbage sha --head deadbeef…deadbeef exit 3NOT MEASURED — HTTP 422 — the API cannot resolve that sha
--pr 18315 (the head is looked up through the proxy) exit 0, 19 skipped check-run(s), every one in the roster; --pr 18308 (an issue number, not a PR) → exit 3 (HTTP 404)
--self-test 99 cases pass, offline (the roster's truth on the live workflows and its audit driven red six ways; the judge on the measured 39-run #18315 head and on fixtures for 0 / 4 / 3; read classification; argv; the real CLI on payload files incl. --json; the structural pins)
SKILL.md ratchet wc -l 812 → 812; :629 112 B → 119 B; check-skill-line-ratchet: SKILL.md is 812 lines (ceiling 812; headroom 0)

Gates (local, at 7a1f99ea)

node scripts/pm/dispatch-gates.mjs --commands .claude/skills/pm-dispatch/SKILL.md scripts/pm/check-expected-skips.mjs package.json derived 45 commands; all 45 were run with the exit captured by redirect, and --ran reconciles: ✓ dispatch-gates --ran: 45 derived famil(ies) accounted for — 40 run, 5 NOT-MEASURED (5 DERIVED from a recorded exit 3). The five NOT MEASURED are the dist/-reading families on an unbuilt tree (check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content, @objectstack/lint check:doc-formula-expressions — each prints PREREQUISITE NOT MET); this diff touches no package, so no build closure is owed locally and CI runs them built. The pnpm check:pm-dispatch-gates battery was not derived, so it was not run.

Named gates, verdict lines quoted: check-skill-line-ratchet: SKILL.md is 812 lines (ceiling 812; headroom 0) · check-skill-id-lint: 27 file(s) clean · check-skill-frame-sync: the one declared copy of the decision frame is internally coherent · check-self-test-wired: every one of the 212 script(s) CI runs that ship a --self-test has that self-test run by CI (the new script is not in that population — see Acceptance notes) · check-nul-bytes: OK (scanned 8707 text file(s)) · check-governed-prose: 2 instruction surface(s) name all 5 registered governed surfaces · ESLint (--no-inline-config) on the new file: exit 0 · check-governed-merges.mjs --test .claude/skills/pm-dispatch/SKILL.md: GOVERNED (.claude/** ×1), exit 3 as designed. check-clause2-carriers.mjs --pair is run once this PR exists and its reading goes in the report comment.

The one design choice, on the four axes: a roster declared in the check vs. deriving expectedness live from the workflows' paths filters

  • 实际业务需求 — the measured need is name-level: 31 landings this shift and the ten heads above were judged by "is this skipped name one that always skips?", and zero of them needed a diff-level answer. The diff-level question ("should Build Core have run on THIS diff?") is already answered for the required family by the platform: on merge_group ci.yml's filter widens every output to 'true' (the || 'true' half of the filter contract, now pinned by this check's self-test), so the family runs on the merged tree before main moves. A live derivation would answer a question nobody measured a need for, at the cost below.
  • 项目长远合理性 — a roster is a declaration that can rot; a live derivation is a second evaluator of the platform's own semantics (dorny/paths-filter's picomatch dialect, GitHub's expression language, matrix name templates, per-event runs) that can drift from the real evaluator. Both are drift; the roster's drift is made LOUD here (every row is pinned to its live job, name, if: and gate spelling — a rename or re-gate reddens CI), while an evaluator's drift is silent by construction (a wrong glob yields a confident "expected"). Contract-first: the workflow file is the contract, and the roster is a checked reading of it, not a copy of its path lists.
  • 防 AI 写代码犯错 — the roster makes the wrong move structurally hard: a new gated job's first skip is exit 4 until someone adds a row WITH its mechanism, and a row that names a job the tree does not gate is red. A live evaluator is where an AI would quietly mis-implement glob semantics and produce the false green this tree refuses everywhere else (the "could not read" ≠ "clean" class). The declared-vs-delivered line is kept: the check advertises the name question only, and says so in its header and report.
  • 创业阶段不扩散需求 — the roster is ~11 rows of data and one audit; live derivation is a YAML-expression evaluator with parity tests against GitHub. No pull exists for the latter; if a rostered required job is ever found skipped on a diff inside its filter, that measurement is the card that would justify it.

Recommendation: the roster in the check (implemented). Should the seat prefer live derivation, nothing here blocks it — the roster rows already carry workflow, job and the gate's outputs, which is the input a derivation would start from.

Acceptance notes

  • Self-test wiring. check:pm-expected-skips exists in package.json (mirroring the report-only siblings), but no workflow names it and lint.yml was outside this card's file surface, so check-self-test-wired (correctly) does not count it and CI does not run its 99 cases. The completion is one lint.yml step beside the other check:pm-* steps (run: pnpm check:pm-expected-skips); left to the seat — 承接者:the skills seat, on this PR or a sibling. Noted, not filed.
  • :629's floor clause dropped for the byte ceiling (「required 集是队列强制的地板」); AGENTS.md §7 carries the fact. Noted, not filed.
  • Exit 4 judges skips only. Other conclusions on the head (failure, cancelled, neutral, …) are printed loudly under other conclusions and do not move this check's exit; the bar's success half is read from the same listing. A malformed --head (non-hex) is a usage error (exit 2), a well-formed sha the API cannot resolve is exit 3. Noted, not filed.
  • The card's five-name family was a subset. The measured recurring family is eleven names (six ci.yml filter-gated jobs the card did not list, including two REQUIRED contexts); the card's citation of a "platform-readings discipline (a skip is not a pass)" has no verbatim carrier — the nearest lines are AGENTS.md §7 (「Green means the gate-carrying jobs' conclusion is success」) and references/review-checklist.md:43. Recorded in the report, no card.
  • [finding] Clause-②: yes on a non-spec, non-skills lane — the protocol says the contract-review-tier review is the spec seat's, but spells no handoff (who is asked, by which artefact), so a lane seat reaches for an in-seat PASS the harness classifier then refuses as self-approval #18349 is not addressed here; it holds :513 / :523 of the same file (region-level parallel). origin/main did not move under this branch after cut (ceb6b5fb).

维护者速读(草稿)

改了什么:入队资格这一行改成「每个 check 为 success 或预期 skip」,并新增一个只读的检查脚本 scripts/pm/check-expected-skips.mjs:给它一个 PR 号或提交 SHA,它读出该提交上所有 check,凡是 skipped 的都对照脚本内声明的「预期 skip 名单」(11 个名字,每个带一句为什么会 skip 的机制),名单外的 skip 会被点名并退出码 4;读不到就退出码 3,绝不当作通过。

为什么改:原来的「每一个 check 全绿」在本仓库任何一个 PR 上都做不到——路径过滤的 job 本来就以 skipped 结束,实测最近十次落地每次都有 8–19 个 skip。席位一直靠「记得哪些通常会 skip」在判断,而真正要分辨的是「预期 skip」与「本该跑却没跑」。现在名单是机器可读的,并且自测会把名单逐条对照真实 workflow 文件校验(job 存在、名字一致、带条件、条件拼写一致),名单不会悄悄过期。

风险与代价(含回滚):规则层只改一行(≤120 B、行数 812 不变);脚本只读不写、不接入任何门禁,CI 不因它变红。名单是名字层面的判断,不回答「这个 diff 是否本该触发某个 job」——必查项由合并队列在合并树上全量重跑兜底,这一点写在脚本头部。回滚 = revert 本 PR。

席位意见:(留空,席位定稿)

你要做的:本 PR 触及 .claude/**(规则层),需要你的 APPROVED;之后由席位落地。是否把该脚本的自测接进 lint.yml(一行 pnpm check:pm-expected-skips)由席位决定,本 PR 未动 lint.yml。


Generated by Claude Code

… skip is not a failure, and a check reports the skips outside the declared roster

SKILL.md :629 is re-keyed in place (112 B -> 119 B, 812 / 812 lines): every
check is `success` or an expected skip, the expected set being the roster
`scripts/pm/check-expected-skips.mjs` declares. The check reads a head's
check-runs (--pr / --head / a pre-fetched payload) and exits 0 when every
skip is in the roster, 4 naming a skip outside it (classified as a filter
miss or a same-suite dependency skip), 3 when the head cannot be read,
carries no check-runs, or has a check-run still running. The roster is tied
to the workflows: --self-test parses each row's workflow and asserts the
job, its name, its `if:` and the gate spelling, so a renamed, deleted or
re-gated job reddens the roster instead of letting it rot into memory.

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

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 7a1f99eadd251d788058ebf0f93731a39c722770

Reviewing seat: domain:skills, in-seat review at the contract-review tier — get_session read at 2026-09-16T03:02Z: configured_model = session_context.model = last_served_model, the constant's tier, no fallback notice this round. Card #18308, claim 5691006511, report 5691333270 (posted through the tool; author read back os-zhuang); Clause-②: no on the claim; the dev built at the review tier by the SKILL.md path mandate; seat review at tier.

① Derived judgments

  • Accept set / public surface: none moves — .claude/skills/pm-dispatch/SKILL.md :629 (one line, in place, 112 → 119 B; 812 / 812; no issue number; the frame block :734–:755 md5 3327d02c56f8a0eca88569dad2270f32 unchanged), package.json (+1 script line, check:pm-expected-skips = the tool's --self-test) and a NEW scripts/pm/check-expected-skips.mjs (1105 lines) against merge base ceb6b5fb (the branch does not carry 9ddaa067, which touches neither file — not rebased, per the rules); nothing published; skip-changeset read back (documentation + size/xl + dependencies + skip-changeset). GOVERNED (.claude/** ×1 by check-governed-merges --test, exit 3; the other two paths off the register) ⇒ the four-piece hangs here and the PR waits for an authorized APPROVED; ruling C after it.
  • The change, read whole on a detached worktree of the head: :629 now reads 「入队资格 = 每个 check 为 success 或预期 skip(名单:check-expected-skips.mjs),⛔ 不是 required 子集。」 — the bar's SUCCESS half unchanged, its SKIP half given a roster instead of memory, the ⛔ clause verbatim; the third clause 「required 集是队列强制的地板」 dropped for the byte cap, its fact standing at AGENTS.md :504 (「the queue enforces only the required …」), so the charter loses nothing. The tool: an 11-name EXPECTED_SKIPS roster declared once as frozen data (name · workflow · job · gate kind ∈ filter-output | event | label · a one-line mechanism), auditRoster pinning every row to the live workflow YAML (the job exists, its name: matches, it carries an if:, the if: spells the declared gate fragment, and a filter-output row's ci.yml filter output keeps the || 'true' widening the reason column relies on); judgeCheckRuns pure over the REST check-runs shape (a rostered skipped NAME is expected with its multiplicity, an unrostered skip is named and classified dependency-skip when its check suite also holds a failure else filter-miss, a raw matrix-template name (the dollar-brace matrix.shard spelling, as the API reports a job skipped before matrix expansion) read as a pre-expansion skip, other conclusions printed loudly and NOT the verdict, any incomplete run ⇒ NOT MEASURED); exit register 0 / 4 / 3 / 2 / 1 with 3 imported from check-half-states.mjs, as are the board resolver and the proxy re-exec plan (the guard variable is the file's own); --check-runs-json judges a pre-fetched payload with no network; structurally report-only (no method: key, no writer import — pinned by the self-test on the masked source). The roster answers the NAME question only and says so: whether a rostered job should have run on THIS diff is the queue build's answer for the ci.yml family and a hand-read condition for the event- and label-gated advisory jobs — the seat agrees this is the right boundary (a second evaluator of the platform's filter semantics would fail as a confident wrong "expected").
  • Seat re-runs on the head: --self-test 99 / 99; --roster 11 rows; ESLint 0 / 0 on the new file; check:pm-skill-ratchet 812 / 812 with :629 at 119 B; check:pm-skill-id-lint 27 files clean; check:skill-frame-sync coherent; check-self-test-wired 212 / 212 (the new script is outside its population — no workflow names it; see ③); --pair 18357 0; check-governed-merges --test GOVERNED on SKILL.md alone. Live by the seat: --head 6b750117 (PR fix(pm): check-harness-current prints boundary, not a fabricated sha, when a harness path's latest touch is not provable on the shallow checkout #18352) 36 runs, 25 success · 11 skipped, exit 0; --head ec9ef17b (PR docs(agents): criterion ③'s test is scoped to the branch's own commits — the unranged git log walked all of main and made force-with-lease dead letter #18351) 34 runs, 18 · 16, exit 0; --head deadbeefdeadbeef NOT MEASURED, HTTP 422, exit 3, stdout empty of any verdict; --pr 18357 NOT MEASURED while its own runs were still in progress (exit 3, the pending runs named) — the refusal-not-pass leg observed on the tool's own PR. The event rows are pinned by one fragment (github.event.action != 'labeled'); the live if: on pr-size / auto-label excludes unlabeled and edited too (pr-automation.yml :141–:144, :211–:215, read by the seat) — the reason column is true of the tree and the pin is the narrower of the two (noted, not a defect).
  • Gates: 50 recorded by the dev on the head — 44 at exit 0, 5 NOT MEASURED at exit 3 (the dist/ readers with @objectstack/formula unbuilt: check:doc-formula-expressions, check:dts-closure, check:dual-build-cjs-loads, check:lean-entry-closure, check:sourcemap-no-sources-content — CI measures them built), 1 at its own exit 3 = GOVERNED (check-governed-merges --test); the seat's derivation on the head lists 31 command lines for the three paths, the battery check:pm-dispatch-gates not among them (consistent with the dev's deviation); dispatch-gates flags the head's tree one commit behind origin/main (scripts/check-dev-prereqs.mjs moved at 9ddaa067) — a family file this PR does not touch; the queue build measures on the merged tree.

② Semver level

Not applicable — nothing published moves; skip-changeset measured.

③ Boundary flags

open_questions: one — wire pnpm check:pm-expected-skips into lint.yml (A on this PR / B sibling / C leave): answered B, a sibling non-governed card filed by the seat, #18358 (lint.yml only, one run: pnpm check:pm-expected-skips step beside the check:pm-* siblings; SERIAL behind this PR; region-parallel with #18356 on lint.yml, the second lander merges origin/main; foldable with #18356 only if both are dispatchable together — #18356 must not wait on this PR's approval), because widening a governed PR after its four-piece is hung re-opens the review on a new head for a workflow line the seat lands in-seat anyway; C is refused for the reason the dev gives. Five deviations answered: lint.yml not edited — accepted (the surface named it out); :629's third clause dropped — accepted (AGENTS.md :504 carries the fact, the ⛔ clause verbatim, 119 B ≤ 120); exit 4 judges skips only, other conclusions printed — accepted (the bar's success half is the seat's own read of the same listing; the header says so); the report cannot carry its own read-back author — accepted (read back by the seat: os-zhuang); the battery not derived — accepted (the seat's derivation agrees). Two seat premises owned: the card cited a platform-readings 「a skip is not a pass」 line that has no verbatim carrier (the nearest are AGENTS.md §7 and review-checklist.md :43) — a citation error in the grading; the defect stands on :629's own words; and the grading's "five names" for the recurring-skip family was a remembered count — the measured union over ten landed heads is eleven. Out of scope, noted, not filed: two REQUIRED contexts (Build Core, Temporal Conformance) skip on every PR head and are judged only on the queue build — by design, documented in ci.yml's filter contract. Landing: governed — the four-piece hangs here (this record, the 速读终稿 below, the ACCEPT on #18308, needs-user-decision, reviewer hotlong requested — os-zhuang is this PR's author under the seat's current write identity and cannot be requested, per #18350); ⛔ this seat writes no approving review; ruling C after an authorized APPROVED — record on the current head, --pair 0, every check success or a rostered skip (read with the tool this PR ships), clear needs-user-decision, ready through the CCR route, auto-merge SQUASH. #18349 (SKILL.md :513 / :523) is region-parallel on this file; whichever lands second merges origin/main.

Implemented-by: claude/issue-18308-enqueue-bar-expected-skips
Reviewed-by: session_01HZfg2AwVX191qCizp88gQr

VERDICT: PASS


Generated by Claude Code

Copy link
Copy Markdown
Contributor Author

维护者速读(终稿)— PR #18357 / #18308

改了什么:入队门槛原文「PR 上每一个 check 全绿」在本仓库永远不成立——路径过滤的 job 在每个 PR head 上都以 skipped 结束(十个已落地 head 实测,每个带 8–19 个 skipped),章程里却没有任何一行说哪些 skip 是正常的,每个席位每次落地都凭记忆重新判一遍。修法:SKILL.md :629 原地改为「入队资格 = 每个 check 为 success 或预期 skip(名单:check-expected-skips.mjs),⛔ 不是 required 子集」(112 → 119 字节,812/812 不变,⛔ 句逐字保留;被挤掉的第三句「required 集是队列强制的地板」这一事实 AGENTS.md :504 已载)。新增 scripts/pm/check-expected-skips.mjs:11 个「按设计会 skip」的 check 名字以数据形式声明一次(所在 workflow、job、门的种类、一句机制),自检把每一行钉在活的 workflow YAML 上(job 存在、名字一致、带 if:if: 拼出所声明的门、ci.yml filter 输出保留 || 'true' 放宽);对任一 head 的 check-runs 逐条判——名单内的 skip 是预期,名单外的 skip 点名并分类(同 suite 有失败 ⇒ 依赖跳过,否则 ⇒ 过滤漏判;裸的 matrix 模板名(dollar-brace matrix.shard 拼写) ⇒ 展开前被跳过);退出码 0 全预期 / 4 有名单外 skip / 3 未测(sha 解析不了、无 check-run、有 check 还在跑——永不读成 0)。只读,结构上钉死不能写。

验证:本席在该 head 的独立 worktree 上重跑:自检 99/99;ESLint 0;ratchet 812/812、:629 119 B;id-lint、frame-sync、self-test-wired 绿;--pair 18357 0;受管面读数 GOVERNED(仅 SKILL.md)。实跑:PR #18352 head 36 个 check(25 成功 · 11 skip)⇒ 0;PR #18351 head 34 个(18 · 16)⇒ 0;垃圾 sha ⇒ HTTP 422、exit 3;本 PR 自己的 head 在 check 未跑完时 ⇒ exit 3 并点名未完成的 run(拒答不是通过,在工具自己的 PR 上看到)。dev 记录 50 条门禁:44 条 exit 0,5 条未测(dist/ 读者,formula 未构建,CI 构建后实测),1 条是受管面读数本身的 exit 3。

要你做的:审 PR #18357,同意即 APPROVE(⚠️ 本席现在以 os-zhuang 身份写入,PR 作者是 os-zhuang,只能请 hotlong 审;见 #18350);之后由本席按裁定 C 落地。

顺带:dev 问要不要把 pnpm check:pm-expected-skips 接进 lint.yml——答 B:另立非受管卡(仅 lint.yml,串行于本 PR 之后,与 #18356 同文件可并行),不扩本受管 PR。本席定级时引用的 platform-readings「a skip is not a pass」一行并不存在(最近的是 AGENTS.md §7),已在记录里认领;缺陷本身成立。


Generated by Claude Code

@hotlong
hotlong marked this pull request as ready for review September 16, 2026 06:38
@hotlong
hotlong enabled auto-merge September 16, 2026 06:38
@hotlong
hotlong added this pull request to the merge queue Sep 16, 2026

Copy link
Copy Markdown
Contributor Author

Ruling-C landing provenance — skills seat (signed off, 留守 on this PR), session session_01HZfg2AwVX191qCizp88gQr, 2026-09-16T06:39Z. Governed rules layer (SKILL.md :629 — the enqueue bar names expected skips — with the new scripts/pm/check-expected-skips.mjs and its package.json script): the authorized APPROVED review is hotlong's 5219283981 at 2026-09-16T06:37Z on the current head 7a1f99eadd251d788058ebf0f93731a39c722770 (not dismissed) — the record 5691464077 PASS is on that same head, check-clause2-carriers.mjs --pair 18357 exits 0 (C6-RECORD names the record on this head), every check on the head reads green (43 check-runs: 32 success · 11 skipped, every skip in the roster — read with the very tool this PR ships, check-expected-skips.mjs --head 7a1f99ea, exit 0), mergeable_state: clean. The seat cleared needs-user-decision at 2026-09-16T06:39Z (read back: documentation + size/xl + dependencies + skip-changeset). The approver pre-empted the landing strokes: ready_for_review by hotlong at 2026-09-16T06:38Z, auto_merge_enabled by hotlong at 2026-09-16T06:38Z (the stored method reads merge, as the register says it always does; the queue rule enforces SQUASH); the added_to_merge_queue event reads 2026-09-16T06:39Z; the queue ref refs/heads/gh-readonly-queue/main/pr-18357-* read 1 at 2026-09-16T06:39Z. ⛔ No approving review was written by this seat; the queue is the only landing path; merged_at and the single-parent squash are the landing readings, posted on #18308. Region-parallel note: PR #18363 (SKILL.md :513 / :523 / :641) is open on the same file in other regions and merges origin/main after this lands if the queue asks for it.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

dependencies Pull requests that update a dependency file documentation Improvements or additions to documentation size/xl skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

3 participants