Repository navigation
Description
Problem
Release readiness still contains shell control flow for repository state, remote candidate identity, version checks, check results, changelog preview and informational version reporting. The current boundaries are tools/release-readiness.sh:61, tools/release-readiness.sh:88, tools/release-readiness.sh:100, tools/release-readiness.sh:119, tools/release-readiness.sh:153 and tools/release-readiness.sh:171, on origin/main at a0347a715fab580ece45edfcb3d13509620459a8.
The release chain changes this contract before the port: #542 retains standalone read-only diagnostics, explicit-candidate evaluation and optional bounded waiting. This split moves the surviving shell behavior to Go after that handoff; it does not deliver those release features itself.
This is the readiness split of #332. Part of #588.
Acceptance criteria
- AC1: Default and explicit-candidate invocations identify the same evaluated commit as the completed release chain, including invocation from another branch or detached HEAD.
- AC2: Eligibility decisions equal the completed chain's decisions for clean/dirty state, candidate movement, version assertions, dependencies, coverage evidence and release state wherever those checks apply to the invocation.
- AC3: Missing, unreadable, unfinished, failed or unknown required-check evidence never produces an eligible verdict.
- AC4: Version-check, changelog-preview and informational-version results retain the completed chain's output and gating significance.
- AC5: Existing bounded-wait invocations retain their deadline, cancellation and terminal-result behavior.
- AC6: All diagnostic fields, stdout/stderr placement and exit statuses equal the surviving shell contract for the same observed state.
- AC7: Non-functional: readiness changes no repository files, index, refs, trust settings, release state or remote publication state.
- AC8: Surviving entry points end as thin shell wrappers that probe the Go subcommand without side effects and fall back to the frozen post-chain shell only when that capability is absent.
- AC9: A supported Go failure never invokes shell fallback or repeats evaluation to obtain success.
- AC10: Non-functional: configurations and invocations accepted by release N-2 retain their supported diagnostic behavior without raising the binary floor or requiring consumer edits.
- AC11: The same readiness inputs produce equivalent results on supported Linux, macOS and Windows environments.
Scope and non-goals
The current Bats corpus covers another branch and detached HEAD at the release commit, divergent HEAD, absent release branch, empty changelog preview, the finished-release-job exception, an in-progress release and unrelated failing checks (tests/tools/release-readiness.bats:60, tests/tools/release-readiness.bats:71, tests/tools/release-readiness.bats:79, tests/tools/release-readiness.bats:93, tests/tools/release-readiness.bats:101, tests/tools/release-readiness.bats:114, tests/tools/release-readiness.bats:125, tests/tools/release-readiness.bats:137, tests/tools/release-readiness.bats:150). Version-check integration is also exercised at tests/tools/check-versions.bats:233.
Every current case must have a recorded disposition: preserved in Go, or superseded by a specific accepted release-chain requirement and its regression. In particular, today's acceptance of neutral/skipped check results and finished failed release runs (tools/release-readiness.sh:133) must not override the stricter candidate-check policy delivered by #536. Stderr chatter must not satisfy an empty changelog preview (tools/release-readiness.sh:153). Preserve applicable failed/empty subprocess results, diagnostic aggregation and informational-only version derivation.
Non-goals: asset publication, reusable release extraction or skill packaging, new candidate/check/dependency policy, activation or recovery, new wait modes, and all obsolete dispatch/clone/watcher behavior removed by #542. Do not recreate interfaces retired by the chain. Do not port the already-Go version checker (tools/check-versions.sh:4). Fallback retirement is separate D9 follow-up work.
The excluded release-shell behavior has explicit owners:
- refactor(release): remove obsolete dispatch orchestration #542 owns retirement of dispatcher version validation, readiness refusal and explicit/default-version dispatch (
tools/release-dispatch.sh:47,tools/release-dispatch.sh:68,tools/release-dispatch.sh:73), including its existing Bats cases. This port must not translate a dispatcher the chain removes. - refactor(release): remove obsolete dispatch orchestration #542 owns the clone manager's prepare/reuse, toolchain preparation, invoking-checkout advisory, refresh, path, run and cleanup behavior (
.claude/skills/release/scripts/release-clone.sh:107,.claude/skills/release/scripts/release-clone.sh:146,.claude/skills/release/scripts/release-clone.sh:164,.claude/skills/release/scripts/release-clone.sh:189,.claude/skills/release/scripts/release-clone.sh:219), includingtests/tools/masked-status.bats:225. - refactor(release): remove obsolete dispatch orchestration #542 owns retirement of the dispatch-baseline watcher: active-account checks, new-run identification, per-step events, timeout and terminal results (
.claude/skills/release/scripts/watch-release.sh:68,.claude/skills/release/scripts/watch-release.sh:72,.claude/skills/release/scripts/watch-release.sh:89,.claude/skills/release/scripts/watch-release.sh:138,.claude/skills/release/scripts/watch-release.sh:162,.claude/skills/release/scripts/watch-release.sh:171). Its active-account cases aretests/skills/release/scripts/watch-release.bats:31andtests/skills/release/scripts/watch-release.bats:41. - refactor(release): remove obsolete dispatch orchestration #542 owns removal of clone-only and obsolete dispatch guards while preserving the required local-publication refusals. The starting guard decisions are
.claude/skills/release/scripts/guard-release.sh:91,.claude/skills/release/scripts/guard-release.sh:106,.claude/skills/release/scripts/guard-release.sh:119,.claude/skills/release/scripts/guard-release.sh:133and.claude/skills/release/scripts/guard-release.sh:170; translating surviving hook rules belongs to Replace the Claude guard-hook scripts with standalone guard binaries #328, not this diagnostic port. - feat(merge): review the version a pull request implies before it merges #534 owns the replacement version-review contract and feat(release): distribute the reusable workflow and release skills #545 its distribution. Do not independently port the old clone-based context, bounded commit bodies or bounded published diff (
.claude/skills/review-release-version/scripts/context.sh:56,.claude/skills/review-release-version/scripts/context.sh:106,.claude/skills/review-release-version/scripts/context.sh:165); its failed-reader regression attests/tools/masked-status.bats:236follows that handoff.
Approach
Start with negative eligibility and no-write checks. Freeze the surviving post-#542 shell contract and compare the replacement against it, carrying the chain's accepted fixtures forward. Current-main citations identify the starting inventory, not permission to restore superseded semantics. Port only remaining shell behavior; already-Go behavior delivered by prerequisites remains owned there. Implementation design belongs to the pull request.
Dependencies
Depends on #542 with its accepted diagnostic handoff, after #333 → #544 → #382 → #545 → #546 and the complete #359 chain. That includes #533, #534, #547, #538, #535, #539, #540, #536, #537, #548, #549 and #541; #499 and #532 remain the chain's stated prerequisites.
Depends on #753's replacement-enforcement protections before caller rollout. #332 and #588 track this migration. This issue supplies no missing release-chain implementation or operational authority.
Size
S. One pull request for the surviving readiness boundary, wrappers and diagnostic parity coverage.
Verify plan
- AC3: first show empty, unreadable, unfinished, failed, unknown and partial-then-failed check responses cannot produce eligibility. Carry forward feat(release): plan a release on every push to main without publishing #536's exact-candidate and check-completeness negative fixtures; assert non-success after the applicable wait bound.
- AC1: use candidate fixtures with the invoking checkout on another branch, detached, ahead and behind; assert the evaluated commit and invocation result match the completed chain. Port the relevant cases in
tests/tools/release-readiness.bats. - AC2: compare the completed chain's positive and refusal fixtures for applicable dirty-state, moved-candidate, absent-branch, literal, dependency, coverage and release-state decisions. Record the disposition of every original Bats case, including superseded allowances.
- AC4: compare successful, failed and empty version/preview results; stderr-only chatter cannot constitute a changelog entry. Compare informational version output and prove it does not become a new eligibility gate. Preserve the real version-check integration at
tests/tools/check-versions.bats:233for supported invocations. - AC5: use controlled time for successful completion, deadline, cancellation and candidate changes in the existing optional wait mode; compare terminal outputs and bounds with the inherited contract, without live polling.
- AC6: compare complete stdout, stderr, status and any existing structured diagnostic results over all prior fixtures, including failed subprocesses that print plausible output first.
- AC7: mutation traps and before/after filesystem/index/ref snapshots cover pass, refusal, timeout and cancellation. No fixture performs publication or changes trust.
- AC8: absent binary and older binary without the capability run the frozen post-chain path once; assert the probe is read-only and retired dispatch interfaces remain absent.
- AC9: supported failure and an indeterminate capability probe return failure with no fallback or repeat; partial or unreadable evidence never becomes a successful evaluation.
- AC10: invoke the unchanged supported tasks/wrappers with N-2 configurations against absent, older and new binaries; compare compatibility outcomes without reinstating interfaces the chain legitimately retired.
- AC11: run the Go fixture corpus on Linux, macOS and Windows and wrapper smoke coverage where supported. Run the targeted diagnostic suites, generation/deployment checks where callers changed,
mise run lintandmise run teston the reviewed head. - Definition of done: D1 each AC is verified at the merged head, with the commands and results cited in the pull request's Verification. D2 an independent review approves the exact merged head, and every finding has a recorded disposition. D3 required checks pass with no gate loosened. D4 the leak scans the repository specifies are clean, and every post made for this work (comments, descriptions) passes the per-post leak review before it is posted. D5 every commit is signed. D6 the documentation matches, or the description says
No doc impactwith the reason. D7 every commit carries anAssisted-bytrailer and the pull request carries theprovenance:agent-assistedlabel. D8 the change stays within the pull request size limits. D9 follow-up work, including deferred review findings, is filed as issues, each with a Problem section and numbered acceptance criteria and linking this issue; the pull request's Related section lists them, and any code that defers work links its issue. D10 the merge closes this issue through a closing reference, the project board shows the state Done, and a finalStatus:comment names the merge commit.
Risks
Freezing today's readiness instead of the completed chain would restore obsolete check allowances or dispatch assumptions. An unchecked partial response could declare the wrong commit eligible. Require the explicit behavioral handoff and test negative outcomes first. Undo: revert this port while retaining the chain's release semantics.
Operator authority
None.
Metadata
Metadata
Assignees
Labels
Type
Fields
Priority
Work type
Projects
- StatusShow more project fieldsBacklog
Activity
tbhb-agent commentedon Oct 26, 2026
Refinement: READY — Release readiness Go port has clear post-#542 scope, verifiable acceptance criteria, and accurate
origin/maincitations.Model: gemini-4-argon-high
Checked
tbhb-dev/devtools#811(0 comments) and all 25 referenced issues (#328,#332,#333,#359,#382,#499,#532,#533,#534,#535,#536,#537,#538,#539,#540,#541,#542,#544,#545,#546,#547,#548,#549,#588,#753). Verified againstorigin/mainata0347a715fab580ece45edfcb3d13509620459a8.tools/release-readiness.sh: working-tree cleanliness (tools/release-readiness.sh:61),HEADvsorigin/maincandidate identity viagit ls-remote(tools/release-readiness.sh:88), version-literal delegation (tools/release-readiness.sh:100),check-runsquery and filtering (tools/release-readiness.sh:119,tools/release-readiness.sh:133),preview-changelogentry counting with separatedstderr(tools/release-readiness.sh:153), and informationalcog bump --auto --dry-runreporting (tools/release-readiness.sh:171).AC1–AC11): Each criterion is observable, testable, single-outcome, and free of prescribed implementation detail (## Approachexplicitly leaves implementation design to the pull request). Non-functional requirements are covered for read-only/no-write guarantees (AC7), thin-wrapper capability probing and fail-closed non-fallback on supported failures (AC8,AC9),N-2compatibility (AC10, matchingdocs/compatibility.md:3-6), and Linux/macOS/Windows equivalence (AC11).tests/tools/release-readiness.bats:60,tests/tools/release-readiness.bats:71,tests/tools/release-readiness.bats:79,tests/tools/release-readiness.bats:93,tests/tools/release-readiness.bats:101,tests/tools/release-readiness.bats:114,tests/tools/release-readiness.bats:125,tests/tools/release-readiness.bats:137, andtests/tools/release-readiness.bats:150, plus real version-check integration attests/tools/check-versions.bats:233and the existing Go exec shim attools/check-versions.sh:4.#542(tools/release-dispatch.sh:47,tools/release-dispatch.sh:68,tools/release-dispatch.sh:73); clone manager retirement in#542(.claude/skills/release/scripts/release-clone.sh:107,.claude/skills/release/scripts/release-clone.sh:146,.claude/skills/release/scripts/release-clone.sh:164,.claude/skills/release/scripts/release-clone.sh:189,.claude/skills/release/scripts/release-clone.sh:219, andtests/tools/masked-status.bats:225); dispatch-baseline watcher retirement in#542(.claude/skills/release/scripts/watch-release.sh:68,.claude/skills/release/scripts/watch-release.sh:72,.claude/skills/release/scripts/watch-release.sh:89,.claude/skills/release/scripts/watch-release.sh:138,.claude/skills/release/scripts/watch-release.sh:162,.claude/skills/release/scripts/watch-release.sh:171,tests/skills/release/scripts/watch-release.bats:31, andtests/skills/release/scripts/watch-release.bats:41); guard rule cleanup in#542and Go hook translation in#328(.claude/skills/release/scripts/guard-release.sh:91,.claude/skills/release/scripts/guard-release.sh:106,.claude/skills/release/scripts/guard-release.sh:119,.claude/skills/release/scripts/guard-release.sh:133,.claude/skills/release/scripts/guard-release.sh:170); and version-review context replacement in#534/#545(.claude/skills/review-release-version/scripts/context.sh:56,.claude/skills/review-release-version/scripts/context.sh:106,.claude/skills/review-release-version/scripts/context.sh:165, andtests/tools/masked-status.bats:236).#542(and its upstream#333→#544→#382→#545→#546and#359chain including#499,#532,#533,#534,#547,#538,#535,#539,#540,#536,#537,#548,#549,#541),#753before caller rollout, and tracking epics#332and#588.Sfits a single pull request for the surviving readiness diagnostic boundary, wrapper, and parity tests.## Verify planproves every AC ID (AC1–AC11) with concrete negative, parity, mutation-trap, fallback,N-2, and multi-OS checks.## Operator authority(None.) is accurate against.agents/agent-skills.conf:4-9, wheretools/release-readiness.shandtests/tools/release-readiness.batsare outsidegolden_paths,constitutional_paths, andowner_paths.Gaps
None
Split
No further split is needed; this issue is already the readiness diagnostic split of
#332(with obsolete orchestration owned by#542, guards by#328, and version-review context by#534/#545) and fits oneSpull request.Definition of done
The definition of done for #811 (Feature). Tick each item and give its evidence. (Ticked boxes below indicate planning coverage in the issue's criteria and verify plan, not completed implementation work.)
## Verify planmapsAC1–AC11to concrete verification checks and itsDefinition of doneentry requires D1 verification at the merged head with commands and results cited in the pull request'sVerificationsection.## Verify plan(Definition of doneD2) requires independent review approval of the exact merged head and a recorded disposition for every finding.## Verify plan(AC11andDefinition of doneD3) requiresmise run lint,mise run test, and required checks to pass on the reviewed/merged head with no gate loosened.check-leaks.shwith the repository's private-strings list, and the leak review of each post. — Planning coverage:## Verify plan(Definition of doneD4) requires clean repository leak scans and per-post leak review for every comment and description before posting.## Verify plan(Definition of doneD5) requires every commit to be signed.docs/, CHANGELOG or help text), or the Verification section says "No doc impact" and why. — Planning coverage:## Verify plan(Definition of doneD6) requires matching documentation orNo doc impactwith the reason inVerification.provenance:agent-assistedlabel. — Planning coverage:## Verify plan(Definition of doneD7) requiresAssisted-bytrailers on every commit and theprovenance:agent-assistedlabel on the pull request.## Sizebounds the work to oneSpull request and## Verify plan(Definition of doneD8) requires staying within pull request size limits.## Scope and non-goalsdesignates fallback retirement as D9 follow-up work, and## Verify plan(Definition of doneD9) requires filing follow-up work and deferred findings as issues with aProblemsection and numbered ACs, listing them inRelated, and linking any deferred code to its issue.Status:comment names the merge commit. — Planning coverage:## Verify plan(Definition of doneD10) requires closing the issue via a closing reference on merge, the project board showingDone, and a finalStatus:comment naming the merge commit.Round: 1 of 3