Skip to content

V3 W1b LIVE: WAL batch writer implemented (4 probes green), M15 rename, temporal deinterlace synthesis, live oracle measurements#631

Merged
AdaWorldAPI merged 4 commits into
mainfrom
claude/v3-substrate-migration-review-o0yoxv
Jul 2, 2026
Merged

V3 W1b LIVE: WAL batch writer implemented (4 probes green), M15 rename, temporal deinterlace synthesis, live oracle measurements#631
AdaWorldAPI merged 4 commits into
mainfrom
claude/v3-substrate-migration-review-o0yoxv

Conversation

@AdaWorldAPI

Copy link
Copy Markdown
Owner

What

The W1 keystone goes live, plus the operator rulings that shaped it and the measurements that close the two-speed architecture's empirical loop.

Code

  • W1b/W1c implemented (batch_writer.rs): BTreeMap WAL board (monotonic CastId = cast order for free), ack(cast, LanceVersion) + acked_version() — the CastId↔LanceVersion join wiring the WAL into the temporal classifier — delegation cache, never-refuses stacking. All 4 probes un-ignored and passing; planner lib 204 green.
  • M15 (was blocking-before-W2): planner-local GateDecision{Proceed,Sandbox,Compass}MulGateDecision + deprecated alias. The contract kanban gate {Flow,Hold,Block} keeps the name; the false friend that would have routed the wrong gate into advance_on_gate is dead. Confirmed: collapse_gate::GateDecision is a third, distinct type (engine_bridge consumer) — untouched.
  • Probe 4 added: probe_stacked_casts_never_refused — 3 stacked casts, distinct WAL entries, out-of-order acks.

Operator rulings pinned (plan Addenda 6–9)

  • Zero-copy sink + mutual masking: casts carry descriptors, never bytes; the sink reads the live store via NodeRowPacket::as_le_bytes; eager ASAP drain; "the write masks the thinking and vice versa."
  • "Melden macht frei": the writer NEVER refuses stacked casts — the mutation-freeze idea was retracted (it contradicted "updates reprioritize, never gate"); coalescing is natural via live-store reads.
  • temporal.rs is the read side (E-V3-TEMPORAL-DEINTERLACE-1): replay = QueryReference::at(v, rung) + deinterlace — M24 crash-replay, M25 session-replay, and time-travel are ONE mechanism; no-refusal is provable (Strict readers can't observe past their V_ref).

Measurements (live, evidence in EPIPHANIES)

  • W3c oracle node measured live (rig→xAI, grok-4 through FlowRunner): framework overhead 1–2 ms against an 8.4–8.7 s LLM round trip. With the morning's dispatch bench (~0.4–0.5 µs/step), every layer of the two-speed architecture now has numbers.
  • Test-bench delta: rig's OpenAI-compatible provider → planner serve.rs (JITSON) as the local zero-cost CI oracle.
  • References folded: rs-graph-llm design intent (LangGraph-inspired, interruptible-by-design — the queue-vs-stateful debate resolves in V3 as the board being both), GraphRAG-rs (automataIA/graphrag-rs) as RAG prior art; API-design inventory in flight.

Verification

  • cargo test -p lance-graph-planner --test w1_probes — 4/4 passing (0 ignored)
  • cargo test -p lance-graph-planner --lib — 204 green
  • clippy clean on all touched files (pre-existing nars_engine.rs:492 deprecated-CausalEdge64 debt noted, untouched)

🤖 Generated with Claude Code

https://claude.ai/code/session_01MLBnPuScZy6w9di2QEjsXM


Generated by Claude Code

claude added 4 commits July 2, 2026 12:45
…green; M15 MulGateDecision rename

W1b: BTreeMap board (monotonic CastId = cast order), ack(cast,
LanceVersion) with acked_version getter (the WAL<->temporal join,
Addendum-8), delegation cache, never-refuses stacking. All 4 probes
un-ignored and passing.

M15 (blocking-before-W2): planner-local GateDecision{Proceed,Sandbox,
Compass} -> MulGateDecision + deprecated alias; contract kanban gate
{Flow,Hold,Block} keeps the name; zero internal alias usage. Kills the
false friend before any planner->kanban emission.

Planner lib 204 green; clippy clean on all six touched files
(pre-existing nars_engine.rs:492 deprecated-CausalEdge64 debt noted,
untouched).

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MLBnPuScZy6w9di2QEjsXM
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MLBnPuScZy6w9di2QEjsXM
…-8.7 s LLM round trip (Addendum-9)

Live rig(xai)->FlowRunner oracle-node run; self-hosted JITSON serve.rs
test-bench delta recorded; rs-graph-llm design-intent + GraphRAG-rs
references folded.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01MLBnPuScZy6w9di2QEjsXM
@coderabbitai

coderabbitai Bot commented Jul 2, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@AdaWorldAPI, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 11 minutes

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.
You're only billed for reviews past your plan's rate limits ($0.25/file).

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: Organization UI

Review profile: CHILL

Plan: Pro Plus

Run ID: ca7f2c01-1c44-4438-967a-a0c7e79e7ded

📥 Commits

Reviewing files that changed from the base of the PR and between 9a6df2a and 563f560.

📒 Files selected for processing (12)
  • .claude/board/EPIPHANIES.md
  • .claude/board/LATEST_STATE.md
  • .claude/board/PR_ARC_INVENTORY.md
  • .claude/board/STATUS_BOARD.md
  • .claude/v3/ENTROPY-MILESTONES.md
  • .claude/v3/INTEGRATION-PLAN.md
  • crates/lance-graph-planner/src/api.rs
  • crates/lance-graph-planner/src/batch_writer.rs
  • crates/lance-graph-planner/src/lib.rs
  • crates/lance-graph-planner/src/mul/gate.rs
  • crates/lance-graph-planner/src/mul/mod.rs
  • crates/lance-graph-planner/tests/w1_probes.rs

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@AdaWorldAPI AdaWorldAPI merged commit c7149ea into main Jul 2, 2026
5 checks passed

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: 563f560a08

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

let cast = CastId(self.next_id);
self.next_id += 1;
self.board.insert(cast, (on_behalf, moves));
self.pending_payloads.push((cast, payload));

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Expose or drain cast payloads for the sink

For any real W1b sink or crash-replay path, this stores the descriptor P in a private vector but no method ever exposes or drains pending_payloads; unacked() returns only CastId and intent_moves() only returns kanban moves. A writer can therefore record an unacked cast that replay code cannot retrieve the SoA descriptor for, while acknowledged casts also retain their payload forever. Please add a pending/drain accessor or include the payload in the replay surface.

Useful? React with 👍 / 👎.

pub use compass::{CompassDecision, CompassResult};
pub use dk::{DkDetector, DkPosition};
pub use gate::GateDecision;
pub use gate::MulGateDecision;

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

P2 Badge Preserve the deprecated mul::GateDecision re-export

This rename adds a deprecated gate::GateDecision alias, but the public mul prelude no longer re-exports it. Any downstream code using the previous path lance_graph_planner::mul::GateDecision now gets an unresolved import even though the alias exists one module lower; if the M15 rename is meant to be a deprecation instead of a hard break, re-export both GateDecision and MulGateDecision here.

Useful? React with 👍 / 👎.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants