Repository navigation
Conversation
…ll (offline, not yet run) Pinned, multi-arch images on loopback; a generated admin password, a dedicated user, a read-only record-check role on res_partner, a database-owner oracle and reset by archiving. ERPNext's images are amd64 only, so Odoo comes first. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, hooks and benchmark contract Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ipped SQL is one read-only SELECT The Odoo 18 Community fixture now runs: the demonstration saves a contact and a parameterized SELECT of the typed fields (keyed by email, through a read-only role) reads all six back. Qualification under clinical-write refuses before any case: City and Phone carry one-word labels, and the save button is an icon with no text (the class #1581 addresses). Evidence and findings are in benchmark/odoo_contacts. A shipped SQL read-back must be one parameterized, read-only SELECT (skills.shipped_sql_problems): no second statement, comments, literals or ${} text; no writing, session, file or sleep functions; every %(name)s bound to a typed input. skill qualify and the index build both check it; the attest job's pinned wheels gain PyYAML for that. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Adversarial review at 44c8ee5 (stacked on #1592)Verdict: no blockers. This PR adds no registry entry, so nothing it ships can end in a verified write. The Odoo fixture is synthetic, and the refusal under Tests. Not blocking:
|
The read-back now runs on a driver-level read-only session (PRAGMA query_only, psycopg read-only, a READ ONLY MySQL session), and a shipped contract may name only drivers that support it. A shipped query must be SELECT <plain columns> FROM <tables>, with inputs bound only after WHERE, so a select list that echoes the inputs can't make a wrong save verify. The Odoo benchmark drops a local scratch path from qualify.log and the fixture default, drops internal VM notes from the README, and says the compiled bundle isn't committed.
Stacked on #1592. This is the skills registry's first non-healthcare candidate: create a contact in Odoo 18 Community (LGPL-3.0). It runs on a local test copy holding synthetic data, with Odoo's images pulled by digest at run time.
What ran
benchmark/odoo_contactsbrings up Odoo 18.0 and Postgres 16 on loopback, with a dedicated user and a read-only record-check role. It needed two fixes on its first run:demo.py) chooses Individual, fills name, street, city, ZIP, phone and email, and saves. The contact is saved, and the record check reads all six fields back. The compiled program has 14 steps and 6 parameters (results/2026-10-28-click-teach/).clinical-writerefused before any case, as it should:So no registry entry yet. Per #1598 the next step is the icon-button identity in #1581, not a page heuristic here. The details are in
benchmark/odoo_contacts/README.md.Shipped SQL is one read-only SELECT
As the coordinator decided, a public bundle may ship a minimal SQL record check: the typed fields, keyed by the identity field, on the app's documented schema.
skills.shipped_sql_problemsrequires a single parameterized, read-only SELECT. It refuses:${}text;INTO,FOR UPDATE,pg_*,lo_*anddblink;%(name)s, and any binding that isn't{param: ...}.skill qualifychecks it (insideshipped_contract_problems). So does the index build (build_registry_index.check_shipped_contract), so a bundle that breaks the rule never ships. The attest job's pinned wheels gain PyYAML for that check.Tests
tests/test_shipped_sql.py: the Odoo SELECT passes, 11 kinds of unsafe query are refused, bindings must be typed inputs, the whole contract is checked, and the index build refuses a bundle whose SQL writes. These pass together with the registry suites (108 passed, 4 skipped withoutsigstore).Also
test_durable_authority_v13tests. Main had already fixed them (b16d6cb). Auto-merge stays on.🤖 Generated with Claude Code