Skip to content

Expose installed lock identity and bind Go gates to action outputs - #165

Merged
gontzess merged 3 commits into
mainfrom
fix/locked-tools-outputs
Oct 22, 2026
Merged

gontzess merged 3 commits into
mainfrom
fix/locked-tools-outputs

Conversation

@gontzess

@gontzess gontzess commented Oct 22, 2026 •

Copy link
Copy Markdown
Contributor

Why

Caller Go gates must use the version and lock identity returned by the locked-tools action, not rediscover expectations from a separate workflow checkout. The action remains the single owner of lock metadata parsing.

What

  • Add lock_path: the absolute path of the exact lock used (action-local canonical file by default, resolved reviewed override when supplied). Preserve per-tool outputs, versions, and lock_sha256.
  • Wire expected Go version, path, and hash through prepare/install/source-build/result phases. Keep cross-platform single-stable-Go-version (sort -u) sanity in prepare.
  • Make verify-locked-go.sh consume EXPECTED_GO_VERSION, EXPECTED_LOCK_SHA256, and LOCK_PATH. It hashes bytes to check identity but never parses lock versions. Missing/partial expectations, drift, nonlocal toolchain mode, and version mismatch fail closed.
  • Restore runtime/module assertions: directive checks first, runtime version equality, then readonly/offline GOTOOLCHAIN=local go list -m with workspace discovery disabled.
  • Remove the repository Go-gate wrapper, positional lockfile mode, gon adapter and their compatibility fixtures. Go gates are strictly environment-only; positional arguments cannot supply missing expectations.

Intentional staged rollout (verifiable): main-tip release.yaml's 12 old wrapper calls are unresolved until the coordinated caller amendment lands in #159 (branch steve.gontzes/sh10-probe-report). No live release path is affected: the v4 tag still points at e643283 (pre-dates these actions), every sampled connector consumes @v4, and code search finds zero @main/@sha callers; the failure mode in the window is fail-closed (file-not-found / missing env), never a silent pass. Do not promote v4 between this merge and #159 landing.

Verification

  • make test-scripts: pass, including 27 integrity fixtures (one native-Windows-only skip locally), 23 image/update tests, workflow contracts, and both guard Bash suites.
  • go vet ./... and go test -count=1 ./...: pass with local/offline settings.
  • Real local Go smoke: output-derived env contract checks directives 1.13, 1.27, and 1.27.3 using actual offline go list -m.
  • Fixtures cover absolute/existing lock_path, preserved version/hash outputs, metadata-reader ownership, missing env, hash drift, runtime mismatch, go-list failure/disagreement, and rejection of positional lockfile fallback.
  • Shell syntax, image-lock gate, and git diff --check: pass. .github/workflows/release.yaml is byte-unchanged.

Expose the verified absolute lock path alongside versions and SHA256, keep single-version parsing in prepare, and require Go gates to consume expected version/path/hash through the environment. Retain deprecated prepare-backed adapters for current main workflow calls.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
@gontzess
gontzess requested a review from a team October 22, 2026 01:07
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Superseded — see the current review report for commit 23cb8aec6ecd

General PR Review: Expose installed lock identity and bind Go gates to action outputs

Blocking Issues: 0 | Suggestions: 0 | Threads Resolved: 0
Criteria: Criteria status: none loaded - .claude/skills/ci-review.md was not found at trusted base 562a1ea6fa6a.
Review mode: full
View review run

Review Summary

What changed:

  • prepare now does the single-Go-version (sort -u) check and outputs lock_path and go_version.
  • The install, gon and outputs phases re-check that version against the hashed lock (locked-tools.sh:88-111). The action also gets a new lock_path output.
  • verify-locked-go.sh now runs only on EXPECTED_GO_VERSION, EXPECTED_LOCK_SHA256 and LOCK_PATH. It checks their format, hashes LOCK_PATH and checks go version. Module mode adds an offline GOTOOLCHAIN=local GOWORK=off GOPROXY=off go list -m check.
  • Old callers still work. A positional lock argument (passed by scripts/verify-locked-go.sh and the gon legacy calls) goes through prepare instead of a second lock parser.

How I checked it:

  • I scanned the full PR diff for security and correctness.
  • I traced the env wiring in action.yml and confirmed that lock is made absolute before it is published (locked-tools.sh:66).
  • I checked Windows path handling: cygpath -w when publishing, cygpath -u in the gate.
  • I confirmed that a partial env contract fails closed and never falls back to the positional lock.
  • I checked that all 12 release.yaml gate calls still go through the wrapper's lock injection with GOTOOLCHAIN: local set.

No trusted repo-local criteria loaded, so only the base criteria applied. There were no prior findings.

Not verified: I didn't run anything, because this review is read-only. Whether the new offline go list -m step succeeds on real caller modules (with dependencies and an empty module cache) comes from the PR's own smoke test, not from this review.

Security Issues

None found.

Correctness Issues

None found.

Suggestions

None.

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Superseded — see the current review report for commit 3d1670e36178

General PR Review: Expose installed lock identity and bind Go gates to action outputs

Blocking Issues: 0 | Suggestions: 0 | Threads Resolved: 0
Criteria: Criteria status: none loaded - .claude/skills/ci-review.md was not found at trusted base 562a1ea6fa6a.
Review mode: full
View review run

Review Summary

What changed:

  • prepare now does the single-Go-version (sort -u) check and outputs lock_path and go_version.
  • The install, gon and outputs phases re-check that version against the hashed lock (locked-tools.sh:88-111). The action also gets a new lock_path output.
  • verify-locked-go.sh now runs only on EXPECTED_GO_VERSION, EXPECTED_LOCK_SHA256 and LOCK_PATH. It checks their format, hashes LOCK_PATH and checks go version. Module mode adds an offline GOTOOLCHAIN=local GOWORK=off GOPROXY=off go list -m check.
  • Old callers still work. A positional lock argument (passed by scripts/verify-locked-go.sh and the gon legacy calls) goes through prepare instead of a second lock parser.

How I checked it:

  • I scanned the full PR diff for security and correctness.
  • I traced the env wiring in action.yml and confirmed that lock is made absolute before it is published (locked-tools.sh:66).
  • I checked Windows path handling: cygpath -w when publishing, cygpath -u in the gate.
  • I confirmed that a partial env contract fails closed and never falls back to the positional lock.
  • I checked that all 12 release.yaml gate calls still go through the wrapper's lock injection with GOTOOLCHAIN: local set.

No trusted repo-local criteria loaded, so only the base criteria applied. There were no prior findings.

Not verified: I didn't run anything, because this review is read-only. Whether the new offline go list -m step succeeds on real caller modules (with dependencies and an empty module cache) comes from the PR's own smoke test, not from this review.

Security Issues

None found.

Correctness Issues

None found.

Suggestions

None.


Reviewed commit: 23cb8aec6ecd

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No blocking issues found — see the full review report

Require output-derived version and lock identity in every Go gate. Remove the repository wrapper, positional adapter, gon adapter and their fixtures; retain the strict environment contract and existing install checks.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Superseded — see the current review report for commit 3d1670e36178

General PR Review: Expose installed lock identity and bind Go gates to action outputs

Blocking Issues: 1 | Suggestions: 1 | Threads Resolved: 0
Criteria: Criteria status: none loaded - .claude/skills/ci-review.md was not found at trusted base 562a1ea6fa6a.
Review mode: incremental since 23cb8ae
View review run

Review Summary

The new commit (3d1670e) removes all of the deprecated Go-gate compatibility:

  • It deletes scripts/verify-locked-go.sh.
  • It strips the positional-lock fallback from the action-local verify-locked-go.sh.
  • It strips the legacy verify_go shim from gon-source.sh.
  • It removes the related tests and docs, and adds tests showing that positional calls now fail.

I scanned the full PR diff for security and correctness and found no security issues. The incremental diff is complete (nothing dropped or truncated). No repo-local criteria loaded, so only the base criteria applied.

Security Issues

None found.

Correctness Issues

  • New — scripts/verify-locked-go.sh (deleted) and .github/workflows/release.yaml:293,297,439,442,766,770,1052,1055,1323,1326,1582,1585
    • release.yaml in this same tree still calls bash _workflows/scripts/verify-locked-go.sh, and that file no longer exists.
    • _workflows is checked out at job.workflow_sha (release.yaml:175), which is the same commit as the workflow, so all 12 gate steps will fail with file-not-found.
    • release.yaml:445 (scripts/gon-source.sh build) now goes to .github/actions/locked-tools/gon-source.sh:31-32 without EXPECTED_GO_VERSION/EXPECTED_LOCK_SHA256/LOCK_PATH, so it fails closed.
    • The updated docs/release-workflow.md:312-316 admits that main's wrapper calls "are not executable until the coordinated caller amendment lands". Merging this alone breaks releases on main.

Suggestions

  • New — PR description doesn't match the code: the body still says "Keep deprecated compatibility for current main" and that "all 12 current main version/module invocation lines remain untouched and callable", but this commit removes that compatibility. Also, .gitattributes:12 still lists the deleted scripts/verify-locked-go.sh. That entry is harmless, but it is stale.
Prompt for AI agents
Verify each finding against the current code and only fix it if needed.

## Correctness Issues

In `.github/workflows/release.yaml`:
- Around lines 287-297, 435-445, 760-770, 1048-1055, 1318-1326, 1578-1585: These steps still call `bash _workflows/scripts/verify-locked-go.sh version|module ...`, but this PR deletes `scripts/verify-locked-go.sh`. `_workflows` is checked out at `job.workflow_sha`, so the calls fail. `gon-source.sh build` (line 445) also fails closed because `EXPECTED_GO_VERSION`, `EXPECTED_LOCK_SHA256` and `LOCK_PATH` are not set. Fix it one of two ways: (a) in this PR, switch each job to the locked-tools action (give it an id), pass `EXPECTED_GO_VERSION: steps.<id>.outputs.go`, `EXPECTED_LOCK_SHA256: steps.<id>.outputs.lock_sha256` and `LOCK_PATH: steps.<id>.outputs.lock_path` as env, and call `_workflows/.github/actions/locked-tools/verify-locked-go.sh`; or (b) revert commit 3d1670e and keep the deprecated wrapper/positional adapter until the caller migration merges.

## Suggestions

In the PR description / `.gitattributes`:
- PR body line "Keep deprecated compatibility for current main ... all 12 ... remain untouched and callable": update it to match the removal. In `.gitattributes` around line 12, remove the entry for the deleted `scripts/verify-locked-go.sh`.

Comment thread docs/release-workflow.md Outdated
Comment on lines +312 to +316
The Go gate is action-local and environment-only; there is no repository-level
wrapper or positional lockfile fallback. Callers must wire the installed action's
version and lock-identity outputs. The main-tip workflow's old wrapper calls are
not executable until the coordinated caller amendment lands; moving-tag
promotion remains blocked until that migration is complete.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 Bug: This commit deletes scripts/verify-locked-go.sh, but .github/workflows/release.yaml in this same tree still calls bash _workflows/scripts/verify-locked-go.sh 12 times (lines 293, 297, 439, 442, 766, 770, 1052, 1055, 1323, 1326, 1582, 1585). _workflows is checked out at job.workflow_sha (release.yaml:175), so those calls hit a missing file. Also, gon-source.sh build (release.yaml:445) now runs without EXPECTED_*/LOCK_PATH and fails closed. If this merges before the caller migration, every release gate on main breaks. Either migrate release.yaml in this PR or keep the deprecated wrapper until that lands. Confidence: high.

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Superseded — see the current review report for commit 25572259eb0d

General PR Review: Expose installed lock identity and bind Go gates to action outputs

Blocking Issues: 1 | Suggestions: 1 | Threads Resolved: 0
Criteria: Criteria status: none loaded - .claude/skills/ci-review.md was not found at trusted base 562a1ea6fa6a.
Review mode: incremental since 23cb8ae
View review run

Review Summary

The new commit (3d1670e) removes all of the deprecated Go-gate compatibility:

  • It deletes scripts/verify-locked-go.sh.
  • It strips the positional-lock fallback from the action-local verify-locked-go.sh.
  • It strips the legacy verify_go shim from gon-source.sh.
  • It removes the related tests and docs, and adds tests showing that positional calls now fail.

I scanned the full PR diff for security and correctness and found no security issues. The incremental diff is complete (nothing dropped or truncated). No repo-local criteria loaded, so only the base criteria applied.

Security Issues

None found.

Correctness Issues

  • New — scripts/verify-locked-go.sh (deleted) and .github/workflows/release.yaml:293,297,439,442,766,770,1052,1055,1323,1326,1582,1585
    • release.yaml in this same tree still calls bash _workflows/scripts/verify-locked-go.sh, and that file no longer exists.
    • _workflows is checked out at job.workflow_sha (release.yaml:175), which is the same commit as the workflow, so all 12 gate steps will fail with file-not-found.
    • release.yaml:445 (scripts/gon-source.sh build) now goes to .github/actions/locked-tools/gon-source.sh:31-32 without EXPECTED_GO_VERSION/EXPECTED_LOCK_SHA256/LOCK_PATH, so it fails closed.
    • The updated docs/release-workflow.md:312-316 admits that main's wrapper calls "are not executable until the coordinated caller amendment lands". Merging this alone breaks releases on main.

Suggestions

  • New — PR description doesn't match the code: the body still says "Keep deprecated compatibility for current main" and that "all 12 current main version/module invocation lines remain untouched and callable", but this commit removes that compatibility. Also, .gitattributes:12 still lists the deleted scripts/verify-locked-go.sh. That entry is harmless, but it is stale.
Prompt for AI agents
Verify each finding against the current code and only fix it if needed.

## Correctness Issues

In `.github/workflows/release.yaml`:
- Around lines 287-297, 435-445, 760-770, 1048-1055, 1318-1326, 1578-1585: These steps still call `bash _workflows/scripts/verify-locked-go.sh version|module ...`, but this PR deletes `scripts/verify-locked-go.sh`. `_workflows` is checked out at `job.workflow_sha`, so the calls fail. `gon-source.sh build` (line 445) also fails closed because `EXPECTED_GO_VERSION`, `EXPECTED_LOCK_SHA256` and `LOCK_PATH` are not set. Fix it one of two ways: (a) in this PR, switch each job to the locked-tools action (give it an id), pass `EXPECTED_GO_VERSION: steps.<id>.outputs.go`, `EXPECTED_LOCK_SHA256: steps.<id>.outputs.lock_sha256` and `LOCK_PATH: steps.<id>.outputs.lock_path` as env, and call `_workflows/.github/actions/locked-tools/verify-locked-go.sh`; or (b) revert commit 3d1670e and keep the deprecated wrapper/positional adapter until the caller migration merges.

## Suggestions

In the PR description / `.gitattributes`:
- PR body line "Keep deprecated compatibility for current main ... all 12 ... remain untouched and callable": update it to match the removal. In `.gitattributes` around line 12, remove the entry for the deleted `scripts/verify-locked-go.sh`.

Reviewed commit: 3d1670e36178

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocking issues found — see the full review report

Use neutral fixture and tool provenance, remove process history and stale helper references, and replace opaque diagnostic labels with descriptive names. Refresh the pinned fixture metadata checksum; artifact locks and certificate identities remain unchanged.

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown
Superseded — see the current review report for commit 25572259eb0d

General PR Review: Expose installed lock identity and bind Go gates to action outputs

Blocking Issues: 1 | Suggestions: 0 | Threads Resolved: 0
Criteria: Criteria status: none loaded - .claude/skills/ci-review.md was not found at trusted base 562a1ea6fa6a.
Review mode: incremental since 3d1670e
View review run

Review Summary

The PR adds a lock_path output to the locked-tools action. The action-local verify-locked-go.sh now checks the Go version and lock against EXPECTED_GO_VERSION/EXPECTED_LOCK_SHA256/LOCK_PATH from the environment only. The PR also removes the repository-level scripts/verify-locked-go.sh wrapper.

The new commits since 3d1670e make no functional changes:

  • They rename the GF12/GF13 error annotation titles to release-source/locked-tools, and update the test assertions to match. No GF1x references remain.
  • They reword docs and comments in the ca-trust-guard README, the fixtures' source fields (the SHA256SUMS hash was updated to match), tool-locks.txt, docs/release-workflow.md and cmd/generate-windows-manifest.

I scanned the full PR diff for security and correctness; the incremental artifact was complete, with no dropped paths. No repo-local criteria loaded, so only the base criteria applied. The PR body now calls the release.yaml breakage an intentional staged rollout, but the code still breaks releases on main.

Security Issues

None found.

Correctness Issues

  • Prior — still present — scripts/verify-locked-go.sh (deleted) vs .github/workflows/release.yaml:293,297,439,442,766,770,1052,1055,1323,1326,1582,1585.
    • release.yaml is unchanged and still runs bash _workflows/scripts/verify-locked-go.sh. _workflows is checked out at job.workflow_sha, so all 12 gate steps fail with file-not-found.
    • release.yaml:445 (scripts/gon-source.sh build) delegates to .github/actions/locked-tools/gon-source.sh. That script calls the action-local gate without the required env, so it fails closed.
    • This push also removed the docs/release-workflow.md caveat that main's wrapper calls "are not executable until the coordinated caller amendment lands". The docs now describe the contract as complete and no longer mention the breakage.
    • The v4 tag is not moved, but any caller on @main or a post-merge SHA loses releases.
    • Fresh inline comment at docs/release-workflow.md:286-287, because the earlier thread is outdated.

Suggestions

None.

Prompt for AI agents
Verify each finding against the current code and only fix it if needed.

## Correctness Issues

In `.github/workflows/release.yaml`:
- Around lines 287-297, 435-445, 760-770, 1048-1055, 1318-1326, 1578-1585: These steps still run `bash _workflows/scripts/verify-locked-go.sh version|module ...`, but this PR deletes `scripts/verify-locked-go.sh`. `_workflows` is checked out at `job.workflow_sha`, so the calls fail with file-not-found. `scripts/gon-source.sh build` (line 445) also fails closed because `EXPECTED_GO_VERSION`, `EXPECTED_LOCK_SHA256` and `LOCK_PATH` are unset. Fix it one of two ways:
  (a) In this PR, give each job's locked-tools step an id. Pass `EXPECTED_GO_VERSION: ${{ steps.<id>.outputs.go }}`, `EXPECTED_LOCK_SHA256: ${{ steps.<id>.outputs.lock_sha256 }}` and `LOCK_PATH: ${{ steps.<id>.outputs.lock_path }}` as step env, and call `_workflows/.github/actions/locked-tools/verify-locked-go.sh`.
  (b) Keep `scripts/verify-locked-go.sh` and the positional fallback until the caller migration merges.

In `docs/release-workflow.md`:
- Around lines 286-287: If the staged breakage remains, restore the note that main's release workflow wrapper calls are not executable until the caller amendment lands, so the docs stay accurate.

Comment thread docs/release-workflow.md
Comment on lines +286 to +287
The action-local Go gate is environment-only. Callers supply the installed
action's version and lock-identity outputs; positional lockfile lookup is not supported.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🟠 Bug (Prior — still present, high confidence): This PR still deletes scripts/verify-locked-go.sh, but .github/workflows/release.yaml in this tree still runs bash _workflows/scripts/verify-locked-go.sh 12 times (lines 293, 297, 439, 442, 766, 770, 1052, 1055, 1323, 1326, 1582, 1585). _workflows is checked out at job.workflow_sha, so every release on main that runs from this commit hits file-not-found. gon-source.sh build (line 445) also fails closed because it gets no EXPECTED_GO_VERSION/EXPECTED_LOCK_SHA256/LOCK_PATH. This commit also removed the doc caveat that said those calls are not executable, so these docs no longer mention the breakage. Migrate release.yaml in this PR, or keep the wrapper until the caller amendment lands.

@github-actions

github-actions Bot commented Oct 22, 2026 •

Copy link
Copy Markdown

General PR Review: Expose installed lock identity and bind Go gates to action outputs

Blocking Issues: 1 | Suggestions: 0 | Threads Resolved: 0
Criteria: Criteria status: none loaded - .claude/skills/ci-review.md was not found at trusted base 562a1ea6fa6a.
Review mode: incremental since 3d1670e
View review run

Review Summary

The PR adds a lock_path output to the locked-tools action. The action-local verify-locked-go.sh now checks the Go version and lock against EXPECTED_GO_VERSION/EXPECTED_LOCK_SHA256/LOCK_PATH from the environment only. The PR also removes the repository-level scripts/verify-locked-go.sh wrapper.

The new commits since 3d1670e make no functional changes:

  • They rename the GF12/GF13 error annotation titles to release-source/locked-tools, and update the test assertions to match. No GF1x references remain.
  • They reword docs and comments in the ca-trust-guard README, the fixtures' source fields (the SHA256SUMS hash was updated to match), tool-locks.txt, docs/release-workflow.md and cmd/generate-windows-manifest.

I scanned the full PR diff for security and correctness; the incremental artifact was complete, with no dropped paths. No repo-local criteria loaded, so only the base criteria applied. The PR body now calls the release.yaml breakage an intentional staged rollout, but the code still breaks releases on main.

Security Issues

None found.

Correctness Issues

  • Prior — still present — scripts/verify-locked-go.sh (deleted) vs .github/workflows/release.yaml:293,297,439,442,766,770,1052,1055,1323,1326,1582,1585.
    • release.yaml is unchanged and still runs bash _workflows/scripts/verify-locked-go.sh. _workflows is checked out at job.workflow_sha, so all 12 gate steps fail with file-not-found.
    • release.yaml:445 (scripts/gon-source.sh build) delegates to .github/actions/locked-tools/gon-source.sh. That script calls the action-local gate without the required env, so it fails closed.
    • This push also removed the docs/release-workflow.md caveat that main's wrapper calls "are not executable until the coordinated caller amendment lands". The docs now describe the contract as complete and no longer mention the breakage.
    • The v4 tag is not moved, but any caller on @main or a post-merge SHA loses releases.
    • Fresh inline comment at docs/release-workflow.md:286-287, because the earlier thread is outdated.

Suggestions

None.

Prompt for AI agents
Verify each finding against the current code and only fix it if needed.

## Correctness Issues

In `.github/workflows/release.yaml`:
- Around lines 287-297, 435-445, 760-770, 1048-1055, 1318-1326, 1578-1585: These steps still run `bash _workflows/scripts/verify-locked-go.sh version|module ...`, but this PR deletes `scripts/verify-locked-go.sh`. `_workflows` is checked out at `job.workflow_sha`, so the calls fail with file-not-found. `scripts/gon-source.sh build` (line 445) also fails closed because `EXPECTED_GO_VERSION`, `EXPECTED_LOCK_SHA256` and `LOCK_PATH` are unset. Fix it one of two ways:
  (a) In this PR, give each job's locked-tools step an id. Pass `EXPECTED_GO_VERSION: ${{ steps.<id>.outputs.go }}`, `EXPECTED_LOCK_SHA256: ${{ steps.<id>.outputs.lock_sha256 }}` and `LOCK_PATH: ${{ steps.<id>.outputs.lock_path }}` as step env, and call `_workflows/.github/actions/locked-tools/verify-locked-go.sh`.
  (b) Keep `scripts/verify-locked-go.sh` and the positional fallback until the caller migration merges.

In `docs/release-workflow.md`:
- Around lines 286-287: If the staged breakage remains, restore the note that main's release workflow wrapper calls are not executable until the caller amendment lands, so the docs stay accurate.

Reviewed commit: 25572259eb0d

@github-actions github-actions Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blocking issues found — see the full review report

@gontzess
gontzess dismissed github-actions[bot]’s stale review October 22, 2026 01:41

DECLINE as a blocker (accepted staged window; fail-closed never silent-pass; v4 pinned pre-actions, zero @main consumers)

@gontzess
gontzess merged commit 83c8f94 into main Oct 22, 2026
7 checks passed
@gontzess
gontzess deleted the fix/locked-tools-outputs branch October 22, 2026 01:41
gontzess added a commit that referenced this pull request Oct 22, 2026
…e actions (#159)

## Why

GitHub-hosted runner images may still trust the compromised eMudhra
intermediates until patched images roll out
(actions/runner-images#15018). Release jobs must (a) measure, deny, and
redirect TLS trust and (b) install only hash-locked tools — before any
credential. Both mechanisms ship as composite actions in this repo
(ca-trust-guard, locked-tools); this PR adopts them in release.yaml and
removes the per-job inline installs.

## What

- Every guarded job (9) opens with the `_workflows` checkout at
`job.workflow_sha` (`persist-credentials: false`; validate-inputs gains
`contents: read` (checkout uses the default read-scoped token; not
persisted)), then runs **ca-trust-guard** and, in the 6 tool-using jobs,
**locked-tools** via **local paths**
(`./_workflows/.github/actions/...`). Workflow, action code, fixtures,
and canonical tool lock are always the same commit — no self-referential
action SHAs (enforced by a CI assertion).
- Ordering: `_workflows` checkout → guard → locked-tools (`id: tools`;
preflight's stays conditional on the Go checks) → caller checkout +
event-SHA verification → secrets. notify-release-failure remains exempt,
with no bootstrap there.
- **Module gates** (6 sites) run the action-local `verify-locked-go.sh
module` with expected version, lock hash, and lock path taken from the
locked-tools step's **outputs** (one reader of the lock per job);
standalone version gates and the inline gon step are removed (the action
asserts the runtime version; gon builds inside the action).
- Per-job install/verify/gon-checkout steps and the four transitional
wrappers (`install-tool.{sh,ps1}`, `gon-source.sh`,
`verify-locked-go.sh`) are deleted; `verify-release-checkout.sh`,
`setup-release-buildx.sh`, `derive-iam-role-name.sh` stay.
- `ci.yaml` covers release.yaml; `test-tool-integrity.py` enforces
local-path ordering, output-bound gate env, tool lists, the notify
exemption, and the no-self-SHA rule.

## Evidence

- Action canaries (#160/#161) plus the full-release canary through this
amended branch on baton-github-test (run linked below when complete) —
local-path resolution, ordering, and output wiring exercised end-to-end
on all three OSes.
- reviewer-claude gate: APPROVE (amendment review: ordering per job, env
wiring incl. skip-safe JSON, rebase resolution, negative controls).

**Staged rollout:** safe to promote `v4` only after this lands — see
#165 for the window details.

---------

Co-authored-by: c1-squire-dev[bot] <c1-squire-dev[bot]@users.noreply.github.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant