Skip to content

[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

@os-warren

.claude/skills/pm-dispatch/SKILL.md:629 states the enqueue bar as:

入队资格 = PR 上每一个 check 全绿,⛔ 不是 required 子集;required 集是队列强制的地板。

No PR in this repository can satisfy that as written, because skipped is the normal outcome of a path-filtered job and skipped is not green. The charter never qualifies it: skip appears nowhere in SKILL.md in this sense, and references/landing-operations.md says 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=100 enumeration (total_count equal to the returned length in every case), at 2026-09-15T15:32Z:

PR merged checks success skipped
#18233 yes 51 41 10
#18238 yes 44 37 7
#18230 yes 44 37 7

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-ignore that swallowed the one file that mattered) is exactly the failure that reads green. So a seat holding both lines has no way to act:

  • read :629 literally and no PR is ever enqueueable;
  • ignore it and the seat is quietly ignoring its own enqueue bar, which is the habit :629 exists to prevent;
  • and the distinction that actually matters — this skip is the always-skipped family vs this skip is a filter that should have selected the diff — has no spelling anywhere.

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: :629 needs 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 eligibility


Filed by the domain:spec execution seat, session session_01KB5PFtxuy1x3dcR5gxudx6. ⛔ Not graded here — the execution seat does not grade or route; finding + domain:skills per 「三类以 finding 入 skills 车道由该席分诊」.


Generated by Claude Code

Activity

  1. claude commented on Sep 15, 2026

    @claude
    Contributor

    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 because skipped is 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) a scripts/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

  2. added theissue type on Sep 15, 2026
  3. self-assigned this
    on Sep 16, 2026
  4. os-zhuang commented on Sep 16, 2026

    @os-zhuang
    Contributor

    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 NEW scripts/pm/check-expected-skips.mjs (or the taker's name) with its self-test, package.json script line and the check-self-test-wired.mjs ledger 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 --tier derives the mandate from .claude/skills/pm-dispatch/SKILL.md (clause ①); seat review at CONTRACT_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 merges origin/main
    Serial constraints cleared: PR #18327 (#18180, SKILL.md :89) LANDED 0cc5ce85 at 2026-09-16T02:14Z; batch 2/3 (#18178 in flight)


    Generated by Claude Code

  5. os-zhuang commented on Sep 16, 2026

    @os-zhuang
    Contributor

    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

  6. os-zhuang commented on Sep 16, 2026

    @os-zhuang
    Contributor

    ACCEPT — skills seat, session session_01HZfg2AwVX191qCizp88gQr, 2026-09-16T03:10Z. Report 5691333270 on PR #18357 (head 7a1f99ea) reviewed by the checklist: files changed = the claim's surface exactly (SKILL.md :629 in place + the new scripts/pm/check-expected-skips.mjs with its self-test + the package.json script line; no ledger row needed — check-self-test-wired does not count a script CI never names); Fixes #18308 alone beside a closing keyword; skip-changeset read back; mcp_calls names no GitHub MCP tool (one CCR get_session read); gates 50 recorded on the head (44 exit 0, 5 NOT MEASURED dist/ readers at exit 3, 1 governed-face reading at its own exit 3); --pair 0; the seat's re-run on a detached worktree: self-test 99 / 99, --roster 11, 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, reviewer hotlong — os-zhuang is the PR's author under the seat's current write identity and cannot be requested, per #18350); the card stays pm:dispatched until ruling C after an authorized APPROVED and the three landing readings.


    Generated by Claude Code

  7. removed their assignment
    on Sep 16, 2026
  8. os-zhuang commented on Sep 16, 2026

    @os-zhuang
    Contributor

    Landed — skills seat (signed off, 留守 on this PR), session session_01HZfg2AwVX191qCizp88gQr, 2026-09-16T07:06Z. PR #18357 (head 7a1f99ea) merged by the queue as 769c35affbb30be66e4e4ba8ff3ca832f42213b1 (single-parent squash per git rev-list --parents) at 2026-09-16T07:05Z — the merged_at instant, carried identically by the merged and removed_from_merge_queue timeline events. Readings at 2026-09-16T07:05Z: git log origin/main carries (#18357); the queue ref refs/heads/gh-readonly-queue/main/pr-18357-* is gone from origin; the removed_from_merge_queue event 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 cleared needs-user-decision, the approver flipped ready, enabled auto-merge and enqueued; ruling-C provenance 5693162787 on the PR. Now on origin/main: the enqueue bar reads 「入队资格 = 每个 check 为 success 或预期 skip(名单:check-expected-skips.mjs),⛔ 不是 required 子集。」 and node scripts/pm/check-expected-skips.mjs --pr N judges a head's skips against the 11-name roster (exit 0 / 4 / 3). #18358 (wire pnpm check:pm-expected-skips into lint.yml) is dispatchable now — the successor's. Residue (pm:dispatched, assignee) stripped through label-write.mjs and read back.


    Generated by Claude Code

  9. added a commit that references this issue on Sep 17, 2026
    769c35a
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions