Dispatch 265
Week ↗

Tenant isolation, design systems, and the meeting that wouldn't stop streaming

The big thing was getting tenant isolation actually enforced at the database level. I spent a solid chunk of the day closing the beta-blocking holes in accounting-ops, then followed up with the full C3 pass:…

Commits
66
Systems
7
Read
3min
Product capture

Accounting-Ops — tax forms.

The big thing was getting tenant isolation actually enforced at the database level. I spent a solid chunk of the day closing the beta-blocking holes in accounting-ops, then followed up with the full C3 pass: DB-enforced tenant isolation plus ledger immutability. That was 1,270 lines added across 18 files, plus 1,187 more lines fixing the remaining gaps. Between the two passes I touched auth, the API routes, the migration plumbing, the tests. I also corrected a stale FORCE note in 0005 because the code ENABLEs RLS, not FORCEs it. Minor detail, but it was wrong and I saw it.

While the security work was settling, I also shipped three smaller accounting-ops features: a COA editor for creating and renaming chart-of-accounts entries, a 1099-NEC year-end report that aggregates expense-side payments by counterparty at the $600 threshold, and bulk-confirm plus keyboard shortcuts on the reconciliation queue. The bulk-confirm cut down on clicking through items one by one, which is the kind of thing that sounds small until you've done it a hundred times.

contact-ops was mostly the design-system rebuild. Stage 0 laid the foundation with OKLCH tokens, Geist, and the agent/human primitives. Then I worked through stages 1 through 5, rebuilding the inbox, graph, people, orgs, dashboard, settings, and tags screens on the new system. It was 2,000-plus lines of visual foundation work, then the remaining screens caught up. I also added AA dark contrast fixes for destructive and tint colors, switched failing links to the text-link token, and made the default theme respect OS preference with persistence only on explicit toggle. The federation phase 5 consumer foundation went in too, 1,362 lines across 16 files, plus some inbox polish: desktop handoff button, cmd+k dynamic filter shortcuts from agent slugs, swipe-right approve and swipe-left snooze on mobile, and a typed-phrase modal for bulk actions over 10 items.

It was 2,000-plus lines of visual foundation work, then the remaining screens caught up.

meeting-ops was a release sprint. The Phase B.3 work on the v2.x streaming stack was the centerpiece: migrated browser audio capture to AudioWorklet, added Opus codec utility modules, built the NVIDIA Sortformer streaming diarization prototype, and wired the /transcribe-stream-v2 endpoint with draft and finalize semantics. That was 1,796 lines for the Sortformer spike alone, plus the opus decoder work and the WebSocket forwarder changes. Between the spikes and the integration, I cut six releases: v1.2.0 through v2.1.0, covering speaker labels, Sortformer live diarization, cursor-based windowing, server-live transcripts with speaker badges on the Record page, EOU detection, cache-aware streaming, and finally utterance-grouped per-word UI in the live transcript view. I also wrote a streaming runbook, added backend tests to lock in the behavior, fixed a DetachedInstanceError that crashed the WS connection, and forwarded the Brigade API key to the meet-backend container.

listing-ops got a CI gate, photo backup, repeat-buyer tracking, counter-suggestion, server-side offer archive, bundle code-split, SSE-based DMs, and AI reply suggestions. That was 1,975 lines across 22 files. I also fixed the refund tile to show both gross and net amounts, flipped Best Offer to opt-in, and did a 14-item audit pass across the dashboard, chat, offers, and orders views. Pre-commit formatting touched 126 files because the codebase had diverged from the linter rules, but at least it's consistent now.

The smaller repos got their attention: repaired aioimaplib SELECTED state after EXAMINE in the IMAP MCP server so SEARCH commands are legal again, stripped +asyncpg from the receipt worker DSN before passing it to create_pool, and fixed a migration revision string in listing-ops that was too long for the alembic_version column.

Also today: contact-ops audit middleware got a CAST fix for SQLAlchemy 2.0 param binding, and a regression test for the insertion path went in.

It was a day of closing doors that were left open and opening ones that were due. The tenant isolation work finally makes the ledger boundary real, the design-system rebuild makes contact-ops look like something I'd want to open, and meeting-ops shipped more streaming than I thought was possible in one Monday.

Also in the frame

Real product captures — click any to enlarge.

accounting ops
listing ops
accounting ops