Follow-ups from the 1.4.1 release post-mortem (docs/postmortems/1.4.1-release.md, PR #468).
1. Break up the publishing workflow
release.yml is one monolithic job chain (gate -> tag -> crates.io -> PyPI -> Homebrew -> winget), so a failure or gap in any one channel (winget) blocks or skips everything downstream of it, and a partial failure can't be retried in isolation. Split per-channel publish steps so each can be dispatched/retried independently once the release itself is tagged and the core artifacts (crates.io, GitHub Release) are published.
2. Every channel needs a concrete fix/retry path
winget was "unrecoverable-by-design once a release completes" — no standalone dispatch existed, so a wiring bug (wrong secret) plus no retry path meant it silently failed across 4 releases (1.0.0, 1.4.0, 1.4.1) with no way to fix forward without a full re-release. Same risk likely applies to Homebrew/PyPI. Each publish channel needs its own decoupled, safe-to-re-run path (see release/winget-standalone-dispatch for the winget instance of this).
3. Release -> main should not depend on me
Currently release-track fixes and merges to main require me (Rand) to be present to approve/watch CI cycles. Reduce the human-in-the-loop dependency for routine release-track PRs (docs, gate fixes, wiring fixes) so the pipeline can progress unattended, with escalation only for genuinely ambiguous or risky decisions.
Follow-ups from the 1.4.1 release post-mortem (docs/postmortems/1.4.1-release.md, PR #468).
1. Break up the publishing workflow
release.ymlis one monolithic job chain (gate -> tag -> crates.io -> PyPI -> Homebrew -> winget), so a failure or gap in any one channel (winget) blocks or skips everything downstream of it, and a partial failure can't be retried in isolation. Split per-channel publish steps so each can be dispatched/retried independently once the release itself is tagged and the core artifacts (crates.io, GitHub Release) are published.2. Every channel needs a concrete fix/retry path
winget was "unrecoverable-by-design once a release completes" — no standalone dispatch existed, so a wiring bug (wrong secret) plus no retry path meant it silently failed across 4 releases (1.0.0, 1.4.0, 1.4.1) with no way to fix forward without a full re-release. Same risk likely applies to Homebrew/PyPI. Each publish channel needs its own decoupled, safe-to-re-run path (see release/winget-standalone-dispatch for the winget instance of this).
3. Release -> main should not depend on me
Currently release-track fixes and merges to main require me (Rand) to be present to approve/watch CI cycles. Reduce the human-in-the-loop dependency for routine release-track PRs (docs, gate fixes, wiring fixes) so the pipeline can progress unattended, with escalation only for genuinely ambiguous or risky decisions.