Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Expert at building Odoo XML views: Form, List, Kanban, Search, Calendar, and Graph. Generates correct XML for Odoo 14-17 with proper visibility syntax.
.claude/skills/odoo-xml-views-builder/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-01 | ✗→✓ | ▲ Improved | — | — |
| case-19 | ✓→✓ | = Same ✓ | — | — |
| case-16 | ✗→✗ | = Same ✗ | — | — |
| case-14 | ✗→✗ | = Same ✗ | — | — |
| case-03 | ✗→✗ | = Same ✗ | — | — |
This skill generates and reviews Odoo XML view definitions for Kanban, Form, List, Search, Calendar, and Graph views. It understands visibility modifiers, groups, domain, context, and widget usage across Odoo versions 14–17, including the migration from attrs (v14–16) to inline expressions (v17+).
@odoo-xml-views-builder and describe the view you want.xml<record id="view_hospital_patient_form" model="ir.ui.view"> <field name="name">hospital.patient.form</field> <field name="model">hospital.patient</field> <field name="arch" type="xml"> <form string="Patient"> <header> <button name="action_confirm" string="Confirm" type="object" class="btn-primary" invisible="state != 'draft'"/> <field name="state" widget="statusbar" statusbar_visible="draft,confirmed,done"/> </header> <sheet> <div class="oe_title"> <h1><field name="name" placeholder="Patient Name"/></h1> </div> <notebook> <page string="General Info"> <group> <field name="birth_date"/> <field name="doctor_id"/> </group> </page> </notebook> </sheet> <chatter/> </form> </field> </record>
xml<record id="view_hospital_patient_kanban" model="ir.ui.view"> <field name="name">hospital.patient.kanban</field> <field name="model">hospital.patient</field> <field name="arch" type="xml"> <kanban default_group_by="state" class="o_kanban_small_column"> <field name="name"/> <field name="state"/> <field name="doctor_id"/> <templates> <t t-name="kanban-card"> <div class="oe_kanban_content"> <strong><field name="name"/></strong> <div>Doctor: <field name="doctor_id"/></div> </div> </t> </templates> </kanban> </field> </record>
invisible="condition" (Odoo 17+) instead of attrs for show/hide logic.attrs="{'invisible': [...]}" only if you are targeting Odoo 14–16 — it is deprecated in v17.string attribute on your view record for debugging clarity.<chatter/> (v17) or <div class="oe_chatter"> + field tags (v16 and below) for activity tracking.attrs in Odoo 17 — it is fully deprecated and raises warnings in logs.domain strings in views when a domain field on the model can be used dynamically.<searchpanel>) are not fully covered — those require frontend knowledge.@odoo-qweb-templates for those.| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-16 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-14 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-03 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-15 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-09 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-10 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-02 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-21 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-11 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-06 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-18 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-07 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-05 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-22 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-20 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-19 | pass→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-04 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-08 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-01 | fail→pass | — | — | — | — | — | — | — | — | — | — | — | — |
case-12 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-13 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
case-17 | fail→fail | — | — | — | — | — | — | — | — | — | — | — | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted. The headline lift of 0 percentage points is the difference between those two pass rates over the 22 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
The per-case answers from this run were removed by the retention sweep, so the case table below shows the verdicts without the text either arm produced. The counts above were recorded at the time and are unaffected. Answers are now kept for 180 days.
Other measured skills in the registry, with their headline benchmark lift.