Commit 16e045d
fix(security): upgrade secret scanning from retired trufflehog to gitleaks (#49)
**This repo's only leak scanning was an inline trufflehog job** — and
trufflehog was retired estate-wide. The standards secret-scanner
reusable records the ruling in its own header:
> *"Trufflehog was removed as redundant; gitleaks catches what we need"*
> *"Trufflehog removed: gitleaks provides sufficient coverage at lower
cost."*
## This is an upgrade, not a removal — and that distinction is the point
A sweep is currently deleting leftover trufflehog steps across the
estate. **This repo was deliberately excluded from it.** With no other
scanner present, deleting would have left it with **no secret scanning
at all**.
Estate-wide measurement, all 424 repos (364 have workflows):
| | count | treatment |
|---|---:|---|
| gitleaks only | 170 (47%) | left alone |
| trufflehog **and** gitleaks | 73 (20%) | straggler deleted |
| **trufflehog only** | **33 (9%)** | **this PR — upgraded** |
| neither | 88 (24%) | still open |
## What actually changes
- **gitleaks over the whole working tree** with `--no-git`, exiting
non-zero on a finding. The inline job scanned a `base..head` diff —
narrower than the tree.
- The reusable's **`rust-secrets` and `shell-secrets`** jobs come along
with it, so the local `rust-secrets` grep is no longer needed
separately.
- A **pinned, checksum-verified gitleaks binary** rather than an action
that injects one.
## Two details that would fail silently if omitted
**`secrets: inherit` is required**, and is included. Without it the
gitleaks action's inner `secrets.GITHUB_TOKEN` is empty and the scan
**silently degrades** — a quiet failure of exactly the kind this
campaign exists to remove.
**Where an `actions.lock` exists it gains a hand-authored `[]` entry**
for this file. `gh actions-lock` **skips reusable-workflow callers**,
and without the entry the workflow is rejected as `startup_failure` with
no log and no check run — which reads as "the change broke CI" rather
than "a lockfile entry is missing".
## No context is stranded
The workflow's `name:` is preserved verbatim. Job-level context names
*do* change, since they now come from the reusable — this repo's
rulesets were checked first and require no secret-scanning context, so
nothing is left pointing at a string that will never report.
Found during the 2026-08-05 estate CI/CD census.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
Signed-off-by: Jonathan D.A. Jewell <6759885+hyperpolymath@users.noreply.github.com>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>1 parent da663b6 commit 16e045d
1 file changed
Lines changed: 12 additions & 55 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
1 | 1 | | |
2 | | - | |
3 | | - | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
4 | 10 | | |
5 | 11 | | |
6 | 12 | | |
7 | | - | |
8 | | - | |
9 | | - | |
10 | | - | |
11 | | - | |
| 13 | + | |
12 | 14 | | |
13 | 15 | | |
14 | 16 | | |
15 | 17 | | |
16 | | - | |
17 | 18 | | |
18 | 19 | | |
19 | | - | |
20 | | - | |
21 | | - | |
22 | | - | |
23 | | - | |
24 | | - | |
25 | | - | |
26 | | - | |
27 | | - | |
28 | | - | |
29 | | - | |
30 | | - | |
31 | | - | |
32 | | - | |
33 | | - | |
34 | | - | |
35 | | - | |
36 | | - | |
37 | | - | |
38 | | - | |
39 | | - | |
40 | | - | |
41 | | - | |
42 | | - | |
43 | | - | |
44 | | - | |
45 | | - | |
46 | | - | |
47 | | - | |
48 | | - | |
49 | | - | |
50 | | - | |
51 | | - | |
52 | | - | |
53 | | - | |
54 | | - | |
55 | | - | |
56 | | - | |
57 | | - | |
58 | | - | |
59 | | - | |
60 | | - | |
61 | | - | |
62 | | - | |
63 | | - | |
64 | | - | |
65 | | - | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
0 commit comments