Repository navigation
ci(suite-ceilings): a new package is not red before its first ceiling - #22498
Merged
objectstack-fleet[bot] merged 1 commit intoOct 9, 2026
Merged
Conversation
A package absent from the ceiling dataset now prints "no ceiling: new package" and is not red; the first refresh after it lands enters it in the dataset. A package the dataset knows but that lost its row stays red: besides the existing refusal of a weight with no ceiling or reason, the table reader now refuses a ceiling, `uncapped` reason or `provisional` mark with no weight, which would otherwise have graded as a new package. The self-test battery for the absent case is inverted to the new meaning, and a ruled ceiling for a new package is shown to grade it and to go red when it runs over. Claude-Session: https://claude.ai/code/session_01LYXc6ckoWuZyVZpWYizdMh Co-authored-by: Claude <noreply@anthropic.com>
objectstack-fleet
Bot
deleted the
claude/issue-16468-new-package-not-red
branch
October 9, 2026 16:13
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 free
to 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 #16468
Clause-②: no
Implements ruling Q2 B on the suite-duration ratchet (#16468 (comment)): a package absent from the ceiling dataset is a new package. It prints "no ceiling: new package" and is not red. The first refresh after it lands enters it in the dataset. A package the dataset knows but that lost its row stays red. Q1 A needs no code (the hold is as built). Part 1 of the ratchet landed as PR #22480 (
6abd265320).What changed
scripts/check-test-suite-ceilings.mjs:new(it wasabsent).RED_STATUSESisoveralone, so the exit code follows only an over-ceiling package or a refusal.-- no ceiling: new package (not in scripts/test-shard-timings.json; the first refresh after it lands enters it), in the same column as theprovisionalandcarriedrows. The red header, the red detail and the error annotation lose their absent-package branch, because no red row can lack a ceiling now.readCeilingTablealready refused a weight with neither a ceiling nor anuncappedreason. It now also refuses a ceiling, anuncappedreason or aprovisionalmark that names a package with no weight. Without this, that shape would have changed from red (as built, it gradedabsent) to "no ceiling: new package".gradeCeilingsstatus table and theRULED_CEILING_RAISEScomment ("the only way a package that has never landed can get one")..github/workflows/ci.yml: the comment aboveCheck the per-package suite-duration ceilingssaid "a package absent from the dataset is red (the new-package shape)". It now states the ruled rule. Comment only, no step change.Sweep for other sentences stating the old rule:
git grep -n -i -E "absent from the dataset|new-package shape|new package|ruled raise|no ceiling"over the tree found only ci.yml lines 1462-1463, and they are fixed here. The ceiling prose in.github/workflows/shard-timings-refresh.ymlandscripts/measure-test-shard-timings.mjsdescribes the hold and the formula, not the new-package rule, so it is untouched. Neither file is in this diff, and neither isscripts/test-shard-timings.jsonorscripts/partition-test-shards.mjs.The inverted pin
The battery
'a package absent from the dataset is red; an uncapped one is not'(floor 4) is now'a new package prints "no ceiling: new package" and is not red; a known one that lost its row is refused'(floor 10):new, exit 0, verdictOK.brand-new: 5.00s -- no ceiling: new package.NOT MEASURED, exit 0.uncappedhalf is kept: acarriedpackage is not red and its reason is printed.uncappedreason with no weight; aprovisionalmark with no weight. Each case asserts the refusal text names the package.The ruled-raise battery gains one case (floor 7 to 8), which measures dispatch assumption 6. A ruled entry for a new package still gives it a ceiling that it can run over: 31 s against a ruled 30 s reads
over, exit 1. The existing case (5 s against a ruled 30 s readsok) is reworded to the new meaning.node scripts/check-test-suite-ceilings.mjs --self-test:self-test OK (42 cases across 7 batteries), up from 35. Exit 0 at791aaf55.Ablation
The fix was committed first (
791aaf55). Each mutation went throughscripts/ablation-replace.mjs: the anchor had to hit once, the blob had to change on disk, and the restore was proven as blob ==HEAD(570a0ceaa046) withgit diff HEADempty. These are root scripts with nodist/, so no build leg applies.RED_STATUSES = new Set(['over', 'new'])(the PM's ablation)TypeErrorin the red renderer (r.ceilingis null), thrown inside the inverted battery's first case.new: exit 1, verdict OVER, newifshort-circuited withfalse &&)lost row: a ceiling with no weight was graded as new (null)provisionaldropped from the weightless setlost row: a provisional mark with no weight was graded as new (null)uncappeddropped from the weightless setlost row: an uncapped reason with no weight was graded as new (null)no ceiling: not in ...new: the line is wrongLeg 1's direction is red, as expected, but the crash fires before the pin's assertions run. Leg 1b is there so that the inverted assertion itself is what fails.
Finding: where a package the dataset knows could be graded as new (dispatch assumption 2)
Searched: every path in
gradeCeilings/readCeilingTablethat yields "not in the dataset", and every path in the generator (suiteCeilings,buildDataset,provisionalPackagesinscripts/measure-test-shard-timings.mjs) and the refresh lane (shard-timings-refresh.yml,coverageReportinscripts/ci/select-shard-timings-run.mjs) that can remove a package's row.uncappedreason. Already refused, as the PM expected. It is now pinned in the inverted battery as well.uncappedreason or aprovisionalmark with no weight. This was NOT refused. The grader keys "in the dataset" onpackagesalone, so before this change it gradedabsent(red). A bare Q2 change would have graded itnew(not red) and ignored the ceiling the table holds. The generator never writes this shape:suiteCeilingsiteratespackages, andprovisionalis a subset of executed plus carried, which ispackages. So only a hand edit reaches it, and it is now refused like its mirror. Probe: a first table built by the generator's ownsuiteCeilingsover the live dataset (72 weights, 71 ceilings, 1uncapped: provisional) passes the reader. A new package graded against it prints the new line, exit 0.suiteCeilingsdrops a prior ceiling whose package leftpackages, and the next executing refresh would set a fresh one. The refresh lane closes this for a package that still exists.coverageReportnames any package the committed dataset weighs, which the workspace still contains, but which the refresh no longer covers. The workflow then exits 1 with "NOTHING was regenerated and no PR was opened". What can still drop is a package that left the workspace: deleted, or renamed, and a rename's new name is exactly the "new or renamed" case Q2 B rules not red.@objectstack/dogfoodis excluded from coverage, but ci.yml excludes it from Test Core, so it is never graded. The residual is in Acceptance notes.Q1 A, as built (no code, per the ruling)
The effective ceiling is
max(generated, ruled entry). ARULED_CEILING_RAISESentry below the generated ceiling therefore lowers nothing: the verdict lists it under "changing nothing (delete them)". So the ruling's parenthetical "a lowering is a ruled entry too" has no as-built mechanism. Nothing about lowering was changed here.Verification at
791aaf55node scripts/check-test-suite-ceilings.mjs --self-test: exit 0, 42 cases across 7 batteries. On the base (35ef501e13) it read 35 across 7.node scripts/measure-test-shard-timings.mjs --self-test: exit 0, unchanged.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, with no paths (it derives the change set from the merge base, 2 paths): 58 commands. 53 exit 0. Four exit 3 (PREREQUISITE NOT MET, they read builtdist/):check:dts-closure,check:dual-build-cjs-loads,check:lean-entry-closureandcheck:sourcemap-no-sources-content. These four are declared NOT MEASURED. None of them readsci.yml(only doc comments name it), the diff touches no package'sfiles[], and the shared turbo cache is cold. CI runs them after Build Core.pnpm check:pm-dispatch-gateswas run detached, as its header prescribes, and read from its log:✓ dispatch-gates self-test: 2011 cases pass.It took 1377.4 s on this box, with no lifecycle failure line.dispatch-gates --ran: 58 derived families, 54 run, 4 NOT-MEASURED (derived from the recorded exit 3), 0 UNRUN.eslint --print-configfor the touched script resolves 2 rules and noparserOptions.projectorprojectService, and thefilesglob does not cover.yml. (2) Count:eslint --no-inline-config --format jsonread 1 file, with 0 errors and 0 warnings. (3) Invariance: type-aware linting is not enabled, so this diff cannot move any other file's verdict.Acceptance notes
provenance.refresh) has no coverage check. It can therefore drop a still-existing package's held ceiling with its weight. After that, the package would grade as new and the next refresh would set a fresh ceiling. The lane workflow refuses this, and no hand-run refresh has happened. Carrier: whoever next touchessuiteCeilingsor the refresh lane.Generated by Claude Code