diff --git a/sot/00-START/CTO-WORKSPACE-INTENT.md b/.sot/00-START/CTO-WORKSPACE-INTENT.md similarity index 100% rename from sot/00-START/CTO-WORKSPACE-INTENT.md rename to .sot/00-START/CTO-WORKSPACE-INTENT.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-ADAPTER-CONTRACT.md b/.sot/03-PROTOCOLS/CTO-CASE-ADAPTER-CONTRACT.md similarity index 98% rename from sot/03-PROTOCOLS/CTO-CASE-ADAPTER-CONTRACT.md rename to .sot/03-PROTOCOLS/CTO-CASE-ADAPTER-CONTRACT.md index 0fde9ae..1441c7a 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-ADAPTER-CONTRACT.md +++ b/.sot/03-PROTOCOLS/CTO-CASE-ADAPTER-CONTRACT.md @@ -3,7 +3,7 @@ name: cto-case-adapter-contract tier: local status: draft owner: jp -source: sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md +source: .sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md created: 2026-05-31 last_reviewed: 2026-05-31 lifecycle_classification: planning diff --git a/sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md b/.sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md rename to .sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-ISSUES.md b/.sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-ISSUES.md similarity index 99% rename from sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-ISSUES.md rename to .sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-ISSUES.md index 9360dc6..d5e8d50 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-ISSUES.md +++ b/.sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-ISSUES.md @@ -3,7 +3,7 @@ name: cto-case-candidate-backend-issues tier: local status: draft owner: jp -source: sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md +source: .sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md created: 2026-05-31 last_reviewed: 2026-05-31 lifecycle_classification: planning diff --git a/sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md b/.sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md rename to .sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-FAILURE-FIXTURE-MATRIX.md b/.sot/03-PROTOCOLS/CTO-CASE-FAILURE-FIXTURE-MATRIX.md similarity index 98% rename from sot/03-PROTOCOLS/CTO-CASE-FAILURE-FIXTURE-MATRIX.md rename to .sot/03-PROTOCOLS/CTO-CASE-FAILURE-FIXTURE-MATRIX.md index 52cefae..2cf8764 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-FAILURE-FIXTURE-MATRIX.md +++ b/.sot/03-PROTOCOLS/CTO-CASE-FAILURE-FIXTURE-MATRIX.md @@ -3,7 +3,7 @@ name: cto-case-failure-fixture-matrix tier: local status: draft owner: jp -source: sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md +source: .sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md created: 2026-05-31 last_reviewed: 2026-05-31 lifecycle_classification: planning diff --git a/sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-ISSUES.md b/.sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-ISSUES.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-ISSUES.md rename to .sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-ISSUES.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-PRD.md b/.sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-PRD.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-PRD.md rename to .sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-PRD.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md b/.sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md rename to .sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md b/.sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md rename to .sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-ISSUES.md b/.sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-ISSUES.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-ISSUES.md rename to .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-ISSUES.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-PRD.md b/.sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-PRD.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-PRD.md rename to .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-PRD.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md b/.sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md rename to .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-PRD.md b/.sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-PRD.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-PRD.md rename to .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-PRD.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-ISSUES.md b/.sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-ISSUES.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-ISSUES.md rename to .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-ISSUES.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-PRD.md b/.sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-PRD.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-PRD.md rename to .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-PRD.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-RECORD.md b/.sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-RECORD.md similarity index 100% rename from sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-RECORD.md rename to .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-RECORD.md diff --git a/sot/03-PROTOCOLS/CTO-CASE-SOURCE-ADMISSION-RECORD.md b/.sot/03-PROTOCOLS/CTO-CASE-SOURCE-ADMISSION-RECORD.md similarity index 98% rename from sot/03-PROTOCOLS/CTO-CASE-SOURCE-ADMISSION-RECORD.md rename to .sot/03-PROTOCOLS/CTO-CASE-SOURCE-ADMISSION-RECORD.md index a18833b..258152a 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-SOURCE-ADMISSION-RECORD.md +++ b/.sot/03-PROTOCOLS/CTO-CASE-SOURCE-ADMISSION-RECORD.md @@ -3,7 +3,7 @@ name: cto-case-source-admission-record tier: local status: draft owner: jp -source: sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md +source: .sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md created: 2026-05-31 last_reviewed: 2026-05-31 lifecycle_classification: planning diff --git a/sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-ISSUES.md b/.sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-ISSUES.md similarity index 98% rename from sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-ISSUES.md rename to .sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-ISSUES.md index 158dd06..3e992a4 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-ISSUES.md +++ b/.sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-ISSUES.md @@ -3,7 +3,7 @@ name: cto-case-stage1-gated-engine-issues tier: local status: draft owner: jp -source: sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md +source: .sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md created: 2026-05-31 last_reviewed: 2026-05-31 lifecycle_classification: planning diff --git a/sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md b/.sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md similarity index 98% rename from sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md rename to .sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md index ecdc5da..23593e8 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md +++ b/.sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md @@ -3,7 +3,7 @@ name: cto-case-stage1-gated-engine-prd tier: local status: draft owner: jp -source: sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md +source: .sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md created: 2026-05-31 last_reviewed: 2026-05-31 lifecycle_classification: planning diff --git a/sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-ISSUES.md b/.sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-ISSUES.md similarity index 98% rename from sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-ISSUES.md rename to .sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-ISSUES.md index e07179a..3171e52 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-ISSUES.md +++ b/.sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-ISSUES.md @@ -3,7 +3,7 @@ name: cto-case-stage2-artificial-fixture-issues tier: local status: draft owner: jp -source: sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md +source: .sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md created: 2026-05-31 last_reviewed: 2026-05-31 lifecycle_classification: planning diff --git a/sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md b/.sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md similarity index 99% rename from sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md rename to .sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md index bd586d4..73fa074 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md +++ b/.sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md @@ -3,7 +3,7 @@ name: cto-case-stage2-artificial-fixture-prd tier: local status: draft owner: jp -source: sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md +source: .sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md created: 2026-05-31 last_reviewed: 2026-05-31 lifecycle_classification: planning diff --git a/sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md b/.sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md similarity index 99% rename from sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md rename to .sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md index 39bfaa3..4caab26 100644 --- a/sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md +++ b/.sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md @@ -3,7 +3,7 @@ name: cto-case-staged-proof-gates tier: local status: draft owner: jp -source: sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md +source: .sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md created: 2026-05-31 last_reviewed: 2026-05-31 lifecycle_classification: planning diff --git a/sot/03-PROTOCOLS/CTO-HARNESS-EVIDENCE-INTERFACE-CONTRACT.md b/.sot/03-PROTOCOLS/CTO-HARNESS-EVIDENCE-INTERFACE-CONTRACT.md similarity index 99% rename from sot/03-PROTOCOLS/CTO-HARNESS-EVIDENCE-INTERFACE-CONTRACT.md rename to .sot/03-PROTOCOLS/CTO-HARNESS-EVIDENCE-INTERFACE-CONTRACT.md index 60dd6c2..93a8529 100644 --- a/sot/03-PROTOCOLS/CTO-HARNESS-EVIDENCE-INTERFACE-CONTRACT.md +++ b/.sot/03-PROTOCOLS/CTO-HARNESS-EVIDENCE-INTERFACE-CONTRACT.md @@ -3,7 +3,7 @@ name: cto-harness-evidence-interface-contract tier: local status: draft owner: jp -source: sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md +source: .sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md created: 2026-05-31 last_reviewed: 2026-05-31 lifecycle_classification: planning diff --git a/AGENTS.md b/AGENTS.md index cb6e1c1..effee63 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -9,7 +9,7 @@ It is not Cortex OS Core authority. It is not a Cortex OS Instance. It is not a 1. `/home/svrnty/workspaces/cortex-os/core` active SOT. 2. `/home/svrnty/workspaces/cortex-os/core/AGENTS.md`. 3. This file. -4. `README.md`, `WORKBOARD.yaml`, local `sot/`, and local tools. +4. `README.md`, `WORKBOARD.yaml`, local `.sot/`, and local tools. 5. Chat/session memory. ## Workspace Classification diff --git a/README.md b/README.md index 08230d7..e83741d 100644 --- a/README.md +++ b/README.md @@ -26,7 +26,7 @@ This workspace is registered as a child-local planning workspace. Registration d |-- AGENTS.md |-- README.md |-- WORKBOARD.yaml -|-- sot/ +|-- .sot/ | |-- 00-START/ | | `-- CTO-WORKSPACE-INTENT.md | `-- 03-PROTOCOLS/ diff --git a/WORKBOARD.yaml b/WORKBOARD.yaml index aad679f..15b5456 100644 --- a/WORKBOARD.yaml +++ b/WORKBOARD.yaml @@ -2,126 +2,126 @@ items: - id: CTO-WORK-001 title: CTO Case Backend Architecture Brief status: candidate - source: sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md + source: .sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md owner: jp - id: CTO-WORK-002 title: CTO Case Candidate Backend PRD status: validated - source: sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md + source: .sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md owner: "" - id: CTO-WORK-003 title: Planning Validator Coverage status: validated - source: sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-ISSUES.md + source: .sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-ISSUES.md owner: "" - id: CTO-WORK-004 title: Harness Evidence Interface Contract status: validated - source: sot/03-PROTOCOLS/CTO-HARNESS-EVIDENCE-INTERFACE-CONTRACT.md + source: .sot/03-PROTOCOLS/CTO-HARNESS-EVIDENCE-INTERFACE-CONTRACT.md owner: "" - id: CTO-WORK-005 title: Case Source Admission Record status: validated - source: sot/03-PROTOCOLS/CTO-CASE-SOURCE-ADMISSION-RECORD.md + source: .sot/03-PROTOCOLS/CTO-CASE-SOURCE-ADMISSION-RECORD.md owner: "" - id: CTO-WORK-006 title: Case Adapter Contract And Eligibility Decision status: validated - source: sot/03-PROTOCOLS/CTO-CASE-ADAPTER-CONTRACT.md + source: .sot/03-PROTOCOLS/CTO-CASE-ADAPTER-CONTRACT.md owner: "" - id: CTO-WORK-007 title: Case Failure Fixture Matrix status: validated - source: sot/03-PROTOCOLS/CTO-CASE-FAILURE-FIXTURE-MATRIX.md + source: .sot/03-PROTOCOLS/CTO-CASE-FAILURE-FIXTURE-MATRIX.md owner: "" - id: CTO-WORK-008 title: Staged Proof Gate Records status: validated - source: sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md + source: .sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md owner: "" - id: CTO-WORK-009 title: Stage 1 Gated Case Engine PRD status: validated - source: sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md + source: .sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md owner: "" - id: CTO-WORK-010 title: Stage 1 Harness Implementation Route status: validated - source: sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-ISSUES.md + source: .sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-ISSUES.md owner: "" - id: CTO-WORK-011 title: Stage 2 Artificial Fixture PRD status: validated - source: sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md + source: .sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md owner: "" - id: CTO-WORK-012 title: Stage 2 Harness Artificial Fixture Route status: blocked - source: sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-ISSUES.md + source: .sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-ISSUES.md owner: jp - id: CTO-WORK-013 title: Case Provider Admission PRD status: validated - source: sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-PRD.md + source: .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-PRD.md owner: "" - id: CTO-WORK-014 title: Hermes Case CLI Task Adapter Route status: validated - source: sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-ISSUES.md + source: .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-ISSUES.md owner: "" - id: CTO-WORK-015 title: Durable Case Provider Build PRD status: validated - source: sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-PRD.md + source: .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-PRD.md owner: "" - id: CTO-WORK-016 title: Real Case Provider Stage 2 Run status: blocked - source: sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md + source: .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md owner: jp - id: CTO-WORK-017 title: Case Provider Timeout Fail-Closed Route status: validated - source: sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md + source: .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md owner: "" - id: CTO-WORK-018 title: Case Model Provider Admission Gate status: validated - source: sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md + source: .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md owner: "" - id: CTO-WORK-019 title: Case Model Provider Admission PRD status: validated - source: sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md + source: .sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md owner: "" - id: CTO-WORK-020 title: Admit Case Model Provider For Real Stage 2 status: blocked - source: sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md + source: .sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md owner: jp - id: CTO-WORK-021 title: Case-Compatible Local Provider Adapter Route PRD status: validated - source: sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-PRD.md + source: .sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-PRD.md owner: "" - id: CTO-WORK-022 title: Case-Compatible Local Provider Adapter Route status: blocked - source: sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-ISSUES.md + source: .sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-ISSUES.md owner: jp - id: CTO-WORK-023 title: Case Provider Decision Packet PRD status: validated - source: sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-PRD.md + source: .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-PRD.md owner: "" - id: CTO-WORK-024 title: Resolve Case Provider Decision status: blocked - source: sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-ISSUES.md + source: .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-ISSUES.md owner: jp - id: CTO-WORK-025 title: Current Case Provider Decision Record status: validated - source: sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-RECORD.md + source: .sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-RECORD.md owner: "" diff --git a/sot b/sot new file mode 120000 index 0000000..40d48e5 --- /dev/null +++ b/sot @@ -0,0 +1 @@ +.sot \ No newline at end of file diff --git a/tools/check_s91_cto_dotpath.py b/tools/check_s91_cto_dotpath.py new file mode 100755 index 0000000..4764449 --- /dev/null +++ b/tools/check_s91_cto_dotpath.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +"""Check S91 CTO SOT dotpath migration state.""" + +from __future__ import annotations + +import os +import re +from pathlib import Path + +ROOT = Path(__file__).resolve().parents[1] +REQUIRED_FILES = [ + ".sot/00-START/CTO-WORKSPACE-INTENT.md", + ".sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md", + ".sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-RECORD.md", +] +SCAN_FILES = [ + "AGENTS.md", + "README.md", + "WORKBOARD.yaml", + "tools/validate_cto_child.py", +] + + +def fail(message: str) -> None: + raise SystemExit(f"S91 cto dotpath check failed: {message}") + + +def main() -> int: + if not (ROOT / ".sot").is_dir(): + fail("missing canonical .sot directory") + legacy = ROOT / "sot" + if not legacy.is_symlink(): + fail("legacy sot path must be a temporary symlink") + if os.readlink(legacy) != ".sot": + fail("legacy sot symlink must target .sot") + + for relative in REQUIRED_FILES: + if not (ROOT / relative).is_file(): + fail(f"missing required canonical file: {relative}") + + for relative in SCAN_FILES: + text = (ROOT / relative).read_text(encoding="utf-8") + if re.search(r"(? int: if not path.is_file(): errors.append(f"missing_required_file:{rel}") - brief = ROOT / "sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md" + brief = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md" if brief.is_file(): text = brief.read_text(encoding="utf-8") for phrase in REQUIRED_BRIEF_PHRASES: @@ -631,7 +631,7 @@ def main() -> int: if "core_promotion_status: not-promoted" not in text: errors.append("brief_missing_not_promoted_frontmatter") - prd = ROOT / "sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md" + prd = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-PRD.md" if prd.is_file(): text = prd.read_text(encoding="utf-8") for phrase in REQUIRED_PRD_PHRASES: @@ -645,7 +645,7 @@ def main() -> int: if "core_promotion_status: not-promoted" not in text: errors.append("prd_missing_not_promoted_frontmatter") - issues = ROOT / "sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-ISSUES.md" + issues = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-CANDIDATE-BACKEND-ISSUES.md" if issues.is_file(): text = issues.read_text(encoding="utf-8") if "Local planning SOT only. Not a Core Protocol. Not active Core authority." not in text: @@ -657,7 +657,7 @@ def main() -> int: if issue_id not in text: errors.append(f"missing_issue_id:{issue_id}") - evidence_interface = ROOT / "sot/03-PROTOCOLS/CTO-HARNESS-EVIDENCE-INTERFACE-CONTRACT.md" + evidence_interface = ROOT / ".sot/03-PROTOCOLS/CTO-HARNESS-EVIDENCE-INTERFACE-CONTRACT.md" if evidence_interface.is_file(): text = evidence_interface.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -667,7 +667,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_evidence_interface_phrase:{phrase}") - source_admission = ROOT / "sot/03-PROTOCOLS/CTO-CASE-SOURCE-ADMISSION-RECORD.md" + source_admission = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-SOURCE-ADMISSION-RECORD.md" if source_admission.is_file(): text = source_admission.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -677,7 +677,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_source_admission_phrase:{phrase}") - adapter_contract = ROOT / "sot/03-PROTOCOLS/CTO-CASE-ADAPTER-CONTRACT.md" + adapter_contract = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-ADAPTER-CONTRACT.md" if adapter_contract.is_file(): text = adapter_contract.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -687,7 +687,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_adapter_contract_phrase:{phrase}") - failure_matrix = ROOT / "sot/03-PROTOCOLS/CTO-CASE-FAILURE-FIXTURE-MATRIX.md" + failure_matrix = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-FAILURE-FIXTURE-MATRIX.md" if failure_matrix.is_file(): text = failure_matrix.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -697,7 +697,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_failure_matrix_phrase:{phrase}") - staged_proof = ROOT / "sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md" + staged_proof = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-STAGED-PROOF-GATES.md" if staged_proof.is_file(): text = staged_proof.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -707,7 +707,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_staged_proof_phrase:{phrase}") - stage1_prd = ROOT / "sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md" + stage1_prd = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-PRD.md" if stage1_prd.is_file(): text = stage1_prd.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -717,7 +717,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_stage1_prd_phrase:{phrase}") - stage1_issues = ROOT / "sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-ISSUES.md" + stage1_issues = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-STAGE1-GATED-ENGINE-ISSUES.md" if stage1_issues.is_file(): text = stage1_issues.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -729,7 +729,7 @@ def main() -> int: if issue_id not in text: errors.append(f"missing_stage1_issue_id:{issue_id}") - stage2_prd = ROOT / "sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md" + stage2_prd = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-PRD.md" if stage2_prd.is_file(): text = stage2_prd.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -739,7 +739,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_stage2_prd_phrase:{phrase}") - stage2_issues = ROOT / "sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-ISSUES.md" + stage2_issues = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-STAGE2-ARTIFICIAL-FIXTURE-ISSUES.md" if stage2_issues.is_file(): text = stage2_issues.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -751,7 +751,7 @@ def main() -> int: if issue_id not in text: errors.append(f"missing_stage2_issue_id:{issue_id}") - provider_admission_prd = ROOT / "sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-PRD.md" + provider_admission_prd = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-PRD.md" if provider_admission_prd.is_file(): text = provider_admission_prd.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -761,7 +761,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_provider_admission_prd_phrase:{phrase}") - provider_admission_issues = ROOT / "sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-ISSUES.md" + provider_admission_issues = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-PROVIDER-ADMISSION-ISSUES.md" if provider_admission_issues.is_file(): text = provider_admission_issues.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -773,7 +773,7 @@ def main() -> int: if issue_id not in text: errors.append(f"missing_provider_admission_issue_id:{issue_id}") - provider_build_prd = ROOT / "sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-PRD.md" + provider_build_prd = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-PRD.md" if provider_build_prd.is_file(): text = provider_build_prd.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -783,7 +783,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_provider_build_prd_phrase:{phrase}") - provider_build_issues = ROOT / "sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md" + provider_build_issues = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-PROVIDER-BUILD-ISSUES.md" if provider_build_issues.is_file(): text = provider_build_issues.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -795,7 +795,7 @@ def main() -> int: if issue_id not in text: errors.append(f"missing_provider_build_issue_id:{issue_id}") - model_provider_admission_prd = ROOT / "sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md" + model_provider_admission_prd = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-PRD.md" if model_provider_admission_prd.is_file(): text = model_provider_admission_prd.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -805,7 +805,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_model_provider_admission_prd_phrase:{phrase}") - model_provider_admission_issues = ROOT / "sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md" + model_provider_admission_issues = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-MODEL-PROVIDER-ADMISSION-ISSUES.md" if model_provider_admission_issues.is_file(): text = model_provider_admission_issues.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -821,7 +821,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_model_provider_admission_issue_phrase:{phrase}") - local_provider_route_prd = ROOT / "sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-PRD.md" + local_provider_route_prd = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-PRD.md" if local_provider_route_prd.is_file(): text = local_provider_route_prd.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -831,7 +831,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_local_provider_route_prd_phrase:{phrase}") - local_provider_route_issues = ROOT / "sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-ISSUES.md" + local_provider_route_issues = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-LOCAL-PROVIDER-ROUTE-ISSUES.md" if local_provider_route_issues.is_file(): text = local_provider_route_issues.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -847,7 +847,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_local_provider_route_issue_phrase:{phrase}") - provider_decision_packet_prd = ROOT / "sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-PRD.md" + provider_decision_packet_prd = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-PRD.md" if provider_decision_packet_prd.is_file(): text = provider_decision_packet_prd.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -857,7 +857,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_provider_decision_packet_prd_phrase:{phrase}") - provider_decision_packet_issues = ROOT / "sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-ISSUES.md" + provider_decision_packet_issues = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-PACKET-ISSUES.md" if provider_decision_packet_issues.is_file(): text = provider_decision_packet_issues.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: @@ -873,7 +873,7 @@ def main() -> int: if phrase not in text: errors.append(f"missing_provider_decision_packet_issue_phrase:{phrase}") - provider_decision_record = ROOT / "sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-RECORD.md" + provider_decision_record = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-PROVIDER-DECISION-RECORD.md" if provider_decision_record.is_file(): text = provider_decision_record.read_text(encoding="utf-8") if "core_promotion_status: not-promoted" not in text: