epic: craig-intake interface — total test-coverage + hardening (2026-06-28 audit)
## Summary Total test-coverage + accessibility hardening of the **craig-intake** public report interface (both backend profiles none/cases + shines, both deploy modes integrated + standalone), driven by the 2026-06-28 coverage audit — a 14-agent verification workflow over happy / sad / evil / chaos / accessibility. The audit confirmed **76 gaps** (51 real + 12 partial + 13 cross-cutting), of which **21 are shipping product defects** (not just missing tests). Children below: dimension-scoped `test:` issues for the coverage backlog + `fix:` issues for the confirmed defects. The two seed findings — the dark-mode/header a11y gap and the SHINES unsatisfiable alleged-maltreater field (#743) — are folded in. **Plan:** [intake-coverage-hardening](https://gitlab.com/gadhs/application/ccwis/craig/-/blob/main/docs/modules/ROOT/pages/plans/intake-coverage-hardening.adoc) (committed to main, nav-linked under Plans -> Planned). _Method: surface+test inventory -> per-dimension gap analysis -> adversarial verification of every gap -> completeness critic. Each child issue carries its verified gap IDs + evidence._ ## Children ### Fixes (confirmed product defects) - [x] #747 fix: revoked/expired signer key keeps verifying ~60s — SignerAuthClient positive cache (weight: 3) — ✓ Done (!841) - [x] #748 fix: edge UI accessibility defects — contrast / focus / live-regions / target-size / forced-colors (weight: 5) - [x] #749 fix: enforce + prove free-text sanitization reaches the forwarded SHINES CpsRequest (weight: 3) — ✓ Done (!845; test-only, no code gap) - [x] #750 fix: input-integrity hardening — deny_unknown_fields / byte-vs-char / admin_unit / silent fallbacks / attachment+JWK (weight: 3) — ✓ Done (!843 + !844) - [x] #743 fix: SHINES adult silent-drop / unsatisfiable family — maltreater + relationship_to_child + signed-path 400 (weight: 5) — ✓ Done (!842) ### Tests (coverage backlog) - [x] #751 test: happy-path forwarding coverage — assert the forwarded cases/SHINES body (weight: 5) - [x] #752 test: sad-path validation coverage at the HTTP edge (weight: 3) — ✓ Done (!849) - [x] #753 test: evil/security coverage — corpus on signed/partner, rate-limit, CAPTCHA, CORS, body-limit, keyring, PII-in-logs (weight: 5) — ✓ Done (3-MR program !850/!853/!854; corpus surfaced #905 + #906) - [x] #754 test: chaos/fault-injection coverage — cases sink, keyring outage, signed replay, attachment faults, concurrency (weight: 8) — ✓ Done (4-MR program !856/!857/!858/!859; CHAOS-04 surfaced info-leak → #933) - [x] #755 test: accessibility audit coverage — dark + high-contrast + forced-colors, all states, WCAG 2.2 tags, incomplete, integrated (weight: 5) - [x] #756 test: cross-cutting coverage — keyring sidecar, OpenAPI drift, i18n negotiation, browser crypto, visual regression (weight: 5) --- ## Plan status **Plan merged to `main`** in MR !841 (merge `7db61b4a24b311faf0346fed8aad1471605bc13a`), bundled with Step 1 (#747) per the carrier-branch design. `main` now carries the corrected (two-review-round) plan; the temporary `feature/intake-coverage-hardening-plan-revise` carrier branch has served its purpose. ### Progress - **Step 1 (#747)** — ✓ Done (2026-06-28), MR !841. Split the signer-key cache into a 5s positive / 60s negative TTL; ADR-045 records the decision; deferred full evict-on-revoke → #892. Also adopted pre-push hook v2026.9 (#893, a forced push prerequisite). - **Step 5 (#743)** — ✓ Done (2026-06-28), MR !842. SHINES alleged-maltreater path made satisfiable (maltreater_relationship_to_victim rendered+keyed under SHINES, not forwarded to CpsRequest — gated on #691); relationship_to_child silent-drop closed (gated out of SHINES); SAD-13 signed-path 400 test; ADR-042 amendment. Also adopted pre-commit hook v2026.8 (#899). - **Step 4 (#750)** — ✓ Done (2026-06-28), **MR !843** (merge e0a350d7 — the coupled DTO/validation refactor: profile-aware unknown-field rejection + jurisdiction-parameterized admin_unit allowlist + SDK lock-step; None now rejects SHINES keys, superseding ADR-042 §D3) + **MR !844** (merge 35ca852c — SAD-06 char min-length, CHAOS-11 loud forwards, EVIL-07 attachment filename, EVIL-08 keyring JWK validation, COMP-09 kiosk reset). Recorded in ADR-042 #750 amendment B1–B4. Deferred: craig-security register-JWK parity → #900. - **Step 3 (#749)** — ✓ Done (2026-06-28), **MR !845** (merge 585ae813). EVIL-03: end-to-end proof that free-text sanitization reaches the forwarded SHINES CpsRequest. Outcome was **test-only — no code gap** (the sanitize→merge→mapper→forward path was traced sound on both public + signed paths). Public-path content oracle via the #713 debug panel + a signed-path injection smoke. Bundled the pre-push v2026.10 hook chore (#901). ### Next Steps 1 (#747), 5 (#743), 4 (#750), 3 (#749), 2+10 (#748 + #755, one a11y MR !846), 6 (#751, MR !848), and 7 (#752, MR !849) are done. **#753 done** (3-MR program: !850, !853, !854; the corpus surfaced 2 product 500s fixed first in #905 + #906). **#754 done** (4-MR program: !856, !857, !858, !859; CHAOS-04 surfaced a verbatim upstream-error relay info-leak → #933). **#756 done** (5-MR program: !861, !862, !863, !864, !866; MR-5 surfaced + fixed a latent browser-keygen JWK defect (#936)). **All 11 children done — epic complete (2026-06-30).** Per-step blocker resolutions are in the issue notes (#755 names the integrated-edge URL env var). The plan's own per-step Status cells are advanced within each step's MR (battery-efficient multi-MR cadence).
epic