Skip to content

docs(supply-chain): say that SBOMs are expiring workflow artifacts, not release assets - #991

Closed
cemililik wants to merge 1 commit into
developmentfrom
docs/wave0-sbom-workflow-artifact
Closed

cemililik wants to merge 1 commit into
developmentfrom
docs/wave0-sbom-workflow-artifact

Conversation

@cemililik

@cemililik cemililik commented Oct 18, 2026 •

Copy link
Copy Markdown
Collaborator

Summary

Auditors were told to run gh release download v<X.Y.Z> --pattern 'sbom-*' and to "re-emit the SBOM from the git tag and diff it against the one attached to the release". Nothing attaches an SBOM to a GitHub Release. publish.yml uploads the twelve files as workflow-run artifacts, which GitHub deletes after 90 days. This says so, gives commands that work, and says what the file actually contains.

Related issues

Refs #114 — the documentation half. Attaching the SBOMs to the release and generating them from a clean, runtime-only environment are code changes and stay open on the issue. (The project owner decided not to upload historical SBOMs to Releases, so the pages describe the workflow artifact.)

Changes — each row shows what it said and what it says now

Where Said Now says
docs/reference/supply_chain_security{,-tr}.md "downloadable from the GitHub release page"; gh release download … workflow-run artifacts of the tag's publish.yml run, 90-day retention; gh run list --workflow publish.yml --branch v<X.Y.Z> --status success, then gh run download <id> --name sbom-ubuntu-latest-py3.11
same, "Determinism contract" "an auditor can re-emit the SBOM from the git tag and diff against the artefact attached to the release" determinism is same-environment only; dependencies resolve from PyPI at build time, so a later re-emit will not match; to describe your deployment run python3 tools/generate_sbom.py in your environment
same + both user-manual pages + deployer guide (silent on content) the file is the CI runner's pip list after installing the wheel, three Linux extras and pytest: it names test tooling, has no dependency graph and no licence data
docs/qms/sop_change_management{,-tr}.md §4.3 "reproducible from its git tag … attached to the GitHub release" a record of the build environment, not reproducible from the tag alone
docs/guides/iso_soc2_deployer_guide{,-tr}.md, docs/usermanuals/{en,tr}/operations/{iso-soc2-deployer,supply-chain}.md gh release download "$(gh release view …)" the gh run … commands above, with the 90-day note
ISO A.5.32, SOC 2 CC9.2, statement of applicability (EN+TR) "license extraction in SBOM" removed; HF model-card metadata stays, and the row says the SBOM carries no licence data
docs/usermanuals/{en,tr}/operations/supply-chain.md, reference nightly pip-audit "OSV / GHSA scan"; "exit 1 means a HIGH/CRITICAL vulnerability" it queries PyPI's vulnerability data (pip-audit's default service; the workflow passes no --vulnerability-service); exit 1 also covers UNKNOWN-severity findings, which the reference page already said

Checked

  • A real released SBOM (v0.11.0, sbom-ubuntu-latest-py3.11): 130 components including pytest, pytest-cov, pip and setuptools; no licenses, no dependencies key.
  • gh run list … --branch v0.11.0 --status success returns the publish run; gh run download --name … writes the file directly into the target directory, --pattern 'sbom-*' writes one directory per artifact (both run against the live v0.11.0 artifacts).
  • pip-audit's default --vulnerability-service is pypi.

What this changes for a deployer

An audit answer can no longer cite "the SBOM attached to the release" or "licence extraction in the SBOM". The v0.11.0 artifacts expire on 2026-10-19; the maintainers kept a local copy of every release's SBOMs (they are not published).

Not done here

The site copy (features.ent.sbom.body, compliance.iso.supply.body) says "emitted per release tag", which is true and unchanged.

Type

  • Documentation

Testing

  • The full CLAUDE.md gauntlet from a clean worktree of this branch: exit 0.

Checklist

  • English and Turkish mirrors updated together (Turkish wording needs the owner's review)
  • CHANGELOG entry under [Unreleased]

🤖 Generated with Claude Code

Summary by Sourcery

Correct supply-chain and compliance documentation to accurately describe SBOM storage, contents, reproducibility, and vulnerability scanning behavior.

Bug Fixes:

  • Correct documentation and tooling comments to identify release SBOMs as temporary workflow-run artifacts rather than GitHub Release assets.
  • Clarify that SBOMs describe the CI runner's installed package list, include test tooling, and contain neither dependency-graph nor licence data.
  • Correct pip-audit documentation to identify PyPI as the default vulnerability-data service and include UNKNOWN-severity findings in the failure policy.

Enhancements:

  • Update English and Turkish supply-chain, deployment, change-management, and compliance documentation with working commands for locating and downloading SBOM workflow artifacts.
  • Clarify that SBOM determinism applies only within the same environment and that regenerating from a tag alone is not expected to reproduce a release SBOM.
  • Remove unsupported claims that SBOMs provide licence extraction from ISO 27001 and SOC 2 control mappings.

CI:

  • Update nightly workflow documentation comments to describe pip-audit's PyPI vulnerability-data source.

Documentation:

  • Revise auditor and deployer guidance to cover 90-day artifact retention, SBOM contents, environment-specific generation, and local deployment evidence.

Chores:

  • Add an Unreleased changelog entry documenting the corrected SBOM and vulnerability-scanning guidance in English and Turkish.

…ot release assets

The supply-chain reference, the deployer guide, the change-management SOP and the user-manual pages told an auditor to run
`gh release download ... --pattern 'sbom-*'` and to re-emit the SBOM from the git tag and diff it against the one attached
to the release. publish.yml only uploads the twelve files as workflow-run artifacts (90-day retention), so there is nothing
on a Release page, and the SBOM is the CI runner's `pip list` taken after pytest and, on Linux, three extras were installed:
test tooling is listed, there is no dependency graph and no licence data (checked on the real v0.11.0 SBOM: 130 components,
pytest and pytest-cov among them). It cannot be reproduced from the tag, because dependencies resolve from PyPI at build time.

The pages now give commands that work (`gh run list --workflow publish.yml --branch v<X.Y.Z> --status success`, then
`gh run download`; the layout was checked against the v0.11.0 run), say what the file contains, and drop "license extraction
in SBOM" from ISO A.5.32, SOC 2 CC9.2 and the statement of applicability. The nightly pip-audit is described as querying
PyPI's vulnerability data (its default service; the workflow passes no --vulnerability-service), and "exit 1" in the manual
now includes UNKNOWN-severity findings, which the reference page already said.

Attaching SBOMs to the release and generating them from a clean runtime-only environment are code changes and stay open.

Refs #114

Co-Authored-By: Claude Sonnet 5.5 <noreply@anthropic.com>
@sourcery-ai

sourcery-ai Bot commented Oct 18, 2026

Copy link
Copy Markdown

Sorry @cemililik, you've used your own review budget of 250,000 diff characters for the last 7 days.

You can request another review in 13 hours and 1 minute by commenting @sourcery-ai review. Upgrade to get a review now.

@coderabbitai

coderabbitai Bot commented Oct 18, 2026

Copy link
Copy Markdown
Contributor

Warning

Review limit reached

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

Next included review available in 4 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 3 included reviews currently available. Your 48 included PR review attempts over the past 7 days set your current allowance at 3 reviews per hour.

Learn how review limits work.

Review configuration:

⚙️ Run configuration
  • Configuration used: defaults
  • Review profile: CHILL
  • Plan: Essentials
  • Run ID: e11bacb8-e2a7-4a42-bb8b-17442248263a
📥 Commits

Reviewing files that changed from the base of the PR and between 56b4f0d and 07e03bb.

📒 Files selected for processing: 19
  • .github/workflows/nightly.yml
  • CHANGELOG.md
  • docs/guides/iso_soc2_deployer_guide-tr.md
  • docs/guides/iso_soc2_deployer_guide.md
  • docs/qms/sop_change_management-tr.md
  • docs/qms/sop_change_management.md
  • docs/qms/statement_of_applicability-tr.md
  • docs/qms/statement_of_applicability.md
  • docs/reference/iso27001_control_mapping-tr.md
  • docs/reference/iso27001_control_mapping.md
  • docs/reference/soc2_trust_criteria_mapping-tr.md
  • docs/reference/soc2_trust_criteria_mapping.md
  • docs/reference/supply_chain_security-tr.md
  • docs/reference/supply_chain_security.md
  • docs/usermanuals/en/operations/iso-soc2-deployer.md
  • docs/usermanuals/en/operations/supply-chain.md
  • docs/usermanuals/tr/operations/iso-soc2-deployer.md
  • docs/usermanuals/tr/operations/supply-chain.md
  • tools/generate_sbom.py
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@sourcery-ai

sourcery-ai Bot commented Oct 18, 2026

Copy link
Copy Markdown

Reviewer's Guide

This documentation-only PR corrects the SBOM audit story across English and Turkish references, guides, SOPs, compliance mappings, and operator manuals: SBOMs are 90-day workflow-run artifacts rather than GitHub Release assets, represent the CI runner’s installed package set without dependency or licence data, are not reproducible from a tag alone, and use PyPI vulnerability data with UNKNOWN findings treated as failures.

Flow diagram for SBOM contents and reproducibility

flowchart LR
    Tag[Release tag] --> Publish[publish.yml]
    Publish --> Runner[CI matrix runner]
    Runner --> Install[Install wheel and extras]
    Install --> PipList[pip list]
    PipList --> SBOM[CycloneDX SBOM]
    SBOM --> Artifact[Workflow-run artifact]
    Artifact -->|90-day retention| Archive[Deployer archives artifact]
    SBOM --> Limits[No dependency graph<br/>No licence data<br/>Test tooling included]
    Tag --> Later[Later re-emission]
    Later --> Mismatch[May differ: dependencies resolve from PyPI at build time]
Loading

File-Level Changes

Change Details Files
Correct the documented SBOM retrieval model from GitHub Release assets to expiring workflow-run artifacts.
  • Replace gh release download instructions with gh run list and gh run download commands.
  • Document the 90-day retention window and the need to archive artifacts.
  • Clarify that twelve matrix SBOMs are produced by the tag’s publish.yml run.
docs/reference/supply_chain_security.md
docs/reference/supply_chain_security-tr.md
docs/guides/iso_soc2_deployer_guide.md
docs/guides/iso_soc2_deployer_guide-tr.md
docs/usermanuals/en/operations/iso-soc2-deployer.md
docs/usermanuals/tr/operations/iso-soc2-deployer.md
docs/usermanuals/en/operations/supply-chain.md
docs/usermanuals/tr/operations/supply-chain.md
docs/qms/sop_change_management.md
docs/qms/sop_change_management-tr.md
tools/generate_sbom.py
Align SBOM content and reproducibility claims with the actual generator and CI environment.
  • Describe the SBOM as the runner’s installed-package pip list, including test tooling and Linux extras.
  • State that it contains no dependency graph or licence data.
  • Replace tag-only reproducibility claims with same-environment determinism and PyPI resolution caveats.
  • Direct deployers to generate an SBOM in their own training or serving environment.
docs/reference/supply_chain_security.md
docs/reference/supply_chain_security-tr.md
docs/guides/iso_soc2_deployer_guide.md
docs/guides/iso_soc2_deployer_guide-tr.md
docs/usermanuals/en/operations/iso-soc2-deployer.md
docs/usermanuals/tr/operations/iso-soc2-deployer.md
docs/usermanuals/en/operations/supply-chain.md
docs/usermanuals/tr/operations/supply-chain.md
docs/qms/sop_change_management.md
docs/qms/sop_change_management-tr.md
tools/generate_sbom.py
Update compliance mappings and vulnerability-scanning documentation to match supported evidence and current tooling behavior.
  • Remove claims that the SBOM provides licence extraction from ISO 27001, SOC 2, and applicability mappings.
  • Identify pip-audit’s default service as PyPI vulnerability data rather than OSV/GHSA.
  • Document that UNKNOWN-severity findings also cause pip-audit failure.
  • Mirror the documentation and compliance corrections in English and Turkish.
docs/reference/iso27001_control_mapping.md
docs/reference/iso27001_control_mapping-tr.md
docs/reference/soc2_trust_criteria_mapping.md
docs/reference/soc2_trust_criteria_mapping-tr.md
docs/qms/statement_of_applicability.md
docs/qms/statement_of_applicability-tr.md
docs/usermanuals/en/operations/supply-chain.md
docs/usermanuals/tr/operations/supply-chain.md
.github/workflows/nightly.yml
Record the documentation correction in project release notes.
  • Add an Unreleased changelog entry covering artifact location, retention, SBOM contents, reproducibility, compliance wording, and pip-audit behavior.
CHANGELOG.md

Possibly linked issues


Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@cemililik

Copy link
Copy Markdown
Collaborator Author

Superseded by #1000: the wave-0 fixes are combined by theme into five pull requests to cut the review load. This branch's commits are included there unchanged apart from the CHANGELOG.md merge; the branch stays on the remote.

@cemililik cemililik closed this Oct 18, 2026
cemililik added a commit that referenced this pull request Oct 18, 2026
… six-language site copy, described as the code behaves (#1000)

## Summary

Compliance- and privacy-facing wording corrected to what the code does,
plus the six-language site copy that repeated the same claims. Six
earlier branches combined into one pull request, replacing #983, #986,
#988 and #991 (to be closed as superseded) and two branches that were
never opened. **This is compliance wording; please read the before/after
tables.**

## ⚠️ Localization exception

`docs/standards/localization.md` keeps German, French, Spanish and
Chinese as deferred tiers and says not to machine-translate them. At the
owner's decision I **wrote the DE / FR / ES / ZH site strings myself**,
with no native review. English and Turkish are authoritative; the other
four need a native reader before they can be trusted. A follow-up issue
for that is drafted, not yet filed.

## Related issues

Refs #73, #99, #90, #94, #101, #87, #114, #75, #86, #89, #92, #98, #110,
#112. The code halves stay open: whether the gate should ever compare
trainer and approver, failing closed on a missing safety verdict
(breaking), attaching SBOMs to the release.

## Changes

| Theme | Said | Now says |
|---|---|---|
| **Segregation of duties** (ISO 27001 / SOC 2 mappings, SoA, SOP,
deployer guide, manual) | the approval gate "enforces trainer ≠
approver", "dual-controlled" | it **records** trainer and approver
identities and does not compare them; both are self-asserted; keeping
them different people is the deployer's control.
`require_human_approval` is not enforced for strict tiers by
`ConfigError` (it only is when safety evaluation is off) |
| **GDPR / KVKK manual page** | identifiable subjects are removed; "no
specific person's data is recoverable from the model"; an
`international_transfers` setting; audit report with source attribution
and SHA-256 manifest; retention "auto-deletes originals" | eight
identifier formats are masked, names and free text are not; the report
is counts and summaries, not written to the audit log; retention is
reported, not enforced; memorisation is not measured |
| **No-verdict safety evaluation** (8 documents + TR) | exit 0 ⇒ every
gate passed; classifier load failure halts the run; classification
errors count as unsafe | a safety evaluation that produced no verdict
(`evaluation_completed: false`) keeps the model and exits 0 (4 with the
approval gate) regardless of `auto_revert`; code unchanged |
| **SBOM** (reference, SOP, guides, manuals, mappings) | `gh release
download …`; "re-emit from the git tag"; "licence extraction in SBOM" |
workflow-run artifacts, 90-day retention; `gh run download`; the file is
the CI runner's `pip list` (test tooling included, no dependency graph,
no licences) |
| **Article 12 / 14** (audit-event catalogue, audit-log and
human-oversight pages) | the audit log is "mandated by Article 12"; the
gate "implements" Article 14 | the log is development-time evidence that
supports Annex IV; Article 12 logging and Article 14 in-use oversight
belong to the deployed system |
| **Site, six languages** | benchmark failure "fails (exit 3)";
"dual-controlled"; Slack/Teams/Discord; "PII redacted"; "satisfying the
access-request side of the GDPR"; wizard "Enforce automatic deletion";
"SHA-256 manifest"; DeepSpeed "presets" | exit 3 only with `auto_revert:
true`; records the approver; Slack-format, Teams and Discord need a
relay; common formats masked, names not detected; reverse-pii finds only
what is literally in the scanned files; retention mode reserved; SHA-256
sidecar; bring your own DeepSpeed JSON |

The site GGUF strings describe the `.sha256` sidecar, the retention
strings the reserved mode, and the DeepSpeed strings the preset caveat;
they match the GGUF, code and docs pull requests, so **merge those
first**. A new site test keeps the retired phrases out of English,
Turkish and the HTML (mutation-checked).

### What this changes for a deployer

A DPIA or audit response can no longer cite ForgeLM for: segregation of
duties being enforced, personal data being removed or unrecoverable from
the model, the SBOM being on the release page, or the audit log being
the Article 12 mechanism.

## Type

- [x] Documentation (and site copy)

## Testing

- The full `CLAUDE.md` gauntlet from a clean worktree of this branch:
exit 0. (An earlier run failed `tests/test_turkish_glossary_terms.py`
because the Article 12 rewrite wrote "Ek IV" instead of "Annex IV",
fixed here, then two timing-based regex linearity tests failed while two
gauntlets ran at once; they pass alone and in this final run.)
- `node --test tests/site/*.test.cjs`: 81 pass; English ↔ Turkish keys
in lockstep.

## Checklist

- [x] English and Turkish updated together (Turkish wording needs the
owner's review)
- [ ] DE / FR / ES / ZH reviewed by a native speaker — **not done**
- [x] CHANGELOG entries under `[Unreleased]`

🤖 Generated with [Claude Code](https://claude.com/claude-code)

---------

Co-authored-by: Claude Sonnet 5.5 <noreply@anthropic.com>
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.

1 participant