Milestone M5: hardening

Four work packages, merged with two integration fixes (the superseded lameduck client dropped; the chart now runs kudurru lameduck in preStop and sets KUDURRU_SETTINGS_FILE). Decisions D106 to D118 in architecture.md record what changed.

PackageReportHeadline
Security reviewsecurity.md11 confirmed findings fixed with regression tests (4 medium: SSRF via list URLs, inherited credentials after account re-creation, proxy-keyed login lockouts, webhook on all interfaces); SECURITY.md
Security review, v0.1 roundsecurity-v0.1-round.md17 findings on the block page, unblock requests, allowlists, catalogue fetchers, entries APIs and the release pipeline, fixed with regression tests (3 medium: a branch shadowing the release tag, a signing identity matching any workflow, a quadratic entries PATCH)
Measurements, v0.1measurements-v0.1.mdIn Docker on 4 CPUs: 142k q/s cached, 72k mix, 40k all-forwarded with no loss; 82 µs at 10k q/s; ready in 0.4 s, a 1M-entry list enforced in 2.6 s; upgrade from the oldest data format 16/16; five bugs fixed (Docker volume permissions, query-log memory under unique-name floods, a stale auth cache entry, a record write race, Cloudflare DoT refusals); 72 h soak running
End-to-end and fuzzinge2e.mdBIND 9.18 secondary and primary interop, two-node internal listener, SIGTERM/restart/config/port resilience, fuzz CI; five bugs recorded as KnownBug skips
Server burn-downburndown-server.mdSettings hot reload, lameduck drain, kudurru.io/enabled, /internal/zones + serial metrics, refresh/purge routes, EndpointSlice leader lookup, doctor API, controller flakes fixed at the root
Edge, CLI, chart, releaseburndown-edge-release.mdChart flags that would have crash-looped edge pods fixed, generated aggregated ClusterRoles, self-hosted API docs, health --vrrp, CHANGELOG, release checklist, 0.1.0-rc.1

Open after M5 (docs/followups.md): the five e2e KnownBug rows (conditional forwarding bypassed by the root forward zone's hint, readiness before the first live snapshot, no lameduck window setting, keepalived path braces, a misleading key-generation log line), POST /auth/password not forwarded by the API, world-readable local.db/querylog.db, and everything that needs Docker, kind or two VMs.

Source: docs/m5/README.md