Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions .claude/board/EPIPHANIES.md
Original file line number Diff line number Diff line change
@@ -1,3 +1,13 @@
## 2026-06-17 — E-ODOO-SPO-INHERITS-VALKIND — spo_enrich extended with inherits_from (P1b/ruff#19) + validation_kind (P2/ruff#21); corpus regen pending Odoo source

**Status:** FINDING for the code shape + tests; CONJECTURE for the wire effect on the shipped corpus (regenerates when a session has `/home/user/odoo/addons` available). `spo_enrich.py` adds two enrichment passes via the same single AST walk #525 introduced (`build_all_facts` returns `(relmap, inherits, constrains)`). 18 new tests on top of #525's 23 (41/41 OK total). Rust loader's predicate-histogram match arm gained `inherits_from` + `validation_kind`.

**`inherits_from`** — same wire shape as ruff#19 (C++ + Rails): `(odoo:<this>, inherits_from, odoo:<base>)`. Scans `_inherit` (string or list) + `_inherits` (delegation dict keys). Self-inherits (`_inherit == _name`) dropped at scan time; unknown bases skipped + counted. `_inherit`-only classes (no `_name`) do NOT emit inherits_from — those extend an existing model in place, no new edge.

**`validation_kind`** — keys on the *method* IRI (ruff#21's analog keys on the *attribute* IRI). Five recognised kinds: `presence` / `uniqueness` / `range` / `format` / `lookup`, detected by AST patterns. **All three codex P2 findings from the pre-rebase iteration are baked in:** `range` skipped when LHS is `search_count(...)`, `presence` restricted to `not <Name|Attribute|Subscript>` (negated calls skipped). Constraint binding follows #525's `model_names` decision (per-class `_name` if set, else `_inherit[0]` only — no mixin broadcast).

**Where this lands.** Wishlist items #1 (`_inherit`), #2 (`_inherits`), and #3 (`validation_kind` for `@api.constrains`) at [`AdaWorldAPI/odoo-rs UPSTREAM_WISHLIST.md`](https://github.com/AdaWorldAPI/odoo-rs/blob/main/crates/od-ontology/specs/UPSTREAM_WISHLIST.md). Once a session with `/home/user/odoo/addons` re-runs `python -m odoo_blueprint_extractor.spo_enrich`, the corpus gains the new triples and the predicate-histogram test counts can be locked.

## 2026-06-17 — E-SPECTRAL-GAP-NAN-1 — the Davis–Kahan `/gap` and `λ₂→0` precursor are the SAME NaN class as entropy_ladder; floor the denominator AFTER the subtract

**Status:** FINDING (shipped on branch `claude/perturbation-soa-nan-gate-witness`, `perturbation-sim` B1). The spectral half of `perturbation-sim` carries an *intrinsic* NaN/divergence landmine that fires **in the exact regime the model exists to capture**: the Davis–Kahan Fiedler rotation bound `sinθ ≤ ‖E‖₂ / gap` and the mode-instability modifier `Δλ × (1/λ₂)` both divide by a **vanishing spectral gap**, and `gap → 0` / `λ₂ → 0` IS the blackout precursor (network fragmentation). This is the identical bug-class to `ndarray::hpc::entropy_ladder::residue_surprise` (PR #221): a denominator built by subtraction that collapses to 0 → `0/0` NaN, or — subtler — a *tiny-but-positive* denominator that slips past a naked `gap > ε` test and yields an astronomically large **finite** number presented as a trustworthy bound.
Expand Down
4 changes: 4 additions & 0 deletions crates/lance-graph/src/graph/spo/odoo_ontology.rs
Original file line number Diff line number Diff line change
Expand Up @@ -24,6 +24,8 @@
//! | `traverses_relation` | `odoo:<fam>.<fn>` | `odoo:<fam>.<rel>` | body for-loop (inferred) |
//! | `target` | `odoo:<fam>.<rel>` | `"<comodel.dotted>"` | relational comodel (declared) |
//! | `inverse_name` | `odoo:<fam>.<rel>` | `"<inverse>"` | One2many/inverse (declared) |
//! | `inherits_from` | `odoo:<family>` | `odoo:<base_family>` | `_inherit`/`_inherits` base (declared) |
//! | `validation_kind` | `odoo:<fam>.<fn>` | `"<kind>"` | `@api.constrains` body pattern (inferred) |
//!
//! ## FK-target + deep-read enrichment (`spo_enrich`)
//!
Expand Down Expand Up @@ -174,6 +176,8 @@ mod tests {
"traverses_relation" => "traverses_relation",
"target" => "target",
"inverse_name" => "inverse_name",
"inherits_from" => "inherits_from",
"validation_kind" => "validation_kind",
_ => "other",
})
.or_default() += 1;
Expand Down
Loading
Loading