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
}