fix(hull): scanner-registry cleanup — closes #30 - #40
Conversation
Four deferred #27-review items: document trufflehog's manual bump path (item 1), regenerate all three hull goldens from sync_action_pins (item 2), move the advisory + license-free remedy into ScannerSpec (item 3), and copy scan_with like env (item 4). No rendered output changes. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0119qj5F9NnGhQCxHehLy99E
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…30) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0119qj5F9NnGhQCxHehLy99E
…30) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0119qj5F9NnGhQCxHehLy99E
submtd
left a comment
There was a problem hiding this comment.
Self-review (author) — satisfies keel's reviewPolicy: review gate.
Four independent hull cleanup items closing #30. The opus whole-branch review returned zero findings and independently proved the two subtle risks: the derived license-free remedy can never offer the already-selected scanner (the org blocker only fires for a license-gated scanner), and the sync-script guard _on_disk - set(map) is the direction that catches an unmapped golden; all three sync-map configs reproduce the committed goldens byte-for-byte.
No rendered change: the three hull goldens are byte-for-byte identical across the whole branch. Tests 1436 to 1441 (5 new, TDD; the mutation guard and the source-scan are real drivers). Engine purity, the #33 round-trip contract, and least-privilege permissions unchanged; 'trufflehog' no longer appears in scaffold.py. Changelog Fixed entry accurate.
Ready to land.
Closes #30 — four deferred items from the #27 review, each an independent fix to
hullor its tooling. No rendered workflow changes (all three hull goldens byte-identical); whole-branch review returned zero findings.The four items
trufflehog's un-bumpable pin is now documented (item 1). Dependabot only bumps action refs that appear in this repo's committed workflows, and shipyard's own
security.ymluses gitleaks by design — so trufflehog is shipped to consumers but never dogfooded here and never auto-bumped. The README now carries a trufflehog row in the action-pin table and names the manual path (editscanners.py, runsync_action_pins.py). Documented rather than automated — a scheduled checker is more machinery than one pin warrants.sync_action_pins.pyregenerates all three hull goldens (item 2), not justsecurity.yml. All three embed theactions/checkoutSHA, so the next checkout bump would have left two stale with no script support. Now a filename→config map renders each, andassert not (_on_disk - set(map))fails loudly if a new golden appears with no mapping — the exact bug, guarded.Two per-scanner facts moved into
ScannerSpec(item 3). A newadvisoryfield carries trufflehog's BASE==HEAD caveat (moved verbatim), and the org-blocker's license-free remedy is derived from the registry (scanners whose license_env is None) instead of the literal"trufflehog". Register a third scanner and it gets an advisory channel and is offered as a remedy automatically."trufflehog"no longer appears anywhere inscaffold.py.The scan step copies
scan_withbefore rendering (item 4), matching how it already copiesenv— closing a latent asymmetry where mutating a built plan could corrupt the shared registry entry process-wide.Verification
This is the last open issue.
🤖 Generated with Claude Code