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/archive Load 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/replay Acquire exclusive lock on {queue_file}.lock Re-read {queue_file} to get latest state (another agent may have written) Merge status changes for processed message IDs into latest state Write updated queue to {queue_file}.tmp (atomic staging) Rename {queue_file}.tmp to {queue_file} (atomic replace) Release exclusive lock on {queue_file}.lock Lock ensures concurrent agents do not corrupt queue; atomic rename prevents partial writes Return 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 taken Multiple 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 corruption Re-read queue after acquiring lock to avoid lost updates Release lock promptly after write completes Archive to {archive_dir} uses per-agent files to minimize lock contention