f8029eafa44d4b04e5a03bca7fbd8d6be4c3ee2f
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>
Description
No description provided
Languages
Python
100%