Repository navigation
fix(pm): check-half-states H16 excludes changeset-release/* as H12 does - #25017
Merged
objectstack-fleet[bot] merged 1 commit intoOct 21, 2026
Merged
Conversation
H16's docblock rested on the premise that the Version Packages PR is regenerated from main on every push. That has been false since the version-pr job moved to a six-hourly schedule (#11233): between refreshes changeset-release/main is a static branch, so a dirty one is its normal stale window, and the row's hand-merge remedy is overwritten by the next refresh. The half-state patrol is report-only, so the limb is deleted: the gate and the predicate both exclude the branch, the false paragraph is replaced in place, and the two self-test pins that asserted the old premise now state the deletion. Claude-Session: https://claude.ai/code/session_01M82feuetLzrCiBz41BJb7L Co-authored-by: Claude <noreply@anthropic.com>
Contributor
Author
席位核对ACCEPT ·
Generated by Claude Code |
objectstack-fleet
Bot
deleted the
claude/issue-24856-h16-drop-changeset-release
branch
October 21, 2026 01:28
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 #24856
Clause-②: no
What this does
A deletion in
scripts/pm/check-half-states.mjs, the report-only half-state patrol. Scope is the triage answer on the card (comment 6292721219, scope (b)). H16 now excludeschangeset-release/*the way H12 already does. H16 does not get a new row, any regeneration remedy text, or a threshold for that branch.H16's docblock assumed the Version Packages PR is "regenerated from
mainon every push". That stopped being true when theversion-prjob moved to a six-hourly schedule (#11233).release.yml's own header onorigin/mainsays: "Between refresheschangeset-release/mainis a static branch." So a dirty Version Packages PR is in its normal stale window. H16 flagged it after 2 h and told the reader to hand-mergemaininto a generated branch, which the next refresh overwrites.Changes (one file, +10 / -12)
h16StuckMergeConflict(the predicate, L4262):if ((pr.head?.ref ?? '').startsWith('changeset-release/')) return null;, H12's exact spelling.h16NeedsDetail(the gathering gate, L4197): the same exclusion, returningfalse.mainon every push" is now a 3-line reason that quotesrelease.ymland cites release.yml 的 version-pr 车道改为「定时 + 按需」刷新——终结 Version Packages PR 被每次 main push 强刷、CI 永不收敛的合并竞态 #11233 (L4191). The predicate's existing out-of-scope sentence gains one clause pointing to it (L4248), with no new line. Net prose: -3 lines.H16 gate: a changeset-release head is not a candidate (excluded, as in H12)now expectsfalse.H16: a dirty changeset-release/main PR past the threshold yields no row (the limb is deleted, #11233)now expectsnull.dirty beyond the threshold -> finding,dirty within the threshold -> clean). The case count is 4916 before and after.Where the exclusion lives, and why both functions
if (!h16NeedsDetail(pr)) continue;(L22462).never narrower than the predicate (every flagged row is fetched)invariant requires the gate to fetch every row the predicate can flag. If only the gate excluded the branch, the predicate would still flag it and that invariant would go red. Ablation leg A below measured exactly that. So the predicate carries the exclusion, since every caller ends there.mergeable_state", and the head ref is one of those halves. Without the mirror, every sweep would spend one GET on the Version Packages PR, which the predicate can never flag.Tests (at
43d062e63)a7199ef97):node scripts/pm/check-half-states.mjs --self-test, exit 0,✓ check-half-states self-test: 4916 cases pass.43d062e63): the same command, exit 0,✓ check-half-states self-test: 4916 cases pass.Ablation (the fix was committed first; mutations went through
node scripts/ablation-replace.mjs, which restores itself on exit):2 of 4916 case(s) failed:yields no rowpin failed (it got the old hand-merge row text, expectednull);H16 gate: never narrower than the predicatefailed (got false, want true).4cb17365matchesHEAD, andgit diff HEADis empty.1 of 4916 case(s) failed:H16 gate: a changeset-release head is not a candidate(got true, want false). Restore: blob matchesHEAD, andgit diff HEADis empty.Gates
I derived the local gates with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackat43d062e63: 43 commands. All 43 were run on43d062e63and every one exited 0.pnpm check:pm-dispatch-gateswas run detached, as its header prescribes: fast tier, 1913 cases pass, exit 0.The
--ranreconciliation answered:43 derived famil(ies) accounted for — 43 run, 0 NOT-MEASURED (a DERIVED zero — all 43 recorded an exit code and none of them is 3). It also warned that the tree is 46 commits behindorigin/main62bc12930, and that 4 derivation-input files changed in that range. None of them is this file.origin/maindoes not touchscripts/pm/check-half-states.mjssince the base, andgit merge-treeagainst it is clean, so I did not merge. CI runs on the merge ref.release.ymlis untouched (Tier H).Acceptance notes
H36's banner (now L8273-8276) gives a second reason for excludingchangeset-release/*from the shared-file pairing, and that reason repeats the same stale premise: "it is regenerated frommainon every push — it holds nothing." H36 behaves correctly: it excludes the branch on its first reason, that the Version Packages PR consumes every changeset and would pair with every open PR. Only the stated sub-reason is out of date. The fix would be a prose correction outside this card's declared surface (the claim names H16 only), so I left it alone. No carrier.scripts/pm/check-skill-line-ratchet.mjsL1482 already describes that premise as false since release.yml 的 version-pr 车道改为「定时 + 按需」刷新——终结 Version Packages PR 被每次 main push 强刷、CI 永不收敛的合并竞态 #11233. No other row or tool cites H16's treatment of the branch:.claude/skills/pm-dispatch/**andscripts/pm/**have zero hits.Generated by Claude Code