From df0ecdbf1d6cbf8878c84a9b154bc4d022ab035d Mon Sep 17 00:00:00 2001 From: toki Date: Mon, 10 Aug 2026 00:50:16 +0900 Subject: [PATCH] =?UTF-8?q?fix(agent-ops):=20Milestone=20=ED=91=9C?= =?UTF-8?q?=EA=B8=B0=20=EA=B2=80=EC=A6=9D=20=EC=98=A4=ED=83=90=EC=9D=84=20?= =?UTF-8?q?=EC=88=98=EC=A0=95=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 | 2 +- .../tests/test_run_epic_cycle.py | 26 +++++++++++++++++++ 2 files changed, 27 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 c01b0ff7..cfb4dd01 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,7 @@ 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 or "" in contents: + if "[TODO" in contents or "" in 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 cd1261b5..8650d300 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 @@ -260,6 +260,32 @@ class EpicCycleContractTest(unittest.TestCase): self.assertEqual([pair[0].parent.name for pair in pairs], ["02_second"]) self.assertEqual(union, {"second-task"}) + def test_validate_pair_allows_documented_milestone_slug_notation(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", + encoding="utf-8", + ) + (task / "CODE_REVIEW-local-G01.md").write_text( + header + + "# Review\n\n" + + "For task groups matching `m-`, preserve metadata.\n", + encoding="utf-8", + ) + + pairs, union = MODULE.validate_pairs(workspace, "m-sample", {"inside"}) + + self.assertEqual(len(pairs), 1) + self.assertEqual(union, {"inside"}) + def test_validate_pair_rejects_foreign_pair_outside_selected_batch(self) -> None: with tempfile.TemporaryDirectory() as raw: workspace = Path(raw)