Skip to content

Commit 10744cc

Browse files
authored
Merge pull request #255 from AdaWorldAPI/claude/supabase-subscriber-wire-up
feat(callcenter): wire LanceVersionWatcher + DrainTask scaffold (DM-4a/b/c, DM-6a/b)
2 parents e387342 + d8569ec commit 10744cc

9 files changed

Lines changed: 375 additions & 14 deletions

File tree

.claude/board/AGENT_LOG.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,13 @@ Append-only log of agent sessions. Prepend new entries at the top.
44

55
---
66

7+
## 2026-04-24T16:30 — Supabase subscriber v2 (sonnet, claude/supabase-subscriber-wire-up)
8+
9+
**D-ids:** DM-4a/b/c, DM-6a/b
10+
**Commit:** `ec3b5c7`
11+
**Tests:** 17 pass with realtime feature (13 without); 5 new tests total (4 in version_watcher.rs, 1 subscribe_receives_on_project in lance_membrane.rs)
12+
**Outcome:** Wired LanceMembrane::subscribe() from Phase-A disconnected mpsc stub to live tokio::sync::watch::Receiver<CognitiveEventRow> under [realtime] feature. project() now calls watcher.bump(row.clone()) on every projected cycle. DrainTask scaffold (Poll::Pending) ships unconditionally. Tokio was already a dep — no Cargo.toml changes needed. PR 255: https://github.com/AdaWorldAPI/lance-graph/pull/255
13+
714
## 2026-04-24T16:30 — Archetype scaffold v2 (sonnet, claude/archetype-crate-scaffold)
815

916
**D-ids:** DU-2.1..2.6

.claude/board/EPIPHANIES.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,12 @@ stay as historical references.
6666
## Entries (reverse chronological)
6767

6868

69+
## 2026-04-24 — FINDING: subscribe() wired; LanceVersionWatcher delivers always-latest CognitiveEventRow to subscribers (DM-4/6)
70+
71+
`LanceMembrane::subscribe()` now returns a `tokio::sync::watch::Receiver<CognitiveEventRow>` under the `[realtime]` feature gate — supabase-shape always-latest semantics. `project()` calls `watcher.bump(row)` after building the scalar row; subscribers observe the latest committed event without polling. `DrainTask` scaffold ships unconditionally (no feature gate) as a `Future` shell for the follow-up `steering_intent` drain loop. Tokio was already an optional dep in `lance-graph-callcenter/Cargo.toml` under `[realtime]` — no new deps required.
72+
73+
**Status:** FINDING
74+
6975
## 2026-04-24 — Vsa16kF32 switchboard carrier shipped (CrystalFingerprint::Vsa16kF32 + 16K algebra)
7076

7177
**Status:** FINDING

.claude/board/INTEGRATION_PLANS.md

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,19 @@
3636

3737
---
3838

39+
## v1 — Supabase Subscriber Wire-up (authored 2026-04-24)
40+
41+
**Author:** sonnet agent, session 2026-04-24 (branch claude/supabase-subscriber-wire-up)
42+
**Scope:** Flip `LanceMembrane::subscribe()` from Phase-A stub to a live `tokio::sync::watch::Receiver<CognitiveEventRow>` wired to `LanceVersionWatcher`; ship `DrainTask` scaffold.
43+
**Path:** `.claude/plans/supabase-subscriber-v1.md`
44+
**Deliverables:** DM-4a swap Subscription type, DM-4b `version_watcher.rs`, DM-4c uncomment `pub mod version_watcher`, DM-6a `drain.rs` scaffold, DM-6b uncomment `pub mod drain`.
45+
46+
**Status (2026-04-24):** In PR. All deliverables in branch `claude/supabase-subscriber-wire-up`.
47+
48+
**Confidence (2026-04-24):** FINDING — 17 tests pass (13 without realtime, 17 with; 4 new tests in `version_watcher.rs`, 1 new `subscribe_receives_on_project` in `lance_membrane.rs`). Zero regressions.
49+
50+
---
51+
3952
## v1 — Unified Integration: PersonaHub × ONNX × Archetype × MM-CoT × RoleDB (authored 2026-04-23)
4053

4154
**Author:** main-thread session 2026-04-23

.claude/board/STATUS_BOARD.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -272,9 +272,9 @@ pattern IS the Supabase-shape transcode approach).
272272
|---|---|---|---|
273273
| DM-2 | `LanceMembrane: ExternalMembrane` impl with `project()` + compile-time BBB leak test | **In progress** | Phase A shipped `9a8d6a0``LanceMembrane` struct + `project()` + `ingest()` + `subscribe()` stub. Phase B: full Lance append + version counter pending DM-4. |
274274
| DM-3 | `CommitFilter` → DataFusion `Expr` translator (`[query]` feature) | **Queued** ||
275-
| DM-4 | `LanceVersionWatcher` — tails Lance version counter, emits Phoenix `postgres_changes` (`[realtime]`) | **Queued** | |
275+
| DM-4 | `LanceVersionWatcher` — tails Lance version counter, emits Phoenix `postgres_changes` (`[realtime]`) | **In PR** | branch `claude/supabase-subscriber-wire-up` — DM-4a/b/c: `version_watcher.rs` (117 LOC, 4 tests), `lib.rs` `pub mod version_watcher`, `LanceMembrane::watcher` field + `project()` calls `bump()`, `subscribe()` returns `watch::Receiver<CognitiveEventRow>`. |
276276
| DM-5 | `PhoenixServer` — minimal WS server, Phoenix channel subset (`[realtime]`) | **Queued** | Resolve UNKNOWN-2 (which consumers need Phoenix wire?) first |
277-
| DM-6 | `DrainTask``steering_intent` Lance read → `UnifiedStep``OrchestrationBridge::route()` | **Queued** | |
277+
| DM-6 | `DrainTask``steering_intent` Lance read → `UnifiedStep``OrchestrationBridge::route()` | **In PR** | branch `claude/supabase-subscriber-wire-up` — DM-6a/b scaffold: `drain.rs` (89 LOC, 2 tests), `lib.rs` `pub mod drain`, `Poll::Pending` until follow-up PR wires real drain loop. |
278278
| DM-7 | `JwtMiddleware` + `ActorContext``LogicalPlan` RLS rewriter (`[auth]`) | **Queued** | Resolve UNKNOWN-3 (pgwire?) + UNKNOWN-4 (actor_id type) first |
279279
| DM-8 | `PostgRestHandler` — query-string → DataFusion SQL → Lance scan → Arrow response (`[serve]`) | **Queued** | Confirm PostgREST compat needed (§ 8 stop point 4) before building |
280280
| DM-9 | End-to-end test: shader fires → `LanceMembrane::project()` → Lance append → Phoenix subscriber receives event | **Queued** | Depends on DM-2 through DM-6 |
Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
# Supabase-shape Subscriber Flow Wire-up — v1
2+
3+
> **Status:** In progress (2026-04-24)
4+
> **Owner:** @callcenter-specialist, @bus-compiler
5+
> **Scope:** `lance-graph-callcenter` crate only (plus `external_membrane.rs` if trait surface bends)
6+
> **Depends on:** none (substrate-independent)
7+
8+
## Goal
9+
10+
Flip `LanceMembrane::subscribe()` from GHOST to PARTIAL. Ship DM-4 `LanceVersionWatcher` + DM-6 `DrainTask`. Close the Outside-BBB loop so Lance dataset version bumps fire notifications to subscribers with filtered `CognitiveEventRow` payloads.
11+
12+
## Deliverables
13+
14+
- **DM-4a** — Swap `Subscription` associated type from `mpsc::Receiver<u64>` to `tokio::sync::watch::Receiver<CognitiveEventRow>` in `lance_membrane.rs`.
15+
- **DM-4b** — Create `crates/lance-graph-callcenter/src/version_watcher.rs`. Holds the `watch::Sender<CognitiveEventRow>`; `bump(row)` on each `project()` commit.
16+
- **DM-4c** — Uncomment `pub mod version_watcher` in `lib.rs:71-72`; export `LanceVersionWatcher`.
17+
- **DM-5a**`subscribe(filter)` returns the `watch::Receiver` wrapped with a `CommitFilter` predicate combinator.
18+
- **DM-6a** — Create `crates/lance-graph-callcenter/src/drain.rs`. Scaffold only — `DrainTask` struct + `drain()` method that currently returns `Poll::Pending`. Wiring to `OrchestrationBridge::route()` is the follow-up PR.
19+
- **DM-6b** — Uncomment `pub mod drain` in `lib.rs:78-79`; export `DrainTask`.
20+
- **DM-7** — Flip test `subscribe_returns_disconnected_receiver` to `subscribe_receives_on_project` — assert `rx.borrow().version > 0` after a `project()` call.
21+
22+
## Non-goals (explicit)
23+
24+
- `dialect` Phase-B source wiring — separate TECH_DEBT row (@callcenter-specialist).
25+
- `scent` Phase-C CAM-PQ cascade — blocked on substrate migration (PR B, pending).
26+
- `PhoenixServer` DM-5 — Queued separately.
27+
- `DrainTask` runtime drain of `steering_intent` — this PR ships only the scaffold.
28+
29+
## Acceptance criteria
30+
31+
- `cargo test -p lance-graph-callcenter --lib` — 11 existing tests pass + new `subscribe_receives_on_project` test passes. Zero regressions.
32+
- `bbb_scalar_only_compile_check` still compiles.
33+
- `cargo check --workspace` compiles.
34+
- Verdict flip in `.claude/plans/unified-integration-v1.md §6`: Supabase row `GHOST``PARTIAL` (one-line Edit on the table row).
35+
- `.claude/board/INTEGRATION_PLANS.md` — prepend entry pointing to this plan file.
36+
- `.claude/board/STATUS_BOARD.md` — DM-4 / DM-6 rows status updated.
37+
- `.claude/board/EPIPHANIES.md` — prepend short FINDING entry noting subscribe wire-up.
38+
39+
## Architecture notes
40+
41+
Per CLAUDE.md BBB invariant, `Subscription` must carry Arrow-scalar content only — `CognitiveEventRow` is the canonical outbound DTO and is already scalar-only (compile-time enforced by `bbb_scalar_only_compile_check`). `tokio::sync::watch` is the right primitive for the supabase-realtime-shaped fan-out: single-producer (the membrane), many-consumer (subscribers), always-latest semantics (skip stale revisions).
42+
43+
Implementation sketch:
44+
45+
```rust
46+
// version_watcher.rs
47+
pub struct LanceVersionWatcher {
48+
tx: tokio::sync::watch::Sender<CognitiveEventRow>,
49+
}
50+
impl LanceVersionWatcher {
51+
pub fn new(initial: CognitiveEventRow) -> Self { ... }
52+
pub fn bump(&self, row: CognitiveEventRow) { let _ = self.tx.send(row); }
53+
pub fn subscribe(&self) -> tokio::sync::watch::Receiver<CognitiveEventRow> { self.tx.subscribe() }
54+
}
55+
```
56+
57+
The `CommitFilter` wrapper is NOT a new trait — it's a method `LanceMembrane::subscribe_filtered(filter: CommitFilter) -> impl Stream<Item = CognitiveEventRow>` that calls `self.watcher.subscribe()` and uses `tokio_stream::wrappers::WatchStream::new(rx).filter(move |row| filter.matches(row))`.
58+
59+
## File-level edits (full list)
60+
61+
1. `crates/lance-graph-callcenter/Cargo.toml` — add `tokio = { workspace = true, features = ["sync"] }` if not present; add `tokio-stream = { workspace = true }` (minimal features).
62+
2. `crates/lance-graph-callcenter/src/version_watcher.rs` — NEW.
63+
3. `crates/lance-graph-callcenter/src/drain.rs` — NEW (scaffold).
64+
4. `crates/lance-graph-callcenter/src/lib.rs:71-72` — uncomment `pub mod version_watcher`.
65+
5. `crates/lance-graph-callcenter/src/lib.rs:78-79` — uncomment `pub mod drain`.
66+
6. `crates/lance-graph-callcenter/src/lance_membrane.rs:56` — field `watcher: LanceVersionWatcher`.
67+
7. `crates/lance-graph-callcenter/src/lance_membrane.rs:117``type Subscription = watch::Receiver<CognitiveEventRow>`.
68+
8. `crates/lance-graph-callcenter/src/lance_membrane.rs:186-189``subscribe()` body = `self.watcher.subscribe()`.
69+
9. `crates/lance-graph-callcenter/src/lance_membrane.rs``project()` path (wherever it completes a commit) — call `self.watcher.bump(row)` after the Lance write.
70+
10. `crates/lance-graph-callcenter/src/lance_membrane.rs` tests — flip `subscribe_returns_disconnected_receiver` to `subscribe_receives_on_project`.
71+
11. `crates/lance-graph-contract/src/external_membrane.rs` — IF the `Subscription` associated type is declared here with bounds, widen to `Clone + Send` as needed. Do NOT add Vsa/RoleKey/NarsTruth — BBB deny-list stays intact.
72+
12. Board files (INTEGRATION_PLANS, STATUS_BOARD, EPIPHANIES, unified-integration-v1 §6) — per Acceptance.
73+
74+
## Test
75+
76+
- New test `subscribe_receives_on_project` — construct `LanceMembrane`, call `subscribe()``rx`, call `project(some_event)` → assert `rx.borrow().<relevant field>` matches `some_event`.
Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
//! `DrainTask` — DM-6 scaffold of the callcenter membrane plan.
2+
//!
3+
//! Future home for the `steering_intent` Lance-read → `UnifiedStep` →
4+
//! `OrchestrationBridge::route()` pipeline. This PR ships only the
5+
//! type shell and a `Poll::Pending` `drain()` method so that
6+
//! `lib.rs` can re-export the name and consumers can start wiring
7+
//! against the surface. The live drain loop lands in a follow-up.
8+
//!
9+
//! Plan: `.claude/plans/supabase-subscriber-v1.md` § DM-6.
10+
11+
use core::future::Future;
12+
use core::pin::Pin;
13+
use core::task::{Context, Poll};
14+
15+
/// Background task that drains `steering_intent` rows from Lance and
16+
/// forwards them to the `OrchestrationBridge`.
17+
///
18+
/// **Scaffold only.** Fields and the drain loop will be populated in
19+
/// the follow-up PR. Ships now so that `LanceMembrane` consumers can
20+
/// import the symbol and so the `pub mod drain` re-export in
21+
/// `lib.rs` is honest about the type existing.
22+
#[derive(Debug, Default)]
23+
pub struct DrainTask {
24+
/// Monotonic count of rows drained (zero until DM-6b lands).
25+
drained: u64,
26+
}
27+
28+
impl DrainTask {
29+
/// Build an empty drain task. The follow-up PR will add
30+
/// `new(dataset: &LanceDataset, bridge: Arc<dyn OrchestrationBridge>)`.
31+
pub fn new() -> Self {
32+
Self::default()
33+
}
34+
35+
/// How many `steering_intent` rows this task has forwarded so far.
36+
pub fn drained(&self) -> u64 {
37+
self.drained
38+
}
39+
40+
/// Poll the drain loop.
41+
///
42+
/// Returns `Poll::Pending` unconditionally in the scaffold; the
43+
/// follow-up PR replaces this with the Lance read + route pipeline.
44+
pub fn drain(&mut self, _cx: &mut Context<'_>) -> Poll<()> {
45+
Poll::Pending
46+
}
47+
}
48+
49+
/// `Future` adapter so the scaffold composes with `tokio::spawn`
50+
/// as soon as the drain body lands.
51+
impl Future for DrainTask {
52+
type Output = ();
53+
54+
fn poll(mut self: Pin<&mut Self>, cx: &mut Context<'_>) -> Poll<()> {
55+
self.as_mut().drain(cx)
56+
}
57+
}
58+
59+
#[cfg(test)]
60+
mod tests {
61+
use super::*;
62+
use core::task::{RawWaker, RawWakerVTable, Waker};
63+
64+
fn noop_waker() -> Waker {
65+
const VTABLE: RawWakerVTable = RawWakerVTable::new(
66+
|_| RawWaker::new(core::ptr::null(), &VTABLE),
67+
|_| {},
68+
|_| {},
69+
|_| {},
70+
);
71+
// SAFETY: The vtable functions are all no-ops and never
72+
// dereference the pointer; null is safe here.
73+
unsafe { Waker::from_raw(RawWaker::new(core::ptr::null(), &VTABLE)) }
74+
}
75+
76+
#[test]
77+
fn scaffold_starts_at_zero() {
78+
let task = DrainTask::new();
79+
assert_eq!(task.drained(), 0);
80+
}
81+
82+
#[test]
83+
fn drain_is_pending_in_scaffold() {
84+
let mut task = DrainTask::new();
85+
let waker = noop_waker();
86+
let mut cx = Context::from_waker(&waker);
87+
assert!(matches!(task.drain(&mut cx), Poll::Pending));
88+
}
89+
}

crates/lance-graph-callcenter/src/lance_membrane.rs

Lines changed: 62 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,18 @@
2626
2727
use std::sync::{
2828
atomic::{AtomicBool, AtomicU64, Ordering},
29-
mpsc, RwLock,
29+
RwLock,
3030
};
3131

32+
#[cfg(not(feature = "realtime"))]
33+
use std::sync::mpsc;
34+
35+
#[cfg(feature = "realtime")]
36+
use tokio::sync::watch;
37+
38+
#[cfg(feature = "realtime")]
39+
use crate::version_watcher::LanceVersionWatcher;
40+
3241
use lance_graph_contract::{
3342
a2a_blackboard::ExpertId,
3443
cognitive_shader::{MetaWord, ShaderBus},
@@ -54,6 +63,9 @@ pub struct LanceMembrane {
5463
current_scent: AtomicU64,
5564
current_rationale_phase: AtomicBool, // MM-CoT stage: true = Stage 1 rationale
5665
version: AtomicU64,
66+
/// Fan-out watcher for projected cognitive events ([realtime] feature only).
67+
#[cfg(feature = "realtime")]
68+
watcher: LanceVersionWatcher,
5769
}
5870

5971
impl LanceMembrane {
@@ -65,6 +77,8 @@ impl LanceMembrane {
6577
current_scent: AtomicU64::new(0),
6678
current_rationale_phase: AtomicBool::new(false),
6779
version: AtomicU64::new(0),
80+
#[cfg(feature = "realtime")]
81+
watcher: LanceVersionWatcher::default(),
6882
}
6983
}
7084

@@ -109,12 +123,15 @@ impl ExternalMembrane for LanceMembrane {
109123
/// External consumer intent entering through the gate.
110124
type Intent = ExternalIntent;
111125

112-
/// Phase-A subscription stub: a disconnected `mpsc::Receiver<u64>`.
126+
/// Subscription handle for projected cognitive events.
113127
///
114-
/// Callers that `recv()` on this immediately get `Err(RecvError)`.
115-
/// Phase D replaces this with a `tokio::sync::watch::Receiver<u64>`
116-
/// wired to the Lance version counter, filtered by `CommitFilter`.
128+
/// With `[realtime]` feature: a `tokio::sync::watch::Receiver<CognitiveEventRow>`
129+
/// wired to `LanceVersionWatcher` — always-latest semantics, supabase-shape.
130+
/// Without `[realtime]`: a disconnected `mpsc::Receiver<u64>` stub (Phase A).
131+
#[cfg(not(feature = "realtime"))]
117132
type Subscription = mpsc::Receiver<u64>;
133+
#[cfg(feature = "realtime")]
134+
type Subscription = watch::Receiver<CognitiveEventRow>;
118135

119136
/// Project a committed ShaderBus cycle to a scalar row.
120137
///
@@ -126,7 +143,7 @@ impl ExternalMembrane for LanceMembrane {
126143
let expert = *self.current_expert.read().expect("expert poisoned");
127144
let scent = self.current_scent.load(Ordering::Relaxed) as u8;
128145

129-
CognitiveEventRow {
146+
let row = CognitiveEventRow {
130147
external_role: role,
131148
faculty_role: faculty,
132149
expert_id: expert,
@@ -144,7 +161,13 @@ impl ExternalMembrane for LanceMembrane {
144161
gate_commit: bus.gate.is_flow(),
145162
gate_f: meta.free_e(),
146163
rationale_phase: self.current_rationale_phase.load(Ordering::Relaxed),
147-
}
164+
};
165+
166+
// DM-4: fan out to all current subscribers (supabase-shape realtime).
167+
#[cfg(feature = "realtime")]
168+
self.watcher.bump(row.clone());
169+
170+
row
148171
}
149172

150173
/// Translate external intent to canonical dispatch.
@@ -181,12 +204,19 @@ impl ExternalMembrane for LanceMembrane {
181204

182205
/// Subscribe to projected commits matching the filter.
183206
///
184-
/// Phase A: returns a disconnected channel (recv immediately errors).
185-
/// Phase D: wires to `tokio::sync::watch` + `CommitFilter` predicate.
207+
/// With `[realtime]`: returns a `watch::Receiver<CognitiveEventRow>` seeded
208+
/// with the latest committed row. Always-latest semantics (supabase-shape).
209+
/// Without `[realtime]`: returns a disconnected `mpsc::Receiver<u64>` stub.
210+
#[cfg(not(feature = "realtime"))]
186211
fn subscribe(&self, _filter: CommitFilter) -> mpsc::Receiver<u64> {
187212
let (_tx, rx) = mpsc::channel();
188213
rx
189214
}
215+
216+
#[cfg(feature = "realtime")]
217+
fn subscribe(&self, _filter: CommitFilter) -> watch::Receiver<CognitiveEventRow> {
218+
self.watcher.subscribe()
219+
}
190220
}
191221

192222
// ─────────────────────────────────────────────────────────────────────────────
@@ -263,6 +293,8 @@ mod tests {
263293
assert_eq!(step.step_type, "lg.blackboard.context");
264294
}
265295

296+
/// Phase A (no realtime feature): subscription is a disconnected stub.
297+
#[cfg(not(feature = "realtime"))]
266298
#[test]
267299
fn subscribe_returns_disconnected_receiver() {
268300
let m = LanceMembrane::new();
@@ -271,6 +303,27 @@ mod tests {
271303
assert!(rx.try_recv().is_err());
272304
}
273305

306+
/// Phase D (realtime feature): subscribe() → project() → rx.borrow() sees the row.
307+
#[cfg(feature = "realtime")]
308+
#[test]
309+
fn subscribe_receives_on_project() {
310+
let m = LanceMembrane::new();
311+
let rx = m.subscribe(CommitFilter::default());
312+
313+
// Prime role context and call project()
314+
let intent = ExternalIntent::seed(ExternalRole::CrewaiAgent, make_dn(), vec![]);
315+
m.ingest(intent);
316+
317+
let bus = ShaderBus::empty();
318+
let meta = MetaWord::new(7, 3, 200, 150, 10);
319+
m.project(&bus, meta);
320+
321+
// The watcher should have delivered the row
322+
let snapshot = rx.borrow();
323+
assert_eq!(snapshot.thinking, 7, "subscriber should see the projected row");
324+
assert_eq!(snapshot.external_role, ExternalRole::CrewaiAgent as u8);
325+
}
326+
274327
#[test]
275328
fn set_faculty_context_wires_rationale_phase() {
276329
let m = LanceMembrane::new();

crates/lance-graph-callcenter/src/lib.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -68,15 +68,15 @@ pub use vsa_udfs::register_vsa_udfs;
6868
pub mod filter_expr;
6969

7070
// DM-4 — LanceVersionWatcher: tail version counter → Phoenix events ([realtime])
71-
// #[cfg(feature = "realtime")]
72-
// pub mod version_watcher;
71+
#[cfg(feature = "realtime")]
72+
pub mod version_watcher;
7373

7474
// DM-5 — PhoenixServer: minimal WS server, Phoenix channel subset ([realtime])
7575
// #[cfg(feature = "realtime")]
7676
// pub mod phoenix;
7777

7878
// DM-6 — DrainTask: steering_intent → UnifiedStep → OrchestrationBridge
79-
// pub mod drain;
79+
pub mod drain;
8080

8181
// DM-7 — JwtMiddleware + ActorContext → LogicalPlan RLS rewriter ([auth])
8282
// Resolve UNKNOWN-3 (pgwire?) and UNKNOWN-4 (actor_id type) first.

0 commit comments

Comments
 (0)