Skip to content

Pin builtin container images by digest in compiled lock files and AWF hash-spec configuration#27762

Merged
pelikhan merged 4 commits intomainfrom
copilot/feature-pin-container-images-digest-again
Apr 22, 2026
Merged

Pin builtin container images by digest in compiled lock files and AWF hash-spec configuration#27762
pelikhan merged 4 commits intomainfrom
copilot/feature-pin-container-images-digest-again

Conversation

Copy link
Copy Markdown
Contributor

Copilot AI commented Apr 22, 2026

Compiled .lock.yml output could still emit builtin containers as mutable tags, even though container pin metadata already existed. This PR makes digest pinning deterministic for builtin images at compile time and keeps manifest metadata aligned with current builtin versions.

  • Compiler behavior: fallback to embedded container pins

    • Extended embedded pin data model to include container pins (containers section) in pkg/actionpins.
    • Added GetContainerPin(image) accessor for embedded container pins.
    • Updated container pin application in workflow compilation to resolve in order:
      1. repo-local cache (.github/aw/actions-lock.json)
      2. embedded defaults (pkg/actionpins/data/action_pins.json)
    • Result: builtin images are emitted as image:tag@sha256:... even when local cache is missing or incomplete.
  • AWF configuration now uses hashed container spec

    • Updated AWF arg generation to build --image-tag with digest metadata when available (cache-first, embedded fallback), using AWF’s hash-spec format:
      • tag,squid=sha256:...,agent=sha256:...,agent-act=sha256:...,api-proxy=sha256:...,cli-proxy=sha256:...
    • This ensures both container predownload and AWF runtime image selection are hash-pinned in compiled lock files.
  • Pinned metadata refresh for current builtin tags

    • Updated container pin entries for current builtin images (AWF images, MCP gateway, GitHub MCP server, node:lts-alpine, etc.) in:
      • .github/aw/actions-lock.json
      • pkg/actionpins/data/action_pins.json
      • pkg/workflow/data/action_pins.json
    • Ensures manifest/container output and download_docker_images.sh args use up-to-date digests.
  • Targeted coverage for fallback and AWF hash-spec behavior

    • Added tests for embedded container pin retrieval.
    • Expanded docker pinning tests to assert embedded-pin fallback behavior when cache pins are absent.
    • Added tests for AWF image-tag digest metadata generation and inclusion in built AWF args.
    • Updated wasm golden normalization to account for AWF --image-tag digest metadata format.
if pin, ok := cache.GetContainerPin(img); ok && pin.PinnedImage != "" {
    result[i] = pin.PinnedImage
    pins[i] = GHAWManifestContainer(pin)
    continue
}
if embeddedPin, ok := getEmbeddedContainerPin(img); ok && embeddedPin.PinnedImage != "" {
    result[i] = embeddedPin.PinnedImage
    pins[i] = GHAWManifestContainer(embeddedPin)
    continue
}

[!WARNING]


Smoke CI scheduled run completed: https://github.com/github/gh-aw/actions/runs/24762193187

Generated by Smoke CI · ● 312K ·



✨ PR Review Safe Output Test - Run 24762218460

💥 [THE END] — Illustrated by Smoke Claude · ● 204.4K ·

Copilot AI changed the title [WIP] Add feature to pin container images by digest in lock files Pin builtin container images by digest in compiled lock files Apr 22, 2026
Copilot AI requested a review from pelikhan April 22, 2026 04:57
@pelikhan
Copy link
Copy Markdown
Collaborator

@copilot recompile and use hashed spec for containers when downloading and configuring awf

@pelikhan pelikhan marked this pull request as ready for review April 22, 2026 05:23
Copilot AI review requested due to automatic review settings April 22, 2026 05:23
Copy link
Copy Markdown
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

Ensures compiled .lock.yml outputs deterministically pin builtin container images by digest at compile time by adding an embedded container-pin fallback when repo-local cache pins are missing.

Changes:

  • Extend embedded pins schema to include containers and add GetContainerPin(image) in pkg/actionpins.
  • Update workflow Docker image pinning to fall back from cache pins to embedded pins.
  • Add/adjust tests to cover embedded container-pin retrieval and fallback behavior; refresh pinned digests in lock/pins JSON files.
Show a summary per file
File Description
pkg/workflow/docker.go Applies embedded container pin fallback during image pinning for compilation output.
pkg/workflow/action_pins.go Adds a workflow-level helper to retrieve embedded container pins via pkg/actionpins.
pkg/workflow/docker_pin_test.go Updates container pinning tests and adds a case for embedded-pin fallback.
pkg/actionpins/actionpins.go Extends embedded pin data model with container pins and exposes GetContainerPin.
pkg/actionpins/actionpins_internal_test.go Adds test coverage for embedded container pin retrieval.
pkg/actionpins/data/action_pins.json Refreshes embedded container digests / pinned references.
pkg/workflow/data/action_pins.json Refreshes workflow-side pin data to align with current embedded pins.
.github/aw/actions-lock.json Refreshes repo-local cache pin metadata for builtin container images.

Copilot's findings

Tip

Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

  • Files reviewed: 8/8 changed files
  • Comments generated: 3

Comment on lines +29 to +35
{
name: "embedded pin used when cache is absent",
images: []string{"node:lts-alpine"},
pins: nil,
expectedRefs: []string{"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"},
expectedDigests: []string{"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"},
},
Copy link

Copilot AI Apr 22, 2026

Choose a reason for hiding this comment

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

The new embedded-pin test hard-codes a specific node:lts-alpine digest string. Since these digests are expected to be refreshed over time, this will create unnecessary churn/failures when the embedded JSON is updated. Prefer asserting against the embedded pin value returned by getEmbeddedContainerPin/actionpins.GetContainerPin, or assert invariants (non-empty Digest and PinnedImage contains @sha256:) rather than an exact digest literal.

Copilot uses AI. Check for mistakes.
Comment thread pkg/workflow/docker.go
Comment on lines +216 to +220
if embeddedPin, ok := getEmbeddedContainerPin(img); ok && embeddedPin.PinnedImage != "" {
result[i] = embeddedPin.PinnedImage
pins[i] = GHAWManifestContainer(embeddedPin)
dockerLog.Printf("Pinned container image from embedded pins: %s -> %s", img, embeddedPin.PinnedImage)
continue
Copy link

Copilot AI Apr 22, 2026

Choose a reason for hiding this comment

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

applyContainerPins now pins images from embedded defaults even when the workflow cache has no entry, but the surrounding function comment/doc still states that images without a cached pin are returned unchanged. Update the doc comment(s) to reflect the new fallback order (cache -> embedded -> unchanged) so callers understand that some tags will be rewritten even with an empty cache.

Copilot uses AI. Check for mistakes.
Comment on lines +80 to +83
// getEmbeddedContainerPin returns the pinned container image for a given image reference.
func getEmbeddedContainerPin(image string) (actionpins.ContainerPin, bool) {
return actionpins.GetContainerPin(image)
}
Copy link

Copilot AI Apr 22, 2026

Choose a reason for hiding this comment

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

getEmbeddedContainerPin returns actionpins.ContainerPin, while the cache path uses workflow.ContainerPin (same JSON fields). Mixing two nearly-identical types in the same pinning flow makes the code harder to follow and increases the chance of accidental divergence. Consider converting to (or aliasing) the workflow-level ContainerPin type at this boundary so applyContainerPins works with a single pin type.

Copilot uses AI. Check for mistakes.
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🤖 Smoke test agent was here! Agreed — mixing two nearly-identical ContainerPin types at the same boundary is a maintenance hazard. Unifying on the workflow-level type (or a type alias) would make applyContainerPins cleaner and reduce divergence risk over time.

📰 BREAKING: Report filed by Smoke Copilot · ● 1M

@github-actions
Copy link
Copy Markdown
Contributor

🧪 Test Quality Sentinel Report

Test Quality Score: 85/100

Excellent test quality

Metric Value
New/modified tests analyzed 2
✅ Design tests (behavioral contracts) 2 (100%)
⚠️ Implementation tests (low value) 0 (0%)
Tests with error/edge cases 1 (50%)
Duplicate test clusters 0
Test inflation detected No
🚨 Coding-guideline violations None

Test Classification Details

View all test classifications
Test File Classification Issues Detected
TestGetContainerPin_ReturnsPinnedImage pkg/actionpins/actionpins_internal_test.go:62 ✅ Design Happy-path only — no test for unknown image returning ok=false
TestApplyContainerPins — new row "embedded pin used when cache is absent" pkg/workflow/docker_pin_test.go:25 ✅ Design Covers the key fallback behavior; good edge-case addition

Test Analysis

TestGetContainerPin_ReturnsPinnedImage (pkg/actionpins/actionpins_internal_test.go:62)

Classification: Design test
What design invariant does this test enforce? It verifies that the embedded container pin data is loadable and structurally correct: GetContainerPin returns a ContainerPin with the correct Image name, a non-empty Digest, and a PinnedImage string in the @sha256: format that Docker/GitHub Actions expect.
What would break if deleted? A regression where the embedded JSON is malformed, the Digest field is missing, or the PinnedImage format changes would go undetected. High value.
Minor note: No test for the ok=false path (unknown/unembedded image). Consider adding a small negative case (e.g., GetContainerPin("does-not-exist:latest")) to confirm the function returns false for unrecognised images.

TestApplyContainerPins — new table row "embedded pin used when cache is absent" (pkg/workflow/docker_pin_test.go:25)

Classification: Design test
What design invariant does this test enforce? The central behavioral contract of this PR: when no runtime pins cache is provided, the compiler must still apply embedded digest pins to known builtin images. This is a genuine edge-case row (cache-absent fallback path).
What would break if deleted? The silent omission of digest pinning for builtin images when the cache hasn't been populated would not be caught. High value.
Also noted: The two existing row changes (alpine:latestalpine:3.20 / busybox:latest, alpine:latestbusybox:latest) are necessary correctness fixes — they prevent the "unchanged" and "selective pinning" rows from accidentally passing through the new embedded-pin path. Good defensive test maintenance.


Language Support

Tests analyzed:

  • 🐹 Go (*_test.go): 2 test scenarios — unit (//go:build !integration)

Scoring Breakdown

Component Score Notes
Behavioral coverage (40 pts) 40 100% design tests
Error/edge case coverage (30 pts) 15 1 of 2 scenarios includes an edge/fallback case
Low duplication (20 pts) 20 No duplicate clusters
Proportional growth (10 pts) 10 Test/prod ratio: docker_pin_test.go 11/6 = 1.8×; actionpins_internal_test.go 8/24 = 0.3× — both under 2:1 threshold
Total 85

Verdict

Check passed. 0% of new tests are implementation tests (threshold: 30%). All assertions include descriptive messages, build tags are present, and no forbidden mock libraries are used.

📖 Understanding Test Classifications

Design Tests (High Value) verify what the system does:

  • Assert on observable outputs, return values, or state changes
  • Cover error paths and boundary conditions
  • Would catch a behavioral regression if deleted
  • Remain valid even after internal refactoring

Implementation Tests (Low Value) verify how the system does it:

  • Assert on internal function calls (mocking internals)
  • Only test the happy path with typical inputs
  • Break during legitimate refactoring even when behavior is correct
  • Give false assurance: they pass even when the system is wrong

Goal: Shift toward tests that describe the system's behavioral contract — the promises it makes to its users and collaborators.

References: §24761741708

🧪 Test quality analysis by Test Quality Sentinel · ● 501.2K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

✅ Test Quality Sentinel: 85/100. Test quality is excellent — 0% of new tests are implementation tests (threshold: 30%). Both new test scenarios verify observable behavioral contracts with descriptive assertion messages, correct build tags, and no guideline violations.

Auto-generated by the Design Decision Gate workflow.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@github-actions
Copy link
Copy Markdown
Contributor

Commit pushed: 807e6c3

🏗️ ADR gate enforced by Design Decision Gate 🏗️

@github-actions
Copy link
Copy Markdown
Contributor

🏗️ Design Decision Gate — ADR Required

This PR makes significant changes to core business logic (128 new lines in pkg/) but does not have a linked Architecture Decision Record (ADR).

AI has analyzed the PR diff and generated a draft ADR to help you get started:

📄 Draft ADR: docs/adr/27762-embedded-container-pin-fallback-at-compile-time.md

What the draft covers

The draft ADR captures the key design decision in this PR: introducing a two-level fallback for container image pin resolution at compile time (repo-local cache → embedded defaults in pkg/actionpins). It documents:

  • Context: mutable-tag emission risk when local cache is absent or incomplete
  • Decision: extend embedded pin data with a containers section and resolve in priority order
  • Alternatives: requiring a complete local cache, failing the build, or fetching pins from a live registry at compile time
  • Consequences: digest-pinned output for builtin images, increased data source complexity, and the need to keep embedded pins current

What to do next

  1. Review the draft ADR committed to your branch — it was generated from the PR diff
  2. Complete missing sections — add context only you know (e.g., timeline pressure, security incident that motivated this, rejected alternatives you actually considered)
  3. Finalize and commit the ADR to docs/adr/ on your branch
  4. Reference the ADR in this PR body by adding a line such as:

    ADR: ADR-27762: Embedded Container Pin Fallback at Compile Time

Once an ADR is linked in the PR body, this gate will re-run and verify the implementation matches the decision.

Why ADRs Matter

"AI made me procrastinate on key design decisions. Because refactoring was cheap, I could always say 'I'll deal with this later.' Deferring decisions corroded my ability to think clearly."

ADRs create a searchable, permanent record of why the codebase looks the way it does. Future contributors (and your future self) will thank you.


📋 Michael Nygard ADR Format Reference

An ADR must contain these four sections to be considered complete:

  • Context — What is the problem? What forces are at play?
  • Decision — What did you decide? Why?
  • Alternatives Considered — What else could have been done?
  • Consequences — What are the trade-offs (positive and negative)?

All ADRs are stored in docs/adr/ as Markdown files numbered by PR number (e.g., 27762-my-decision.md for PR #27762).

🔒 This PR cannot merge until an ADR is linked in the PR body.

References: §24761741715

🏗️ ADR gate enforced by Design Decision Gate 🏗️ · ● 144.8K ·

Copy link
Copy Markdown
Contributor Author

Copilot AI commented Apr 22, 2026

@copilot recompile and use hashed spec for containers when downloading and configuring awf

Done in 23d0b31. I recompiled the lock files and updated AWF configuration to use hash-spec image metadata in --image-tag (digest entries for squid/agent/api-proxy/cli-proxy), so both container download and AWF setup are hash-pinned.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • https://api.github.com/graphql
    • Triggering command: /usr/bin/gh gh repo view --json owner,name --jq .owner.login &#43; &#34;/&#34; &#43; .name /usr/bin/bash (http block)
    • Triggering command: /usr/bin/gh gh repo view owner/repo rev-�� --show-toplevel (http block)
    • Triggering command: /usr/bin/gh gh repo view owner/repo -ato�� -bool -buildtags /usr/bin/git -errorsas -ifaceassert -nilfunc git conf�� --get remote.origin.url 9620473/b475/vet.cfg (http block)
  • https://api.github.com/orgs/test-owner/actions/secrets
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name (http block)
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name go1.25.8 -c=4 -nolocalimports -importcfg /tmp/go-build2083448857/b070/importcfg -pack /tmp/go-build2083448857/b070/_testmain.go tion�� -json GO111MODULE 64/bin/go GOINSECURE GOMOD (http block)
    • Triggering command: /usr/bin/gh gh api /orgs/test-owner/actions/secrets --jq .secrets[].name -json GO111MODULE 64/bin/node GOINSECURE GOMOD GOMODCACHE go 1/x6�� -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/actions/ai-inference/git/ref/tags/v1
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv --show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv --paginate repos/{owner}/{repo}/actions/runs/1/artifacts /usr/bin/infocmp .artifacts[].namgit GOPROXY 64/bin/go infocmp -1 xterm-color go /usr/bin/git ut737594068/001 -json 64/pkg/tool/linuinstall git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/ai-inference/git/ref/tags/v1 --jq [.object.sha, .object.type] | @tsv --get-regexp ^remote\..*\.gh-resolved$ /usr/bin/gh prettier --check 64/bin/go gh repo�� view owner/test-repo /usr/bin/git y_with_explicit_node GOMOD ache/go/1.25.8/xinstall git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v3
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv /tmp/compile-instructions-test-354443692/.github/workflows l /usr/bin/git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv /tmp/TestHashStability_SameInputSameOutput2634204796/001/stability-test.md (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v3 --jq [.object.sha, .object.type] | @tsv /tmp/compile-instructions-test-2896281029/.github/workflows rev-parse /usr/bin/git .js&#39; --ignore-pagit GO111MODULE 64/bin/go git init�� GOMODCACHE go /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v5
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv 31003659/001 (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel aa9/init.pid /usr/bin/git agent-persona-extr runtime-runc/mob\n ache/node/24.14.: git rev-�� --show-toplevel sleep /usr/bin/git 9b0c92f931b4bbdfgit (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v5 --jq [.object.sha, .object.type] | @tsv --show-toplevel git 1/x64/bin/npm -v origin /usr/lib/git-cor--show-toplevel 1/x64/bin/npm rev-�� --show-toplevel /usr/lib/git-core/git /usr/bin/git run (http block)
  • https://api.github.com/repos/actions/checkout/git/ref/tags/v6
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv git-upload-pack &#39;/tmp/TestParseD--workflow git-upload-pack &#39;/tmp/TestParseDnonexistent-workflow /usr/bin/git by/04d214ead632bgit (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv k/gh-aw/gh-aw/.github/workflows/architecture-guardian.md --json ps -json GO111MODULE n-dir/node ps -C git rev-parse /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/checkout/git/ref/tags/v6 --jq [.object.sha, .object.type] | @tsv /tmp/TestHashConsistency_GoAndJavaScript4267314949/001/test-frontmatter-with-arrremote.origin.urgit l /usr/bin/git -json GO111MODULE de_modules/.bin/--show-toplevel git -C s/test.md git /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v8
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --paginate repos/{owner}/{repo}/actions/runs/12346/artifacts /usr/bin/git .artifacts[].namgit (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git 3021-48332/test-git GO111MODULE 1/x64/bin/node git rev-�� --show-toplevel go /usr/bin/git SameOutput263420git GO111MODULE /opt/hostedtoolc--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v8 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git 3312-68194/test-tr GO111MODULE ache/go/1.25.8/x[:lower:] git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE /opt/hostedtoolc--show-toplevel git (http block)
  • https://api.github.com/repos/actions/github-script/git/ref/tags/v9
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv ages-digest-again^{commit} (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/github-script/git/ref/tags/v9 --jq [.object.sha, .object.type] | @tsv 06756962/.github/workflows HEAD /usr/sbin/bash (http block)
  • https://api.github.com/repos/actions/setup-go/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/git n --local /home/REDACTED/.ca--show-toplevel git rev-�� --show-toplevel Z29cFSe/u-wxv_NmFyLbL5R9fgXA /usr/bin/git --local y 3a9782c7cdd98bde--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git init�� GOMODCACHE npm /usr/bin/git mLsRemoteWithReagit mLsRemoteWithRearev-parse 64/bin/go git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-go/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --git-dir go /usr/bin/infocmp -json GO111MODULE 64/bin/go infocmp -1 xterm-color go /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/actions/setup-node/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/git n --local /home/REDACTED/.lo--show-toplevel git rev-�� --show-toplevel git /usr/bin/git hub/workflows credential.helperev-parse ndor/bin/bash git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --git-dir go /usr/bin/gh -json GO111MODULE x_amd64/vet gh api /repos/actions/github-script/git/ref/tags/v9 --jq /usr/bin/git if ! cd actions/git GOPROXY 64/bin/go /usr/bin/git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/setup-node/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git 49/001/test-compgit GO111MODULE 64/bin/go /usr/bin/git (http block)
  • https://api.github.com/repos/actions/upload-artifact/git/ref/tags/v4
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv k/gh-aw/gh-aw/.github/workflows/archie.md -test.v=true /opt/hostedtoolcache/node/24.14.1/x64/bin/node -test.timeout=10git -test.run=^Test -test.short=true--show-toplevel node /tmp�� /tmp/TestHashStability_SameInputSameOutput216189906/001/stability-test.md (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv origin master /usr/bin/git -json GO111MODULE 1/x64/lib/node_m--show-toplevel git rev-�� --show-toplevel s/5/artifacts /opt/hostedtoolcache/node/24.14.1/x64/bin/node */*.ts&#39; &#39;**/*.jsgit GO111MODULE 64/bin/go node (http block)
    • Triggering command: /usr/bin/gh gh api /repos/actions/upload-artifact/git/ref/tags/v4 --jq [.object.sha, .object.type] | @tsv GOPATH GOPROXY epo.git GOSUMDB GOWORK ode git -C /tmp/gh-aw-test-runs/20260422-053312-68194/test-3661884627/.github/workflows s/3/artifacts /usr/bin/git h3576485413/001&#39;git h3576485413/001&#39;rev-parse 64/bin/go git (http block)
  • https://api.github.com/repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv --show-toplevel nly $name) { hasDiscussionsEnabled } } --get remote.origin.ur-c /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git test.txt (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv nly git /usr/bin/git user.email test@example.com-atomic /usr/bin/git git rev-�� --show-toplevel git /usr/bin/git 066429/001 Test User /usr/bin/git git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/astral-sh/setup-uv/git/ref/tags/eac588ad8def6316056a12d4907a9d4d84ff7a3b --jq [.object.sha, .object.type] | @tsv --count f8496002..HEAD $name) { hasDiscussionsEnabled } } README.md ion-test..token-config _modules/.bin/giuser.name git rev-�� HEAD f8496002..HEAD it token-test.txt ings.cjs k/node_modules/./home/REDACTED/work/gh-aw/gh-aw/.github/workflows git (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v0.1.2
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv --show-toplevel git /usr/bin/git n --local x_amd64/vet git rev-�� --show-toplevel x_amd64/vet /usr/bin/git --local y /opt/hostedtoolc--show-toplevel git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv GOMODCACHE go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v0.1.2 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git -json GO111MODULE 64/bin/go git rev-�� --show-toplevel go /usr/lib/git-core/git-remote-https rdian.md GO111MODULE 64/bin/go /usr/lib/git-core/git-remote-https (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv --show-toplevel (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv origin develop /usr/bin/git -json GO111MODULE ache/go/1.25.8/x--show-toplevel git -C /tmp/TestGuardPolicyMinIntegrityOnlymin-integrity_only_defaults_repo2292231358/001 config 64/pkg/tool/linux_amd64/compile remote.origin.urgit GO111MODULE 64/bin/go 64/pkg/tool/linux_amd64/compile (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv GOMODCACHE go /usr/bin/git -json GO111MODULE ache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel go /usr/bin/git */*.ts&#39; &#39;**/*.jsgit GO111MODULE 64/bin/go git (http block)
  • https://api.github.com/repos/github/gh-aw-actions/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv /tmp/TestHashConsistency_GoAndJavaScript3730173835/001/test-compremote.origin.url (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv -m l /usr/bin/git -json GO111MODULE 1/x64/bin/sh git rev-�� --show-toplevel go /usr/bin/git */*.ts&#39; &#39;**/*.jsgit GO111MODULE 64/bin/go git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw-actions/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv /tmp/TestParseDefaultBranchFromLsRemoteWithRealGitmaster_branch7remote.origin.url /tmp/TestParseDefaultBranchFromLsRemoteWithRealGitmaster_branch797545600/002/work /usr/bin/git -json GO111MODULE bin/sh git -C /tmp/gh-aw-test-runs/20260422-053312-68194/test-1333326109/.github/workflows config /opt/hostedtoolcache/node/24.14.1/x64/bin/node remote.origin.urgit GO111MODULE 64/bin/go node (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/1/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/1/artifacts --jq .artifacts[].name (http block)
    • Triggering command: /usr/bin/gh gh run download 1 --dir test-logs/run-1 (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/1/artifacts --jq .artifacts[].name GOPROXY 64/bin/go GOSUMDB GOWORK run-script/lib/n--show-toplevel go list�� ut737594068/001 -json 64/pkg/tool/linux_amd64/vet --write ../../../**/*.jsinit 64/bin/go 64/pkg/tool/linux_amd64/vet (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12345/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12345/artifacts --jq .artifacts[].name (http block)
    • Triggering command: /usr/bin/gh gh run download 12345 --dir test-logs/run-12345 (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12345/artifacts --jq .artifacts[].name --check 64/bin/go **/*.ts **/*.json --ignore-path go list�� y_with_explicit_repo1246713942/001 -e 64/pkg/tool/linux_amd64/compile tierignore go 64/bin/go 64/pkg/tool/linux_amd64/compile (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/12346/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12346/artifacts --jq .artifacts[].name (http block)
    • Triggering command: /usr/bin/gh gh run download 12346 --dir test-logs/run-12346 (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/12346/artifacts --jq .artifacts[].name --check 64/bin/go **/*.ts **/*.json --ignore-path git stat�� 4796/001/stability-test.md sh 64/pkg/tool/linux_amd64/asm tierignore go 64/bin/go 64/pkg/tool/linux_amd64/asm (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/2/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/2/artifacts --jq .artifacts[].name (http block)
    • Triggering command: /usr/bin/gh gh run download 2 --dir test-logs/run-2 (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/2/artifacts --jq .artifacts[].name GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go go env ut737594068/001 GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/3/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/3/artifacts --jq .artifacts[].name (http block)
    • Triggering command: /usr/bin/gh gh run download 3 --dir test-logs/run-3 (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/3/artifacts --jq .artifacts[].name GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go go env ut737594068/001 GO111MODULE 64/pkg/tool/linux_amd64/cgo GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linuorigin (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/4/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/4/artifacts --jq .artifacts[].name (http block)
    • Triggering command: /usr/bin/gh gh run download 4 --dir test-logs/run-4 (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/4/artifacts --jq .artifacts[].name GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go go env 4796/001/stability-test.md GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linutest@example.com (http block)
  • https://api.github.com/repos/github/gh-aw/actions/runs/5/artifacts
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/5/artifacts --jq .artifacts[].name (http block)
    • Triggering command: /usr/bin/gh gh run download 5 --dir test-logs/run-5 (http block)
    • Triggering command: /usr/bin/gh gh api --paginate repos/{owner}/{repo}/actions/runs/5/artifacts --jq .artifacts[].name GOPROXY 64/bin/go GOSUMDB GOWORK 64/bin/go go env -json GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet (http block)
  • https://api.github.com/repos/github/gh-aw/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path 03530110/001&#39; 03530110/001&#39; github.com 23f11ca7a4b9e78egit (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 100 (http block)
    • Triggering command: /usr/bin/gh gh run list --json databaseId,number,url,status,conclusion,workflowName,createdAt,startedAt,updatedAt,event,headBranch,headSha,displayTitle --workflow nonexistent-workflow-12345 --limit 6 (http block)
  • https://api.github.com/repos/github/gh-aw/contents/.github/workflows/shared/reporting.md
    • Triggering command: /tmp/go-build1709620473/b404/cli.test /tmp/go-build1709620473/b404/cli.test -test.testlogfile=/tmp/go-build1709620473/b404/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true (http block)
    • Triggering command: /tmp/go-build2083448857/b404/cli.test /tmp/go-build2083448857/b404/cli.test -test.testlogfile=/tmp/go-build2083448857/b404/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true GOINSECURE GOMOD GOMODCACHE go 1/x6�� -json GO111MODULE ache/go/1.25.8/xGOMODCACHE GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /tmp/go-build3395679911/b404/cli.test /tmp/go-build3395679911/b404/cli.test -test.testlogfile=/tmp/go-build3395679911/b404/testlog.txt -test.paniconexit0 -test.v=true -test.parallel=4 -test.timeout=10m0s -test.run=^Test -test.short=true GOINSECURE GOMOD igFiles,SwigCXXF-json go env int:cjs GO111MODULE 1/x64/lib/node_mGOMODCACHE GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v0.47.4
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq [.object.sha, .object.type] | @tsv --show-toplevel sleep /usr/bin/gh -- runtime-runc/mobrev-parse 1/x64/bin/node gh api --paginate repos/{owner}/{repo}/actions/runs/1/artifacts (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git efaultBranchFromgit efaultBranchFromrev-parse ache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel go /usr/bin/git -json GO111MODULE /opt/hostedtoolc/tmp/gh-aw/aw-feature-branch.patch git (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v0.47.4 --jq [.object.sha, .object.type] | @tsv --show-toplevel go /usr/bin/git -json GO111MODULE ache/go/1.25.8/x--show-toplevel git rev-�� --show-toplevel go /usr/bin/git 3312-68194/test-ls GO111MODULE ache/go/1.25.8/x/tmp/gh-aw/aw-feature-branch.patch git (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv d -n 10 --local (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env agent-performanc-errorsas GO111MODULE ache/go/1.25.8/x-nilfunc GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.0.0 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v1.2.3
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env heck &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.GOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v1.2.3 --jq [.object.sha, .object.type] | @tsv .&#34; GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env heck &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.GOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v2.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv re re (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v2.0.0 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env Gitmaster_branch4224065608/001&#39; Gitmaster_branch4224065608/001&#39; 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/github/gh-aw/git/ref/tags/v3.0.0
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq [.object.sha, .object.type] | @tsv (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go env heck &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.GOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/github/gh-aw/git/ref/tags/v3.0.0 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go 9754�� heck &#39;**/*.cjs&#39; &#39;**/*.ts&#39; &#39;**/*.GOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/nonexistent/action/git/ref/tags/v999.999.999
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq [.object.sha, .object.type] | @tsv get --local n gpg.program (http block)
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq [.object.sha, .object.type] | @tsv -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go env agent-persona-explorer.md GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/nonexistent/action/git/ref/tags/v999.999.999 --jq [.object.sha, .object.type] | @tsv b/workflows GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/nonexistent/repo/actions/runs/12345
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion (http block)
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion **/*.json --ignore-path ../../../.pretti--show-toplevel go env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh run view 12345 --repo nonexistent/repo --json status,conclusion GOSUMDB GOWORK 64/bin/go go env b/workflows GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet (http block)
  • https://api.github.com/repos/owner/repo/actions/workflows
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo github.com (http block)
    • Triggering command: /usr/bin/gh gh workflow list --repo owner/repo --json name,path,state /usr/bin/git (http block)
    • Triggering command: /usr/bin/gh gh workflow list --json name,state,path --repo owner/repo h GOINSECURE GOMOD GOMODCACHE go env .js&#39; --ignore-paGOINSECURE GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/test-owner/test-repo/actions/secrets
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name d (http block)
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name -json GO111MODULE ache/go/1.25.8/xGOMODCACHE GOINSECURE GOMOD GOMODCACHE go tion�� -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/test-owner/test-repo/actions/secrets --jq .secrets[].name with-tools.md GO111MODULE n-dir/node GOINSECURE GOMOD GOMODCACHE go 1/x6�� -json GO111MODULE 64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • https://api.github.com/repos/test/repo
    • Triggering command: /usr/bin/gh gh api /repos/test/repo --jq .default_branch runs/20260422-052250-7921/test-501594596 config /opt/hostedtoolcache/node/24.14.1/x64/bin/node s/test.md (http block)
    • Triggering command: /usr/bin/gh gh api /repos/test/repo --jq .default_branch 17834234/001 GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet env -json GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
    • Triggering command: /usr/bin/gh gh api /repos/test/repo --jq .default_branch mpiledOutput456864330/001 GO111MODULE 64/pkg/tool/linux_amd64/vet GOINSECURE GOMOD GOMODCACHE 64/pkg/tool/linux_amd64/vet env api-consumption-report.md GO111MODULE ache/go/1.25.8/x64/bin/go GOINSECURE GOMOD GOMODCACHE go (http block)
  • invalid.example.invalid
    • Triggering command: /usr/lib/git-core/git-remote-https /usr/lib/git-core/git-remote-https origin https://invalid.example.invalid/nonexistent-repo.git git conf�� --local --get 64/bin/git 64/bin/git git bin/git git add . /usr/lib/git-cororigin k/node_modules/.bin/git run --auto run-script/lib/nagent-change.txt git (dns block)

If you need me to access, download, or install something from one of these locations, you can either:

Copilot AI changed the title Pin builtin container images by digest in compiled lock files Pin builtin container images by digest in compiled lock files and AWF hash-spec configuration Apr 22, 2026
@pelikhan pelikhan added the smoke label Apr 22, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 22, 2026

⚠️ Smoke Gemini failed. Gemini encountered unexpected challenges...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 22, 2026

🌑 The shadows whisper... Smoke Codex failed. The oracle requires further meditation...

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 22, 2026

🚀 Smoke OpenCode MISSION COMPLETE! OpenCode delivered. 🔥

@github-actions
Copy link
Copy Markdown
Contributor

📰 BREAKING: Smoke Copilot is now investigating this pull request. Sources say the story is developing...

@github-actions github-actions Bot removed the smoke label Apr 22, 2026
@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 22, 2026

🎬 THE ENDSmoke Claude MISSION: ACCOMPLISHED! The hero saves the day! ✨

@github-actions
Copy link
Copy Markdown
Contributor

github-actions Bot commented Apr 22, 2026

⚠️ Smoke Crush failed. Crush encountered unexpected challenges...

@github-actions
Copy link
Copy Markdown
Contributor

Agent Container Tool Check

Tool Status Version
bash 5.2.21
sh available
git 2.53.0
jq 1.7
yq v4.52.5
curl 8.5.0
gh 2.89.0
node v20.20.2
python3 3.12.3
go 1.24.13
java openjdk 21.0.10
dotnet 10.0.201

Result: 12/12 tools available ✅

Overall Status: PASS

🔧 Tool validation by Agent Container Smoke Test · ● 163.4K ·

@github-actions
Copy link
Copy Markdown
Contributor

Great work on this one, @Copilot! 🎉 Pinning builtin container images by digest in compiled lock files is an important security and reproducibility improvement, and the implementation looks thorough — the cache-first, embedded-fallback resolution order is a clean pattern, and the AWF hash-spec integration ensures both pre-download and runtime image selection are fully digest-pinned.

The PR is well-scoped, well-tested (unit tests for the embedded pin accessor, the buildAWFImageTagWithDigests helper, the docker pin fallback path, and golden normalization), and the description clearly explains the what and why. The 207 auto-generated .lock.yml regenerations are expected collateral output from the compiler change.

This looks ready for maintainer review! ✅

Generated by Contribution Check · ● 1.5M ·

@github-actions
Copy link
Copy Markdown
Contributor

Smoke Test 24762218449: ✅ PASS

Test Result
GitHub MCP
MCP Scripts GH CLI
Serena CLI
Playwright
Web Fetch
File Write/Read
Discussion Interaction
Build gh-aw
Upload artifact
Discussion Creation
Workflow Dispatch
PR Review
Comment Memory

PR: "Pin builtin container images by digest in compiled lock files and AWF hash-spec configuration" by @Copilot (assignees: @pelikhan, @Copilot)

📰 BREAKING: Report filed by Smoke Copilot · ● 1M ·

@github-actions
Copy link
Copy Markdown
Contributor

Comment Memory

# Smoke Test Haiku

Code flows through the pipes,
Tests pass like a morning breeze,
Green lights all the way.

📰 BREAKING: Report filed by Smoke Copilot · ● 1M ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

Smoke test review of PR #27762 — pin builtin container images by digest. The overall approach is sound: deterministic digest pinning at compile time via embedded fallback data. Two inline suggestions: clarify the godoc on the new getEmbeddedContainerPin wrapper to make the no-cache semantics explicit, and consider logging the full resolved digest-tagged image string at runtime for operator visibility. No blocking issues.

📰 BREAKING: Report filed by Smoke Copilot · ● 1M

@@ -77,6 +77,11 @@ func getActionPinByRepo(repo string) (ActionPin, bool) {
return actionpins.GetActionPinByRepo(repo)
}

// getEmbeddedContainerPin returns the pinned container image for a given image reference.
func getEmbeddedContainerPin(image string) (actionpins.ContainerPin, bool) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

This thin wrapper around actionpins.GetContainerPin is a good addition — it keeps the calling code consistent with the existing getActionPinByRepo pattern. Consider whether the function-level godoc could mention that it falls back to embedded defaults (no cache involved), to make the pinning fallback chain explicit for future readers.

awfImageTag := getAWFImageTag(firewallConfig)
// Pin AWF Docker image version to match the installed binary version and include
// digest metadata when available so AWF uses immutable image references.
awfImageTag := buildAWFImageTagWithDigests(getAWFImageTag(firewallConfig), config.WorkflowData)
awfArgs = append(awfArgs, "--image-tag", awfImageTag)
awfHelpersLog.Printf("Pinned AWF image tag to %s", awfImageTag)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

Nice improvement — including digest metadata in the --image-tag flag makes the AWF image selection fully deterministic at compile time. The updated comment clearly describes the intent. One minor suggestion: consider logging the full resolved tag (with digests) at Printf level so operators can verify which exact digest was selected during a workflow run.

@github-actions
Copy link
Copy Markdown
Contributor

📰 VERDICT: Smoke Copilot has concluded. All systems operational. This is a developing story. 🎤

@github-actions
Copy link
Copy Markdown
Contributor

Smoke Test Run 24762218460 — Results:

Core tests: ✅✅✅✅✅✅✅✅✅❌✅✅ (11/12 pass)
PR review tests: ✅✅✅⚠️✅✅⚠️ (5/7 pass, 2 skipped)

Overall: PARTIAL — Test #10 (Agentic Workflows MCP status) ❌ unavailable; #16/#19 ⚠️ skipped.

💥 [THE END] — Illustrated by Smoke Claude · ● 204.4K ·

Copy link
Copy Markdown
Contributor

@github-actions github-actions Bot left a comment

Choose a reason for hiding this comment

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

💥 Automated smoke test review - all systems nominal!

💥 [THE END] — Illustrated by Smoke Claude · ● 204.4K

pins: nil,
expectedRefs: []string{"node:lts-alpine@sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"},
expectedDigests: []string{"sha256:d1b3b4da11eefd5941e7f0b9cf17783fc99d9c6fc34884a665f40a06dbdfc94f"},
},
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔍 Smoke Test Review Comment — Consider asserting invariants (non-empty Digest, PinnedImage contains @sha256:) rather than hard-coding the exact digest literal, to avoid test churn when embedded JSON is refreshed.

Comment thread pkg/workflow/docker.go
result[i] = embeddedPin.PinnedImage
pins[i] = GHAWManifestContainer(embeddedPin)
dockerLog.Printf("Pinned container image from embedded pins: %s -> %s", img, embeddedPin.PinnedImage)
continue
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

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

🔍 Smoke Test Review Comment — The doc comment here should be updated to reflect the new fallback order: cache → embedded defaults → unchanged. Callers need to know that some tags may be rewritten even with an empty local cache.

@pelikhan pelikhan merged commit 27e6b35 into main Apr 22, 2026
213 of 218 checks passed
@pelikhan pelikhan deleted the copilot/feature-pin-container-images-digest-again branch April 22, 2026 05:50
github-actions Bot added a commit that referenced this pull request Apr 22, 2026
Maintenance tone scan found 0 tone issues. Documented 4 new features
from pending changesets not yet reflected in dev.md:

- label_command trigger: new workflow trigger with status-comment and
  reaction defaults; exposes needs.activation.outputs.label_command
- GHE support: configure_gh_for_ghe.sh script for GitHub Enterprise
  host auto-detection in workflows using the gh CLI
- Audit commands: gh aw audit diff and gh aw audit report added to CLI
  quick reference and Command Categories section
- Container image pinning by digest (PR #27762): ContainerPin struct in
  pkg/actionpins compiles mutable tags to immutable SHA-256 digests

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Feature request: pin container images by digest in compiled lock files

3 participants