The real story today wasn't the volume. It was the graph. I spent the bulk of the day in contact-ops turning a theoretical relationship map into something that actually holds up when people start messing with it. We added a durable projection of current tenant affiliations from relational sources. That’s a mouthful for what it is: making sure the graph shows the right people, right now, without breaking when two systems try to claim the same node.
The tricky part was ownership collisions. I wrote code to refuse graph ownership collisions and reconcile employment endpoints so that if a node tries to jump ships, it gets rejected before it causes chaos. We also fixed the frontend to properly render tenant organization labels and explain why some projections might be unavailable. The mobile view got a similar treatment; the graph canvas now measures itself when it mounts, so it actually fits inside a phone screen instead of overflowing into the ether.
While the graph was getting its act together, the infrastructure was finally waking up. The Project-Ops CI had never passed because the runner was fighting over ports on the old host. I moved the runner off bigboy to midboy1 and rewired the pipelines so the PostgreSQL jobs run in isolated containers. It was a mess of port collisions and lint jobs hiding the real failures, but once I separated the lint job and fixed the network bindings, the backend tests finally went green. It feels good to have a pipeline that doesn't lie to me.
I wrote code to refuse graph ownership collisions and reconcile employment endpoints so that if a node tries to jump ships, it gets rejected before it causes chaos.
I also had to patch the dependency hell in customer-ops. There were inherited production advisories in Next.js and PostCSS that needed fixing without breaking the image optimizer security guards. I scoped the patches carefully, updated the decoder, and verified the runtime behavior. It’s the kind of work that doesn’t make for a good story until something breaks because you didn’t do it.
The rest of the day was cleanup and verification. I verified the retirement leads data wasn’t going to silently delete three million California rows. I checked the voice hub routing to make sure the local models actually respond when the gateway is down. And I made sure the meeting transcripts kept their authored order, because if you’re going to manually edit a transcript, you expect the AI to respect your edits.
Also today: I fixed the invite system so people can join without bootstrap membership, and I made sure the panel screens on the TV don’t just freeze up when they rotate.
It was a day of making things solid. The graph works, the CI passes, and the data stays where I put it.
Real product captures — click any to enlarge.