ship: v0.2 P5 final review + milestone ship #14

Merged
coreci-bot merged 2 commits from phase/05-final-review-ship into milestone/v0.2-mvp 2026-09-29 14:31:07 +00:00

2 Commits

Author SHA1 Message Date
coreci 5f677bf3f6 docs(P05): audit fixes + P5 final-phase plan — traceability un-staled, review/audit recorded
---ci---
phase: 5
milestone: v0.2
status: execute
persona: ci-lead-developer
task: audit-fixes
requirements:
  covered: []
  partial: []
message: >-
  Audit PASS-WITH-NOTES; both critical notes fixed: REQUIREMENTS.md
  traceability rows for P2/P3/P4 now complete (the P2/P3 ship
  blocks claimed traceability updates that never landed - the
  audit caught the false statements); PLAN.md rewritten as the P5
  final-phase plan (review 4 P0 + 15 P1 findings, audit verdict,
  ship v0.2.5, owner-gate halt). Notes fixed: ROADMAP P5 status;
  security-engineer persona deactivated per its removal policy.
  Acknowledged notes: G-005 schema-drift check not wired into a
  gate (openapi.json snapshot discipline is manual); squash-merge
  commits carry no ---ci--- blocks per the documented v0.1
  convention (docs-commit pairing).
---/ci---
2026-09-29 14:29:48 +00:00
coreci cc2ce57ca5 fix(P05): review P0/P1 fixes — real quote anchoring, cited-only gate, zombie-run armor, fetch SSRF, probe wiring
---ci---
phase: 5
milestone: v0.2
status: execute
persona: backend-engineer
task: review-P0s
requirements:
  covered: [REQ-20, REQ-23, REQ-32]
---/ci---

Final review found the milestone's two flagship trust
guarantees unenforced - both now attack-proven:

A1 (P0): quote anchoring was tautological end-to-end - the
report's [p-N] markers returned the STORED passage's own quote to
the anchorer (always ratio 1.0). extract_report_claims now takes
the WRITER's text adjacent to each marker (header-stripped
fragment) and anchors THAT against the cited passage; fabricated
quotes riding real passage IDs now flag unanchored and FAIL the
export gate (attack test added; verbatim-quote anchor test added).

C2 (P0): the REQ-23 gate had the wrong denominator - liveness
probed cited URLs but the ledger counted ALL visited pages,
defaulting unprobed to dead (deep-report runs failed their own
gate). Ledger entries now cover cited URLs only; ratio and
citations_checked are cited-page-scoped.

C1 (P0): zombie runs - planner JSON of the wrong shape, searching-
step network errors, and EngineError escaped without FAILED
persist or run_error. Plan parsing validates shape (dict of
lists of str); run() has a catch-all -> FAILED + run_error.

S1 (P0): fetch adapters followed redirects with no re-guarding -
a search result 302ing to 169.254.169.254 became evidence. Both
adapters now hop manually with per-hop url_allowed + a 5-hop cap
(attack test added).

P1s: approve-with-plan over HTTP (422 on bad plan, REQ-14's
'edited' half); FAILED distinct from cancelled; question/context
length caps; probe wired into create_run for probe-capable
adapters + surfaced in /api/config (M6); README live-mode env
var corrected to NEXT_PUBLIC_ (M3) + honest fake-adapter note
(M5). 129 backend (14 adversarial) + 97 frontend green.
2026-09-29 14:17:33 +00:00