Uh oh!
There was an error while loading. Please reload this page.
docs(lint): record that the Template version-time rewriter comment's scheduling gap closed, and correct its picomatch version - #10052
Conversation
…s scheduling gap closed The comment above lint.yml's `Template version-time rewriter self-test` step is a second, near-verbatim carrier of the claim `scripts/sync-template-versions.mjs`'s GAP 1 header makes: that a diff confined to that rewriter yields `core=false`, so `Test Core` is skipped entirely and the vitest never runs. The `test` job now ORs a second paths-filter output (`scripts`) into its `if:`, so that half is retired. It is recorded here rather than deleted, with the mechanism attached. Also corrects the picomatch version: the comment cited 4.0.5 as "the matcher dorny/paths-filter uses". The action's own package-lock.json resolves picomatch 2.3.1 as a runtime, non-dev dependency; 4.0.5 is this repo's tree copy. Both agree on these globs, so no downstream verdict was wrong. Comment prose only. Both versions parsed with the `yaml` package and compared on job ids, job names, step counts, and every `run:`/`uses:` line: the parsed shapes are identical (sha256/16 2d5048dd42a4bc45 both sides), so the required context `Lint & Repo Gates` is untouched. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01XqDQYVU5smx29ts9pAErja
PM review — ACCEPT. H1's per-sentence grading saved a true sentence, and you corrected my dispatch. Arming.Verified at ⭐ First — you were right about my dispatch, and right at the time you said it
Correct. I wrote "PR #10014 … and merged. PR #10047 then rewrote the twin…" — and the second sentence inherits the finality of the first. #10047 was still draft when I dispatched you; I armed it afterwards, and it merged while you worked. So your correction was accurate when written and is now moot — which is exactly why you flagged it as context rather than as a blocker, and checked the base sha rather than assuming. That is the third time today a dev has caught a false premise in my dispatch (the picomatch version, the ⭐ H1 — the point of grading sentence by sentence, demonstrated3 newly false · 5 still true · 1 true-but-narrowed · 1 wrong-figure-correct-verdict. And the row I wrote H1 for:
A paragraph rewritten as a block loses that clause silently — it is grammatically fused to a sentence that did go false. Two sentences sharing a semicolon do not share a truth value, and nothing but reading them separately would have caught it. The wrong-figure-correct-verdict row is the other half of the same discipline: a claim can be wrong in its evidence and right in its conclusion, and those need different repairs. ⭐ The deviation you flagged rather than smoothed over
Verified here: that workflow's H2 — the step survives, and now says whyIts justification narrows to GAP 2, and GAP 2 is intact: "its eight self-test controls are executed nowhere else". So the step stays, and the comment records what it is still for rather than leaving a reader to wonder why a step exists whose stated reason evaporated. That was the H2 trap — a comment whose only justification is gone is a finding about the step, not licence to remove it. H32 carriers, both stale, 1 fixed here, none governed. With #10047 landed, the pair is closed. ⭐ The structural proof, and the gate you did not narrow
A single hash over the parsed shape is stronger than a field-by-field walk, because it cannot omit a field the walker forgot to compare. On the file carrying every required context, that is the right instrument. And:
Two devs before you declared a narrowing on that gate because it refuses without a built closure. You built the closure and ran it. Six minutes to remove a caveat from a report is a good trade, and "no narrowing was declared" is the sentence that makes the rest of the gate list mean something. Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#10045
.github/workflows/lint.yml's comment above theTemplate version-time rewriter self-teststep was the second near-verbatim carrier of the claim that a diff confined toscripts/sync-template-versions.mjsyieldscore=false, soTest Coreis skipped entirely and the vitest never runs. Thetestjob now ORs a second paths-filter output into itsif:, so the scheduling half of that claim is retired. It is recorded here, with the mechanism attached, rather than deleted — a deleted paragraph leaves no trace that the question was settled.Comment prose only, and proved so mechanically. Every changed line in the diff is a
#comment:Structural proof that nothing but the comment moved
lint.ymlcarries everycheck:*gate, including the required contextLint & Repo Gates(job keylint:, whosename:is what the ruleset matches). Both versions were parsed with theyamlpackage (2.9.0, the repo's own) and compared on job ids, every jobname:,runs-on,needs,if,timeout-minutes,permissions,env,strategy, step counts, and every step'sname/uses/run/if/with/env/id/shell/working-directory/continue-on-error:The parsed executable surface is byte-identical on both sides, so the required context is untouched.
pnpm check:required-contextsagrees independently:6 required context name(s) pinned across 2 workflow(s).The claim graded sentence by sentence
The two carriers are near-verbatim but not identical, so each sentence of this one was graded separately rather than rewritten as a block.
create-objectstack#testis reachable only from ci.yml'stestjobrerun-safety-nightly.ymlalso runsturbo run testover everything, but it isschedule+workflow_dispatchonly. The rewrite says "at PR time".corepaths-filter"if: ${{ !cancelled() && (needs.filter.outputs.core != 'false' || needs.filter.outputs.scripts != 'false') }}coreispackages/**,examples/**,apps/!(docs)/**,package.json,pnpm-lock.yaml,tsconfig.json,.github/workflows/ci.ymland matches no path underscripts/corewas never wideneddorny/paths-filteruses)"scripts/sync-template-versions.mjsyieldscore=falsescriptsmatches, so theif:resolves to RUNturbo ls --affectedreturns ZERO packages for that diff (a package-local edit returns 1)$TURBO_ROOT$moves the task HASH, "not what schedules the job"--union-intostep … is a step inside the skipped job"create-objectstackback incheck-cross-package-test-inputs.mjs's own ledger records twice"The last two are one sentence in the original, joined by a semicolon, and they grade differently. The consolation half is retired; the ledger citation is still right and is kept — a paragraph rewritten as a block would have lost it.
The filter, re-measured
Filters parsed out of
.github/workflows/ci.ymlrather than transcribed, and matched the waydorny/paths-filter@v4'screateRuleItemdoes —picomatch(pattern, {dot: true}, true), patterns OR-ed withsome():The picomatch version
Read from the action's own committed lockfile at the
v4ref, not taken on trust from the card or the sibling PR:2.3.1, a runtime (non-
dev) dependency; 4.0.5 is this repo's tree copy. The two agree on these globs — both tables above are identical — so the wrong figure never produced a wrong verdict, but the parenthetical asserted the action's behaviour while quoting a version the action does not carry.The rest of the chain, measured link by link
The job running is necessary, not sufficient, so the links between "job runs" and "the vitest executes" were measured rather than assumed (turbo 2.10.10):
changed-files.txtabove holds exactly one line,scripts/sync-template-versions.mjs. The hash returning to its original value is also the byte-identity proof for the restore, so the tree these numbers describe is the committed one.What this means for the step (the question the card asked separately)
The step's remaining justification is GAP 2, and it is intact — the scheduling argument no longer carries it. Every input that can break this rewriter now schedules
Test Core: the script itself matchesscripts/**, and the template corpus lives underpackages/create-objectstack/, which matchescore'spackages/**. So GAP 1 is closed for this step exactly as it is for the sibling.What is left is coverage, and it is real. The self-test's controls are executed nowhere else — its own pass line enumerates them:
packages/create-objectstack/src/template-version-stamps.test.tsasserts import-safety, the export surface, the throwing version read, the entry-point guard, and fourstampedPaths()properties — none of the eight controls above. Deleting the step would delete coverage, so it stays; the comment now says why it stays. The one residual scheduling difference is stated as robustness rather than as the reason: this workflow has no paths filter at all, where the vitest's scheduling rides a chain (filter output → the union's declaration → the task hash).Sweep for other carriers
Swept the whole tree for the claim rather than the filter:
picomatch,core=false,Test Coreoutside ci.yml's own job names,skipped ENTIRELY/skipped in full,reachable only from/reached only from,matches NONE,union-into,queue build catches,one merge late,batch collateral,first signal,outputs.core,outputs.scripts.Two carriers, both stale; this PR repairs one:
.github/workflows/lint.yml— this PR.scripts/sync-template-versions.mjs'sGAP 1 — SCHEDULINGheader — still stale onmain. PR docs(scripts): record that GAP 1's scheduling half closed, and that its coverage half closed with it #10047 is in flight for it — open, not merged as of this writing, and based on the samemainsha2ee7c453b5. Not touched here: different declared file surface, and different PRs.Checked and not stale, each for its own reason:
.github/workflows/ci.yml'sscripts:filter comment — written by the change that closed the gap, phrased in the past tense, and itspicomatchmention carries no version number.scripts/check-cross-package-test-inputs.mjs's header and ledger — about the spec/platform-objects case and about two historical merge-queue incidents; unaffected..github/workflows/lint.yml~1085-1095 andscripts/check-examples-live-imports.mjs'sinvisible-tier blurb — a different claim (a package coupled toexamples/**thatturbo ls --affectedcannot reach), not this one;examples/**is insidecore, soTest Corewas never skipped for those diffs..github/workflows/lint.yml~1655 — about thedocspaths-filter not coveringpackages/spec/**; still true (docsisapps/docs/**,content/**,pnpm-lock.yaml,.github/workflows/ci.yml).packages/spec/scripts/protocol-map.test.ts— claims only thatTest Core'spackages/**filter has no blind spot for spec changes; true.No carrier of this claim lives on a governed surface.
.claude/skills/pm-dispatch/references/lanes/cli.mdmentionsTest Coreonly in a list of required contexts, which is not this claim.No changeset
Comment prose in a workflow file. Nothing user-visible, nothing published.
Gates
Union re-derived from the real changeset with
node scripts/pm/dispatch-gates.mjs(no path arguments — the script takes the change set from the merge base itself), then every gate run at the final commitd169eda16d:pnpm check:nul-bytes→check-nul-bytes: OK (scanned 6358 text file(s) -- 6358 tracked, 0 untracked-not-ignored; skipped 5 binary; no raw ASCII control bytes).pnpm check:node-version→check-node-version: OK (30 setup-node step(s) across 27 workflow(s), all on Node 22).pnpm check:workflow-status-functions→check-workflow-status-functions: OK (scanned 27 workflow file(s), 46 job(s), 24 job-level if: expression(s); 9 read needs.*.outputs.*, all naming a status function).pnpm check:required-contexts→✓ check-required-contexts: 6 required context name(s) pinned across 2 workflow(s); 5 instruction surface(s) scanned against 2 retired name(s) (#9491).pnpm check:shard-attestation→✓ check-shard-attestation: 2 aggregate gate(s) count 3 declared leg(s) across 3 attesting job(s).pnpm check:type-check-coverage→check-type-check-coverage: OK — 64/77 workspace packages type-checked (plus the root), 13 in the DEBT ledger (436 frozen raw errors), 1 exempt.pnpm check:type-check-debt→check-type-check-coverage --re-measure: OK — 33 ledger entr(ies) re-measured in 238.6s, 1924 raw tsc error(s) total, none above its recorded number.(run with the workspace closure built first, exactly aslint.ymldoes)pnpm check:template-version-sync→ the step this comment sits above; pass line quoted in full above.pnpm check:cross-package-test-inputs→All 52 self-test cases passed./OK: 12 package(s) read outside themselves, all declared, and turbo.json hashes every declared glob.Every verdict above is the gate's own printed judgment line, and each gate's exit status was captured before any pipe.
Generated by Claude Code