diff --git a/src/discussion_framework/validation.py b/src/discussion_framework/validation.py index 6f244b7..b77bb42 100644 --- a/src/discussion_framework/validation.py +++ b/src/discussion_framework/validation.py @@ -89,6 +89,10 @@ def _record_id(errors: list[str], seen: set[str], identifier: str) -> None: def _requires_file(discussion: dict, artifact: dict, kind: str) -> bool: if kind == "lessons": return True + if discussion.get("status") == "done": + return False + if artifact.get("status") == "done": + return False if discussion.get("status") == "abandoned": return artifact.get("status") != "abandoned" return True diff --git a/tests/test_cli.py b/tests/test_cli.py index a797378..5135750 100644 --- a/tests/test_cli.py +++ b/tests/test_cli.py @@ -195,6 +195,48 @@ class CliTest(unittest.TestCase): self.assertEqual(item["lessons"][0]["id"], "LSN-0001") self.assertFalse((discussion / "workflow" / "agendas" / "AGD-0001-demo.md").exists()) + def test_validate_allows_done_discussion_with_historical_workflow_entries(self) -> None: + with TempDir() as root: + main(["--root", str(root), "init"]) + discussion = root / "discussion" + lesson = discussion / "lessons" / "DSC-0001-demo" + lesson.mkdir() + lesson_file = lesson / "LSN-0001-demo.md" + lesson_file.write_text("---\nid: LSN-0001\n---\n# Demo\n", encoding="utf-8") + + records = [ + {"type": "meta", "next_id": {"DSC": 2, "AGD": 2, "DEC": 2, "PLN": 2, "LSN": 2, "CLSN": 1}}, + { + "type": "discussion", + "id": "DSC-0001", + "status": "done", + "ticket": "demo", + "title": "Demo", + "created_at": "2026-05-08", + "updated_at": "2026-05-08", + "tags": [], + "agendas": [{"id": "AGD-0001", "file": "AGD-0001-demo.md", "status": "done"}], + "decisions": [{"id": "DEC-0001", "file": "DEC-0001-demo.md", "status": "accepted"}], + "plans": [{"id": "PLN-0001", "file": "PLN-0001-demo.md", "status": "done"}], + "lessons": [ + { + "id": "LSN-0001", + "file": "discussion/lessons/DSC-0001-demo/LSN-0001-demo.md", + "status": "done", + } + ], + }, + ] + (discussion / "index.ndjson").write_text( + "\n".join(json.dumps(record, separators=(",", ":")) for record in records) + "\n", + encoding="utf-8", + ) + + stdout = io.StringIO() + with contextlib.redirect_stdout(stdout): + self.assertEqual(main(["--root", str(root), "validate"]), 0) + self.assertIn("validation passed", stdout.getvalue()) + def test_inspect_context_next_actions_and_backup(self) -> None: with TempDir() as root: main(["--root", str(root), "init"])