Skip to content

Week 13 / 2026 — The Config Engine, and the cleanup behind it

23 March – 29 March 2026 · 385 commits · 0.30.x → 0.31.13

After the firehose of W12, what does week 13 look like? On the surface: 385 commits — a normal heavy week. Under the surface: a single architectural change that touched ~120 commits in seven days. The Configuration Engine landed on Saturday morning with one new file and one CLI command, and then every Explorer surface in the codebase got rewritten to consume it. By Sunday night, no Svelte page was making display decisions on its own. Pagination position, page size options, sticky headers, format patterns, column visibility, grouping rules, recents title templates — all of them moved from hardcoded values to declared config with a 4-level inheritance cascade.

It’s the kind of refactor that only becomes visible later, when someone says “can the pagination be on top instead of bottom?” and you change one line of YAML.

Saturday morning, c7537fa5 shipped “Configuration Engine Phase 1 — config.yml + jin config CLI”. The design doc had landed the day before (cb3ed144). The architecture: four levels of inheritance — engine defaults → pack config.yml → tenant config.yml → entity YAML overrides. Higher levels win. Absent keys fall through.

The migration started immediately:

  • c3125849“pageSize default from config engine, no magic numbers”
  • a9333ffb — paging options from config engine
  • 1892737c — sticky table header with scrollable body, driven by config engine
  • 2f9fe81b — config-driven column visibility — hide from display, keep in export
  • 24f4ffbc — configurable grouping patterns
  • 46ef489e — grouping exclude pattern
  • a752cf80 — configurable format patterns via config engine
  • a2aeafe4 — separate date vs timestamp formatting
  • 0e79074c“smart decimals — show what the value needs, not a fixed count”

By Sunday afternoon, 3f926aac added “entity-level config overrides (Level 3) in config engine.” The full 4-level cascade was running, and every page consuming the engine was about ten lines shorter than it had been on Saturday morning.

This is the architecture that powers every Explorer page’s display behaviour today. The pages don’t decide anything anymore. They read.

The thread started on Saturday last week (W12) with a small recents popup. This week recents became a feature with depth.

  • Saturday, 54213a84“Recents page — all recent visits on one searchable page”
  • f77ee220 — configurable recents title templates via config engine
  • 42d3794a — recents show human-readable titles instead of raw IDs
  • 86003d06 — bitbundle recents — record visits + sidebar panel
  • 7d3b8a2d — taxonomy recents
  • Sunday, 606fe8a0“recents page with Timeline + Unique views and section filters”
  • 352aefa9“recents pills with section colors, multi-select, / to search”

What started as a popup became a full second-class navigation surface — searchable, filterable by section, with two presentation modes (Timeline shows every visit, Unique aggregates by entity). The pills got color-coded by section type. The recents URL grew sort params. And the underlying pipeline became pure-functional enough to unit-test (which it eventually was, three weeks later in the W17 refactor).

The mnemonic field:value from W12 expanded into a small grammar this week:

  • d64ddce4“search qualifiers — =exact and ~regex”
  • 6dce8ae9“case-insensitive search with =i and ~i prefixes”
  • 1f24daec — design doc: search syntax

By Sunday, search had six progressive levels — bare word, =exact, ~regex, !field:value, case-insensitive variants, autocomplete. The grammar would survive intact into May.

The KLS Store ATTACH mode landed Monday of W12 and was the headline architecture. This week was the bug-finding week — the audit that catches the holes a shipped-too-fast multi-tenant DB driver leaves.

  • 2236f355“lineage queries crash in KLS store mode (legacy sync DB calls)”
  • 0b44aaaa“remove dev.duckdb fallback, throw clear error when no DB context”
  • d0cde2fb“use AsyncLocalStorage for request-scoped DB context”
  • 0ba8744c“fully qualify schema with catalog name to avoid USE races”
  • 01107ae2“systematic multi-tenant store mode audit”
  • 0262bc79 — return compositeId as data.tenant in KLS store mode
  • aaa8f5e9 — skip schema discovery, use known tenantId for metadata queries
  • 7fe77f43 — replace information_schema with duckdb_tables()/duckdb_columns()
  • 32075d47 — tenant picker stats use runWithDbContext for catalog resolution
  • b68b9fca“validate SIS files before ATTACH to prevent DB poisoning”

The big idea: every request gets its own AsyncLocalStorage-scoped DB context. The module-level singletons that worked in single-tenant mode become race conditions in multi-tenant mode. Sunday afternoon, the concurrency model was correct.

Friday’s a004f432 introduced _resolve_target“validated pack.tenant pattern resolver.” The next eleven commits unified every CLI command to the same shape: jinflow make numetrix.demo, jinflow snapshot numetrix.demo, jinflow us numetrix.demo. No more --tenant flag inconsistency. The pack-qualified composite ID became the universal target.

  • 14dd4a6c_resolve_single_target, _resolve_target_or_default
  • 5d1d0caajinflow make positional
  • 74e21776 — unify remaining commands
  • 756263e8 — snapshot, status, clone, notebook-pdf
  • 8faf76a8jinflow us
  • 0640bf9c“jinflow instance: manage deployed Explorer instances”

The CLI is consistent. From this week, you can predict the syntax of a command you haven’t seen.

A small move with big downstream effects: 63b1aaf9“write-only-if-changed for compilers — idempotent builds.” Followed by ec1f51bb“touch output files when compiler writes nothing — fixes mtime loop.”

The compilers stopped lying about freshness. Mtime-based incremental builds (the model from W11) finally worked correctly. 9dc6c39c closed the gap on incremental: “always rebuild registry + notebooks in incremental builds.” 24aad6e7: “incremental build skips registry when only entity YAML changed.”

By Sunday, jin make on a clean tree was fast and correct. That sentence had not been true on Monday.

The dimension group-by feature accumulated five careful fixes:

  • 1490c0a8“group-by label resolution with entity config + labelColumn fallback”
  • 3744a556 — group-by shows description column alongside code
  • b073f356 — businessId force-added to group-by ignoring exclude config
  • ea9b147c — no label column when grouping by boolean (is_/has_ prefix)
  • feb60247“locale-aware column filtering — hide non-active language columns”

The taxonomy tree got integrated into dimension pages (5a7b7fa3). The declarative column switcher landed (09263ce4). The Explorer became a place where complex categorical analysis lived next to the data instead of needing a separate report.

  • Auto-stash on AFS pull (6d1fcf33 earlier in W12, expanded this week)
  • Branch indicator with unpushed-commit count (d9ee697f)
  • Automatic notes sync across AFS branches (b326e288) + the protocol (1132cbd9, 73fa3a83): notes merge only brings new files, never overwrites
  • Build timestamp + git commit in sidebar (9f01e2d0)
  • Page size persistence in localStorage (9aafebbf)
  • Configurable layout width (d9ee697f)
  • Multi-select for tags + authors in note browser (fb9f4881)
  • Saved views with copy-as-YAML (62ab6552 from W12, refinements this week)
  • proxy.jinflow.io Fly config (a543b46e) — the Cloudflare Tunnel proxy gets its own subdomain
  • Pipeline DAG layout timeout + skip button (c2399100) — the cytoscape-elk WASM hang gets a real fix (3e7a2646)
  • 385 commits, 7 days
  • 1 new compiler-style architecture (Configuration Engine) with 4-level inheritance
  • ~50 commits migrating Explorer surfaces to the config engine
  • ~20 commits fixing multi-tenant KLS Store mode bugs
  • 11 commits unifying CLI to positional target syntax
  • Release line: 0.30.8 (Sun W12) → 0.31.13 (Sun W13). A 0.31 minor + 13 patches.
  • 1 search grammar with 6 progressive levels
  • 1 recents page from popup → full feature in 7 days

The Explorer pages stopped making display decisions. The CLI stopped accepting inconsistent invocations. The compilers stopped lying about freshness. The KLS Store stopped racing on concurrent requests. None of this shows up as a feature on a marketing page. All of it shows up as the absence of friction every later week.

If W11 made jinflow shippable and W12 made it deployable, W13 made it maintainable. The next 700 commits would land on a substrate where one config key was enough to change behavior across the app — and where adding a new CLI command was a single shape, not a fresh invention.

jazzisnow jinflow is a jazzisnow product
v0.64.7 · built 2026-09-20 19:48 UTC