用户指出 Mindraw 项目中自己主要和全局 PMO 沟通,PMO 再给其他 coder 派任务;worker 完成、阻塞或停下时,最应该第一时间知道的是 PMO,而不是只用音频通知用户本人。
本轮目标:先针对 Mindraw 建立 PMO worker stop 兜底通知机制。
完成标准:
MD-* / M4C-* / PM-* 任务边界。/Users/ar/Projects/ExcalidrawX/02-P/plan-progress.markdown/Users/ar/Projects/ExcalidrawX/AGENTS.md/Users/ar/Projects/ExcalidrawX/p.mindrawforcodex/AGENTS.md/Users/ar/.codex/hooks.json/Users/ar/Projects/ExcalidrawX/02-P/PMO_INBOX.md/Users/ar/Projects/ExcalidrawX/02-P/pmo-active-assignments.json/Users/ar/Projects/ExcalidrawX/02-P/pmo-events.jsonl/Users/ar/.codex/hooks/pmo_stop_event.py/Users/ar/.codex/hooks.json/Users/ar/.codex/hooks/audio_alert.py 会在 PMO active assignment Stop 场景静音。/Users/ar/Projects/ExcalidrawX/AGENTS.md/Users/ar/Projects/ExcalidrawX/p.mindrawforcodex/AGENTS.md/Users/ar/Projects/ExcalidrawX/INDEX.mdP-20260701-pmo-worker-stop-notification。pmo-active-assignments.json 中的 active assignment。MD-* / M4C-* worker 任务时,必须登记真实 task_id、plan_id、role、cwd_prefix、assigned_at 和 status=active。done / cancelled / superseded。assigned_at 用来避免把 PMO 派工时更新台账的 mtime 误判为 worker 已回写;hook 只把晚于 assigned_at 的 plan-progress.markdown mtime 视为 worker 回写。plan-progress.markdown 的 Progress Log 回写。/Users/ar/.codex/hooks/pmo_stop_event.py/Users/ar/.codex/hooks/audio_alert.py/Users/ar/.codex/hooks.json/Users/ar/Projects/ExcalidrawX/02-P/PMO_INBOX.md/Users/ar/Projects/ExcalidrawX/02-P/pmo-active-assignments.json/Users/ar/Projects/ExcalidrawX/02-P/pmo-events.jsonl/Users/ar/Projects/ExcalidrawX/02-P/plan-progress.markdown/Users/ar/Projects/ExcalidrawX 且匹配 active assignment 时写 PMO event。02-P/PMO_INBOX.md 读取 Markdown 事件。02-P/pmo-events.jsonl。worker_stopped_after_progress_writeworker_stopped_after_blocker_or_waiting_progressworker_stopped_blocked_without_progress_writeworker_stopped_without_progress_write/usr/bin/python3 -m py_compile /Users/ar/.codex/hooks/pmo_stop_event.py 通过。/usr/bin/python3 -m json.tool /Users/ar/.codex/hooks.json 通过。/usr/bin/python3 -m json.tool /Users/ar/Projects/ExcalidrawX/02-P/pmo-active-assignments.json 通过。assigned_at 不会把当前台账 mtime 误判为 worker 回写。dry_run reason=stopped 音频日志。suppress_pmo_managed_stop,不播放用户侧音频。/Users/ar/.codex/hooks/pmo_stop_event.py/Users/ar/.codex/hooks/audio_alert.py/Users/ar/.codex/hooks.json/Users/ar/Projects/ExcalidrawX/02-P/PMO_INBOX.md/Users/ar/Projects/ExcalidrawX/02-P/pmo-active-assignments.json/Users/ar/Projects/ExcalidrawX/02-P/pmo-events.jsonl/Users/ar/Projects/ExcalidrawX/AGENTS.md/Users/ar/Projects/ExcalidrawX/p.mindrawforcodex/AGENTS.md/Users/ar/Projects/ExcalidrawX/INDEX.md/Users/ar/Projects/ExcalidrawX/02-P/plan-progress.markdown用途:验证 PMO Stop hook 的语法、配置和 dry-run 输出。
前置条件:
/Users/ar/.codex/hooks/pmo_stop_event.py/Users/ar/Projects/ExcalidrawX/02-P/pmo-active-assignments.json设置命令:
/usr/bin/python3 -m py_compile /Users/ar/.codex/hooks/pmo_stop_event.py
/usr/bin/python3 -m json.tool /Users/ar/.codex/hooks.json >/dev/null
/usr/bin/python3 -m json.tool /Users/ar/Projects/ExcalidrawX/02-P/pmo-active-assignments.json >/dev/null
验证步骤:
PMO_STOP_EVENT_DRY_RUN=1 /usr/bin/python3 /Users/ar/.codex/hooks/pmo_stop_event.py Stop <<'JSON'
{"last_assistant_message":"任务完成,已回写进度。"}
JSON
说明:在真实配置中没有 active assignment 时,上述命令应静默退出。
验证普通 Stop 音频仍保留:
CODEX_HOME=/private/tmp/audio-alert-test-home-ordinary CODEX_AUDIO_ALERT_DRY_RUN=1 /usr/bin/python3 /Users/ar/.codex/hooks/audio_alert.py Stop <<'JSON'
{"last_assistant_message":"任务完成。"}
JSON
如需验证 active assignment 匹配,用临时测试 config 指向 PMO_STOP_EVENT_CONFIG,并在 m4c cwd 下运行:
PMO_STOP_EVENT_DRY_RUN=1 PMO_STOP_EVENT_CONFIG=/private/tmp/pmo-active-assignments-test.json /usr/bin/python3 /Users/ar/.codex/hooks/pmo_stop_event.py Stop <<'JSON'
{"last_assistant_message":"M4C-TEST-01 已卡住,等待 PMO 确认下一步。"}
JSON
验证 PMO 管理 Stop 静音时,用临时测试 config 指向 AUDIO_ALERT_PMO_CONFIG,并在 m4c cwd 下运行:
CODEX_HOME=/private/tmp/audio-alert-test-home-pmo AUDIO_ALERT_PMO_CONFIG=/private/tmp/audio-alert-pmo-active-test.json CODEX_AUDIO_ALERT_DRY_RUN=1 /usr/bin/python3 /Users/ar/.codex/hooks/audio_alert.py Stop <<'JSON'
{"last_assistant_message":"M4C-AUDIO-TEST 已完成,已回写进度。"}
JSON
清理 / 恢复命令:
rm -f /private/tmp/pmo-active-assignments-test.json /private/tmp/pmo-active-assignments-future-test.json /private/tmp/pmo-inbox-test.md /private/tmp/pmo-events-test.jsonl
rm -rf /private/tmp/audio-alert-test-home-ordinary /private/tmp/audio-alert-test-home-pmo
rm -f /private/tmp/audio-alert-pmo-active-test.json
搜索关键词:
/hooks 中信任。MD-* / M4C-* worker 时,先复制 pmo-active-assignments.json 中对应模板,改成真实 active assignment。progress_recent_window_seconds。PMO_INBOX.md。只读本存档可以还原:为什么做 PMO worker stop 通知、触发条件、核心文件、active assignment 字段、Stop hook 行为、状态分类和验证证据。合格。