Caught and fixed by running an actual install on a throwaway DB:
- Strip 29 # comment lines from ir.model.access.csv (Odoo CSV loader treats
them as malformed rows → IndexError); 79 data rows preserved
- Remove obsolete ir.cron.numbercall field (removed in Odoo 17+) from 4 cron
records in fl_deadline_rules.xml
- Rename <tree>→<list> across 26 sites; inside x2many inline views Odoo 18 no
longer recognizes <tree>, which made it fall back to the outer model and
reject inner fields ("Field 'partner_id' does not exist in model 'fl.case'")
- Add store=True to non-stored computed fields referenced by search filters,
which Odoo 18 now rejects as unsearchable:
- fl.case: overdue_deadline_count, next_deadline_label
- fl.deposition: notice_valid
Module loads cleanly: 31 fl.* models registered, no errors.
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- Convert all 124 attrs="{...}" across 13 view files to direct Odoo 17/18
attributes (invisible/readonly/required with Python expressions); prefix-domain
OR/AND/NOT and operators handled (e.g. "(is_overdue or days_until_due > 7) and completed")
- Fix pre-existing XML errors that blocked module load on any version:
- Replace invalid HTML entity with   in 4 files (reports + portal)
- Merge duplicate style= attributes (3 spots in website_intake_templates)
- Replace 3 illegal <t t-if> embedded in class="" attributes with t-attf-class
- All 44 module XML files now parse clean
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
- fl.attorney.agent (AbstractModel): manual-only substantive analysis fired from
the case AI tab. Builds a full case context (parties, children, financials,
issue tags, prior analyses) plus candidate statute/caselaw lists, and asks
Claude to author a strategy memo, draft arguments/counterarguments, write a
risk narrative, and assess substantial change (FL 61.30(1)(b))
- Grounds output in the real library: the model may only pick statutes/case law
from the supplied candidates, which are then resolved back to records and
linked (fl.analysis.cited_statute_ids / matched_caselaw_ids, case.caselaw_ids)
- Rule-based fallback produces a usable memo (complexity, statutes by category,
caselaw by tag, risk flags) when the API is unavailable — never a raw error
- fl.analysis: add analysis_type, strategy_memo (Html), risk_narrative,
cited_statute_ids; surface them in the analysis views
- fl.case: add attorney_memo_id + related memo/risk display; action_run_attorney_agent
opens the memo; "Generate Attorney Strategy Memo" button on the AI tab (admin)
- Refactor fl_ai_engine: extract shared call_claude_json(system, user) +
_extract_json so both agents and the engine share one Claude/JSON path
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>