Repository navigation
fix(agents): readable sub-agent guide, step-named profile refusals, typing over the bridge - #76
Conversation
COPY --chmod=0644 also gave the /etc/buzz-agent directory it created mode 0644, which the agent user cannot enter. Every Sandbox with the sub-agent token, which the Sandbox manager always enables, failed at startup with "Developer profile refused" when it appended the guide to the harness instructions. Create the directory 0755 first, and check in test-image.sh that the agent can read the guide.
|
Warning Review limit reached
This review includes 5 billable files and costs up to $1.25.
Reviews can continue after your included limit without a manual trigger. An admin must approve usage-based billing. Or wait 29 minutes for your next included review. View limit details
No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info
📝 Walkthrough
Merge Risk: ⚪ Minimal · up to
|
The Buzz app posts its agents' events through the HTTP bridge, which sent every event to ingest and refused ephemeral kinds with "restricted: unknown event kind". Agents never showed as typing. The bridge now publishes kind 20002 the way the WebSocket path does: it checks the signer, write restrictions, the community fence and channel access, then fans the event out without storing it. Other ephemeral kinds are still refused.
"Developer profile refused" gave no cause. The message now names the step that failed, plus either a fixed refusal message or the error type, so a Sandbox log can be diagnosed without printing any value. The guide adds this message and the 1Password 403 to troubleshooting, and creates service accounts without an expiry.
ctutils before 0.4.4 generates masks and compares u128 values in non-constant time. cargo-deny now fails the Security check on 0.4.2.
What
Three fixes from the first relay Sandbox test (Bifrost, staging):
restricted: unknown event kind.This needs a prod relay deploy for fix 3. Fixes 1 and 2 ship in the agent image.
1. Sub-agent guide unreadable
The Sandbox failed at startup:
Cause:
enable_subagents: true), so every Sandbox gets the sub-agent token.buzz-agent-profile runappends/etc/buzz-agent/subagents.mdto the Claude Code and Codex instructions.COPY --chmod=0644 … /etc/buzz-agent/subagents.mdalso sets mode 0644 on the directory it creates, and a directory without the execute bit can't be entered. The profile itself was fine: in a pod copied from the failed one, the bootstrap and checkpoint steps succeeded, and onlyinstall_subagent_guidefailed withPermissionError.Fix:
/etc/buzz-agentwithinstall -d -m 0755before theCOPY.test-image.shcheckstest -r /etc/buzz-agent/subagents.mdas the agent user.2. Refusal names the failed step
The refusal now says where startup stopped and why, for example:
Refusedsubclass ofValueError), or the exception type. Other exceptions can quote a value, so their text is never printed.test-profile.pychecks the step in three refused modes (wrong owner, missing secret, symlinked config directory). It still checks that no credential reaches the output.(403) Forbiddento troubleshooting. It also creates service accounts without an expiry, because leaving out--expires-inmeans no expiry.3. Typing indicators over the HTTP bridge
The Buzz app posts its agents' events through the HTTP bridge (
POST /api/events), which sent every event to ingest. Ingest has no scope for ephemeral kinds, so it refused kind 20002.The bridge now sends typing indicators to
publish_http_typing, which follows the WebSocket path:htag, and the signer needs access to that channel.Every other ephemeral kind is still refused.
Tested
Sub-agent guide: I built a minimal image with both forms:
Profile:
test-profile.pyandtest-image.shpass on an image with thisprofile.pyand the guide directory fix.Relay: the new
typing_over_the_bridge_is_published_not_stored_and_gatedtest (Postgres, ignored by default) passes. It checks that:htag gives 400;Without the bridge change, it fails with
restricted: unknown event kind, the same error prod returned.Checks:
cargo clippy -p buzz-relay --all-targets -- -D warningsandcargo fmt --checkare clean. Theapi::bridgePostgres suite has the samethread_windowandread_state_snapshotfailures with and without this change, and which tests fail changes from run to run.Also
ctutilsgoes from 0.4.2 to 0.4.5 in the root, desktop and GPUI lockfiles. A new advisory, RUSTSEC-2026-0385, fails the Security check on master and every PR.cargo-deny check advisoriespasses locally for the root and desktop workspaces.