docs(security): move the built gitleaks and SBOM jobs out of "Planned CI additions" (BACKLOG #1485) - #982
Conversation
… CI additions" (BACKLOG #1485) docs/SECURITY.md's supply-chain section listed both as planned work. Both are built: security.yml's `gitleaks` job is named `gitleaks (secret scan)`, which is a required context, and the `sbom` job builds three CycloneDX bills of materials. The same two bullets carried three further stale claims. They said the scan was kept in CI "rather than a per-author pre-commit hook" while .pre-commit-config.yaml pins one at v8.18.4; they described the scan as covering the full git history, which BACKLOG #1479 changed; and the list they sat under called pip-audit and bandit advisory when both are blocking and required. The section also told the reader to enable CodeQL through GitHub Advanced Security, which this public repository does not need. The new text states the scan's scope nowhere. It names the step that holds it and stops, because a second copy of that fact is what went false (SDS-3.5). tests/test_cutover_slug_rot.py's triage taxonomy cited the removed GHAS sentence by name, so it is updated in the same change rather than left pointing at a line that no longer exists. Not taken here: docs/Secure_Build_Scorecard_MEFOR.md says "gitleaks full-history" three times, one of them evidence for a graded signal. That file is a dated scoring snapshot whose re-score is an owner act, so #1485 names the three lines for whoever re-signs it. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Ledger tail adjacency, measured — for whoever sequences theseThree open PRs append to the tail of
981 and this PR conflict with each other. Identical start line and context. 976 does not conflict with either of us today. Its merge-base is The resolution is verified, not assumedKeep both items in number order. Built that resolution and ran the gate on it:
OrderI have no claim to going first. 981 is the older PR and touches one file; this one touches three, so it carries more surface to go red. Land 981 first and I will rebase. Not rebasing pre-emptively: nothing has landed to rebase onto, and a push would discard the CI runs queued on this head. |
|
This pull request is green and nobody has marked it read. Every check that has reported is passing and the To clear it, IN THIS ORDER:
DO NOT TRIAGE THIS FROM A seat can find every pull request in this state in one call: Adding The |
# Conflicts: # docs/BACKLOG.md
|
This pull request is green and nobody has marked it read. Every check that has reported is passing and the To clear it, IN THIS ORDER:
DO NOT TRIAGE THIS FROM A seat can find every pull request in this state in one call: Adding The |
What
docs/SECURITY.md's "Supply-chain & CI security" section listed the gitleaks secret scan and the CycloneDX SBOM build under Planned CI additions. Both are built. Files BACKLOG #1485 and fixes it in the same PR.Verified against the tree at
4c68c28eb(origin/main's tip in the same run)security.yml'ssbomjob builds CycloneDX SBOMs for the engine and the VS Code extension, scores them withsbomqs, uploads them;trivyadds the container image. ADR 0149,docs/SUPPLY-CHAIN.md.security.ymljobgitleaks,name: gitleaks (secret scan)-- that exact string is in.github/required-contexts.txt..pre-commit-config.yamlpinsrepo: https://github.com/gitleaks/gitleaks,rev: v8.18.4, hook idgitleaks. Both exist.--log-opts HEAD(merged asa1f3232a1).BLOCKING, neither declarescontinue-on-error, and both context strings are required.One more, in the sentence directly above the block: it told the reader to enable CodeQL through GitHub Advanced Security "on a private repo".
codeql.ymlhas run here for a long time and this repository is public, so no licence is involved.security.yml's own header already records that correction.The scope wording
The new text states the scan's scope nowhere. It names the step that holds it (Scan the ref under test for secrets) and stops. A second copy of that fact is exactly what went false last time, and the job-level comment in
security.ymlsays in terms that the scope must not be restated (SDS-3.5).Two things worth a reviewer's attention
tests/test_cutover_slug_rot.pyis touched. Its triage taxonomy cited the removed GHAS sentence by name as a KEEP example. The docstring now records the retirement instead of pointing at a line that no longer exists. No logic changed. The ratchet count falls 39 to 38 against a ceiling of 41;test_the_ratchet_is_not_slackallows 8 slack, so the ceiling is deliberately left alone.docs/Secure_Build_Scorecard_MEFOR.mdis deliberately NOT touched. It says "gitleaks full-history" at lines 31, 58 and 93, one of them the evidence for signal 5 graded Built -- Strong, so that evidence is now overstated by exactly the scope #1479 removed. That file is a dated scoring snapshot ("Scored 2026-07-14") whose own convention is that re-scoring is an owner act. #1485 names the three lines for whoever re-signs it.Checks run
pre-commit run --fileson all three changed files: every hook passed (ledger gate, forbidden-content, gitleaks, ruff).ruff check,ruff format --check,mypyontests/test_cutover_slug_rot.py: clean.pyteston the tests that read these files --test_cutover_slug_rot,test_backlog_status_check,test_required_contexts,test_merge_gate_controls,test_docs_security_pathways,test_adaptive_attributes_doc_drift,test_security_posture,test_docs_cite_no_refused_config_keys: 413 passed.scripts/docs/backlog_status_check.py,backlog_citation_check.py,link_check.py: OK.windows-service-smokeamong them). Read those in CI.🤖 Generated with Claude Code