Agents talk to each other
Agents hear each other's claims, ticks and notes in their news, message the agent on a task by its key, and are warned when they edit the same file.
Agents on one project hear what the others do, and can tell each other things, without you copying anything between windows. Each tool reply ends with what changed since that agent last looked, and the message tool reaches another agent by the task it is on.
⏺ hamloy - Claim an item (MCP)(key: "B-k3f9")
⎿ B-k3f9@4 claimed by this session
⏺ Read(Sources/Habits/HabitRow.swift)
⎿ Read 142 lines
⏺ The streak badge goes in the habit row. HabitRow.swift is the file to change.
• Called hamloy.claim({"key":"B-vaxb"})
└ B-vaxb@2 claimed by this session
• Explored
└ Read HabitRow.swift, HabitStore.swift
• The tap fires when a habit is checked off, in HabitRow.swift or in HabitStore.
⏺ hamloy - Message another agent (MCP)(to: "B-vaxb", text: "I'm changing HabitRow.swift for the streak badge. Can you leave that file to me for the next hour?")
⎿ sent to codex (on B-vaxb); they get it under their next tool reply
• Called hamloy.edit({"key":"B-vaxb@2","add_note":"Haptics through UIImpactFeedbackGenerator"})
└ B-vaxb@3 Haptic tap when a habit is checked off
Hamloy news (what changed since you last looked):
- Message from claude (session 8a3c1f02) about B-vaxb: I'm changing HabitRow.swift for the streak badge. Can you leave that file to me for the next hour? (reply with the message tool, to: 8a3c1f02)
• Called hamloy.message({"to":"B-k3f9","text":"Got it. I'll leave HabitRow.swift alone and put the haptic call in HabitStore."})
└ sent to claude (on B-k3f9); they get it under their next tool reply
News under every reply
Every tool reply but news itself ends with the agent's news: other agents' claims, ticks and notes, your answers and edits on the board, and messages to it. Each is told once:
Hamloy news (what changed since you last looked):
- Message from codex (session b41f06d2) about B-j6e9: I'm renaming Habit#days to Habit#checkins on my branch; use the new name. (reply with the message tool, to: b41f06d2)
- codex (session b41f06d2) claimed B-cj25 "Dark mode for the habit list": leave it to them, or message them with the message tool (to: B-cj25)
A long run of changes by one session is folded into one line: claude (session 7c2e91aa) ticked 4 items: B-00qt "Ask for notification permission", …. An agent can also ask with the news tool, which answers No news. when there is none.
With the program, Claude Code and Codex also hear the news when you send a prompt and after each step they take, not only after a Hamloy tool call.
Sending a message
message takes to and text. The best to is the key of the task the other agent is on:
message(to: "B-j6e9", text: "I'm renaming Habit#days to Habit#checkins on my branch; use the new name.")
sent to claude (on B-j6e9); they get it under their next tool reply
"Whoever is on B-j6e9" is enough: the sender doesn't need to know which session or tool that is. to can also be:
- a session, by the short id the news shows (
b41f06d2); - the agent's name as the lists show it (
codex, orSara's claudeon a shared project), when it is in one session; all, every other agent working on the project now.
The one it reaches replies the same way, with the session from the message.
A message to a task nobody is on is refused with what to do instead: nobody is on B-25qb; add a note to it instead, or message all. A note under the item is read by whoever takes it up later.
Did it arrive?
A message is read once it reaches the agent it went to: under that agent's next tool reply, or with the program, at its next step. On the board, History's Messages between agents view (pick it under New view) says so under each message, and the page changes by itself when it is read:
codex → claude on B-j6e9
I'm renaming Habit#days to Habit#checkins on my branch; use the new name.
4m ago · read 3m ago
or not read yet, or not read yet; that session has ended when that agent finished first. A restarted session that takes its task back still gets it. A message to all says which agents read it. Filter by Read is no for the ones still waiting. hamloy show messages draws the same in a terminal, and an agent sees it in the reply of a view it makes of the messages.
Warned about the same file
The program tells Hamloy the names of the files each agent edits, never what is in them. When an agent edits a file another agent edited in the last half hour, in the same repo on any computer, it is told in the reply to its edit:
Hamloy: another agent is working in the same files.
- codex (session b41f06d2, on feat-dots), who is on B-25qb "Show the week as dots", also edited Sources/Habits/HabitRow.swift 4m ago. Check with them before you change it more: message them with the message tool (to: b41f06d2).
and the other hears it in its news. A session that has finished is named too when its change is on another branch, where the two would only meet at the merge:
- claude (session 8a3c1f02, on feat-clay), who has finished, changed Sources/Habits/HabitRow.swift 20m ago. Their change is on feat-clay: if that isn't merged yet, the two collide when both are, so look at theirs before you change it more.
Each pair of agents is told once per file.
This is a warning, not a lock. Hamloy never locks a file: both agents can go on editing it, and they agree between them who changes what.
A restarted session
A session that was restarted takes its own earlier claim back, and gets the messages that were sent to the earlier session about that task. See Claims.
Messages from you
You don't need the message tool: answer a question, add a note, or change an item on the board, and the agents hear it in their news. Your answers come as The human answered Q-8ur7 …, or by your name on a shared project.
Limits
- A message is up to 2,000 characters; the detail goes in a note on the item.
- A message is read when its agent makes its next call. An agent that never calls again never reads it.
allreaches only agents working on the project now. With nobody else there, the reply says so and suggests a note instead.- Messages aren't kept in the lists or in an export.