Tracking the rollout of object-storage virus scanning to carloku.com, then Tito.
Where things are. The scanner code has been live in both consoles since v0.18.0, but neither deployment has a clamd to talk to, read/tag permission on store objects, or a scan tag key. This branch adds what is missing:
infra/modules/scanner-host: a clamd box in the home region, reachable on 3310 from the console's security group only. The port is open only while a self-test has passed against the clamd process running now (spec §3.2).region-host: store_scanning, the console's opt-in GetObject/GetObjectTagging/PutObjectTagging grant.internal/clamd: Heuristics.Limits.Exceeded.* is recorded as unscanned (MaxScanTime as failed, so it is retried), never infected or clean.
Spec: docs/superpowers/specs/2026-10-04-scanner-host-rollout-design.md (draft 6, rulings D1-D8 in §2). Plan: docs/superpowers/plans/2026-10-05-scanner-host-rollout.md (13 tasks). Branch: worktree-scanner-host
Measured, not assumed: with ClamAV's packaged limits, a zip member that expands past MaxFileSize is trimmed and the trimmed copy is answered OK, with no limit raised (spec §3.4 has the table from a real clamd 1.4.3). The module sets MaxFileSize = MaxScanSize = 100M and AlertExceedsMax yes, and the box re-proves it at every clamd start.
Paul's decisions (2026-10-05): clamd on its own box, home region only; plain TCP inside the VPC fenced by security group; Carloku first; both pieces as platform modules; a partly scanned object with no signature match is unscanned, a real match stays infected. Tonight stops before the v0.23.0 release: nothing is applied to any deployment yet.
Follow-ups, not in this rollout:
- zip64 and encrypted archive members are not opened by clamd at all, so a clean verdict never covers them. Say so in the
scan request disclosure (copy review), and consider AlertEncrypted yes mapped to unscanned. - A configurable scan limit would need the self-test's fixtures derived from it.
- Raising limits later does not re-scan objects already recorded skipped.
- Log clamd's raw reply when a scan is recorded failed, so a
MaxScanTime object can be told from a broken engine.
Progress and the remaining live steps (release, Carloku apply and box acceptance checks, console roll, key, wiring, enable, proof; then Tito) will be posted here.