Skip to content

tooling: root scripts/ is about 462k lines, 20 scripts are referenced from nowhere, 22 root check:* aliases are called by no workflow, hook or script, the same gate is spelled two ways, and 5 check-* scripts have no --self-test #26091

Closed

Description

@objectstack-fleet

Filing gate ③: a maintainer-directed task. Maintainer, 2026-10-26, verbatim: 「完整的评估本项目, 还有哪些可以优化的地方。包括 ci 和文档」 then 「使用 pm-dispatch 技能创建 issue,需要决策的立为决策卡。」 and 「低优先级的先不考虑」. Batch-of: 19 (repository evaluation 2026-10-26, session_019a9XCWsbMFp75REzthE6cs; 9 decision cards + 10 execution cards). ⛔ Filed bare: grading, domain:* and area:* are triage's. ⛔ Not a claim. Reader: the domain:devx execution seat (gate-class scripts route to domain:spec per the lane table; triage decides) — one os-dev, one or two PRs. Dedupe: REST list (439 issues), grep scripts/ |orphan|unreferenced|dead script → #25921 (open, ui dead modules — different tree); #25920 (open, dispatched, domain:devx: "tooling surface: 15 check:/census: scripts no workflow runs … 原则:删大于加") — that card's readings are the ui/ tree's scripts/ (135 files, 105k lines, 126 root scripts). This card is the root scripts/ (453 files). Same mechanism, different tree; the ruling direction on #25920 (删大于加) is carried here. New for the root tree.

谁付代价(业务筛): every seat that reads scripts/ to find the gate it tripped reads through one-off census and audit scripts that nothing runs; two spellings of the same gate (node scripts/x.mjs in CI, pnpm check:x in docs) mean a fix to one is not a fix to the other.

Measured (HEAD 0d83ee8; static reachability over package.json, .github, .githooks, turbo.json, configs and other scripts)

  • scripts/: 453 files (291 .mjs, 120 .json, 88 under adr-anchors/, 48 under pm/); wc -l over the 316 entry points → 461,961 lines. Largest: scripts/pm/check-half-states.mjs 35,243, pm/dispatch-gates.mjs 16,271, pm/dispatch-gates.self-test.mjs 14,017, check-adr-0087-registration.mjs 9,038, check-type-check-coverage.mjs 8,351.
  • Reachability of the 316 entry points: 270 named by a package.json / workflow / hook / turbo / config; 26 reached only from other code; 20 referenced only in comments or docs, or nowhere: scripts/ablation-replace.mjs, scripts/audits/14096-…census.mjs, scripts/audits/14423-* (4 files), scripts/audits/14744-* (2), scripts/bench/permission-bench.mts, scripts/bench/runtime-publish-gate.bench.mts, scripts/codemod/view-to-viewitem.mjs, scripts/measure-markdown-ts-blocks.mjs, scripts/measure-partial-retirement-annotation.mjs, scripts/measure-reserved-identity-name-census.mjs, scripts/measure-return-propagating-durability-seams.mjs, scripts/measure-self-test-floor.mjs, scripts/pm/fleet-git-credential.sh, scripts/pm/fleet-roster.mjs, scripts/pm/measurement-claim-triage.mjs, scripts/qa/qa-rollup.mjs.
  • Root package.json: 198 scripts, 172 check:*; all 172 are exercised by CI by name or by inlined command (see the sibling card on inlined commands), but 22 root scripts are invoked by no workflow, hook or other script, e.g. check:adr-0087-registration, check:undeclared-dep-imports, check:keyed-text-bounds, check:system-context-census, check:rest-log-declared (the dev re-derives the list; some are run by inlined node scripts/… lines, which is the dual-spelling case, not an orphan).
  • --self-test: 271 of 316 have it; of the 183 check-* scripts, 5 do not: check-changeset-fixed.mjs, check-node-version.mjs, check-release-notes.mjs, check-service-providers.mjs, docs-audit/check-drift-comment.mjs.

Wanted

  1. For each of the 20: confirm zero references with a positive control, then delete (git keeps them) — ⛔ not an archive/ folder; a one-off audit script's reading already lives in its docs/audits/*.md. Any that a docs/audits file cites as "re-run with" keeps the citation pointing at the commit that held it.
  2. One invocation spelling: CI calls pnpm check:<name> (or pnpm run), never node scripts/<file> directly, so package.json is the one map; delete the root aliases nothing calls after that normalization, or wire them where the gate family that owns them runs.
  3. --self-test for the 5 check-* scripts, following AGENTS.md 「Writing a --self-test」.
  4. ⛔ No gate weakened or removed on this card: a script that IS a gate stays; the card deletes only what nothing reaches.

Acceptance

  • The reachability census re-run on the PR → 0 unreferenced entry points; 0 root check:* with no caller; for f in scripts/check-*.mjs; do grep -q -- --self-test $f || echo $f; done → empty.
  • pnpm check:pm-skill-ratchet and the other repo-tooling lanes green.

Size: M. Clause-②: no. Metadata-protocol: none.

Related

#25920 (open, dispatched: the ui tree's version), #25921 (open), the inlined-commands card in this batch.

Activity

  1. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade — tooling · tech-debt · priority:p2 · domain:devx · area:devpath · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-26T12:12Z

    ⛔ Not a claim, ⛔ not a dispatch. On the maintainer's 「完整的评估本项目…」 / 「低优先级的先不考虑」 (repository evaluation, Batch-of 19). Low priorities were excluded at filing, so the execution cards grade p2.

    • Remove only what is measured as unreferenced (workflow, hook, script, package.json, docs). A gate-class script that turns out to be wired somewhere stays, and the PR lists it. Adding --self-test to the five scripts is in scope. ⛔ No gate is removed by this card: a check nobody runs is either wired up or retired with the maintainer's word.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 4 · items 1 and 3 · 2026-10-26T14:54Z
    Session: session_01Q4MDXRbEJCNdPAP4SiXwp9 (devx seat 2) · card thread session_01LbdJFR3AmcKLZKQafYE1tN
    Account: os-steve
    Branch: claude/project-thread-wq49tp (the harness-pinned branch of the card thread; it names no issue, so this claim is the identity record; amended on spawn)
    Worktree: objectstack-issue-26091
    Domain: domain:devx
    Seat: domain:devx#2 (seat post #20163)
    File surface: Wanted 1 — delete, after a zero-reference proof with a positive control, the root scripts/ entry points the card lists as unreferenced (any that turns out referenced stays and is reported); Wanted 3 — add --self-test to scripts/check-changeset-fixed.mjs, scripts/check-node-version.mjs, scripts/check-release-notes.mjs, scripts/check-service-providers.mjs, scripts/docs-audit/check-drift-comment.mjs; the three root package.json aliases check:node-version, check:release-notes, check:service-providers rewritten to the repo's node scripts/X.mjs --self-test && node scripts/X.mjs form so check-self-test-wired.mjs sees the new self-tests run (widened by the seat on the thread's measurement; check-changeset-fixed.mjs and docs-audit/check-drift-comment.mjs are called straight from workflows, so their self-tests move to the Wanted 2 round); docs/audits/*.md only where a "re-run with" citation must point at the commit that held a deleted script. ⛔ Wanted 2 (one invocation spelling) is NOT in this claim: it edits .github/workflows/** / ci.yml and the root package.json aliases, held while ci.yml is in flight elsewhere; it stays on this card for a later round. ⛔ No gate removed or weakened (stop on breach; explain in the report)
    Container & model: M, mode:thread, model: default tier (TIER_DEFAULT, from dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6415695862
    Premise: holds on origin/main — all 30 listed paths exist; check-governed-merges.mjs --test <30 paths> → governed false; three scripts/pm/* candidates still have one textual hit each (with-fleet.sh, gh-pages.mjs, dispatch-gates.mjs), so the dev proves each is a comment-only mention or keeps the file
    Serial constraints cleared: 38 open PRs read, none touches the 30 paths or root package.json; #25920 (seat 1) is the ui/ tree's scripts/, disjoint


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26091,
      "status": "done",
      "branch": "claude/project-thread-wq49tp",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26235",
      "session": "session_01LbdJFR3AmcKLZKQafYE1tN",
      "premise_still_valid": true,
      "summary": "Wanted 1 and 3 only (Part of; Wanted 2 stays on the card). Wanted 1: zero-reference census over the whole tree at 7111e14ac9 (file stem, positive control scripts/check-nul-bytes.mjs, 32 files hit) -> 11 of the card's 20 deleted, their docs/audits re-run citations and one dispatch-gates.mjs docblock row repointed at commit 7111e14ac9; 9 kept because something reaches them (ablation-replace.mjs: os-dev.md + dogfood README procedure; 14744-...-census.mjs: COMPOUND_ANCHOR_LEDGER row; view-to-viewitem.mjs: ADR-0017; measure-return-propagating-durability-seams.mjs and measure-self-test-floor.mjs: AGENTS.md; fleet-git-credential.sh: with-fleet.sh executes it; fleet-roster.mjs: maintainer-ordered roster generator; qa-rollup.mjs: RUNNER.md; measure-partial-retirement-annotation.mjs: the dispatch-gates slow-tier seamCard, measured). Wanted 3: --self-test (roster floor + battery-count pin + verdict handshake, copied from check-agent-model-declared.mjs) for check-node-version, check-release-notes, check-service-providers, wired through their root aliases as the seat amended the claim; check-changeset-fixed and docs-audit/check-drift-comment deferred to the Wanted 2 round because only a .github/workflows edit can wire them.",
      "tests": "Old vs new copies of the three refactored scripts run on one fixture tree: baseline green and six red mutations (page missing+unlisted+section unreachable; provider typo+missing slot; one mismatched setup-node step; EOL, unknown and empty pins) -> stdout, stderr and exit identical in all 9 runs. Self-tests: check-release-notes 10 cases, check-service-providers 11, check-node-version 14, each exit 0 (a wrong line expectation in the node-version table first went red, then was corrected, so the floor is live). Slow tier of check:pm-dispatch-gates at 2e05d6c9a: 2182 cases pass, exit 0 (at 21ddadb5f it failed 16 seamCard cases, which is why measure-partial-retirement-annotation.mjs was restored). Scripts only: no ablation owed.",
      "gates": "Local, at 2e05d6c9a: dispatch-gates --commands derived 54 families; all 54 run, every exit 0 captured before any pipe; --ran -> 54 run, 0 NOT-MEASURED, 0 UNRUN. Card Acceptance: pnpm check:pm-skill-ratchet exit 0; card for-loop over scripts/check-*.mjs prints only scripts/check-changeset-fixed.mjs (deferred); census re-run: 11 deleted files have 0 callers. CI check-runs on PR 26235: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "line_budget": "+838 / -4370 = 5208 changed lines over 19 files, OVER the 3000 human-merge threshold (AGENTS.md Multi-agent discipline 7 (c)): lands by an authorized approval or a human merge",
      "files_changed": 19,
      "deviations": [
        "File surface widened by the seat (claim 6419156010 amended): root package.json aliases check:node-version, check:release-notes, check:service-providers now run --self-test first.",
        "Wanted 3 delivered for 3 of 5 scripts: check-self-test-wired reds an unwired --self-test and forbids a SELF_TEST_RUN_OTHERWISE row, and the other two are wired only by .github/workflows lines (forbidden this round).",
        "Census measured 9 kept, not the card's 0: each keeper's caller is named in the PR body."
      ],
      "mcp_calls": "0",
      "api_writes": "2 relay writes: POST /repos/objectstack-ai/objectstack/dispatches (pr_create, run 40359471541), and this os-dev-report comment through post-stamped. Plus 3 git pushes (not REST). Write budget 3 strokes: push, pr_create, report.",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: #26091 (Wanted 2 round) · --self-test for scripts/check-changeset-fixed.mjs and scripts/docs-audit/check-drift-comment.mjs, wired in cut-rc.yml, release.yml, validate-deps.yml and docs-drift-check.yml",
        "carrier: #26091 · 14744-before-update-per-row-value-census.mjs can go only with its COMPOUND_ANCHOR_LEDGER row and the docblock counts in scripts/pm/dispatch-gates.data.mjs; view-to-viewitem.mjs only with an ADR-0017 edit (Tier H)"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    devx seat 2 · review: ACCEPT → PR #26235 (items 1 and 3, Part of) comment 6421573282 on head 9bc8449c06. A maintainer approval (os-zhuang) is on that head, and every check is green or skipped. Not governed. Landing: ready + auto-merge. The four larger deletions held back by 9bc8449c follow in a second PR on the same branch after this one merges.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26091,
      "status": "done",
      "branch": "claude/project-thread-wq49tp",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26266",
      "session": "session_01LbdJFR3AmcKLZKQafYE1tN",
      "premise_still_valid": true,
      "summary": "PR 2 of the Wanted 1 split, opened after #26235 merged. It deletes the four held-back scripts: measure-markdown-ts-blocks.mjs, measure-reserved-identity-name-census.mjs, pm/measurement-claim-triage.mjs and bench/runtime-publish-gate.bench.mts. The one dispatch-gates.mjs docblock mention now names commit 7111e14ac9. The census was re-run on main at 81bba6c3f and the four have no callers. Correction to the first report: the body of #26235 still says 11 deleted / 5208 lines, but what landed is 7 deleted / 2264 lines (head 9bc8449c); this PR carries the other 4.",
      "tests": "dispatch-gates.self-test.mjs uses runtime-publish-gate.bench.mts only as a string for pure predicates. Fast tier at 77e4b93c5: 1917 cases pass. Both tiers: 2182 cases pass.",
      "gates": "Local, at 77e4b93c5: 33 derived families, all 33 run, every exit 0 captured before any pipe; --ran reports 33 run, 0 NOT-MEASURED. check:pm-dispatch-gates --slow exit 0 (2182 cases). check:type-check-debt exit 0 (26 errors, unchanged). CI on PR 26266: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "line_budget": "+2 / -2942 = 2944 changed lines over 5 files, under the 3000 human-merge threshold",
      "files_changed": 5,
      "deviations": [
        "The branch took origin/main by merge (3c78e2e59) rather than a reset plus force-push, because the branch name is not claude/issue-* and AGENTS.md section 3 criterion 1 then classes it as shared. The diff against main is the five files only."
      ],
      "mcp_calls": "0",
      "api_writes": "2 relay writes for this PR: POST /repos/objectstack-ai/objectstack/dispatches (pr_create, run 40374044814) and this os-dev-report comment through post-stamped. Plus 2 git pushes (not REST).",
      "open_questions": [],
      "out_of_scope_findings": [
        "carrier: #26091 (Wanted 2 round) · --self-test for check-changeset-fixed.mjs and docs-audit/check-drift-comment.mjs, wired through the workflows"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 26, 2026

    @objectstack-fleet
    ContributorAuthor

    devx seat 2 · review: ACCEPT → PR #26266 (PR 2 of the items 1 + 3 split, Part of) comments 6423645921 + round 2 on head ffcb44dda8. Every check is green or skipped. Not governed. Landing: ready + auto-merge.


    Generated by Claude Code

  7. 4 remaining items

  8. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26091,
      "status": "in_progress",
      "branch": "claude/project-thread-y83svr",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/26409",
      "session": "session_01ADHkmQq9EYQdTQwmRutQTS",
      "premise_still_valid": false,
      "summary": "PR 2 of #26086, also carrying #26091 Wanted 2; Part of both. Step census on main e677770a: 9 workflow steps inline a command byte-identical to a root check:* alias (the card counted 16; the other partial matches are different invocations, where CI enforces the inline form). 7 lint.yml steps now run pnpm check:NAME; the 2 left (check-links ADR links, board-snapshot self-test) sit in jobs deliberately built without pnpm. check-system-context-census's self-test wiring pin now pins the alias. Root check:* aliases with no caller: 11 -> 4 (three symbol-anchor aliases, pm-closed-card-sweep; their steps are split on purpose). #26091 also still lacks a --self-test for check-changeset-fixed.mjs, so neither card is closed by this PR.",
      "tests": "7 aliases run locally via pnpm -s check:NAME: all exit 0. check-system-context-census --self-test: all cases passed; negative control (lint.yml line removed) -> 'FAIL WIRING: lint.yml invokes this gate through its root alias'. pnpm exit-code passthrough checked with a script exiting 3 -> exit 3.",
      "gates": "dispatch-gates --commands: 56 families, all 56 exit 0 captured before any pipe; --ran: '56 derived famil(ies) accounted for — 56 run, 0 NOT-MEASURED'. CI check-runs on the PR pending at report time.",
      "line_budget": "+27 / -23 over 2 files (.github/workflows/lint.yml, scripts/check-system-context-census.mjs)",
      "deviations": [
        "7 replacements, not the card's 16: only 9 steps duplicate an alias exactly, and 2 of those are in no-pnpm jobs",
        "#26091 carried as Part of, not Fixes: 4 uncalled aliases remain (claim forbids removing or adding gates) and check-changeset-fixed.mjs --self-test is outside this claim",
        "two pointer comments ('Invoked as node rather than through a pnpm check:* alias') corrected because the touched steps made them false"
      ],
      "files_changed": [
        ".github/workflows/lint.yml",
        "scripts/check-system-context-census.mjs"
      ],
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "write_budget": "git push (branch recreated after PR 1 merge); 1 relay pr_create (#26409, draft, assignee os-steve, label skip-changeset); 2 relay comments (this report on #26086 and #26091)",
      "mcp_calls": "read-only since PR 1 report: mcp__github__issue_read x3, mcp__github__pull_request_read x2; no write tool",
      "api_writes": "0 direct — all GitHub writes through the fleet-write relay",
      "open_questions": [
        {
          "question": "How should #26091's last 4 uncalled aliases be settled?",
          "options": [
            "A: leave them as the local one-command form and accept them as callerless",
            "B: delete them (CI runs every leg directly)",
            "C: call them from CI and drop the split steps"
          ],
          "recommendation": "A, because the split steps are deliberate and the claim forbids removing gates; B needs a ruling"
        }
      ],
      "out_of_scope_findings": [
        "carrier: #26091 · --self-test for scripts/check-changeset-fixed.mjs still owed (deferred from Wanted 3)"
      ],
      "governed": "Tier H (.github/workflows/**): draft; waits for a GOVERNED_APPROVERS approval (os-zhuang, hotlong)"
    }

    Generated by Claude Code

  9. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    devx seat 2 · released: PR #26409 (Part of #26091) merged as e0d63174, and its +/- lines on main match the reviewed head 491624d2 (2 files). Wanted 2 is partly done: 7 lint.yml steps now run their pnpm check:* alias.

    What remains on this card, for the next claim:

    1. Wanted 2's rest: the 4 root check:* aliases with no caller (three symbol-anchor aliases and pm-closed-card-sweep) sit in deliberately split steps; wire or delete each, with the reason.
    2. Wanted 3: check-changeset-fixed.mjs --self-test.
    3. ⚠️ The GATE INVOCATION IDIOM note at the top of lint.yml (L109–150) states that direct node scripts/... is the house idiom, and three gates pin node <self> in their self-tests. Wanted 2 reverses that, so the PR that finishes it rewrites the note and those pins in the same change.

    Back to pm:queue with no assignee.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 9 · 2026-10-27T03:21Z
    Session: session_01Q4MDXRbEJCNdPAP4SiXwp9 (devx seat 2) · card thread cmsg_01FdL1XeUyvVNxLreh3F4Qi95YovdFSHTxz132KjPG4TAa
    Account: os-steve
    Branch: claude/project-thread-y83svr (the card thread's harness-pinned branch, reset to main after PR #26409 merged; it names no issue, so this claim is the identity record)
    Worktree: objectstack-issue-26091
    Domain: domain:devx
    Seat: domain:devx#2 (seat post #20163)
    File surface: the rest of Wanted 2 and Wanted 3 as listed in the release comment 6432917865: (1) the 4 root check:* aliases with no caller (three symbol-anchor aliases, pm-closed-card-sweep): wire each where its gate family runs, or delete it with the reason, root package.json plus the workflow step that owns it; (2) scripts/check-changeset-fixed.mjs --self-test per AGENTS.md 「Writing a --self-test」, wired where check:self-test-wired expects it; (3) rewrite the GATE INVOCATION IDIOM note in .github/workflows/lint.yml (L109–150) and every step comment that points at it, plus the node <self> wiring pins in check-aggregator-roster, check-ci-filter-parity and check-doc-frontmatter self-tests, so the house rule reads "CI calls pnpm check:<name>" with the pins asserting the alias. ⛔ No gate removed or weakened (a pin moves, it does not go). ⛔ No ci.yml, no ui/ path. ⛔ Tier H (.github/workflows/**): draft until a GOVERNED_APPROVERS approval; the dev neither readies nor arms auto-merge
    Container & model: M, mode:thread, model: default tier (TIER_DEFAULT, from dispatch-gates --tier: no path-derived mandate), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — repository evaluation 2026-10-26; triaged p2
    Thread-read: 6432917865
    Premise: on main (after #26409 at e0d63174) the 4 caller-less aliases, the missing check-changeset-fixed self-test and the IDIOM note are as the release comment lists (the dev re-reads each first)
    Serial constraints cleared: #26419 (#26083, this seat) edits the setup steps of lint.yml, other lines; whichever lands second merges main


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 26091,
      "status": "pr_open_draft",
      "branch": "claude/project-thread-y83svr",
      "pr": 26482,
      "session": "https://claude.ai/code/session_01ADHkmQq9EYQdTQwmRutQTS",
      "premise_still_valid": true,
      "summary": "Final PR for #26091 (Fixes). Rewrote lint.yml GATE INVOCATION IDIOM note: a gate step runs its root check:* alias; direct node only for a different invocation, a job with no pnpm, or a legacy alias-less step (not swept, #25919). 7 self-test pins moved from node <self> to the alias (both lint.yml run line and package.json value asserted). 3 symbol-anchor aliases now called (collector step split into 4 steps; resolver got its own check:symbol-anchors alias); check:pm-closed-card-sweep removed (only CI caller is the no-pnpm half-state-patrol job, which keeps both legs inline). check-changeset-fixed.mjs got a 12-case --self-test, run via new check:changeset-fixed alias in validate-deps.yml and both release.yml lanes.",
      "tests": "Callerless root check:* keys 4 -> 0; scripts/check-*.mjs without --self-test 1 -> 0; all 9 touched aliases exit 0; negative controls red (alias leg removed, alias changed, judge rules disabled).",
      "gates": "dispatch-gates --commands: 77 derived on merged tree 44a3660e (main 67461403); 77/77 exit 0; --ran: 0 NOT-MEASURED, 0 UNRUN. First round red check:pm-dispatch-gates 2/1901 (resolver marker contradicting corpus paths; release.yml-only direct-node family) - both fixed.",
      "line_budget": "+334/-147 across 13 files",
      "deviations": [
        "Pins moved on 7 gates, not 3 (census found check-docs-nav-label and the 3 symbol-anchor corpora pin the same way)",
        "release.yml touched (2 lines) so check-changeset-fixed keeps one pull_request-reached family",
        "Resolver self-test split into its own alias/step instead of prefixing the corpus aliases",
        "check:pm-closed-card-sweep deleted rather than wired (no-pnpm job)",
        "Rule scoped: ~60 direct node lines for 33 alias-less scripts left as-is (ci.yml out of bounds; #25919); their pointer comments stay accurate under the new note"
      ],
      "files_changed": [
        ".github/workflows/lint.yml",
        ".github/workflows/release.yml",
        ".github/workflows/validate-deps.yml",
        ".github/workflows/half-state-patrol.yml",
        "package.json",
        "scripts/check-changeset-fixed.mjs",
        "scripts/check-aggregator-roster.mjs",
        "scripts/check-ci-filter-parity.mjs",
        "scripts/check-doc-frontmatter.mjs",
        "scripts/check-docs-nav-label.mjs",
        "scripts/check-adr-symbol-anchors.mjs",
        "scripts/check-scripts-symbol-anchors.mjs",
        "scripts/check-spec-docblock-symbol-anchors.mjs"
      ],
      "dogfood_battery": "n/a (repo tooling)",
      "write_budget": "2 relay writes this round (pr_create, this comment)",
      "mcp_calls": "0 GitHub MCP writes; reads only (PR read-back)",
      "api_writes": 0,
      "open_questions": [
        "Tier H: needs a GOVERNED_APPROVERS approval (os-zhuang or hotlong) before ready"
      ],
      "out_of_scope_findings": [
        "33 scripts still invoked by direct node in CI with no alias (incl. ci.yml); convert when each step is next rewired"
      ]
    }

    Generated by Claude Code

  12. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    ContributorAuthor

    devx seat 2 · released: PR #26482 (Fixes #26091) merged as c91544a4 through the merge queue. Its +/- lines on main match the reviewed head 44a3660e in all 13 files. With #26409 (PR 2 of #26086) and this PR, Wanted 2 and 3 are done:

    • The 3 symbol-anchor aliases are wired into lint.yml, and check:pm-closed-card-sweep is deleted (its only CI caller has no pnpm).
    • check-changeset-fixed --self-test exists and runs via check:changeset-fixed in validate-deps and release.yml.
    • The GATE INVOCATION IDIOM note now states that CI calls the root alias, and 7 self-tests pin that wiring.
      The card closed on Fixes; pm:dispatched comes off.

    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions