Skip to content

ci(lint): shrink lint.yml by 122,702 bytes (510,016 → 387,314), comment lines only - #23064

Merged
objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-23044-lint-yml-size
Oct 12, 2026
Merged

objectstack-fleet[bot] merged 1 commit into
mainfrom
claude/issue-23044-lint-yml-size

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #23044
Clause-②: no

What this does

.github/workflows/lint.yml stood at 510,016 bytes on main @ df7a13792. The card measured GitHub rejecting this file at 513,738 bytes (a workflow-file run with zero jobs, and neither required context reporting), so main had under 3.7 KB of margin. 87% of the file's bytes were YAML comment lines. This PR removes comment lines only and leaves every key and value untouched.

before (df7a13792) after (fc9340b61)
bytes 510,016 387,314 (−122,702, −24.1%)
lines (wc -l) 8,082 6,358
lines whose first non-blank char is # 6,266 4,542
bytes in those lines / share of the file 445,409 / 87.3% 322,707 / 83.3%

(19 of the #-led lines are shell comments inside run: | block scalars. This PR touches none of them.) Changed lines: +136 / −1,860 = 1,996, under the 3,000 human-merge line.

  • 60 per-step rationale blocks became a pointer of one or two lines: # Rationale: SCRIPT header (#cards)., naming the script whose header already carries that rationale.
  • 29 verbatim duplicate copies of a lane note (the same note pasted into each of the eight Lint · * lanes or the four Type Check · * lanes) became a pointer to the first copy. The first copy stays verbatim.
  • 5 step notes from the removed blocks are kept on the pointer, one or two lines each: three ⛔ "self-test only" warnings (prior-ruling reader, release-index currency rewriter, stall-guard headroom), the export-origins ordering note, and the skills-liveness "unfiltered" note that scripts/pm/bare-root-worklist.mjs cites as "stated in the step comment".
  • One file-level note added (9 lines, after the GATE ORDER note). Many removed blocks repeated "it lives in this job because it has no paths filter". That argument is now stated once, at the top of the file.
  • No new docs/ file. Every removed rationale already lives in a script header, so nothing had to move there.

Item 1 of the card (a new check:* size gate) is not built: the dispatch scoped this PR to item 2, because the seat's instrument rule requires the maintainer's words on the card for a new gate and the card quotes none.

How the blocks were chosen (measured)

Every YAML comment block was found with the yaml 2.9.1 Lexer, so a # line inside a block scalar is never treated as a comment. Each block was then resolved to the step it precedes, and the step to the scripts its run: invokes, through the root and package package.json scripts. A block qualified only when both of these hold:

  1. the invoked script has a header (its leading comment) of at least 40 lines, and
  2. every card number the block cites (#NNNN) is also cited by that script file.

119 blocks qualified. The 60 largest were taken, minus two kept on purpose. The typecheck-debt NODE_OPTIONS block stays because it argues the step's own env: coupling. The docs image-tag rewriter block (#9064) stays because scripts/sync-template-versions.mjs quotes it. Every pointer line also carries every card number its removed block cited, so a search of lint.yml for a card still lands on its step. In 58 of the 60 the cards are cited in the script's header. In the other two (check-closing-target-claim.mjs, build-export-origins.ts) they are cited in the script body. The ⛔/⚠️ sentences of each removed block were compared with the script text (3-gram overlap). Where a step-wiring warning was not stated in the script in the same words, it was kept on the pointer.

The full prior text of every removed block remains at df7a13792:.github/workflows/lint.yml.

Proof of no behaviour change

  • YAML data identical. Base and head were each loaded as data by two parsers, and both compare equal:
    • yaml 2.9.1 (parse, strict, uniqueKeys): deep-equal, sha256 of the JSON 2b8d629828681750 on both sides.
    • PyYAML 6.0.1 (safe_load): equal, e04c40c7a827bfbb on both sides.
  • Only comment lines changed. git diff -U0 df7a13792 fc9340b61 has 0 changed lines that are not #-led.
  • Names byte-identical. 14 jobs and 344 steps, with every job name unchanged. That covers the required contexts Lint & Repo Gates and TypeScript Type Check, and all eight Lint · * lanes.

Readers of lint.yml comments (dispatch assumption 4)

Searched: every file under scripts/, packages/ and .claude/hooks/ with a code-level (non-comment) string literal naming lint.yml, .github/workflows or workflows. That is 89 files. They include the candidates the dispatch named:

  • check-comment-mask-corpus and docs-audit/check-drift-comment: these read JS/TS and the docs-drift workflow, not lint.yml comments.
  • check-aggregator-roster, check-step-collectors, check-self-test-wired, check-self-test-workflow-commands and dispatch-gates: these read step structure and run: text.

The scripts that literally read lint.yml text were found as well: the wiring self-tests that includes() the raw text, the check-changeset-no-major job slicer, and check-type-check-coverage's raw typecheck:root / turbo run typecheck regexes.

Measured: a copy of lint.yml with all 6,247 YAML comment lines removed (66,120 bytes, parsed data still identical) was swapped in. 76 reader commands were run against it: 40 of the 43 dispatch-derived commands, the dispatch's check-ci-filter-parity and check:doc-authoring, and 34 commands for the other literal readers. The three derived commands left out were check:pm-dispatch-gates and check:type-check-debt (both heavy, run on the final head below) and check-comment-mask-corpus (it reads JS/TS only). The swap was restored by git checkout HEAD -- and the restore was proved by blob hash.

  • All 76 exited 0, as they did on base.
  • 72 of 76 printed byte-identical output once timings were normalised.
  • The other four changed only prose counts or line numbers, never a verdict:
    • check-whole-set-label-write: mentions in comments, cleared, 12 → 9.
    • check:agent-test-spelling: separators judged 11 → 10.
    • check:pnpm-filter-targets: "more in comments" 62 → 54.
    • check:pnpm-acquisition: line numbers.

So no reader pins a lint.yml comment, and nothing had to be kept for a reader.

Pointer map

Line numbers are base (df7a13792) lines. The table also carries each pointer's card count.

removed (base lines) job step where its rationale lives cards the block cited
568-571 lint-repo-tooling Checkout repository verbatim copy of the note at base line 424, which stays none cited
687-704 lint-repo-tooling Raw control-byte guard scripts/check-nul-bytes.mjs header, 267 lines 7/7 cited there (7/7 in the header)
708-726 lint-repo-tooling Staged gitlinks are declared in .gitmodules scripts/check-gitlink-declared.mjs header, 89 lines 2/2 cited there (2/2 in the header)
940-960 lint-repo-tooling Keyed text-family columns declare their bound (#12147) scripts/check-keyed-text-bounds.mjs header, 204 lines 4/4 cited there (4/4 in the header)
966-994 lint-repo-tooling shell scripts hold the bash 3.2 floor scripts/check-bash32-floor.mjs header, 206 lines 1/1 cited there (1/1 in the header)
1214-1237 lint-repo-tooling Closing-target claim guard self-test scripts/check-closing-target-claim.mjs header, 266 lines 1/1 cited there (0/1 in the header)
1318-1353 lint-repo-tooling Prior-ruling reader self-test scripts/pm/check-prior-rulings.mjs header, 203 lines 1/1 cited there (1/1 in the header); one step note kept
1425-1447 lint-repo-tooling Label-write helper self-test scripts/pm/label-write.mjs header, 183 lines 1/1 cited there (1/1 in the header)
1451-1470 lint-repo-tooling Card-closure helper self-test scripts/pm/close-cards.mjs header, 255 lines 1/1 cited there (1/1 in the header)
1540-1557 lint-repo-tooling Board-snapshot archiver self-test scripts/pm/board-snapshot.mjs header, 309 lines 1/1 cited there (1/1 in the header)
1683-1708 lint-repo-tooling Release-rehearsal clone preflight self-test scripts/pm/release-rehearsal-clone.mjs header, 93 lines 1/1 cited there (1/1 in the header)
1815-1845 lint-repo-tooling Step-collector gate (self-tests that mask each other) scripts/check-step-collectors.mjs header, 197 lines 1/1 cited there (1/1 in the header)
1851-1897 lint-repo-tooling Self-test wiring gate scripts/check-self-test-wired.mjs header, 150 lines 1/1 cited there (1/1 in the header)
2099-2128 lint-repo-tooling Docs frontmatter parses scripts/check-doc-frontmatter.mjs header, 252 lines 3/3 cited there (3/3 in the header)
2217-2259 lint-repo-tooling Platform-object tenancy census matches the tree scripts/check-platform-object-tenancy-census.mjs header, 64 lines 2/2 cited there (2/2 in the header)
2272-2276 lint-repo-tooling Report how many gates never ran verbatim copy of the note at base line 523, which stays none cited
2281-2286 lint-repo-tooling Report how many gates never ran verbatim copy of the note at base line 532, which stays none cited
2316-2319 lint-docs-code Checkout repository verbatim copy of the note at base line 424, which stays none cited
2346-2368 lint-docs-code One h1 per docs page scripts/check-docs-single-h1.mjs header, 144 lines 4/4 cited there (4/4 in the header)
2372-2408 lint-docs-code Docs redirect destinations resolve, and no chains scripts/check-docs-redirects.mjs header, 101 lines 2/2 cited there (2/2 in the header)
2475-2500 lint-docs-code React pages honour the useAdapter() query and result contracts scripts/check-react-page-adapter-contract.mjs header, 175 lines 2/2 cited there (2/2 in the header)
2515-2554 lint-docs-code Docs form-section examples carry a name scripts/check-docs-section-name.mjs header, 207 lines 4/4 cited there (4/4 in the header)
2560-2588 lint-docs-code Published-README links are followable off the docs site scripts/check-published-readme-links.mjs header, 237 lines 1/1 cited there (1/1 in the header)
2728-2768 lint-docs-code Release-index currency version-time rewriter self-test scripts/sync-release-index-currency.mjs header, 118 lines 3/3 cited there (3/3 in the header); one step note kept
2795-2816 lint-docs-code Teaching-corpus lexical anti-drift ratchet scripts/check-corpus-claim-drift.mjs header, 125 lines 4/4 cited there (4/4 in the header)
2820-2848 lint-docs-code Published-skills identifier liveness gate (two legs) scripts/check-skill-identifier-liveness.mjs header, 208 lines 1/1 cited there (1/1 in the header); one step note kept
2917-2947 lint-docs-code Runtime-services indexes enumerate the chapter's real pages scripts/check-runtime-services-index.mjs header, 240 lines 5/5 cited there (5/5 in the header)
3324-3341 lint-docs-code Auth mount-vs-ledger guard scripts/check-auth-mount-ledger.mjs header, 116 lines 3/3 cited there (3/3 in the header)
3481-3497 lint-docs-code Logger receiver-detach guard scripts/check-logger-receiver-detach.mjs header, 141 lines 3/3 cited there (3/3 in the header)
3536-3554 lint-docs-code objectui pin write-ordering guard scripts/bump-objectui.selftest.sh header, 50 lines 1/1 cited there (1/1 in the header)
3607-3611 lint-docs-code Report how many gates never ran verbatim copy of the note at base line 523, which stays none cited
3616-3621 lint-docs-code Report how many gates never ran verbatim copy of the note at base line 532, which stays none cited
3674-3677 lint-ci-engine Checkout repository verbatim copy of the note at base line 424, which stays none cited
3797-3817 lint-ci-engine Post-publish npm verification self-test scripts/release-verify-npm.mjs header, 160 lines 1/1 cited there (1/1 in the header)
3874-3891 lint-ci-engine Workflow status-function guard scripts/check-workflow-status-functions.mjs header, 72 lines 4/4 cited there (4/4 in the header)
3915-3949 lint-ci-engine No whole-set label PUT anywhere in the repo (#10778) + its self-test scripts/check-whole-set-label-write.mjs header, 135 lines 2/2 cited there (2/2 in the header)
3955-4000 lint-ci-engine Cross-repo closer outcome contract scripts/check-cross-repo-closer-outcome.mjs header, 117 lines 3/3 cited there (3/3 in the header)
4006-4026 lint-ci-engine Closing-keyword parser parity scripts/check-closing-keyword-parity.mjs header, 133 lines 1/1 cited there (1/1 in the header)
4076-4106 lint-ci-engine Merged-branch reaper classifier contract scripts/check-merged-branch-reaper-outcome.mjs header, 99 lines 1/1 cited there (1/1 in the header)
4146-4169 lint-ci-engine Hourly full run self-test and concurrency gate scripts/ci/scheduled-full-run.mjs header, 45 lines 1/1 cited there (1/1 in the header)
4190-4213 lint-ci-engine Aggregator roster gate scripts/check-aggregator-roster.mjs header, 82 lines 3/3 cited there (3/3 in the header)
4219-4246 lint-ci-engine Required-context name pin scripts/check-required-contexts.mjs header, 182 lines 5/5 cited there (5/5 in the header)
4250-4267 lint-ci-engine Cross-package test inputs scripts/check-cross-package-test-inputs.mjs header, 371 lines 1/1 cited there (1/1 in the header)
4334-4354 lint-ci-engine Live-server database isolation scripts/check-live-db-isolation.mjs header, 58 lines 2/2 cited there (2/2 in the header)
4379-4407 lint-ci-engine CI filter parity (cross-package Layer C) scripts/check-ci-filter-parity.mjs header, 238 lines 4/4 cited there (4/4 in the header)
4466-4483 lint-ci-engine Hand-written declaration mirrors scripts/check-declaration-mirrors.mjs header, 107 lines 3/3 cited there (3/3 in the header)
4545-4562 lint-ci-engine Test-source alias gate scripts/check-test-source-alias.mjs header, 346 lines 2/2 cited there (2/2 in the header)
4566-4589 lint-ci-engine Ref'd-timer probe containment scripts/check-refd-timer-probe.mjs header, 98 lines 1/1 cited there (1/1 in the header)
4609-4631 lint-ci-engine Manifest repository.directory guard scripts/check-manifest-repository-directory.mjs header, 171 lines 1/1 cited there (1/1 in the header)
4762-4791 lint-ci-engine driver-memory census gate scripts/check-driver-memory-census.mjs header, 107 lines 7/7 cited there (7/7 in the header)
4840-4874 lint-ci-engine Read-side tenant chokepoint gate scripts/check-tenant-chokepoint.mjs header, 108 lines 6/6 cited there (6/6 in the header)
4878-4905 lint-ci-engine Every committed pnpm --filter names a real package scripts/pnpm-filter-targets.mjs header, 83 lines 2/2 cited there (2/2 in the header)
4909-4947 lint-ci-engine No committed command forwards args to vitest through a bare -- scripts/check-agent-test-spelling.mjs header, 174 lines 2/2 cited there (2/2 in the header)
4988-5017 lint-ci-engine workspace manifest dependency graph has no cycle scripts/check-workspace-manifest-cycles.mjs header, 84 lines 2/2 cited there (2/2 in the header)
5139-5156 lint-ci-engine Duration-shaped spec keys carry their unit in the key name packages/spec/scripts/check-duration-unit-keys.ts header, 271 lines 1/1 cited there (1/1 in the header)
5167-5171 lint-ci-engine Report how many gates never ran verbatim copy of the note at base line 523, which stays none cited
5176-5181 lint-ci-engine Report how many gates never ran verbatim copy of the note at base line 532, which stays none cited
5212-5215 lint-scoped-erasure Checkout repository verbatim copy of the note at base line 424, which stays none cited
5364-5368 lint-scoped-erasure Report how many gates never ran verbatim copy of the note at base line 523, which stays none cited
5373-5378 lint-scoped-erasure Report how many gates never ran verbatim copy of the note at base line 532, which stays none cited
5407-5410 lint-scoped-slot-corpus Checkout repository verbatim copy of the note at base line 424, which stays none cited
5545-5549 lint-scoped-slot-corpus Report how many gates never ran verbatim copy of the note at base line 523, which stays none cited
5554-5559 lint-scoped-slot-corpus Report how many gates never ran verbatim copy of the note at base line 532, which stays none cited
5588-5591 lint-scoped-tooling Checkout repository verbatim copy of the note at base line 424, which stays none cited
5767-5771 lint-scoped-tooling Report how many gates never ran verbatim copy of the note at base line 523, which stays none cited
5776-5781 lint-scoped-tooling Report how many gates never ran verbatim copy of the note at base line 532, which stays none cited
5813-5816 lint-pm-dispatch-gates Checkout repository verbatim copy of the note at base line 424, which stays none cited
5947-5951 lint-pm-dispatch-gates Report how many gates never ran verbatim copy of the note at base line 523, which stays none cited
5956-5961 lint-pm-dispatch-gates Report how many gates never ran verbatim copy of the note at base line 532, which stays none cited
6153-6172 typecheck-source-gates Check object-definition parameters declare the keys they are read for scripts/check-object-def-param-keys.mjs header, 134 lines 3/3 cited there (3/3 in the header)
6195-6216 typecheck-source-gates Stall-guard budget invariant scripts/check-stall-guard-budget.mjs header, 195 lines 1/1 cited there (1/1 in the header)
6240-6276 typecheck-source-gates Stall-guard headroom self-test (self-test half only, never the measurement) scripts/measure-stall-guard-headroom.mjs header, 147 lines 2/2 cited there (2/2 in the header); one step note kept
6475-6493 typecheck-source-gates Check the export-origins baseline resolves as recorded packages/spec/scripts/build-export-origins.ts header, 78 lines 2/2 cited there (1/2 in the header); one step note kept
6557-6577 typecheck-source-gates Check the decision frame is in sync across its four copies scripts/check-skill-frame-sync.mjs header, 84 lines 3/3 cited there (3/3 in the header)
6617-6634 typecheck-source-gates Check SKILL.md compatibility declarations match the workspace majors scripts/check-skill-compatibility-version.mjs header, 83 lines 3/3 cited there (3/3 in the header)
6656-6679 typecheck-source-gates Check every agent definition declares a model scripts/check-agent-model-declared.mjs header, 82 lines 2/2 cited there (2/2 in the header)
6721-6738 typecheck-source-gates Ratchet-remedy authority convention (#8435) across the gate farm scripts/check-ratchet-remedy-authority.mjs header, 172 lines 5/5 cited there (5/5 in the header)
6742-6761 typecheck-source-gates Published skills token ratchet (#10473) + its self-test scripts/check-skills-token-ratchet.mjs header, 162 lines 2/2 cited there (2/2 in the header)
6784-6808 typecheck-source-gates Check spec pin citations still name the pin this repo builds against packages/spec/scripts/check-objectui-pin-citations.ts header, 196 lines 6/6 cited there (6/6 in the header)
6858-6871 typecheck-workspace Checkout repository verbatim copy of the note at base line 6032, which stays 3/3 kept on the pointer
6895-6936 typecheck-workspace Restore Turbo cache verbatim copy of the note at base line 6069, which stays 1/1 kept on the pointer
7155-7168 typecheck-debt Checkout repository verbatim copy of the note at base line 6032, which stays 3/3 kept on the pointer
7192-7233 typecheck-debt Restore Turbo cache verbatim copy of the note at base line 6069, which stays 1/1 kept on the pointer
7410-7423 typecheck-consumers Checkout repository verbatim copy of the note at base line 6032, which stays 3/3 kept on the pointer
7447-7488 typecheck-consumers Restore Turbo cache verbatim copy of the note at base line 6069, which stays 1/1 kept on the pointer
7503-7519 typecheck-consumers Build workspace packages verbatim copy of the note at base line 7248, which stays 3/3 kept on the pointer
7554-7563 typecheck-consumers Sweep the built closure for vanished declarations verbatim copy of the note at base line 7341, which stays 3/3 kept on the pointer
7762-7782 typecheck-consumers Check docs formula examples are valid CEL packages/lint/scripts/check-doc-formula-expressions.mjs header, 148 lines 2/2 cited there (2/2 in the header)
7786-7804 typecheck-consumers Check docs object examples pass the os validate security posture packages/lint/scripts/check-doc-security-posture.mjs header, 123 lines 3/3 cited there (3/3 in the header)

Gates, run on fc9340b61 (git rev-parse --short HEAD of the run)

80 commands, 80 exit 0. Each exit code was captured before any pipe.

  • The derived set. node scripts/pm/dispatch-gates.mjs --commands was re-derived on this diff, with no paths given: 43 commands, the same 43 as the dispatch's lint.yml derivation. --ran reconciles them: ✓ dispatch-gates --ran: 43 derived famil(ies) accounted for — 43 run, 0 NOT-MEASURED.
  • The three dispatch extras. The dispatch derivation also named docs/ci/lint-gates.md; this PR adds no such file. Its three extra commands ran anyway, all green: check-ci-filter-parity, check:doc-authoring, and check:doc-formula-expressions. The last one was run after building @objectstack/formula and @objectstack/lint under the verify lock (on base it exits 3 PREREQUISITE NOT MET without that build).
  • The 34 extra readers. The commands for the other literal lint.yml readers, listed below.
  • The two heavy gates. check:pm-dispatch-gates ran detached: ✓ dispatch-gates self-test (fast tier): 1833 cases pass. check:type-check-debt ran under the verify lock: VERDICT command-exit 0, 1 ledger entr(ies) re-measured in 661.7s, 26 raw tsc error(s) total, none above its recorded number.
  • NOT MEASURED, by the derivation's own report. 6 workflow-valued families take a value only a CI run carries (check-required-contexts.mjs --verify-required-set and the check-shard-attestation --emit/--verify legs). They are CI's.
node scripts/check-aggregator-roster.mjs :: exit 0
node scripts/check-aggregator-roster.mjs --self-test :: exit 0
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-merged-branch-reaper-outcome.mjs :: exit 0
node scripts/check-merged-branch-reaper-outcome.mjs --self-test :: exit 0
node scripts/check-position-name-fold-loaders.mjs :: exit 0
node scripts/check-position-name-fold-loaders.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-step-collectors.mjs :: exit 0
node scripts/check-step-collectors.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/scheduled-full-run.mjs --self-test :: exit 0
node scripts/docs-audit/check-drift-comment.mjs :: exit 0
node scripts/pm/ci-failure.mjs --self-test :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:declared-population-live :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:node-version :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:pm-expected-skips :: exit 0
pnpm check:pm-post-stamped :: exit 0
pnpm check:pnpm-acquisition :: exit 0
pnpm check:pnpm-filter-targets :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:required-contexts :: exit 0
pnpm check:select-gate-families :: exit 0
pnpm check:shard-attestation :: exit 0
pnpm check:stall-guard-budget :: exit 0
pnpm check:stall-guard-headroom :: exit 0
pnpm check:type-check-coverage :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm check:workflow-status-functions :: exit 0
pnpm check:workflow-step-name-quoting :: exit 0
node scripts/check-ci-filter-parity.mjs :: exit 0
pnpm check:doc-authoring :: exit 0
node scripts/check-adr-symbol-anchors.mjs --self-test :: exit 0
node scripts/check-adr-symbol-anchors.mjs :: exit 0
node scripts/check-cross-repo-closer-outcome.mjs --self-test :: exit 0
node scripts/check-cross-repo-closer-outcome.mjs :: exit 0
node scripts/check-doc-frontmatter.mjs --self-test :: exit 0
node scripts/check-doc-frontmatter.mjs :: exit 0
node scripts/check-docs-nav-label.mjs --self-test :: exit 0
node scripts/check-docs-nav-label.mjs :: exit 0
node scripts/check-merge-queue-triage-outcome.mjs --self-test :: exit 0
node scripts/check-merge-queue-triage-outcome.mjs :: exit 0
node scripts/check-platform-checklist-watchdog.mjs --self-test :: exit 0
node scripts/check-platform-checklist-watchdog.mjs :: exit 0
node scripts/check-scripts-symbol-anchors.mjs --self-test :: exit 0
node scripts/check-scripts-symbol-anchors.mjs :: exit 0
node scripts/check-spec-docblock-symbol-anchors.mjs --self-test :: exit 0
node scripts/check-spec-docblock-symbol-anchors.mjs :: exit 0
node scripts/check-system-context-census.mjs --self-test :: exit 0
node scripts/check-system-context-census.mjs :: exit 0
node scripts/check-test-suite-ceilings.mjs --self-test :: exit 0
node scripts/pm/bare-root-worklist.mjs --self-test :: exit 0
node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0
node scripts/report-unmeasured-gate-tail.mjs --self-test :: exit 0
pnpm check:changeset-gate-self-tests :: exit 0
pnpm check:cli-test-child-env :: exit 0
pnpm check:closing-target-claim :: exit 0
pnpm check:filter-alias-parity :: exit 0
pnpm check:partof-closing-keyword :: exit 0
pnpm check:pm-half-states :: exit 0
pnpm check:published-files :: exit 0
pnpm check:quick-reference-counts :: exit 0
pnpm check:runner-env-posture :: exit 0
pnpm check:sdui-lockstep :: exit 0
pnpm check:single-claim-paths :: exit 0
pnpm check:stack-collection-maps :: exit 0
pnpm check:pm-dispatch-gates :: exit 0
pnpm check:type-check-debt :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0

Acceptance notes

None of these are filed: none is a reproducible defect, a contract violation or an authoring trap.

  • Stale lane wording in kept comments. Some kept comments still say "this job carries the whole check:* gate family". That has not been true since the eight-lane split (ci(lint): measure where Lint & Repo Gates' 198 serial steps spend 14–37 minutes, and bring the maintainer a split plan (maintainer-directed) #22991). They were left alone because they are outside the blocks this PR measured.

  • "Same reason as the step above." Kept notes that say this now reach that reason through the step's pointer, one hop further.

  • Prose references to removed step comments. Two script headers still mention a lint.yml step comment:

    • scripts/check-nul-bytes.mjs names "the .github/workflows/lint.yml step comment" as one prose statement of its byte set. That comment is now a pointer to that very header, which the header's own "cite this header, do not restate it" footing allows.
    • scripts/check-whole-set-label-write.mjs records a historical measured verdict that counted "this gate's own wiring comment in lint.yml".

    Nothing reads either sentence. Who carries them: whoever next edits those headers; no one is assigned.

  • No mechanical size guard. Item 1 was not built, so nothing stops the margin from shrinking again. It is now about 122 KB under the last size measured valid (510,016). The ceiling itself is still unmeasured, and this PR did not probe it.

  • The other workflows are far from the ceiling. ci.yml is 175,786 bytes and release.yml is 128,877.

  • Dispatch assumption 1 re-measured on df7a13792: it holds. 510,016 bytes, 8,083 lines counting the unterminated last one (wc -l 8,082), and 445,409 bytes in #-led lines. The card body's "main is 505,924 bytes at 9f4b652e" is an older reading.

维护者速读(草稿)

改了什么

把 .github/workflows/lint.yml 里的 1,860 行注释换成了 136 行指针。删掉的主要是每个检查步骤前面大段"为什么要有这个检查"的说明。这些理由在对应检查脚本的文件头里本来就有,指针直接指过去。同一段说明被逐字复制进多个并行 lane 的,只保留第一份。文件从 510,016 字节降到 387,314 字节,少了约 24%。

为什么改

GitHub 对单个 workflow 文件有大小上限。卡片实测:文件到 513,738 字节时,GitHub 判它无效,一个 job 都不跑,两个必需检查(Lint & Repo Gates、TypeScript Type Check)都不上报。必需检查不上报,PR 和合并队列就会卡住。改之前,main 离这条线不到 4 KB,下一个往 lint.yml 里加检查的 PR 就可能踩线。现在,离最后一次实测有效的大小还有约 122 KB 余量。

风险与代价(含回滚)

  • 执行内容一点没改。 两个独立的 YAML 解析器都证明:改前改后解析出来的数据完全一致,job 名和必需检查名一个字节都没变。
  • 代价。 读 workflow 的人要多跳一步,去脚本文件头看理由。被删的原文仍在 git 历史里(df7a13792)。
  • 回滚。 revert 这个 PR 即可,不涉及任何数据或配置迁移。
  • 卡片第 1 项没有做。 那一项是新增一个文件大小门禁,而新增门禁需要维护者的原话。

席位意见

(留空)

你要做的


Generated by Claude Code

lint.yml stood at 510,016 bytes, within a few KB of the size at which
GitHub stops accepting the workflow file (no jobs, no required contexts).
87% of those bytes were YAML comment lines.

This replaces 60 per-step rationale blocks with a one- or two-line pointer
to the script whose header already carries that rationale (every card
number a removed block cited is cited by that script and also kept on the
pointer line), and 29 verbatim duplicate copies of a lane note with a
pointer to the first copy, which stays. Five step notes from the removed
blocks are kept, one or two lines each, and the placement argument many
removed blocks repeated ("it lives in this job, unfiltered") is stated
once at the top of the file.

No key, value, job, step, name, if, run, env or trigger changes: the file
parses to identical YAML data before and after.

510,016 -> 387,314 bytes; 8,082 -> 6,358 lines.

Claude-Session: https://claude.ai/code/session_012zwsLMxQBwHUYJgPyrpEvx
Co-authored-by: Claude <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd size/xl skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants