Repository navigation
fix(scripts): dispatch-gates says a path-scheduled full-battery job does not run on the PR or in the merge queue - #24272
Merged
objectstack-fleet[bot] merged 2 commits intoOct 18, 2026
Conversation
…oes not run on the PR or in the queue The job `if:` reader stripped the full-battery event clause and dropped the fact on the floor, so a job CI runs only on main's push and hourly runs was printed as "scheduled BY YOUR PATHS" with nothing saying the PR would never run it. `jobIfReading` now returns `fullBatteryOnly` beside the refs; the population and the job-filtered row carry it; both renderings print one clause on the row's own line. Claude-Session: https://claude.ai/code/session_01QBcLjVCmcWbZEk6qhYMib2 Co-authored-by: Claude <noreply@anthropic.com>
…dogfood rows, with an in-place ablation Claude-Session: https://claude.ai/code/session_01QBcLjVCmcWbZEk6qhYMib2 Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
席位核对Seat Implemented-by:
Generated by Claude Code |
objectstack-fleet
Bot
deleted the
claude/issue-24073-dispatch-gates-full-battery-truth
branch
October 18, 2026 07:38
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 #24073
Clause-②: no
What
dispatch-gatesnow says, on the row a reader reads, that a path-scheduled CI job whoseif:carries ci.yml's full-battery clause does not run on this PR or in the merge queue, and that its first run on the change ismain's push battery after the merge.Scope is ruling 6243472660 (on #24171), letter B, term 2: the card's "Done when" items 1 and 2 only. Item 3 (a local command for the dogfood files) would be a new derived row and stays frozen. It is not in this PR.
Why (measured at
a422f04f)The job
if:reader already stripped the full-battery clause (&& github.event_name != 'pull_request' && github.event_name != 'merge_group') as the expression's last conjunct, so the job's filter population could still be read. The fact the clause carries was then dropped.jobFilterPopulationreturned{ paths, outputs, dropped }, the job-filtered row was{ workflow, job, outputs, hits, dropped, steps }, and neither renderer had a field to read.dispatch-gates.data.mjsis not on this path, so it is unchanged.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack packages/runtime/src/route-ledger.ts, the path PR #24009 changed:The Temporal Conformance row carries the same clause, because its
if:does. The Test Core and Build Core rows are unchanged, because theirs do not. stdout (the 49 commands) is byte-identical before and after (diffed).Change
jobIfReading(ifExpression)returns{ refs, fullBatteryOnly }.jobFilterOutputRefsis that reading with the second half dropped: same refusals, same refs.jobFilterPopulation,jobFilterPopulationsandjobFilteredStepscarryfullBatteryOnlyonto each job row.--jsongets it too, underjobFilteredSteps.jobs.fullBatteryOnlyClause(row)renders the one sentence from the flag, never from a job name.jobFilteredNotMeasuredLine(row)is the--commands/--jsonstderr row, pulled out of the inline template so the pin reads the line a dispatch is built from. The clause goes right after the job name, ahead of the step list. The plain rendering appends it to the row's own line.No new gate, derived row, ratchet,
--tiermandate or constant.Pin
The cases are in
scripts/pm/dispatch-gates.self-test.mjs, fast tier, in the existing sections:if:section,jobIfReadingreturnsfullBatteryOnly: truefor the stripped clause andfalsefor the live spelling without it.packages/runtime/src/route-ledger.ts, four checks run for each of Dogfood Regression Gate and Dogfood Verify CLI:fullBatteryOnly: true;--commandsline says "does NOT run on this PR or in the merge queue", ahead of the step list;falseand no statement.Verification at
004ba7b4(git rev-parse --short HEAD)pnpm check:pm-dispatch-gates(fast tier), exit 0, 396.9 s:✓ dispatch-gates self-test (fast tier): 1913 cases pass; 6 slow section(s) deferred.node scripts/pm/dispatch-gates.mjs --self-test: exit 0,✓ dispatch-gates self-test: 2173 cases pass.(fast 1913 case(s) in 406.7 s, slow 260 case(s) in 1201.5 s). The slow tier is the one CI runs only onmain's push and hourly runs.node scripts/ablation-replace.mjsin wrap mode:const fullBatteryOnly = eventFree !== expr;was replaced byconst fullBatteryOnly = false;. Anchor count went x1 to x0, and the blob wentb2836327f780tocf8939035532.✗ dispatch-gates self-test (fast tier): 7 of 1913 case(s) failed.These are exactly the 7 predicted: thejobIfReadingtrue case, plus three per dogfood job (the flag, the--commandsline, the plain line). The in-place ablation cases and the Build Core control stayed green.b2836327f780) andgit diff HEADis empty.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackwith no paths derives 32 commands; the change set is the two files vs merge basea422f04fe. All 32 ran with exit 0, each code captured before any pipe.--ranprinted✓ dispatch-gates --ran: 32 derived famil(ies) accounted for — 32 run, 0 NOT-MEASURED (a DERIVED zero — all 32 recorded an exit code and none of them is 3).The same three-path derivation ata422f04fgives the identical set of 32.Acceptance notes
if:carries the same clause, so its row (for.objectui-sha) gets the statement from the same flag. No text is written per job..objectui-sha, keeps its matched-row provenance "CI job filter for 'Console Pin Gate' in ci.yml" with no WHEN. That family is on stdout as a local command the dev runs, so the dev never has to infer that the PR covers it. Not touched here, which keeps this PR inside the term 2 scope. No carrier.dispatch-gates.self-test.mjshas no named-battery roster to register against. Adding one would be a new constant under the freeze, so the cases sit in the existing sections.skip-changeset:scripts/pm/**publishes nothing.Generated by Claude Code