carlos / platform Public

spec: scanner host code review brief

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Paul Campbell pushed by claude agent, operated by paul@keymail.dev 092c5a858f9f06e8ed99858fd45d1ab7d7616480 parent a8e9f61
1 file changed, +59 −0
  • docs/superpowers/specs/CODEX-REVIEW-BRIEF-SCANNER-HOST-CODE.md +59 −0
diff --git a/docs/superpowers/specs/CODEX-REVIEW-BRIEF-SCANNER-HOST-CODE.md b/docs/superpowers/specs/CODEX-REVIEW-BRIEF-SCANNER-HOST-CODE.md
new file mode 100644
index 000000000..4e16c870c
--- /dev/null
+++ b/docs/superpowers/specs/CODEX-REVIEW-BRIEF-SCANNER-HOST-CODE.md
@@ -0,0 +1,59 @@
+# Review brief: scanner host, the code
+
+You are reviewing the implementation of an infrastructure spec you already
+reviewed six times as a design. Your output is a findings report, not an edit.
+Do not modify any file.
+
+## What to read
+
+1. The spec: `docs/superpowers/specs/2026-10-04-scanner-host-rollout-design.md`
+ (draft 6). Decisions D1-D8 in §2 are fixed owner rulings: report a mechanism
+ that fails one, do not re-argue one. Your earlier design findings are in
+ `CODEX-FINDINGS-SCANNER-HOST*.md` beside it.
+2. The plan: `docs/superpowers/plans/2026-10-05-scanner-host-rollout.md`.
+ Tasks 1-4 are what was built. Tasks 7 and 9-10 show how the module and its
+ outputs are used on real boxes.
+3. The code, as the branch's own changes against main. The merge-base is the
+ commit the branch started from; review `git diff <merge-base>..HEAD` for:
+ - `internal/clamd/clamd.go`, `clamd_test.go`
+ - `infra/modules/region-host/{main,variables}.tf`, `tests/store_scanning.tftest.hcl`
+ - `infra/modules/scanner-host/` (all of it: `main.tf`, `variables.tf`,
+ `outputs.tf`, `scanner-init.sh.tftpl`, `files/*`, `tests/*`, `README.md`)
+ - `docs/site/cli.md`, `infra/modules/README.md`, `infra/modules/region-host/README.md`
+ Ignore everything that arrived from main through the merge commit.
+4. Debian trixie's `clamav` 1.4.3 packaging and ClamAV 1.4.3 sources, as you
+ know them or can fetch them. Earlier rounds relied on `libclamav/unzip.c`,
+ `others.c`, `debian/usr.sbin.clamd`, `clamav-daemon.config.in`,
+ `clamav-daemon.postinst.in`, `clamav-daemon.service.in`.
+
+## What matters most
+
+- **The invariant** (spec §3.2): TCP 3310 is open only while a self-test has
+ passed against the clamd process running now. Trace the three units and the
+ clamd drop-in through: first boot, reboot, clamd crash and auto-restart,
+ explicit restart, a package upgrade (which now runs with
+ `clamav-daemon/debconf` false), a freshclam signature reload, a failed
+ self-test, and a direct restart of the self-test. Name any state in which the
+ port is open without a passed test, or never reopens after one.
+- **The first-boot script** (`scanner-init.sh.tftpl`): every failure path must
+ print `SCANNER-HOST FAILED: <reason>` and exit non-zero, and READY must never
+ print with the invariant unmet. Check `set -euo pipefail` and the ERR trap
+ (not inherited by functions), template escaping (`${...}` is templatefile),
+ the AppArmor local include and reload, the debconf freeze and its position
+ relative to the package's own `clamd.conf` generation, and the copied
+ `ExecStartPre` lines.
+- **The self-test**: can it pass while the property it guards fails?
+- **The Go change**: every consumer of `clamd.Status` after the change.
+- **IAM**: least privilege on both roles; the scanner role's Deny.
+- **Tests**: does each `tofu test` run and Go test pin what it claims?
+- **The docs**: anything an operator following the README or `cli.md` would
+ get wrong because the docs and the code disagree.
+- **The acceptance checks** in plan Task 7: could any pass on a box that is
+ actually wrong?
+
+## Output format
+
+Number findings from 13 (1-12 were the design rounds). For each: severity
+(P1 blocks applying this to a live deployment, P2 should fix first, P3 nice to
+have), file:line, what goes wrong concretely, and a fix. End with one line:
+accept, accept with fixes, or reject.