Skip to content

Commit eb7afe3

Browse files
committed
plan: survey the BatchWriter arc, the Rubicon seam and the hot-plug spine
Operator named five loose ends. Surveyed, and four of them turn out to be built ends that do not meet rather than things to build. BatchWriter (#879, #908-912, #949): #912 landed the sole owned Lance writer, so Dataset::write is real at cycle_sink.rs:675/710 and this plan's own "no Dataset::write" was wrong when written. batch_writer.rs's status note claiming cast() has zero production call sites is stale too — three today, all production: mailbox_soa (the owner), owner_adapter (write-on-behalf), cycle_driver (P4a drain). The other ~17 .cast( hits are ractor ActorRef::cast and would have inflated the count. What IS unwired is the observation leg: deinterlace has zero production callers, every hit a doc comment. So G-C splits — G-C1 connect OGAR's bytes to the writer that already exists, G-C2 wire the durability read. A write nothing reads back is not yet a loop. revision.rs is Heckhausen's last phase (postactional evaluation), and that makes it the same gap seen from the other end: the court of appeal has no write-back because the durable read that would tell it what happened is missing. The Rubicon model is genuinely wired otherwise — five phases in cognitive-compiler, rubicon_witness.rs, D-ACR-8. The kanban seam is NOT unwired: lance-graph-ogar is a workspace member depending on both sides by design, and recipe_vocab.rs already carries the 34 NARS recipes as ogar-loco ops with the kanban census as the awareness surface. The palette arc's constraint is that it must not ride the deprecated substrate the recent PRs surfaced — Binary16K and the singleton BindSpace are superseded, and temporal.rs's version-range read is what replaced them, which lands on G-C2 again. And the remediation is hot-plug, not a Cargo edge: socket in the zero-dep contract, authority production at lance-graph-ogar lib.rs:524, consumer declares one HotPlug const and activates. The classid is the join key — plug and play mints the classid, the classid mints ogar-vocab, which triggers the loco vocabulary. All eight existing declarations are test fixtures and the planner has none. Three claims in this document were drafted false and corrected before commit by re-checking citations. Recorded, including that a fully qualified impl made a negative grep read as "unimplemented" — a negative grep is a claim about the pattern, not about the tree. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01X6y3drwKSE2zSgoexheLFX
1 parent b24a7f6 commit eb7afe3

2 files changed

Lines changed: 242 additions & 4 deletions

File tree

‎.claude/board/SUPERSESSION-INDEX.md‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
## What this table says
1515

1616
**`BindSpace` is the shape of the problem.** Marked RETIRE, and simultaneously the
17-
most-referenced symbol here: **68 crate files, 47 plans, 41 of them blind.**
17+
most-referenced symbol here: **68 crate files, 48 plans, 42 of them blind.**
1818
That is a programme, not a cleanup.
1919

2020
**`GateState` is the sharpest case: 1 plan names it and *every one* is blind.**
@@ -60,11 +60,11 @@ coverage instead.
6060
| `GateState` | REPURPOSE | — | 14 | 1 | 1 |
6161
| `MergeMode` | REPURPOSE | — | 8 | 14 | 13 |
6262
| `ResonanceDto` | REPURPOSE | `PerturbationDto` | 2 | 12 | 7 |
63-
| `BindSpace` | RETIRE | — | 68 | 47 | 41 |
63+
| `BindSpace` | RETIRE | — | 68 | 48 | 42 |
6464
| `CollapseGateEmission` | RETIRE | — | 5 | 14 | 12 |
6565
| `ThinkingStyle` | RETIRE-toward-contract | — | 52 | 28 | 24 |
6666

67-
## Table 2 — plans naming a ruled symbol without citing the ruling (75)
67+
## Table 2 — plans naming a ruled symbol without citing the ruling (76)
6868

6969
Route is **mechanical triage, not a verdict**: `ARCHIVE?` = the plan's own status says
7070
it shipped; `RESCOPE` = it targets a symbol marked RETIRE; `READ` = neither signal fires
@@ -141,6 +141,7 @@ a licence to act on it.
141141
| **RESCOPE** | `entropy-closure-causal-ground-v1` | `ThinkingStyle` | PROPOSAL (measured, unbuilt) — 2026-08-26. P | 3/8 |
142142
| **RESCOPE** | `foundry-consumer-parity-v1` | `BindSpace` | Active | 0/0 |
143143
| **RESCOPE** | `foundry-roadmap-unified-smb-medcare-v1` | `BindSpace` | Active | 0/0 |
144+
| **RESCOPE** | `lance-graph-as-the-modelgraph-v1` | `BindSpace` | PROPOSAL (operator-set endgame, 2026-09-16). | 4/4 |
144145
| **RESCOPE** | `lf-integration-mapping-v1` | `BindSpace` | Active (2026-04-25) | 0/0 |
145146
| **RESCOPE** | `lite-unified-surrealql-lance-v1` | `BindSpace` | CONJECTURE / design. **Test via feature gate | 0/0 |
146147
| **RESCOPE** | `ogit-cascade-supabase-callcenter-v1` | `BindSpace` | plan, not implementation. | 0/16 |
@@ -156,6 +157,6 @@ a licence to act on it.
156157
| **RESCOPE** | `unified-soa-rubikon-integration-v1` | `BindSpace` | — | 8/8 |
157158

158159
- **ARCHIVE?**: 0
159-
- **RESCOPE**: 55
160+
- **RESCOPE**: 56
160161
- **READ**: 20
161162
- ruled symbols tracked: 14

‎.claude/plans/lance-graph-as-the-modelgraph-v1.md‎

Lines changed: 237 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,3 +305,240 @@ publish one version, written by the mailbox that owns those rows." The
305305
falsifier follows directly — a W3 implementation that introduces a message, an
306306
ack, a tick, or a per-owner `advance()` RPC has re-created the deleted shape and
307307
fails on that ground regardless of whether the bytes land.
308+
309+
---
310+
311+
## ⊘ SECOND CORRECTION — G-C IS NOT "no write". The writer EXISTS; the READ is the gap.
312+
313+
Operator, 2026-09-16: *"lance-graph 879 + 908..912 949 (?) started to migrate it
314+
accordingly to batchwriter."* Followed. The arc, and what it left:
315+
316+
| PR | landed |
317+
|---|---|
318+
| #879 | D-MBX-A6-P4 cycle loop-closure driver — sparse seal/apply + MUL-gate thought seam |
319+
| #908-910 | boot config at `.config/<repo>/config.yaml`; `soa_config` unknown-key rejection + classid doc corrections |
320+
| #911 | `graph/cycle_sink` — the concrete Lance-backed `WalSink` |
321+
| **#912** | **Phase A: artifact-backed commits + THE SOLE OWNED LANCE WRITER** (supersedes #911's contract) |
322+
| #949 | D-WXS-2a half A — row-major vs Morton KILL fires, no code change |
323+
324+
**So `Dataset::write` is real and in-tree**: `crates/lance-graph/src/graph/cycle_sink.rs:675`
325+
and `:710`, under a module doc saying the I/O *"is INTERNAL to this one writer."*
326+
The plan's G-C above — *"no `Dataset::write`"* — was **wrong when written.**
327+
328+
### `batch_writer.rs`'s own status note is ALSO stale
329+
330+
It carries, dated 2026-07-27: *"`cast()` itself has **zero production call
331+
sites**."* Measured 2026-09-16 — **three**, all production, none in `#[cfg(test)]`:
332+
333+
| site | role |
334+
|---|---|
335+
| `cognitive-shader-driver/src/mailbox_soa.rs:764` | the **owner** casting its own moves (`writer: &mut BatchWriter<P>` in a production signature) |
336+
| `lance-graph-planner/src/owner_adapter.rs:100` | **write-on-behalf** (`//! write-on-behalf to the BatchWriter`) |
337+
| `lance-graph-supervisor/src/cycle_driver.rs:407` | **P4a (drain)** — *"Map the fleet's staged `BatchWriter` casts into `SweepSlot`s"* |
338+
339+
(The ~17 other `.cast(` hits are ractor `ActorRef::cast(SupervisorMsg::…)` — a
340+
different method entirely. Counting them would have inflated this.)
341+
342+
### What IS still unwired — and it is the observation leg, not the write
343+
344+
**`deinterlace` has zero production callers.** Every hit outside `temporal.rs`
345+
is a doc comment; `witness_fabric.rs:510` cites the same 2026-07-27 note. So:
346+
347+
```
348+
intent staged (BatchWriter::cast) ✓ wired, 3 sites
349+
bytes written (cycle_sink Dataset::write) ✓ exists, #912
350+
durability READ (deinterlace) ✗ ZERO production callers
351+
OGAR bytes → that writer ✗ lance_sink still stops at as_le_bytes()
352+
```
353+
354+
**G-C therefore splits, and neither half is what the plan said:**
355+
356+
- **G-C1 — connect `ogar-from-ruff::lance_sink` to the writer that already
357+
exists.** Smaller than "build a write": both ends are built and they do not
358+
meet.
359+
- **G-C2 — wire the durability read.** `batch_writer.rs` states the ruling it
360+
obeys (`E-ACK-ELIMINATED-1`, no confirmation bookkeeping — durability is the
361+
row's own `LanceVersion` read through `temporal`) and then says that read has
362+
no production implementor. **A write nothing reads back is not yet a loop.**
363+
364+
> **Third stale blocker this session.** `lance_sink`'s "needs the ractor
365+
> runtime", `batch_writer`'s "zero call sites", and this plan's own "no
366+
> `Dataset::write`" were all true once and all false when I quoted them. The
367+
> pattern is specific enough to name: **a STATUS note dated months back is a
368+
> measurement, and this workspace's own rule is that a measurement without a
369+
> re-run is an anecdote.** Re-measure before citing — three for three.
370+
371+
## The Rubicon connection — why `revision.rs` and the missing read are ONE gap
372+
373+
Operator: *"ogar-loco and revision.rs are 2 of the loose ends"* … *"revision.rs
374+
is supposed to be the rubikon heckhausen last phase."*
375+
376+
Heckhausen's Rubicon model runs **predecisional → preactional → actional →
377+
postactional**, and the last phase is *evaluating the achieved outcome against
378+
the original goal*. The model is genuinely wired here — `cognitive-compiler/
379+
src/lib.rs:18` carries *"The five Rubicon phases (Heckhausen). A trace records
380+
which phase produced…"*, `lance-graph-contract/src/rubicon_witness.rs` maps the
381+
phases and asks *"why a focus mask can falsify it"*, and `lib.rs:167` names
382+
**D-ACR-8 — reading the Heckhausen crossing from the focus of attention**.
383+
384+
`revision.rs` (in the CONTRACT, not the planner) says of itself:
385+
386+
> *"models revision, not truth persistence, and still has **no production write
387+
> capability** — the output types stop before actual-world mutation by design"*,
388+
> closing a gap where `entropy-closure-causal-ground-v1` (#1057) names revision
389+
> *"the only write-back"* and *"the court of appeal."*
390+
391+
**These are the same gap seen from two ends.** The postactional phase cannot
392+
evaluate an outcome it cannot observe; observation is `deinterlace`; the court
393+
of appeal has no write-back because the durable read that would tell it what
394+
actually happened is unwired. G-C2 is therefore not plumbing — **it is what
395+
closes the last Rubicon phase**, and "revision has no write capability" is a
396+
symptom rather than an independent item.
397+
398+
## The kanban seam — planner ↔ ogar-loco ↔ ogar-r2il
399+
400+
Operator: *"lance-graph-planner <> ogar-loco <> ogar-r2il has a lot of gaps to
401+
wire the kanban."* Measured — and the gap is NARROWER and more specific than
402+
"unwired".
403+
404+
> ⊘ **I drafted "unwired in both directions" and it was FALSE.** Caught before
405+
> commit by re-checking a citation I had just written, which is the same
406+
> re-measure rule this document states three paragraphs up. The bridge crate
407+
> EXISTS.
408+
409+
**`lance-graph-ogar` IS the seam, and it is built.** A workspace member
410+
(`Cargo.toml:96`) that depends on BOTH sides — `lance-graph-contract` by path
411+
(`:86`, `:159`) and `ogar-loco` by git (`:137`) — for the stated reason that
412+
neither may import the other:
413+
414+
> `recipe_vocab.rs` — *"the 34 NARS recipes as `ogar-loco` ops above
415+
> `DOMAIN_FLOOR`, with the kanban census as the awareness surface
416+
> (`D-ACR-9`)"* … *"`ogar_loco` is zero-dep by design and
417+
> `lance_graph_contract` is zero-dep by charter. **Neither may import the
418+
> other** … A vocabulary needs both, so it lives in a consumer that already
419+
> depends on both"* … *"**The ladder IS a program**: `recipe_dispatch::ladder`
420+
> returns an ordered `Vec<RecipeStep>`; loco executes ordered
421+
> `(function : value)` calls. That is mechanism, not analogy."*
422+
423+
So the 34-recipe → loco-op unification and the kanban census surface are
424+
**already written**. What is missing is one edge:
425+
426+
- **The planner does not depend on `lance-graph-ogar`** (verified: no such line
427+
in `lance-graph-planner/Cargo.toml`). The seam exists in a crate the planner
428+
cannot see.
429+
- **`ogar-loco` / `ogar-r2il` themselves: zero `kanban` hits.** Correct by
430+
design — the zero-dep rule above means the kanban vocabulary belongs in the
431+
bridge, not in loco. Their silence is conformance, not a gap.
432+
- The planner-side references stay forward-looking doc comments
433+
(`cognitive_palette.rs:77` *"Growth from here is `ogar-loco`, not this
434+
table"*; `recipe_dispatch.rs:301` *"what an ogar-loco `FunctionBody` WILL
435+
carry"*) because nothing has connected them to the bridge that now exists.
436+
437+
> ⊘ **AND THE REMEDIATION I FIRST WROTE HERE — "add a planner → lance-graph-ogar
438+
> dependency" — IS ALSO WRONG.** The operator pointed at `hotplug.rs`, and it
439+
> names a different mechanism entirely. Second correction to this same section,
440+
> both caught before commit.
441+
442+
### The sanctioned mechanism is HOT-PLUG, and a Cargo edge is not it
443+
444+
`lance-graph-contract/src/hotplug.rs` — *"Generic consumer hot-plug — the
445+
plug-and-play pattern EVERY consumer migrates to (operator, 2026-07-07)"* —
446+
three roles, three homes:
447+
448+
| role | home | note |
449+
|---|---|---|
450+
| **socket** | `lance-graph-contract::hotplug` | `HotPlug` + `CapabilityAuthority`, **zero-dep**: *"No OGAR dep — the contract … MUST stay dependency-free (a path dep here breaks every CI cargo invocation at workspace-load time; learned 2026-07-07)"* |
451+
| **authority** | OGAR-side | resolves classids → vocab rows, action defs, and the storage reading (`Activation::read_modes`); verifies registration |
452+
| **consumer** | its own crate | declares **one `HotPlug` const**, calls `activate` in its own binary/tests |
453+
454+
> *"The classid is the join key on BOTH sides … drift bangs once, **no pins, no
455+
> serialization, no per-consumer plug crate**."*
456+
457+
**The activation cascade** (operator, 2026-09-16): *"plug and play mints the
458+
classid. and classid mints ogar-vocab which triggers ogar-loco vocabulary."*
459+
460+
```
461+
HotPlug const (consumer) → activate() → classid minted
462+
→ ogar-vocab rows (Class + ActionDef)
463+
→ ogar-loco vocabulary (the palette /
464+
recipe ops, landing in recipe_vocab.rs)
465+
```
466+
467+
That is why `recipe_vocab.rs` can carry *"the 34 NARS recipes as `ogar-loco`
468+
ops … with the kanban census as the awareness surface (`D-ACR-9`)"* without
469+
either zero-dep crate importing the other: **the classid is the join, not a
470+
dependency edge.**
471+
472+
### Measured state of the hot-plug spine
473+
474+
| piece | state |
475+
|---|---|
476+
| socket (`HotPlug`, `CapabilityAuthority`) | **built**, zero-dep, in the contract |
477+
| authority (`impl … CapabilityAuthority for OgarAuthority`) | **built and PRODUCTION** — `lance-graph-ogar/src/lib.rs:524`; `#[cfg(test)]` does not begin until `:612` |
478+
| consumer declarations | **all eight are TEST FIXTURES** (`:618`–`:831`, inside the two `cfg(test)` modules at `:612` and `:681`) — including `BLOCKLY` |
479+
| **the planner's own `HotPlug`** | **ABSENT** — zero `HotPlug`/`hotplug` hits anywhere in `lance-graph-planner/src` |
480+
481+
> A grep note worth keeping: `impl.*CapabilityAuthority` found nothing on the
482+
> first pass because the impl is written fully-qualified
483+
> (`impl lance_graph_contract::hotplug::CapabilityAuthority for OgarAuthority`).
484+
> I nearly recorded "the authority is unimplemented", which would have been the
485+
> fourth false blocker of the session. **A negative grep result is a claim about
486+
> the pattern, not about the tree.**
487+
488+
**So G-F is: the planner declares a `HotPlug` const and calls `activate`.** No
489+
dependency edge, no plug crate, no seam to build — socket, authority and the
490+
loco landing are all in place; the one consumer that needs the kanban has never
491+
plugged in. Third instance this session of two built ends that do not meet.
492+
493+
### The palette arc — and what checking it turned up
494+
495+
Operator: *"ogar loco has a palette arc to unify the 34 nars templates which
496+
just have been checked last few PRs only to find old VSA bindspace singleton
497+
and hamming 16kbit deprecated."*
498+
499+
The palette surface is in `ogar-loco` (`registry.rs`, `basin.rs`,
500+
`vocabulary.rs`, `lib.rs`), and `recipe_vocab.rs` above is its lance-side
501+
landing. The deprecation the recent PRs surfaced is recorded in-tree —
502+
`cognitive-shader-driver/src/engine_bridge.rs:370` calls the
503+
`Vsa16kF32`/`Binary16K` set-bits plane *"the deprecated one"* — and this repo's
504+
own `CLAUDE.md` carries both supersessions: PR #477's three-tier model
505+
(no singleton, no inter-mailbox handoff type at all) and
506+
`E-MARKOV-TEMPORAL-STREAM-1` (2026-07-10), which moves the Markov trajectory
507+
**off the VSA braid onto the `temporal.rs` sorted stream** and demotes VSA to
508+
its `I-VSA-IDENTITIES` four-test niche (N ≤ 32 lossless role superposition
509+
inside ONE compartment).
510+
511+
**Consequence for the palette arc, and it is a real constraint:** a unification
512+
of the 34 templates must NOT be carried on a 16 Kbit Hamming plane or a
513+
singleton BindSpace. Both are superseded substrate, and `temporal.rs`'s
514+
version-range read (`QueryReference::at(v, rung)` + deinterlace) is what
515+
replaced them — **which lands on G-C2 again**, since that read has no
516+
production caller. The palette arc, the Rubicon last phase, and the durability
517+
read are three names for the same missing leg.
518+
519+
## The other loose end — alpha channel split tunnel ↔ SPOG
520+
521+
`.claude/plans/spog-alpha-channel-v1.md` exists: **SPEC (Phase 0), 2026-09-07,
522+
48 KB**, self-described *"Register-before-code. Every 'exists' claim below was
523+
read this session … Every 'absent' claim names the search that backs it."* Its
524+
operator mandate targets MedCare-rs, and it carries the lance-11 constraint
525+
(*"rows are experimental in lance 11 and only required for tombstones which we
526+
avoid by having sealed batch per cycle"*) — the same sealed-batch-per-cycle
527+
shape #912's writer implements.
528+
529+
**Not surveyed further here** — it is a private-consumer-facing spec and
530+
deserves its own pass rather than a paragraph in this plan. Recorded as a named
531+
open end with its status, not folded in.
532+
533+
## Revised gap table
534+
535+
| # | gap | was | now |
536+
|---|---|---|---|
537+
| G-A | `extract_tree` never run on DuckDB | small | unchanged |
538+
| G-B | no ore-TSV → `Dataset` encoder | small | unchanged |
539+
| **G-C1** | OGAR bytes → the existing owned writer | *"the real one"* | **smaller — both ends exist, they do not meet** |
540+
| **G-C2** | `deinterlace` / durability read | not identified | **the real one — and it is what closes Heckhausen's last phase** |
541+
| G-D | `sql()` | gated on G-C | gated on G-C2 (a surface over an unreadable write is not a surface) |
542+
| G-E | quack has no DuckDB in its loop | real | unchanged |
543+
| **G-F** | planner ↔ loco ↔ r2il kanban seam | not in plan | **unwired both ways; a build, not a wiring** |
544+
| **G-G** | alpha-channel split tunnel ↔ SPOG | not in plan | **SPEC Phase 0 exists; needs its own pass** |

0 commit comments

Comments
 (0)