fix(messages): company channel fans out to every active agent

"Company" channel fell through to `listTopLevelAgentIds`, so a
broadcast on the most ambient-sounding channel in the product only
reached agents with `reports_to IS NULL`. The label said company;
the semantics said board-only. The rest of the org never knew a
message existed.

Add `listCompanyBroadcastAgentIds` — returns every non-terminated,
non-paused, non-pending agent for the company — and wire it through
the `company` case in `resolveMessageWakeTargets`. Board-only
fan-outs are still reachable: the `incident` channel keeps the
broader pingable set (paused-by-budget included) and direct DMs to
top-level agents work as before.

The prompt doc catches up to the runtime: company is explicitly
framed as all-hands, with board-only guidance redirected to DMs or
incidents. The message-dispatch unit test asserts the new fan-out.
This commit is contained in:
ZacharyZhang-NY committed 2026-04-19 01:21:26 -04:00
1 parent 0a40c55b3c
commit d47e637a45
5 files changed
+28 -7

No files matched your search

+3 -3
View File
@@ -125,7 +125,7 @@ function createScaffold(db: AppDatabase) {
}
describe("message dispatch", () => {
it("wakes top-level active agents for company messages and active agents for incident messages", async () => {
it("wakes every active agent for company channel broadcasts (Slack-style all-hands)", async () => {
const profileDir = await createTempDir("agentcompany-message-dispatch-");
const db = new AppDatabase(profileDir);
db.init();
@@ -141,12 +141,12 @@ describe("message dispatch", () => {
fromAgentId: HUMAN_SENDER_ID,
fromHumanUser: true,
channel: "company",
body: "Board broadcast",
body: "All-hands broadcast",
});
expect(companyResult.ok).toBe(true);
if (!companyResult.ok) throw new Error("Expected company message dispatch to succeed.");
expect(companyResult.data.wakeTargets).toEqual([ceoId]);
expect(new Set(companyResult.data.wakeTargets)).toEqual(new Set([ceoId, ctoId, cmoId]));
const incidentResult = dispatchAgentMessage({
db,