Quilt·
15 boundaries

Laminar Boundaries

Fifteen places where the substrate alone isn't enough. Each boundary has a bridge — an existing Quilt repo, or a roadmap item, or a code pattern you can use today. The boundaries are found, not designed. Like carving hauls on a boat hull to find the waterline.

01Filter

02The 15 boundaries

1. Relational queries

Limit: the substrate stores values, not relations — joins across many cells are O(n) and have no index.

Bridge: hand-rolled index cells today; quilt-sql (roadmap, 2 weeks) — a query layer that compiles to substrate BIND/LINK events.

// Index cells, updated on LINK
sub.link('order:42', 'customer:7', 'belongsTo');
sub.bind('idx:customer:7', [
  ...(sub.view('idx:customer:7') || []), 'order:42'
]);

2. Durable message delivery

Limit: the substrate's journal is in memory — a crash loses anything not yet persisted.

Bridge: quilt-saddle-bridge (now) — hash-chained JSONL to disk; quilt-delivery (Month 2) for at-least-once across the network.

const bridge = new SaddleBridge('./journal.jsonl');
sub.on('*', (cell) => bridge.append({
  op: cell.op, id: cell.name, value: cell.value,
}));

3. Graph traversal at scale

Limit: following a chain of LINKS is O(n) per hop; the substrate has no shortest-path primitive.

Bridge: hand-rolled index cells (now); quilt-graph (roadmap, 4 weeks) — BFS/DFS/Pagerank as a substrate effect.

function bfs(start, rel, maxHops) {
  const visited = new Set([start]);
  for (let hop = 0; hop < maxHops; hop++) {
    for (const n of visited) {
      for (const link of sub.links) {
        const [from, to, r] = link.split('|');
        if (from === n && r === rel) visited.add(to);
      }
    }
  }
  return [...visited];
}

4. Sub-millisecond cache

Limit: the substrate's BIND is O(1) but the journal allocation is 200ns+ — too slow for L1/L2 cache workloads.

Bridge: quilt-cache (roadmap, 1 week) — a sharded in-process hash table; writes to the substrate journal are async, the cache reads are sync.

const cache = new QuiltCache({ shards: 64, size: 1e7 });
sub.on('*', (cell) => cache.set(cell.name, cell.value));
const v = cache.get('hot-key'); // 200ns

5. Auth and permissions

Limit: every cell is readable by default — the substrate has no notion of identity or capability.

Bridge: capability cells + a wrapper (now); quilt-auth (roadmap, Month 1) — identity, scopes, signed capabilities.

const cap = sub.view('cap:read:orders');
if (cap && cap.principal === 'alice') {
  return sub.view('order:42');
}

6. Real-time pub/sub to 10K

Limit: the bus walks every cell on every publish — O(n) per publish, capped at a few thousand cells.

Bridge: quilt-bus + topic sharding (now); quilt-multicast (roadmap) — kernel-bypass multicast for 10K+ subscribers.

// Sharded bus: each topic lives on one shard
const shard = 'shard-' + hash(topic) % 16;
sub.link(subscriber, `${shard}:${topic}`, 'subscribes');

7. Polyglot persistence

Limit: the substrate doesn't know about SQL or Redis — only cells in memory.

Bridge: quilt-saddle-bridge JSONL to any database (now); quilt-journal-rockdb (roadmap) — RocksDB-backed journal for 1M+ events/sec.

// saddle-bridge → postgres COPY
sub.on('*', (cell) => {
  pg.query('INSERT INTO events (op, id, value, t) VALUES ($1, $2, $3, $4)',
    [cell.op, cell.name, cell.value, cell.t]);
});

8. Full-text search over values

Limit: the substrate can compare values, but it has no inverted index or tokenization.

Bridge: quilt-search (roadmap, 2 weeks) — a B-tree + token index over cell values.

const index = new QuiltSearch(sub);
sub.on('*', (cell) => index.add(cell.name, cell.value));
const results = index.query('casey cowboy'); // ranked

9. CRDT collaborative editing

Limit: two writers binding the same cell produce last-write-wins — no merge semantics.

Bridge: quilt-crdt (roadmap, 4 weeks) — lattice-typed cells where BIND becomes a join-semilattice operation.

// A G-counter cell — concurrent increments merge by max
sub.bind('views', GCounter.empty());
sub.effect('views', (c) => c.increment(actorId));

10. AI/LLM streaming

Limit: the substrate's BIND is atomic — a 30-second LLM response is one cell change, not a stream.

Bridge: quilt-casting async identities (now); quilt-stream (roadmap) — chunked BINDs that fire as tokens arrive.

const stream = sub.stream('response');
for await (const chunk of llm.stream(prompt)) {
  stream.append(chunk);
}

11. Time-series at high cardinality

Limit: every TICK+EFFECT pair is a journal entry — 1M metrics × 1Hz = 1B events/day, expensive to replay.

Bridge: quilt-timeseries (roadmap, 3 weeks) — delta-of-delta encoding + downsampling in the journal.

const ts = sub.timeseries('cpu.host-7', { codec: 'delta-of-delta' });
ts.record(0.42, Date.now());
const hourly = ts.downsample('1h', 'avg');

12. Distributed consensus (Raft)

Limit: the substrate is a single node — no quorum, no leader election, no log replication.

Bridge: manual replication via saddle-bridge (now); quilt-consensus (roadmap) — Raft on top of the journal, with BIND as the replicated state machine.

const raft = new QuiltRaft(sub, { peers: ['n1', 'n2', 'n3'] });
raft.onCommit((event) => sub.apply(event));

13. Multi-region replication

Limit: a substrate in us-east and a substrate in eu-west don't share state — last-writer-wins is wrong at 100ms RTT.

Bridge: saddle-bridge + a replicator loop (now); quilt-replicator (roadmap) — CRDT + Raft for active-active across regions.

const rep = new QuiltReplicator(sub, {
  regions: ['us-east', 'eu-west'],
  mode: 'crdt',
});

14. WASM sandboxing untrusted code

Limit: a cell can run arbitrary JS or C, but the substrate can't constrain what it accesses.

Bridge: quilt-vm-wasm (now) — each cell runs in a WASM module with a host-defined interface; quilt-wasi-cell (roadmap) — full WASI capability-based sandboxing.

const cell = await WasmCell.load('./plugin.wasm', {
  allowedCells: ['input'], // capability list
});
sub.bind('plugin', cell);

15. Hardware sensors at high frequency

Limit: the substrate's TICK is software — sensors at 1MHz generate events faster than the journal can absorb.

Bridge: quilt-esp32 + DMA ring buffer (now); quilt-sensor-bus (roadmap) — direct-to-journal DMA with sample-on-difference.

// On the ESP32, DMA fills a ring buffer; the substrate samples on difference
void app_main() {
  setup_dma('adc1', SAMPLE_RATE_1MHZ);
  sub.on('adc1', on_adc_change);  // only fires on delta
}

03The principle

The boundaries are found, not designed. Like carving hauls on a boat hull to find the waterline. You push the boat into rougher water and watch where it starts to take on. That place is a boundary. The chart is the cowboy's last ride.

The substrate is the boat. The boat has a waterline. The waterline is the boundary. The boundary is the chart. The chart is the cowboy.