The Loop

Issue 03 · next 1 Oct 2026

Cabinet

Plates

Three schematics, drawn by hand from the systems as we run them. Hover a corner to magnify; open the plate to fold it out into a larger detail and its specimen record.

Plate 1Travel Ruter · cache and stalenessfold out Travel Ruter cache and staleness A local itinerary snapshot is served in under fifty milliseconds; Mapbox, OpenRouteService and Amadeus refresh behind it; the interface marks which values are scheduled and which are live.FIG. 1 · CACHE BEFORE LIVENOT TO SCALEItinerary snapshotPostGIS · t₀ · locallocal readPlanner UIday plan · map · notesthen refreshMapboxtiles · geocodeOpenRouteroad ETAsAmadeushotels · often staleUI languageink = snapshotrust = live / lateage of the schedulet₀stale

Plate 1 · folded out

Travel Ruter cache and staleness A local itinerary snapshot is served in under fifty milliseconds; Mapbox, OpenRouteService and Amadeus refresh behind it; the interface marks which values are scheduled and which are live.FIG. 1 · CACHE BEFORE LIVENOT TO SCALEItinerary snapshotPostGIS · t₀ · locallocal readPlanner UIday plan · map · notesthen refreshMapboxtiles · geocodeOpenRouteroad ETAsAmadeushotels · often staleUI languageink = snapshotrust = live / lateage of the schedulet₀stale
Detail: the snapshot hand-off, where the plan is already on screen · shown at 2×
Subject
Travel Ruter — a planner that serves a day from a local snapshot and refreshes behind it.
Stack
FastAPI · async SQLAlchemy · PostGIS · React · Mapbox GL
Orchestrator
PydanticAI over a WebSocket, multi-model (Claude, GPT, Gemini)
Tool surface
MCP server: destinations, trips, routes, POIs, accommodations, notes, budget, scheduler
Refresh
A stored segment is re-fetched only when it is stale; the document holds the plan
Status
Graduated — the one project here with a production stack
Still open
A confidence interval for a walking time that is not a disclaimer
Plate 2Save4later · capture to graphfold out Save4later capture and sync path Capture from clipboard, share sheet and media session into a Room library, pushed by WorkManager to a FastAPI worker, enriched into SurrealDB, with a synthesis card returning to the phone.FIG. 2 · CAPTURE → ROOM → GRAPHNOT TO SCALEClipboardzero tapsShare / a11yURL bar · intentMediaSessionplaying nowRoom libraryRoom v4 → v15 · no wipeWorkManagerFastAPI workerenrich · embedsynthesiseSurrealDBgraph + vector“What for you” returns to the phoneFeed said sync enabled. Settings said failed. That line is the product.

Plate 2 · folded out

Save4later capture and sync path Capture from clipboard, share sheet and media session into a Room library, pushed by WorkManager to a FastAPI worker, enriched into SurrealDB, with a synthesis card returning to the phone.FIG. 2 · CAPTURE → ROOM → GRAPHNOT TO SCALEClipboardzero tapsShare / a11yURL bar · intentMediaSessionplaying nowRoom libraryRoom v4 → v15 · no wipeWorkManagerFastAPI workerenrich · embedsynthesiseSurrealDBgraph + vector“What for you” returns to the phoneFeed said sync enabled. Settings said failed. That line is the product.
Detail: the return path, the one that disagrees with the feed · shown at 2×
Subject
Save4later — an Android library where capture is free and synthesis is expensive.
Device
Kotlin · Views/XML · Room · WorkManager · Retrofit · Coil · DataStore
Server
FastAPI · SurrealDB 3 in Docker, with a worker for enrichment
Capture
Clipboard, share intent, URL-bar extraction, MediaSession
Schema
Room v15 · seven migrations in place, including a 4→14 jump. No destructive fallback anywhere
Status
Open — a mature prototype, not on the Play Store
Still open
One sync truth. The feed and Settings still tell different stories
Plate 3Rooklight · the tool loopfold out Rooklight tool loop An agent talks to the harness, the harness acts on a real filesystem, and the harness records a trajectory of tool calls that the assertions check instead of the model’s prose.FIG. 3 · REAL I/O, POLLED WAITNOT TO SCALEAgent / LLMprose is not the testactionresultRooklight harnessintercept · log · pollread · editstdout · exitReal filesystemnot a mock of bashpollwhile jobs runningwait for the next tickno 30s sleeptrajectory logread docs/api.mdbash npm installassert actionsnot the wordingIf you mock the shell, you are testing your assumptions.

Plate 3 · folded out

Rooklight tool loop An agent talks to the harness, the harness acts on a real filesystem, and the harness records a trajectory of tool calls that the assertions check instead of the model’s prose.FIG. 3 · REAL I/O, POLLED WAITNOT TO SCALEAgent / LLMprose is not the testactionresultRooklight harnessintercept · log · pollread · editstdout · exitReal filesystemnot a mock of bashpollwhile jobs runningwait for the next tickno 30s sleeptrajectory logread docs/api.mdbash npm installassert actionsnot the wordingIf you mock the shell, you are testing your assumptions.
Detail: the wait, which is a poll rather than a sleep · shown at 2×
Subject
Rooklight — the harness we test the coding agent with, before it is a product.
What it is
A Pi coding-agent extension suite. Pre-release, not on npm
Deepfield
Local-project evidence layer; reads a span, mutates only if its hash still matches
Shell
Background jobs, recoverable logs, LeanCTX-compressed stdout
Wait
Polls the job queue and the agent loop; no fixed sleep anywhere
Assertions
On tool trajectories — which tool, which path, which flag
Still open
Fixture caching, and visual assertions that do not restore the timeouts