Skip to content

Commit 34649df

Browse files
committed
docs(planner): fold 3-hardener verdicts (§9) + §0 anti-invention guardrail
3 brutally-honest agents (PP-13 HOLD / PP-15 CATCH-LATENT / PP-16 READY-TO-DISPATCH) hardened the plan; all fixes are spec-text, no architectural rewrite. New §9 ledger: 5 LOCKED decisions (emit channels separate-not-derived; cycle() stays inherent for object-safety; seam #2 read is closure-injected; dual-RungLevel mirror-don't-duplicate; P-RUNG-ROUNDTRIP quarters-vs-thirds) + latent boundary fixes (THREE PlanResult; MailboxId sentinel; newtype the address u64s) + P2s + sub-line drift (incl. "#495 rides #496" -> branch-only). New §0 ANTI-INVENTION GUARDRAIL (read-first): no agent invents new skewed SoA properties; the 9 ValueTenants + 4 BindSpace columns are closed; the §8 7-item ledger is the MAX scope; specialisation is opt-in (mint a class). Enforced by dto-soa/iron-rule savants + the 3 hardeners. Inline fixes: emit channels separate-not-derived (was the I-LEGACY trap); §4 "closes seam #2" -> closure-injected. AGENT_LOG prepended. https://claude.ai/code/session_01D2WSmezQBNC3bUdHuGfGmo
1 parent b37fbbc commit 34649df

2 files changed

Lines changed: 52 additions & 4 deletions

File tree

.claude/board/AGENT_LOG.md

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,11 @@
1+
## 2026-06-15 — integrated-cognitive-planner-v1: 3-hardener verdicts folded (§9) + §0 anti-invention guardrail
2+
3+
**Main thread (Opus 4.8 1M) + 3 Opus brutal hardeners** (PP-13 brutally-honest-tester / PP-15 baton-handoff-auditor / PP-16 preflight-drift-auditor), all pinned to the plan by `file:line`. Verdicts: **HOLD / CATCH-LATENT / READY-TO-DISPATCH** — all fixes spec-text, no architectural rewrite; all three confirmed the grounding + dependency-wall claims + measure-first ratio.
4+
5+
**Folded into the plan:** new **§9 hardening ledger** (5 LOCKED decisions + latent boundary fixes + P2s + sub-line drift) and new **§0 ANTI-INVENTION GUARDRAIL** (operator msg: *"prevent any agents telling us to invent additional skewed properties in the SoA when we already have a lot of good and well tested ideas"*) — read-first, enforced by dto-soa/iron-rule savants + the 3 hardeners. Inline fixes: emit channels are SEPARATE-not-derived (was the I-LEGACY trap); §4 "closes seam #2" → closure-injected (planner can't reach async `at_version`). **Biggest catches:** (1) `cycle()` must stay INHERENT not a trait method (object-safety, would break n8n-rs/crewai-rust `Box<dyn>`); (2) DUAL `RungLevel` — contract bare enum vs thinking_engine `cognitive_stack::RungLevel` which already has `from_u8`+`should_elevate`, MIRROR don't duplicate (PP-16 top catch = the §0 guardrail in action); (3) THREE `PlanResult` (incl arigraph/language.rs:34); (4) `MailboxId` has no safe sentinel; (5) "#495 rides #496" mis-attributed — ValueSchema is branch-only post-#495.
6+
7+
**Next:** scope the tesseract-rs transcode POC (first consumer against the now-Full slab) → open #496 carrying plan + ValueSchema + FULL-default + guardrail + hardening.
8+
19
## 2026-06-15 — ValueSchema POC default: `ClassView::value_schema` flipped Bootstrap→Full (operator decision (a))
210

311
**Main thread (Opus 4.8 1M).** Operator: *"(a) flip the blanket default to Full (all unconfigured classes → Full) / any consumer that needs to save memory can create [its] smaller settings / any consumer that needs more data and more efficiency can afford a separate class"* + *"prevent any agents telling us to invent additional skewed properties in the SoA when we already have a lot of good and well tested ideas"* + consumers *woa-rs / medcare-rs / q2 / tesseract-rs (favourite) — transcode that creates a testable POC*.

.claude/plans/integrated-cognitive-planner-v1.md

Lines changed: 44 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,26 @@ T1/T2 + the 7-item additive new-code ledger), §2.1 (ExecTarget routing), §3.1
2323
inline: `cache/convergence.rs` is wired+tested NOT stubbed (seam #5); emit cutover is
2424
5 sites incl. the contract twin (seam #1); the dep-wall fold is A-then-B NOT either/or
2525
(seam #2); `documentid`=`dn_hash` NOT `local_key` (§3); the `NiblePath`↔prefix bijection
26-
overflows 16-nibble `MAX_DEPTH` and must be tier-structured (§3). Next: 3 brutally-honest
27-
hardeners bite §8 first.
26+
overflows 16-nibble `MAX_DEPTH` and must be tier-structured (§3).
27+
28+
**Hardening pass (2026-06-15):** 3 brutally-honest agents (PP-13 HOLD / PP-15 CATCH-LATENT
29+
/ PP-16 READY-TO-DISPATCH) — verdicts + 5 LOCKED decisions + the latent boundary fixes are
30+
in **§9**, and the operator's anti-invention guardrail is now **§0 (READ FIRST)**. Net: the
31+
plan is dispatch-ready once §9's spec-text fixes land in the §8 ledger; no architectural
32+
rewrite. Biggest catches: emit channels are separate-not-derived; `cycle()` must stay inherent
33+
(object-safety); seam #2's read is closure-injected (planner can't reach async `at_version`);
34+
the DUAL `RungLevel` must not be re-derived; "#495 rides #496" is mis-attributed (branch-only).
35+
36+
---
37+
38+
## §0 — ANTI-INVENTION GUARDRAIL (operator-locked 2026-06-15, READ FIRST)
39+
40+
**No agent invents new skewed SoA properties. We already have good, well-tested ideas; transcodes map ONTO them, never extend them.** For any work targeting this plan:
41+
- The value slab is the **9 `ValueTenant`s** (`canonical_node.rs`); the node is **`key|edges|value`** (512 B, locked CANON); the **four BindSpace columns** (FingerprintColumns / QualiaColumn / MetaColumn / EdgeColumn) are **closed**. New capability lands as a **new column / new class**, never a new layer / struct / skewed field (AGI-as-SoA PR #223; RESERVE-don't-reclaim CANON).
42+
- Before reaching for any new carrier, apply I-VSA-IDENTITIES **Test-0 (register laziness):** if the thing has a name / enum / id, use the register (HashMap / enum / class) — NOT a fancy property.
43+
- The **§8 7-item additive ledger is the MAX scope.** Anything beyond it — a new tenant, a new column, a new struct, a "skewed" field — requires explicit operator sign-off. An agent that wants one **STOPS and surfaces it**, it does not implement it.
44+
- Specialisation is **opt-IN** (`TD-VALUESCHEMA-FULL-POC-DEFAULT`: the POC FULL default): a consumer mints a class to go smaller/denser; it never adds a property to the shared slab.
45+
- Enforced by `dto-soa-savant` + `iron-rule-savant` (epiphany council) and the 3 pre-merge hardeners (§9). PP-16's top catch — "don't duplicate `should_elevate`, it already ships in thinking-engine" — is this guardrail in action.
2846

2947
---
3048

@@ -104,7 +122,7 @@ hardeners bite §8 first.
104122

105123
## §2 — THE 6 SEAMS (gap → tracking → FOLD `file:line`)
106124

107-
1. **Planner emits `KanbanMove`** — gap: `emitted_edges` always empty; planner imports none of `kanban`/`soa_view`. Tracking: **D-MBX-A6-P3**. FOLD (S2): the inputs ALREADY exist — `StyleStrategy::reliability_of` (style_strategy.rs:168) already computes the settled `ThoughtCtx` but discards all but `confidence` (:178); refactor to `settle() → ThoughtCtx` keeping `dissonance` (recipe_kernels.rs:31) + `rung` (:37). Adapter `thoughtctx_to_kanban_move` (planner-side, pure): `exec` per §2.1; `to` from `tc.gate_state()` (recipe_kernels.rs:58, expose it) vs `KanbanColumn::can_transition_to`; `libet_offset_us=-550_000` iff `to==CognitiveWork`; `witness_chain_position=0` (no arc yet). **Cutover = 5 sites, NOT 4: lib.rs:123/216/254/312 + api.rs:190 + the CONTRACT TWIN plan.rs:44** (skipping it diverges the `PlannerContract` trait). Add `emitted_moves: Vec<KanbanMove>` beside `emitted_edges` (legacy derived from it) per I-LEGACY-API-FEATURE-GATED → resolves OQ-11.7. **Missing input: `KanbanMove.mailbox` (kanban.rs:114) — the planner has NO mailbox; add `mailbox: Option<MailboxId>` to `PlanContext` (traits.rs:69), caller-supplied, sentinel default.**
125+
1. **Planner emits `KanbanMove`** — gap: `emitted_edges` always empty; planner imports none of `kanban`/`soa_view`. Tracking: **D-MBX-A6-P3**. FOLD (S2): the inputs ALREADY exist — `StyleStrategy::reliability_of` (style_strategy.rs:168) already computes the settled `ThoughtCtx` but discards all but `confidence` (:178); refactor to `settle() → ThoughtCtx` keeping `dissonance` (recipe_kernels.rs:31) + `rung` (:37). Adapter `thoughtctx_to_kanban_move` (planner-side, pure): `exec` per §2.1; `to` from `tc.gate_state()` (recipe_kernels.rs:58, expose it) vs `KanbanColumn::can_transition_to`; `libet_offset_us=-550_000` iff `to==CognitiveWork`; `witness_chain_position=0` (no arc yet). **Cutover = 5 sites, NOT 4: lib.rs:123/216/254/312 + api.rs:190 + the CONTRACT TWIN plan.rs:44** (skipping it diverges the `PlannerContract` trait). Add `emitted_moves: Vec<KanbanMove>` beside `emitted_edges` as a **SEPARATE channel, NOT derived** (PP-13/PP-15 §9: `emitted_edges` keeps carrying CausalEdge64/EpisodicEdges64 words from the collapse-gate path; there is NO `KanbanMove→u64` cast — inventing one is the I-LEGACY trap) → resolves OQ-11.7. **Missing input: `KanbanMove.mailbox` (kanban.rs:114) — the planner has NO mailbox; add `mailbox: Option<MailboxId>` to `PlanContext` (traits.rs:69), caller-supplied, sentinel default.**
108126
2. **temporal.rs unconsumed + dep-wall** — gap: `deinterlace`/`QueryReference` 0 callers; planner ⊥ lance-core. FOLD (S4 — two layers, BOTH required, ordered, NOT either/or): **(A)** relocate the *policy* `temporal.rs` → zero-dep `contract::temporal` (`classify`/`deinterlace`/`EpistemicMode` name no lance/arrow/async; `DeinterlaceRow` is the airgap, mirroring scheduler.rs:31's `MailboxSoaView`) so BOTH planner+core `use contract::temporal::*`; **(B)** add `lance-graph/src/graph/temporal_read.rs` — the ONLY site joining `VersionedGraph::at_version(T)` (versioned.rs:419) → `deinterlace` (temporal.rs:301), in core where both are nameable. A-alone never feeds real rows to `deinterlace`; B-alone can't share `classify` with planner. Add ONE field `as_of: QueryReference` to `PlanContext` (traits.rs:69) — NOT two loose `ref_version`/`rung` (rung lives inside `QueryReference`, temporal.rs:121, drives `mode` via `for_rung`).
109127
3. **Loop only on jolly** — gap: `MailboxSoaOwner for MailboxSoA` is +149 LOC on `463d71bd`, unmerged. FOLD: cherry-pick `mailbox_soa.rs:349-460` + test `:648` (purely additive, traits already on main).
110128
4. **Rung inert** — gap: `RungLevel::Surface` hardcoded (orchestration_impl.rs:151, api.rs:178, pipeline.rs:593(test fixture — leave), thinking/mod.rs:86); `rung_delta` imported never called; Staunen/Wisdom orphaned. **Root cause (S3): `RungLevel` has NO constructor** — no `from_ordinal`/`shift`/`from_entropy` (cognitive_shader.rs:157 is a bare enum), so every site CAN'T do anything but default `Surface`. FOLD (S3): (1) add `RungLevel::{from_ordinal, shift(i8), from_entropy(f32)}` after cognitive_shader.rs:169 + a `PlannerContract::rung_for(&self,&SituationInput)->RungLevel` trait method (default Surface, mirrors `gate_check`, so the contract itself KNOWS the rung). (2) bridge the 3-level `EntropyRung` (ndarray entropy_ladder.rs:64) ↔ 10-level `RungLevel` via `from_entropy(h)=from_ordinal(round((1−h)·9))` — bare `f32`, NO ndarray type crosses the wall (scalar `h` is the wire, like seam #2's `QueryReference`). (3) drive the 2 PRODUCTION sites (thinking/mod.rs:86 has `mul` in scope; orchestration_impl.rs:151): `rung = from_entropy(nars_entropy(f,c)).shift(rung_delta(emergence,coherence))`; rises on sustained `mul::GateDecision::Block`; floored by a live `WisdomMarker` (fresh Epiphany→low rung, decayed→high). (4) bind `ShaderDispatch.rung = think_ctx.rung` (was Surface default, cognitive_shader.rs:219). NB the two `GateDecision` types: planner-contract driver = `mul::GateDecision::Block` (mul.rs:150); `collapse_gate::BLOCK` (collapse_gate.rs:79) is the shader-side echo.
@@ -170,7 +188,7 @@ A causal arc = stable anchor + append-only adjacency. **Anchor:** `local_key` (c
170188
| meta awareness | `mul::MulAssessment` (DK/trust/compass) | Evaluation |
171189
| abduction | `nars::InferenceType::Abduction` | Evaluation→{Commit\|Plan\|Prune} |
172190

173-
Spiral: abduction → `KanbanColumn::Plan` → re-deliberate → next fanout (Peirce abductive-inductive-deductive loop, gated by EpiphanyDetector synthesis + MUL anti-Mount-Stupid). **Add = a `CognitiveCycle` sequencer** (method on the integrated Planner) that drives the 8 steps through the kanban phases, setting `ThinkingContext.inference_type` per step. Everything it calls EXISTS; the sequencer is the only new code — and it is the consumer that closes seams #1 (emit per phase), #2 (as-of read per step), #4 (rung drive), #5 (think delegation). **The spiral re-entry is a GROUNDED legal Rubicon edge (S1):** `KanbanColumn::Plan.next_phases() == &[Planning]` (kanban.rs:95) and `Plan.is_absorbing() == false` (kanban.rs:71) — `Plan → Planning` already compiles; P-CYCLE-SPIRAL is its only falsifier.
191+
Spiral: abduction → `KanbanColumn::Plan` → re-deliberate → next fanout (Peirce abductive-inductive-deductive loop, gated by EpiphanyDetector synthesis + MUL anti-Mount-Stupid). **Add = a `CognitiveCycle` sequencer** (method on the integrated Planner) that drives the 8 steps through the kanban phases, setting `ThinkingContext.inference_type` per step. Everything it calls EXISTS; the sequencer is the only new code — and it is the consumer that closes seams #1 (emit per phase), #2 (as-of read per step — but the read is CLOSURE-INJECTED, see §9: the planner can't reach the async `at_version` in core), #4 (rung drive), #5 (think delegation). **The spiral re-entry is a GROUNDED legal Rubicon edge (S1):** `KanbanColumn::Plan.next_phases() == &[Planning]` (kanban.rs:95) and `Plan.is_absorbing() == false` (kanban.rs:71) — `Plan → Planning` already compiles; P-CYCLE-SPIRAL is its only falsifier.
174192

175193
**Fields vs methods (the load-bearing call, S1):** the sequencer adds exactly THREE state fields to `PlannerAwareness` (lib.rs:99) — `phase: KanbanColumn` (default Planning), `checklist: Checklist` (built by the existing `mul::escalation::boot_checklist()`, mul/escalation.rs:36), `epiphany: EpiphanyDetector` (escalation.rs:213). `mul`/`thinking`/`elevation`/`cache` stay STATELESS module calls (lib.rs:177/183 construct-and-drop) — they do NOT become fields. The 8 steps are `&mut self` methods; the public entry is one new `cycle(&mut self, query, situation) -> Result<CycleOutcome, PlanError>` ALONGSIDE `plan_full` (lib.rs:171) / `plan_auto` (lib.rs:264), both UNCHANGED.
176194

@@ -259,3 +277,25 @@ S2: `ThinkingContext.rung` (plan.rs:22) ↔ `ShaderDispatch.rung` (cognitive_sha
259277
`PlanResult.emitted_edges` (S1: same field/type/doc in both `PlanResult` twins, awaiting the cycle); `dn_hash` dedup (S5: Pinpoint's lesson already shipped at spo_bridge.rs:127); `QueryReference`'s `Copy` as-of half (S4: snapshot-isolation free). The recurring shape: the substrate was built anticipating these seams; the work is WIRING existing carriers, not building new ones. This is the doc's thesis (~90% exists) confirmed three independent ways.
260278

261279
**The additive new-code ledger (everything else is wiring):** (1) the `CognitiveCycle` sequencer (T1/T2); (2) `RungLevel::{from_ordinal,shift,from_entropy}` + `PlannerContract::rung_for` (C2); (3) the `temporal.rs` A→contract relocation + B core `temporal_read` join (seam #2); (4) `ScopedReference` + its `admits`/`retrieve_arc` methods (§3); (5) `MarkingRow: DeinterlaceRow` for Bardioc (§3); (6) the tier-structured `NiblePath::from_guid_prefix` bijection (§3, the width-overflow fix); (7) optional `const fn ExecTarget::can_drive` (seam #6 hardening, OQ-11.8). Each is small, additive, and has a falsifying probe in §5.
280+
281+
---
282+
283+
## §9 — HARDENING VERDICTS (3 brutally-honest agents, 2026-06-15)
284+
285+
PP-13 brutally-honest-tester → **HOLD** (3 P1, all spec-text fixes). PP-15 baton-handoff-auditor → **CATCH-LATENT** (4 latent boundary drops). PP-16 preflight-drift-auditor → **READY-TO-DISPATCH** (2 spawn-caution addenda). All three confirmed the load-bearing `file:line` grounding is real, the dependency-wall claims hold, and the measure-first ratio (9 probes / 7 ledger items) is honest. The fixes are spec-text, NOT architectural rewrites.
286+
287+
**LOCKED decisions (fold into the §8 ledger before any worker dispatch):**
288+
1. **Emit channels are SEPARATE, neither derived (PP-13 P1-1 + PP-15 B2).** `emitted_edges: Vec<u64>` (CausalEdge64/EpisodicEdges64 words, collapse-gate path) and `emitted_moves: Vec<KanbanMove>` (16-B lifecycle records) are independent — NO `KanbanMove→u64` cast exists; inventing one is the I-LEGACY trap. Also note `ShaderBus.emitted_edges` is `[u64;8]` not `Vec` (the seam-#5 lowering crosses array→Vec).
289+
2. **`cycle()` is an INHERENT method on `PlannerAwareness`, NEVER a trait method (PP-13 P1-3).** The `impl Fn` closure-injection arg is not object-safe → must stay OFF `PlannerContract`/`OrchestrationBridge` (the `Box<dyn>` consumers: n8n-rs, crewai-rust). Only `rung_for` goes on the trait. The `run_convergence` precedent (convergence.rs:223) is a free function — its object-safety doesn't transfer to a trait method.
290+
3. **Seam #2's as-of read is CLOSURE-INJECTED too (PP-15 B8).** The planner cannot reach `at_version` (async, in lance-graph core, behind the anti-circular wall) — so the sequencer does NOT close seam #2 by itself; the temporal read is closure-injected exactly like the think-step (T1), OR core pre-deinterlaces and hands rows over.
291+
4. **DUAL `RungLevel` — do NOT duplicate (PP-16 CoC-1, SPAWN-CAUTION — paste into the rung-seam worker prompt):** the contract `cognitive_shader::RungLevel` (cognitive_shader.rs:157) is the bare-enum target for the new constructors; `thinking_engine::cognitive_stack::RungLevel` (cognitive_stack.rs:264) ALREADY has `from_u8` + `should_elevate(consecutive_blocks, free_energy, cascade_depth)` (:278-314) — MIRROR its shape, never re-derive. (The plan disambiguates the dual `GateDecision` + dual `ThinkingContext` but was silent on the dual `RungLevel` — and seam #4 sits exactly on it.)
292+
5. **P-RUNG-ROUNDTRIP is ill-posed as stated (PP-13 P1-2).** `entropy_class` quantizes at QUARTERS, `EntropyRung` bands at THIRDS — boundaries don't nest (counterexample: `class(0.3)==class(0.4)==1` straddle two bands). Restate as a one-band-tolerance probe OR require a thirds-banded 2-bit quantizer. Also `ThoughtCtx.rung` is `1..=9` while `RungLevel` is `0..9``from_ordinal` must clamp the off-by-one.
293+
294+
**Latent boundary fixes (PP-15, pin before D-MBX-A6-P3 impl):**
295+
- **THREE `PlanResult`** (B2): inherent lib.rs:107, contract plan.rs:30 (NO live producer today — only nominally twinned), AND `arigraph/language.rs:34`. Name the 3-way collision; specify the inherent→contract adapter.
296+
- **`MailboxId` sentinel (B4):** the type is `collapse_gate.rs:121` (NOT kanban.rs:114 — that's the field; citation fix). `0` is a real mailbox, `u32::MAX` is already overloaded (#386) → do NOT collapse `Option<MailboxId>` to a magic value; emit NO move without a real mailbox (matches StyleStrategy's no-theatre stance).
297+
- **Newtype the address u64s (B7):** `dn_hash` + `local_key` are both bare `u64` → wrap `DnHash(u64)`/`LocalKey(u64)` at the `MarkingRow`/addressing boundary; cite the pre-existing `StructuralSignature` ~50% collision (`TECH_DEBT.md:134`) in §3 (it's not a clean third hash).
298+
299+
**P2 / nits:** `ExecTarget::can_drive` must enumerate all 24 (exec×column) cells (default-allow + SurrealQl deny-list); `MarkingRow` predicate should be an interned id, not `String` (the `&str` carrier forces a heap alloc per row); split P-ARC-PROMOTE-IS-REVISION into the in-tree half (eviction identity) + the DemotionSink-gated half.
300+
301+
**Sub-line drift to fix (PP-16, low-impact):** `ThinkingContext.rung` is plan.rs:**23** (not :22, cited ~5×); `try_advance_phase` soa_view.rs:**128**; `NextPhaseScheduler::on_version` scheduler.rs:**76**; `QueryReference::at` temporal.rs:**135**; `convergence.rs` has **9 tests, mod at :246, span :249-437** (not "8, :363-436"). And **"#495 rides #496" is mis-attributed (DRIFT-6, SPAWN-CAUTION):** `ValueSchema`/`ValueTenant`/`EdgeCodecFlavor` are POST-#495 BRANCH commits (`4e3496ab` + `920671d2`), present on this branch but NOT on origin/main, and NOT part of the already-merged #495**target the branch tree; do not verify these against origin/main** (a worker who does gets a false negative and thrashes).

0 commit comments

Comments
 (0)