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 1 Travel Ruter · cache and staleness fold 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 LIVE NOT TO SCALE Itinerary snapshot PostGIS · t₀ · local local read Planner UI day plan · map · notes then refresh Mapbox tiles · geocode OpenRoute road ETAs Amadeus hotels · often stale UI language ink = snapshot rust = live / late age of the schedule t₀ 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 LIVE NOT TO SCALE Itinerary snapshot PostGIS · t₀ · local local read Planner UI day plan · map · notes then refresh Mapbox tiles · geocode OpenRoute road ETAs Amadeus hotels · often stale UI language ink = snapshot rust = live / late age of the schedule t₀ 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 2 Save4later · capture to graph fold 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 → GRAPH NOT TO SCALE Clipboard zero taps Share / a11y URL bar · intent MediaSession playing now Room library Room v4 → v15 · no wipe WorkManager FastAPI worker enrich · embed synthesise SurrealDB graph + vector “What for you” returns to the phone Feed 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 → GRAPH NOT TO SCALE Clipboard zero taps Share / a11y URL bar · intent MediaSession playing now Room library Room v4 → v15 · no wipe WorkManager FastAPI worker enrich · embed synthesise SurrealDB graph + vector “What for you” returns to the phone Feed 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 3 Rooklight · the tool loop fold 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 WAIT NOT TO SCALE Agent / LLM prose is not the test action result Rooklight harness intercept · log · poll read · edit stdout · exit Real filesystem not a mock of bash poll while jobs running wait for the next tick no 30s sleep trajectory log read docs/api.md bash npm install assert actions not the wording If 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 WAIT NOT TO SCALE Agent / LLM prose is not the test action result Rooklight harness intercept · log · poll read · edit stdout · exit Real filesystem not a mock of bash poll while jobs running wait for the next tick no 30s sleep trajectory log read docs/api.md bash npm install assert actions not the wording If 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