@@ -1083,3 +1083,45 @@ isolation. The map's job is to keep them visible.
10831083 index — safe under Odoo semantics (` @api.depends ` is method-level,
10841084 co-computed fields carry identical ` depends_on ` ), revisit if a
10851085 frontend ever emits divergent ` depends_on ` per co-computed field.
1086+
1087+ - ** D-ATC2-KAUSAL-RUFF-GATED** — 2026-07-06 ` [G] ` : AT-CARRY-2 arms B+D
1088+ landed (OGAR #169 ) after ruff #49 put ` Function::{constrains,onchange} `
1089+ + ` Field::stored ` on ruff main. Arm B: ` KausalSpec::{Constrains,Onchange} `
1090+ populated in ` lift_actions ` ONLY when ` kausal.is_none() ` (SPEC §3b) — so
1091+ Depends (Arm A) always wins, Constrains beats Onchange; sourced purely
1092+ from the decorator fields, never ` reads ` /` writes ` (regression
1093+ ` lift_actions_depends_arm_a_regression_unaffected_by_arm_b ` ). Arm D:
1094+ ` ComputedField.stored = field.stored.unwrap_or(false) ` at both projection
1095+ sites (§5: Odoo's not-stored default). Post-merge verification: OGAR
1096+ workspace green against ruff main ` 9ef26c1 ` — ` cargo build --workspace `
1097+ clean incl. ` ogar-from-rails ` (the float-on-main risk), `cargo test
1098+ --workspace` 479/0. Opus adversarial review: CLEAN impl, one P2 below.
1099+ - ** HONEST CORRECTION to the D-ATC2-KAUSAL-AUTARK fuse rationale.** That
1100+ entry (and the B-arm commit message) claimed the exhaustive
1101+ ` kausal_spec_match_is_exhaustive ` guard makes * consumers* "loud break
1102+ instead of silently defaulting" on new variants. That is TRUE only
1103+ intra-crate. ` KausalSpec ` is ` #[non_exhaustive] ` , so every cross-crate
1104+ ` match ` is FORCED to carry a wildcard — the fuse cannot protect any
1105+ consumer outside ogar-vocab. The claim was overstated.
1106+ - ** DEBT (P2, spec-deferred per §6): the TTL emitter silently mislabels
1107+ Arm B.** ` ogar-emitter::kausal_triples ` has no Constrains/Onchange arm;
1108+ both fall through ` _ => ogar:Unknown ` (lib.rs:779) and their field paths
1109+ are DROPPED at TTL emission. The IR struct is correct (consumers that
1110+ read ` ActionDef.kausal ` directly — e.g. the odoo-rs AT-CONSUME parity
1111+ pin — are unaffected); only the TTL projection is lossy. §6 defers the
1112+ downstream-consumer wiring, so this is not a spec violation, but it is
1113+ actively-wrong (not merely missing) TTL. (NB: SPEC-ATC2-OGAR §6 line 219
1114+ still names a "SurrealQL-Adapter" as a deferred consumer — that naming is
1115+ STALE. Per the operator ruling recorded above (2026-07-05: "Odoo's spog
1116+ lives now in V3 substrate in lance-graph <>OGAR, not surrealdb AST"), the
1117+ forward substrate is the OGAR-v3 / lance-graph path; the SurrealQL-AST
1118+ adapter is deprecated. The live debt is the ` ogar-emitter ` TTL path, which
1119+ ` ogar-adapter-ttl ` and the v3 substrate consume — not SurrealQL.)
1120+ Converted from silent to
1121+ documented: characterization test
1122+ ` kausal_constrains_onchange_currently_emit_unknown_pending_emitter_wiring `
1123+ PINS the interim ` ogar:Unknown ` + dropped-paths behaviour so it flips
1124+ LOUDLY when §6 lands (defining ` ogar:Constrains ` /` ogar:Onchange ` kinds
1125+ + a kausal path predicate — a governed vocab mint, NOT done here).
1126+ - Additive API gap closed: ` KausalSpec::{constrains,onchange} ` constructors
1127+ added to mirror ` depends() ` /` lifecycle() ` (consumers + the test need them).
0 commit comments