Skip to content

chore: add root syft config for the source SBOM - #3742

Merged
jiparis merged 1 commit into
chainloop-dev:mainfrom
jiparis:jiparis/pfm-8051-syft-config
Oct 28, 2026
Merged

jiparis merged 1 commit into
chainloop-dev:mainfrom
jiparis:jiparis/pfm-8051-syft-config

Conversation

@jiparis

@jiparis jiparis commented Oct 28, 2026 •

Copy link
Copy Markdown
Member

Add a root .syft.yaml so that the source SBOM of the managed sbom-generation workflow lists only what this repository ships, with a license for each package.

The source SBOM failed sbom-with-licenses (592 violations) and sbom-banned-licenses (1 violation):

  • Syft found no license for the Go modules, because the scan has no module cache.
  • The SBOM listed GitHub Actions, manifest files, CI tooling (extras), the policy SDKs in labs and test data. These are not shipped.
  • The banned license is a misspelled license name (BSD-Clause-3) in a dependency of labs/wasm-policy-sdk/js.

The config turns on remote license lookup for Go modules, excludes .github, extras, labs and testdata, 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.

View guided diff

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
@chainloop-platform

chainloop-platform Bot commented Oct 28, 2026 •

Copy link
Copy Markdown
Contributor

PR validation — ✅ 3 passing

Status Policy Material Messages
✅ Passed pr-min-approvals pr-info -
✅ Passed pr-description-required pr-info -
✅ Passed pr-user-story-linked pr-info -

View attestation ↗

AI Session Checks — 🟡 81% · ⚠️ 1 failing

Avg score Sessions Failing policies Attribution Files Lines Total Duration
🟡 81% 1 ⚠️ 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)

View session details ↗

Change Summary

  • Adjusts sbom-with-licenses to ignore the directory-scan target when it is a file main component.
  • Adds unit and integration fixtures covering the syft directory-scan case and expected golden output.
  • Extends sbom-generation with an exclude input defaulting to **/testdata/**.

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 validate never 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% Human

Status 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-allowed ai-coding-session-82aee0 -
✅ Passed ai-config-no-dangerous-commands ai-coding-session-82aee0 -
⚠️ Failed ai-config-no-secrets ai-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-password allowlist in internal/redaction/betterleaks.toml:42-56 covers dotted property access only, such as e.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: in internal/redaction/betterleaks.toml:42-56, add a generic-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-allowed ai-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

View attestation ↗

Security context

✅ Nothing this change touches has a recorded security-fix history.

View in Chainloop ↗ · How this works ↗


Powered by Chainloop and Chainloop Trace

@cubic-dev-ai cubic-dev-ai 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.

All reported issues were addressed across 1 file

Reply with feedback, questions, or to request a fix.

View guided diff | Re-trigger cubic

Comment thread .syft.yaml
@jiparis
jiparis requested a review from a team October 28, 2026 12:48
@jiparis
jiparis merged commit 33f92a0 into chainloop-dev:main Oct 28, 2026
17 of 18 checks passed
@jiparis
jiparis deleted the jiparis/pfm-8051-syft-config branch October 28, 2026 13:36
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.

2 participants