March 2026 — The month the architecture grew language for itself
1 March – 31 March 2026 · 1,337 commits · v0.4 → v0.31
March 2026 is the month nuMetrix became jinflow. Not just in name — though the rename was the visible moment — but in architecture, distribution, vocabulary, and ambition. On March 1, the codebase was a single hospital-analytics project with a private installer and a “Mold” tab. On March 31, jinflow was four named packs (numetrix, millesime, alptrack, interlogic), a self-contained binary distributable across three operating systems, a docs site at docs.jinflow.io with 153 trilingual pages, a Cloudflare-tunneled proxy architecture, an identity & passes system, a four-level Configuration Engine, and a docs roadmap that had been written, drifted, and detected.
Thirteen hundred and thirty-seven commits. Roughly forty-three a day, every day, for a month. The shape that emerged was bigger than the shape that went in.
The vocabulary moment
Section titled “The vocabulary moment”The decisive shift happened in the first week of the month. Three commits, all on a Tuesday afternoon:
- a673d63c — “Introduce AFS/KLS/SIS store acronyms in jinflow concept and glossary.” Six letters. Three nouns. A complete mental model.
- d454a7a3 — “Add ArtifactStore API, jinflow init, and AFS-aware CSV intake.” The acronym becomes API.
- 1e7fe1d2 — “Add AFS (Artifact Store) concept document with branches-as-scenarios.” The API gets a paper.
Before this, the project had been describing itself as “hospital material flow analytics with a probe-hypothesis-diagnosis pipeline.” After: “an analytical engine for diagnostic data pipelines, declarative, dbt + DuckDB-backed, distributed as packs.” The engine became the product; the hospital pack became one example.
The pack-split phases (0, 1, 2, 3 across 83108c55, 3281694d, ba8eaca2, f2c09080) executed the architectural consequence: domain content lives in packs/<name>/; the engine lives at root; tenant instances live in a separate live_root outside the source tree; the app lives in a deploy_root somewhere else. Four directories, each a single responsibility.
Shippable
Section titled “Shippable”The second week made the rename real on disk. A binary you can hand someone. PyInstaller-built, embedded Python, embedded dbt, bundled charset_normalizer, WeasyPrint native libraries, the pack itself, the report templates. Across 16e3899f, d8d0cd03, 54e4af02, 71e8f79e, 350e393a, and a long tail of Windows cp1252 fixes, the binary went from “doesn’t exist” to “works on three operating systems” in five days.
Thirty-three releases (0.4.0 → 0.7.9) traced the cadence. Most were fixing the previous one.
The companion bet: a second pack. 1562eb07 committed Millésime — winery operations analytics. A domain with nothing in common with hospitals. Three winery tenants. The proof: by Sunday, 08f79a89 shipped four reports (vintage quality, customer portfolio, cellar inventory, appellation performance) with zero engine changes. The architecture from W10 wasn’t just a refactor — it was a forecast.
The second user
Section titled “The second user”The third week is the one that made the difference to anyone outside the author. March 16-22 saw 498 commits — the busiest week in repo history. KLS Store mode (44538efa) — multi-tenant Explorer via DuckDB ATTACH from local dir or R2. Cloudflare Tunnel + Go proxy (2ad49f92, 2e0ccf13) — the architecture that becomes Sense 16 (P2P2P). Cloud R2 sync (dd1f5e30) — KLS uploads as first-class operations. AFS-as-remote-git (f7834bb7, 474c5257, 6dcb7f20) — drift detection, three-party views, auto-stash on pull.
docs.jinflow.io went live. 20cf7916. Within 48 hours: seven roadmap decisions (b9688513), 54-term glossary (972591e6), Tutorial #1 (936c4dd7), a documentation drift detector (c320b5d4), the documentation process documented in the repo (b08199f0), packs reframed as optional (2c3e392b).
And then, on Sunday afternoon, 137c5376 — the milestone document: The Second User. A short paragraph stating that someone other than the author had used the system. That sentence is the load-bearing moment of the month. Everything else is preparation.
Two new packs landed the same week: 20b2d14f (interlogic — logistics) and 3b3f8f5c (alptrack — ski resorts). The architecture was now being tested at four-pack scale.
Identity arrived in three phases on the same Sunday — 7a10fa54 (paper), 1259fcac (capability-filtered sidebar), c908aa5c (server-side enforcement). Capabilities became real authorization, not commentary.
The maintainable foundation
Section titled “The maintainable foundation”The fourth week did the cleanup the third week required. c7537fa5 shipped the Configuration Engine — four-level inheritance (engine → pack → tenant → entity), every Explorer page consuming it within 50 follow-up commits. The decision that no Svelte page would make display decisions again. By Sunday, page size, paging options, sticky headers, format patterns, column visibility, grouping rules, recents title templates, smart decimals, group-by description columns, locale-aware filtering — all of it came from config.yml.
Recents evolved from a popup to a complete navigation surface — Timeline + Unique views, section filters, sort-in-URL, color-coded pills, taxonomy and bitbundle recents, sortable columns (54213a84, 606fe8a0, 352aefa9). The same week, the recents pipeline became pure-functional — testable in isolation.
The KLS Store concurrency audit (01107ae2, d0cde2fb, 0ba8744c, b68b9fca) caught the race conditions the multi-tenant ATTACH model had quietly accumulated. AsyncLocalStorage replaced the module-level singletons. Schema names got catalog-qualified to avoid USE races. SIS files were validated before attach to prevent DB poisoning.
The search grammar formalized (d64ddce4, 6dce8ae9, 1f24daec). The positional target CLI unified (a004f432, 5d1d0caa, 74e21776). The compilers became idempotent (63b1aaf9, ec1f51bb).
The arc of the month
Section titled “The arc of the month”If you read the month as a single sentence: a single-domain analytics project became a distributable engine, complete with its own vocabulary, four packs, a cloud architecture, a docs site, an identity system, and a config engine — and then learned how to maintain itself. The first week named the parts; the second made them shippable; the third put them in front of someone else; the fourth made the seams clean.
The Senses sequence doesn’t exist yet by name. But the pattern that will become the Senses — design papers committed with implementation, no fanfare, just the work — is already the operating mode.
Numbers across the month
Section titled “Numbers across the month”| Metric | Value |
|---|---|
| Commits | 1,337 |
| Releases | ~80 (0.4.0 → 0.31.13, including walkbacks) |
| Packs at start | 1 (numetrix, internal) |
| Packs at end | 4 (numetrix, millesime, alptrack, interlogic) |
| Engine binary | 0 platforms → 3 platforms |
| Docs pages | 0 → 153 trilingual |
| Concept papers committed | ~25 across architecture/, narrative/, design/ |
| Notebook lifecycle | sketchy → first-class with SIS storage + Explorer editing + PDF export |
| Identity capabilities | none → 13, with sidebar filtering and server enforcement |
| Configuration keys | hardcoded → 4-level cascade |
| The Second User | does not exist → does exist |
The mood
Section titled “The mood”The vocabulary work — AFS, KLS, SIS, the pack, the live root, the deploy root — would normally be the kind of refactor that happens late in a project, after years of pain. Here it happened early, on intention. The commit messages this month read like someone who knew what they were building, even when they were still discovering it. The pace was not “we have to ship.” The pace was “this fits, this fits, this fits.”
A month of architecture, in plain sight.