Skip to content

security: harden container supply chain - #17

Merged
eXPerience83 merged 64 commits into
mainfrom
agent/harden-supply-chain
Jul 28, 2026
Merged

security: harden container supply chain#17
eXPerience83 merged 64 commits into
mainfrom
agent/harden-supply-chain

Conversation

@eXPerience83

@eXPerience83 eXPerience83 commented Jul 26, 2026

Copy link
Copy Markdown
Owner

What changed

  • Scan both locally built images and the exact publication candidates with Trivy.
  • Retain JSON reports containing all CRITICAL findings for 14 days.
  • Fail CI and block public tag promotion only when a critical finding has a known fixed version.
  • Centralize the Trivy gate in scripts/enforce-trivy-gate.sh so build, edge and stable workflows use the same policy.
  • Pin every directly referenced third-party GitHub Action to a full commit SHA and enforce that rule in repository validation.
  • Pin the Dockerfile frontend and Ubuntu base image to immutable OCI digests.
  • Pin Codex, GitHub CLI, ttyd and mise release assets to repository-controlled, architecture-specific SHA-256 values.
  • Chain published Codex images to the exact digest produced by the corresponding base-image build.
  • Build publication candidates by digest, scan those exact digests and only then promote them to public moving or versioned tags.
  • Keep version and digest pins synchronized across versions.env, Dockerfiles, local builds and publication workflows.
  • Update stable toolchain pins after checking official upstream sources: mise 2026.7.14, Node.js 24.18.0 LTS, npm 12.0.1 and uv 0.11.32; Codex 0.145.0, Python 3.14.6, GitHub CLI 2.96.0 and ttyd 1.7.7 were already current.
  • Update daily upstream automation to track final Codex, GitHub CLI, ttyd, mise and uv releases plus maintenance updates within the selected Python 3.14, Node 24 LTS and npm 12 lines.
  • Assign npm updates exclusively to the grouped upstream workflow so Renovate and the custom updater cannot create competing PRs.
  • Fall back to an upstream SHA256SUMS asset when GitHub does not expose an asset digest, as currently happens with ttyd.
  • Add bounded retries and timeouts to upstream downloads and fail closed when TARGETARCH is missing or unsupported.
  • Reduce publication-workflow permissions to only source read and package write access.

Bubblewrap

The image previously pinned bubblewrap to the exact Ubuntu package revision 0.11.1-1ubuntu0.1. That looked reproducible, but Ubuntu repositories normally remove superseded package revisions. A future security update could therefore make an unchanged Dockerfile permanently fail because the old .deb was no longer available.

This PR now installs bubblewrap without an exact APT revision, selecting the current security revision from the repositories configured by Ubuntu 26.04. Repository validation prevents an exact bubblewrap package pin from being reintroduced unless the project first adopts an APT snapshot strategy.

The tradeoff is explicit: APT package resolution, including bubblewrap, is not claimed to be bit-for-bit reproducible. The resulting image is instead validated by the complete AMD64 build, runtime smoke tests and Trivy scans before public tags are promoted. This does not add privileges, capabilities or weaker sandbox settings.

Why

The repository previously used mutable GitHub Action tags, a mutable Ubuntu tag and release checksums obtained dynamically during the same build that downloaded the assets. It also had no vulnerability gate for completed or published images.

The first Trivy run proved the value of the new control by detecting CVE-2026-59873 in npm's bundled tar 7.5.13. The PR fixes the finding instead of suppressing it. The completed-image scan remains the source of truth for the dependency tree actually shipped.

Version policy

  • Use the latest final release for independently versioned tools when it passes build, runtime and vulnerability checks.
  • Keep runtimes on explicitly selected supported lines: Python 3.14, Node 24 LTS and npm 12.
  • Apply maintenance updates within those lines through reviewable PRs.
  • Treat a move to a new Python, Node or npm major line as an explicit compatibility decision.
  • Reject beta, release-candidate, nightly and preview releases from published images.
  • Manage Ubuntu LTS tag and digest updates through Renovate; manage the grouped runtime/tool updates through check-upstream.yml.

Security impact

  • A moved Action tag, Ubuntu tag or release asset can no longer silently change an otherwise identical build.
  • Published Codex images consume the exact base-image digest generated in the same workflow.
  • Fixable critical image vulnerabilities fail CI and prevent public tag promotion.
  • Critical findings without a known fix remain visible in retained reports rather than being hidden.
  • Checkout credentials are not persisted in build or publication jobs; the upstream-maintenance job retains them intentionally because it pushes its dedicated automation branch.
  • No runtime privileges, capabilities, mounts, networking settings or persistent paths change in this PR.

Validation

Current reviewed head: ad34dbfef1ed439ec4916c969d36b9bf8344872a.

  • Repository pin, immutable-reference and shell-syntax validation passes.
  • AMD64 base and Codex image builds pass with bubblewrap resolved from Ubuntu's current repositories.
  • Runtime, tmux and persistence smoke tests pass.
  • Trivy scans both completed images and retains all critical findings in JSON reports.
  • No fixable CRITICAL vulnerabilities remain in either image.
  • Vulnerability reports upload successfully as artifacts.
  • All previously actionable CodeRabbit review threads are resolved on the current head.
  • Final CodeRabbit re-review is still running.

The stable and edge publication workflows are structurally validated in the PR, but their GHCR push-and-promote paths only execute on a stable tag or after merge to main. The first edge publication after merge remains the final integration test for registry promotion.

Scope note

This PR hardens the external image, Action, release-asset and publication boundaries without claiming fully hermetic builds. APT repositories and language runtimes installed through mise remain controlled and tested inputs, but not snapshot-backed bit-for-bit reproducible inputs.

@coderabbitai

coderabbitai Bot commented Jul 26, 2026

Copy link
Copy Markdown

Review Change Stack

Note

Reviews paused

It looks like this branch is under active development. To avoid overwhelming you with review comments due to an influx of new commits, CodeRabbit has automatically paused this review. You can configure this behavior by changing the reviews.auto_review.auto_pause_after_reviewed_commits setting.

Use the following commands to manage reviews:

  • @coderabbitai resume to resume automatic reviews.
  • @coderabbitai review to trigger a single review.

Use the checkboxes below for quick actions:

  • ▶️ Resume reviews
  • ✅ Review completed - (🔄 Check again to review again)

No actionable comments were generated in the recent review. 🎉

ℹ️ Recent review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 94420860-7775-4df9-bf58-e3dd7989648c

📥 Commits

Reviewing files that changed from the base of the PR and between 881f9c8 and ad34dbf.

📒 Files selected for processing (14)
  • .github/workflows/build-amd64.yml
  • .github/workflows/check-upstream.yml
  • .github/workflows/publish-amd64.yml
  • .github/workflows/publish-edge-amd64.yml
  • CHANGELOG.md
  • PROJECT_STATUS.md
  • docs/releases.md
  • images/base/Dockerfile
  • images/codex/Dockerfile
  • renovate.json
  • scripts/build-local.sh
  • scripts/enforce-trivy-gate.sh
  • scripts/validate-version-pins.sh
  • versions.env
📜 Recent review details
🧰 Additional context used
📓 Path-based instructions (4)
scripts/**/*.sh

⚙️ CodeRabbit configuration file

scripts/**/*.sh: Review as production Bash. Check quoting, set -euo pipefail behavior, cleanup traps,
bounded retries and timeouts, non-interactive execution, idempotency and useful failure messages.
Flag commands that can hang, leak credentials, silently ignore failures or mutate persistent data unexpectedly.

Files:

  • scripts/enforce-trivy-gate.sh
  • scripts/build-local.sh
  • scripts/validate-version-pins.sh
images/**/Dockerfile

⚙️ CodeRabbit configuration file

images/**/Dockerfile: Review for reproducibility, supply-chain security and minimal image growth.
Require pinned upstream versions and checksum or digest verification for downloaded binaries.
Flag secrets, floating base tags, unsafe remote-script execution, broken multi-architecture logic,
cache misuse, unnecessary packages and changes that weaken the secure-by-default runtime.

Files:

  • images/codex/Dockerfile
  • images/base/Dockerfile
**/*.md

⚙️ CodeRabbit configuration file

**/*.md: Check that documentation matches the implemented behavior and clearly distinguishes experimental edge builds
from stable releases. Flag outdated versions, unsafe deployment guidance and claims not proven by CI or testing.

Files:

  • PROJECT_STATUS.md
  • docs/releases.md
  • CHANGELOG.md
.github/workflows/**

⚙️ CodeRabbit configuration file

.github/workflows/**: Review GitHub Actions for least-privilege permissions, safe event triggers, untrusted input handling,
accidental publication, tag-channel correctness, secret exposure, reproducible builds, SBOM/provenance
generation and appropriate validation before pushing images.

Files:

  • .github/workflows/build-amd64.yml
  • .github/workflows/publish-amd64.yml
  • .github/workflows/publish-edge-amd64.yml
  • .github/workflows/check-upstream.yml
🪛 actionlint (1.7.12)
.github/workflows/publish-edge-amd64.yml

[error] 65-65: shellcheck reported issue in this script: SC2129:style:2:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)

🪛 Checkov (3.3.8)
images/codex/Dockerfile

[low] 3-3: Ensure the base image uses a non latest version tag

(CKV_DOCKER_7)


[low] 1-94: Ensure that a user for the container has been created

(CKV_DOCKER_3)

images/base/Dockerfile

[low] 1-173: Ensure that HEALTHCHECK instructions have been added to container images

(CKV_DOCKER_2)


[low] 1-173: Ensure that a user for the container has been created

(CKV_DOCKER_3)

🪛 Hadolint (2.14.0)
images/codex/Dockerfile

[warning] 37-37: Use WORKDIR to switch to a directory

(DL3003)

images/base/Dockerfile

[warning] 57-57: Pin versions in apt get install. Instead of apt-get install <package> use apt-get install <package>=<version>

(DL3008)


[warning] 103-103: Use WORKDIR to switch to a directory

(DL3003)


[warning] 120-120: Use WORKDIR to switch to a directory

(DL3003)


[warning] 136-136: Use WORKDIR to switch to a directory

(DL3003)

🪛 LanguageTool
CHANGELOG.md

[style] ~40-~40: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...matically after required checks pass. - Changed the bubblewrap runtime probe to report ...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)


[style] ~41-~41: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...r failing unrelated image validation. - Changed bubblewrap installation to follow Ubunt...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

🪛 Shellcheck (0.11.0)
scripts/validate-version-pins.sh

[info] 97-97: Expressions don't expand in single quotes, use double quotes for that.

(SC2016)

🔇 Additional comments (24)
.github/workflows/build-amd64.yml (3)

19-24: LGTM!


42-62: LGTM!


64-79: LGTM!

CHANGELOG.md (3)

14-27: LGTM!


37-47: LGTM!


60-63: LGTM!

PROJECT_STATUS.md (2)

11-11: LGTM!


40-48: LGTM!

docs/releases.md (2)

19-21: LGTM!


42-48: LGTM!

versions.env (1)

1-25: LGTM!

renovate.json (1)

4-19: LGTM!

scripts/validate-version-pins.sh (2)

62-89: LGTM! Confirmed the uses: extraction now handles both - uses: and indented uses: forms, quoted values, and inline comments — resolves the previously flagged gap.


103-194: LGTM! Regex validations and sync loops correctly cover all new digest/version pins and previously-flagged BASE_VERSION/bubblewrap gaps.

images/base/Dockerfile (4)

1-28: LGTM! Digest-pinned frontend/base image and re-declared ARGs are consistently threaded through the label metadata.


53-62: LGTM! Unpinned bubblewrap with documented rationale correctly resolves the prior exact-pin fragility concern.


102-150: LGTM! Confirmed TARGETARCH guard no longer has a silent amd64 fallback, and all three download blocks now bound curl with retry/timeout flags and verify per-arch SHA-256 before install.


158-161: LGTM! Strict npm version equality check correctly enforces the pinned NPM_VERSION.

images/codex/Dockerfile (1)

1-8: LGTM! Codex asset download now verifies against a repository-controlled, architecture-specific SHA-256 with a strict TARGETARCH guard and bounded curl retries/timeouts.

Also applies to: 36-46

scripts/build-local.sh (1)

45-58: LGTM! New build-arg pins correctly match the variable names consumed by both Dockerfiles.

Also applies to: 67-68

.github/workflows/check-upstream.yml (1)

16-20: LGTM!

Also applies to: 31-77, 95-152, 153-229, 240-256, 265-284

.github/workflows/publish-amd64.yml (1)

22-25: LGTM!

Also applies to: 51-57, 69-86, 87-118, 119-129, 130-151, 152-162, 163-173, 174-179, 180-216

.github/workflows/publish-edge-amd64.yml (1)

17-20: LGTM!

Also applies to: 31-33, 55-87, 88-119, 120-130, 131-152, 153-163, 164-174, 175-180, 181-216

scripts/enforce-trivy-gate.sh (1)

1-71: LGTM!


Summary by CodeRabbit

  • Security

    • Added vulnerability scanning for locally built and published image candidates.
    • Stable and edge images are promoted only when no fixable critical vulnerabilities are detected.
    • Strengthened verification of downloaded tools and container base images using immutable digests and checksums.
  • Updates

    • Updated pinned versions for Node.js, npm, mise, and uv.
    • Upstream version checks now run daily across supported toolchain releases.
  • Documentation

    • Clarified release, security, image promotion, and bubblewrap behavior.

Walkthrough

The change adds immutable version, image, action, frontend, and asset checksum pins; synchronizes them through upstream automation and publishing workflows; verifies them during Docker builds; and gates image publication and AMD64 builds on Trivy findings.

Changes

Supply-chain integrity and build automation

Layer / File(s) Summary
Pin contracts and validation
versions.env, renovate.json, scripts/validate-version-pins.sh
Defines architecture-specific digests, synchronizes version and Ubuntu pins, and validates Dockerfile, workflow, version, bubblewrap, and checksum requirements.
Image inputs and asset verification
images/*/Dockerfile, scripts/build-local.sh
Builds use immutable Ubuntu and frontend references, verify downloaded assets with pinned SHA-256 values, install the pinned npm release, and receive the required build arguments.
Upstream synchronization
.github/workflows/check-upstream.yml
Upstream automation selects constrained releases, resolves asset digests, updates synchronized pins, validates changes, manages automation PRs, and evaluates AMD64 retries.
Digest-first image publication
.github/workflows/publish-*.yml, scripts/enforce-trivy-gate.sh
Stable and edge workflows build digest-addressed candidates, scan exact image digests, enforce fixable critical-vulnerability gates, and promote only matching digests to public tags.
Local scanning and project records
.github/workflows/build-amd64.yml, CHANGELOG.md, PROJECT_STATUS.md, docs/releases.md
AMD64 builds scan local images and retain reports; project records document the updated toolchain, release policy, security controls, and promotion flow.

Estimated code review effort: 4 (Complex) | ~60 minutes

Sequence Diagram(s)

sequenceDiagram
  participant check-upstream.yml
  participant GitHubReleases
  participant versions.env
  participant validate-version-pins.sh
  participant AutomationPR
  check-upstream.yml->>GitHubReleases: fetch constrained release tags and asset digests
  check-upstream.yml->>versions.env: update versions and SHA256 values
  check-upstream.yml->>validate-version-pins.sh: validate synchronized pins
  validate-version-pins.sh-->>check-upstream.yml: return validation result
  check-upstream.yml->>AutomationPR: create or update automation PR
Loading
sequenceDiagram
  participant publish-workflows
  participant ContainerRegistry
  participant Trivy
  participant enforce-trivy-gate.sh
  participant PublicTags
  publish-workflows->>ContainerRegistry: push base and Codex candidates by digest
  publish-workflows->>Trivy: scan exact candidate digests
  Trivy-->>publish-workflows: return JSON reports
  publish-workflows->>enforce-trivy-gate.sh: enforce fixable CRITICAL gate
  enforce-trivy-gate.sh-->>publish-workflows: return gate result
  publish-workflows->>PublicTags: promote matching scanned digests
  PublicTags-->>publish-workflows: verify promoted digests
Loading

Possibly related PRs

🚥 Pre-merge checks | ✅ 4 | ❌ 1

❌ Failed checks (1 warning)

Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. Write docstrings for the functions missing them to satisfy the coverage threshold.
✅ Passed checks (4 passed)
Check name Status Explanation
Title check ✅ Passed The title is concise and clearly captures the main change: hardening the container supply chain.
Description check ✅ Passed The description is detailed and covers what changed, impact, validation, and follow-up, though it doesn't use the template's exact Impact and Safety sections.
Linked Issues check ✅ Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check ✅ Passed Check skipped because no linked issues were found for this pull request.
✨ Finishing Touches
📝 Generate docstrings
  • Create stacked PR
  • Commit on current branch
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Commit unit tests in branch agent/harden-supply-chain

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@eXPerience83
eXPerience83 marked this pull request as ready for review July 26, 2026 21:28
@qodo-code-review

Copy link
Copy Markdown

Qodo reviews are paused for this user.

Troubleshooting steps vary by plan Learn more →

On a Teams plan?
Reviews resume once this user has a paid seat and their Git account is linked in Qodo.
Link Git account →

Using GitHub Enterprise Server, GitLab Self-Managed, or Bitbucket Data Center?
These require an Enterprise plan - Contact us
Contact us →

@coderabbitai coderabbitai 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.

Actionable comments posted: 7

🤖 Prompt for all review comments with AI agents
Verify each finding against current code. Fix only still-valid issues, skip the
rest with a brief reason, keep changes minimal, and validate.

Inline comments:
In @.github/workflows/build-amd64.yml:
- Around line 75-111: Extract the vulnerability-gate logic from the workflow
step into a shared executable scripts/enforce-trivy-gate.sh accepting one or
more label:report arguments, preserving its jq filtering, diagnostics, findings
aggregation, and failure behavior. Replace the duplicated blocks in
build-amd64.yml, publish-amd64.yml, and publish-edge-amd64.yml with calls to the
shared script using each workflow’s existing labels and report filenames, and
ensure it is included in the existing bash -n validation loop.
- Around line 64-74: Update the Trivy report upload steps to avoid turning
missing reports into misleading failures: in .github/workflows/build-amd64.yml
lines 64-74, .github/workflows/publish-amd64.yml lines 166-176, and
.github/workflows/publish-edge-amd64.yml lines 166-176, gate each upload with
!cancelled() or change if-no-files-found to warn while preserving report uploads
when scans produce files.

In @.github/workflows/check-upstream.yml:
- Around line 151-162: Make replace_env and replace_arg fail when their target
key is absent instead of allowing sed to silently succeed without a match.
Before or during each replacement, verify that the expected variable or ARG
exists in the target file, return a nonzero status with a clear error if it does
not, and preserve the current replacement behavior when the key is present so
the workflow cannot incorrectly close the automation PR.

In @.github/workflows/publish-amd64.yml:
- Around line 24-26: Add persist-credentials: false to the checkout steps in
.github/workflows/publish-amd64.yml (lines 24-26),
.github/workflows/publish-edge-amd64.yml (line 33), and
.github/workflows/build-amd64.yml (lines 18-22). In publish-amd64.yml, preserve
the later authenticated git fetch by passing an explicit token to that fetch
when the repository is private; no follow-up authentication change is needed in
the other workflows.

In `@images/base/Dockerfile`:
- Around line 100-140: The architecture selection and release downloads need
stricter handling. In images/base/Dockerfile lines 100-140, update the gh, ttyd,
and mise case statements to use TARGETARCH without an amd64 fallback, and add
the specified retry, connect-timeout, and max-time options to each curl
invocation. In images/codex/Dockerfile lines 37-45, make the same TARGETARCH
change and apply the same curl bounds to the Codex download.

In `@scripts/validate-version-pins.sh`:
- Around line 156-173: Update the version-pin contract around the sync loop by
adding BASE_VERSION to the variables passed to require_synced_arg, keeping it
synchronized between versions.env and images/base/Dockerfile. For
BUBBLEWRAP_VERSION, remove the exact apt version pin from the base image
Dockerfile so installation follows the digest-pinned base image, unless you
instead add it to versions.env with a maintainable update path.
- Around line 103-106: Update the UBUNTU_VERSION validation in the
version-pinning script to require the same even-year .04 Ubuntu LTS pattern
enforced by renovate.json, rejecting interim releases such as 25.04 while
preserving the existing error and exit behavior.
🪄 Autofix (Beta)

Fix all unresolved CodeRabbit comments on this PR:

  • Push a commit to this branch (recommended)
  • Create a new PR with the fixes

ℹ️ Review info
⚙️ Run configuration

Configuration used: Path: .coderabbit.yaml

Review profile: ASSERTIVE

Plan: Pro Plus

Run ID: 9cc90105-1a48-4c84-aba3-bfbf331710e7

📥 Commits

Reviewing files that changed from the base of the PR and between 881f9c8 and 437cda2.

📒 Files selected for processing (12)
  • .github/workflows/build-amd64.yml
  • .github/workflows/check-upstream.yml
  • .github/workflows/publish-amd64.yml
  • .github/workflows/publish-edge-amd64.yml
  • CHANGELOG.md
  • PROJECT_STATUS.md
  • images/base/Dockerfile
  • images/codex/Dockerfile
  • renovate.json
  • scripts/build-local.sh
  • scripts/validate-version-pins.sh
  • versions.env
📜 Review details
🧰 Additional context used
📓 Path-based instructions (4)
**/*.md

⚙️ CodeRabbit configuration file

**/*.md: Check that documentation matches the implemented behavior and clearly distinguishes experimental edge builds
from stable releases. Flag outdated versions, unsafe deployment guidance and claims not proven by CI or testing.

Files:

  • PROJECT_STATUS.md
  • CHANGELOG.md
scripts/**/*.sh

⚙️ CodeRabbit configuration file

scripts/**/*.sh: Review as production Bash. Check quoting, set -euo pipefail behavior, cleanup traps,
bounded retries and timeouts, non-interactive execution, idempotency and useful failure messages.
Flag commands that can hang, leak credentials, silently ignore failures or mutate persistent data unexpectedly.

Files:

  • scripts/build-local.sh
  • scripts/validate-version-pins.sh
images/**/Dockerfile

⚙️ CodeRabbit configuration file

images/**/Dockerfile: Review for reproducibility, supply-chain security and minimal image growth.
Require pinned upstream versions and checksum or digest verification for downloaded binaries.
Flag secrets, floating base tags, unsafe remote-script execution, broken multi-architecture logic,
cache misuse, unnecessary packages and changes that weaken the secure-by-default runtime.

Files:

  • images/codex/Dockerfile
  • images/base/Dockerfile
.github/workflows/**

⚙️ CodeRabbit configuration file

.github/workflows/**: Review GitHub Actions for least-privilege permissions, safe event triggers, untrusted input handling,
accidental publication, tag-channel correctness, secret exposure, reproducible builds, SBOM/provenance
generation and appropriate validation before pushing images.

Files:

  • .github/workflows/build-amd64.yml
  • .github/workflows/check-upstream.yml
  • .github/workflows/publish-edge-amd64.yml
  • .github/workflows/publish-amd64.yml
🪛 actionlint (1.7.12)
.github/workflows/publish-edge-amd64.yml

[error] 65-65: shellcheck reported issue in this script: SC2129:style:2:1: Consider using { cmd1; cmd2; } >> file instead of individual redirects

(shellcheck)

🪛 Checkov (3.3.8)
images/codex/Dockerfile

[low] 3-3: Ensure the base image uses a non latest version tag

(CKV_DOCKER_7)


[low] 1-93: Ensure that a user for the container has been created

(CKV_DOCKER_3)

images/base/Dockerfile

[low] 1-167: Ensure that HEALTHCHECK instructions have been added to container images

(CKV_DOCKER_2)


[low] 1-167: Ensure that a user for the container has been created

(CKV_DOCKER_3)

🪛 Hadolint (2.14.0)
images/codex/Dockerfile

[warning] 37-37: Use WORKDIR to switch to a directory

(DL3003)

images/base/Dockerfile

[warning] 100-100: Use WORKDIR to switch to a directory

(DL3003)


[warning] 116-116: Use WORKDIR to switch to a directory

(DL3003)


[warning] 131-131: Use WORKDIR to switch to a directory

(DL3003)

🪛 LanguageTool
CHANGELOG.md

[style] ~40-~40: Three successive sentences begin with the same word. Consider rewording the sentence or use a thesaurus to find a synonym.
Context: ...matically after required checks pass. - Changed the bubblewrap runtime probe to report ...

(ENGLISH_WORD_REPEAT_BEGINNING_RULE)

🪛 Shellcheck (0.11.0)
scripts/validate-version-pins.sh

[info] 97-97: Expressions don't expand in single quotes, use double quotes for that.

(SC2016)

🪛 zizmor (1.26.1)
.github/workflows/check-upstream.yml

[warning] 17-19: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

.github/workflows/publish-edge-amd64.yml

[warning] 33-33: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

.github/workflows/publish-amd64.yml

[warning] 24-26: credential persistence through GitHub Actions artifacts (artipacked): does not set persist-credentials: false

(artipacked)

🔇 Additional comments (28)
renovate.json (1)

4-32: LGTM!

Also applies to: 48-58

scripts/validate-version-pins.sh (4)

62-89: LGTM!


91-101: LGTM! The SC2016 hint on Line 97 is a false positive — the literal ${UBUNTU_VERSION} string is exactly what must appear in the Dockerfile.


182-188: LGTM!


49-60: 🎯 Functional Correctness

No change needed.

scripts/validate-version-pins.sh uses set -euo pipefail, so exit 1 from require_frontend_pin terminates the script via errexit after the command-substitution assignment fails.

images/base/Dockerfile (2)

1-29: LGTM!


152-155: LGTM! The explicit npm --version assertion is a good guard against the shim resolving to the Node-bundled npm.

scripts/build-local.sh (2)

67-68: LGTM!


45-58: 🗄️ Data Integrity & Integration

No change needed. UBUNTU_VERSION and UV_VERSION are already passed through scripts/build-local.sh, and the base image ARGs are covered by the local build args.

.github/workflows/check-upstream.yml (4)

17-19: LGTM! The zizmor artipacked hint is a false positive — this job pushes the automation branch with the checkout credentials at Line 218, so persist-credentials: false would break it.


28-62: LGTM! Each derived value is regex-validated at Lines 64-95 before it reaches the sed replacements, so no unvalidated upstream string is interpolated into the pin files.


97-136: LGTM! The trap-based cleanup, the .digest-then-SHA256SUMS fallback, and the hard failure on an unresolvable digest are all correct; the awk $2 == "*" asset concatenation properly handles binary-mode checksum lines.


221-256: LGTM! --jq '.[0] // {}' correctly yields an empty object when no run matches, so the three // empty extractions degrade to empty strings and the dispatch branch at Line 258 fires.

PROJECT_STATUS.md (1)

11-11: LGTM! Every listed pin matches versions.env, and the review date is consistent across both files.

Also applies to: 40-54

versions.env (1)

21-25: 🗄️ Data Integrity & Integration

Pins are valid stable releases.

.github/workflows/publish-amd64.yml (6)

52-58: LGTM!


64-86: LGTM!


88-118: LGTM!


120-131: LGTM!

Also applies to: 154-165


132-153: LGTM!


177-251: LGTM!

.github/workflows/publish-edge-amd64.yml (3)

55-86: LGTM!


88-165: LGTM!


177-250: LGTM!

CHANGELOG.md (3)

14-14: LGTM!


27-27: LGTM!


57-59: LGTM!

.github/workflows/build-amd64.yml (1)

39-63: 📐 Maintainability & Code Quality

No change needed.

The hardcoded Trivy image-ref values match the default BASE_IMAGE and CODEX_IMAGE produced by scripts/build-local.sh.

Comment thread .github/workflows/build-amd64.yml
Comment thread .github/workflows/build-amd64.yml Outdated
Comment thread .github/workflows/check-upstream.yml
Comment thread .github/workflows/publish-amd64.yml
Comment thread images/base/Dockerfile Outdated
Comment thread scripts/validate-version-pins.sh Outdated
Comment thread scripts/validate-version-pins.sh
@eXPerience83

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@eXPerience83

Copy link
Copy Markdown
Owner Author

@codex

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
✅ Action performed

Full review finished.


Your included review limit is currently reached under our Fair Usage Limits Policy. This review may still proceed through usage-based billing if eligible. Your next included review will be available in 4 minutes.

@chatgpt-codex-connector

Copy link
Copy Markdown

Codex Review: Didn't find any major issues. Hooray!

Reviewed commit: ad34dbfef1

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

@eXPerience83

Copy link
Copy Markdown
Owner Author

@coderabbitai full review

@coderabbitai

coderabbitai Bot commented Jul 27, 2026

Copy link
Copy Markdown
✅ Action performed

Full review finished.

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