Uh oh!
There was an error while loading. Please reload this page.
ci(devx): delete the stale cost note on the dispatch-gates self-test step - #12982
Merged
Conversation
…step The `PM dispatch-gates self-test` step's justification closed with "Reads two files and walks packages/; ~0.3s". That described the 61-case self-test the paragraph above it names, and the part of the self-test that grew since is exactly the part the line denied: its live-tree cases run the same discovery the tool does (every workflow file, then the source of every gate that discovery finds), build temporary git repositories and drive `changedPathsFromGit` against them, and sweep the tracked corpus. The figure is deleted rather than re-measured. A replacement has to be read off a real CI run of that step -- a reading taken in an agent container is a reading of a contended box, not of a runner -- and that is a separate piece of work. The defect being repaired is not that the number was inaccurate but that it was endorsing a decision it had no standing to endorse. No live counts replace it, for the same reason: they rot the same way. The shape of the work is what the argument needs, and it needs no stopwatch. The step stays UNCONDITIONAL and this change does not argue otherwise. Cost was never what made it unconditional -- the first paragraph of the comment is, and it stands untouched: an exemption is what a self-test must not have, or the gap moves. A note added at the end says so explicitly, so the deletion cannot be read as clearing the way for an `if:` or a paths filter. Comment-only: 26 changed lines, 0 of them outside a `#` comment. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CPrUz21stTFhJRUirdc4yw
os-elon
marked this pull request as ready for review
August 28, 2026 12:41
os-elon
enabled auto-merge
August 28, 2026 12:41
Uh oh!
There was an error while loading. Please reload this page.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for freeto join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes#12831
The
PM dispatch-gates self-teststep in.github/workflows/lint.ymlclosed itsjustification with a cost note: "Reads two files and walks packages/; ~0.3s."
That note is deleted, not refreshed. Comment-only change: 26 changed lines, 0 of
them outside a
#comment.Why deletion rather than a new number
The sentence's defect is standing, not accuracy. It was the load-bearing half
of a paragraph, and a cost nobody re-measures ends up endorsing a decision it has
no standing to endorse. Supplying a corrected figure would require a reading from a
real CI run of that step; a reading taken in this agent container is a reading
of a contended box, not of a runner (#12528). Taking that reading is separate work.
The description was false in the same way as the estimate, so it went with it. Its
replacement is qualitative and carries no counts at all — counts rot exactly the
way
~0.3sdid, and one quoted here would become the next generation of this samedefect. The retired line is kept in the comment as a quotation, explicitly past
tense, which is this file's existing convention for a claim it has withdrawn.
What the argument for unconditional execution now rests on
Solely on the first paragraph of that comment, which is untouched and never
depended on cost:
⛔ Nothing here argues the step should become conditional, and the rewrite says so in
the file: losing the estimate is not an argument for an
if:, a label read or apaths filter. Weakening this gate is a maintainer call. Whoever now reads the honest
description of what the self-test does and concludes the step is expensive is holding
a question for the maintainer, not a licence.
The content claims, re-verified on this tree
The correction rests on what the self-test does, which needs no stopwatch. Measured
on
7349a760a6by instrumentingfs.readFileSync/fs.openSync/child_processaroundnode scripts/pm/dispatch-gates.mjs --self-test, with a null control in the same run(
node -e 0through the same instrument reported 0 for every counter):scripts/**sources openedmkdtempSyncscratch rootsgit init/git clone/git ls-filesSo: it runs the same live-tree discovery the tool does, it builds real temporary git
repositories and drives
changedPathsFromGitagainst them, and it sweeps the trackedcorpus. That is not "two files", and it is not a walk of
packages/. None of thesenumbers is quoted in the workflow comment — they are evidence for this PR, on a named
commit, which is where a number can be checked.
discoverFamilies()— the population, since two cards want itThe card cited "176 families". That reading is
discoverFamilies().byCheck.size, and onthis tree it is now 179. Its population is distinct check invocations appearing in
run:blocks across the 28 tracked workflow files — not scripts on disk and notmanifest keys:
check:*npm aliasscripts/check-adr-links.mjs,scripts/pm/ci-failure.mjs --self-test, ...)git ls-files .github/workflowsreturns 28)I re-derived here: 110 root
check:*keys, 143 across all workspace manifests, 118scripts/check-*.mjs, 129 including subdirectories. Each is exactly +1 against thatcard's figures, which is what fa5d137 (#12942) adds — so those were taken pre-#12942
and mine post, a consistent offset rather than a disagreement.
is both that card's subdirectory count and this tree's alias-keyed half of
discoverFamilies(). Two different populations, one integer.Sweep for the claim elsewhere
git grepover the whole tree forReads two files,0.3sandwalks packages:.github/workflows/lint.ymlalso carries "Reads two files; milliseconds." on theunrelated
Published list mirrorsstep (Migrate the release toolchain to @changesets/cli v3 — one atomic PR carrying the bump, the pre-mode restructure, and the gates that model v2's semantics #9465). Different gate, measured separately:no temp git repos, no child processes, single-digit file count. Not a second copy of
this claim, and left alone;
scripts/check-self-test-wired.mjs— both correctly past tense as history, left alone;docs/adr/**,.claude/**,skills/**,AGENTS.md,CLAUDE.md). Nothing was edited outside.github/workflows/lint.yml.Changeset
Derived, not inherited:
changeset-checkin.github/workflows/pr-automation.ymlrequires an added
.changeset/*.mdunless theskip-changesetlabel is present (or thePR is the changesets release PR). It has no path-based exemption — a workflow-only
diff is not automatically excused. This diff is comment-only inside a CI workflow and
publishes nothing, so the label is the correct declaration and no changeset is written.
Gates
Derived from the real diff with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack(re-derived after the final commit; family unchanged), then run on
7349a760a6. Each exitcode captured before any pipe.
All 28 green (exit 0):
check:agent-test-spelling,check:node-version,check:pnpm-acquisition,check:pnpm-filter-targets,check:required-contexts,check:shard-attestation,check:stall-guard-budget,check:type-check-coverage,check:workflow-status-functions,check-aggregator-roster.mjs,check-required-contexts.mjs,check-self-test-wired.mjs,check-self-test-workflow-commands.mjs,check-shard-attestation.mjs,check-step-collectors.mjs,check-whole-set-label-write.mjs,docs-audit/check-drift-comment.mjs,pm/ci-failure.mjs --self-test, plus thehuman add-ons the derivation under-names for a
lint.ymledit:check:pm-dispatch-gates,check:nul-bytes,check:runner-env-posture,check-ci-filter-parity.mjs(self-test and live),check-comment-mask-corpus.mjs,check-comment-mask-adoption.mjs,check:pm-half-states,check:partof-closing-keyword,check:single-claim-paths.Declared narrowing — 1 of 29 not measured locally.
check:type-check-debtexited 1with its own verdict line: "--re-measure cannot run: 56 workspace dependencies of the
ledgered packages have no built type entry point on disk ... Build the closure first,
exactly as lint.yml does before this step". That is a prerequisite refusal, not a red
gate — lint.yml builds the closure before invoking it and CI will. The lint.yml-facing
half of that family is measured:
check:type-check-coverageruns the same script andprinted
check-type-check-coverage: OK, and its only assertions over this file are tworegex presence tests, both unmoved base to head (
turbo run typechecktrue/true,typecheck:rootfalse/false, against a negative control that is false/false).Control-byte scan clean (
grep -naPover the file returns nothing; the same instrumentreturns 1 on a VT-seeded control file).
Generated by Claude Code
Generated by Claude Code