194 lines
6.6 KiB
Python
Executable file
194 lines
6.6 KiB
Python
Executable file
#!/usr/bin/env python3
|
|
from __future__ import annotations
|
|
|
|
import itertools
|
|
import subprocess
|
|
import unittest
|
|
from pathlib import Path
|
|
|
|
|
|
SKILL_DIR = Path(__file__).resolve().parents[1]
|
|
FORMATTER = SKILL_DIR / "scripts" / "finalize-task-route.sh"
|
|
POLICY_FINALIZER = SKILL_DIR / "scripts" / "finalize-task-policy.sh"
|
|
|
|
GRADE_VECTORS = {
|
|
1: (0, 0, 0, 0, 0),
|
|
2: (2, 0, 0, 0, 0),
|
|
3: (2, 1, 0, 0, 0),
|
|
4: (2, 2, 0, 0, 0),
|
|
5: (2, 2, 1, 0, 0),
|
|
6: (2, 2, 2, 0, 0),
|
|
7: (2, 2, 2, 1, 0),
|
|
8: (2, 2, 2, 2, 0),
|
|
9: (2, 2, 2, 2, 1),
|
|
10: (2, 2, 2, 2, 2),
|
|
}
|
|
|
|
|
|
def run(
|
|
script: Path, *args: object, check: bool = True
|
|
) -> subprocess.CompletedProcess[str]:
|
|
return subprocess.run(
|
|
[str(script), *(str(arg) for arg in args)],
|
|
check=check,
|
|
capture_output=True,
|
|
text=True,
|
|
timeout=5,
|
|
)
|
|
|
|
|
|
def fields(stdout: str) -> dict[str, str]:
|
|
return dict(line.split("=", 1) for line in stdout.splitlines())
|
|
|
|
|
|
def expected_build_route(basis: str, grade: int) -> tuple[str, bool]:
|
|
if basis == "local-fit":
|
|
return "local", grade <= 8
|
|
if basis == "capability-gap":
|
|
return "cloud", True
|
|
return "cloud", grade >= 9
|
|
|
|
|
|
def pair_args(
|
|
build_basis: str,
|
|
build_grade: int,
|
|
review_grade: int,
|
|
risk: str = "false",
|
|
review_basis: str = "official-review",
|
|
) -> tuple[object, ...]:
|
|
return (
|
|
"pair",
|
|
build_basis,
|
|
risk,
|
|
*GRADE_VECTORS[build_grade],
|
|
review_basis,
|
|
*GRADE_VECTORS[review_grade],
|
|
)
|
|
|
|
|
|
class FinalizeTaskRoutingTests(unittest.TestCase):
|
|
def assert_route(
|
|
self,
|
|
result: dict[str, str],
|
|
target: str,
|
|
basis: str,
|
|
lane: str,
|
|
grade: int,
|
|
) -> None:
|
|
prefix = "PLAN" if target == "build" else "CODE_REVIEW"
|
|
self.assertEqual(result[f"{target}_route_basis"], basis)
|
|
self.assertEqual(result[f"{target}_lane"], lane)
|
|
self.assertEqual(result[f"{target}_grade"], f"G{grade:02d}")
|
|
self.assertEqual(
|
|
result[f"{target}_filename"], f"{prefix}-{lane}-G{grade:02d}.md"
|
|
)
|
|
|
|
def test_formatter_grade_and_filename_matrix(self) -> None:
|
|
for target, lane, grade in itertools.product(
|
|
("build", "review"), ("local", "cloud"), range(1, 11)
|
|
):
|
|
with self.subTest(target=target, lane=lane, grade=grade):
|
|
result = fields(run(FORMATTER, target, lane, *GRADE_VECTORS[grade]).stdout)
|
|
prefix = "PLAN" if target == "build" else "CODE_REVIEW"
|
|
self.assertEqual(result["grade"], f"G{grade:02d}")
|
|
self.assertEqual(
|
|
result["filename"], f"{prefix}-{lane}-G{grade:02d}.md"
|
|
)
|
|
|
|
def test_formatter_invalid_inputs_are_rejected(self) -> None:
|
|
valid = list(GRADE_VECTORS[4])
|
|
invalid_cases: list[tuple[object, ...]] = [
|
|
("deploy", "local", *valid),
|
|
("build", "hybrid", *valid),
|
|
("build", "local", *valid[:-1]),
|
|
("build", "local", *valid, 1),
|
|
]
|
|
for index in range(5):
|
|
scores = valid.copy()
|
|
scores[index] = 3
|
|
invalid_cases.append(("build", "local", *scores))
|
|
for args in invalid_cases:
|
|
with self.subTest(args=args):
|
|
self.assertEqual(run(FORMATTER, *args, check=False).returncode, 2)
|
|
|
|
def test_pair_policy_validates_each_build_basis_and_grade(self) -> None:
|
|
for basis, grade in itertools.product(
|
|
("local-fit", "capability-gap", "grade-boundary"), range(1, 11)
|
|
):
|
|
with self.subTest(basis=basis, grade=grade):
|
|
completed = run(
|
|
POLICY_FINALIZER,
|
|
*pair_args(basis, grade, 1),
|
|
check=False,
|
|
)
|
|
lane, valid = expected_build_route(basis, grade)
|
|
if not valid:
|
|
self.assertEqual(completed.returncode, 2)
|
|
continue
|
|
self.assertEqual(completed.returncode, 0, completed.stderr)
|
|
result = fields(completed.stdout)
|
|
self.assertEqual(result["finalizer_mode"], "pair")
|
|
self.assert_route(result, "build", basis, lane, grade)
|
|
|
|
def test_official_review_keeps_grade_and_fixes_execution_target(self) -> None:
|
|
for grade in range(1, 11):
|
|
with self.subTest(grade=grade):
|
|
result = fields(
|
|
run(POLICY_FINALIZER, *pair_args("local-fit", 1, grade)).stdout
|
|
)
|
|
self.assert_route(
|
|
result, "review", "official-review", "cloud", grade
|
|
)
|
|
self.assertEqual(result["review_adapter"], "codex")
|
|
self.assertEqual(result["review_model"], "gpt-5.6-sol")
|
|
self.assertEqual(result["review_reasoning_effort"], "xhigh")
|
|
|
|
def test_low_grade_cloud_requires_capability_gap_basis(self) -> None:
|
|
rejected = run(
|
|
POLICY_FINALIZER,
|
|
*pair_args("grade-boundary", 4, 4),
|
|
check=False,
|
|
)
|
|
self.assertEqual(rejected.returncode, 2)
|
|
|
|
accepted = fields(
|
|
run(
|
|
POLICY_FINALIZER,
|
|
*pair_args("capability-gap", 4, 4),
|
|
).stdout
|
|
)
|
|
self.assert_route(accepted, "build", "capability-gap", "cloud", 4)
|
|
|
|
def test_loop_risk_is_audit_only(self) -> None:
|
|
outputs = []
|
|
for risk in ("false", "true"):
|
|
result = fields(
|
|
run(
|
|
POLICY_FINALIZER,
|
|
*pair_args("local-fit", 7, 6, risk),
|
|
).stdout
|
|
)
|
|
outputs.append(result)
|
|
self.assertEqual(result["build_risk_triggered"], risk)
|
|
for key in ("build_lane", "build_grade", "build_filename"):
|
|
self.assertEqual(outputs[0][key], outputs[1][key])
|
|
|
|
def test_policy_invalid_inputs_are_rejected(self) -> None:
|
|
valid = GRADE_VECTORS[4]
|
|
invalid_cases = (
|
|
("pair", "local-fit", "unknown", *valid, "official-review", *valid),
|
|
("pair", "local", "false", *valid, "official-review", *valid),
|
|
("pair", "local-fit", "false", *valid, "cloud", *valid),
|
|
("build", "local-fit", "false", *valid),
|
|
("pair", "local-fit", "false", *valid, "official-review", *valid[:-1]),
|
|
)
|
|
for args in invalid_cases:
|
|
with self.subTest(args=args):
|
|
self.assertEqual(
|
|
run(POLICY_FINALIZER, *args, check=False).returncode,
|
|
2,
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
unittest.main()
|