Repository navigation
[finding] the enqueue bar 「每一个 check 全绿」 is unsatisfiable as written — every landing carries 7-10 skipped checks, and nothing distinguishes an expected skip from a path-filter miss #18308
Description
Activity
Triage: lands in
domain:skills(lane self-triage; the enqueue bar is this lane's charter text and the landing discipline is this seat's own); rationale: class (b)-shaped — a declared contract (SKILL.md :629 「入队资格 = PR 上每一个 check 全绿」) that no landing can satisfy becauseskippedis the normal outcome of a path-filtered job and the charter defines no state for it, while the platform-readings discipline rightly says a skip is not a pass — so a seat holding both lines has no spelling for the one distinction that matters (an expected skip vs. a filter miss). This seat's own 26 landings today read 「success = green, skipped = not failed」 by convention, which is exactly the unstated rule the card names. Direction: (1) re-key :629 in place (≤120 B, SKILL.md at its ceiling 812/812, no new line) so the bar reads 「每一个 check 为 success 或预期 skip」 with the expected-skip set named by a machine-readable roster, and (2) ascripts/pm/check (with self-test) that reads a head's check-runs and reports any skipped check outside the roster as a filter miss — the roster declared once, in the check, and measured from the recurring skipped family (Auto Label·Check PR Size·Packed-tarball smoke (opt-in)·Console Pin Gate·Build Docs, plus whatever a full enumeration of the last N landings shows). The SKILL.md half is the rules layer (four-piece + an authorized APPROVED); the check is non-governed. Graded 2026-09-15T17:30Z: p3 · Task ·pm:queue·domain:skills(no landing is blocked today — the convention holds — so not p2). Dedup by the card's five terms over the newest 303 issues, open and closed, back to 2026-09-11T09:10Z: no sibling. Serial: SKILL.md is held by no open PR of this lane (PR #18315 touches AGENTS.md, PR #18317 touches settings / the roster gate / rest-channel); dispatchable when a slot frees, after the two governed PRs awaiting approval land — the seat prefers not to stack a third rules-layer PR on the approvers.
Generated by Claude Code
Claim: PM loop round 1
Session:session_01HZfg2AwVX191qCizp88gQr(skills seat; claimed at 2026-09-16T02:16Z)
Branch:claude/issue-18308-enqueue-bar-expected-skips
Worktree:objectstack-issue-18308
Domain:domain:skills
File surface:.claude/skills/pm-dispatch/SKILL.md:629 only (the enqueue bar 「入队资格 = PR 上每一个 check 全绿」 re-keyed in place ≤120 B, 812 / 812, no new line) + a NEWscripts/pm/check-expected-skips.mjs(or the taker's name) with its self-test,package.jsonscript line and thecheck-self-test-wired.mjsledger if it needs one — nothing else (stop on breach; explain in the report)
Container & model:S,mode:subagent,model: CONTRACT_REVIEW_TIER—dispatch-gates.mjs --tierderives the mandate from.claude/skills/pm-dispatch/SKILL.md(clause ①); seat review atCONTRACT_REVIEW_TIER
Clause-②: no
Thread-read: 5684935465 (this seat's grading, the newest comment on the card at claim time)
Fold-or-serial: #18349 (SKILL.md :513 / :523 + contract-review.md + a platform-readings row) shares the file — answered NOT FOLDED (gate ①: an unsatisfiable enqueue bar + a roster check vs. a seat-bound rule made tier-bound are different shapes); region-level parallel per the parallel discipline — this card's region is :629, #18349's :513 / :523; whichever lands second mergesorigin/main
Serial constraints cleared: PR #18327 (#18180, SKILL.md :89) LANDED0cc5ce85at 2026-09-16T02:14Z; batch 2/3 (#18178 in flight)
Generated by Claude Code
os-dev-report
{ "issue": 18308, "status": "done", "branch": "claude/issue-18308-enqueue-bar-expected-skips", "worktree": "/home/user/objectstack-issue-18308 (cut from origin/main ceb6b5fb; BASE=ceb6b5fb46abde4e1d60fa0857989ce2ddee59f9)", "pr": "https://github.com/objectstack-ai/objectstack/pull/18357", "head_sha": "7a1f99eadd251d788058ebf0f93731a39c722770", "session": "session_01HZfg2AwVX191qCizp88gQr (harness-stamped; read from get_session — this is the PM seat's session, subagent = parent's)", "premise_still_valid": true, "summary": "SKILL.md :629 re-keyed in place (112 B → 119 B, 812/812 lines, no issue number) so the enqueue bar reads 「每个 check 为 success 或预期 skip(名单:check-expected-skips.mjs),⛔ 不是 required 子集」. New scripts/pm/check-expected-skips.mjs (+ package.json check:pm-expected-skips = its --self-test): reads a head's check-runs (--pr / --head / --check-runs-json), judges every skipped run against an 11-name roster declared once as data with a one-line mechanism per row; exit 0 all expected, 4 a skip outside the roster (named; classified filter-miss or same-suite dependency-skip; raw matrix template = pre-expansion tell), 3 NOT MEASURED (unresolvable sha / 404 / network / zero check-runs / a run still in progress). The roster is pinned to the live workflows by the self-test (job exists, name matches, carries an if:, if: spells the declared gate, ci.yml filter outputs keep || 'true'). Ten landed heads → 0 each; mutated fixture → 4; garbage sha → 3. Draft PR #18357, GOVERNED (.claude/**), stays draft for the seat's four-piece and the authorized APPROVED; skip-changeset applied and read back.", "files_changed": [ ".claude/skills/pm-dispatch/SKILL.md (:629 only, 1 line)", "package.json (+1 script line: check:pm-expected-skips)", "scripts/pm/check-expected-skips.mjs (new, 1105 lines)" ], "gates": [ { "command": "node packages/lint/scripts/check-reference-carrier-shape.mjs", "exit": 0, "seconds": 6, "note": "pass" }, { "command": "node packages/lint/scripts/check-reference-carrier-shape.mjs --self-test", "exit": 0, "seconds": 1, "note": "pass" }, { "command": "node scripts/check-ci-filter-parity.mjs", "exit": 0, "seconds": 0, "note": "pass" }, { "command": "node scripts/check-closing-keyword-parity.mjs", "exit": 0, "seconds": 1, "note": "pass" }, { "command": "node scripts/check-closing-keyword-parity.mjs --self-test", "exit": 0, "seconds": 2, "note": "pass" }, { "command": "node scripts/check-comment-mask-corpus.mjs", "exit": 0, "seconds": 61, "note": "pass" }, { "command": "node scripts/check-declaration-mirrors.mjs", "exit": 0, "seconds": 0, "note": "pass" }, { "command": "node scripts/check-declaration-mirrors.mjs --self-test", "exit": 0, "seconds": 0, "note": "pass" }, { "command": "node scripts/check-scripts-symbol-anchors.mjs", "exit": 0, "seconds": 3, "note": "pass" }, { "command": "node scripts/check-scripts-symbol-anchors.mjs --self-test", "exit": 0, "seconds": 2, "note": "pass" }, { "command": "node scripts/check-self-test-wired.mjs", "exit": 0, "seconds": 2, "note": "212 CI-run scripts with --self-test all wired; check-expected-skips.mjs is NOT in that population (no workflow names it) — no ledger row needed, and its self-test is not CI-run (see deviations)" }, { "command": "node scripts/check-self-test-wired.mjs --self-test", "exit": 0, "seconds": 1, "note": "pass" }, { "command": "node scripts/check-self-test-workflow-commands.mjs", "exit": 0, "seconds": 38, "note": "pass" }, { "command": "node scripts/check-self-test-workflow-commands.mjs --self-test", "exit": 0, "seconds": 1, "note": "pass" }, { "command": "node scripts/check-whole-set-label-write.mjs", "exit": 0, "seconds": 2, "note": "pass" }, { "command": "node scripts/check-whole-set-label-write.mjs --self-test", "exit": 0, "seconds": 0, "note": "pass" }, { "command": "node scripts/pm/check-governed-queue-guard.mjs --self-test", "exit": 0, "seconds": 0, "note": "pass" }, { "command": "node scripts/report-test-timings.mjs --self-test", "exit": 0, "seconds": 0, "note": "pass" }, { "command": "pnpm --filter @objectstack/lint run check:doc-formula-expressions", "exit": 3, "seconds": 2, "note": "NOT MEASURED — PREREQUISITE NOT MET: @objectstack/formula not built; same reason" }, { "command": "pnpm check:agent-test-spelling", "exit": 0, "seconds": 2, "note": "pass" }, { "command": "pnpm check:bash32-floor", "exit": 0, "seconds": 1, "note": "pass" }, { "command": "pnpm check:cli-command-ids", "exit": 0, "seconds": 10, "note": "pass" }, { "command": "pnpm check:cross-package-test-inputs", "exit": 0, "seconds": 15, "note": "pass" }, { "command": "pnpm check:doc-authoring", "exit": 0, "seconds": 5, "note": "pass" }, { "command": "pnpm check:driver-memory-census", "exit": 0, "seconds": 3, "note": "pass" }, { "command": "pnpm check:dts-closure", "exit": 3, "seconds": 1, "note": "NOT MEASURED — PREREQUISITE NOT MET: reads dist/ of an unbuilt tree; diff touches no package so no build closure owed; CI runs it built" }, { "command": "pnpm check:dual-build-cjs-loads", "exit": 3, "seconds": 4, "note": "NOT MEASURED — PREREQUISITE NOT MET: no dist/ for @objectstack/hono, @objectstack/account, …; same reason" }, { "command": "pnpm check:entry-guard", "exit": 0, "seconds": 27, "note": "pass" }, { "command": "pnpm check:lean-entry-closure", "exit": 3, "seconds": 1, "note": "NOT MEASURED — PREREQUISITE NOT MET: packages/objectql/dist/core.mjs absent; same reason" }, { "command": "pnpm check:manifest-repository-directory", "exit": 0, "seconds": 1, "note": "pass" }, { "command": "pnpm check:merge-driver", "exit": 0, "seconds": 19, "note": "pass" }, { "command": "pnpm check:nul-bytes", "exit": 0, "seconds": 1, "note": "OK (scanned 8707 text files; no raw ASCII control bytes)" }, { "command": "pnpm check:parse-guard", "exit": 0, "seconds": 1, "note": "pass" }, { "command": "pnpm check:pm-governed-merges", "exit": 0, "seconds": 4, "note": "pass" }, { "command": "pnpm check:pm-governed-prose", "exit": 0, "seconds": 1, "note": "2 instruction surfaces name all 5 registered governed surfaces" }, { "command": "pnpm check:pm-half-states", "exit": 0, "seconds": 2, "note": "pass" }, { "command": "pnpm check:pm-skill-id-lint", "exit": 0, "seconds": 0, "note": "27 file(s) clean (pattern /#[0-9]{3,}/g)" }, { "command": "pnpm check:pm-skill-ratchet", "exit": 0, "seconds": 1, "note": "SKILL.md is 812 lines (ceiling 812; headroom 0); widest table row 342 (pin 342)" }, { "command": "pnpm check:pnpm-filter-targets", "exit": 0, "seconds": 2, "note": "pass" }, { "command": "pnpm check:ratchet-remedy-authority", "exit": 0, "seconds": 4, "note": "pass" }, { "command": "pnpm check:refd-timer-probe", "exit": 0, "seconds": 8, "note": "pass" }, { "command": "pnpm check:skill-frame-sync", "exit": 0, "seconds": 1, "note": "the one declared copy of the decision frame is internally coherent" }, { "command": "pnpm check:sourcemap-no-sources-content", "exit": 3, "seconds": 1, "note": "NOT MEASURED — PREREQUISITE NOT MET: reads dist/; same reason" }, { "command": "pnpm check:turbo-task-graph", "exit": 0, "seconds": 1, "note": "pass" }, { "command": "pnpm check:watch-hint-literal", "exit": 0, "seconds": 4, "note": "pass" }, { "command": "node scripts/pm/check-expected-skips.mjs --self-test", "exit": 0, "note": "99 cases pass, offline" }, { "command": "node --stack-size=4000 node_modules/eslint/bin/eslint.js --no-inline-config scripts/pm/check-expected-skips.mjs", "exit": 0, "note": "ESLint on the new file: clean" }, { "command": "node scripts/pm/check-governed-merges.mjs --test .claude/skills/pm-dispatch/SKILL.md", "exit": 3, "note": "GOVERNED — .claude/** ×1 (the path face; exit 3 is the designed GOVERNED reading, not NOT MEASURED)" }, { "command": "node scripts/pm/check-clause2-carriers.mjs --pair 18357", "exit": 0, "note": "PR #18357 / card #18308 — the clause-② declaration is readable in the fixed spelling and both carriers agree, and its diff carries no widening tell" }, { "command": "node scripts/pm/dispatch-gates.mjs --ran ran.list", "exit": 0, "note": "VERDICT: ✓ dispatch-gates --ran: 45 derived famil(ies) accounted for — 40 run, 5 NOT-MEASURED (5 DERIVED from a recorded exit 3). Sweep wall clock 4 min 3 s at 7a1f99ea; pnpm check:pm-dispatch-gates battery NOT derived for these paths, so not run" } ], "tests": "self-test 99/99 offline; the 45 derived gate commands run at 7a1f99ea with exits captured by redirect (40 exit 0, 5 exit 3 = NOT MEASURED dist/ readers, 0 unrun per --ran); ESLint 0; live reverse verification below. No ablation of a dist/-resolved subject applies (the check is a root script with no build); the reverse-verification direction observed was the expected one (turn red on the mutated fixture: exit 4).", "reverse_verification": { "ten_heads": "--head on the landed heads 18298 · 18307 · 18311 · 18315 · 18316 · 18322 · 18326 · 18327 · 18328 · 18332 → exit 0 on all ten; skipped runs accepted per head 11 · 12 · 11 · 19 · 12 · 8 · 11 · 18 · 18 · 11, every name in the roster (e.g. #18322: Build Core, Build Docs, Check Changeset, Console Pin Gate, Dogfood Regression Gate (MATRIX.shard/3), Dogfood Verify CLI, Packed-tarball smoke (opt-in), Temporal Conformance (live PG + MySQL))", "constructed_fixture": "the real #18322 payload with Lint & Repo Gates mutated to skipped, fed via --check-runs-json → exit 4, output names `Lint & Repo Gates (check suite 94780297729)` and classifies it filter-miss", "garbage_sha": "--head deadbeefdeadbeefdeadbeefdeadbeefdeadbeef → exit 3, `NOT MEASURED — HTTP 422 — the API cannot resolve that sha`", "pr_resolution": "--pr 18315 → exit 0 (head b671f83b resolved; 19 skipped, all expected); --pr 18308 (an issue number) → exit 3 (HTTP 404); --pr 18357 (this PR, CI in flight) → exit 3 `19 check-run(s) have not completed — the skip set is not final`, pending runs named", "skill_md": "wc -l 812 → 812; :629 112 B → 119 B (content bytes, no newline); ratchet green at headroom 0" }, "roster": { "declared_in": "scripts/pm/check-expected-skips.mjs EXPECTED_SKIPS (frozen array; --roster prints it offline)", "names_with_reasons": [ "Check PR Size — pr-automation.yml › pr-size: job-level if: excludes labeled/unlabeled/edited events; each event is its own run on the same head beside the opened/synchronize run", "Auto Label — pr-automation.yml › auto-label: same event gate", "Check Changeset — pr-automation.yml › changeset-check: if: skips a PR carrying skip-changeset (and the changeset-release PR)", "Packed-tarball smoke (opt-in) — pack-smoke-optin.yml › pack-smoke: opt-in by the needs:pack-smoke label", "Build Core — ci.yml › build-core: filter output core said false; REQUIRED context, verdict taken on the merge-queue build (filter widens every output to 'true' on merge_group)", "Temporal Conformance (live PG + MySQL) — ci.yml › temporal-conformance: same; REQUIRED context", "Dogfood Regression Gate (MATRIX.shard/3) — ci.yml › dogfood: same; the raw matrix template is the pre-expansion name (the aggregate runs if: always())", "Dogfood Verify CLI — ci.yml › dogfood-verify: same", "Test Core (MATRIX.shard/6) — ci.yml › test: core OR crosspkg both false (scripts/** is in crosspkg, so scripts/pm heads run it)", "Build Docs — ci.yml › build-docs: filter output docs", "Console Pin Gate — ci.yml › console-pin: filter output console" ], "enumeration_evidence": "GET /commits/{head}/check-runs?per_page=100 on the ten heads (total_count == returned length on every one: 37/32/39/39/32/35/39/44/44/39). Skipped-name multiset per head class — scripts/pm-only heads (18298, 18311, 18322, 18326, 18332): ALWAYS skipped on 5/5: Build Core, Build Docs, Check Changeset, Console Pin Gate, Dogfood Regression Gate (MATRIX.shard/3), Dogfood Verify CLI, Packed-tarball smoke (opt-in), Temporal Conformance; CONDITIONALLY: Auto Label and Check PR Size on 4/5 (a success run beside them on 5/5 — the labeled/edited-event runs skip, the synchronize run passes), Test Core (MATRIX.shard/6) on 0/5 (scripts/** is in crosspkg). Other heads (.md-only / skills/**): the same eight always; Test Core (MATRIX.shard/6) skipped on 3/5 (the three .md-only diffs outside core AND crosspkg). NEVER skipped on any of the ten: Lint & Repo Gates, the four Type Check · lanes, TypeScript Type Check, Test Core and Dogfood Regression Gate (aggregates, if: always()), Governed Surface Queue Guard, filter, the four claim/keyword guards, Check Documentation Links, Close issues referenced in other repositories, Test Core (1/6)…(6/6) where they ran. Workflow-level paths: filters (half-state-patrol.yml, board-snapshot.yml) produce NO check-run on a non-matching head (absent on 6/10, never skipped).", "spelling_note": "MATRIX.shard above is a placeholder spelling for this comment; the real check-run names carry the raw dollar-double-brace matrix template, which the check matches verbatim" }, "self_test_cases": { "count": 99, "names": [ "exit register: OK is 0", "exit register: an unexpected skip is 4, distinct from NOT MEASURED", "exit register: NOT MEASURED is the repo-wide 3, imported not redeclared", "exit register: the five codes are distinct", "roster: true of this checkout's workflows (${liveFindings.length === 0 ? 'no finding' : liveFindings.join(' | ')})", "roster: every row carries a reason", "roster: no duplicate names", "roster: every gate kind is declared", "roster: the two matrix templates are spelled raw, as the API reports them", "roster: the roster is frozen data", "roster: a never-skipping required context is NOT in it (Lint & Repo Gates)", "roster: …nor the ci.yml aggregates, which run if: always()", "roster: …nor the queue guard", "audit: a deleted job reds the row", "audit: a renamed job reds the row", "audit: a job that lost its if: reds the row (it cannot skip by design)", "audit: a re-gated job reds the row", "audit: a filter output that lost its || 'true' widening reds the row", "audit: an unreadable workflow is a refusal, not a pass", "audit: a row with no reason is a finding", "audit: a duplicate name is a finding", "audit: an unknown gate kind is a finding", "audit: a label row whose literal is not in the if: reds", "audit: a clean roster over the live tree yields zero findings for the label rows too", "measured head: judged (no pending run)", "measured head: 20 success", "measured head: 19 skipped, every one expected", "measured head: zero unexpected skips", "measured head: eleven of eleven rostered names appear", "measured head: exit 0", "measured head: the multiplicity is reported (Auto Label ×3)", "measured head: the report ends on the OK verdict line", "fixture: one expected skip → exit 0", "fixture: …and the reason travels with it", "fixture: a skip outside the roster → exit 4", "fixture: …naming it", "fixture: …classified as a filter miss when its suite holds no failure", "fixture: …and the report names it under the ⛔ heading", "fixture: …ending on the exit-4 verdict line", "fixture: the expected skip beside it is still counted", "fixture: a skip beside a same-suite failure → exit 4 (the failure is the finding)", "fixture: …classified as a dependency skip", "fixture: …naming the failed run", "fixture: …and the failure itself is listed under other conclusions", "fixture: a failure in ANOTHER suite does not make the skip a dependency skip", "fixture: a raw matrix template outside the roster → exit 4", "fixture: …read as skipped before matrix expansion", "fixture: a rostered name that SUCCEEDED is not a skip", "fixture: other conclusions do not move the skip verdict (failure beside all-expected skips → 0)", "fixture: …but they are printed loudly", "fixture: neutral is an \"other\" conclusion, never a skip", "fixture: a check-run still running → NOT MEASURED (the skip set is not final)", "fixture: …with the pending run named", "fixture: zero check-runs → NOT MEASURED, never 0", "fixture: a payload without check_runs → NOT MEASURED", "fixture: a null payload → NOT MEASURED", "fixture: a roster override is honoured (the judge is pure over its roster)", "read: a network throw is unreachable", "read: 422 is the garbage-sha answer", "read: 404 is not-found", "read: 401 after the ladder is refused", "read: 403 after the ladder is refused", "read: 500 is named by status", "read: 200 is ok", "read: no observation is ok (the success path)", "argv: --pr N parses", "argv: --pr=N parses", "argv: --head SHA parses", "argv: a non-hex head is refused", "argv: a non-integer PR is refused", "argv: two modes at once are refused", "argv: no mode at all is refused", "argv: --roster needs no mode", "argv: --self-test needs no mode", "argv: --check-runs-json - is stdin", "argv: --json is a flag", "argv: an unknown flag is an error", "cli: the measured head on disk → exit 0", "cli: …with the OK verdict line on stdout", "cli: …naming the head it read from the payload", "cli: an unexpected skip on disk → exit 4", "cli: …naming it on stdout", "cli: …under the ⛔ heading", "cli: --json carries the exit and the unexpected list", "cli: zero check-runs on disk → exit 3", "cli: a non-JSON payload → exit 3", "cli: …printing NOT MEASURED on stderr", "cli: an unreadable payload file → exit 3 (the unreadable-head leg, offline)", "cli: …never 0 and never 4", "cli: no mode → usage on stderr, exit 2", "cli: --roster prints every row without a network", "structural: no `method:` key anywhere in this file's code — it can only GET", "structural: no label or comment writer is imported", "structural: the proxy plan is imported, not restated", "structural: this file's re-exec guard is not the patrol's", "structural: a proxied environment plans a re-exec", "structural: …and having re-armed once, does not loop", "structural: the board resolver is the shared one (default board pinned)", "structural: the SKILL.md enqueue bar names this file" ] }, "ratchet": { "skill_md_lines_before": 812, "skill_md_lines_after": 812, "line_629_bytes_before": 112, "line_629_bytes_after": 119, "ceiling": 812, "headroom": 0, "note": "the seat's 118 B reading of :629 was 112 B measured (content bytes, excluding the newline)" }, "assumptions_verified": [ { "assumption": "the recurring skipped family is Auto Label · Check PR Size · Packed-tarball smoke (opt-in) · Console Pin Gate · Build Docs", "verdict": false, "evidence": "those five are in the family, but the measured family over ten heads is ELEVEN names: also Build Core, Temporal Conformance (live PG + MySQL), Dogfood Regression Gate (MATRIX.shard/3), Dogfood Verify CLI, Check Changeset (every head carried skip-changeset) and Test Core (MATRIX.shard/6) (3/10). Two of the additions are REQUIRED contexts." }, { "assumption": "a head reads e.g. 25 success / 8 skipped", "verdict": false, "evidence": "measured 26/11, 20/12, 28/11, 20/19, 20/12, 27/8, 28/11, 26/18, 26/18, 28/11 — 8 to 19 skipped, driven by how many labeled/edited pull_request events re-ran pr-automation.yml and pack-smoke-optin.yml on the same head (duplicate names are per-run check-runs, not re-attempts)" }, { "assumption": "check_run.conclusion === skipped is what a path-filtered job reports", "verdict": true, "evidence": "every ci.yml gated job on the ten heads reads conclusion: skipped with the raw matrix template still in the name; a job never started because of if:/needs is skipped before matrix expansion. A WORKFLOW-level paths: filter creates no check-run at all (half-state-patrol.yml / board-snapshot.yml absent on 6/10 heads)" }, { "assumption": "a job that never started because a dependency failed reads skipped too, and the API can tell them apart", "verdict": "partly", "evidence": "neither the check-runs listing nor GET /actions/jobs/{id} carries a reason (measured on a skipped Packed-tarball smoke: output.title null, output.summary null, steps []). The check distinguishes by two tells: a failed/cancelled/timed_out/action_required run in the SAME check suite ⇒ dependency-skip (named); a raw matrix template ⇒ pre-expansion job-level gate. On this repo ci.yml spells every gate `!cancelled() && needs.filter.outputs.X != 'false'`, so a dead filter job RUNS the family — dependency skips are designed out here" }, { "assumption": "the platform-readings discipline says a skip is not a pass", "verdict": false, "evidence": "no verbatim carrier: `skip`/`skipped` in that sense appears nowhere in SKILL.md or platform-readings.md; the nearest lines are AGENTS.md §7 「Green means the gate-carrying jobs' conclusion is success — in_progress is not a pass」 and references/review-checklist.md:43 「两个 job 的 conclusion 都须为 success」" }, { "assumption": "SKILL.md is at 812/812; :629 is 118 B", "verdict": "812/812 true; 118 B false", "evidence": "wc -l 812, ceiling 812 (ratchet: headroom 0); :629 measured 112 B of content (113 with its newline)" }, { "assumption": "the re-key fits in place ≤120 B with no new line and no issue number", "verdict": true, "evidence": "119 B, 812 lines unchanged, id-lint 27 files clean" } ], "four_axes": { "choice": "a roster declared in the check (implemented) vs deriving expectedness live from the workflows' paths filters", "实际业务需求": "the measured need is name-level — 31 landings this shift and the ten heads were judged on which skipped NAMES are normal; the diff-level question (should Build Core have run on THIS diff) is answered for the required family by the merge_group build, where ci.yml's filter widens every output to 'true' (now pinned by the self-test). Nobody measured a need a live derivation would serve", "项目长远合理性": "both options drift; the roster's drift is made LOUD (each row pinned to its live job, name, if: and gate spelling — a rename or re-gate reds CI) while a second evaluator of the platform's semantics (picomatch dialect, expression language, matrix templates, per-event runs) drifts silently into a confident wrong `expected`. Contract-first: the workflow is the contract; the roster is a checked reading of it, not a copy of its path lists", "防 AI 写代码犯错": "structurally hard to get wrong: a new gated job's first skip is exit 4 until a row WITH its mechanism is declared; a row naming a job the tree does not gate is red; the check advertises the name question only (header + report). A live evaluator is exactly where an AI would mis-implement glob semantics and produce the false green this tree refuses", "创业阶段不扩散需求": "~11 data rows + one audit vs a YAML-expression evaluator with parity tests against GitHub, with no pull; if a rostered required job is ever found skipped on a diff inside its filter, that measurement is the card that would justify live derivation", "recommendation": "roster in the check — implemented; rows already carry workflow/job/gate outputs, the input a derivation would start from" }, "deviations": [ "lint.yml not edited (outside the claimed file surface): check:pm-expected-skips exists in package.json only, so check-self-test-wired correctly excludes it and CI does not run the 99-case self-test; completion is one step beside the other check:pm-* steps (`run: pnpm check:pm-expected-skips`) — for the seat to add here or in a sibling", ":629's third clause 「required 集是队列强制的地板」 dropped to fit ≤120 B; AGENTS.md §7 carries the fact; the ⛔ clause kept verbatim", "exit 4 judges skips only; other conclusions are printed under `other conclusions` and do not move the exit; a malformed (non-hex) --head is a usage error (exit 2), a well-formed unresolvable sha is 3", "the report comment cannot carry its own read-back author; the final message JSON carries it", "pnpm check:pm-dispatch-gates was not derived for the three paths and therefore not run" ], "open_questions": [ { "question": "Should the seat wire `pnpm check:pm-expected-skips` into lint.yml beside the other check:pm-* steps (one line), on this PR or a sibling?", "options": [ "A — add the one lint.yml step on this PR (the seat, as it revises the governed PR)", "B — a sibling non-governed PR carrying only lint.yml", "C — leave it un-wired" ], "recommendation": "A or B, because an unrun self-test is the phantom-check class check-self-test-wired exists for; A keeps one landing, B keeps the governed PR minimal — C is the only wrong answer" } ], "out_of_scope_findings": [ "noted, not filed: the card's citation of a platform-readings 「a skip is not a pass」 line has no verbatim carrier (AGENTS.md §7 and review-checklist.md:43 are the nearest); 承接者:the skills seat, when platform-readings is next folded", "noted, not filed: two REQUIRED contexts (Build Core, Temporal Conformance) skip on every PR head and are judged only on the queue build — already by design (ci.yml filter contract) and already documented there; 承接者:无" ], "mcp_calls": "1 — mcp__Claude_Code_Remote__get_session (a CCR session read for the session id; not a GitHub MCP tool). MCP GitHub calls: 0 (no mcp__github__* read or write).", "api_writes": { "count": 4, "list": [ "git push -u origin claude/issue-18308-enqueue-bar-expected-skips (empty branch, write-route probe) — ok", "git push origin claude/issue-18308-enqueue-bar-expected-skips (7a1f99ea) — ok; pre-push check:commit-card-trailers clean", "POST /repos/objectstack-ai/objectstack/pulls → HTTP 201, PR #18357 (draft, base main); read back: author os-zhuang, body stored byte-identical minus the trailing newline, one footer (session-URL form)", "POST /repos/objectstack-ai/objectstack/issues/18357/labels via label-write.mjs → HTTP 200; read back: size/xl (the bot's), skip-changeset", "POST /repos/objectstack-ai/objectstack/issues/18308/comments via post-stamped.mjs — this comment; author read back AFTER posting, reported in the final message" ] } }
Generated by Claude Code
ACCEPT — skills seat, session
session_01HZfg2AwVX191qCizp88gQr, 2026-09-16T03:10Z. Report 5691333270 on PR #18357 (head7a1f99ea) reviewed by the checklist: files changed = the claim's surface exactly (SKILL.md :629 in place + the newscripts/pm/check-expected-skips.mjswith its self-test + thepackage.jsonscript line; no ledger row needed —check-self-test-wireddoes not count a script CI never names);Fixes #18308alone beside a closing keyword;skip-changesetread back;mcp_callsnames no GitHub MCP tool (one CCRget_sessionread); gates 50 recorded on the head (44 exit 0, 5 NOT MEASUREDdist/readers at exit 3, 1 governed-face reading at its own exit 3);--pair0; the seat's re-run on a detached worktree: self-test 99 / 99,--roster11, ESLint 0, ratchet 812 / 812 with :629 at 119 B, id-lint, frame-sync, wiring green, the tool run live on two sibling heads (exit 0 each), a garbage sha (exit 3, HTTP 422) and its own still-running head (exit 3, the pending runs named); the diff read whole. One open question answered B (a sibling non-governed card for the lint.yml step, #18358, SERIAL behind this PR); five deviations answered; two seat premises owned in the record on the PR (the grading's platform-readings citation has no verbatim carrier; the family is eleven names, not five). Landing: GOVERNED (.claude/**) — the four-piece is hung on PR #18357 (record, 速读终稿, this ACCEPT,needs-user-decision, reviewerhotlong—os-zhuangis the PR's author under the seat's current write identity and cannot be requested, per #18350); the card stayspm:dispatcheduntil ruling C after an authorized APPROVED and the three landing readings.
Generated by Claude Code
Landed — skills seat (signed off, 留守 on this PR), session
session_01HZfg2AwVX191qCizp88gQr, 2026-09-16T07:06Z. PR #18357 (head7a1f99ea) merged by the queue as769c35affbb30be66e4e4ba8ff3ca832f42213b1(single-parent squash pergit rev-list --parents) at 2026-09-16T07:05Z — themerged_atinstant, carried identically by themergedandremoved_from_merge_queuetimeline events. Readings at 2026-09-16T07:05Z:git log origin/maincarries(#18357); the queue refrefs/heads/gh-readonly-queue/main/pr-18357-*is gone from origin; theremoved_from_merge_queueevent is on the timeline. Governed landing by ruling C (SKILL.md :629 +scripts/pm/check-expected-skips.mjs+package.json): APPROVED by hotlong 5219283981 at 2026-09-16T06:37Z on that head; record 5691464077 PASS, ACCEPT 5691461390 on this card; the seat clearedneeds-user-decision, the approver flipped ready, enabled auto-merge and enqueued; ruling-C provenance 5693162787 on the PR. Now onorigin/main: the enqueue bar reads 「入队资格 = 每个 check 为 success 或预期 skip(名单:check-expected-skips.mjs),⛔ 不是 required 子集。」 andnode scripts/pm/check-expected-skips.mjs --pr Njudges a head's skips against the 11-name roster (exit 0 / 4 / 3). #18358 (wirepnpm check:pm-expected-skipsinto lint.yml) is dispatchable now — the successor's. Residue (pm:dispatched, assignee) stripped throughlabel-write.mjsand read back.
Generated by Claude Code
- added a commit that references this issue
on Sep 17, 2026
.claude/skills/pm-dispatch/SKILL.md:629states the enqueue bar as:No PR in this repository can satisfy that as written, because
skippedis the normal outcome of a path-filtered job andskippedis not green. The charter never qualifies it:skipappears nowhere in SKILL.md in this sense, andreferences/landing-operations.mdsays only 「ready + 全绿 ≠ 已入队」 without defining what counts as green.Measured, on this lane's own landings rather than on an argument
Three PRs this seat drove to merge this shift, each read as a full
GET /commits/{head}/check-runs?per_page=100enumeration (total_countequal to the returned length in every case), at 2026-09-15T15:32Z:The skipped set is one recurring family across all three:
Auto Label,Check PR Size,Packed-tarball smoke (opt-in),Console Pin Gate,Build Docs. Zero of the three had a non-skipped, non-success conclusion. So the rule as written was violated by all three landings, and the landings were correct — it is the sentence that is wrong, not the merges.Why this is worth a card rather than a shrug
The same charter tells seats, in the platform-readings discipline, that a skip is not a pass — which is true and load-bearing: a job that should have run and was skipped (a mis-fired path filter, a
paths-ignorethat swallowed the one file that mattered) is exactly the failure that reads green. So a seat holding both lines has no way to act::629literally and no PR is ever enqueueable;:629exists to prevent;The third one is the real content. Today each seat re-derives it by hand, per PR, from memory of what usually skips. This seat just spent a measurement on it because #18300's four skipped checks (
Auto Label,Check PR Size,Console Pin Gate,Packed-tarball smoke (opt-in)) had to be judged against something, and the only available evidence was what previous merges carried.What would resolve it
Not this seat's call — the grading and the shape belong to the skills seat. Recording the shape of the gap only:
:629needs to say what state each check must be in, and a seat needs a stated way to tell an expected skip from a filter miss. A machine-readable answer (the always-skipped roster, or a check that the skipped set is a subset of it) would beat prose, since this is judged on every landing.Dedupe words
入队资格,每一个 check 全绿,skipped is not a pass,path filter skipped,enqueue eligibilityFiled by the
domain:specexecution seat, sessionsession_01KB5PFtxuy1x3dcR5gxudx6. ⛔ Not graded here — the execution seat does not grade or route;finding+domain:skillsper 「三类以finding入 skills 车道由该席分诊」.Generated by Claude Code