Monday started with the usual quiet, but the background noise was getting louder. The integration test stack had been flaky for a while, and I knew it was only a matter of time before something critical broke in production. So I spent the day making sure the system would catch itself before it hurt anyone.
The main arc was the CI stack. I needed the integration tests to run inside the app container, not across the Docker-in-Docker NAT layer. That was the bottleneck. I spent most of the morning untangling the docker-compose files and the CI workflows. I bound the test ports to localhost by default, which forced a cleaner architecture. I also made the integration-test stack bind-free so it could actually run under dind. It was a lot of plumbing, but it was necessary. I added a diagnostic dump for pg_stat_activity and pg_locks, so when things hang, I can actually see why. I also pointed FalkorDB at a fast-failing address to catch hangs early. The goal was simple: fail the integration job unless all 16 RLS tests execute. No more partial passes. No more guessing.
While the CI was settling down, I also tackled a nagging bug in the accounting narrative trigger. It was too loose. I hardened it across nine files, tightening the logic so it only fires when it should. I also fixed the invitation links. They were pointing to the wrong place, which is embarrassing for a platform that claims to be production-ready. I corrected that in the members API and the smoke tests.
I needed the integration tests to run inside the app container, not across the Docker-in-Docker NAT layer.
The rest of the day was a blur of metadata and maintenance. I refreshed the uv.lock, adding pymupdf and aligning ruff. I also fixed a fire-and-forget projection task in FalkorDB that was running wild. I bounded its runtime so it couldn't tie up resources indefinitely. It’s a small fix, but it keeps the system honest.
Also today: I cleaned up 12.1 GiB of cache on the system drive. That was a necessary evil.
The day added up to a more resilient system. The CI is harder to break, the accounting narrative is tighter, and the invitation flow works. It’s not glamorous, but it’s the kind of work that keeps the lights on.
Real product captures — click any to enlarge.