Repository navigation
chore: add root syft config for the source SBOM - #3742
Conversation
The managed source SBOM failed sbom-with-licenses (592) and sbom-banned-licenses (1). Syft found no license for Go modules without a module cache, and it listed GitHub Actions, manifest files, CI tooling, the labs SDKs and test data, which are not shipped. Look up Go module licenses remotely, exclude .github, extras, labs and testdata, and do not list manifest files as components. The SBOM keeps the 472 Go modules of the root module, all with a license. Refs: PFM-8051 Assisted-by: Claude Code Signed-off-by: Jose I. Paris <jiparis@chainloop.dev> Chainloop-Trace-Sessions: 82aee093-bc74-473c-a666-45f54c8814a1
PR validation — ✅ 3 passing
AI Session Checks — 🟡 81% ·
|
| Avg score | Sessions | Failing policies | Attribution | Files | Lines | Total Duration |
|---|---|---|---|---|---|---|
| 🟡 81% | 1 | 100% AI / 0% Human | 6 | +146 / -3 | 3h23m55s |
🟡 81% — 100% AI — ⚠️ 1 policies failing
-
Oct 28, 2026 09:50 UTC · 3h23m55s · $47.62 · 1.2k in / 510.2k out · claude-code 2.1.312 (claude-opus-5-5)
Change Summary
-
- Adjusts
sbom-with-licensesto ignore the directory-scan target when it is afilemain component. - Adds unit and integration fixtures covering the syft directory-scan case and expected golden output.
- Extends
sbom-generationwith anexcludeinput defaulting to**/testdata/**.
- Adjusts
AI Session Overall Score
-
🟡 81% — Well-targeted fix, but planning and final validation stopped short.
AI Session Analysis Breakdown
-
🟢 94% · scope-discipline
-
🟢 Touched files stayed on the policy edge case and the new template input. · High Impact
🟢 91% · alignment
-
No notes.
🟢 88% · solution-quality
-
🟢 Policy narrows the skip to the scan target and still checks other file components. · High Impact
🟡 76% · context-and-planning
-
🟠 The AI did solid repo prep but never wrote a plan for the policy-plus-template phase. · Medium Severity
💡 For multi-part policy work, write a short phase plan before the first edit.
🟡 72% · user-trust-signal
-
🟠 The user had to stop one early jump from reporting into fixing before the session settled. · Medium Severity
💡 When you want reporting before fixes, keep that sequence explicit in the opening ask.
🟡 68% · verification
-
🟢 AI added and reran integration coverage for the syft directory-scan fixture. · High Impact
🟠 Repo-wide
make validatenever finished, and the session ended without post-change user confirmation. · Medium Severity💡 Wait for the last repo-wide validation command to finish before you declare the change ready.
-
File Attribution
████████████████████100% AI / 0% HumanStatus Attribution File Lines created ai policies/integration-tests/materials/cyclonedx-syft-dir-scan.json+64 / -0 modified ai policies/sbom-with-licenses/sbom-with-licenses-cyclonedx_test.rego+41 / -0 created ai policies/integration-tests/outputs/cyclonedx-syft-dir-scan-with-licenses.json+20 / -0 modified ai policies/sbom-with-licenses/sbom-with-licenses-cyclonedx.rego+13 / -3 modified ai workflow-templates/sbom-generation.yaml+7 / -0 modified ai policies/integration-tests/run_tests.sh+1 / -0
Policies (4, 1 failing)
Status Policy Material Messages ✅ Passed ai-config-ai-agents-allowedai-coding-session-82aee0- ✅ Passed ai-config-no-dangerous-commandsai-coding-session-82aee0- ⚠️ Failedai-config-no-secretsai-coding-session-82aee0- Secret (generic-password) detected in session content [turn=19, source=tool_result, line=2]: {"comments":[{"id":"IC_kwDOJGCyjc8AAAABgZnNtg","author":{"login":"chainloop-platform"},"authorAssociation":"CONTRIBUTOR","body":"\n## PR validation — ✅ 3 passing\n\n| ...
- Secret (generic-password) detected in session content [turn=36, source=tool_result, line=1]: {"violations":[{"message":"Secret (generic-password) detected in session content [turn=2728, source=assistant-tool_use:Bash, line=19]: r = op.open(urllib.parse.urljoin(url, action), urllib.parse.urlen...
- Secret (generic-password) detected in session content [turn=782, source=queue-operation, line=11]: | G1: turn 44, tool_result (Read of a Go CLI file) | 1-6 (6) | A Go identifier, not a secret. The rule matched
RegistryPassword: [CHAINLOOP_TRACE_REDACTED:generic-password],(line 112) and took t... - Secret (generic-password) detected in session content [turn=785, source=user-message, line=12]: | G1: turn 44, tool_result (Read of a Go CLI file) | 1-6 (6) | A Go identifier, not a secret. The rule matched
RegistryPassword: [CHAINLOOP_TRACE_REDACTED:generic-password],(line 112) and took t... - Secret (generic-password) detected in session content [turn=803, source=assistant-text, line=10]: | The Go variable
[CHAINLOOP_TRACE_REDACTED:generic-password]was taken as a password and replaced everywhere | 6 | False positive (the CLI redacts too much) | Chainloop repo: allowlist bare identif... - Secret (generic-password) detected in session content [turn=803, source=assistant-text, line=2]: - The
generic-passwordallowlist ininternal/redaction/betterleaks.toml:42-56covers dotted property access only, such ase.password. It does not cover bare identifiers such as[CHAINLOOP_TRACE...</li><li>Secret (generic-password) detected in session content [turn=803, source=assistant-text, line=3]: -redaction.go:580usesstrings.ReplaceAllwithout word boundaries, so it also changes longer names such as[CHAINLOOP_TRACE_REDACTED:generic-password]EnvVarName.</li><li>Secret (generic-password) detected in session content [turn=831, source=assistant-tool_use:Write, line=1]: {"content":"## Triage of policy violations in v1.128.1+next\\n\\nThis comment adds the failures of v1.128.1+next (58967a46-bf29-47c8-b15d-77950188b174). It records the findings only. It changes no cod...</li><li>Secret (generic-password) detected in session content [turn=857, source=assistant-text, line=9]: |ai-config-no-secrets(14) | 6 come from the CLI redacting the Go variable[CHAINLOOP_TRACE_REDACTED:generic-password]. 7 come from a Rego bug: the session read its own violation messages back. |...</li><li>Secret (generic-password) detected in session content [turn=900, source=tool_result, line=179]: 179 | Turn 44, Read of a Go CLI file | 6 | The Go identifier[CHAINLOOP_TRACE_REDACTED:generic-password]inRegistryPassword: [CHAINLOOP_TRACE_REDACTED:generic-password],. The CLI then replaced th...</li><li>Secret (generic-password) detected in session content [turn=900, source=tool_result, line=185]: 185 * Chainloop repository: ininternal/redaction/betterleaks.toml:42-56, add ageneric-passwordallowlist for bare code identifiers (for example[CHAINLOOP_TRACE_REDACTED:generic-password]). To...</li><li>Secret (jwt) detected in session content [turn=42, source=tool_result, line=23]: 229:# Placeholders without the annotation prove nothing —[CHAINLOOP_TRACE_REDACTED:jwt]is a</li><li>Secret (jwt) detected in session content [turn=42, source=tool_result, line=80]: 367:# line=1]: [CHAINLOOP_TRACE_REDACTED:jwt]. When a later session reads that text back — a - Secret (jwt) detected in session content [turn=45, source=tool_result, line=4]: # line=1]: [CHAINLOOP_TRACE_REDACTED:jwt]`. When a later session reads that text back — a
- Secret (jwt) detected in session content [turn=63, source=tool_result, line=1]: {"digest":"sha256:be6eca16734dfcf2f7917f65ae8f7dfe4c7c5f3c683637a3e2eb521587edfcc1","name":"","content":"https://cas.chainloop.dev/download/sha256:be6eca16734dfcf2f7917f65ae8f7dfe4c7c5f3c683637a3e2eb5...
- Secret (jwt) detected in session content [turn=65, source=assistant-tool_use:Bash, line=1]: D=/private/tmp/claude-501/-Users-jiparis-projects-chainloop/82aee093-bc74-473c-a666-45f54c8814a1/scratchpad/sbom; mkdir -p $D; curl -sSL -o $D/sbom.json 'https://cas.chainloop.dev/download/sha256:be6e...
- Secret (jwt) detected in session content [turn=85, source=tool_result, line=21]: deel_pto: "https://api.deel.com/apps/webhooks/calendars/[CHAINLOOP_TRACE_REDACTED:jwt]"
- Secret (private-key) detected in session content [turn=121, source=tool_result, line=16]: [CHAINLOOP_TRACE_REDACTED:private-key]
- Secret (private-key) detected in session content [turn=53, source=tool_result, line=13]: ## [CHAINLOOP_TRACE_REDACTED:private-key]
✅ Passed ai-config-mcp-servers-allowedai-coding-session-82aee0- -
Security Checks — ✅ 6 passing
✅ secret-scan
| Status | Policy | Messages |
|---|---|---|
| ✅ Passed | secrets-detection |
- |
✅ sast-scan
| Status | Policy | Messages |
|---|---|---|
| ✅ Passed | owasp-top10-2025 |
- |
| ✅ Passed | sast |
- |
| ✅ Passed | cwe-top25 |
- |
| ✅ Passed | cwe-top26-40-cusp |
- |
✅ iac-scan
| Status | Policy | Messages |
|---|---|---|
| ✅ Passed | iac-misconfiguration |
- |
Scans not applied (2)
| Scan | Reason |
|---|---|
vulnerability-scan |
no manifest/lockfile changed |
github-actions-scan |
no workflow files changed |
Security context
✅ Nothing this change touches has a recorded security-fix history.
View in Chainloop ↗ · How this works ↗
Powered by Chainloop and Chainloop Trace
There was a problem hiding this comment.
All reported issues were addressed across 1 file
Reply with feedback, questions, or to request a fix.
View guided diff | Re-trigger cubic
Add a root
.syft.yamlso that the source SBOM of the managedsbom-generationworkflow lists only what this repository ships, with a license for each package.The source SBOM failed
sbom-with-licenses(592 violations) andsbom-banned-licenses(1 violation):extras), the policy SDKs inlabsand test data. These are not shipped.BSD-Clause-3) in a dependency oflabs/wasm-policy-sdk/js.The config turns on remote license lookup for Go modules, excludes
.github,extras,labsandtestdata, and does not list manifest files as components. The SBOM keeps the 472 Go modules of the root module, each with a license.One violation stays: the root component of a directory scan (
.) has no license. A change in the workflow contract or in the platform must fix it.Refs PFM-8051.
AI disclosure: Claude Code helped to triage the findings and to write this change.