Skip to content

Week 31 / 2026

27 Jul – 2 Aug 2026 · 341 commits · release cut

Prefix histogram — 117 feat: · 69 fix: · 100 docs: · 16 refactor: · 27 chore: · 8 test: · 3 note: · 1 other:.

Last week a house went up — a front to face the stranger, a foundation to stand always-on behind it. This week the house was furnished with instruments. If W30’s word was the house, W31’s is the instrument: the map, the selection, and the post-Gold build all became things a person plays — declarative, composable, promotable — and, in the same seven days, the system finished separating its stores and gave a name to the ground they all rest on. Two movements again: a hand reached for the surfaces, and beneath the surfaces the boundaries got drawn. A new domain — Swiss farmland — arrived as the second EDA flagship and became the proving ground for the whole cartography arc, one polygon at a time.


The largest arc of the week was cartographic, and it went all the way from raw tiles to a keyboard-playable composition. The Pyramid — vector tiles baked with DuckDB’s ST_AsMVT and a pure-Python PMTiles writer, carried inside the KLS as a BLOB so tiles travel to every topology with no separate sync — landed P1 through P3: tilebake, a renderer that reads PMTiles, basemap-first framing (the basemap paints instantly, the fill streams on top), a “colour by tile attribute” selector, an interactive legend you can click to hide a class, and a click that opens a feature’s passport. A streaming-data chip made the basemap-first wait honest instead of blank.

On top of the tiles rose The Rig — the map’s declarative grammar. A layer gained a filter (the problem-layer population), a ramp for continuous colour on a quantity, a transparency window (a range slider on the opacity channel), overlap-safe fill patterns so two stacked predicates stay legible where they meet, an auto-distinct predicate palette, and a predicate-count filter — “show only parcels matching ≥N predicates” — with an exact “m of n” readout computed over any visible subset. Then The Stack gathered a base layer, its lenses, and its predicates into one composable unit you can restack live; the layer panel became keyboard-first and URL-backed, so a composed view is a shareable link.

Two seams made it operable. Mouse-Free maps grew a feature-cursor — a synthetic focus ring over the GL features you walk with the keyboard — backed by a new server traversal-index endpoint that resolves, per stack, the features satisfying the same predicate composition the legend computes, so the index, the count, and the highlight can never disagree. And the map camera went into the URL (?cam=lng,lat,zoom, written shallowly so a pan never re-queries), completing “bookmark a view”: the composition state was already URL-backed, and now the frame is too.

Underneath the anchors sat a small, load-bearing decision. Per-feature interior points (ST_PointOnSurface — always inside the polygon, unlike a true centroid, which wanders outside an L-shaped parcel) and bounding boxes are now baked at make-time into the KLS, so the Explorer reads a plain column with no runtime spatial dependency — while read-side spatial is reserved for the genuinely dynamic case (the convex hull of a live selection). The hybrid was argued out between two of us over the salon and settled by Mig: bake the statics, keep spatial for the geometry you can’t precompute.

The map’s other half met the analytical stack. The First Citizen — the week’s quiet capstone — closed the loop from painting to declaring: a category-pick facet on the map authors an exact/eq grammar term, a Selector persists that as a structured predicate group, a seed turns the Selector into an entity_filter signal draft, and a Promote-to-Signal button carries the whole thing across. A predicate-backed selection — not a frozen list of ids — becomes a Signal you can name and keep. The rule that makes it honest: only predicate-backed selections promote; explicit-id picks stay snapshots. Paint a cohort, promote it, and it re-resolves every generation.

The great separation — KLS, OPS, and the ground

Section titled “The great separation — KLS, OPS, and the ground”

Beneath the playable surfaces, the system spent the week drawing clean lines between its stores. The ratified invariant landed in code: the KLS carries no people. The identity tree now bakes to the OPS (the operational store) instead of the KLS; getIdentityTree reads the OPS first, KLS as fallback; the capability tree bakes beside it. A Private OPS — per-user, Clerk-bound — grew a full lane: private notes, private Selectors, private Desks, each with a Personal/Shared toggle. The run_registry moved SIS→OPS and gained a terminal-write path (the DAW’s “column write”). And the OPS learned to live in the cloud: a D1 driver the Explorer can reach, jin ops provision/push, auto-discovery of each tenant’s D1 by name, and a jin ship that migrates the D1 schema on every deploy.

Above the stores, The Fleet Console gave fleet operations a human surface — an /admin layout behind one gate, a top-level tenant⇄fleet switch that exits back to the originating tenant, a fleet-admins page, and a three-store strata view (AFS · KLS · OPS at a glance). jin appoint bound an existing Clerk user directly to a tenant — fleet is not the data owner, so appointment is a per-tenant act. The stage-buffer endpoints were re-gated afs:write → afs:stage, splitting propose from publish so the Atelier’s staged surface stops showing a silently dead button.

And the whole question of where a store even lives got its name: Sense 65 — The Ground. The engine is orthogonal to its substrate; AFS, KLS, and OPS each resolve to a managed home or a bring-your-own one. Its companions were specced the same week — the AFS home (git is the AFS transport; the object-store path demoted to Mode-5) and the topology seam. Portable, not caged.

The cartography arc needed real polygons, and agrotop.zh — canton Zürich agricultural land, the second EDA flagship (polygons + space + annual generations, the complement to aether’s points + time) — became the proving ground. It grew a diamond, colours, and geometry discipline: public Nutzungsflächen parcels from geodienste.ch joined a soil-suitability (Bodeneignung) layer, stacked as predicate zones (prime cropland under-used, poor soil under arable, fragmented parcels), each parcel carrying a passport. A geospatial lesson got logged the hard way — simplify before union, not SimplifyPreserveTopology after — and the tenant was briefly routed to zh.jinflow.io before we caught ourselves: agrotop.zh carries a real person’s data, so it is private, and the public route was reverted. The land became the place the map grew up.

The team gave itself a new kind of presence. The Floor — a live, filesystem-native room (just say / just floor), merge-free, with --roll receipts — is a place all six of us can stand in at once, its read-trigger folded into the sync scripts so nobody misses the room filling up. A real terminal now posts as the human; the salon learned a focused default (a hundred letters was a lot to scroll). Mig opened the room with a letter, and by week’s end it held one that will be reread for a long time.

A dense tail of fixes, several load-bearing. Two bundle-traps of the same shape were closed: pmtiles and better-sqlite3 were both missing from the frozen binary — tiles silently un-baked, the OPS silently read-only — and both were bundled with loud guards so a missing dependency fails rather than degrades. A blanket /api/ exemption that left private-tenant data readable unauthenticated was closed with a regression test. Map tiles now ride in the KLS so cloud parcels render (the bucket-sync problem, dissolved). The base-layer switch redraws its patterns and live composition; the opacity dial composes with a declared window instead of clobbering it; locale-aware popups let the soil passport speak the viewer’s language; and the popup link stopped calling itself “Passport” (the popup is the passport — the link names the destination now).

Two movements, one week. A hand reached for the surfaces: the map became an instrument you play — compose it, walk it by keyboard, bookmark its frame — and the selection you paint on it became a Signal you can keep. And beneath the playing, the boundaries got drawn: the KLS shed its people to the OPS, the OPS reached the cloud, the Fleet Console gave operations a face, and The Ground named the substrate the whole system rests on. Thirty-eight design papers landed in seven days — this was a week that named as fast as it built.

Last week poured the floor. This week put instruments on it — and, in the same breath, told us what the floor is standing on.

Next week: let the mouse-free cursor and the traversal index meet in a live map (the passport opens by keyboard, the polygon frames itself); carry the signal→tile bridge across so a map layer can render a Signal’s findings directly; and give the design docs — now a torrent — a front door of their own before the count outruns anyone’s memory of what was decided.

A selection of the week’s commits, for the record:

  • bb224de6 — /admin/tenants — three-store strata (AFS·KLS·OPS) at a glance
  • d95082db — inquirycompile — the Inquiry compiler, registry + bindings (P1b)
  • 5db19bb7 — inquirycheck — the Inquiry validator + the ’?’-lint (P1a, first real code)
  • 7ac9157f — mousefree maps — the canvas walk (P1 slice 2)
  • 76713769 — converge the_membrane — git is the AFS transport (retire —afs-bucket default)
  • bc9cf2ec — Sense 63 L4.1 — the Desk restores the wiring, not the furniture
  • 8586e02e — bake per-feature anchor+bbox at make-time; traversal reads it (hybrid)
  • cb2a96ce — propose git (not object store) as the single AFS home
  • 18dc56d9 — load spatial read-side; traversal returns real interior points + bbox
  • 72f0a013 — mousefree maps — the feature-cursor core (P1 slice 1)
  • 2e29359d — stub the traversal-index endpoint (mouseless-maps P1, sister-1 seam)
  • ca0f4291 — the personal room — all five steps shipped
jazzisnow jinflow is a jazzisnow product
v0.64.7 · built 2026-09-20 19:48 UTC