tocmo0nlord f8029eafa4 Step 7: citation gate (Gate 2) — fail-closed verification, filing block, research loop
familylaw.citation.verifier (AbstractModel): fail-CLOSED engine
- _verify_courtlistener (primary) + _verify_fallback (secondary) isolate the only
  network calls (mock points). FL coverage caveat documented.
- verify_citation(): only an affirmative found+good_law -> 'verified'; found+!good ->
  'rejected'; affirmative no-record -> 'not_found'; any source unavailable ->
  stays 'unverified' (FAIL CLOSED, never assume good). Records source/date/note,
  posts to chatter.

familylaw.citation: verification fields + action_verify (engine), attorney-only
action_attorney_verify (audited human attestation), action_reject.

familylaw.document — Gate 2 wired:
- unverified_citation_count; _ensure_citations_verified() raises listing bad cites
- action_mark_filed / action_mark_sent now enforce Gate 1 AND Gate 2
- action_request_filing validates both gates (staff-runnable); action_verify_citations
- Gate 2 banner + Verify Citations / Request Filing buttons on the form

familylaw.research.agent (AbstractModel): in-Odoo research loop (propose -> verify
each fail-closed -> synthesize). Memo born ai_draft; synthesis uses only verified
authority; unverified cites block filing. FastAPI orchestrator is the optional swap.

Tests (familylaw_step7, all externals mocked): verified only on found+good_law,
not_found/rejected paths, primary-down+fallback verifies, both-down fail-closed,
attorney attest (+permission), filing BLOCKED on unverified / allowed when all
verified / no-citations files, send blocked, unverified count, research loop
produces ai_draft + verifies, hallucinated cite -> not_found -> blocks filing.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-06-02 04:13:58 +00:00
Description
No description provided
3.2 MiB
Languages
Python 100%