Skip to content

registry: classify socket-firewall-ci, the 48th control - #55

Merged
p4gs merged 1 commit into
mainfrom
feat/register-socket-firewall-ci
Sep 11, 2026
Merged

p4gs merged 1 commit into
mainfrom
feat/register-socket-firewall-ci

Conversation

@p4gs

@p4gs p4gs commented Sep 11, 2026

Copy link
Copy Markdown
Owner

Registers the control id that p4gs/sscs-bootstrapper#70 adds, and must merge first.

reclassify() and classOf() throw on an unclassified control id, and directory-scan.yml clones the tool's main at depth 1 with no release pinning in between. So the moment that control lands on the tool's main without this, every directory scan of every repository fails closed. The reverse ordering is harmless: rows drive the loop, so until the tool emits it this entry simply never appears.

Classified A′, phase 2, and the contrast with its sibling is the point

socket-firewall is class C because it probes the developer's own PATH, which no repository scan can observe. socket-firewall-ci reads committed workflow files, which is the definition of A′. Same defence, different evidence — so it is an additive control rather than a widening of the existing one, and only the CI half can ever count toward a grade.

Threat classes A3/A4/A5 rather than the sibling's A3/A4/A6: the CI control is about a hijacked build pipeline, not a compromised developer workstation.

The A′ methodology rule now names four controls instead of three. That is the "methodology entry" reclassify()'s own throw message demands before a new id may be scored, so it is required rather than cosmetic.

Counts

Both assertions (control-registry.test.ts, home.test.ts) and all nine prose counts move 47 → 48 together. The fixture was regenerated with refresh:controls, not hand-edited.

Verification

bunx tsc --noEmit clean, bun run build clean, bun test 450 pass / 0 fail — including the cross-repo parity case, which actually runs here (pointed at the tool branch carrying the control) rather than skipping as it did when the three phase-2 controls landed in #46.

Registers the control id the next sscsb release emits, ahead of it, because
`reclassify()` and `classOf()` THROW on an unclassified control id and
`directory-scan.yml` clones the tool's `main` at depth 1. The moment the
control lands there without this, every directory scan of every repository
fails closed. The reverse ordering is harmless: rows drive the loop, so
until the tool emits it the extra registry entry simply never appears.

Classified **A′, phase 2**, sitting beside its sibling — and the contrast is
the point. `socket-firewall` is class C because it probes the developer's
own PATH, which no repository scan can observe; `socket-firewall-ci` reads
COMMITTED workflow files, which is the definition of A′. Same defence,
different evidence, so it is an additive control rather than a widening of
the existing one, and only the CI half can ever count toward a grade.

Threat classes A3/A4/A5 rather than the sibling's A3/A4/A6: the CI control
is about a hijacked build pipeline, not a compromised developer workstation.

The A′ methodology rule now names four controls rather than three, which is
the "methodology entry" `reclassify()`'s own throw message demands before a
new id may be scored. Both count assertions and all nine prose counts move
47 → 48 together; the fixture is regenerated, not hand-edited.

Verified: `bunx tsc --noEmit` clean, `bun run build` clean, and `bun test`
450 pass / 0 fail — including the cross-repo parity case, which actually
RUNS here (pointed at the tool branch carrying the control) rather than
skipping as it did when the three phase-2 controls landed in #46.
@p4gs
p4gs merged commit f31e082 into main Sep 11, 2026
16 checks passed
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