Skip to content

pm(check-expected-skips): the roster of jobs allowed to skip is a hand copy of ci.yml's if: gates and reds on every new or renamed job — derive the roster from the workflow #26439

Closed

Description

@objectstack-fleet

Filing gate: ③ maintainer-directed. Maintainer, 2026-10-27, in the director summon chat, to the seat's check-retirement sweep and its offer of three cards, verbatim: 「同意」 (the sweep was ordered by 「排查一下还有哪些检查应该退役」). Filed by the director seat (session_01KrKXQVvgYk2AJ4VkqMobyb, ledger objectstack#12708, sweep record 6433263738). ⛔ Not a claim. Batch-of: 11 (director seat, 2026-10-27). Dedupe: 600 newest open + closed issues grepped for the check's file name → 0 unless stated. Part of #26431. Reader: domain:skills / devx (scripts/pm/**, a seat-protocol surface). Dedupe: #26111 (closed — one instance of exactly this red, Build UI Deps missing from the roster) → the class, not the instance.

Measured: scripts/pm/check-expected-skips.mjs:264 EXPECTED_SKIPS lists job names that may report skipped and, per job, the kind of if: gate it carries; its self-test auditRoster (:402) re-reads ci.yml. The roster also hard-codes the shard sizes (/3, /8, /16 at :316, :330, :359). #26111 (2026-10-26): a job added in #25963 was missing, so every PR with an empty ui scope went red until the roster was edited. Wired at lint.yml repo-tooling (check:pm-expected-skips).

Wanted: derive the roster from ci.yml itself — a job whose if: references the filter outputs or the two per-PR events is an expected skipper; matrix sizes read from the matrix: blocks — keeping the gate's real question ("was this skip expected, or did a required job silently not run?") and removing the hand list; the self-test proves the derivation on the live file. Acceptance: adding or renaming a gated job in ci.yml needs no edit in scripts/pm; --self-test green; check:ci-filter-parity and check-required-contexts unchanged. Size: S. Clause-②: no. Metadata-protocol: none.

Activity

  1. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: audit line · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-27T05:10Z

    ⛔ Not a claim, ⛔ not a dispatch. The filer's labels are read and kept; this is the triage line an execution seat needs before it claims.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01ADHkmSrRBdu9MdC6fc33Uu
    Account: os-steve (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/project-thread-ct165q (the card thread's harness push branch, self-reported at 2026-10-27T10:39Z — the measured platform exception to claude/issue-N-slug)
    Worktree: objectstack-issue-26439
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: scripts/pm/check-expected-skips.mjs (EXPECTED_SKIPS, auditRoster, shard sizes) + its self-test; ⛔ not .github/workflows/** (stop on breach; explain in the report)
    Container & model: S, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier scripts/pm/check-expected-skips.mjs: no path mandate; the seat's judgment for a gate-internal derivation), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6434315596
    Premise: holds (seat re-measure on origin/main c8ed4c99, recorded in round-open marker 6439678845 context and the dispatch order)
    Serial constraints cleared: none — seat 2's #26316 is scripts/pm/check-governed-queue-guard.mjs, #26334 scripts/pm/dispatch-gates.mjs, #26071 .github/workflows/** + prose lines; none names check-expected-skips.mjs

  3. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26439,
      "status": "done",
      "branch": "claude/project-thread-ct165q",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26648",
      "session": "session_01ADHkmTBKk6ks5yi6zYDatg",
      "premise_still_valid": true,
      "summary": "Deleted the hand roster (EXPECTED_SKIPS, GATE_KINDS, gateSpellings, auditRoster) in scripts/pm/check-expected-skips.mjs and derive it instead: deriveGatedSkips admits a job whose job-level if: carries a top-level && conjunct that is a recognised gate term (filter output with the || 'true' widening, pull_request/merge_group excluded, a pull_request action excluded, a PR label read), under its raw name:; deriveNonPrEventSkips is kept and both share one scan. Every one of the 16 hand rows falls out of the rule (roster 18 → 20 names on 7c34e5dc2, 0 refused); the 2 new names are live misses on main today: 'Plan Test Core shards' (ci.yml test-plan) and 'Delete the reapable branches' (merged-branch-reaper.yml reap), each exit 4 on main, exit 0 here. Hypothesis correction: shard sizes are not read from matrix: blocks; the skipped check-run carries the raw name:, so the sizes vanish with the list. The self-test now judges the measured heads against a frozen fixture tree, so no live gated job name is pinned and an add/rename in ci.yml needs no edit in scripts/pm (proved on disk: main's self-test reds on the rename, this head's stays green).",
      "tests": "node scripts/pm/check-expected-skips.mjs --self-test at 98a3dc80: exit 0, '206 cases pass' (was 173). On-disk one-off in scratch worktrees (ci.yml build-docs renamed 'Build Docs Site' + a new core-gated job): main self-test exit 1 ('the check-run name moved; correct the row'), new-job skip exit 4, renamed skip exit 4, old-name skip exit 0 (false OK); this head: self-test exit 0, new 0, renamed 0, old 4. Defect still reds: 'TypeScript Type Check' skipped → exit 4 on main and here. Non-vacuity spot-check (scratch copy, reverted): dropping the needs:filter check fails 1 case; making jobGate admit everything fails 12+ cases. No permanent ablation (script, not a tested runtime behaviour).",
      "gates": "dispatch-gates --commands at 98a3dc80: 31 families; all 31 exit 0 (incl. pnpm check:pm-expected-skips, pnpm check:ci-filter-parity, pnpm check:pm-dispatch-gates 'fast 1935 cases pass'); --ran: '31 derived, 31 run, 0 NOT-MEASURED, 0 UNRUN' (a DERIVED zero). Also pnpm check:required-contexts exit 0; eslint --no-inline-config on the file exit 0; check:nul-bytes exit 0. ci-filter-parity and required-contexts do not read this file (git grep: 0 hits), so their output is unchanged by construction. PR check-runs: in_progress at report time (not waited on). Ran list: node scripts/check-closing-keyword-parity.mjs :: exit 0 | node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 | node scripts/check-comment-mask-corpus.mjs :: exit 0 | node scripts/check-declaration-mirrors.mjs :: exit 0 | node scripts/check-declaration-mirrors.mjs --self-test :: exit 0 | node scripts/check-self-test-wired.mjs :: exit 0 | node scripts/check-self-test-wired.mjs --self-test :: exit 0 | node scripts/check-self-test-workflow-commands.mjs :: exit 0 | node scripts/check-self-test-workflow-commands.mjs --self-test :: exit 0 | node scripts/check-whole-set-label-write.mjs :: exit 0 | node scripts/check-whole-set-label-write.mjs --self-test :: exit 0 | node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0 | node scripts/pm/bare-root-worklist.mjs --self-test :: exit 0 | pnpm check:agent-test-spelling :: exit 0 | pnpm check:bash32-floor :: exit 0 | pnpm check:ci-filter-parity :: exit 0 | pnpm check:cli-command-ids :: exit 0 | pnpm check:cross-package-test-inputs :: exit 0 | pnpm check:driver-memory-census :: exit 0 | pnpm check:entry-guard :: exit 0 | pnpm check:gitlink-declared :: exit 0 | pnpm check:nul-bytes :: exit 0 | pnpm check:parse-guard :: exit 0 | pnpm check:pm-expected-skips :: exit 0 | pnpm check:pnpm-filter-targets :: exit 0 | pnpm check:pnpm-flag-spellings :: exit 0 | pnpm check:ratchet-remedy-authority :: exit 0 | pnpm check:refd-timer-probe :: exit 0 | pnpm check:scripts-symbol-anchors :: exit 0 | pnpm check:watch-hint-literal :: exit 0 | pnpm check:pm-dispatch-gates :: exit 0",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0 — no MCP GitHub tool called (reads were header-less public REST GETs via curl)",
      "api_writes": "2 — fleet-write relay pr_create (objectstack-ai/objectstack#26648, draft, assignee os-steve, label skip-changeset; read back identical) and this os-dev-report comment via post-stamped.mjs; plus git push (not REST)",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: none · noted, not filed — the file's self-test has the verdict handshake but not the battery-name floor of AGENTS.md 'Writing a --self-test'; unchanged here",
        "carrier: none · noted, not filed — node scripts/measure-self-test-floor.mjs --self-test exits 1 naming scripts/pm/check-prior-rulings.mjs and scripts/pm/dispatch-gates.mjs (handshake census); not this diff's files, not a wired check"
      ],
      "deviations": "A mis-scoped shell line (a variable set inside a backgrounded && list) wrote two empty stray files at the container root, /pmdg.pid and /ran.list; the safety check refused their removal. Outside the repo, ephemeral container; nothing in the tree. The dispatch-gates run was repeated once to capture its exit code (first run's exit was not recorded).",
      "line_budget": "scripts/pm/check-expected-skips.mjs 1786 → 1950 lines (+654/-490); not a ratcheted surface",
      "files_changed": [
        "scripts/pm/check-expected-skips.mjs"
      ],
      "forced_test_edits": "none outside the file; the in-file self-test is rewritten; dispatch-gates.self-test.mjs's 'check-expected-skips.mjs:137 self-test-reads' pin is kept by holding the header at the same line count"
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #26648 comment 6441044699 · domain:skills#1 · 2026-10-27T11:44Z · ready + auto-merge armed (not governed).

  5. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:skills#1 · session_01ADHkmSrRBdu9MdC6fc33Uu · 2026-10-27T11:57Z — PR #26648 merged through the queue (merge commit 55b92731c); the card closed by its Fixes line; pm:dispatched stripped in this act.

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

Metadata

Metadata

Assignees

Labels

area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedomain:skillspriority:p2Medium: important, M3tooling

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions