Record Stage 5 repeatability proof

This commit is contained in:
Svrnty
2026-06-02 06:20:42 -04:00
parent facca7f743
commit ae08dc4468
5 changed files with 271 additions and 0 deletions
+61
View File
@@ -78,6 +78,9 @@ REQUIRED_FILES = [
".sot/03-PROTOCOLS/CTO-ENDGOAL-COMPLETION-AUDIT-PRD.md",
".sot/03-PROTOCOLS/CTO-ENDGOAL-COMPLETION-AUDIT-ISSUES.md",
".sot/03-PROTOCOLS/CTO-ENDGOAL-COMPLETION-AUDIT-CLOSEOUT.md",
".sot/03-PROTOCOLS/CTO-CASE-STAGE5-REPEATABILITY-PROOF-PRD.md",
".sot/03-PROTOCOLS/CTO-CASE-STAGE5-REPEATABILITY-PROOF-ISSUES.md",
".sot/03-PROTOCOLS/CTO-CASE-STAGE5-REPEATABILITY-PROOF-EVIDENCE.md",
".sot/03-PROTOCOLS/CTO-FIRST-REAL-GOVERNED-WORKFLOW-PRD.md",
".sot/03-PROTOCOLS/CTO-FIRST-REAL-GOVERNED-WORKFLOW-ISSUES.md",
".sot/03-PROTOCOLS/CTO-FIRST-REAL-GOVERNED-WORKFLOW-APPROVAL-PACKET.md",
@@ -1299,6 +1302,31 @@ REQUIRED_SPARK_ENDPOINT_CONFIG_ISSUE_PHRASES = [
"Non-secret readiness check on 2026-06-01 showed `CTO_HARNESS_CASE_LOCAL_BASE_URL=missing`.",
]
REQUIRED_STAGE5_REPEATABILITY_PHRASES = [
"Local planning SOT only. Not a Core Protocol. Not active Core authority.",
"CTO-WORK-078",
"CTO-WORK-079",
"CTO-WORK-080",
"Stage 5 repeatability proof",
"second governed Stage 5 Case run",
"r1-slugify-punctuation",
"99000f7",
"2fa1601",
"/home/svrnty/.hermes/profiles/cto-planb/harness-runs/20260602T101450Z-r1-slugify-punctuation-2663598/report.json",
"/home/svrnty/.hermes/profiles/cto-planb/harness-runs/20260602T101450Z-r1-slugify-punctuation-2663598/stage5-owned-repo-proof.json",
"case_process_started: true",
"changed files: `src/strings.py`, `strings.py`, `test_strings.py`",
"allowed paths passed: true",
"forbidden paths passed: true",
"target repository start clean: true",
"target repository ending clean: true",
"11 passed",
"Runtime default activation remains false.",
"Do not activate Case as default backend.",
"This closeout does not authorize another Case run.",
"No Core promotion occurs.",
]
def workboard_status(text: str, issue_id: str) -> str | None:
pattern = rf"- id: {re.escape(issue_id)}\n(?: .+\n)*? status: ([^\n]+)"
@@ -1787,6 +1815,36 @@ def main() -> int:
if phrase not in text:
errors.append(f"missing_stage6_real_refresh_evidence_phrase:{phrase}")
stage5_repeatability_prd = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-STAGE5-REPEATABILITY-PROOF-PRD.md"
if stage5_repeatability_prd.is_file():
text = stage5_repeatability_prd.read_text(encoding="utf-8")
if "core_promotion_status: not-promoted" not in text:
errors.append("stage5_repeatability_prd_missing_not_promoted_frontmatter")
for phrase in REQUIRED_STAGE5_REPEATABILITY_PHRASES:
checked.append(f"stage5_repeatability_prd_phrase:{phrase}")
if phrase not in text:
errors.append(f"missing_stage5_repeatability_prd_phrase:{phrase}")
stage5_repeatability_issues = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-STAGE5-REPEATABILITY-PROOF-ISSUES.md"
if stage5_repeatability_issues.is_file():
text = stage5_repeatability_issues.read_text(encoding="utf-8")
if "core_promotion_status: not-promoted" not in text:
errors.append("stage5_repeatability_issues_missing_not_promoted_frontmatter")
for phrase in REQUIRED_STAGE5_REPEATABILITY_PHRASES:
checked.append(f"stage5_repeatability_issue_phrase:{phrase}")
if phrase not in text:
errors.append(f"missing_stage5_repeatability_issue_phrase:{phrase}")
stage5_repeatability_evidence = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-STAGE5-REPEATABILITY-PROOF-EVIDENCE.md"
if stage5_repeatability_evidence.is_file():
text = stage5_repeatability_evidence.read_text(encoding="utf-8")
if "core_promotion_status: not-promoted" not in text:
errors.append("stage5_repeatability_evidence_missing_not_promoted_frontmatter")
for phrase in REQUIRED_STAGE5_REPEATABILITY_PHRASES:
checked.append(f"stage5_repeatability_evidence_phrase:{phrase}")
if phrase not in text:
errors.append(f"missing_stage5_repeatability_evidence_phrase:{phrase}")
prd = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md"
if prd.is_file():
text = prd.read_text(encoding="utf-8")
@@ -2395,6 +2453,9 @@ def main() -> int:
"CTO-WORK-075": "validated",
"CTO-WORK-076": "validated",
"CTO-WORK-077": "validated",
"CTO-WORK-078": "validated",
"CTO-WORK-079": "validated",
"CTO-WORK-080": "validated",
}
for issue_id, expected in expected_statuses.items():
checked.append(f"workboard_status:{issue_id}:{expected}")