fix(ack): keep coordinator loop active after dispatch

This commit is contained in:
2026-09-19 18:46:18 +08:00
parent f469c8f5f5
commit 2917708b10
2 changed files with 26 additions and 1 deletions
+2 -1
View File
@@ -83,7 +83,8 @@ python3 <ack-skill-dir>/scripts/validate_agents.py .pouch/ack/agents.yaml
1. `.pouch/ack` 不存在:停止并建议先 `/ack` 初始化;不要静默初始化。 1. `.pouch/ack` 不存在:停止并建议先 `/ack` 初始化;不要静默初始化。
2. 读 `project.md`;若存在 `agents.yaml`,先用 `validate_agents.py` 校验并读取其 `defaults`;用 `select_tasks.py`(已知任务加 `--task-id`)和 `select_knowledge.py` 取当前任务相关 `active` 条目。超预算时缩小选择,不回退为完整 yaml。 2. 读 `project.md`;若存在 `agents.yaml`,先用 `validate_agents.py` 校验并读取其 `defaults`;用 `select_tasks.py`(已知任务加 `--task-id`)和 `select_knowledge.py` 取当前任务相关 `active` 条目。超预算时缩小选择,不回退为完整 yaml。
3. 新需求或尚未确认的计划:读 [kickoff.md](references/kickoff.md)。修 bug 写短问题说明、复现和可观测验收,不写大 PRD。 3. 新需求或尚未确认的计划:读 [kickoff.md](references/kickoff.md)。修 bug 写短问题说明、复现和可观测验收,不写大 PRD。
4. 用户已确认后按 [closed-loop.md](references/closed-loop.md) 执行。当前会话担任 Coordinator,不亲自写代码或跑测试;worker profile 按 `agents.yaml`(若存在)否则按任务板配置选择。 4. 用户已确认后,先读取并按 [closed-loop.md](references/closed-loop.md) 执行;使用 Orca 时同时读取 [orca-adapter.md](references/orca-adapter.md)。当前会话担任 Coordinator,不亲自写代码或跑测试;worker profile 按 `agents.yaml`(若存在)否则按任务板配置选择。
这不是 fire-and-forget:Coordinator 不得在 `launch` / `dispatch` 后只回复“已派发”并结束当前会话。每个任务都必须在同一轮持续执行 `check --wait` 与 `worker_probe.py`,直到 Developer 回报 `worker_done` 或 `escalation`;随后写回 `fixed_by_dev`,主动派发 Test,并继续等待 `retest_result`。只有完成 Test 终检、重试/`leftover` 决策、回归决定和 worker 回收后,才可以结束本轮 ACK。
5. 存在 `project.bugIntake` 时先完成「飞书收件」。创建或更换 worker 走「启动 worker」。若 `intents.testEnvironment` 已启用,派 Test 前先走「运行测试环境」。 5. 存在 `project.bugIntake` 时先完成「飞书收件」。创建或更换 worker 走「启动 worker」。若 `intents.testEnvironment` 已启用,派 Test 前先走「运行测试环境」。
6. 知识 `verification.ref` 只经 `run_verification.py`。不把 `worker_done` 或 Test 自报成功当作完成。环境失败先有界恢复并报告 `userAction`;三轮产品失败记 `leftover`。 6. 知识 `verification.ref` 只经 `run_verification.py`。不把 `worker_done` 或 Test 自报成功当作完成。环境失败先有界恢复并报告 `userAction`;三轮产品失败记 `leftover`。
7. 任务 `verified` 且改了可见行为或 API 后,转入「运行回归」收获用例。若本次计划含交付,再走对应交付模式;默认最多到 `validation_ready` 或 `review_ready`。 7. 任务 `verified` 且改了可见行为或 API 后,转入「运行回归」收获用例。若本次计划含交付,再走对应交付模式;默认最多到 `validation_ready` 或 `review_ready`。
+24
View File
@@ -121,6 +121,30 @@ class AckSkillContentTests(unittest.TestCase):
self.assertIn("validation_ready", delivery) self.assertIn("validation_ready", delivery)
self.assertIn("访问地址和用户下一步", delivery) self.assertIn("访问地址和用户下一步", delivery)
def test_coordinator_keeps_looping_and_chains_developer_to_test(self) -> None:
skill = (REPO_ROOT / "skills" / "ack" / "SKILL.md").read_text(
encoding="utf-8"
)
required = (
"这不是 fire-and-forget",
"不得在 `launch` / `dispatch` 后只回复“已派发”并结束当前会话",
"`check --wait`",
"`worker_probe.py`",
"Developer 回报 `worker_done` 或 `escalation`",
"写回 `fixed_by_dev`",
"主动派发 Test",
"继续等待 `retest_result`",
)
for expected in required:
self.assertIn(expected, skill)
dispatch_pos = skill.index("主动派发 Test")
dev_done_pos = skill.index("Developer 回报 `worker_done` 或 `escalation`")
test_done_pos = skill.index("继续等待 `retest_result`")
self.assertLess(dev_done_pos, dispatch_pos)
self.assertLess(dispatch_pos, test_done_pos)
def test_ack_knowledge_resources_and_version_are_present(self) -> None: def test_ack_knowledge_resources_and_version_are_present(self) -> None:
ack_dir = REPO_ROOT / "skills" / "ack" ack_dir = REPO_ROOT / "skills" / "ack"