Weekly chapter77
2026-W36 · ending September 6, 2026· September 2026 chapter ↗

The Week the Agents Took the Wheel

This week in 2026-W36, I started by sweeping dust off a burning rug. Monday in email-ops was less about building new things and more about stopping the system from lying to us. The `setdisposition` and `bulk…

64commits9systems6min read
Product capture

Ops-Center — user dashboard.

This week in 2026-W36, I started by sweeping dust off a burning rug. Monday in email-ops was less about building new things and more about stopping the system from lying to us. The set_disposition and bulk_disposition commands were returning false greens, making it look like emails moved when they stayed put. That is a dangerous kind of lie. I spent the morning untangling the logic in mcp.service.ts and email.service.ts to ensure that when we say a move happened, it actually happened. It was a heavy lift, touching ten files and shifting over 370 lines, but now the status reflects reality. No more phantom movements.

While I was in there, I also fixed the Microsoft search path in the cleaner engine. The "real sizes" of messages were getting lost in translation, and the integration tests were hiding the rot. I tightened up the microsoft_provider.py and the backend service specs to ensure we’re reading the actual byte counts from the API. I also made sure the Microsoft lane honors classification criteria conservatively. If the engine isn’t sure, it shouldn’t guess. That meant tweaking the app.py and provider logic to err on the side of caution. The final piece of the email-ops puzzle was handling throttled Graph GETs. Microsoft loves to throttle, and our previous approach of failing hard wasn’t sustainable. I implemented a bounded retry mechanism in the cleaner engine. It’s not a silver bullet, but it stops the enrichment process from crashing every time Microsoft blinks.

Switching gears to shawns-services-repo, the focus was on Shawn’s direct requests. We updated the pricing for Deluxe and Premium plans. Simple enough, just a tweak to siteMeta.js. But the real work was in the Owner dashboard. I implemented SSO via oauth2-proxy sidecar. This wasn’t just a config change; it involved wiring up the docker-compose.yml, updating the owner routes, and ensuring the Owner.jsx page played nice with the new authentication flow. It closes a security gap and makes the admin experience smoother. Shawn asked for a cleanup of the Gallery too. I added a muted work-reels wall and removed four photos that were either dirty or lacked after-photos. It sounds trivial, but curation is part of the product.

While I was in there, I also fixed the Microsoft search path in the cleaner engine.

Tuesday started with a bit of a panic in shawns-services-repo. The owner dashboard needed to trust the identity header that oauth2-proxy actually sends. I was locked out because the email domain configuration was silently defeating the owner allowlist. I dropped the EMAIL_DOMAINS=* setting and gave myself access alongside Shawn. That was a quick fix, but it revealed a deeper issue with how we handled sessions and identity. I spent the afternoon untangling that mess. It involved updating the owner routes, fixing the tests, and adjusting the docker compose config to keep the owner session in one cookie. I also tightened up the security by keeping crawlers off the SSO-gated paths in the robots.txt file. It was a day of plumbing, getting the auth layers to talk to each other without leaking data or dropping sessions.

Once the dashboard was stable, I shifted focus to the notifications. The old logic only texted Shawn when a booking was confirmed. That felt too slow. I changed the system to text him on every new lead, not just every booking. It’s a small shift in timing, but it makes the follow-up much more urgent. I rewrote the SMS module, updated the notify service, and adjusted the tests to match the new reality.

Over in unicorn-stable, the big win was getting the voice relay to stop dropping speech. The subscription gate on RoomIO was blocking the audio from reaching the wire. I resolved that gate so the relay could pass data through. That was the foundation for the next feature: the voice cast. We wanted the system to know who was talking to whom. The pedal needed to name the agent it was talking to. I carried the voice cast to the worker so the talk gate could name a target. This required changes in the gateway, the rooms API, and the webhooks. It was a significant refactor, touching four files in the server and adding over three hundred lines of code. The relay itself got a major update to handle a cast of voices, ensuring the TTS plugin knew which voice to use for which agent.

On the desktop side, I finally committed the native Stable Talk Controls source. It had been sitting untracked for too long. I added the Swift source, the package config, and the build scripts. This gives us a proper native app to control the talk features. I also added a key to action table and a loopback control endpoint. The mic fallback was also fixed so the first device is narrowed down, stopping TypeScript from fearing an empty list. The web side got some love too. I linted the code to zero, fixing those annoying ?? [] arrays that kept causing issues. The mint chip UI now clearly shows who can hear you when the pedal names an agent. The TalkGateIndicator was updated to reflect this, and the call UI store was adjusted to handle the new protocol.

Wednesday was about making the voice work feel like a room you actually own, not a phone call that keeps dropping. The big move was getting every agent in the relay to act like its own participant. That meant each agent gets its own mic, its own camera, and its own identity in the meeting. It was a heavy lift. I touched twenty-one files across the relay and the server to make sure the puppet video, the voice transcripts, and the cast logic all agreed on who is who. If I had left even one agent as a ghost participant, the whole overlay would have looked wrong. Now the system knows exactly which seat belongs to which agent.

Before that could settle, I had to fix how we enter the room. The old way made you ring, wait, and hope. The new way rings once, joins immediately, and uses deep links to get you there without clicking through menus. That was nineteen files, including the server call service and webhooks. I rewrote the call service, updated the web hooks, and changed the UI components so the call dock and the audio video settings actually talk to the new logic. The goal was simple: stop making people guess how to join. If you have the link, you are in.

I also gave the Talk Controls gateway key full room controller powers. Before today, that key was a guest. Now it is a host. I added a new migration, updated the auth logic, and changed the gateway and room APIs to respect that authority. This was seven files because it lets the control system manage the room without fighting the permissions layer.

Not everything went smoothly. The FalkorDB dependency was throwing a resolution error because it wants redis 8 but the project was pinned to redis 7. I bumped the requirement to allow redis 8. It was a two-line fix in the requirements files, but it was the only way to get the build to pass. I also made sure every FalkorDB connection honors the password variable. Three files changed, but it prevents the silent failures that usually happen when credentials are optional. The agent runtime got a version pin update to match the dogfood environment. livekit-agents and livekit are now locked to the versions I measured on Wednesday. This stops the drift that usually breaks things when you update the base image.

Thursday started with a bit of housekeeping I’d been dragging around. I found an uncommitted landing page redesign from August 14 sitting in the multistate-retirement-leads repo. It had been deployed back in August, so it wasn’t exactly fresh

Also in the frame

Real product captures — click any to enlarge.

uc cloud
email ops
brigade
07 / Activity

The week, in commits.

Daily velocity and the systems that carried the work.

7Mon31
14Tue01
7Wed02
9Thu03
25Fri04
·Sat05
2Sun06
Week beginning August 31, 2026.
Index

9 systems,
one week of work.

email-opsfleet-mapmagicunicorn.techmultistate-retirement-leadsops-centerpanel-opsshawns-services-repounicorn-brigadeunicorn-stable