feat(plan-01): Phase 1 — relocate harness code to packages/casan-harness (symlink facade)

Physically move the pure-code subtrees out of .specify into the package, leaving
compat symlinks at the old .specify/<dir> paths so every existing reference (internal
CASAN_HARNESS_ROOT + external CI/docker/mjs) keeps resolving. Runtime state stays put.

Moved (git mv): scripts/ tests/ security/ templates/ config/ governance/ memory/
  .specify/<dir>  ->  packages/casan-harness/<dir>   (+ .specify/<dir> symlink)
Stays in .specify (state/governance/domain, handled later): logs/ agentops/ level5/
  init-options.json traceability-map.json

Python `.resolve()` self-location followed the compat symlink into packages and lost
the app root; generate-casan-demo-context.py, generate-agentops-dashboard.py and
dashboard-server.py now walk UP for the `.specify` state marker instead of a fixed
parent depth (fixes "missing trace files" in run-casan4).

Full gate: PASS=64 FAIL=0 SKIP=3 (CASAN_CI_STEP_TIMEOUT_SEC=1200 — track-a ~450s runs
close to the 600s default and can tip over under load; this is timing variance, not a
regression — it passed cleanly with headroom). Runtime log/audit artifacts kept unstaged.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
thanhnv
2026-07-08 00:06:00 +09:00
co-authored by Claude Opus 4.8
parent 2c765c9a45
commit 664bd1f00c
229 changed files with 268 additions and 3 deletions
@@ -0,0 +1,113 @@
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
<meta name="color-scheme" content="light">
<title>CASAN Level 4 · AgentOps Dashboard</title>
<style>
:root { color-scheme: light; }
* { box-sizing: border-box; }
body { font-family: -apple-system, "Segoe UI", Arial, sans-serif; margin: 0; padding: 30px 34px 60px; background: #eef1f6; color: #16233a; max-width: 1180px; }
h1 { font-size: 27px; color: #1f3b6e; margin: 0 0 4px; letter-spacing: -.015em; }
.subtitle { color: #5a6b80; font-size: 13px; margin: 0 0 16px; }
h2 { color: #1f3b6e; font-size: 16px; margin: 26px 0 12px; letter-spacing: -.01em; }
.badges { display: flex; flex-wrap: wrap; gap: 9px; margin: 0 0 8px; }
.badge { background: #fff; border: 1px solid #d8dee9; border-radius: 999px; padding: 6px 13px; font-size: 12.5px; font-weight: 700; color: #1f3b6e; }
.badge.lv { background: #eaf6ef; border-color: #bfe0cd; color: #16794f; }
.panel { background: #fff; border: 1px solid #dbe2ec; border-radius: 13px; padding: 18px 20px; box-shadow: 0 1px 2px rgba(16,35,58,.05); }
.grid { display: grid; grid-template-columns: repeat(5, 1fr); gap: 12px; }
.card { background: #fff; border: 1px solid #dbe2ec; border-radius: 11px; padding: 15px 16px; box-shadow: 0 1px 2px rgba(16,35,58,.04); }
.card .k { color: #5a6b80; font-size: 11.5px; font-weight: 600; letter-spacing: .01em; }
.value { font-size: 26px; font-weight: 800; color: #0f766e; margin-top: 5px; }
.hrow { display: grid; grid-template-columns: 165px 1fr 128px; align-items: center; gap: 14px; padding: 6px 0; }
.hlabel { font-size: 13.5px; font-weight: 600; color: #28405c; }
.meter { background: #e6ebf2; border-radius: 6px; height: 13px; overflow: hidden; }
.meter > i { display: block; height: 100%; border-radius: 6px; }
.hscore { font-size: 15px; font-weight: 800; text-align: right; white-space: nowrap; }
.hscore small { font-size: 9.5px; color: #8a94a0; font-weight: 600; }
.hsum { margin-top: 13px; padding-top: 12px; border-top: 1px solid #eef1f6; font-size: 13px; color: #41566f; }
.hsum b { color: #1f3b6e; }
.bandlg { display: flex; flex-wrap: wrap; gap: 14px; margin-top: 9px; font-size: 11.5px; color: #6b7888; }
.bandlg i { width: 11px; height: 11px; border-radius: 3px; display: inline-block; margin-right: 5px; vertical-align: -1px; }
.chips { display: flex; flex-wrap: wrap; gap: 9px; }
.chip { display: inline-flex; align-items: center; gap: 8px; font-size: 12.5px; color: #28405c; background: #f5f8fc; border: 1px solid #dbe4ef; border-radius: 999px; padding: 8px 14px; }
.chip .d { width: 8px; height: 8px; border-radius: 99px; background: #16a34a; flex: none; }
.chip b { color: #0f766e; }
table { border-collapse: collapse; width: 100%; margin-top: 4px; background: #fff; }
td, th { border: 1px solid #e2e8f1; padding: 8px 10px; text-align: left; font-size: 12.5px; color: #16233a; }
th { background: #eef2f8; color: #1f3b6e; font-weight: 700; }
tr:nth-child(even) td { background: #f7f9fc; }
.ok { color: #16a34a; font-weight: 700; }
</style>
</head>
<body>
<h1>CASAN Level 4 Central AgentOps Dashboard</h1>
<p class="subtitle">7-harness security posture · Level-5 controls demonstrated locally · điểm công tâm theo rubric (evidence/scoring-run-report.md) · Generated: 2026-07-07T13:24:27Z</p>
<div class="badges">
<span class="badge lv">CASAN Level 4 — chứng minh bằng tấn công</span>
<span class="badge">Average 80.9/100</span>
<span class="badge">Harness thấp nhất 80</span>
<span class="badge">218 core tests · 0 fail</span>
<span class="badge">Recall model 0.85 &gt; regex 0.00</span>
</div>
<h2>Đánh giá trưởng thành 7 Harness · rubric công tâm (2026-07-05)</h2>
<div class="panel">
<div class="hrow"><span class="hlabel">H1 · Context</span><span class="meter"><i style="width:84%;background:#16a34a"></i></span><span class="hscore" style="color:#16a34a">84<small>/100 · Strong</small></span></div><div class="hrow"><span class="hlabel">H2 · Tool</span><span class="meter"><i style="width:80%;background:#0f766e"></i></span><span class="hscore" style="color:#0f766e">80<small>/100 · Good</small></span></div><div class="hrow"><span class="hlabel">H3 · Evaluation</span><span class="meter"><i style="width:82%;background:#16a34a"></i></span><span class="hscore" style="color:#16a34a">82<small>/100 · Strong</small></span></div><div class="hrow"><span class="hlabel">H4 · Security</span><span class="meter"><i style="width:80%;background:#0f766e"></i></span><span class="hscore" style="color:#0f766e">80<small>/100 · Good</small></span></div><div class="hrow"><span class="hlabel">H5 · Governance</span><span class="meter"><i style="width:80%;background:#0f766e"></i></span><span class="hscore" style="color:#0f766e">80<small>/100 · Good</small></span></div><div class="hrow"><span class="hlabel">H6 · AgentOps</span><span class="meter"><i style="width:80%;background:#0f766e"></i></span><span class="hscore" style="color:#0f766e">80<small>/100 · Good</small></span></div><div class="hrow"><span class="hlabel">H7 · Orchestration</span><span class="meter"><i style="width:80%;background:#0f766e"></i></span><span class="hscore" style="color:#0f766e">80<small>/100 · Good</small></span></div>
<div class="hsum">Average <b>80.9/100</b> · Harness thấp nhất <b>80</b> → <b>CASAN Level 4</b> (chưa lên "Strong/production" — bản production của IdP/WORM-store/HSM/sandbox-isolation còn planned).</div>
<div class="bandlg">
<span><i style="background:#16a34a"></i>Strong 81–100 (production)</span>
<span><i style="background:#0f766e"></i>Good 61–80</span>
<span><i style="background:#d97706"></i>Partial 31–60</span>
<span><i style="background:#dc2626"></i>GAP 0–30</span>
</div>
</div>
<h2>Bảo mật &amp; Governance đã kiểm chứng (test đối kháng thật)</h2>
<div class="panel"><div class="chips">
<span class="chip"><span class="d"></span>Kiểm thử đối kháng <b>218 / 0 fail</b></span>
<span class="chip"><span class="d"></span>H4 recall model <b>0.85</b> &gt; regex 0.00</span>
<span class="chip"><span class="d"></span>Benign FP <b>0.00%</b> · block <b>100.00%</b></span>
<span class="chip"><span class="d"></span>Audit hash-chain + ký KMS (rotate/non-exportable)</span>
<span class="chip"><span class="d"></span>WORM audit ngoài (gap/tamper detected)</span>
<span class="chip"><span class="d"></span>Approval ký-danh-tính (chống giả/replay/tự-duyệt)</span>
<span class="chip"><span class="d"></span>Cost-spike 4 chế độ · drift · hallucination scan</span>
<span class="chip"><span class="d"></span>Alert live: webhook · dead-letter</span>
<span class="chip"><span class="d"></span>Unicode/base64 normalize · tool-output scan</span>
<span class="chip"><span class="d"></span>action / supply-chain / data-exfil gate</span>
</div></div>
<h2>Telemetry trực tiếp (live) · pipeline harness</h2>
<div class="grid">
<div class="card"><div class="k">Total Runs</div><div class="value">0</div></div>
<div class="card"><div class="k">Average Latency</div><div class="value">0.0<small style="font-size:14px"> ms</small></div></div>
<div class="card"><div class="k">Estimated Cost</div><div class="value">$0.000000</div></div>
<div class="card"><div class="k">Failures</div><div class="value">0</div></div>
<div class="card"><div class="k">Fallback Routes</div><div class="value">0</div></div>
</div>
<div class="grid" style="margin-top:12px">
<div class="card"><div class="k">Provider Runs</div><div class="value">0</div></div>
<div class="card"><div class="k">Provider Tokens (thật)</div><div class="value">0</div></div>
<div class="card"><div class="k">Provider Cost</div><div class="value">$0.00000</div></div>
<div class="card"><div class="k">Tool Denials</div><div class="value">0</div></div>
<div class="card"><div class="k">Hallucination Signals</div><div class="value">0</div></div>
</div>
<h2>Governance Signals</h2>
<table>
<tr><th>Signal</th><th>Value</th></tr>
<tr><td>Tool registry denials</td><td>0</td></tr>
<tr><td>Fallback records</td><td>0</td></tr>
<tr><td>Tool registry records</td><td>0</td></tr>
<tr><td>Provider telemetry records</td><td>0</td></tr>
<tr><td>Registered harness projects</td><td>0</td></tr>
</table>
<h2>Recent AgentOps Metrics (live)</h2>
<table>
<tr><th>Trace</th><th>Agent</th><th>Step</th><th>Status</th><th>Latency</th><th>Tokens</th><th>Cost</th></tr>
</table>
</body>
</html>