Record Hermes WebUI control panel evidence

This commit is contained in:
Svrnty 2026-06-01 07:35:04 -04:00
parent d2f574802f
commit 163cfabd67
3 changed files with 84 additions and 3 deletions

View File

@ -0,0 +1,54 @@
---
name: CTO Hermes WebUI Control Panel Evidence
status: validated
lifecycle_classification: sot
owner: jp
created: 2026-06-01
last_reviewed: 2026-06-01
core_promotion_status: not-promoted
---
# CTO Hermes WebUI Control Panel Evidence
Local planning SOT only. Not a Core Protocol. Not active Core authority.
## Scope
This evidence closes `CTO-WORK-059`.
The implementation adds a Hermes-owned WebUI consumer panel for CTO Harness proof state. It does not change Cortex Core authority, Case authority, target repository ownership, upstream `hermes-webui`, or upstream `hermes-agent`.
## Implementation Evidence
- Hermes plugin commit: `9c8f345 Add CTO harness control panel`
- Route: `/api/cto/control-summary`
- Route file: `routes/cto_control_summary.py`
- Frontend asset: `cto_control_panel.js`
- Style asset: `cto_control_panel.css`
- Connection map: `CONNECTION-MAP.md is fresh`
## Validation Evidence
- Focused validation before commit: `python3 -m pytest tests/unit/test_cto_control_summary.py tests/evals/test_features.py -q`
- Focused result: `8 passed, 1 skipped`
- Aggregate validation before commit: `python3 scripts/ast-connection-map.py --check`
- Aggregate validation before commit: `python3 -m pytest tests/ -q`
- Aggregate result before commit: `100 passed, 4 skipped`
- Aggregate validation after merge: `python3 scripts/ast-connection-map.py --check`
- Aggregate validation after merge: `python3 -m pytest tests/ -q`
- Aggregate result after merge: `104 passed`
## Governance Evidence
- Harness-backed summary data remains the source of truth.
- Case runtime default active: false
- target repository mutation: false
- upstream `hermes-webui` edited: false
- upstream `hermes-agent` edited: false
- Case remains a candidate backend behind the CTO Harness seam.
- Hermes provides visualization and control only.
- Cortex remains SOT authority.
## Result
`CTO-WORK-059` is validated because Hermes now exposes a read-only CTO control panel over Harness evidence without activating Case, mutating target repositories, or editing upstream vendor source.

View File

@ -293,7 +293,6 @@ items:
owner: "" owner: ""
- id: CTO-WORK-059 - id: CTO-WORK-059
title: Hermes WebUI CTO Harness Control Panel title: Hermes WebUI CTO Harness Control Panel
status: candidate status: validated
source: .sot/03-PROTOCOLS/CTO-HERMES-WEBUI-CONTROL-PANEL-ISSUES.md source: .sot/03-PROTOCOLS/CTO-HERMES-WEBUI-CONTROL-PANEL-ISSUES.md
owner: "" owner: ""

View File

@ -50,6 +50,7 @@ REQUIRED_FILES = [
".sot/03-PROTOCOLS/CTO-HERMES-REAL-REFRESH-CONTROL-REPLAY-EVIDENCE.md", ".sot/03-PROTOCOLS/CTO-HERMES-REAL-REFRESH-CONTROL-REPLAY-EVIDENCE.md",
".sot/03-PROTOCOLS/CTO-HERMES-WEBUI-CONTROL-PANEL-PRD.md", ".sot/03-PROTOCOLS/CTO-HERMES-WEBUI-CONTROL-PANEL-PRD.md",
".sot/03-PROTOCOLS/CTO-HERMES-WEBUI-CONTROL-PANEL-ISSUES.md", ".sot/03-PROTOCOLS/CTO-HERMES-WEBUI-CONTROL-PANEL-ISSUES.md",
".sot/03-PROTOCOLS/CTO-HERMES-WEBUI-CONTROL-PANEL-EVIDENCE.md",
".sot/03-PROTOCOLS/CTO-FIRST-REAL-GOVERNED-WORKFLOW-PRD.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-ISSUES.md",
".sot/03-PROTOCOLS/CTO-FIRST-REAL-GOVERNED-WORKFLOW-APPROVAL-PACKET.md", ".sot/03-PROTOCOLS/CTO-FIRST-REAL-GOVERNED-WORKFLOW-APPROVAL-PACKET.md",
@ -152,6 +153,23 @@ REQUIRED_HERMES_WEBUI_CONTROL_PANEL_PHRASES = [
"Do not activate Case as default backend.", "Do not activate Case as default backend.",
] ]
REQUIRED_HERMES_WEBUI_CONTROL_PANEL_EVIDENCE_PHRASES = [
"Local planning SOT only. Not a Core Protocol. Not active Core authority.",
"CTO-WORK-059",
"9c8f345 Add CTO harness control panel",
"/api/cto/control-summary",
"cto_control_panel.js",
"cto_control_panel.css",
"routes/cto_control_summary.py",
"CONNECTION-MAP.md is fresh",
"104 passed",
"Case runtime default active: false",
"target repository mutation: false",
"upstream `hermes-webui` edited: false",
"upstream `hermes-agent` edited: false",
"Harness-backed summary data remains the source of truth.",
]
REQUIRED_HERMES_REAL_REFRESH_CONTROL_REPLAY_EVIDENCE_PHRASES = [ REQUIRED_HERMES_REAL_REFRESH_CONTROL_REPLAY_EVIDENCE_PHRASES = [
"Local planning SOT only. Not a Core Protocol. Not active Core authority.", "Local planning SOT only. Not a Core Protocol. Not active Core authority.",
"CTO-WORK-057", "CTO-WORK-057",
@ -1165,6 +1183,16 @@ def main() -> int:
if phrase not in text: if phrase not in text:
errors.append(f"missing_hermes_webui_control_panel_issue_phrase:{phrase}") errors.append(f"missing_hermes_webui_control_panel_issue_phrase:{phrase}")
hermes_webui_control_panel_evidence = ROOT / ".sot/03-PROTOCOLS/CTO-HERMES-WEBUI-CONTROL-PANEL-EVIDENCE.md"
if hermes_webui_control_panel_evidence.is_file():
text = hermes_webui_control_panel_evidence.read_text(encoding="utf-8")
if "core_promotion_status: not-promoted" not in text:
errors.append("hermes_webui_control_panel_evidence_missing_not_promoted_frontmatter")
for phrase in REQUIRED_HERMES_WEBUI_CONTROL_PANEL_EVIDENCE_PHRASES:
checked.append(f"hermes_webui_control_panel_evidence_phrase:{phrase}")
if phrase not in text:
errors.append(f"missing_hermes_webui_control_panel_evidence_phrase:{phrase}")
hermes_real_refresh_control_replay_evidence = ROOT / ".sot/03-PROTOCOLS/CTO-HERMES-REAL-REFRESH-CONTROL-REPLAY-EVIDENCE.md" hermes_real_refresh_control_replay_evidence = ROOT / ".sot/03-PROTOCOLS/CTO-HERMES-REAL-REFRESH-CONTROL-REPLAY-EVIDENCE.md"
if hermes_real_refresh_control_replay_evidence.is_file(): if hermes_real_refresh_control_replay_evidence.is_file():
text = hermes_real_refresh_control_replay_evidence.read_text(encoding="utf-8") text = hermes_real_refresh_control_replay_evidence.read_text(encoding="utf-8")
@ -1774,7 +1802,7 @@ def main() -> int:
"CTO-WORK-056": "validated", "CTO-WORK-056": "validated",
"CTO-WORK-057": "validated", "CTO-WORK-057": "validated",
"CTO-WORK-058": "validated", "CTO-WORK-058": "validated",
"CTO-WORK-059": "candidate", "CTO-WORK-059": "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}")