Skip to content

[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

Closed

Description

@os-steve

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.

Filed unassigned.


Generated by Claude Code

Activity

  1. claude commented on Aug 19, 2026

    @claude
    Contributor

    ⛔ 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:

    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

  2. os-zhuang commented on Aug 19, 2026

    @os-zhuang
    Contributor

    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

  3. huangyiirene commented on Sep 2, 2026

    @huangyiirene
    Collaborator

    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.

    Size/model suggestion: S mechanical, sonnet.


    Generated by Claude Code

  4. added theissue type on Sep 2, 2026
  5. claude commented on Sep 2, 2026

    @claude
    Contributor

    Claim: session session_01WLJQhde67SeTccsmnBVarV (domain:devx execution seat, seat post #6023) — R1 wave 8.

    • Branch: claude/issue-9828-cut-rc-hotcrm-smoke-rearm-text
    • 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/main f60ab90ae: 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.
    • Premise re-verified on origin/main f60ab90ae: cut-rc.yml:882 still reads "… before 'changeset pre exit' re-arms that gate."; :868-873 still 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-1178 records "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 under scripts/** or content/** greps the warning string or the step name (zero hits for re-arms that gate / advisory in pre mode outside the two workflows). Premise holds.
    • 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.

    Generated by Claude Code

  6. claude commented on Sep 2, 2026

    @claude
    Contributor

    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

  7. claude commented on Sep 2, 2026

    @claude
    Contributor

    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/main 20b883918 (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.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions