From 7fe25ece93da223dda319d0a23f84c6805f3e602 Mon Sep 17 00:00:00 2001 From: Svrnty Date: Sun, 31 May 2026 19:57:04 -0400 Subject: [PATCH] Protect Case model admission evidence --- ...TO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md | 1 + .../CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md | 1 + tools/validate_cto_child.py | 26 +++++++++++++++++++ 3 files changed, 28 insertions(+) diff --git a/sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md b/sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md index b568c59..9f01964 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md +++ b/sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md @@ -57,6 +57,7 @@ Blocked by: ## Hermes Implementation Evidence - 2026-05-31 - Hermes commit: `f39d8ab Require admitted Case model pair`. +- `f39d8ab` proves admission gating implementation only; it is not a real Case Stage 2 pass. - The Hermes adapter now requires `CTO_HARNESS_CASE_MODEL_ADMISSION_FILE`. - Env provider/model is only the requested pair; the admission JSON is the authority. - Missing admission blocks before `case_process_started`. diff --git a/sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md b/sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md index cc23940..d009e49 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md +++ b/sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md @@ -91,6 +91,7 @@ Real Case Stage 2 remains blocked until a named provider/model is admitted, then ## Hermes Implementation Evidence - 2026-05-31 - Hermes commit: `f39d8ab Require admitted Case model pair`. +- `f39d8ab` proves admission gating implementation only; it is not a real Case Stage 2 pass. - Admission file variable: `CTO_HARNESS_CASE_MODEL_ADMISSION_FILE`. - Env provider/model is now a requested pair, not admission authority. - The admission JSON is the authority for real Case Stage 2 model admission. diff --git a/tools/validate_cto_child.py b/tools/validate_cto_child.py index 8c06ca4..e4d152e 100644 --- a/tools/validate_cto_child.py +++ b/tools/validate_cto_child.py @@ -403,6 +403,28 @@ REQUIRED_MODEL_PROVIDER_ADMISSION_ISSUE_IDS = [ "CTO-WORK-020", ] +REQUIRED_MODEL_PROVIDER_ADMISSION_ISSUE_PHRASES = [ + "f39d8ab Require admitted Case model pair", + "`f39d8ab` proves admission gating implementation only; it is not a real Case Stage 2 pass.", + "CTO_HARNESS_CASE_MODEL_ADMISSION_FILE", + "admission JSON is the authority", + "Missing admission blocks before `case_process_started`.", + "Mismatched admission blocks before `case_process_started`.", + "case_model_provider", + "case_model", + "case_model_admission_status", + "admitted", + "missing_admission", + "mismatch", + "invalid_admission", + "not_admitted", + "report.md", + "Case stdout/stderr", + "20260531T235421Z-r1-string-slugify-1875638", + "20260531T235448Z-r1-string-slugify-1876884", + "`CTO-WORK-020` remains blocked until a provider/model is explicitly approved and real Case Stage 2 produces a pass report.", +] + def workboard_status(text: str, issue_id: str) -> str | None: pattern = rf"- id: {re.escape(issue_id)}\n(?: .+\n)*? status: ([^\n]+)" @@ -615,6 +637,10 @@ def main() -> int: checked.append(f"model_provider_admission_issue_id:{issue_id}") if issue_id not in text: errors.append(f"missing_model_provider_admission_issue_id:{issue_id}") + for phrase in REQUIRED_MODEL_PROVIDER_ADMISSION_ISSUE_PHRASES: + checked.append(f"model_provider_admission_issue_phrase:{phrase}") + if phrase not in text: + errors.append(f"missing_model_provider_admission_issue_phrase:{phrase}") board = ROOT / "WORKBOARD.yaml" if board.is_file():