Dispatch 267
Week ↗

Period close, LLM fixes, and a meeting platform that writes

Thursday, June 11. I ran 69 commits across six repos. That's a solid day. The headline for accounting-ops was period close. I built the migration, the posting guard that blocks writes to locked periods, the…

Commits
69
Systems
6
Read
2min
Product capture

Accounting-Ops — tax forms.

Thursday, June 11. I ran 69 commits across six repos. That's a solid day.

The headline for accounting-ops was period close. I built the migration, the posting guard that blocks writes to locked periods, the close-period API endpoint, and the full UI for it. Trial balance landed alongside it, with its own endpoint and a clean view in the report nav. There was a Decimal comparison bug in the balance sheet balanced flag that I fixed, and the cash-flow v2 classifier got updated to use chart_of_account.account_type for the counter account. The approvals page got bank transaction import rows and batch operations, with a group-by-category accelerator so I wasn't clicking through hundreds of individual items.

The BofA live ingest pipeline needed serious love before it could run live. Six blockers I fixed, including a 100% rejection bug in the LLM Tier-2 categorizer. Qwen3 thinking mode plus a middle-dot mismatch were the culprits, and once I fixed that, the whole thing started working. I also moved the worker runtime grants out of Alembic into a standalone SQL script because the postgres container doesn't mount scripts from the host directory, which was a fun deployment surprise. H2 service-token scope constraints got integration test coverage, and I wrote up Mohsin's CPA onboarding guide for catch-up 1120 review.

I built the migration, the posting guard that blocks writes to locked periods, the close-period API endpoint, and the full UI for it.

Contact-ops was about the showcase. I wired up the Connectors preview tab next to Import, built out the full connector backend with Gmail, iCloud, and M365 support, and added a vCard upload page. The Settings page got a Notes and Log section with tenant-scoped note tools, a chat backend with SSE orchestrator, and I removed the Pronouns field from the profile. Docker Compose got cleaned up, oauth2-proxy was removed, and I added a Traefik router for carddav.

Meeting-ops had the most releases. I shipped v3.17.0 with the Project-Ops action-items bridge, v3.15.1 with the collapsible Unassigned speakers section, v3.15.0 with unassigned voice fingerprints and speaker merge, v3.14.0 with typed-confirm on session delete plus start/stop recording, and v3.13.0 with Personal Access Tokens and the MCP write surface. Phase 2 design got ratified, then Phase 2 v1 shipped the propose-confirm-mutate write/control flow, followed by v1.5 with PATs and v1.6 with typed-confirm friction on delete. RAG retrieval got tuned with graph-augmented magnitudes and a direct-text dominance cap. Local-disk retention got self-managing daily cron, completing the Garage cutover.

The receipt worker and reconciler both needed the same fix, registering the asyncpg JSONB codec at pool init to handle dict serialization, and replacing the Annotated[None, Depends()] pattern on their trigger endpoints. CPA-export got a Form 1120 export endpoint and route alignment.

Also today: DEPLOY.md updates across multiple repos, smoke tests for everything above, and a lot of version bumps.

It was one of those days where the plumbing finally started working, and the platform felt like it was moving forward in multiple directions at once.

Also in the frame

Real product captures — click any to enlarge.

accounting ops
accounting ops
accounting ops