diff --git a/scripts/consistency_check.py b/scripts/consistency_check.py index ab14107..6bf12e2 100644 --- a/scripts/consistency_check.py +++ b/scripts/consistency_check.py @@ -17,6 +17,7 @@ Checks: C-10 task-status-drift WARN Yes Task status differs between file and DB C-11 task-unlinked WARN Yes Task block has no state_hub_task_id C-12 orphan-db-task WARN No DB task in workstream has no file backing + C-13 workstream-auto-complete WARN Yes All DB tasks done but workstream still active Usage: python scripts/consistency_check.py --repo SLUG [--fix] [--json] [--api-base URL] @@ -535,6 +536,32 @@ def check_repo(api_base: str, repo_slug: str) -> ConsistencyReport: fixable=False, ) + # C-13: all DB tasks done but workstream still active — worker forgot to close + db_status = ws.get("status", "") + if db_status == "active" and isinstance(db_tasks, list) and db_tasks: + non_terminal = [ + t for t in db_tasks + if t.get("status") not in ("done", "cancelled") + ] + if not non_terminal: + report.add( + severity="WARN", check_id="C-13", + message=( + f"All {len(db_tasks)} DB tasks for '{ws.get('slug')}' are " + f"done/cancelled but workstream status is still 'active' — " + f"worker likely forgot update_workstream_status()" + ), + file_path=fname, + db_id=ws_id, + db_value="active", + fixable=True, + _fix_context={ + "ws_id": ws_id, + "field": "status", + "value": "completed", + }, + ) + # C-07 / C-08: orphan DB workstreams (have repo_id=this_repo but no backing file) _check_orphan_db(api_base, repo_id, set(file_ws_ids.keys()), report) @@ -588,7 +615,7 @@ def fix_repo(api_base: str, repo_slug: str) -> ConsistencyReport: for issue in fixable: ctx = issue._fix_context try: - if issue.check_id in ("C-04", "C-05"): + if issue.check_id in ("C-04", "C-05", "C-13"): ws_id = ctx["ws_id"] result = _api_patch(api_base, f"/workstreams/{ws_id}", {ctx["field"]: ctx["value"]})