Release-job CLI invocations have no pre-merge coverage — a breaking `min`/`mip` change only surfaces on a release run · Issue #1035 · gominimal/minimal · GitHub
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
Release-job CLI invocations have no pre-merge coverage — a breaking min/mip change only surfaces on a release run #1035
Surface:.github/workflows/release.yml (release job) · Class: CI coverage gap
gominimal/minimal#1009 split min completions <shell> into completions print and completions install. The release job's Generate completions step still called the flat form. Nothing caught it until a release was dispatched twenty days later — run 30425725370 — where it exited 2 and took the GCS archive upload, the GitHub Release, and the whole stage-installer job down with it. Every build job in that run was green; only packaging broke, after ~1h of build time. Fixed in gominimal/minimal#1034.
The general shape: the release job shells out to freshly-built binaries, and those invocations are only executed on a workflow_dispatch release. A breaking CLI change passes every PR gate, merges, and sits until someone cuts a release.
release.yml:724-732 9 invocations across mip / min / minimald
Fix
Give those invocations a pre-merge gate. Sketch, cheapest first:
Move the completions generation into a scripts/ helper the release job calls, and exercise that helper against target/debug binaries in just ci. Fits the test-extension contract in CONTRIBUTING.md — .github/workflows/ is frozen, so the logic belongs in scripts/ anyway.
Or a smoke test that runs each shipped binary's release-path subcommands and asserts exit 0. Cheap, no restructuring, catches exactly this class.
Assert the content too, not just the exit code: the generated min shim registers the command min, so the file it is written to has to be named min/_min/min.fish. That mismatch shipped silently from the #737 binary rename until #1034 — an exit-code-only check would not have found it.
Worth auditing the rest of the release and stage-installer jobs for other unexercised CLI calls while in there.
Kind:chore · Route:work · Confidence: 0.88 Target:gominimal/minimal — release.yml, min/mip/minimald binaries, scripts/ fix location, and just ci contract are all in minimal.
Evidence
Repo peek:release.yml:724-732 contains 9 CLI invocations exercised only at release dispatch. CONTRIBUTING.md freezes .github/workflows/; fix belongs in scripts/. Both point unambiguously at gominimal/minimal.
Routing precedents: Five routing-outcome entries (project: inbox, author: inbox-route-retro) retrieved; all show outcome/f2 for gominimal/minimal patches, consistent with routing design-judgment items as work rather than patch.
Related:feature: CI refactor — clear build/test phases, three gating targets #687 (CI refactor epic, open) has an unresolved PR9b subtask for post-release artifact smoke. Distinct from what this issue requests: PR9b verifies released binaries post-dispatch; this issue asks for a just ci gate that catches breaking CLI changes before merge. Marked related.
Route rationale
work rather than patch: the fix requires a design choice between three approaches (scripts/ helper, standalone smoke test, or content-asserting check) and the author explicitly includes an audit scope for other unexercised release-job calls. Not an unambiguous single-file fix. Confidence 0.88 on gominimal/minimal as sole target.
[inbox-route:decision]
{"schema":"inbox-route/v1","issue":409,"issue_node_id":"I_kwDOSUhdos8AAAABKm1IpQ","dry_run":false,"kind":"chore","route":"work","confidence":0.88,"targets":[{"repo":"gominimal/minimal","reason":"release.yml, min/mip/minimald binaries, scripts/ fix location, and just ci contract are all in minimal"}],"labels":["kind:chore","priority:should-have"],"patch":null,"work_issue":{"title":"chore: add pre-merge smoke coverage for release-job CLI invocations","body":"## Summary\n\nThe release job shells out to freshly-built binaries (9 invocations in `release.yml:724-73
8000
2` across min, mip, and minimald), but these calls are never exercised before a release is dispatched. A breaking CLI change passes all PR gates and sits undetected until someone cuts a release.\n\n## Details\n\nThe pattern surfaced when `completions print`/`completions install` replaced the flat `min completions <shell>` form (minimal#1009) — the release job kept calling the old form, exited 2, and took GCS upload, the GitHub Release, and stage-installer down with it. Fixed in minimal#1034, but the structural gap remains for all release-path subcommands at `release.yml:724-732`.\n\nCONTRIBUTING.md freezes `.github/workflows/`, so the fix belongs in `scripts/`.\n\nApproaches (cheapest first): (1) move completions generation into a `scripts/` helper, exercise it against `target/debug` binaries in `just ci`; (2) standalone smoke test asserting exit 0 for each release-path subcommand; (3) also assert content — e.g. the generated shim file is named correctly for the binary (an exit-code-only gate would not have caught the #737 rename mismatch).\n\nAuthor recommends auditing the rest of the release and stage-installer jobs for other unexercised CLI calls.\n\nRelated: #687 (open CI refactor epic) has PR9b planned for post-release artifact smoke — this is the complementary pre-merge gate.\n\n## Suggested next step\n\nImplement the `scripts/` helper approach or the standalone smoke test, wire into `just ci`, and verify it would have caught the minimal#1009 regression. Then audit `release.yml:724-732` and the stage-installer job for other unexercised CLI calls."},"related":[{"repo":"gominimal/minimal","number":687,"relation":"related"}],"rationale":"The issue describes a CI coverage gap in gominimal/minimal: 9 CLI invocations in release.yml:724-732 are exercised only during a workflow_dispatch release, so a breaking CLI change can merge undetected. The vocabulary (min, mip, minimald, release.yml, scripts/, just ci, CONTRIBUTING.md) is entirely within minimal. No prior routing or duplicates found in the inbox or in minimal; minimal#687 (open CI refactor epic) has a thematically related but distinct open PR9b subtask for post-release artifact smoke — this issue is the complementary pre-merge gate. Route is work rather than patch: the fix requires choosing between three design approaches and includes an audit scope, not an unambiguous single-file change. Precedent search returned F2 outcomes for minimal patches, consistent with routing design-judgment items as work. Confidence 0.88 on gominimal/minimal as sole target."}
Activity
gominimal-aw-bot commentedon Jul 29, 2026
Routing triage — #1035
Kind:
chore· Route:work· Confidence: 0.88Target:
gominimal/minimal— release.yml, min/mip/minimald binaries, scripts/ fix location, and just ci contract are all in minimal.Evidence
release.yml:724-732contains 9 CLI invocations exercised only at release dispatch. CONTRIBUTING.md freezes.github/workflows/; fix belongs inscripts/. Both point unambiguously at gominimal/minimal.routing-outcomeentries (project: inbox, author: inbox-route-retro) retrieved; all show outcome/f2 for gominimal/minimal patches, consistent with routing design-judgment items asworkrather thanpatch.just cigate that catches breaking CLI changes before merge. Markedrelated.Route rationale
workrather thanpatch: the fix requires a design choice between three approaches (scripts/ helper, standalone smoke test, or content-asserting check) and the author explicitly includes an audit scope for other unexercised release-job calls. Not an unambiguous single-file fix. Confidence 0.88 on gominimal/minimal as sole target.[inbox-route:decision]
{"schema":"inbox-route/v1","issue":409,"issue_node_id":"I_kwDOSUhdos8AAAABKm1IpQ","dry_run":false,"kind":"chore","route":"work","confidence":0.88,"targets":[{"repo":"gominimal/minimal","reason":"release.yml, min/mip/minimald binaries, scripts/ fix location, and just ci contract are all in minimal"}],"labels":["kind:chore","priority:should-have"],"patch":null,"work_issue":{"title":"chore: add pre-merge smoke coverage for release-job CLI invocations","body":"## Summary\n\nThe release job shells out to freshly-built binaries (9 invocations in `release.yml:724-73 8000 2` across min, mip, and minimald), but these calls are never exercised before a release is dispatched. A breaking CLI change passes all PR gates and sits undetected until someone cuts a release.\n\n## Details\n\nThe pattern surfaced when `completions print`/`completions install` replaced the flat `min completions <shell>` form (minimal#1009) — the release job kept calling the old form, exited 2, and took GCS upload, the GitHub Release, and stage-installer down with it. Fixed in minimal#1034, but the structural gap remains for all release-path subcommands at `release.yml:724-732`.\n\nCONTRIBUTING.md freezes `.github/workflows/`, so the fix belongs in `scripts/`.\n\nApproaches (cheapest first): (1) move completions generation into a `scripts/` helper, exercise it against `target/debug` binaries in `just ci`; (2) standalone smoke test asserting exit 0 for each release-path subcommand; (3) also assert content — e.g. the generated shim file is named correctly for the binary (an exit-code-only gate would not have caught the #737 rename mismatch).\n\nAuthor recommends auditing the rest of the release and stage-installer jobs for other unexercised CLI calls.\n\nRelated: #687 (open CI refactor epic) has PR9b planned for post-release artifact smoke — this is the complementary pre-merge gate.\n\n## Suggested next step\n\nImplement the `scripts/` helper approach or the standalone smoke test, wire into `just ci`, and verify it would have caught the minimal#1009 regression. Then audit `release.yml:724-732` and the stage-installer job for other unexercised CLI calls."},"related":[{"repo":"gominimal/minimal","number":687,"relation":"related"}],"rationale":"The issue describes a CI coverage gap in gominimal/minimal: 9 CLI invocations in release.yml:724-732 are exercised only during a workflow_dispatch release, so a breaking CLI change can merge undetected. The vocabulary (min, mip, minimald, release.yml, scripts/, just ci, CONTRIBUTING.md) is entirely within minimal. No prior routing or duplicates found in the inbox or in minimal; minimal#687 (open CI refactor epic) has a thematically related but distinct open PR9b subtask for post-release artifact smoke — this issue is the complementary pre-merge gate. Route is work rather than patch: the fix requires choosing between three design approaches and includes an audit scope, not an unambiguous single-file change. Precedent search returned F2 outcomes for minimal patches, consistent with routing design-judgment items as work. Confidence 0.88 on gominimal/minimal as sole target."}gominimal-aw-bot commentedon Jul 29, 2026
[inbox-route:ledger]
Routed from #1035 by inbox-route (https://github.com/gominimal/inbox/actions/runs/30432905669)
Routing-Key: inbox-route/I_kwDOSUhdos8AAAABKm1IpQ
Route: work
Work-Issue: #1035 (in-place — the transferred issue is the deliverable)