Stack (DEP-91)
Split from #1662 for reviewability, then rescoped: main has since landed #1681 (dependency/toolchain CVEs) and #1693 (hoophq/hoopagent), which superseded two PRs of the original stack.
-
#1683 — Go dependency + toolchain CVE bumps— closed, superseded by #1681 -
#1685 — opt-in— closed, superseded by #1693hoophq/hoopdev-minimal -
#1684 — 1. agent-tools: drop kernel-header CVEs, modernize clean train
-
#1686 — 2. Vulnerability gates for hoopagent + govulncheck
-
#1687 — 3. SBOM + bundled-tool manifest on releases ← you are here
-
#1688 — 4. Weekly base-OS rebuild of hoopagent
-
#1689 — 5. Image release integrity hardening
Merge in order, bottom-up. Each PR targets the one below it.
The remaining work is what main still lacks: the fat image's kernel-header CVEs, and any vulnerability gate, SBOM, or scheduled OS patching for hoophq/hoopagent.
What
Generates CycloneDX/SPDX SBOMs and a per-tag release manifest for the published images, recording each tag's index digest, per-platform child digests, and (for the fat agent) bundled CLI versions.
Covers hoophq/hoop, hoophq/hoopdev, and both hoophq/hoopagent flavours.
Why
Makes shipped image contents auditable, and prevents reported tool versions from drifting from what actually shipped.
Note on hoopagent tags
hoophq/hoopagent deliberately publishes no unsuffixed tag and no :latest — every deployment names its flavour. The image list therefore carries an explicit tag suffix per entry (("hoophq/hoopagent", "-minimal")) instead of assuming repo:tag resolves. Assuming a bare tag would have made the SBOM job silently skip both flavours.
hoopagent is intentionally not in REQUIRED_IMAGE_REPOS, so a lagging publish warns rather than failing the release.
How to test
python3 -m unittest scripts/ci/test_generate_sbom_manifest.pyExpected: tests pass. Registry visibility probes stay non-raising; Trivy failures propagate.
Part of DEP-91.
Automated by MisterMal
Activity
10Code Review by Qodo
🐞 Bugs (0) 📘 Rule violations (1) 📎 Requirement gaps (0) 🔗 Cross-repo conflicts (0) 📜 Skill insights (0)
1. SBOM job skipped on failure ⊘ Outdated 🐞 Bug ☼ Reliability
Description
The new sbom-and-manifest job depends on docker-publish-hoopdev-minimal-multiarch; if that upstream job fails, GitHub Actions can skip sbom-and-manifest, preventing SBOM/manifest upload for all images even though the generator already tolerates missing tags.
Code
.github/workflows/release.yml[R1345-1348]+ needs: + - publish-release + - docker-publish-hoopdev-minimal-multiarch + continue-on-error: true
Evidence
sbom-and-manifest is configured with a hard needs dependency on the minimal multi-arch publish job. That upstream job is marked continue-on-error: true (i.e., it may fail), and without an explicit always()-style condition the SBOM job can be skipped when a needed job fails; this bypasses the generator’s built-in “skip missing tags” behavior because the generator never runs.
.github/workflows/release.yml[1341-1377].github/workflows/release.yml[979-1016]
Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution ### Issue description `sbom-and-manifest` is intended to be best-effort and should run after a release is published, even if optional image-publish jobs fail. Currently it has a hard `needs` dependency on `docker-publish-hoopdev-minimal-multiarch`, so if that job fails, `sbom-and-manifest` can be skipped and no SBOM/manifest artifacts are attached. ### Issue Context - The SBOM generator already retries registry visibility and skips missing image tags; the job being skipped prevents that logic from running at all. - `publish-release` should remain the real gate (only run SBOM job when the release actually shipped). ### Fix Focus Areas - .github/workflows/release.yml[1345-1348] ### Suggested fix Adjust the job condition so it always runs when `publish-release` succeeded, regardless of the minimal-image job result. Example: ```yaml sbom-and-manifest: needs: - publish-release - docker-publish-hoopdev-minimal-multiarch if: ${{ always() && needs.publish-release.result == 'success' }} ``` Alternative: remove the minimal-image job from `needs` and rely on the generator's retry/skip behavior.
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
2. No tests for SBOM generator 📘 Rule violation ▣ Testability
Description
The PR adds a non-trivial SBOM/manifest generator with parsing and retry logic but does not add/modify any unit tests covering common and edge cases. This increases the risk of silent release-artifact failures (e.g., registry lag, non-index manifests, missing ARGs) going undetected.
Code
scripts/ci/generate-sbom-manifest.py[R172-175]+def bundled_tools() -> dict: + """Read bundled-CLI versions from Dockerfile.tools' ARG defaults. + + Best-effort: an ARG that is renamed or removed is simply omitted (the SBOMs
Relevance
●● ModerateThey sometimes push back on adding broader tests; no close precedent for requiring unit tests for new CI scripts.
ⓘ Recommendations generated based on similar findings in past PRs
Evidence
PR Compliance ID 1807237 requires unit tests for new/changed helpers/parsers. The PR introduces new parsing helpers (e.g., Dockerfile ARG parsing in bundled_tools()), but the diff includes no added or updated test files for this logic.
Rule 1807237: For new or changed helpers/parsers, add unit tests covering common and edge formatsscripts/ci/generate-sbom-manifest.py[172-188]
Agent prompt
The issue below was found during a code review. Follow the provided context and guidance below and implement a solution ## Issue description A new helper/parsing script (`scripts/ci/generate-sbom-manifest.py`) was added without accompanying unit tests, despite containing parsing/normalization and retry/branching logic. ## Issue Context This script impacts release artifact generation (SBOMs + `release-manifest.json`). Unit tests should cover at least: multi-arch index vs single-manifest behavior, registry visibility retry/skip logic, Dockerfile ARG parsing, and Trivy JSON summarization. ## Fix Focus Areas - scripts/ci/generate-sbom-manifest.py[75-115] - scripts/ci/generate-sbom-manifest.py[117-131] - scripts/ci/generate-sbom-manifest.py[147-165] - scripts/ci/generate-sbom-manifest.py[172-188]
ⓘ Copy this prompt and use it to remediate the issue with your preferred AI generation tools
Context
39 rules✅ Cross-repo context
hoophq/libhoophoophq/infrahoophq/documentationhoophq/changelogTip of the day
💡 Did you know, you can enable the Remediation agent and Qodo fixes findings in a dedicated fix PRMore tips ↗ | Customize Qodo ↗ | Qodo docs ↗
Migration Safety Analysis
No database migrations were changed in this PR. Safe to deploy to sandbox.
✅ Build Completed with Success, Version=1687.0.0-g5f1a276
✅ Build Completed with Success, Version=1687.0.0-ge80324a
PR Summary by Qodo
Attach Trivy SBOMs and release manifest to GitHub releases
✨ Enhancement⚙️ Configuration changes🕐 40+ MinutesAI Description
Diagram
High-Level Assessment
1. Use Trivy GitHub Action + built-in upload steps
2. Publish SBOMs as OCI artifacts (ORAS/Cosign attestations)
Files changed (4)
+349 / -3Enhancement (1)
+297 / -0generate-sbom-manifest.py
Generate per-platform SBOMs and release-manifest.json for published images+297/-0Bug fix (1)
+1 / -1Dockerfile.tools
Download AWS CLI from versioned archive URL+1/-1Other (2)
+51 / -2agent-tools-build.yml
Pin AWS CLI version and make Trivy report steps truly non-blocking+5/-2release.yml
Add non-blocking SBOM + manifest job and upload assets to release+46/-0