diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 5b5d4a60..048ad55a 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -146,9 +146,22 @@ jobs: # 가능한 것만 나열한다. 실제 KIS API/라이브 앱이 전제인 나머지 DONE 작업은 # spec/60의 execution.mode: not_ci_reproducible 로 별도 표시되어 # validate_quant_engine_wbs_v1.py 가 verdict 부재를 FAIL로 취급하지 않는다. - for task in QE-M0-01 QE-M0-02 QE-M0-03 QE-M0-04 QE-M0-05 QE-M0-06 QE-M0-07 QE-M1-05 QE-M1-06 QE-M2-01 QE-M2-03 QE-M2-06 QE-M3-01 QE-M3-02 QE-M3-03 QE-M3-04 QE-M3-05; do - python3 tools/verify_wbs_task_v1.py --task "$task" - done + python3 - <<'PY' + from pathlib import Path + import subprocess + import yaml + + root = Path.cwd() + spec = yaml.safe_load((root / "spec" / "60_quant_engine_wbs.yaml").read_text(encoding="utf-8")) + tasks = spec.get("tasks") or {} + for task_id, task in tasks.items(): + if task.get("status") != "DONE": + continue + mode = ((task.get("execution") or {}).get("mode")) + if mode in {"not_ci_reproducible", "manual_user_action"}: + continue + subprocess.run(["python3", "tools/verify_wbs_task_v1.py", "--task", task_id], check=True, cwd=root) + PY - name: Validate Quant Engine WBS run: python3 tools/validate_quant_engine_wbs_v1.py diff --git a/tools/validate_gitea_ci_workflow_lint_v1.py b/tools/validate_gitea_ci_workflow_lint_v1.py index 11d0fa50..3f790524 100644 --- a/tools/validate_gitea_ci_workflow_lint_v1.py +++ b/tools/validate_gitea_ci_workflow_lint_v1.py @@ -2,7 +2,6 @@ from __future__ import annotations import argparse import json -import re from pathlib import Path import yaml @@ -60,21 +59,12 @@ def main() -> int: done_tasks.append(task_id) done_tasks.sort() - match = re.search( - r"for task in (?P.+?); do\s+python3 tools/verify_wbs_task_v1\.py --task \"?\$?task\"?\s+done", - ci_text, - re.S, - ) - if not match: - errors.append("workflow missing Generate DONE WBS Verdicts task list") - else: - declared = re.findall(r"QE-[A-Z0-9-]+", match.group("tasks")) - missing = [task for task in done_tasks if task not in declared] - extra = [task for task in declared if task not in done_tasks] - if missing: - errors.append("workflow omits DONE verdict tasks: " + ", ".join(missing)) - if extra: - errors.append("workflow includes non-DONE verdict tasks: " + ", ".join(extra)) + if 'root / "spec" / "60_quant_engine_wbs.yaml"' not in ci_text: + errors.append("workflow does not derive DONE verdict tasks from spec/60_quant_engine_wbs.yaml") + if 'mode in {"not_ci_reproducible", "manual_user_action"}' not in ci_text: + errors.append("workflow does not skip not_ci_reproducible/manual_user_action tasks") + if "python3 - <<'PY'" not in ci_text: + errors.append("workflow still hardcodes DONE verdict task list") result = { "formula_id": "GITEA_CI_WORKFLOW_LINT_V1",