You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
[finding] cut-rc.yml's hotcrm smoke warning still tells the reader changeset pre exit re-arms that gate — release.yml records the keying was changed away from pre-exit #9828
Found while working #9561 / PR #9827 (the launch-window major guard's two stale "dormant" comments). Deliberately not folded into that PR: same defect class, but a different guard, and its correct replacement is a statement about release policy rather than a mechanical restatement.
The stale claim
.github/workflows/cut-rc.yml L795, inside the Downstream backward-compat smoke step's warning path:
echo "::warning::hotcrm@${HOTCRM_REF} is incompatible with the pre-release train — expected for this window's deliberate removals. Ship a migrated hotcrm release and bump HOTCRM_REF in release.yml before 'changeset pre exit' re-arms that gate."
The step comment just above it (L781-786) rests on the same keying: "In pre mode ... the #3600 amendment makes it advisory".
Why it is stale
.github/workflows/release.yml L511-535 records the correction in full, in the past tense:
It did exactly that (#8643, 2026-08-14) — and the deadlock was still on, because HOTCRM_REF was and is v2.1.0, i.e. ObjectStack 14.7. So the re-armed gate stood between the 17.0.0 GA publish and a migration nobody had done yet, which is the same deadlock #3600 named, one event later. The keying was the bug: pre-exit is not when a migrated hotcrm release starts existing. Shipping one is.
So the posture is now tied to THAT event instead.
So changeset pre exit no longer re-arms the gate — release.yml's BLOCKING switch does, and it is keyed on shipping a migrated hotcrm and bumping HOTCRM_REF. cut-rc.yml still tells a curator, in operator-facing warning text on a live publish lane, to race a deadline that no longer exists.
This is worse than an ordinary stale comment because it is echoed into the workflow run's annotations, where a release curator reads it at exactly the moment they are deciding whether to act.
Shape of a fix
Not a wording pass. The warning should name the condition release.yml actually keys on — ship a hotcrm release migrated to v17 and bump HOTCRM_REF, at which point the gate becomes blocking again — and should not name changeset pre exit as the re-arming event at all. The L781-786 step comment needs the same treatment: "advisory in pre mode" is true on this lane for a different reason (the lane only runs in pre mode) than the one #3600 gave, and conflating them is how the pre-exit keying survived here.
Worth checking in the same pass whether the step's name: ("advisory in pre mode") should say what makes it advisory.
Not claimed
Whether the downstream gate's current posture is the right one — that is release policy and #8643 already ruled on it. This card is only about cut-rc.yml describing a keying the repo replaced.
⛔ PM: fenced — cut-rc.yml belongs to epic #9465 for the duration
Marking pm:blocked so nobody picks this up and collides with the @changesets/cli v3 migration.
.github/workflows/cut-rc.yml is named explicitly in epic #9465's declared file territory:
.changeset/** · scripts/check-changeset-no-major.mjs · scripts/check-empty-changeset.mjs · scripts/check-changeset-fixed.mjs · scripts/objectui-changeset-digest.mjs · .github/workflows/cut-rc.yml · .github/workflows/release.yml · .github/workflows/pr-automation.yml (changeset-related steps only) · root package.json (the @changesets/cli range and the version script)
It sits outside the scoping parenthetical, so it is fenced however the open question on that parenthetical resolves. Two devs have already handed pieces over to that epic rather than route around it (PR #9620's version-script preflight, PR #9648's allowlist rewiring) — this follows the same path.
Unblock when: epic #9465 completes, or its holder says this one line is fine to take.
Why this is worth keeping open rather than folding into a docs pass
The defect is operator-facing and it points a human at a deadline that was already measured not to work.
cut-rc.yml:795 tells a release curator to act "before changeset pre exit re-arms that gate". But release.yml:511-535 records (#8643) that pre-exit did re-arm it, the deadlock persisted anyway, and the keying was subsequently moved to shipping a migrated hotcrm release + bumping HOTCRM_REF.
So the instruction does not merely describe a stale state — it tells someone to race a deadline that is not the operative one, and the correct action is now a different action entirely.
⚠️The fix is a release-policy statement, not a mechanical restatement. The #9561 dev correctly declined to ride it in for exactly that reason: rewriting the sentence requires knowing what a curator should do now, and that is the epic holder's or the maintainer's call, not a comment edit.
Shape for whoever takes it
Same discipline PRs #9764, #9795 and #9827 landed today, and it is the whole reason those cards keep recurring:
state the condition, never the phase or the state — "before pre exit" is a state claim that expired; the replacement must say what actually gates the action;
Unlock scan (R+89, triage seat, session session_019kDRpB7D2XzVzkaLp57T5D): upstream #9465 is CLOSED (completed) — the changesets v3 migration landed. Card face re-verified on origin/main (a39b02a6) before release: .github/workflows/cut-rc.yml:882 still tells the operator to act "before changeset pre exit re-arms that gate", while release.yml:1128-1143 records in its own comment that the keying was changed away from pre-exit ("The keying was the bug: pre-exit is not when a migrated hotcrm …", re-arm = bump HOTCRM_REF). ⇒ The warning text is still false and still contradicts its sibling workflow.
Released → pm:queue · priority:p3 · domain:devx · type Bug (false operator guidance in a shipped workflow message). Lands in: cut-rc.yml's hotcrm smoke warning string only — make it say what release.yml says (ship a migrated hotcrm release, bump HOTCRM_REF), one sentence, no logic change.
Worktree:../objectstack-9828 (dedicated per-task worktree, off origin/main)
Domain:domain:devx per the unlock-scan triage (comment 5502992124): a release-lane workflow's operator-facing message; no code package moves.
File surface:.github/workflows/cut-rc.yml — the Downstream backward-compat smoke step only (on origin/mainf60ab90ae: step comment :868-873, name::874, warning string :882). The warning must say what release.yml says (ship a hotcrm release migrated to v17, bump HOTCRM_REF, set BLOCKING — that is what re-arms the gate) and must not name changeset pre exit as the re-arming event; the step comment's "chore(release)!: enter RC pre-mode and anchor the train as the v17 major #3600 amendment" keying gets the same correction. ⛔ No logic change (no if:/env:/run: control-flow edits, HOTCRM_REF value untouched). ⛔ release.yml untouched (it is the correct side). ⛔ No other workflow file.
Container & model: subagent lane (S mechanical), sonnet — per the triage's size/model suggestion.
Clause ②: not reached — prose in a workflow message and comment; the step's behaviour (advisory, ::warning::) is unchanged.
Serial constraints: none — no open PR (30 open at 13:1xZ) touches cut-rc.yml or release.yml; no in-flight card of this seat holds either. Changeset: .github/**-only ⇒ skip-changeset label on the PR.
{
"issue": 9828,
"status": "done",
"branch": "claude/issue-9828-cut-rc-hotcrm-smoke-rearm-text",
"pr": "https://github.com/objectstack-ai/objectstack/pull/14610",
"premise_still_valid": true,
"summary": "cut-rc.yml's Downstream backward-compat smoke step warning told a curator that 'changeset pre exit' re-arms the gate; release.yml's own comment records that keying was superseded (pre-exit fired in #8643, deadlock persisted anyway, because the actual re-arm event is shipping a migrated hotcrm release + bumping HOTCRM_REF). Rewrote the warning string to mirror release.yml's wording (ship a migrated hotcrm release, bump it, set BLOCKING=1 in release.yml), and rewrote the step comment to drop the superseded '#3600 amendment' keying in favor of this lane's actual (still-true) reason for being advisory: no BLOCKING switch here, and the lane only ever runs in pre mode. name: left unchanged (literally true on this lane) with the decision stated in the PR body. No logic change; release.yml untouched.",
"tests": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands .github/workflows/cut-rc.yml derived 21 commands (11 pnpm, 10 direct node), unchanged across three derivations taken at three different origin/main tips (f60ab90ae, 7085f9053, a5b95ee6e) during the run. --ran against the run record reconciled '21 derived, 21 run, 0 NOT-MEASURED, 0 UNRUN' -> 'dispatch-gates --ran: 21 derived families accounted for'. All 21 ran green at least once on this branch: the 10 direct-node checks (check-aggregator-roster, check-position-name-fold-loaders, check-required-contexts, check-self-test-wired, check-self-test-workflow-commands, check-shard-attestation, check-step-collectors, check-whole-set-label-write, docs-audit/check-drift-comment, pm/ci-failure --self-test) were re-run and stayed exit 0 on the final merged tree (a5b95ee6e). The pnpm-wrapped checks (check:agent-test-spelling, check:declared-population-live, check:node-version, check:pnpm-acquisition, check:pnpm-filter-targets, check:required-contexts, check:shard-attestation, check:stall-guard-budget, check:stall-guard-headroom) were re-run through scripts/pm/os-verify-lock.sh (queued behind sibling agents' heavy runs, resumed via a stable OS_VERIFY_LOCK_SLOT each time -- no place lost) on the tree merged to 7085f9053 and all showed VERDICT command-exit 0; check:pnpm-filter-targets's re-run picked up the new example workspace package from the merge (79 packages vs 78 before), confirming it read the merged tree rather than a cache. The heavy pnpm check:pm-dispatch-gates self-test (1240/1240 assertions, VERDICT command-exit 0, held the lock 14m23s) ran once, on the pre-merge tree at f60ab90ae; origin/main moved twice more during the run (to 7085f9053 then a5b95ee6e) and was merged in each time with git diff --name-only confirming zero overlap with .github/workflows/cut-rc.yml or release.yml, so this 14-minute self-test was not re-run a second or third time against a tree with no relevant change -- declared narrowing, not an omission. check-nul-bytes.mjs: clean on the final tree. Scope verification: git diff --stat against origin/main -- exactly one file, .github/workflows/cut-rc.yml, 6 insertions/6 deletions; git diff origin/main -- .github/workflows/release.yml -- empty. git grep -n 're-arms that gate|advisory in pre mode|Downstream backward-compat smoke' -- scripts content docs .github on the final tree: 're-arms that gate' has zero hits anywhere (the false claim is gone); 'advisory in pre mode' and 'Downstream backward-compat smoke' each hit only the two workflows' step names -- confirms nothing under scripts/, content/, or docs/ reads or tests this warning string or step name.",
"mcp_calls": "0 -- all GitHub reads/writes for this run went through REST (curl / python urllib) with $GITHUB_TOKEN, per the dispatch's channel guidance; no MCP GitHub tool was called",
"open_questions": [],
"out_of_scope_findings": []
}
ACCEPT — PR #14610 merged to main as 8227a1987 (out of the merge queue 16:31:23Z; added_to_merge_queue 15:19:10Z — a 72-minute transit through two evicted batches ahead of it). Session session_01WLJQhde67SeTccsmnBVarV (domain:devx execution seat, seat post #6023), R1 wave 8.
Close-out probes on origin/main20b883918 (verify worktree, 8227a1987 an ancestor):
.github/workflows/cut-rc.yml:882: the ::warning:: now ends "… Ship a migrated hotcrm release, bump it, and set BLOCKING=1 in .github/workflows/release.yml to re-arm this gate." — the same words as release.yml's own warning, naming the condition, never the phase.
git grep -c 're-arms that gate' origin/main -- .github scripts content docs → 0 hits anywhere: the changeset pre exit keying is gone from the repo.
cut-rc.yml:869: the step comment says the step is "advisory by construction — it has no BLOCKING switch — because this lane only ever runs in pre mode" and points at release.yml's gate comment for the why (one fact, one place). name: kept as-is (literally true on this lane), decision recorded in the PR body.
.github/workflows/release.yml untouched (empty diffstat between the dispatch base and origin/main for that file). One file, +6 −6, skip-changeset.
Against the unlock scan (5502992124) and the card: warning string says what release.yml says, one sentence, no logic change — held; the step comment no longer rests on the #3600 amendment — held; release.yml not synced (duplication removed, not mirrored twice) — held; nothing tests the string (recorded: zero grep hits outside the two workflows). Zero rework.
pm:dispatched removed with this comment; the card closes via the PR's Fixes #9828.
Activity
claude commentedon Aug 19, 2026
⛔ PM: fenced —
cut-rc.ymlbelongs to epic #9465 for the durationMarking
pm:blockedso nobody picks this up and collides with the@changesets/cliv3 migration..github/workflows/cut-rc.ymlis named explicitly in epic #9465's declared file territory:It sits outside the scoping parenthetical, so it is fenced however the open question on that parenthetical resolves. Two devs have already handed pieces over to that epic rather than route around it (PR #9620's version-script preflight, PR #9648's allowlist rewiring) — this follows the same path.
Unblock when: epic #9465 completes, or its holder says this one line is fine to take.
Why this is worth keeping open rather than folding into a docs pass
The defect is operator-facing and it points a human at a deadline that was already measured not to work.
cut-rc.yml:795tells a release curator to act "beforechangeset pre exitre-arms that gate". Butrelease.yml:511-535records (#8643) that pre-exit did re-arm it, the deadlock persisted anyway, and the keying was subsequently moved to shipping a migrated hotcrm release + bumpingHOTCRM_REF.So the instruction does not merely describe a stale state — it tells someone to race a deadline that is not the operative one, and the correct action is now a different action entirely.
Shape for whoever takes it
Same discipline PRs #9764, #9795 and #9827 landed today, and it is the whole reason those cards keep recurring:
"before pre exit"is a state claim that expired; the replacement must say what actually gates the action;check-changeset-no-major --self-testgoes red repo-wide after a release exits pre mode — its control requires major-declaring changesets AND apre.jsonthat no longer exists #8654 while the prose was left behind, and that asymmetry is how these survive.Refs: #9561 / PR #9827 (where this was found) · #8643 (the record that pre-exit did not resolve the deadlock) · #9465 (the fence)
Generated by Claude Code
os-zhuang commentedon Aug 19, 2026
Triage backfill (machine-readable index line; the prose "Unblock when: epic #9465 completes" was invisible to the unlock scan's grep):
Blocked-by: #9465
No state change — the epic is still open (4/5 sub-issues done); this line only makes the existing wait scannable.
Generated by Claude Code
feat(pm): H4/H14/blocking-index read comment-level Blocked-by lines (#…
feat(pm): H4/H14/blocking-index read comment-level Blocked-by lines (o…
huangyiirene commentedon Sep 2, 2026
Unlock scan (R+89, triage seat, session
session_019kDRpB7D2XzVzkaLp57T5D): upstream #9465 is CLOSED (completed) — the changesets v3 migration landed. Card face re-verified onorigin/main(a39b02a6) before release:.github/workflows/cut-rc.yml:882still tells the operator to act "beforechangeset pre exitre-arms that gate", whilerelease.yml:1128-1143records in its own comment that the keying was changed away from pre-exit ("The keying was the bug: pre-exit is not when a migrated hotcrm …", re-arm = bumpHOTCRM_REF). ⇒ The warning text is still false and still contradicts its sibling workflow.Released →
pm:queue·priority:p3·domain:devx· type Bug (false operator guidance in a shipped workflow message). Lands in:cut-rc.yml's hotcrm smoke warning string only — make it say whatrelease.ymlsays (ship a migrated hotcrm release, bumpHOTCRM_REF), one sentence, no logic change.Size/model suggestion: S mechanical,
sonnet.Generated by Claude Code
claude commentedon Sep 2, 2026
Claim: session
session_01WLJQhde67SeTccsmnBVarV(domain:devx execution seat, seat post #6023) — R1 wave 8.claude/issue-9828-cut-rc-hotcrm-smoke-rearm-text../objectstack-9828(dedicated per-task worktree, offorigin/main)domain:devxper the unlock-scan triage (comment 5502992124): a release-lane workflow's operator-facing message; no code package moves..github/workflows/cut-rc.yml— theDownstream backward-compat smokestep only (onorigin/mainf60ab90ae: step comment:868-873,name::874, warning string:882). The warning must say whatrelease.ymlsays (ship a hotcrm release migrated to v17, bumpHOTCRM_REF, setBLOCKING— that is what re-arms the gate) and must not namechangeset pre exitas the re-arming event; the step comment's "chore(release)!: enter RC pre-mode and anchor the train as the v17 major #3600 amendment" keying gets the same correction. ⛔ No logic change (noif:/env:/run:control-flow edits,HOTCRM_REFvalue untouched). ⛔release.ymluntouched (it is the correct side). ⛔ No other workflow file.origin/mainf60ab90ae:cut-rc.yml:882still reads "… before 'changeset pre exit' re-arms that gate.";:868-873still rests on "the chore(release)!: enter RC pre-mode and anchor the train as the v17 major #3600 amendment makes it advisory";release.yml:1153-1178records "The keying was the bug: pre-exit is not when a migrated hotcrm release starts existing. Shipping one is." and "TO RE-ARM: ship a hotcrm release migrated to v17, bump HOTCRM_REF to it, set BLOCKING to '1'." — the contradiction the card names is live. Upstream fence 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 is CLOSED (completed). Nothing underscripts/**orcontent/**greps the warning string or the step name (zero hits forre-arms that gate/advisory in pre modeoutside the two workflows). Premise holds.::warning::) is unchanged.cut-rc.ymlorrelease.yml; no in-flight card of this seat holds either. Changeset:.github/**-only ⇒skip-changesetlabel on the PR.Generated by Claude Code
claude commentedon Sep 2, 2026
os-dev-report
{ "issue": 9828, "status": "done", "branch": "claude/issue-9828-cut-rc-hotcrm-smoke-rearm-text", "pr": "https://github.com/objectstack-ai/objectstack/pull/14610", "premise_still_valid": true, "summary": "cut-rc.yml's Downstream backward-compat smoke step warning told a curator that 'changeset pre exit' re-arms the gate; release.yml's own comment records that keying was superseded (pre-exit fired in #8643, deadlock persisted anyway, because the actual re-arm event is shipping a migrated hotcrm release + bumping HOTCRM_REF). Rewrote the warning string to mirror release.yml's wording (ship a migrated hotcrm release, bump it, set BLOCKING=1 in release.yml), and rewrote the step comment to drop the superseded '#3600 amendment' keying in favor of this lane's actual (still-true) reason for being advisory: no BLOCKING switch here, and the lane only ever runs in pre mode. name: left unchanged (literally true on this lane) with the decision stated in the PR body. No logic change; release.yml untouched.", "tests": "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands .github/workflows/cut-rc.yml derived 21 commands (11 pnpm, 10 direct node), unchanged across three derivations taken at three different origin/main tips (f60ab90ae, 7085f9053, a5b95ee6e) during the run. --ran against the run record reconciled '21 derived, 21 run, 0 NOT-MEASURED, 0 UNRUN' -> 'dispatch-gates --ran: 21 derived families accounted for'. All 21 ran green at least once on this branch: the 10 direct-node checks (check-aggregator-roster, check-position-name-fold-loaders, check-required-contexts, check-self-test-wired, check-self-test-workflow-commands, check-shard-attestation, check-step-collectors, check-whole-set-label-write, docs-audit/check-drift-comment, pm/ci-failure --self-test) were re-run and stayed exit 0 on the final merged tree (a5b95ee6e). The pnpm-wrapped checks (check:agent-test-spelling, check:declared-population-live, check:node-version, check:pnpm-acquisition, check:pnpm-filter-targets, check:required-contexts, check:shard-attestation, check:stall-guard-budget, check:stall-guard-headroom) were re-run through scripts/pm/os-verify-lock.sh (queued behind sibling agents' heavy runs, resumed via a stable OS_VERIFY_LOCK_SLOT each time -- no place lost) on the tree merged to 7085f9053 and all showed VERDICT command-exit 0; check:pnpm-filter-targets's re-run picked up the new example workspace package from the merge (79 packages vs 78 before), confirming it read the merged tree rather than a cache. The heavy pnpm check:pm-dispatch-gates self-test (1240/1240 assertions, VERDICT command-exit 0, held the lock 14m23s) ran once, on the pre-merge tree at f60ab90ae; origin/main moved twice more during the run (to 7085f9053 then a5b95ee6e) and was merged in each time with git diff --name-only confirming zero overlap with .github/workflows/cut-rc.yml or release.yml, so this 14-minute self-test was not re-run a second or third time against a tree with no relevant change -- declared narrowing, not an omission. check-nul-bytes.mjs: clean on the final tree. Scope verification: git diff --stat against origin/main -- exactly one file, .github/workflows/cut-rc.yml, 6 insertions/6 deletions; git diff origin/main -- .github/workflows/release.yml -- empty. git grep -n 're-arms that gate|advisory in pre mode|Downstream backward-compat smoke' -- scripts content docs .github on the final tree: 're-arms that gate' has zero hits anywhere (the false claim is gone); 'advisory in pre mode' and 'Downstream backward-compat smoke' each hit only the two workflows' step names -- confirms nothing under scripts/, content/, or docs/ reads or tests this warning string or step name.", "mcp_calls": "0 -- all GitHub reads/writes for this run went through REST (curl / python urllib) with $GITHUB_TOKEN, per the dispatch's channel guidance; no MCP GitHub tool was called", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
Generated by Claude Code
claude commentedon Sep 2, 2026
ACCEPT — PR #14610 merged to
mainas8227a1987(out of the merge queue 16:31:23Z;added_to_merge_queue15:19:10Z — a 72-minute transit through two evicted batches ahead of it). Sessionsession_01WLJQhde67SeTccsmnBVarV(domain:devx execution seat, seat post #6023), R1 wave 8.Close-out probes on
origin/main20b883918(verify worktree,8227a1987an ancestor):.github/workflows/cut-rc.yml:882: the::warning::now ends "… Ship a migrated hotcrm release, bump it, and set BLOCKING=1 in .github/workflows/release.yml to re-arm this gate." — the same words asrelease.yml's own warning, naming the condition, never the phase.git grep -c 're-arms that gate' origin/main -- .github scripts content docs→ 0 hits anywhere: thechangeset pre exitkeying is gone from the repo.cut-rc.yml:869: the step comment says the step is "advisory by construction — it has no BLOCKING switch — because this lane only ever runs in pre mode" and points atrelease.yml's gate comment for the why (one fact, one place).name:kept as-is (literally true on this lane), decision recorded in the PR body..github/workflows/release.ymluntouched (empty diffstat between the dispatch base andorigin/mainfor that file). One file,+6 −6,skip-changeset.Against the unlock scan (5502992124) and the card: warning string says what
release.ymlsays, one sentence, no logic change — held; the step comment no longer rests on the#3600 amendment— held;release.ymlnot synced (duplication removed, not mirrored twice) — held; nothing tests the string (recorded: zero grep hits outside the two workflows). Zero rework.pm:dispatchedremoved with this comment; the card closes via the PR'sFixes #9828.Generated by Claude Code