Dispatch 341
Week ↗

Muting the ring and painting the agent

Thursday, August 13. I made two commits in panel-ops today. It was a thin day, but the work was specific. I spent my time tightening up the shell logic and building out the visual presence card for the agent…

Commits
2
Systems
3
Read
2min
2026-08-13 · SIGNAL2 commitsuuda4panel-ops2uc-meeting-ops2
Commit signal

Rendered from this day’s 2 commits — no stock art.

Thursday, August 13. I made two commits in panel-ops today. It was a thin day, but the work was specific. I spent my time tightening up the shell logic and building out the visual presence card for the agent.

The first thing I tackled was a subtle but critical state conflict. The shell had a bug where muting didn't actually stop the ring from spinning. If the panel was muted, it should have been idle, but it kept pretending to listen. That was confusing for anyone trying to use voice commands in a quiet room. I fixed that by forcing the ring to idle whenever mute is engaged. It is a small change, just (+8/-0, 1 files), but it makes the UI behavior honest. You mute it, it stops. No more phantom listening states.

The heavier lift today was the agent presence card. I needed a way to show the user what the agent was doing without cluttering the interface. I built a canvas-based component that renders the Brigade avatar. It uses a cached data URI with an emoji fallback, so it loads fast and doesn't break if the image asset is missing. The card isn't static. It has state animations for listening, thinking, and speaking. This gives immediate visual feedback on the agent's current mode.

The first thing I tackled was a subtle but critical state conflict.

I wired this into the panel canvas, which clears cleanly when the panel closes. It is not just a static icon. It is a dynamic indicator. I also made sure the STT_MODEL environment variable drives the model selection. This keeps the configuration out of the code and into the environment, which is cleaner and easier to manage across different deployments. The change touched five files, adding 389 lines and removing 16 That includes updates to the README, the environment example, the hub logic, and the tests. I added a fake satellite and a selftest to verify the presence card renders correctly under different conditions.

The tests are important here. I wanted to make sure the avatar renders and the state animations trigger without failing. The selftest covers the basic rendering path, while the fake satellite simulates the voice hub behavior. This gives me confidence that the presence card works even when the actual voice service is not running. It is a robust piece of UI logic.

Also today: I updated the voice-hub documentation to reflect the new environment variables and the presence card features. It is easy to forget to update the docs when you are deep in the code, but it pays off later.

I did not touch any other repos. The focus was entirely on panel-ops. I wanted to get the mute logic right and finish the presence card. Both are done. The shell is more responsive to mute commands, and the agent has a visual heartbeat. It is a good day for incremental progress. The UI feels more alive, and the state management is tighter. I am happy with how the presence card turned out. It is simple, it is fast, and it works.