Severity: Med · Proposed priority: P2 · Audit IDs: C24, C31, C32
CI has coverage and supply-chain gaps that let whole classes of bug ship green.
C24 — PSScriptAnalyzer covers 4 of ~12 production .ps1. .github/workflows/ci.yml:57 lints only setup-windows.ps1, knowledge-crystallize.ps1, obs-cli.ps1, profile.ps1. No analyzer anywhere for scripts/utils.ps1 (the Set-StrictMode library every .ps1 dot-sources), dotfiles-sync.ps1, install-dotf.ps1, vault-maintenance-weekly.ps1, windows/*.ps1, paths.ps1. The vault's own "ps1 must be ASCII / PSSA fails CI on non-ASCII" rule is therefore unenforced (em dashes already sit in setup-windows.ps1/install-dotf.ps1 comments). Overlaps POLISH-003.
C31 — Go config inputs escape Go CI. cli.yml:5 path-filters to cli/**. A breaking edit to env-contract.json, secrets/registry.yaml, session-start-config.json, harness/manifest.json, or versions.conf — all parsed by Go — does not trigger go test; only a post-merge runtime failure surfaces it. Add those paths to the filter.
C32 — every GitHub Action pinned by moving tag, none by SHA. checkout@v5, github-script@v9, release-please-action@v4, add-to-project@v1.0.2, goreleaser-action@v6, action-shellcheck@2.0.0. A compromised moving tag runs with BITACORA_PAT (repo+project write) or RELEASE_TOKEN (contents+PR write) — full write + release forgery. Pin to SHA (Dependabot keeps them fresh).
Also worth folding in: the lint job shellchecks only ./scripts + setup-linux.sh, so git-hooks/*.sh and git-hooks/lib/*.sh (the GUARD-001 guard scripts) are never linted; and there is no actionlint on the workflows.
Source: docs/audits/codebase-audit-2026-07-06.md (C24, C31, C32).
Severity: Med · Proposed priority: P2 · Audit IDs: C24, C31, C32
CI has coverage and supply-chain gaps that let whole classes of bug ship green.
C24 — PSScriptAnalyzer covers 4 of ~12 production
.ps1..github/workflows/ci.yml:57lints onlysetup-windows.ps1,knowledge-crystallize.ps1,obs-cli.ps1,profile.ps1. No analyzer anywhere forscripts/utils.ps1(theSet-StrictModelibrary every.ps1dot-sources),dotfiles-sync.ps1,install-dotf.ps1,vault-maintenance-weekly.ps1,windows/*.ps1,paths.ps1. The vault's own "ps1 must be ASCII / PSSA fails CI on non-ASCII" rule is therefore unenforced (em dashes already sit insetup-windows.ps1/install-dotf.ps1comments). Overlaps POLISH-003.C31 — Go config inputs escape Go CI.
cli.yml:5path-filters tocli/**. A breaking edit toenv-contract.json,secrets/registry.yaml,session-start-config.json,harness/manifest.json, orversions.conf— all parsed by Go — does not triggergo test; only a post-merge runtime failure surfaces it. Add those paths to the filter.C32 — every GitHub Action pinned by moving tag, none by SHA.
checkout@v5,github-script@v9,release-please-action@v4,add-to-project@v1.0.2,goreleaser-action@v6,action-shellcheck@2.0.0. A compromised moving tag runs withBITACORA_PAT(repo+project write) orRELEASE_TOKEN(contents+PR write) — full write + release forgery. Pin to SHA (Dependabot keeps them fresh).Also worth folding in: the
lintjob shellchecks only./scripts+setup-linux.sh, sogit-hooks/*.shandgit-hooks/lib/*.sh(the GUARD-001 guard scripts) are never linted; and there is noactionlinton the workflows.Source:
docs/audits/codebase-audit-2026-07-06.md(C24, C31, C32).