Repository navigation
feat: adopt the image SBOM evidence contract (#108) - #113
Merged
antoinetoussaint-byte merged 2 commits intoSep 14, 2026
Merged
antoinetoussaint-byte merged 2 commits into
antoinetoussaint-byte merged 2 commits into
Conversation
This agent inherited a source-only Builder.SBOM, so an image-scope request was answered with a Go module graph — evidence that says nothing about the packages in the Alpine image it ships. Pin service-go v0.0.49 to adopt the shared image-scope override. The scanner stays in core and this repo adds no override of its own. Coverage is measured against the recipe this specialization emits: go-grpc fully overrides Build, so its plan is its own and the image subjects are derived from that plan rather than restated beside it. The release gate asserts only the typed outcome, so it holds whether the agent answers with a source inventory or the precondition failure. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Two of the tests added in 7af9395 passed unchanged against service-go v0.0.48 — the exact pin they were meant to gate. An assertion that holds on both sides of the change it guards is not coverage: reverting the pin would have left the suite green, and one of the two was described in the pull request as the release gate. Delete both. The coverage-validation link they claimed is already exercised by the plan-derived subject test, which does fail on v0.0.48, and the multi-platform assertion worth keeping is folded into it. Verified by re-running every remaining assertion against v0.0.48: both image-scope tests fail there and pass on v0.0.49, while the source inventory test passes on both, which is what a guard should do. Also fixed, each at its cause rather than its symptom: - Collect Serve's error through a channel and report it from cleanup. A t.Errorf from a goroutine that outlives the test panics the whole package instead of failing one test. - Share one gRPC harness rather than two near-identical copies, which removes that same goroutine flaw from the recipe test. - Assert the resolved module purl in the source inventory. The fixture has no dependencies, so a checksum alone would also be produced by an inventory that resolved nothing at all. - Stop writing this agent's GoVersion into fixture go.mod files. Naming a patch release newer than the toolchain running the tests makes go list download a toolchain before it will answer. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
antoinetoussaint-byte
deleted the
issue-108-universal-sboms-cover-every-runtime-image-and-adopt
branch
October 25, 2026 17:05
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Closes #108.
Summary
Builder.SBOM, so an image-scope request was answered with a Go module graph — evidence that says nothing about the packages in the Alpine image it ships. Pinning service-go v0.0.49 adopts the shared image-scope override; the scanner stays in core and this repo adds no override of its own.Build, so its plan is its own (oneapprecipe, Dockerfile at the output-directory root, two shipped platforms), and image subjects are derived from that plan rather than restated beside it.Verification that these tests actually gate
Each assertion was re-run against the old pin (
service-go v0.0.48) in a scratch copy. Both image-scope tests fail there and pass on v0.0.49, so they detect the regression they claim to:TestImageScopeWithoutSubjectsIsAPreconditionFailureTestPlanDerivedSubjectsAreRefusedUntilTheyCarryADigestTestSourceInventoryRemainsAvailableAn earlier revision of this branch carried two further tests that passed identically on both pins — they could not detect the adoption they advertised. They were removed rather than left as false assurance; the multi-platform assertion they contained was folded into the test that does gate.
Cross-repo action taken
service-go's override was merged (codefly-dev/service-go#70) but never released, so there was nothing here to pin. On the operator's instruction I tagged service-go v0.0.49 at
5b1f5c4— the version itsagent.codefly.yamlalready declared — after confirming main was green in CI and locally. That tag is what this PR pins.That release deliberately does not flip
ValidationCapabilities().ImageSbom. Advertising it registers a requiredTASK_PHASE_IMAGE_SBOMphase (coreciinputs/inputs.go), so doing it before codefly-dev/cli#663 supplies subjects would give every Go service a CI phase failingPRECONDITION_FAILEDby design.Required follow-through — this PR is not self-completing
v0.1.39after merge.agent.codefly.yamlnow declares 0.1.39 and the newest tag is v0.1.38. This repo has no manifest-guard check, so nothing in CI catches a manifest claiming a version that was never released.codefly.dev/goat 0.0.48, validated as an exact version, so the released contract is not reachable through the CLI until that pin moves. It is filed rather than fixed directly becausepromote-sourceis a qualification gate requiring a fixture run, not a version-string edit; hand-editing the JSON would bypass that gate. This does not affect go-grpc, which is absent from that roster.Not done, and why
No end-to-end test scans a real runtime image for OS packages. This agent emits a recipe and never runs buildx, so it holds no digest; real evidence needs a pushed image and a scanner, and
syftis on neither the development machine nor the stockubuntu-latestrunner this repo's CI uses. The concrete blockers are recorded in #112 rather than papered over with a test that always skips.Test plan
go build ./...,go vet ./...,gofmt,go mod tidycleango test ./...green against service-go v0.0.49ERROR/SBOM_SCOPE_IMAGE/FAILURE_CODE_PRECONDITION_FAILEDthrough the composed gRPC agentTestBuildRecipeOverGRPCstill green after moving it onto the shared harness🤖 Generated with Claude Code