Reject CTO generated cache residue
This commit is contained in:
@@ -73,6 +73,19 @@ Decision: keep the intention with caution.
|
|||||||
|
|
||||||
The useful idea is explicit provider admission and metadata-only retention hygiene. Do not copy secrets, raw transcripts, or provider runtime behavior into CTO. Archive and deletion remain approval-gated.
|
The useful idea is explicit provider admission and metadata-only retention hygiene. Do not copy secrets, raw transcripts, or provider runtime behavior into CTO. Archive and deletion remain approval-gated.
|
||||||
|
|
||||||
|
### Generated Cache Custody
|
||||||
|
|
||||||
|
Reference cluster:
|
||||||
|
|
||||||
|
- ignored `tools/__pycache__/` observed on `2026-06-18`
|
||||||
|
- `/home/svrnty/workspaces/cortex-os-retired/2026-06-18/cto-python-cache-preserved-135154/MANIFEST.md`
|
||||||
|
|
||||||
|
Decision: archive-only custody.
|
||||||
|
|
||||||
|
The useful idea is none; this is generated Python bytecode residue. Keep the
|
||||||
|
manifest reference only. Do not treat cache files as CTO source, evidence,
|
||||||
|
backend state, target-repo state, provider state, or historical intention.
|
||||||
|
|
||||||
### Stage 5 Target Sandbox
|
### Stage 5 Target Sandbox
|
||||||
|
|
||||||
Reference cluster:
|
Reference cluster:
|
||||||
|
|||||||
@@ -5,10 +5,17 @@ from __future__ import annotations
|
|||||||
|
|
||||||
import json
|
import json
|
||||||
import re
|
import re
|
||||||
|
import sys
|
||||||
from pathlib import Path
|
from pathlib import Path
|
||||||
|
|
||||||
|
|
||||||
ROOT = Path(__file__).resolve().parents[1]
|
ROOT = Path(__file__).resolve().parents[1]
|
||||||
|
sys.dont_write_bytecode = True
|
||||||
|
|
||||||
|
GENERATED_ARTIFACT_DIRS = [
|
||||||
|
"tools/__pycache__",
|
||||||
|
".pytest_cache",
|
||||||
|
]
|
||||||
|
|
||||||
REQUIRED_FILES = [
|
REQUIRED_FILES = [
|
||||||
"AGENTS.md",
|
"AGENTS.md",
|
||||||
@@ -180,6 +187,7 @@ REQUIRED_LEGACY_INGEST_PHRASES = [
|
|||||||
"Source Clusters Assessed By Intention",
|
"Source Clusters Assessed By Intention",
|
||||||
"Do not activate Case as default backend.",
|
"Do not activate Case as default backend.",
|
||||||
"Do not mutate target repositories.",
|
"Do not mutate target repositories.",
|
||||||
|
"Generated Cache Custody",
|
||||||
]
|
]
|
||||||
|
|
||||||
REQUIRED_ARCHITECTURE_CLOSEOUT_PRD_PHRASES = [
|
REQUIRED_ARCHITECTURE_CLOSEOUT_PRD_PHRASES = [
|
||||||
@@ -1903,6 +1911,15 @@ def workboard_status(text: str, issue_id: str) -> str | None:
|
|||||||
return match.group(1).strip() if match else None
|
return match.group(1).strip() if match else None
|
||||||
|
|
||||||
|
|
||||||
|
def validate_no_generated_artifact_residue(checked: list[str]) -> list[str]:
|
||||||
|
errors: list[str] = []
|
||||||
|
for relpath in GENERATED_ARTIFACT_DIRS:
|
||||||
|
checked.append(f"generated_artifact_absent:{relpath}")
|
||||||
|
if (ROOT / relpath).exists():
|
||||||
|
errors.append(f"generated_artifact_residue:{relpath}")
|
||||||
|
return errors
|
||||||
|
|
||||||
|
|
||||||
def main() -> int:
|
def main() -> int:
|
||||||
checked: list[str] = []
|
checked: list[str] = []
|
||||||
errors: list[str] = []
|
errors: list[str] = []
|
||||||
@@ -1945,6 +1962,8 @@ def main() -> int:
|
|||||||
if phrase not in text:
|
if phrase not in text:
|
||||||
errors.append(f"missing_legacy_ingest_phrase:{phrase}")
|
errors.append(f"missing_legacy_ingest_phrase:{phrase}")
|
||||||
|
|
||||||
|
errors.extend(validate_no_generated_artifact_residue(checked))
|
||||||
|
|
||||||
brief = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md"
|
brief = ROOT / ".sot/03-PROTOCOLS/CTO-CASE-BACKEND-BRIEF.md"
|
||||||
if brief.is_file():
|
if brief.is_file():
|
||||||
text = brief.read_text(encoding="utf-8")
|
text = brief.read_text(encoding="utf-8")
|
||||||
|
|||||||
Reference in New Issue
Block a user