Severity: P3 (latent / low-reachability / hardening)
Batched tracking issue for 29 confirmed P3 findings from the 2026-06 engineering review (docs/ENGINEERING-REVIEW-2026-06.md). Each is real but low-impact.
✅ Resolved (verified in current code as of v0.7.2)
The security-relevant subset is done — live XSS test (4 attack vectors: comment text, comment id, author login, avatar_url) all neutralized in a real browser; corrupt-KV resilience covered by test/p3-hardening.test.js (14 assertions).
🔄 Superseded by #34 (Durable Object migration)
Comments now live in input-gated DO state.storage (not KV), so the KV-race-adjacent items are structurally changed:
☐ Still open (genuinely cosmetic / low-priority)
Updated 2026-06 after v0.6/v0.7 hardening + #34 DO migration. Remaining items are cosmetic/maintainability or negligible-reachability; pick off as backlog.
Severity: P3 (latent / low-reachability / hardening)
Batched tracking issue for 29 confirmed P3 findings from the 2026-06 engineering review (
docs/ENGINEERING-REVIEW-2026-06.md). Each is real but low-impact.✅ Resolved (verified in current code as of v0.7.2)
The security-relevant subset is done — live XSS test (4 attack vectors: comment text, comment id, author login, avatar_url) all neutralized in a real browser; corrupt-KV resilience covered by
test/p3-hardening.test.js(14 assertions).escapeHtml(identity.avatar_url || '')(overlay.js:763). Same for the identity chip.escapeHtml(author.avatar_url)(overlay.js:1142).escapeHtml(worker.js:671/672/692), not barereplace(/</).safeParseList()(try/catch →[]); a corrupt value self-heals instead of bricking the slug.safeParseListreturns[]for non-array JSON.debug(env, ...); raw production logging removed.escapeHtml.🔄 Superseded by #34 (Durable Object migration)
Comments now live in input-gated DO
state.storage(not KV), so the KV-race-adjacent items are structurally changed:transaction(); concurrent toggles no longer interleave.☐ Still open (genuinely cosmetic / low-priority)
r.ok/401 handling on reaction paths)c_${Date.now()}no entropy — single-user localhost, negligible!==on TDOC_UPLOAD_TOKEN — worker.js:1102 (256-bit secret over RTT; not practically exploitable)status==='resolved'filter — model never emits 'resolved' (worker.js + overlay.js)Updated 2026-06 after v0.6/v0.7 hardening + #34 DO migration. Remaining items are cosmetic/maintainability or negligible-reachability; pick off as backlog.