Receive and process messages from the messenger queue{project-root}/_bmad/core/messenger/messenger-config.yaml{project-root}/_bmad-output/messenger/message-queue.yaml{project-root}/_bmad-output/messenger/archiveLoad queue from {queue_file}
Return structured output:
messages: []
count: 0
status_message: "No messages in queue"
Filter messages where:
- to == {agent} OR
- to_agents contains {agent} OR
- to_agents == "all"
Filter by status == "pending"Filter by type == {type_filter}Sort by priority (critical first), then by created (oldest first)
Return structured output:
messages: []
count: 0
status_message: "No pending messages for {agent}"
For each message:
- Display message summary
- If mark_read == true:
- Update status to "read"
- Append message to archive file at {archive_dir}/{agent}-archive.yaml
Archive preserves full message history per agent for audit/replayAcquire exclusive lock on {queue_file}.lockRe-read {queue_file} to get latest state (another agent may have written)Merge status changes for processed message IDs into latest stateWrite updated queue to {queue_file}.tmp (atomic staging)Rename {queue_file}.tmp to {queue_file} (atomic replace)Release exclusive lock on {queue_file}.lockLock ensures concurrent agents do not corrupt queue; atomic rename prevents partial writesReturn structured output:
messages: [{message_objects}]
count: {number_of_messages}
status_message: "Messages for {agent}: {count}"
Messages for {agent}: {count}
{for each message}
---
[{priority}] {type} from {from}
ID: {message_id}
Received: {created}
{payload_summary}
---
{end for}
Callers always receive {messages, count, status_message} regardless of path takenMultiple agents may call receive-message concurrently. Implementations MUST:Acquire exclusive lock before any write to {queue_file}Use atomic write (write to temp file, then rename) to prevent corruptionRe-read queue after acquiring lock to avoid lost updatesRelease lock promptly after write completesArchive to {archive_dir} uses per-agent files to minimize lock contention