From ba9c0717cf6094ce6733e46585d94050a8ee5a54 Mon Sep 17 00:00:00 2001 From: toki Date: Mon, 10 Aug 2026 01:15:48 +0900 Subject: [PATCH] =?UTF-8?q?fix(agent-ops):=20Milestone=20=ED=86=A0?= =?UTF-8?q?=ED=81=B0=20=EA=B2=80=EC=A6=9D=20=EB=B2=94=EC=9C=84=EB=A5=BC=20?= =?UTF-8?q?=EC=A0=95=EA=B5=90=ED=99=94=ED=95=9C=EB=8B=A4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../scripts/run_epic_cycle.py | 7 +++++- .../tests/test_run_epic_cycle.py | 22 +++++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/agent-ops/skills/common/prepare-epic-work-items/scripts/run_epic_cycle.py b/agent-ops/skills/common/prepare-epic-work-items/scripts/run_epic_cycle.py index cfb4dd01..bc581d1b 100755 --- a/agent-ops/skills/common/prepare-epic-work-items/scripts/run_epic_cycle.py +++ b/agent-ops/skills/common/prepare-epic-work-items/scripts/run_epic_cycle.py @@ -343,7 +343,12 @@ def validate_pairs( pairs.append((plan, review, header)) union.update(target_ids) contents = plan.read_text(encoding="utf-8") + "\n" + review.read_text(encoding="utf-8") - if "[TODO" in contents or "" in contents: + unresolved_contents = contents.replace("`m-`", "") + if ( + "[TODO" in unresolved_contents + or "" in unresolved_contents + or "" in unresolved_contents + ): raise CycleError(f"unresolved template token: {plan.parent}") if dispatcher.is_file(): run( diff --git a/agent-ops/skills/common/prepare-epic-work-items/tests/test_run_epic_cycle.py b/agent-ops/skills/common/prepare-epic-work-items/tests/test_run_epic_cycle.py index 8650d300..ac3c8ea0 100644 --- a/agent-ops/skills/common/prepare-epic-work-items/tests/test_run_epic_cycle.py +++ b/agent-ops/skills/common/prepare-epic-work-items/tests/test_run_epic_cycle.py @@ -286,6 +286,28 @@ class EpicCycleContractTest(unittest.TestCase): self.assertEqual(len(pairs), 1) self.assertEqual(union, {"inside"}) + def test_validate_pair_rejects_bare_milestone_slug_placeholder(self) -> None: + with tempfile.TemporaryDirectory() as raw: + workspace = Path(raw) + command(workspace, "git", "init") + task = workspace / "agent-task" / "m-sample" / "01_work" + task.mkdir(parents=True) + header = ( + "\n" + ) + (task / "PLAN-local-G01.md").write_text( + header + "# Plan\n\nPath: agent-task/m-/\n", + encoding="utf-8", + ) + (task / "CODE_REVIEW-local-G01.md").write_text( + header + "# Review\n", + encoding="utf-8", + ) + + with self.assertRaisesRegex(MODULE.CycleError, "unresolved template token"): + MODULE.validate_pairs(workspace, "m-sample", {"inside"}) + def test_validate_pair_rejects_foreign_pair_outside_selected_batch(self) -> None: with tempfile.TemporaryDirectory() as raw: workspace = Path(raw)