Skip to content

Week 27 / 2026 — the identity source moves to Clerk

29 Jun – 5 Jul 2026 · 53 commits · no release cut

A quieter week after the V2 rollout wave in W26. No release fired — the first release-less week in months, after sixteen back-to-back June releases — but the four days that were active carried three real arcs: Clerk-primary identity resolution shipped end-to-end (Phase 2, 3, and 4 in one week), jin package grew Linux .rpm support and a wave of cross-platform fixes, and a proposed new Sense paper (49 — The Branch) landed as the first structural answer to a pack-composition problem three hrcentral stakeholder statements collectively revealed.

The prefix histogram tells a consolidation story: 20 fix:, 17 chore: (mostly merges), 8 feat:, 7 docs:. Twice as many fixes as features. That’s a sanding-down rhythm — after V2 landed, the sand caught what the plane missed.

The identity source moves to Clerk — Phase 2 / 3 / 4

Section titled “The identity source moves to Clerk — Phase 2 / 3 / 4”

The biggest arc, and the one that closes an old thread: the tenant assignment source of truth migrates from KLS-baked view to Clerk publicMetadata. Three phases in one week.

The spec landed first (e88c27b9) — “Clerk-primary, KLS-fallback identity resolution”. Spec-before-code, per the discipline the pack has been developing since the display-cascade drift caught us in May.

Then in order:

  • Phase 2 (6450a419) — writes go to Clerk publicMetadata on invite / role change / assignment update. The write path merges cleanly with any existing metadata rather than clobbering.
  • Phase 3 (9a79b51f) — the Explorer’s resolver reads publicMetadata first, with a 30-second TTL cache to keep the per-request cost negligible. KLS-baked view stays as fallback for principals whose metadata hasn’t landed yet.
  • Phase 4 (7d88d70c) — jin backfill-clerk-metadata — a one-shot migration verb to push every existing principal’s assignments into Clerk publicMetadata. Ships with logging to ~/.jinflow/state/ and a clear 403 diagnostic when the operator points at the wrong cross-instance token (e39e222c, c68f894a).

Registration in clidocs followed (6edc7b56) so the new verb lands in the account section of the cheatsheet cleanly. And one important fallback fix: when a principal is resolved via Clerk publicMetadata but the KLS hasn’t baked their display data yet, the Explorer synthesises a placeholder from publicMetadata fields rather than 404-ing (7df241e1).

After W27, a new user’s tenant assignment lands in Clerk within seconds of the invite acceptance — no KLS rebake required — and the Explorer sees it immediately. The old baked-view path stays as fallback but ceases to be authoritative. This is the compact version of Sense 25 (The Pass) that’s been under construction since the Roster paper (Sense 46) proposed the shape.

The invitation-flow bugs get their receipts

Section titled “The invitation-flow bugs get their receipts”

W27 opened with the closing of a bug thread that had been dragging since W25. The jin invite NEW-slug branch was passing env=prod as a default to the Clerk POST, causing dev-token requests to hit prod’s JWKS with a stale kid — the “first-call 401 that always fixed itself on retry” pattern that had been mis-diagnosed as Fly cold-start. (e3cbec2b, the real fix; earlier “dev Fly machine no longer suspends” 9c007e72 was the wrong hypothesis being retired.)

Two adjacent invitation-flow bugs surfaced in the same working session:

  • Ticket decoder was reading eid instead of sid (10fb578a) — the spec named eid, Clerk actually delivers sid. Every ticket resolver was returning “invalid-ticket” for valid tickets. Caught by a test-fixture generator that used real payload captures rather than the spec text. Underscore of the “verify spec against real API payloads” principle.
  • Invitation tickets were routing to the tenant home, not /accept-invite (6e112483) — the redirect was silently normalising them away.

Test coverage landed in the same PR window (6fbc8085, ade8279d) — invitation acceptance now has a proper test bag, and the /sign-up fallback redirect is exercised.

The pattern for the invitation flow held: bug found → fix → tests to make the fix load-bearing. Not the other way around.

jin package — Linux .rpm lands, cross-platform sanded

Section titled “jin package — Linux .rpm lands, cross-platform sanded”

June closed with .deb shipping (V3). W27 completed the Linux side by adding .rpm support for Fedora/RHEL via fpm (52c4d26c).

Getting .rpm to build cleanly turned into a small saga of packaging-tool detection:

  • The wrong fpm. Both a Fortran-90 preprocessor and Effing Package Management (the Ruby tool we want) install as fpm on some systems. The build was silently invoking the Fortran tool and emitting nothing usable. Detection now checks that the resolved binary is actually the Ruby one, and errors clearly if it’s not (1302ce42).
  • Missing rpmbuild. fpm needs rpmbuild under the hood; when it’s absent the failure was cryptic. Now it’s caught up front with a diagnostic (2268dbef).
  • Locale interference. rpmbuild produces different output depending on LC_ALL; forced to C for reproducibility (d35bfad7).

Adjacent build-shell work: DuckDB native bindings now get harvested from .pnpm/ correctly on all target OSes (fa9b9d4e, 9845457c), cp -RL with per-package trace makes the copy phase debuggable (e6ef7965), and the launcher inside the bundle sets JINFLOW_LAUNCH_MODE=local-launcher so Sense 16 (P2P2P) knows it’s in packaged-app context (6abea45d).

By end of W27, jin package runs from macOS + Ubuntu + Fedora targets and produces installable artefacts on all three.

Onboarding UX — the showcase banner + contact page

Section titled “Onboarding UX — the showcase banner + contact page”

A small UX arc that felt disproportionately meaningful:

  • The showcase banner — layer 2 of onboarding UX (9abceab6) — for first-time visitors landing on a showcase tenant, a banner explains what a showcase is and what the visitor can do next. Layer 1 was the kind: showcase | private distinction shipped in W26.
  • jinflow.io/contact page (ff868b0c) — the banner CTA has a real destination now. First-time visitor sees showcase → sees banner → clicks “talk to us” → lands on a contact page instead of a mailto: link.
  • The contact page is a SvelteKit route, not an etc/jinflow.io static page (aa96fe28) — small refactor with a real reason: the SvelteKit route inherits the site’s theming, i18n, and analytics naturally; the static page would have been an island.

Under the hood, one refactor of quiet importance: the visitor-facing surface now says “Showcase” instead of “Demo” (6a67ba30). Same UX, better word. Matches the kind: showcase vocabulary the pack-side already uses. Demo remains the derived per-request experience — the noun-vs-derived-verb distinction from W26’s memory.

A new Sense paper landed as Forming: Sense 49 — The Branch (4acb8d33). Structural claim: a pack is a trunk; branches are opt-in modules that carry Anchors, Facts, source systems, Gold contract entries, and the themes that stand on them. A tenant grafts the branches it needs — and only those.

The origin was three hrcentral stakeholder statements walked through the same three-pass structural procedure (coverage / design sufficiency / instrument shape). All three revealed the same missing scaffolding — the pack’s existing branch (workforce state) has no room for intentional workforce concerns (strategic objectives, HR programs, recruiting funnel). The proposal is to name a new branch and let tenants opt into it, rather than swelling the monolith.

Phase 1 shipping shape sketched in the paper: branches/ directory in packs, branch: field on artefacts, branches: list in tenant jinflow.yml, jin afs graft / prune / branches verbs, branch-scoped compilation, Gold contract composition per grafted set, lineage records for graft/prune events.

Held for follow-ups: cross-pack branches, Explorer branch UI, per-branch capability scoping, per-branch trust signals.

Docs polish — the glossary teaches itself, edge labels stop being grey

Section titled “Docs polish — the glossary teaches itself, edge labels stop being grey”

Four small docs commits, one big cumulative effect:

  • First-class citizens get a badge (2a12b2af) — 24 core glossary terms now carry a prefix, with an intro note explaining the mark. The glossary teaches itself which terms are load-bearing versus which are architectural. Sharper criterion in the commit body: the ◆ badge means the term names something jinflow can point to as a first-class artefact — a repository, a compiler, a lifecycle. Not just a word people use in design conversations.
  • Lens joins the citizens (b9c26191) — 25 total. Lens qualifies (it has explicit definition + delivery mechanics per Sense 27). Anchor and Fact don’t yet (no anchorcheck.py, no repository) — flagged for later if we ever build the machinery.
  • Mermaid edge labels stop being grey (cd0788f9) — the inner grey behind edge label text was leaking through the pill on all diagrams. Killed at source via themeVariables.edgeLabelBackground: 'transparent'. All docs diagrams now render clean.
  • June 2026 monthly journal + sidebar catches up W23–W26 (009f834b) — four weekly entries existed as substantive files but weren’t in the sidebar. The nav had quietly stopped in mid-May. Corrected. Plus the June monthly drafted fresh — “The Stage, the Ledger, the sentence.”
  • KLS Store pre-warms at boot (3443abb3) — no more first-visitor cold-start after a deploy.
  • R2 ETag verified at KLS Store boot (fe509a35) — stale disk caches from previous deploys get dropped automatically.
  • 500-case error bag widened (e8b64b82) — SvelteKit’s type inference now accepts the shape rather than requiring an explicit cast.
  • build-shell.yml extracts version without Python (7a51f4fd) — Ubuntu 22.04 runners without Python installed can still cut the version tag.

Fifty-three commits, no release. That combination is unusual — the last time we saw a full week without a release was in April. It’s not idleness; it’s consolidation before the next arc. The Clerk-primary identity migration finished (three phases in a week), the Linux packaging matrix filled out (.rpm joins .deb), the invitation flow’s persistent bug got its real fix, and a Sense paper (49 — The Branch) landed to answer a structural question three hrcentral statements had raised.

The next arc probably starts with either Sense 49’s Phase 1 implementation, or the numetrix parallel of hrcentral’s Intentional Workforce Management branch (both were proposed this week). Either would benefit from Manuel joining — the pack-shaping conversation is the one that most rewards a second head in the room.

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