Releases: tuanle96/odoo-ai-skills
Release list
v0.16.0 — valuation repair + OWL scroll safety
Highlights
- New odoo-valuation-repair skill — a DRY-RUN-first, fail-closed playbook for diagnosing, repairing, and preventing AVCO/FIFO inventory valuation drift.
- Safer OWL client actions — documents the native scroll containment contract: the client-action root owns height: 100% and overflow-y: auto; do not patch body or .o_action_manager.
- 25-skill public surface — Claude Code and Codex manifests, changelog, skill count, test count, and landing-page footer are aligned to 0.16.0.
Verification
- Python 3.12 compile gate: passed
- CI-equivalent introspection suite: 86 passed
- Full standalone suite: 1162 passed, 4 skipped, 101 subtests passed
- odoo-owl skill validation: passed
- JSON manifests and whitespace checks: passed
The Odoo-runtime example test is intentionally outside the standalone gate because it imports the odoo package.
v0.15.0 — statutory reports + Vietnam accounting + worktree workflow
Three battle-tested additions distilled from a real statutory-reporting engagement (full Vietnamese TT99 financial-statement set built and verified on a production clone), plus the 18→19 fleet-migration hardening accumulated since 0.14.0. The suite is now 24 skills.
New skill: odoo-statutory-reports
Dynamic financial statements via the account.report engine (Enterprise account_reports):
- line/expression anatomy, engine table,
sum/-sumsign convention date_scopesemantics (strict_range/from_beginning/to_beginning_of_period)- the full custom-engine contract (
_report_custom_engine_*full-name formula,custom_handler_model_id, the{'result': …}return key,_get_report_query) - self-verifying statutory design: catch-all lines = 0, balance identities, reconciliation pairs, suspense visibility, prefix-overlap audit
- regime versioning, the render-test ritual (date must go INTO
get_options()), xlsxwriter data-pack escape hatch
New country playbook: vietnam-accounting (in odoo-domain-playbooks)
Vietnamese accounting compliance verified 07/2026 (with re-verify instruction): TT200→TT99/2025 regime switch with chart + statement deltas (B01/B02/B03/B09), the sổ-kế-toán "quy chế mapping appendix" pattern, the tax calendar (e-invoice NĐ254/TT91, VAT 8% to 31/12/2026, CIT Luật 67/2025, audit NĐ90/2025), l10n_vn* coverage map, and design decisions that survived a real client.
New skill: odoo-worktree
Isolated feature development on a LIVE Odoo dev environment: the container runs the main tree's uncommitted files while a git worktree holds a clean branch cut from production; path-scoped sync only, idempotent post_init_hook adopt-vs-create packaging, and the mandatory clean-install test ritual.
odoo-upgrade fleet hardening
Batch --modules-file verify with load parity, source_sweep.py checklist scanner, anchor_check.py offline view-anchor validator, preflight.py deterministic transforms, references/field-notes-18-19.md (27 verified breakage→fix entries), production scoping (--installed-file, --exclude with dependent closure) — dogfooded on a real 89-module production migration.
Full details in CHANGELOG.md.
v0.14.0 — the local-first evidence layer
The strategy pivot from "a suite of Odoo skills" to the local-first evidence
layer for AI-assisted Odoo delivery. Public architecture is now four stages —
Inspect → Verify → Gate → Report — and the internal "Layer A…L" labels are
retired from user-facing prose (they live on only in changelog cross-references).
The trust language is corrected throughout: this is a CI-bound evidence gate
with an explicit trust boundary, not an "unfakeable" one — CI produces and binds
the evidence; human review stays mandatory for sensitive domains.
Added
- Fast Inspect: context primitives (
facts).facts.pyemits small instance
facts for agent context —--kind model|security|views|flowsfor one model —
so an agent reads ground truth before it edits, not an exhaustive dump. Every
payload carries aninstance_fingerprint(db uuid, module-graph hash, installed
count). - Snapshot cache (
cache).snapshot_cache.pyis a content-addressed cache
(keyed by db uuid + module graph + addon file fingerprint + context) so warm
context is fast inside the agent loop. Invariant: warm/stale cache accelerates
analysis but never approves a merge — only cold runs are merge-eligible, and the
provenance rides on every payload (_cache.provenance,_cache.merge_eligible). - Instance Dossier (
dossier,dossier-report). The one-command, read-only
takeover / pre-sales due-diligence artifact: installed modules (standard/OCA/custom),
Studio footprint, custom fields, server/automated/scheduled actions, security
(groups + record rules, multi-company flags), custom view overrides, data volumes,
and derived upgrade-risk flags. Redacted by default (--redact external, safe
to share;localkeeps sensitive-model schema names on a trusted box). Renders to a
self-contained HTML report. - MCP context server (
mcp).mcp_server.pyis a bounded, read-only MCP stdio
server exposing six fact tools (odoo_facts_model/security/views/flows,
odoo_dossier_summary,odoo_native_check) — validated inputs, no arbitrary
RPC or code execution, redaction always applied, cache provenance on every
response.claude mcp add odoo-context -- python3 …/mcp_server.py --db <DB>. - Evidence Artifact v1 (
evidence-artifact).evidence_schema.py— a stable,
public, machine-validatable schema (build/validate) for the evidence a partner
shows a client: git binding, instance fingerprint, per-check severity + cache
provenance, decision, human sign-offs, redaction status. Encodes the invariant that
awarm-cache check can never back anapprove. Seedocs/evidence-artifact.md. - Severity classes + fail-closed policy in the Gate.
deploy_gate.pynow
classifies every finding S0–S4 (S4 = security / multi-company / silent corruption),
emitsfindings_detail+severity_summary+ per-finding remediation hints, and
supports an opt-in fail-closed policy (--policy,gate_policy.json, or
ODOO_AI_FAIL_CLOSED): an S3/S4 finding blocks the merge unless a covering
human_signoff.jsondowngrades it toneeds_human— never silently toapprove.
Strictly additive; the no-policy path is byte-for-byte the prior behaviour. - First-class CI/PR integration. A composite GitHub Action
(.github/actions/odoo-gate), a sticky PR-comment renderer (pr-comment, marker
<!-- odoo-ai-gate -->), a GitLab recipe, and policy presets (advisory / strict /
regulated) — seedocs/ci-integration.md. The action enforces:blockand
fail-closed S3/S4 findings fail the build; the evidence artifact is uploaded. - Fixture factories (
fixture).fixture_factory.pygives agents valid business
records for tests — 9 recipes across sale/purchase/stock/account/mrp/multi-company.
CODE mode emits a paste-readyTransactionCaseskeleton;--execruns the recipe in
a savepoint and rolls back, validating it against this instance's modules / chart
of accounts. - Fit-Gap alpha (
fit-gap).fit_gap.pyclassifies requirements against the live
instance —native_config/config_plus_gap/module_available_not_installed/
pattern_known_not_present/no_known_pattern— with heuristic effort bands and
risk class. Scoped to sale/stock/account. It is decision support for a functional
consultant, not a replacement: gated items are instance-verified, heuristic items
need human validation. - UAT Pack alpha (
uat-pack).uat_pack.pyturnssurface+scenarios(+ optional
dossier) into role-based UAT scripts a consultant hands to a client — role, data
setup (suggested fixture recipe), numbered steps, expected result, evidence slot,
sign-off — as JSON + Markdown (checkbox sign-offs) + optional HTML. Scenarios with no
entrypoint match are surfaced, never dropped silently. - Odoo Agent Safety Bench v0 (
bench/). A public, reproducible benchmark whose core
metric is the unsafe-change escape rate — how often an unsafe Odoo change reaches
PR/UAT/release undetected — not task completion. Ten frozen v0 tasks (≥5
high-severity: portalsudo()ACL bypass, dropped multi-company record-rule clause,
stale@api.dependsledger drift, f-string SQL injection, price-include tax error),
severity-weighted scorer (S0×1 … S4×12), four run modes (alone / +context / +gate /
both), a living adversarialzoo/, and a RUNBOOK. No single headline score by design. - Business & governance docs.
docs/pilot-package.md,docs/partner-enablement.md,
docs/governance.md,docs/artifact-governance.md,docs/odoo-online-advisory.md—
the paid-partner-enablement model around an open standard, artifact-handling rules for
sensitive dumps, and the path toward neutral (OCA/partner) corpus co-maintenance.
Changed
- Public naming and positioning. README,
AGENTS.md,docs/index.html, and 17
SKILL.mdfiles reworded to the Inspect/Verify/Gate/Report vocabulary; new top-line
positioning sentence; a new Odoo hosting reality section (self-hosted & Odoo.sh =
full code gate; Odoo Online = advisory-only, no custom code). TheAGENTS.mdMCP
rule now sanctions the bundled bounded MCP context server while still forbidding
arbitrary-RPC wrappers. build_report(bundle_dir, strict=False, policy_path=None)gained an optional
policy_path; existing callers (evidence bundle, CLI) are unaffected.
v0.13.0 — Layer L: the hardened evidence gate
Layer L — the hardened evidence gate
Raise the bar against "coverage theater": an AI agent writing mock-heavy / vacuous-assert / happy-path tests, or hand-authoring the evidence JSON, to turn the gate green while the real method still throws at runtime.
The fix is architectural — the agent writes code + tests, but a CI runner produces and HMAC-signs the evidence, binds it to the git diff, and deploy_gate.py --strict (policy v2) decides go/no-go. Legacy (non-strict) behavior is unchanged.
Nine new stdlib gate scripts (all unit-tested)
- diff_targets — git+AST → changed
{model, method, changed_exec_lines}(the anchor everything binds to) - test_quality_gate — blocks vacuous asserts, mocked model-under-test, swallowed
UserError, broadassertRaises, and tests not imported intests/__init__ - changed_coverage_gate — the changed lines must run under a real test context
- runtime_path_probe — the changed method must have executed through the live registry MRO (kills mocks/stubs/wrong-layer)
- scenario_satisfaction — risk scenarios enforced (
required − satisfied == ∅) - mutation_smoke — a surviving mutant on a changed line = vacuous assertions → block
- red_green_replay — CI re-runs test-first (base fails with a legit red, head passes same identities)
- provenance — HMAC attestation with per-artifact content + commit binding
- runtime_observer — CI-owned, fail-closed tracer with permanent audit-hook tamper detection
Trust boundary — honest posture
This is a strong hardening gate, not eradication. It was designed and hardened across four adversarial Oracle reviews; every found bypass (forged/replayed provenance, empty head_sha, normal-risk weak tests, disable/restore of the tracer) is fixed and regression-tested. The decisive runtime facts are still measured inside the untrusted test process, so --strict = approve only fully holds with the OS/CI isolation documented in references/ci-trusted-observer.md. Human review stays mandatory for accounting/stock/payment/hr, security, and controllers.
Also in this release: odoo-user-guide (skill #20) — instance-verified end-user guide generation.
Both plugins (Claude Code + Codex) bumped to 0.13.0. Full test suite: 758 passed.
v0.12.1 — html-report tech hero
Changed
html-reporthero restyle — the report header is no longer a flat black slab.assets/report.cssnow renders a "tech" hero: a deep warm-black gradient, two brand-tinted corner glows (pink + yellow), a faint blueprint grid that fades toward the bottom, and an accent hairline along the bottom edge. Pure CSS, still fully self-contained (no images/CDN), and unchanged in light/dark/print.
New reports pick this up automatically; previously inlined reports need a re-inline.
v0.12.0
v0.11.0 — HTML reports + odoo-ai viz
✨ Highlights
html-report skill
Render any analysis, audit, RCA, or review as one consistent, self-contained HTML page — bold "Magazine" theme, CSS inlined (no CDN, no server), auto-opened. Compose from shared blocks instead of hand-rolling a design every time.
Dependency-free chart blocks (pure CSS, no JS): MRO/super() ladder, parent/child tree, bar chart, security matrix.
odoo-ai viz
Turn introspection JSON into that layout automatically — LOCAL (no DB), pure stdlib, reuses the html-report stylesheet:
| Layer | Chart |
|---|---|
| A (brief) | MRO/super() ladder (marks returns_before_super, core/enterprise addons) |
| C (metadata) | menu tree + reports |
| D (trace) | SQL-hotspot bars + most-invoked + call order |
| G (security) | effective-access matrix + record rules + restricted fields |
| K (ESG) | model→model edge bars + Mermaid graph |
odoo-ai --db DB all sale.order --record-id 1 --method action_confirm
odoo-ai --db DB esg sale.order
odoo-ai viz /tmp/odoo-ai/sale_order # → report.html (+ opens)Presentation only — distinct from odoo-reports (Odoo QWeb business documents). Nothing leaves the box.
Quality
tests/test_viz.py(14 tests); full unit suite 445 passing.- CI green: GitGuardian, Layer I gates, smoke 17/18/19, example, unit/test.
Full changelog: v0.10.0...v0.11.0
v0.10.0 — Layer K: discovery, sampling, eval & enforcement
Layer K answers the cold-start problem the codebase analysis surfaced: the suite was best-in-class at micro ground-truth (a model/method/field you already named) but had no answer to "where do I start?", no measurement of hallucination reduction, and no way to stop the agent skipping the tools. An independent oracle red-team refined the fix — don't build a static process atlas (it goes stale → makes the agent more confidently wrong); make process understanding emerge from sampled traces, and make the tools impossible to skip.
New odoo-ai commands (now 30)
surface— rank the live entrypoint surface (object buttons, server actions, crons, automations, reports, and a new@http.routescanner) so the agent starts from real roots, not a guessed method. Emitstop_trace_seeds.esg— sample the top entrypoints' real traces (rolled back) into a cross-model / cross-app flow skeleton. Process understanding that emerges from traces, never a static map. External-effect methods (send/mail/payment/print/unlink/…) are never auto-fired.eval— score the gate'sdetection_rate/truth_recallon a benchmark of the classic LLM Odoo mistakes (account.invoice,customer_id,fields_view_get, a'customer'selection). A regression signal, not a vibe.gate-edit(+ PreToolUse hook) — no-introspect-no-edit: block an edit to an Odoo model until it's introspected + passes the validator. OptionalODOO_AI_GATE_STRICT=1fail-closed mode.
Tested for real
Live Odoo 17 / 18 / 19 via the new docker-compose.e2e.yml: integration smoke 91/91 on each; eval detection_rate 1.0 / truth_recall 1.0 on all three. 515+ unit tests; claude plugin validate passes. Hardened via a pre-merge oracle audit (findings verified in code; false positives dismissed).
Also
- Fixed a
scan-secretsfalse-positive that flagged file paths as base64 secrets. - Deepened references (odoo-review, odoo-owl, security/perf/data); corrected two fabricated Layer-G field names in
high-risk-playbooks.md.
Full diff: v0.9.1...v0.10.0
v0.9.1 — Hardening (trusted gate)
No-new-features hardening release that makes the v0.9.0 Layer-I gates actually trustworthy.
Driven by an iterative independent oracle review loop (ChatGPT GPT-5.5 Pro) run to convergence. Round 1 found 4 release-blockers in public v0.9.0; successive rounds adversarially fuzzed the deploy-gate approve path until no reachable wrong approve, crash, or output-contract violation remained. Final verdict: "No remaining must-fix — v0.9.1 is sound to tag."
What changed
- Evidence/CLI contract —
deploy_gateresolves artifacts by pattern (reads the CLI's realpatch.validate.jsonforms); new globalodoo-ai --json. - CI workflow — real JSON paths; typed report-shape checks (a missing/invalid report renders needs-human, not a false ✅ clean);
contents: read; and a final Enforce-gate step that fails the job on block / secret / blocking. - Approve-path hardened against attacker-/bug-shaped evidence JSON:
- strict load: reject duplicate keys,
NaN/Infinity, overflow→inf; emitallow_nan=False - fully typed artifact schemas (non-bool int counts ≥ 0, real lists, enums, model/error field types)
- duplicate artifacts merge to the worst case (a clean dupe can't hide a blocker)
scan_secretsis core-required; manifest shape fully validated (incl.\→/+ path-based sensitive-domain detection)- a required human sign-off can never be
approve
- strict load: reject duplicate keys,
- Redaction — provider-secret masking (AWS/GitHub/Stripe/Slack/Google/PEM/JWT) + nested sensitive-record PII; scanner coverage matches the redactor.
- Migration safety —
upgrade_checkrename-vs-drop similarity threshold;env_diffsymmetric drift + unknown-count handling;patch_validatorAST SQL/create()checks;claim_verifyprobe-error semantics;doc_indexprovenance.
Quality
- 375 unit tests + 80 pure-function tests green
- Integration smoke 68/68 on live Odoo 18
Full detail in CHANGELOG.md [0.9.1].
v0.9.0 — The verification gate
Static indexes suggest; odoo-ai-skills verifies — against your running Odoo instance.
This release repositions the suite as the local-first verification & deploy gate for AI-written Odoo changes, and ships the enforcement layer that makes it real. It bundles the previously-unreleased v0.8.0 (Layer I) plus the v0.9.0 verification-gate work.
Highlights
- Layer I — enforcement gates: risk-based scenario test generator, dev↔prod environment parity/drift detector, a static Odoo anti-pattern validator, enforced privacy redaction, an upgrade/migration harness (rename-vs-drop), and a deploy-gate (approve / needs-human / block).
odoo-ai evidence— a one-command PR-comment evidence bundle (the flagship artifact).odoo-ai verify-claims— a bring-your-own-index adapter: verify any external index/agent claim against your instance (confirmed / contradicted / needs-shell).- Layer J — local Odoo docs index (
odoo-ai docs-build/docs): a TF-IDF index of the official developer docs, built locally; results carry canonical odoo.com URLs. Never vendored (clean CC-BY-SA). - native-check probe grammar expanded 4 → 12 kinds (xmlid · action · group · cron · sequence · selection-value · mixin · edition …).
- Four gates are pure & local (no instance) — ideal for CI.
Tested against real Odoo
- Integration smoke runs every layer + gate against live Odoo 17 / 18 / 19 (68/68 checks).
- Validated end-to-end against a real 390-module Enterprise instance (Studio fields, custom addons, multi-company) — read-only layers, the gates, and a rolled-back runtime
trace/state.
Update
claude plugin update odoo-ai-skills@odoo-ai
Full notes: see CHANGELOG.md (0.8.0 + 0.9.0).