diff --git a/.claude/board/AGENT_LOG.md b/.claude/board/AGENT_LOG.md index 787a99ac..d750a78b 100644 --- a/.claude/board/AGENT_LOG.md +++ b/.claude/board/AGENT_LOG.md @@ -1,3 +1,17 @@ +## 2026-06-16 — odoo-rs SEEDED + PR #511 board hygiene (cross-repo) + +**Main thread (Opus 4.7) — two outputs, one session arc.** + +**(1) odoo-rs SEEDED.** The empty `AdaWorldAPI/odoo-rs` repo bootstrapped to `main` (commit `ebfb2c3`, 973 LOC across 7 source files). Doctrine: Odoo's business-logic ontology as a *native SurrealDB schema* — not a sea-orm port (rejected as "sink-in"), not a codegen pipeline (deferred as the "cut tail"). Crate `od-ontology` projects the 22 245-triple SPO corpus (lance-graph `graph/spo/odoo_ontology.spo.ndjson`) → typed `Schema { tables, functions, events }` via `corpus_to_schema()` → SurrealQL DDL via `ToSql`. The split that matters: **reactive wiring is 100% faithful immediately** (which field recomputes over what, which guard fires, which method materialises which field, which deps cross records); compute/guard *bodies* and exact field types **port incrementally**. + +**Slice-1 fixture (proves the shape):** `account.move` — 1 647 real triples extracted as `data/account_move.spo.ndjson` (610 `depends_on`, 226 `emitted_by`, 220 functions, 18 `raises`, 130 cross-record dotted deps). **9/9 slice tests + 1 doctest green** against the real fixture; clippy clean (`deny(clippy::all)`, `warn(clippy::pedantic)` — only 1 pedantic `doc_markdown` warning on `SurrealQL`/`QL` casing, non-blocking); `cargo fmt --check` clean. + +**Architecture comparison done (op-surreal-ast / nexgen-rs):** `AdaWorldAPI/openproject-nexgen-rs::op-surreal-ast` is the analogous AR-shaped DDL AST (operator pointed at it). od-ontology's `surreal_ast.rs` mirrors its shape (TableDefinition / FieldDefinition with VALUE+ASSERT+READONLY / IndexDefinition / EventDefinition / FunctionDefinition / Kind taxonomy with ToSql) but is Odoo-aimed not Rails-aimed — Odoo's `compute='_x', store=True` lowers to `DEFINE FIELD VALUE … READONLY`, `@api.depends('rel.sub')` lowers to `DEFINE EVENT`, `@api.constrains/_check_*` lowers to `DEFINE EVENT … THROW`, `def action_X` to `DEFINE FUNCTION fn::model::X($this)`. The 7 ruff PRs (#5/#6/#7/#9/#10/#11/#12) on the OpenProject AR-shape arc are the predicate-vocab template; od-ontology consumes the *output* of that work (the {s,p,o,f,c} ndjson), so vocab parity follows from the existing 22 245 triples — no ruff-fork changes required for slice-1. + +**(2) Board hygiene for PR #511** (perturbation-sim substrate calibration, +886/-0 additive, merge `c3dddfc9`) — this commit. PR_ARC entry prepended (Status/Added/Locked/Deferred/Docs/Confidence); LATEST_STATE dated bullet + table row at the head. PR #511's headline lock: **5 contingency factors certify by VALUE at 2-bit linear** (existing tenants suffice, no new columns); **only `inertia_buffer` is genuinely additive** (orthogonal to topology per #509); §0 anti-invention guardrail honoured (spec only). Self-correction visible: two `d_lambda2` ICC=0 hypotheses retracted on the run. + +**Cross-repo footprint this session:** odoo-rs new repo on `main` (commit `ebfb2c3`); lance-graph board update on `claude/odoo-savant-reasoners` (this commit). No PR opened for odoo-rs yet (the repo was empty by design — the seed IS the main branch). + ## 2026-06-16 — PR #507 review pass: 5+3 agent fleet (5 specialists + PP-13/15/16 hardeners) → 1 P0 + 2 P1 + P2 docs fixed **Main thread (Opus 4.7) spawned an 8-agent review fleet against PR #507** (the 4-task unblock-cascade below): 5 specialists (sentinel-qa, dto-soa-savant, iron-rule-savant, scenario-world, container-architect) + the 3 brutal hardeners (PP-13 brutally-honest-tester, PP-15 baton-handoff-auditor, PP-16 preflight-drift-auditor). Verdicts: dto-soa **LAND**, iron-rule **YIELDS-ALL**, container-architect **EXACT**, sentinel-qa **SOUND+P1**, scenario-world **CORRECT+P1**, PP-15 **CATCH-LATENT**, PP-16 **HOLD(P0)**, PP-13 **HOLD(P1×2)**. Consensus: mergeable after mechanical fixes; **zero REJECT, zero architectural rework** — "high-quality work" (PP-13), tests verified not-theater. diff --git a/.claude/board/LATEST_STATE.md b/.claude/board/LATEST_STATE.md index 5ad91b2a..40994e00 100644 --- a/.claude/board/LATEST_STATE.md +++ b/.claude/board/LATEST_STATE.md @@ -10,6 +10,14 @@ --- +> **2026-06-16 — MERGED #512** (perturbation-sim review fixes + **core-first transcode doctrine**): +591/-5 across 11 files. **Code fixes (review of #511):** `examples/calibrate.rs` divide-by-zero guard on degenerate grid; `src/hhtl.rs::basin_lambda2` `assert_eq!(keys.len(), grid.n, …)` precondition (silent corruption→loud panic); `TECH_DEBT.md` MD018 reflow. **Doctrine (the structural delivery):** new mandatory-read `core-first-transcode-doctrine.md` (218 LOC) + 3 new agent cards (`core-first-architect`, `core-gap-auditor`, `adapter-shaper`) + `BOOT.md`/`README.md` wires + EPIPHANIES entry + CLAUDE.md (+21 LOC, doctrine wire-up — NEW content unread by this session). Likely directly aligned with the ontology-first stance the operator locked on odoo-rs. Branch `claude/happy-hamilton-0azlw4`, merge `1e23c410`. 75 lib tests + clippy + fmt clean. +> +> **2026-06-16 — MERGED #513** (perturbation-sim: inertia §0 promotion gate + CAKES/CHAODA + witness standing-wave + H ingest): +1009/-2 across 10 files. Disjoint from #512 by design. **(1) §0 gate** — `GuardrailVerdict::RatifiedReuse`: `inertia_buffer` takes `ResidueEdge` `INERTIA_SLOT = 5`, reuses an existing tenant, invents no new axis → passes §0 by **reuse, not waiver**. Topology stays HHTL-OGAR GUID key; the buffer is one more value, orthogonal by key/value split. **(2) Probe 1 CAKES + CHAODA-lite** over HHTL basins: per-basin `[λ₂, size, inertia]` features; `CHAODA_FLAG=0.75` mirrors ndarray::clam's flag; example `chaoda` flags planted brittle block (basin 1.1.0, score 1.000). Full `ClamTree` ensemble path gated on local ndarray sibling. **(3) Probe 2 witness arc as standing wave** (METHODS §11): `particle == wave` via Parseval (`Hᵀ·H = N·I`), agreement to **0.00e0**; `witness_from_spectrum` is the O(N)-per-arc read-many amortization win. **(4) Probe 3** per-bus inertia (H) ingest path opened. Branch `claude/perturbation-sim-inertia-clam`, merge `8a3e335b`. Does NOT touch `canonical_node`. +> +> **2026-06-16 — MERGED #511** (perturbation-sim: substrate calibration + calibrated SoA member spec): **+886/-0 additive**. New `examples/calibrate.rs` (318 LOC) runs the ICC(2,1) + Spearman + Pearson + Cronbach α battery against perturbation-sim as ground truth; new `src/columns.rs` (177 LOC, spec only) names the calibrated `SoaMemberSpec` set; new `src/hhtl.rs` + `examples/hhtl_grid.rs` + `CLAM_CHAODA_FRAMING.md`. **Findings:** all 5 contingency factors certify by VALUE at 2-bit linear (ICC ≥ 0.96) — existing palette/turbovec tenants already suffice, §10 "statistics survive the encoding" CONFIRMED; α preserved within Δ ≤ 0.02 at ≥4-bit; cross-axis ρ wobbles ±0.15 at N=24 → read ≥6-bit. **Self-correction:** `d_lambda2`'s ICC=0 was variance-guard underflow at ~1e-7 magnitude (not heavy-tail / not near-constant — both prior guesses retracted); normalized storage fixes to 1.00 at 2-bit. **Locked:** 5 factors → existing tenants (no new columns for contingency axes); the **one genuinely additive member is `inertia_buffer`** — orthogonal to topology (`Spearman(λ₂, buffer) ≈ 0` per PR #509), spec only, promotion gated by §0 anti-invention guardrail. Significance per Jirak n^(p/2−1) (I-NOISE-FLOOR-JIRAK). Does NOT touch the operator-locked `canonical_node`. Branch `claude/perturbation-sim-calibrate-soa`, merge commit `c3dddfc9`. 71 lib tests + clippy + fmt clean. +> +> **2026-06-16 — MERGED #510** (surreal_container seam falsifier — IN-direction): `crates/surreal_container/tests/scheduler_seam.rs` — **+125/-0, one new file, zero source change**; first integration-test file in `surreal_container`. Five kill-condition-first tests pin the `SurrealMailboxView → NextPhaseScheduler::on_version → KanbanMove` contract end-to-end: legal-successor walk over the full Rubicon arc, absorbing-column guard (Commit/Prune schedule no advance), `-550_000µs` Libet-anchor pinned to the Planning→CognitiveWork Σ-commit crossing, lowering-determinism, ExecTarget-rides-onto-move. Branch `claude/sleepy-cori-aRK2x`, merge commit `0e6452c8`. **Out of scope (explicit, deferred):** the OUT-direction = planner-emit `KanbanMove` (`CognitiveCycle` sequencer + §9 LOCKED from #496) — `D-MBX-A6-P3` remains the next unblock. This PR proves the downstream half; the upstream half is still hand-rolled. Test bench is also the template the planner-emit half will be verified against once it lands. `surreal_container` is excluded from CI, so the suite runs locally/on-demand (standing CI-coverage-gap follow-up — CI tests 4 of ~30 crates). +> > **2026-06-15 — REVERTED (operator)** — the tesseract-rs `soa` wiring below was **deleted** (branch reset to master `420de08`). Operator: *"we don't want to use original Tesseract, we want to transcode it into Rust — delete everything you copied from original Tesseract into tesseract-rs."* Wrapping the original Tesseract C engine + parsing its TSV is the wrong direction; the real goal is a **pure-Rust OCR**. The contract-side transcode (`LayoutBlock::to_node_row`) + keystone STAY — they are OCR-engine-agnostic (a pure-Rust OCR feeds the same `LayoutBlock` → `NodeRow`); only the original-Tesseract coupling was removed. The strike-through entry below is retained per APPEND-ONLY. > > ~~**2026-06-15 — cross-repo landed** — **tesseract-rs fork wired to the transcode.**~~ *(REVERTED — see above)* `AdaWorldAPI/tesseract-rs` branch `claude/wonderful-hawking-lodtql` commit `1687c718`: opt-in `soa` feature (default-OFF — standalone OCR build untouched) + `src/soa.rs::tsv_to_nodes(tsv, classid, min_conf) -> Vec` parsing tesseract `get_tsv_text` word rows → `contract::ocr::LayoutBlock` → `to_node_row`. Contract dep is a path dep mirroring smb-office-rs (sibling checkout). **Edition-2015 compatible** (the fork has no `edition` field → 2015: root `extern crate` + submodule root-relative `use` + explicit `TryInto` — all caught + fixed by verifying in a 2015 scratch crate against the real contract before pushing, 2 tests green). Pushed via `GH_TOKEN`+pygithub (out-of-MCP-scope fork). Could NOT compile the full crate here (no tesseract C-lib) — the transcode LOGIC is what's verified; the fork's own CI needs a co-located lance-graph for `--features soa`. @@ -38,6 +46,10 @@ | PR | Merged | Title | What it added | |---|---|---|---| +| **#512** | 2026-06-16 | perturbation-sim review fixes + **core-first transcode doctrine** + 3 new agent cards | **+591/-5 across 11 files**. Fixes from #511 review: `examples/calibrate.rs` divide-by-zero guard on degenerate grid; `src/hhtl.rs::basin_lambda2` `assert_eq!(keys.len(), grid.n, …)` precondition (silent-corruption → loud panic); `TECH_DEBT.md` MD018 reflow. **The structural delivery:** new mandatory-read `core-first-transcode-doctrine.md` (218 LOC) + 3 specialist agents (`core-first-architect`, `core-gap-auditor`, `adapter-shaper`) + EPIPHANIES entry + CLAUDE.md (+21 LOC) wire-up. Likely aligned with the ontology-first / codegen-as-cut-tail doctrine the operator just locked on odoo-rs. 75 lib tests + clippy `-D warnings` + fmt clean. Branch `claude/happy-hamilton-0azlw4`, merge `1e23c410`. | +| **#513** | 2026-06-16 | perturbation-sim: inertia §0 promotion gate + CAKES/CHAODA + witness standing-wave + H ingest | **+1009/-2 across 10 files**, disjoint from #512 by design. **§0 promotion gate** for `inertia_buffer`: `GuardrailVerdict::RatifiedReuse` — takes `ResidueEdge INERTIA_SLOT = 5`, reuses existing tenant, invents no axis → **passes by reuse, not waiver**. **Probe 1 CAKES + CHAODA-lite** over HHTL basins (`CHAODA_FLAG=0.75` mirrors ndarray::clam; example flags brittle block 1.1.0 score 1.000). **Probe 2 witness arc as standing wave** — Parseval proves `particle == wave` to 0.00e0; `witness_from_spectrum` is the O(N)-per-arc read-many amortization. **Probe 3** per-bus inertia (H) ingest path. Does NOT touch `canonical_node`. Branch `claude/perturbation-sim-inertia-clam`, merge `8a3e335b`. | +| **#511** | 2026-06-16 | perturbation-sim: substrate calibration (study as ground truth) + calibrated SoA member spec | **+886/-0 additive across 9 files** — `examples/calibrate.rs` (new, 318 LOC, ICC/Spearman/Pearson/Cronbach battery), `src/columns.rs` (new, 177 LOC, **spec only**), `src/hhtl.rs` (new, 175 LOC), `examples/hhtl_grid.rs` (new, 81 LOC), `CLAM_CHAODA_FRAMING.md` (new, 75 LOC). Calibrates the SoA value tenants against perturbation-sim's deterministic study as ground truth: **all 5 contingency factors certify by VALUE at 2-bit linear** (ICC ≥ 0.96), the §10 "statistics survive the encoding" claim **CONFIRMED**; α preserved within Δ ≤ 0.02 at ≥4-bit; read ≥6-bit for cross-axis orthogonality. The **one additive member** named: **`inertia_buffer`** — orthogonal to topology per PR #509's `Spearman(λ₂, buffer) ≈ 0`, spec only, promotion gated by §0 guardrail. Self-correction: two prior guesses on `d_lambda2`'s ICC=0 (heavy-tail / near-constant) **retracted** — it was a variance-guard underflow at ~1e-7. Significance per Jirak `n^(p/2−1)`. Does **NOT** touch `canonical_node` (operator-locked). Branch `claude/perturbation-sim-calibrate-soa`, merge commit `c3dddfc9`. | +| **#510** | 2026-06-16 | test(surreal_container): additive seam falsifier — SurrealMailboxView → VersionScheduler → KanbanMove | **`crates/surreal_container/tests/scheduler_seam.rs`** — additive: **+125/-0, one new file, zero source change**; first integration-test file in the crate. Five kill-condition-first tests pin the **IN-direction** of the surreal↔kanban↔scheduler wiring against the real `SurrealMailboxView` (not the in-crate `FakeView`): full Rubicon arc → legal successors, absorbing-column no-advance guard, Libet `-550_000µs` anchor at the Planning→CognitiveWork Σ-commit crossing, lowering-determinism, ExecTarget-survives-lowering. **Out of scope (deferred, explicit):** OUT-direction = planner-emit `KanbanMove` (`CognitiveCycle` sequencer + §9 LOCKED from #496) — `D-MBX-A6-P3` remains the next unblock. Branch `claude/sleepy-cori-aRK2x`, merge commit `0e6452c8`. CI-invisible (crate excluded). | | **#459** | 2026-06-03 | feat(helix): golden-spiral Place/Residue codec (zero-dep + optional ndarray-hpc) | **`crates/helix`** — new standalone codec realising the Place/Residue `KNOWLEDGE.md` (HHTL = PLACE, helix = orthogonal RESIDUE). `HemispherePoint` (√u equal-area placement) → `CurveRuler` (stride-4-over-17) → `Similarity` (Fisher-Z/arctanh) → `RollingFloor` (256-palette; occupancy-drift + version stamp) → 3-byte `ResidueEdge` + `DistanceLut` (metric-safe 256×256 L1) + `prove()` (2-D discrepancy companion to `jc::weyl`). Zero-dep default (empty `[workspace]`, root `exclude`); optional `ndarray-hpc` = batch Fisher-Z via `simd_ln_f32`. 63 unit + 6 doctests green both configs; clippy/fmt clean. ~80% clean-room overlap with CERTIFIED primitives (E-HELIX-OVERLAP / TD-HELIX-OVERLAP-1). Merge commit `ef35ff1`. Branch `claude/gallant-rubin-Y9pQd`. | | **#450** | 2026-06-01 | NAL syllogism capstone + atoms/styles/NAL → planner-DTO unification (A1/A2) | **`causal-edge::syllogism`** — hardwired NAL **figure** resolver (`Figure{Chain,ChainRev,SharedSubject,SharedObject}` + `figure()`/`syllogize()`; SPO term-sharing → Deduction/Induction/Abduction + signed mantissa; the reasoning kernel, Pearl-2³-analogue). **A1** `contract::nars::InferenceType::{to,from}_mantissa` (zero-dep cross-crate rule bridge) + `From`. **A2** `rung: RungLevel` on both `ThinkingContext` structs (the meta-aware handle). Unification spec §0–14 (`.claude/specs/atoms-styles-nal-planner-dto-unification-v1.md`) + **vart vendored** (`/home/user/vart`). Branch `claude/jolly-cori-clnf9`. _(PR_ARC #450 entry owed.)_ | | **#411** | 2026-05-27 | Cognitive substrate: locked 33-TSV atom layer + 34-tactic recipes + escalation loop | **D-PERSONA-1** `contract::escalation` + `planner::mul::escalation` (CollapseHint/InnerCouncil/EpiphanyDetector/GhostEcho/WisdomMarker/Checklist, 13 tests). **`contract::atoms`** — LOCKED 33-dim TSV `CANONICAL_ATOMS` (3 Pearl + 9 Rung + 5 Σ + 8 Ops + 4 Presence + 4 Meta) + `I4x32` carrier. **`contract::recipes`** — 34-tactic metadata catalogue. **`contract::recipe_kernels`** — the 34 tactics as 34 `Tactic` impls + registry over a shared `ThoughtCtx`. Charter D0: **ladybug-rs has no relation, rewrite-not-port**; lattice is **SPOQ** (SPO 2³ causal + Q qualia overlay); business = OGIT sidecar; markers gate the datapath/control/gate partition. Green: escalation 13 / atoms 3 / recipes 4 / recipe_kernels 5 + 446 prior, no warnings. Branch `claude/splat3d-cpu-simd-renderer-MAOO0` (39 commits). See PR_ARC #411. | diff --git a/.claude/board/PR_ARC_INVENTORY.md b/.claude/board/PR_ARC_INVENTORY.md index 91136c3a..8bb14b95 100644 --- a/.claude/board/PR_ARC_INVENTORY.md +++ b/.claude/board/PR_ARC_INVENTORY.md @@ -35,6 +35,99 @@ --- +## #512 perturbation-sim: degenerate-grid + key-cardinality guards + core-first-transcode doctrine (review #511 + #513) + +**Status:** MERGED 2026-06-16 20:33 UTC (merge commit `1e23c410`), branch `claude/happy-hamilton-0azlw4`. **+591/-5 across 11 files** — addresses the open review findings from #511 (which merged before they resolved) AND introduces the **core-first-transcode** doctrine + 3 new agent cards. + +**Added (code fixes):** +- **CodeRabbit Major fix** — `examples/calibrate.rs` divide-by-zero on a degenerate grid: `k = 24.min(m)` is `0` when `m == 0` so `m / k` panics; `eigenvector(1)` / `m - 1` also break for `n < 2`. Up-front guard exits cleanly with a message. +- **CodeRabbit Major fix** — `src/hhtl.rs::basin_lambda2` silent corruption: a `keys` slice whose length ≠ `grid.n` silently produced wrong basin groupings + λ₂. Added `assert_eq!(keys.len(), grid.n, …)` precondition at the API boundary (loud-fail, all profiles). +- **CodeRabbit Minor fix** — `TECH_DEBT.md` MD018: reflowed the wrapped `#507` so it stops parsing as an ATX heading. + +**Added (doctrine — the structural delivery):** +- **`.claude/knowledge/core-first-transcode-doctrine.md` (218 LOC)** — new mandatory-read knowledge doc establishing the core-first transcode posture. Likely directly aligned with the ontology-first stance the operator just locked in on `odoo-rs` (Odoo's ontology runs natively in SurrealDB, codegen is the "cut tail"). +- **3 new agent cards:** `core-first-architect.md` (91 LOC), `core-gap-auditor.md` (91 LOC), `adapter-shaper.md` (80 LOC). Wired into `.claude/agents/BOOT.md` (+3) and `.claude/agents/README.md` (+33). +- **`.claude/board/EPIPHANIES.md`** prepend (+24 LOC) — the originating finding. +- **`CLAUDE.md`** workspace charter (+21 LOC) — assumed to wire the core-first doctrine into the top-level read list (NEW content not yet inspected this session). + +**Not changed (with stated reason):** +- **Codex P2 (`infight` width)** already fixed before merge — `columns.rs` carries `spec("infight", 4, …)` (certified 4-bit per the §10 note), tests assert. Thread left open without code change. +- **CodeRabbit Major (TECH_DEBT.md append-only governance)** — the 2026-06-16 addendum sits mid-entry instead of as a prepended dated entry. Valid governance observation; the compliant fix is a 31-line board reorganization that belongs in a focused hygiene pass, not churn inside a code-fix PR. Flagged on the thread, deferred to the entry owner. + +**Locked:** the core-first doctrine and its 3 specialist agents are now part of the workspace mandatory-read set (`core-first-transcode-doctrine.md`). The `assert_eq!` precondition on `basin_lambda2` formalises the key-cardinality contract — degraded silent output is now a panic. + +**Deferred:** TECH_DEBT.md append-only repositioning (separate hygiene PR). Cross-doctrine reconciliation between `core-first-transcode-doctrine.md` and the existing `lab-vs-canonical-surface.md` / `encoding-ecosystem.md` knowledge spine has not been inspected this session. + +**Docs:** see above — 218-LOC new knowledge doc, EPIPHANIES entry, CLAUDE.md wire-up, 3 new agent cards. AGENT_LOG/LATEST_STATE updated in **this** retroactive-hygiene commit. + +**Confidence (2026-06-16):** code-fix portion working (`fmt` + `clippy -D warnings` + `test` green; 75 lib tests on perturbation-sim). Doctrine portion **unverified this session** — the new `core-first-transcode-doctrine.md` content is unread by this thread and may impact the odoo-rs ontology-first design when next loaded. + +## #513 perturbation-sim: inertia §0 promotion gate + CAKES/CHAODA + witness standing-wave + H ingest + +**Status:** MERGED 2026-06-16 20:27 UTC (merge commit `8a3e335b`), branch `claude/perturbation-sim-inertia-clam`. **+1009/-2 across 10 files**. Disjoint files from #512 (no `calibrate.rs`, no `basin_lambda2` body, no `TECH_DEBT.md`) by design. Four additive deliverables continuing the resilience arc after #511. + +**Added (1) — `inertia_buffer` §0 promotion gate (`33d66ca9`):** flips the anti-invention guardrail review for the one additive SoA member (operator sign-off 2026-06-16) and makes it real: +- `GuardrailVerdict { Proposed, RatifiedReuse }` + `INERTIA_PROMOTION`. **Verdict = RatifiedReuse**: `inertia_buffer` takes `ResidueEdge` slot `INERTIA_SLOT = 5`, reuses an existing value tenant, invents no new axis → **passes §0 by *reuse*, not waiver**. Topology stays the HHTL-OGAR GUID key; the buffer is one more value, orthogonal by the key/value split. +- `study_slot_assignments()`: the 6 members → ResidueEdge slots 0..6, collision-free. +- `buffer::inertia_buffer_column()`: the computed producer (per-bus `impulse_buffer`, normalized to [0,1], degenerate-safe). + +**Added (2) — Probe 1, CAKES + CHAODA over HHTL basins (`8d87ef0e`):** the CLAM-family similarity (attraction) / anomaly (repulsion) pair applied to grid resilience: +- HHTL = the family basin; **CAKES** (`cakes_neighbors`) = "who are my relatives"; **CHAODA** (`chaoda_scores` / `anomaly_ranking`) = per-basin kNN-distance anomaly = the fail-first compartment (`CHAODA_FLAG = 0.75` mirrors `ndarray::clam`'s flag). +- `resilience_basin_features`: per-basin `[λ₂, size, inertia]` rows (topology / scale / buffer — the three orthogonal axes). +- Self-contained CHAODA-lite; `ndarray::clam`'s full `ClamTree` ensemble is the gated production path (no local ndarray sibling here). Example `chaoda` flags the planted brittle block (basin 1.1.0, score 1.000). + +**Added (3) — Probe 2, witness arc as standing wave (`006d2322`, METHODS §11):** proves `particle == wave`. A witness arc walked hop-by-hop (`O(hops)` pointer-chase) equals its Walsh-pyramid evaluation via **Parseval** (`Hᵀ·H = N·I`): `⟨field, arc⟩ = (1/N)·⟨Ĥ·field, Ĥ·arc⟩`. +- `witness_particle` (the walk) / `field_spectrum` (transform once) / `witness_from_spectrum` (read many arcs, `O(N)` each — the amortization win) / `witness_wave` / `particle_equals_wave`. +- Example `witness` runs it on the inertia-buffer field; particle vs wave agree to **0.00e0**. The contract `witness_table` evaluator remains a separate gated step (SoA spine = additive-only behind iron rules). + +**Added (4) — Probe 3, per-bus inertia (H) ingest path (`723472a9`):** real H is not in PyPSA/OSM topology; this PR opens the ingest path so per-bus inertia becomes observable. Source: `crates/perturbation-sim/src/inertia_data.rs` (183 LOC, new) + `examples/inertia_ingest.rs` (66 LOC, new). [PR body truncated in fetch — full payload details TBC on next session.] + +**Locked:** (1) **§0 RatifiedReuse precedent** — additive SoA members can be ratified by *reuse of an existing value tenant* rather than a §0 waiver, when the topology stays in the HHTL-OGAR GUID key and the new member rides an existing tenant. (2) `INERTIA_SLOT = 5` carved in `ResidueEdge`. (3) Particle/wave duality via Parseval is the canonical pattern for witness-arc evaluation at scale (read-many amortization). + +**Deferred:** (1) Production CHAODA/CAKES path through `ndarray::clam::ClamTree` (gated on local ndarray sibling). (2) Contract-side `witness_table` evaluator (the SoA spine surface that consumes Probe-2's math). (3) Full inertia ingest API documentation (truncated PR body). + +**Docs:** standalone crate, no `.claude/board/*` updates landed in this PR (the doctrine work landed separately in #512). This entry + LATEST_STATE row + AGENT_LOG entry land in **the same commit** as the #512 entry above (retroactive batch hygiene). + +**Confidence (2026-06-16):** working — `fmt` + `clippy -D warnings` + `test` green on the standalone perturbation-sim crate; particle-equals-wave numeric agreement at machine epsilon; CHAODA-lite correctly flags the planted brittle block. + +## #511 perturbation-sim: substrate calibration (study as ground truth) + calibrated SoA member spec + +**Status:** MERGED 2026-06-16 19:01 UTC (merge commit `c3dddfc9`), branch `claude/perturbation-sim-calibrate-soa`. **Additive: +886/-0 across 9 files** — `examples/calibrate.rs` (new, 318 LOC), `src/columns.rs` (new, 177 LOC, spec only), `src/hhtl.rs` (new, 175 LOC), `examples/hhtl_grid.rs` (new, 81 LOC), `CLAM_CHAODA_FRAMING.md` (new, 75 LOC), small wires in `Cargo.toml`/`src/lib.rs`, plus `.claude/board/TECH_DEBT.md` (+32) and `.github/workflows/rust-test.yml` (+16). Does **NOT** touch the operator-locked `canonical_node`. + +**Added:** the substrate-calibration loop — use perturbation-sim's deterministic study as ground truth, encode its factor matrix through the SoA value tenants, certify with the `certification-officer` battery (**ICC(2,1)** = abs agreement source↔encoded · **Spearman** = rank · **Pearson** = linear readout · **Cronbach α** = *reproduce* the source α — NOT maximize; the study's α is low by design and "improving" it corrupts the construct). Significance at the **Jirak `n^(p/2−1)`** rate (per `I-NOISE-FLOOR-JIRAK`). + +**Findings (real ES core, members stored normalized):** +- All 5 contingency factors **certify by VALUE at 2-bit linear** (ICC ≥ 0.96) — the existing palette/turbovec tenants already suffice per value. The §10 "the statistics survive the encoding" claim is **confirmed**. +- **α preserved within Δ ≤ 0.02 at ≥4-bit**; the discriminant ρ wobbles ±0.15 at N=24 under coarse bins → read the cross-axis orthogonality at **≥6-bit** (store budget < read budget). +- **Self-correction (the run falsified two of my own guesses):** `d_lambda2`'s initial ICC=0 was **not** heavy-tail and **not** near-constant — it was a tiny-magnitude (~1e-7) underflow of ICC's variance guard; storing the member **normalized** fixes it (1.00 at 2-bit). Both wrong hypotheses retracted in the example headline. + +**Locked:** (1) the **5 factors map to existing tenants** (2-bit linear, normalized, read ≥6-bit) — no new SoA columns for the contingency axes; (2) the **one genuinely additive member is `inertia_buffer`** — the axis the resilience study (PR #509) measured *orthogonal* to topology (`Spearman(λ₂, buffer) ≈ 0`), which no existing connectivity column can carry. **Spec only** (`src/columns.rs`); promoting `inertia_buffer` into `lance-graph-contract` is a separate gated step (§0 anti-invention guardrail honoured). + +**Deferred:** (1) the `inertia_buffer` promotion into the contract crate (gated by §0 guardrail review). (2) helix's exact curve-placement — this calibration tests the shared value-quantization principle via a generic min-max/rank quantizer mapping the tenants' bit budgets; not helix-curve verbatim. (3) cross-axis orthogonality probe at ≥6-bit (the read-budget recommendation). + +**Docs:** `crates/perturbation-sim/CLAM_CHAODA_FRAMING.md` (new) + `.claude/board/TECH_DEBT.md` updated (+32 lines). This entry. **AGENT_LOG + LATEST_STATE updates owed** to this commit per board-hygiene rule (this is the retroactive cleanup window, not the same-commit landing). + +**Confidence (2026-06-16):** working — calibration battery green, 71 lib tests + clippy `-D warnings` + fmt clean on the perturbation-sim crate. + +## #510 surreal_container seam falsifier — SurrealMailboxView → VersionScheduler → KanbanMove (IN-direction only) + +**Status:** MERGED 2026-06-16 16:36 UTC (merge commit `0e6452c8`), branch `claude/sleepy-cori-aRK2x`. Additive: +125/-0, one new file (`crates/surreal_container/tests/scheduler_seam.rs`); zero source change; first integration-test file in the `surreal_container` crate. + +**Added:** five kill-condition-first tests pinning the doc-comment contract of the **IN-direction** of the surreal↔kanban↔scheduler wiring (`SurrealMailboxView → NextPhaseScheduler::on_version → KanbanMove`): +1. `full_rubicon_arc_lowers_to_legal_successors` — walks Planning→CognitiveWork→Evaluation→Commit + Plan→Planning; asserts every forward tick lands on a `can_transition_to == true` edge. +2. `absorbing_columns_schedule_no_move` — `Commit`/`Prune` MUST schedule no advance (closes the non-terminating-lifecycle bug). +3. `libet_anchor_only_on_sigma_commit_crossing` — the `-550_000µs` readiness anchor MUST appear at the Planning→CognitiveWork Σ-commit crossing and nowhere else. +4. `lowering_is_deterministic` — same `(view, version, exec)` → identical `KanbanMove` (no hidden state). +5. `exec_target_rides_onto_the_move` — `ExecTarget` backend selector survives lowering. + +**Locked:** the IN-direction contract is now testable end-to-end against the real `SurrealMailboxView` (not just the in-crate `FakeView`). The kill-condition framing is the **template** the planner-emit half (OUT-direction, D-MBX-A6-P3) will be verified against once it lands. + +**Deferred (explicit in PR body):** the **OUT-direction = planner-emit `KanbanMove`** (the `CognitiveCycle` sequencer + §9 LOCKED decisions from #496). PR body: *"this does not touch the contested planner-emit half … which is the planner-owning session's lane."* → D-MBX-A6-P3 remains **the next unblock** for closing the loop. This PR proves the loop's downstream half; the upstream half is still hand-rolled. + +**Docs:** AGENT_LOG + LATEST_STATE updated (this commit). No new knowledge doc. + +**Confidence (2026-06-16):** working — IN-direction now has 5 contract-pinning tests; OUT-direction unchanged. + ## #498 GUID decode→read-mode keystone + helix Signed360 right-size + OCR→NodeRow transcode **Status:** OPEN 2026-06-15 (branch `claude/wonderful-hawking-lodtql`, 8 commits post-#496). In review (CodeRabbit + codex). **NOTE:** this entry documents the helix / keystone / OCR / causal-edge work that CodeRabbit on PR #498 mis-attributed to #496 — those changes are **#498's, not #496's**. #496 shipped only ValueSchema presets + the reference plan (its immutable entry below correctly shows the pre-right-size 154/98 B budgets).