diff --git a/.claude/board/EPIPHANIES.md b/.claude/board/EPIPHANIES.md index 610b6943..64dd5eef 100644 --- a/.claude/board/EPIPHANIES.md +++ b/.claude/board/EPIPHANIES.md @@ -1,3 +1,60 @@ +## 2026-07-11 — E-ACK-SLA-GATE-ACTIONHANDLER-QUEUE-1 — naming refinement: the ack tier is the "SLA gate"; the ack mechanism is NOT retired — it is repurposed OGAR-consumer-side as the "actionhandler queue" +**Status:** RULING (operator, 2026-07-11) — naming refinement of E-ACK-HARD-GATE-VS-KANBANSTEP-STREAM-1 (below), which stands in substance; only the sanctioned names change. Append-only: the prior entry is not edited. + +**Two corrections, both operator-directed:** +1. **The ack tier's sanctioned name is the "SLA gate"** (not "the orchestration hard gate"). It is the ack-gated advance for work that carries an explicit SLA + auditable goalstate — the ticket tier, where waiting on a confirmed durability ack is a feature, not a stall. (The prior "hard gate" phrasing is superseded as a name; the mechanism is unchanged.) +2. **The ack mechanism is NOT retired — it is repurposed.** Earlier framing that read the `ack_and_propose` pattern as demoted/retired is corrected: the mechanism moves to the **OGAR consumer side as the "actionhandler queue"** — the queue where action handlers (tickets, e-mails, …) wait for their durability ack before advancing. The intuition is a plain queue: "the ticket actionhandler queue vs the email actionhandler queue has 200 items waiting." The informal "pump"/"ack-pump" term is retired in favor of "SLA gate" (mechanism) + "actionhandler queue" (the OGAR-consumer-side queue). + +**Unchanged:** the two-tier split itself — kanbanstep = the in-stream synchronous reasoning advance (nobody waits, 550 ms SoA budget); the SLA gate = the ack-gated ticket-tier advance. The tier test is unchanged (SLA/audit obligation → SLA gate / actionhandler queue; cycle budget → stream). + +**Applied:** `crates/lance-graph-planner/src/batch_writer.rs` `ack_and_propose` doc-comment renamed to "SLA gate" + the actionhandler-queue repurposing note (naming/doc only; no behavior change). + +## 2026-07-11 — E-CHESS-TRANSCODE-COMPLETE-1 — the stockfish-rs NNUE evaluator is a COMPLETE byte-exact pure-Rust transcode (L1–L5 green); E-CHESS #539 HalfKA incrementality is now SHIPPED code, not a claim +**Status:** FINDING (shipped, `AdaWorldAPI/stockfish-rs` branch `claude/review-claude-board-files-nhqgx1`, 2026-07-11). Follows through the E-CHESS #539 NNUE-incrementality ruling with executed, parity-proven Rust. Reads with the tesseract-rs oracle discipline (the same method transplanted) and the ndarray `simd-savant` "all SIMD from `ndarray::simd`" invariant. + +**What shipped — the whole NNUE evaluation pipeline, each leaf byte-exact vs the REAL Stockfish (fork `9d2ba2b`, net `nn-1b6a82263149`, sse41-popcnt binary as oracle):** +- **L1** — `.nnue` container loader, walks to EOF byte-exact (90 536 680 B); FT biases + threat/psqt/weight blocks (COMPRESSED_LEB128 + plain-LE), 8 layer stacks. Independent Python-walker cross-check. +- **L2** — `HalfKAv2_hm::make_index` proven EXHAUSTIVELY (all 131 072 tuples) + `FullThreats::make_index` (6.29 M tuples, DIMENSIONS-as-exclusion-sentinel), both net-free; shakmaty `Position → active feature list` for both feature sets (color-flip + piece/square conventions handled explicitly). +- **L3** — accumulator refresh (feature-major FT forward: biases + Σ halfka + Σ threat weight columns, i16-wrapping; psqt i32). Independent oracle, 10/10 (FEN × perspective) digests. +- **L4** — **incremental HalfKA update = the E-CHESS keystone made literal.** `DirtyPiece` delta (`append_changed_indices` + `requires_refresh`), king-move → per-perspective refresh; byte-exact by the group identity `refresh(after) = refresh(before) − removed + added` over `(ℤ/2¹⁶,+)`. Self-oracle CHAINED gate (incremental fed as next base) across normal/capture/castle/en-passant/promotion — byte-exact every ply. Receipt: ≤3 columns/move vs 32/refresh. (FullThreats `DirtyThreats` incremental honestly deferred — a separate larger leaf.) +- **L5** — `evaluate()` end-to-end: transform (pairwise `clamp²/512`, provably == the sse41 SIMD path) → fc_0 → sqr/clipped → fc_1 → clipped → fc_2 → scale → `psqt/16 + positional/16`. The three int8 affines route through **`ndarray::simd::matmul_i8_to_i32`** (the SAME primitive the Tesseract recognizer consumes; activations all in `[0,127]` so i8≡u8 dpbusd). Gate: reproduces the engine's `"NNUE evaluation … internal units"` integer byte-exact across a 5-FEN corpus spanning buckets 7/2/0 — startpos `+21`, kiwipete `-316`, KP-endgame `+114`, midgame `+69`, bare-kings `+2`. + +**Goal-stack tie-in (`/goal transcode stockfish … using ruff codegen ogar lance-graph ndarray`):** ndarray = the L5 GEMM (integrated); ruff codegen = the `ruff_cpp_spo --example harvest_nnue` method-resolution manifest (50 classes, 1943 triples) that drove the leaf checklist; lance-graph = this board ruling (E-CHESS) + the Core-First transcode doctrine the crate follows. Remaining: L6 search (explicitly a NON-GOAL for parity — measured strength only, per the plan). + +**Consequence:** E-CHESS incrementality is no longer a design claim — it is executed, self-oracle-gated Rust. The 64×64=4096 substrate now carries a full, byte-exact NNUE evaluator as a worked reference for the gridlake tenant shape. + +## 2026-07-10 — E-ACK-HARD-GATE-VS-KANBANSTEP-STREAM-1 — ack_and_propose belongs to OGAR ticket orchestration (the low-level orchestration HARD GATE: explicit SLA + auditable goalstate); kanbanstep is the stream reasoning +**Status:** RULING (operator, 2026-07-10: "ack and propose should be in OGAR for ticket orchestration stuff that want more explicit SLA and auditable goalstate — we could say it's the low level Orchestration hard gate and Kanbanstep the stream reasoning"). Completes E-KANBANSTEP-IS-THE-TRIGGER-1 (below): the propose-on-ack pattern is not merely demoted bookkeeping — it has a proper HOME. + +**The two-tier split, ratified:** +- **kanbanstep = stream reasoning** (lance-graph cognitive substrate): the in-stream synchronous advance (`VersionScheduler::on_version → try_advance_phase(&mut)`), fired inline by the writer with the version it already holds. Cognition never waits — the 550 ms SoA budget + can't-stop-thinking govern this tier. E-NOBODY-WAITS-1 is this tier's prime invariant. +- **ack_and_propose = the low-level orchestration HARD GATE** (OGAR ticket orchestration): for work items that WANT explicit SLA and an auditable goalstate, propose-on-ack is the correct semantics — a ticket does not advance until durability is confirmed, and the WAL board + `acked: BTreeMap` + `unacked()` surface IS the audit trail (cast order preserved, crash-replay = the unacked set, goalstate = the acked version per cast). Waiting is a FEATURE here, not a bug: tickets may wait; thinking may not. + +**Consequences:** +- The "correct code, wrong rank" verdict on `BatchWriter::ack_and_propose` resolves to "correct code, wrong TIER": the pattern migrates to (or is mirrored into) OGAR's ticket-orchestration surface; lance-graph keeps kanbanstep as the reasoning-stream advance. +- Tier test for any future advance-path design: *does this unit of work carry an SLA/audit obligation (ticket) or a cycle budget (thought)?* Ticket → hard gate (ack-gated, auditable). Thought → stream (inline, nobody waits). A thought must never be routed through the hard gate; a ticket must never skip it. +- Wiring queued in FUTURE-DESIGN (OGAR changes ride the batched-mint discipline — never a solo OGAR PR): move/mirror the propose-on-ack pattern to OGAR ticket orchestration; the planner-side `BatchWriter` WAL/ack bookkeeping stays as the storage-durability surface it already is. +- **Vocabulary (operator, 2026-07-10):** the informal term "pump"/"ack-pump" is RETIRED. Sanctioned names: **the orchestration hard gate** (the mechanism) / **ack-gated advance** (the action). Historical board entries carrying the old term stay per append-only; live surfaces (code doc-comments, test names, new entries) use the sanctioned names. + +## 2026-07-10 — E-KANBANSTEP-IS-THE-TRIGGER-1 — the CANONICAL kanban advance is the in-stream synchronous step (the pre-existing "kanbanstep"); the ack is bookkeeping, never a pacing mechanism +**Status:** RULING + genealogy CORRECTION (operator, 2026-07-10: "the doctrine was cognitive-shader-driver can't stop thinking … the SoA budgets of 550ms make it more expensive to wait for any stupid ack; the old already existing system was called kanbanstep and it was removed beyond recognition when removing the SurrealQL AST DLL shape"). Corrects the trigger-RANKING in E-ACK-IS-THE-KANBAN-TRIGGER-1 (whose "the driver never waits" clause STANDS); reads with E-NOBODY-WAITS-1. + +**The doctrine (operator):** cognitive-shader-driver **can't stop thinking** — cycles continue as a STREAM over reasoning; the 550 ms SoA cycle budget makes waiting for ANY ack **more expensive than continuing**. The ack's only legitimate job is durability bookkeeping (the `unacked()` crash-replay surface); it never schedules, never paces, never gates the next move. + +**The pre-existing system ("kanbanstep") — archaeology, verified in-tree 2026-07-10:** the synchronous in-stream kanban advance survives in three artifacts: +1. `contract::scheduler::VersionScheduler::on_version(view, DatasetVersion, exec) -> Option` — a **sync pure function**; a batch writer that commits a SoA batch **already knows the version it wrote** and fires the advance INLINE: `on_version → try_advance_phase(&mut)`, no async, no round trip (`scheduler.rs` §IN; `surreal_container/tests/scheduler_seam.rs` drives the whole Rubicon arc this way). +2. `symbiont::kanban_loop::SymbiontBoard::step()` — the pure-SoA reference loop; its doc-comment carries the doctrine verbatim: *"THE TRIGGER IS SYNCHRONOUS — the writer fires it … with NO async"* and *"`step()` drives the loop by direct owned mutation, never by sending a message."* +3. `supervisor::{parse_kanban_step, deliver_kanban_step}` — the `UnifiedStep { step_type: "kanban.." }` delivery edge (`StepDomain::Kanban`, D-MBX-A6) — the step-in-the-plan-stream shape; its current DELIVERY is the message shim (`cast(Advance)` — TD-MESSAGE-RESIDUE). + +**What happened (the "removed beyond recognition"):** during the SurrealQL-AST/DLL carve-out (symbiont W2c re-scope to storage/read-glove-only; "render is struct+methods not SurrealQL", OGAR #149 arc), the kanbanstep loop lost its prominence — the reference loop lived on the symbiont/surreal_container side being demoted, and subsequent sessions (including the E-ACK-IS-THE-KANBAN-TRIGGER-1 arc) rebuilt the trigger as the **ack-gated advance** (`BatchWriter::ack_and_propose`) and mis-ranked IT canonical. That gate couples the next-move PROPOSAL to an ack event that arrives later — a wait-shaped scheduler by construction, exactly what the 550 ms budget forbids. + +**Corrected canonicality:** +- **CANONICAL:** the in-stream synchronous step — the writer/stream fires `on_version → try_advance_phase(&mut)` inline at commit with the version it already holds. The stream is the trigger; thinking never pauses for storage. +- **DEMOTED:** `ack_and_propose` = reconciliation/crash-replay bookkeeping for async-sink shapes (WAL `unacked()` accounting). Correct code, wrong rank — it must never be the thing that drives cognition. +- **RESIDUE:** `deliver_kanban_step`'s `cast(Advance)` delivery joins TD-MESSAGE-RESIDUE (the step_type SHAPE is canonical; the message DELIVERY is the redundancy). + +**Disposition:** doc-only per the standing ruling (LEAVE AS IS AND DOCUMENT). Drift signal: any NEW code that paces a cycle on an ack event, or that awaits storage before advancing a KanbanColumn. + ## 2026-07-10 — E-COMMA-AWARENESS-MEASURED-1 — D-MTS-6 ran GREEN: ONE stored truth bit per comma level matches the full CausalEdge64's awareness proxies (k*=1 vs aligned k*=4); the comma lattice buys ≈ log₂(L) effective bits **Status:** FINDING (measured 2026-07-10; probe `perturbation-sim/examples/comma_awareness.rs`, pre-registered gates, run chronicle in the header; realizes the falsifiable shape of E-THINKING-TENANTS-V3-1's second half) diff --git a/.claude/board/LATEST_STATE.md b/.claude/board/LATEST_STATE.md index 92831d9b..2046537f 100644 --- a/.claude/board/LATEST_STATE.md +++ b/.claude/board/LATEST_STATE.md @@ -170,6 +170,8 @@ Membrane consumers can now pull BOTH halves of a render `classid` BBB-safely fro | PR | Merged | Title | What it added | |---|---|---|---| +| **#676** | 2026-07-10 | Post-#674 doc arc: E-NOBODY-WAITS-1 + VISION.md (graded AGI canon) + ancestry census + D-MTS-1 design inputs | Doc-only, 4 commits. E-NOBODY-WAITS-1 banked (no messages, no actors; ractor = compile-time ownership only; `&mut` IS the serialization; prime invariant "nobody waits for anything or any scheduling"; the ack-gated advance is canonical for the **ticket tier only** — `kanbanstep` stays canonical for stream reasoning, and the ack (the **SLA gate**) is reserved for the OGAR ticket tier, repurposed consumer-side as the **actionhandler queue** (see E-ACK-HARD-GATE-VS-KANBANSTEP-STREAM-1 + E-ACK-SLA-GATE-ACTIONHANDLER-QUEUE-1); supervisor KanbanMsg drivers = TD-MESSAGE-RESIDUE, leave-as-is per operator). `.claude/v3/VISION.md` = the AGI-aspiring canon, every claim graded [G]/[G-on-proxies]/[RULING]/[ASPIRATION], 2-Sonnet-preflight + 2-Opus-filigree provenance, all 9 review fixes applied. MODULE-TABLE ancestry census: thinking-engine (51) + p64-bridge (1) + cognitive-shader-driver (22 src + build.rs) with gem-status column. Plan addendum: D-MTS-1 frozen comparison — AriGraph context V3-TENANT-SHAPED; arm-discovery + DeepNSM ingest legs; CAM-PQ 6×8=48-bit path codes (address side) vs 6×palette256² = 12 B = one V3 tenant (value side). coderabbit 5/5 findings fixed in `093489c`. Merge `001839e`. | +| **#674** | 2026-07-10 | V3 W2–W6 continuation + comma quorum/awareness measured + 5+3 council + StyleFamily dedup (D-TSC-1) | 16 commits. `contract::style_family::StyleFamily` (12 orchestration families, frozen ordinals Deliberate=0..Metacognitive=11) + `ThinkingStyle::family()` (36→12 total) + `default_runbook()` — five mutually divergent hand-rolled 12-style tables replaced (E-FIVE-STYLE-TABLES-1); first live 5+3 council run (spec v1→v2→v3). D-MTS-5 comma quorum MEASURED GREEN (N_eff 11.00/12; boundary = spectral participation) + D-MTS-6 comma awareness MEASURED GREEN (k*=1: one stored truth bit/comma level ≈ aligned k=4; lattice buys ≈log₂12 effective bits; D-MTS-6b gates real CE64 shrink). `BatchWriter::ack_and_propose` first-ack-wins dedup (codex P2). 1549 tests green. Merge `cd5178e`. | | **#632** | 2026-07-02 | Cross-session intake: RouteBucketTyped (C6) + emission_scan + OCR codebook mirror + GraphRAG-rs inventory + operator rulings | Three sibling wishlists dispositioned; C6 merged verbatim (nexgen retires vendor diff); emission_scan = 2nd scan-family instance (pattern NAMED); OCR 0x08XX mirror of OGAR #148 (fuses arc: flip fuse + two-sided COUNT_FUSE — fuse FIRED 65v68 in the merge window, cleared by lock bump, 68==68); rulings: ownership+tripwires, R-1 naming phantom (domain:appid:classview), R-2 closed (512B row frozen, strided edges), L3 schema design killed; codex P2 x2 resolved (precedence global; collision documented). Contract 792/792. Merge `df367471`. | | **#631** | 2026-07-02 | W1b LIVE: WAL batch writer (4 probes green) + M15 rename + temporal synthesis + live oracle numbers | batch_writer implemented: BTreeMap WAL board, ack(cast, LanceVersion) join, delegation cache, never-refuses stacking (probe 4); M15 MulGateDecision rename (W2 unblocked; collapse_gate confirmed 3rd distinct type); operator rulings pinned (zero-copy descriptor casts + eager drain + mutual masking; melden macht frei — freeze retracted; temporal.rs = the read side, replay = QueryReference::at + deinterlace, M24=M25=time-travel ONE mechanism). Measured live: W3c oracle 1-2 ms framework overhead vs 8.4-8.7 s LLM round trip (rig->xAI grok-4 via FlowRunner); JITSON serve.rs = local CI oracle delta. Planner lib 204 + probes 4/4. Merge `c7149eab`. | | **#630** | 2026-07-02 | V3 W1 START: preflight deltas + WAL writer probes + adoption scan + D-PERT-1 + temporal synthesis | Fable-5 ten-point preflight (M24 board=WAL, W6a baseline inversion, W3 oracle ratchet, W2 probe-first reorder) + operator rulings folded live: zero-copy sink (cast = descriptor never bytes, flush via NodeRowPacket::as_le_bytes), "melden macht frei" (stacked casts never refused — 4 ignored probes define W1b green), temporal.rs deinterlace = the READ side (replay = QueryReference::at + deinterlace; M24/M25/time-travel are ONE mechanism; ack carries LanceVersion). Landed code: batch_writer skeleton + 4 probes; contract::classid_scan (771 green); D-PERT-1 rename (462 green). Audits: planner-SoA type-real/wiring-dormant (M15 GateDecision rename BLOCKING before W2); M7 corrected (NodeRowPacket IS production SoaEnvelope, codex P2); graph-flow benched ~0.4-0.5us/step (two-speed confirmed); M25 KanbanSessionStorage design (graph-flow-kanban envelope exists — wire don't invent). Merge `9a6df2a1`. | diff --git a/.claude/board/PR_ARC_INVENTORY.md b/.claude/board/PR_ARC_INVENTORY.md index b7906667..98b68f45 100644 --- a/.claude/board/PR_ARC_INVENTORY.md +++ b/.claude/board/PR_ARC_INVENTORY.md @@ -35,6 +35,31 @@ --- +## #676 lance-graph: Post-#674 doc arc — E-NOBODY-WAITS-1 + VISION.md (graded AGI canon) + ancestry census + D-MTS-1 design inputs + +**Status:** MERGED 2026-07-10 (merge commit `001839e`), branch `claude/review-claude-board-files-nhqgx1` (restarted from #674's merge), 4 commits, doc-only. + +**Added** +- `.claude/v3/VISION.md` — the AGI-aspiring canon re-grounded on the measured substrate; every claim graded [G] / [G-on-proxies] / [RULING] / [ASPIRATION]; §0 thesis carries the proxy fence on the sentence; organ table (Think fields → V3 homes incl. free_energy/Kausal + global_context); five-axis projection (bytes / readings / time / scale / bits); families→runbooks→templates ladder; Rubicon heart under nobody-waits; anti-dilution laws; the road in dependency order (D-MTS-1 keystone first). Provenance: 2 Sonnet preflights + 2 Opus filigree reviewers (dilution-collapse-sentinel + overclaim-auditor charters), all 9 findings applied. +- MODULE-TABLE ADDENDUM (2): ancestry-pipeline census — thinking-engine (51 files) + p64-bridge (1) + cognitive-shader-driver (22 src + build.rs), gem-status column (WIRED-HOT-PATH / UNWIRED-GEM / CALIBRATION-ONLY / LAB-ONLY / RESIDUE); LAB-ONLY = 12 of 22 driver src files. +- Plan addendum (third wave, operator design input for D-MTS-1): AriGraph context V3-TENANT-SHAPED; ingest legs `lance-graph-arm-discovery` (Aerial+, palette256 integer oracle ρ=0.9973) + DeepNSM (4096 COCA = CAM index codebook); frozen comparison CAM-PQ 6×8 = 48-bit path codes (address side, = OGAR HEEL+HIP+TWIG) vs 6×palette256:palette256 = 12 B = ONE V3 tenant (value side); likely "key addresses, tenant carries" — probed, not assumed. + +**Locked** +- **E-NOBODY-WAITS-1** (operator ruling, canonical in EPIPHANIES): no messages, no actors anywhere; ractor = compile-time ownership guarantee ONLY; `&mut` IS the serialization; prime invariant "nobody waits for anything or any scheduling". The ack-gated advance (`ack_and_propose` → `try_advance_phase(&mut)`) was ranked the canonical kanban trigger (since re-tiered: E-ACK-HARD-GATE-VS-KANBANSTEP-STREAM-1); supervisor `KanbanMsg`/`call!` drivers are documented redundancy (TD-MESSAGE-RESIDUE, leave-as-is per operator; drift signal = NEW code reaching for messages). +- VISION.md is the WHY reference for V3 (README doc-map row + FUTURE-DESIGN header pointer); design PRs cite EPIPHANIES for rulings, VISION for the graded rationale. + +**Deferred** +- TD-STYLE-TABLE-RESIDUE census extension (auto_style consts, UNIFIED_STYLES params, p64-bridge StyleParams, GestaltState ×2, lens triplet, wire.rs LAB-ONLY-but-largest) — follow-up grep queued behind D-TSC-1's shipped fleet run. +- TD-MESSAGE-RESIDUE — permanently parked by ruling (document, don't retire). + +**Docs** — VISION.md; FUTURE-DESIGN + README pointers; EPIPHANIES E-NOBODY-WAITS-1; TECH_DEBT TD-MESSAGE-RESIDUE + TD-STYLE-TABLE-RESIDUE extension; AGENT_LOG census-worker + vision-keeper entries. + +**Review** — coderabbit 5/5 findings verified against the tree and fixed in `093489c` (census headings 49→51 / 23→22; LAB-ONLY stat corrected to 12-of-22 — the rabbit's own suggested "11 of 22" was still wrong, its list missed `auto_detect.rs`; workspace-scope note: both crates under `workspace.exclude`; AGENT_LOG post-commit metadata; MD040 fence). Bugbot did not run (Cursor usage limit). + +**Confidence (2026-07-10):** doc-only; no runtime claims beyond what #674 measured. + +--- + ## #674 lance-graph: V3 W2–W6 continuation + comma quorum/awareness measured + 5+3 council + StyleFamily dedup (D-TSC-1) **Status:** MERGED 2026-07-10 (merge commit `cd5178e`), branch `claude/review-claude-board-files-nhqgx1`, 16 commits. Companion: rs-graph-llm `8ef18b9` (same branch name there, not yet PR'd) — `run_cycle` explicit `on_behalf` (owner ≠ classid). diff --git a/.claude/board/TECH_DEBT.md b/.claude/board/TECH_DEBT.md index 94f133ff..38e0b34a 100644 --- a/.claude/board/TECH_DEBT.md +++ b/.claude/board/TECH_DEBT.md @@ -17,6 +17,21 @@ that, not the existing residue, is what a reviewer blocks. The prime invariant every change on this surface is judged against: **nobody waits for anything or any scheduling.** +*Extension (2026-07-10, per E-KANBANSTEP-IS-THE-TRIGGER-1):* two +corrections to the entry above. (a) The phrase "canonical message-free +loop (`BatchWriter::ack_and_propose` …)" over-ranked the ack-gated advance: the +CANONICAL advance is the pre-existing **kanbanstep** — the in-stream +synchronous fire `VersionScheduler::on_version → try_advance_phase(&mut)` +(the writer already knows the version it committed; reference loop +`symbiont::kanban_loop::SymbiontBoard::step()`); `ack_and_propose` is +demoted to crash-replay/durability bookkeeping (`unacked()`), never a +pacing mechanism — waiting on an ack is more expensive than the 550 ms +cycle budget allows. (b) `supervisor::deliver_kanban_step`'s +`cast(Advance)` delivery is added to this residue catalogue — the +`step_type "kanban.*"` SHAPE (StepDomain::Kanban, D-MBX-A6) is canonical; +the message DELIVERY behind it is the redundancy. Same disposition: +leave as is, documented. + ## TD-STYLE-TABLE-RESIDUE (2026-07-10, D-TSC-1 follow-ups) Three residues from the M9 ThinkingStyle dedup (all OUT of D-TSC-1 scope, diff --git a/.claude/plans/temporal-markov-and-style-classes-v1.md b/.claude/plans/temporal-markov-and-style-classes-v1.md index e322fa0f..ad9a6787 100644 --- a/.claude/plans/temporal-markov-and-style-classes-v1.md +++ b/.claude/plans/temporal-markov-and-style-classes-v1.md @@ -42,6 +42,20 @@ signed mantissa slot) — D-MTS-2's design names it explicitly. Vertical level offsets follow the comma progression (generated from the address, never stored); per-level content = palette-quantized magnitude envelope only. +**Technique input queued (operator, 2026-07-10, from the stockfish-rs +sibling arc):** `stockfish-rs/.claude/knowledge/stockfish-pext-morton-adjacency.md` +— read while harvesting real Stockfish source. Honest finding: Stockfish +has NO Morton/pyramid/palette/comma code (verified, zero hits); what DOES +transfer is the `Magic` struct's `pext`/`pdep` gather→table-lookup→scatter +pattern (`attacks.h:130-159`) as a candidate AVX-512/BMI2 fast path for +the 2bit×2bit 4×4 tile pack/unpack (same hardware primitive family the +standard Morton bit-interleave trick uses — different mask content), plus +the three-tier CPU-family dispatch lesson (BMI2 PEXT is known-slow on +some AMD families; ship a portable fallback, don't trust ISA presence +alone) as independent confirmation of the `ndarray::simd` multi-tier +dispatch discipline already in force here. CONJECTURE until D-MTS-2 +actually builds and measures the tile primitive this way. + > **Addendum (operator, 2026-07-10, second wave — three rulings):** > (1) **E-STYLE-FAMILY-VS-RUNBOOK-1** — 12 = abstract FAMILIES for > orchestration; 36 = literal NARS RUNBOOKS; runbooks seed the rung ladder; diff --git a/.claude/v3/FUTURE-DESIGN.md b/.claude/v3/FUTURE-DESIGN.md index 6746c8de..180d0f27 100644 --- a/.claude/v3/FUTURE-DESIGN.md +++ b/.claude/v3/FUTURE-DESIGN.md @@ -11,6 +11,19 @@ --- +## 2026-07-10 (fourth wave) — the chess arc: E-CHESS gets its measured instantiation (sibling repo) + +| Seed | One line | Wiring queue | +|---|---|---| +| operator suggestion → `stockfish-rs` bootstrap (`b987c4b`) | shakmaty (rules, consumed never re-implemented) × ruff_cpp_spo Stockfish harvest (oracle-only) × the 64×64=4096 cascade — from×to move matrix / ButterflyHistory / NNUE HalfKAv2_hm are natively the gridlake shape; NNUE's incremental accumulator = **E-CHESS (#539) made literal and measurable**; int8 GEMM reuses the Tesseract-proven `ndarray::simd` primitives | Plan: `stockfish-rs/.claude/plans/stockfish-harvest-64x64-v1.md` (P0 oracle → L1 net loader → L2 index parity → L3 refresh → L4 incremental keystone → L5 evaluate() parity → L6 search on the 64×64 butterfly SoA lane, measured-not-parity; later UCI + Lichess-API arm). L4's incremental-vs-refresh speedup = the compute_dag receipt E-CHESS has been waiting for | + +## 2026-07-10 (third wave) — the two-tier advance split: hard gate (OGAR tickets) vs stream (kanbanstep) + +| Ruling | One line | Wiring queue | +|---|---|---| +| E-ACK-HARD-GATE-VS-KANBANSTEP-STREAM-1 | `ack_and_propose` = the low-level orchestration **HARD GATE** → belongs to OGAR ticket orchestration (explicit SLA + auditable goalstate; WAL board + `acked` map = the audit trail; waiting is a FEATURE for tickets); **kanbanstep** = the stream reasoning (in-stream synchronous `on_version → try_advance_phase(&mut)`; nobody waits, 550 ms budget) | **D-AHG-1**: move/mirror propose-on-ack into OGAR's ticket-orchestration surface — rides the batched-mint discipline, NEVER a solo OGAR PR; planner `BatchWriter` keeps the WAL/ack durability bookkeeping. Tier test for reviews: ticket (SLA/audit) → hard gate; thought (cycle budget) → stream; never cross-route | +| E-KANBANSTEP-IS-THE-TRIGGER-1 | genealogy corrected: kanbanstep (contract `scheduler.rs` §IN + symbiont `kanban_loop.rs` + supervisor `deliver_kanban_step` step shape) predates and outranks the ack-gated advance; it was obscured in the SurrealQL-AST carve-out | doc-only (leave-as-is ruling stands); drift signal = new code pacing a cycle on an ack | + ## 2026-07-10 (second wave) — families vs runbooks; thinking tenants → V3; the smaller-CE64 × comma awareness probe | Ruling | One line | Wiring queue | diff --git a/crates/lance-graph-planner/src/batch_writer.rs b/crates/lance-graph-planner/src/batch_writer.rs index 8d43d28a..fc3cbd63 100644 --- a/crates/lance-graph-planner/src/batch_writer.rs +++ b/crates/lance-graph-planner/src/batch_writer.rs @@ -104,10 +104,23 @@ impl

BatchWriter

{ self.acked.insert(cast, version); } - /// **The self-updating orchestration pump (operator ruling, 2026-07-10): - /// the ack IS the next kanban trigger.** Records the ack, then lowers the - /// assigned `LanceVersion` to the next legal [`KanbanMove`] proposal via - /// the provided [`VersionScheduler`] over `view`. + /// **The SLA gate (operator rulings, 2026-07-10/11): + /// an ack-gated advance for SLA/audit-bearing work.** Records the ack, + /// then lowers the assigned `LanceVersion` to the next legal + /// [`KanbanMove`] proposal via the provided [`VersionScheduler`] over + /// `view`. + /// + /// **Tier note (E-ACK-HARD-GATE-VS-KANBANSTEP-STREAM-1; name refined to + /// "SLA gate" 2026-07-11):** this is the TICKET tier — work items that + /// want an explicit SLA and an auditable goalstate advance only on + /// confirmed durability, and the WAL board + `acked` map is their audit + /// trail. The STREAM/reasoning tier (the kanbanstep) never routes through + /// here: a writer that already holds the version it committed fires + /// `on_version → try_advance_phase(&mut)` inline — thinking never waits on + /// an ack. This SLA-gate mechanism is preserved (not retired) and is + /// repurposed on the OGAR consumer side as the **actionhandler queue** — + /// where action handlers (tickets, e-mails, …) wait for their durability + /// ack before advancing. /// /// The loop this closes — the StreamDto "can't stop thinking" lineage: /// @@ -123,7 +136,8 @@ impl

BatchWriter

{ /// `cast` returns immediately ("melden macht frei"), the write is async, /// and the board update is a *consequence of the write completing*, not /// something the thinker schedules. Orchestration is self-updating — - /// every completed write pumps the next kanban update. + /// every completed write releases the next kanban update through the + /// gate. /// /// Propose-don't-dispose is preserved: the writer only PROPOSES; the /// owner (`MailboxSoaOwner` / the KanbanActor) applies the move — the @@ -134,13 +148,13 @@ impl

BatchWriter

{ /// cycle's window from this same proposal (M12). /// /// **At-least-once delivery (codex P2 on #674):** only the FIRST - /// unacked→acked transition pumps a proposal. A duplicate ack (async + /// unacked→acked transition releases a proposal. A duplicate ack (async /// sink retry, version-watcher replaying the same `CastId`) returns /// `None` WITHOUT overwriting the first recorded version — first ack /// wins, keeping the CastId↔LanceVersion temporal join stable. A stray /// `CastId` (never cast on this board) also returns `None` and records /// nothing. The low-level [`ack`](Self::ack) stays the unconditional - /// recording primitive; dedup lives at the pump, because the pump is + /// recording primitive; dedup lives at the gate, because the gate is /// what would otherwise multiply lifecycle moves. pub fn ack_and_propose( &mut self, @@ -257,7 +271,7 @@ mod tests { // The async sink completes c1: the ack ITSELF proposes the next // kanban update (Planning → CognitiveWork), carrying the Libet - // anchor — orchestration pumps itself off write completions. + // anchor — orchestration self-updates off write completions. let mv = w .ack_and_propose( c1, @@ -275,7 +289,7 @@ mod tests { } #[test] - fn self_pumping_chain_walks_the_arc_off_write_completions_alone() { + fn ack_gated_chain_walks_the_arc_off_write_completions_alone() { // Three async write completions, each triggering the next update: // the board walks Planning → CognitiveWork → Evaluation → Commit // with NO scheduler call from the thinker's side. @@ -303,7 +317,7 @@ mod tests { phase = mv.to; // the owner disposed the proposal; next view reflects it } - // At the absorbing column the pump rests: ack recorded, no proposal, + // At the absorbing column the gate rests: ack recorded, no proposal, // no error — the no-op tick is suppressed, never a deadlock. let last = w.cast(7, vec![], 9); let rest = w.ack_and_propose( @@ -321,7 +335,7 @@ mod tests { /// lifecycle moves — only the FIRST unacked→acked transition proposes; /// duplicate acks keep the first version; stray casts record nothing. #[test] - fn duplicate_and_stray_acks_never_pump_twice() { + fn duplicate_and_stray_acks_never_release_twice() { let mut w: BatchWriter = BatchWriter::new(); let c1 = w.cast(7, vec![], 0); @@ -333,7 +347,7 @@ mod tests { &PhaseView(KanbanColumn::Planning), ExecTarget::Native, ); - assert!(first.is_some(), "first unacked->acked transition pumps"); + assert!(first.is_some(), "first unacked->acked transition releases"); // Sink retry / watcher replay of the same CastId: NO second // proposal, and the first recorded version wins (the temporal @@ -345,7 +359,7 @@ mod tests { &PhaseView(KanbanColumn::Planning), ExecTarget::Native, ); - assert!(dup.is_none(), "duplicate ack must not pump a second move"); + assert!(dup.is_none(), "duplicate ack must not release a second move"); assert_eq!(w.acked_version(c1), Some(41), "first ack wins"); // Stray CastId (never cast on this board): no proposal, no record.