Add CTO navigation index

This commit is contained in:
Svrnty
2026-06-17 23:26:48 -04:00
parent a173335169
commit de9cd97ba8
3 changed files with 60 additions and 1 deletions
+30
View File
@@ -0,0 +1,30 @@
# CTO Index
Route: `cto`.
Path: `/home/svrnty/workspaces/cortex-os/cto`.
Category: child-local CTO planning workspace for governed execution routing.
Validator: `python3 tools/validate_cto_child.py`.
## Read Order
1. `AGENTS.md` for the universal and repo-custom agent contract.
2. `README.md` for route posture, boundaries, and current stage.
3. `docs/LEGACY-INGEST.md` for old-work intention distillation.
4. `.sot/03-PROTOCOLS/` only for the specific planning or evidence packet needed.
5. `WORKBOARD.yaml` for child-local work state.
## Local Authority
CTO owns child-local execution-routing planning, adapter design, transportability briefs, staged proof gates, target-repo admission templates, approval packets, evidence interface contracts, and validation scaffolds.
CTO is not Core authority, Runtime authority, Host Runtime authority, backend ownership, vendor-source authority, external developer repo authority, execution-backend authority, provider authority, target-repo mutation authority, Profile Exposure authority, release authority, production-readiness authority, or product-readiness authority.
## Legacy Relation
Old CTO planning, Case/Hermes/Pi/Codex/backend, provider, retention, and target-sandbox work is admitted by intention only. Do not activate Case as default backend, mutate target repositories, mutate vendor source, call providers, read secrets, rerun Harness/Case, mutate Core/Seed/sibling/OpenDesign, archive/delete, publish, deploy, release, or import implementation mass because it exists.
## Completion State
Stage: CLEAN.
Clean score: 100.
Current next pass: keep CTO navigable as planning-only; new execution requires explicit governed admission, approval, and fresh evidence.
+5
View File
@@ -511,3 +511,8 @@ items:
status: validated status: validated
source: AGENTS.md source: AGENTS.md
owner: "" owner: ""
- id: CTO-WORK-103
title: CTO Navigation Index
status: validated
source: INDEX.md
owner: ""
+25 -1
View File
@@ -13,6 +13,7 @@ ROOT = Path(__file__).resolve().parents[1]
REQUIRED_FILES = [ REQUIRED_FILES = [
"AGENTS.md", "AGENTS.md",
"README.md", "README.md",
"INDEX.md",
"WORKBOARD.yaml", "WORKBOARD.yaml",
"CONTEXT.md", "CONTEXT.md",
"docs/LEGACY-INGEST.md", "docs/LEGACY-INGEST.md",
@@ -139,6 +140,16 @@ README_CONTRACT_SNIPPETS = [
"permission to activate Case, mutate target repos, call providers, read secrets, publish, deploy, or release", "permission to activate Case, mutate target repos, call providers, read secrets, publish, deploy, or release",
] ]
INDEX_CONTRACT_SNIPPETS = [
"Route: `cto`.",
"Category: child-local CTO planning workspace for governed execution routing.",
"CTO owns child-local execution-routing planning",
"CTO is not Core authority, Runtime authority, Host Runtime authority",
"Do not activate Case as default backend, mutate target repositories",
"Stage: CLEAN.",
"Clean score: 100.",
]
REQUIRED_BRIEF_PHRASES = [ REQUIRED_BRIEF_PHRASES = [
"Cortex governs.", "Cortex governs.",
"Hermes controls.", "Hermes controls.",
@@ -1902,6 +1913,14 @@ def main() -> int:
if snippet not in text: if snippet not in text:
errors.append(f"missing_readme_contract_snippet:{snippet}") errors.append(f"missing_readme_contract_snippet:{snippet}")
index = ROOT / "INDEX.md"
if index.is_file():
text = index.read_text(encoding="utf-8")
for snippet in INDEX_CONTRACT_SNIPPETS:
checked.append(f"index_contract_snippet:{snippet}")
if snippet not in text:
errors.append(f"missing_index_contract_snippet:{snippet}")
legacy_ingest = ROOT / "docs/LEGACY-INGEST.md" legacy_ingest = ROOT / "docs/LEGACY-INGEST.md"
if legacy_ingest.is_file(): if legacy_ingest.is_file():
text = legacy_ingest.read_text(encoding="utf-8") text = legacy_ingest.read_text(encoding="utf-8")
@@ -3121,7 +3140,7 @@ def main() -> int:
checked.append(f"workboard_id:{issue_id}") checked.append(f"workboard_id:{issue_id}")
if issue_id not in text: if issue_id not in text:
errors.append(f"missing_workboard_id:{issue_id}") errors.append(f"missing_workboard_id:{issue_id}")
for issue_id in ["CTO-WORK-098", "CTO-WORK-099", "CTO-WORK-100", "CTO-WORK-101", "CTO-WORK-102"]: for issue_id in ["CTO-WORK-098", "CTO-WORK-099", "CTO-WORK-100", "CTO-WORK-101", "CTO-WORK-102", "CTO-WORK-103"]:
checked.append(f"workboard_id:{issue_id}") checked.append(f"workboard_id:{issue_id}")
if issue_id not in text: if issue_id not in text:
errors.append(f"missing_workboard_id:{issue_id}") errors.append(f"missing_workboard_id:{issue_id}")
@@ -3225,6 +3244,7 @@ def main() -> int:
"CTO-WORK-100": "validated", "CTO-WORK-100": "validated",
"CTO-WORK-101": "validated", "CTO-WORK-101": "validated",
"CTO-WORK-102": "validated", "CTO-WORK-102": "validated",
"CTO-WORK-103": "validated",
} }
for issue_id, expected in expected_statuses.items(): for issue_id, expected in expected_statuses.items():
checked.append(f"workboard_status:{issue_id}:{expected}") checked.append(f"workboard_status:{issue_id}:{expected}")
@@ -3335,6 +3355,10 @@ def main() -> int:
errors.append("workboard_missing_agent_contract_title") errors.append("workboard_missing_agent_contract_title")
if "source: AGENTS.md" not in text: if "source: AGENTS.md" not in text:
errors.append("workboard_missing_agent_contract_source") errors.append("workboard_missing_agent_contract_source")
if "CTO Navigation Index" not in text:
errors.append("workboard_missing_navigation_index_title")
if "source: INDEX.md" not in text:
errors.append("workboard_missing_navigation_index_source")
payload = { payload = {
"ok": not errors, "ok": not errors,