Skip to content

ci: pin the artifacts catalog on docker image bumps - #6744

Merged
avallete merged 7 commits into
developfrom
avallete/amazing-cannon-157f6c
Sep 23, 2026
Merged

avallete merged 7 commits into
developfrom
avallete/amazing-cannon-157f6c

Conversation

@avallete

@avallete avallete commented Sep 23, 2026 •

Copy link
Copy Markdown
Member

Summary

  • Slim-image mirroring no longer opens its own pull request to pin packages/stack/src/Artifacts.ts.
  • A Dependabot bump of the service-image Dockerfile commits the matching catalog pins onto that same pull request.
  • OrioleDB tags have no slim image. They stay on docker.io, and a missing slim pin does not block the other services.

claude and others added 2 commits September 23, 2026 12:25
The workload catalog sync opened one branch and PR per service, so a
slim-services release train produced a PR per workload. Every dispatch now
rebuilds one shared `sync/stack-workload-catalog` branch as develop plus the
pins already pending on it plus its own pin, pushes with a lease on the head it
read, and recomposes when a concurrent run for another service moved it first.
The PR is opened once and then only updated.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_011xm6NLFBFUSFXYrEc7Cp5c
The mirror dispatch should not open a pull request that pins Artifacts.ts.
A later workflow will own that catalog update.
@avallete avallete changed the title ci: serialize concurrent workload catalog syncs with push leases ci: drop the artifacts catalog pull request from slim mirroring Sep 23, 2026
Dependabot's Dockerfile pull request is the image bump. Commit the matching
slim pins onto that branch so the docker tag, slim image, and native archive
stay on one version.
@avallete avallete changed the title ci: drop the artifacts catalog pull request from slim mirroring ci: pin the artifacts catalog on docker image bumps Sep 23, 2026
OrioleDB tags have no slim image. Leave them on docker.io and keep pinning
the other Dockerfile services. Read those services with the manifest parser
instead of a second FROM reader.
@avallete
avallete marked this pull request as ready for review September 23, 2026 14:31
@avallete
avallete requested a review from a team as a code owner September 23, 2026 14:31

@github-actions github-actions Bot left a comment

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.

🤖 AI Review

The new sync can rewrite unrelated catalog pins, including a PostgreSQL downgrade, and can advance tag-only pins without checking publication. Skipped pins do not fail the job or receive a later publication-triggered refresh. Its generated commit does not trigger fresh pull request CI. The claimed regctl manifest head output bug is refuted by the repository’s existing mirror implementation and tests.

Findings

Severity Location Category Sources Claim
🟠 MAJOR .github/workflows/sync-artifacts-catalog.yml:90 ci-trigger claude+codex The catalog commit is pushed with the checkout’s GITHUB_TOKEN, so it does not trigger fresh pull request CI for the rewritten catalog.
🟠 MAJOR .github/scripts/sync-artifacts-catalog.ts:206 correctness claude One Dockerfile bump can rewrite unrelated catalog pins and move a pin backwards.
🟠 MAJOR .github/scripts/sync-artifacts-catalog.ts:227 publication-check claude+codex Tag-only catalog entries can advance before their slim image or native release is published.
🟠 MAJOR .github/scripts/sync-artifacts-catalog.ts:292 error-handling claude A mapped Dockerfile pin that cannot be applied only produces a warning, allowing the sync job to succeed with a partial or missing catalog update.
🟠 MAJOR docs/adr/0026-slim-artifact-mirrors.md:16 release-coverage claude Removing the publication dispatch consumer leaves the additional PostgreSQL 15.x catalog line and same-version digest republishes without an automatic sync path.
🟠 MAJOR .github/workflows/sync-artifacts-catalog.yml:16 workflow-trigger codex A digest pin skipped while publication is pending has no automatic refresh when that slim manifest appears later.
🟡 MINOR .github/workflows/sync-artifacts-catalog.yml:85 formatting claude The generated catalog is committed without formatting, so a version-length change can leave Artifacts.ts failing fmt:check.
🟡 MINOR .github/scripts/sync-artifacts-catalog.test.ts:187 test-coverage claude+codex The real-catalog test does not verify that every mapped Dockerfile alias has a catalog entry.
🟡 MINOR .github/workflows/sync-artifacts-catalog.yml:33 registry-access claude Digest lookups rely on anonymous GHCR access, and authentication or network failures are treated as missing manifests.
🟡 MINOR .github/workflows/github-scripts-ci.yml:12 ci-coverage claude+codex Changes to the new script’s shared parser or slim-image mapping do not trigger its dedicated GitHub-scripts CI workflow.
🟡 MINOR .github/workflows/sync-artifacts-catalog.yml:90 concurrency claude If the Dependabot branch moves after the head check but before the push, the sync job fails instead of retrying or exiting cleanly.
⚪ NIT .github/scripts/sync-artifacts-catalog.ts:135 consistency claude The digest-prefetch pass silently ignores an invalid version that the planning pass then rejects.
⚪ NIT .github/scripts/sync-artifacts-catalog.ts:207 observability claude An OrioleDB image on an alias with no slim mapping is still reported as a skipped catalog pin.
Refuted findings (kept for transparency, not posted as review comments)
  • .github/scripts/sync-artifacts-catalog.ts:253 (correctness): Digest-pinned entries are skipped because regctl manifest head outputs fields rather than a bare digest.
    Refuted: The trusted default-branch mirror implementation uses the same regctl manifest head command and compares its trimmed stdout directly with a sha256 digest (trusted/.github/scripts/mirror-slim-image.ts:105-114). Its matching-head test supplies a bare digest as stdout (trusted/.github/scripts/mirror-slim-image.test.ts:101-109). The finding’s asserted fields-output contract conflicts with this existing repository command contract.

Stats

Claude findings: 12 · Codex findings: 6 · Confirmed: 13 · Refuted: 1 · Uncertain: 0


Models: claude-opus-5 + gpt-6-sol · Trigger: auto · Workflow run

This review runs once per PR. A maintainer can request another with a /ai-review comment.

Comment thread docs/adr/0026-slim-artifact-mirrors.md Resolved
A Dependabot bump was rewriting every slim pin, including a PostgreSQL
downgrade, and the catalog push did not trigger CI.
The old catalog script was the only external caller, so the export failed knip.
@avallete
avallete enabled auto-merge September 23, 2026 15:39
@avallete
avallete added this pull request to the merge queue Sep 23, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Sep 23, 2026
@avallete
avallete added this pull request to the merge queue Sep 23, 2026
Merged via the queue into develop with commit 5d7f9a4 Sep 23, 2026
122 checks passed
@avallete
avallete deleted the avallete/amazing-cannon-157f6c branch September 23, 2026 16:06
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.

3 participants