Add world-class readiness to overview report

This commit is contained in:
yaojingang
2026-06-15 18:31:29 +08:00
parent f3e7831a3b
commit c6584482c6
9 changed files with 801 additions and 4 deletions
@@ -545,6 +545,122 @@
font-size: 12px;
}
td:first-child, th:first-child { width: 96px; }
.world-readiness {
margin-top: 16px;
display: grid;
gap: 16px;
}
.section-head > .world-readiness {
grid-column: 2;
}
.world-readiness-head {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 16px;
align-items: start;
}
.world-readiness-head p {
margin-top: 8px;
max-width: 72ch;
}
.world-status {
display: inline-flex;
align-items: center;
min-height: 30px;
padding: 4px 10px;
border-radius: 6px;
background: var(--brand-soft);
color: var(--brand);
font-size: 13px;
white-space: nowrap;
}
.evidence-kpis {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.evidence-kpi {
padding: 14px;
border: 1px solid var(--line-soft);
border-radius: 8px;
background: var(--wash);
min-width: 0;
}
.evidence-kpi span {
display: block;
color: var(--muted);
font-size: 12px;
}
.evidence-kpi strong {
display: block;
margin-top: 4px;
color: var(--brand);
font-family: var(--mono);
font-size: 1.5rem;
font-weight: 500;
line-height: 1;
font-variant-numeric: tabular-nums;
}
.evidence-kpi small {
display: block;
margin-top: 8px;
color: var(--muted);
line-height: 1.45;
overflow-wrap: break-word;
}
.evidence-list {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.evidence-item {
padding: 14px;
border: 1px solid var(--line-soft);
border-radius: 8px;
background: #ffffff;
min-width: 0;
}
.evidence-item span {
color: var(--brand);
font-family: var(--mono);
font-size: 11px;
text-transform: uppercase;
}
.evidence-item h4 {
margin: 4px 0 8px;
color: var(--ink);
font-size: 1rem;
font-weight: 500;
line-height: 1.3;
}
.evidence-item h5 {
margin: 12px 0 6px;
color: var(--brand);
font-size: 12px;
font-weight: 500;
}
.evidence-item p {
margin: 0;
max-width: none;
color: var(--muted);
overflow-wrap: break-word;
}
.blocked-checks {
margin: 0;
padding-left: 1.05em;
color: var(--muted);
font-size: 13px;
line-height: 1.45;
}
.blocked-checks li {
overflow-wrap: break-word;
}
.blocked-checks li::marker {
color: var(--brand);
}
.blocked-checks-empty {
font-size: 13px;
}
.roadmap {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
@@ -575,9 +691,11 @@
.report-mark { display: none; }
.report-nav a { min-width: 72px; }
.hero-grid, .section-head { grid-template-columns: 1fr; }
.section-head > .world-readiness { grid-column: auto; }
.hero-grid { gap: 24px; }
.score-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.metrics-primary, .two-col, .metric-grid, .chart-grid, .roadmap { grid-template-columns: 1fr; }
.evidence-list { grid-template-columns: 1fr; }
.metric-card { grid-template-columns: 86px minmax(0, 1fr); }
h1 { font-size: 2.75rem; }
}
@@ -602,6 +720,7 @@
.score-strip { grid-template-columns: 1fr; }
section { margin-top: 34px; padding-top: 34px; }
.panel, .metric-card, .roadmap-item, .chart-figure, .hero-card { padding: 18px; }
.world-readiness-head, .evidence-kpis { grid-template-columns: 1fr; }
.metric-card { grid-template-columns: 1fr; gap: 10px; }
.metric-card strong { margin-bottom: 2px; }
.metric-summary-list li { grid-template-columns: auto minmax(0, 1fr) auto; }
@@ -797,6 +916,7 @@
</table>
</div>
</div>
<article class='panel world-readiness'><div class='world-readiness-head'><div><h3><span data-lang="zh-CN">世界证据</span><span data-lang="en">World Evidence</span></h3><p><span data-lang="zh-CN">未生成 world-class ledger;当前报告不会宣称世界级完成。</span><span data-lang="en">No world-class ledger was generated; this report does not claim world-class completion.</span></p></div><span class='world-status'><span data-lang="zh-CN">证据待补</span><span data-lang="en">Evidence pending</span></span></div><div class='evidence-kpis'><article class='evidence-kpi'><span><span data-lang="zh-CN">待补证据</span><span data-lang="en">Pending</span></span><strong>0</strong><small><span data-lang="zh-CN">仍需外部或人工证据接受。</span><span data-lang="en">External or human evidence still needs acceptance.</span></small></article><article class='evidence-kpi'><span><span data-lang="zh-CN">已接受</span><span data-lang="en">Accepted</span></span><strong>0</strong><small><span data-lang="zh-CN">已通过 source check 与提交契约。</span><span data-lang="en">Passed source checks and submission contract.</span></small></article><article class='evidence-kpi'><span><span data-lang="zh-CN">源检查</span><span data-lang="en">Source Checks</span></span><strong>0 / 0</strong><small><span data-lang="zh-CN">通过数 / 总检查数。</span><span data-lang="en">Passed checks / total checks.</span></small></article></div><div class='evidence-list'><article class='evidence-item empty'><p><span data-lang="zh-CN">尚未生成 world-class ledger;这里只保留反过度承诺提示。</span><span data-lang="en">No world-class ledger has been generated; this panel keeps the anti-overclaim guard visible.</span></p></article></div></article>
</div>
</section>
@@ -397,6 +397,20 @@
"Do not silently broaden the skill into adjacent jobs just because the examples are nearby."
]
},
"world_class_readiness": {
"ready": false,
"decision": "not-generated",
"entry_count": 0,
"pending_count": 0,
"accepted_count": 0,
"external_pending_count": 0,
"human_pending_count": 0,
"source_check_count": 0,
"source_pass_count": 0,
"conclusion_zh": "未生成 world-class ledger;当前报告不会宣称世界级完成。",
"conclusion_en": "No world-class ledger was generated; this report does not claim world-class completion.",
"entries": []
},
"package_assets": {
"entries": [
{
+78 -4
View File
@@ -402,6 +402,80 @@
"Do not silently broaden the skill into adjacent jobs just because the examples are nearby."
]
},
"world_class_readiness": {
"ready": false,
"decision": "evidence-pending",
"entry_count": 4,
"pending_count": 4,
"accepted_count": 0,
"external_pending_count": 3,
"human_pending_count": 1,
"source_check_count": 13,
"source_pass_count": 6,
"conclusion_zh": "世界级证据尚未完成:4 项待补,0 项已接受。",
"conclusion_en": "World-class evidence is not complete: 4 pending, 0 accepted.",
"entries": [
{
"key": "provider-holdout",
"label_zh": "提供商留出",
"label_en": "Provider Holdout",
"category": "external",
"category_zh": "外部证据",
"category_en": "External evidence",
"status": "pending",
"summary_zh": "缺少真实 provider 模型运行和 token metadata。",
"summary_en": "Missing a real provider model run and token metadata.",
"blocked_checks": [
"Provider model run",
"Token usage observed"
]
},
{
"key": "human-adjudication",
"label_zh": "人工盲评",
"label_en": "Human Adjudication",
"category": "human",
"category_zh": "人工证据",
"category_en": "Human evidence",
"status": "pending",
"summary_zh": "盲评 pair 仍待真实 reviewer 决策。",
"summary_en": "Blind-review pairs still need real reviewer decisions.",
"blocked_checks": [
"No pending decisions",
"Judgments complete"
]
},
{
"key": "native-permission-enforcement",
"label_zh": "原生权限",
"label_en": "Native Permission",
"category": "external",
"category_zh": "外部证据",
"category_en": "External evidence",
"status": "pending",
"summary_zh": "原生 runtime enforcement 仍待目标客户端或外部安装器证明。",
"summary_en": "Native runtime enforcement still needs target-client or external-installer proof.",
"blocked_checks": [
"Native enforcement"
]
},
{
"key": "native-client-telemetry",
"label_zh": "原生遥测",
"label_en": "Native Telemetry",
"category": "external",
"category_zh": "外部证据",
"category_en": "External evidence",
"status": "pending",
"summary_zh": "真实外部客户端 metadata-only 事件仍未导入。",
"summary_en": "Real external-client metadata-only events have not been imported yet.",
"blocked_checks": [
"External events",
"Adoption sample"
]
}
]
},
"package_assets": {
"entries": [
{
@@ -438,7 +512,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 99
"file_count": 101
},
{
"path": "evals",
@@ -453,7 +527,7 @@
"file_count": 207
}
],
"file_count": 370,
"file_count": 372,
"folder_count": 4,
"distribution": [
{
@@ -478,7 +552,7 @@
},
{
"label": "scripts",
"value": 99
"value": 101
},
{
"label": "evals",
@@ -607,7 +681,7 @@
"path": "scripts",
"label": "Deterministic helpers or local tooling",
"kind": "folder",
"file_count": 99
"file_count": 101
},
{
"path": "evals",
+120
View File
@@ -545,6 +545,122 @@
font-size: 12px;
}
td:first-child, th:first-child { width: 96px; }
.world-readiness {
margin-top: 16px;
display: grid;
gap: 16px;
}
.section-head > .world-readiness {
grid-column: 2;
}
.world-readiness-head {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 16px;
align-items: start;
}
.world-readiness-head p {
margin-top: 8px;
max-width: 72ch;
}
.world-status {
display: inline-flex;
align-items: center;
min-height: 30px;
padding: 4px 10px;
border-radius: 6px;
background: var(--brand-soft);
color: var(--brand);
font-size: 13px;
white-space: nowrap;
}
.evidence-kpis {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.evidence-kpi {
padding: 14px;
border: 1px solid var(--line-soft);
border-radius: 8px;
background: var(--wash);
min-width: 0;
}
.evidence-kpi span {
display: block;
color: var(--muted);
font-size: 12px;
}
.evidence-kpi strong {
display: block;
margin-top: 4px;
color: var(--brand);
font-family: var(--mono);
font-size: 1.5rem;
font-weight: 500;
line-height: 1;
font-variant-numeric: tabular-nums;
}
.evidence-kpi small {
display: block;
margin-top: 8px;
color: var(--muted);
line-height: 1.45;
overflow-wrap: break-word;
}
.evidence-list {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.evidence-item {
padding: 14px;
border: 1px solid var(--line-soft);
border-radius: 8px;
background: #ffffff;
min-width: 0;
}
.evidence-item span {
color: var(--brand);
font-family: var(--mono);
font-size: 11px;
text-transform: uppercase;
}
.evidence-item h4 {
margin: 4px 0 8px;
color: var(--ink);
font-size: 1rem;
font-weight: 500;
line-height: 1.3;
}
.evidence-item h5 {
margin: 12px 0 6px;
color: var(--brand);
font-size: 12px;
font-weight: 500;
}
.evidence-item p {
margin: 0;
max-width: none;
color: var(--muted);
overflow-wrap: break-word;
}
.blocked-checks {
margin: 0;
padding-left: 1.05em;
color: var(--muted);
font-size: 13px;
line-height: 1.45;
}
.blocked-checks li {
overflow-wrap: break-word;
}
.blocked-checks li::marker {
color: var(--brand);
}
.blocked-checks-empty {
font-size: 13px;
}
.roadmap {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
@@ -575,9 +691,11 @@
.report-mark { display: none; }
.report-nav a { min-width: 72px; }
.hero-grid, .section-head { grid-template-columns: 1fr; }
.section-head > .world-readiness { grid-column: auto; }
.hero-grid { gap: 24px; }
.score-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.metrics-primary, .two-col, .metric-grid, .chart-grid, .roadmap { grid-template-columns: 1fr; }
.evidence-list { grid-template-columns: 1fr; }
.metric-card { grid-template-columns: 86px minmax(0, 1fr); }
h1 { font-size: 2.75rem; }
}
@@ -602,6 +720,7 @@
.score-strip { grid-template-columns: 1fr; }
section { margin-top: 34px; padding-top: 34px; }
.panel, .metric-card, .roadmap-item, .chart-figure, .hero-card { padding: 18px; }
.world-readiness-head, .evidence-kpis { grid-template-columns: 1fr; }
.metric-card { grid-template-columns: 1fr; gap: 10px; }
.metric-card strong { margin-bottom: 2px; }
.metric-summary-list li { grid-template-columns: auto minmax(0, 1fr) auto; }
@@ -797,6 +916,7 @@
</table>
</div>
</div>
<article class='panel world-readiness'><div class='world-readiness-head'><div><h3><span data-lang="zh-CN">世界证据</span><span data-lang="en">World Evidence</span></h3><p><span data-lang="zh-CN">世界级证据尚未完成:4 项待补,0 项已接受。</span><span data-lang="en">World-class evidence is not complete: 4 pending, 0 accepted.</span></p></div><span class='world-status'><span data-lang="zh-CN">证据待补</span><span data-lang="en">Evidence pending</span></span></div><div class='evidence-kpis'><article class='evidence-kpi'><span><span data-lang="zh-CN">待补证据</span><span data-lang="en">Pending</span></span><strong>4</strong><small><span data-lang="zh-CN">仍需外部或人工证据接受。</span><span data-lang="en">External or human evidence still needs acceptance.</span></small></article><article class='evidence-kpi'><span><span data-lang="zh-CN">已接受</span><span data-lang="en">Accepted</span></span><strong>0</strong><small><span data-lang="zh-CN">已通过 source check 与提交契约。</span><span data-lang="en">Passed source checks and submission contract.</span></small></article><article class='evidence-kpi'><span><span data-lang="zh-CN">源检查</span><span data-lang="en">Source Checks</span></span><strong>6 / 13</strong><small><span data-lang="zh-CN">通过数 / 总检查数。</span><span data-lang="en">Passed checks / total checks.</span></small></article></div><div class='evidence-list'><article class='evidence-item'><div><span><span data-lang="zh-CN">外部证据</span><span data-lang="en">External evidence</span></span><h4><span data-lang="zh-CN">提供商留出</span><span data-lang="en">Provider Holdout</span></h4></div><p><span data-lang="zh-CN">缺少真实 provider 模型运行和 token metadata。</span><span data-lang="en">Missing a real provider model run and token metadata.</span></p><h5><span data-lang="zh-CN">阻塞检查</span><span data-lang="en">Blocked Checks</span></h5><ul class='blocked-checks'><li><span data-lang="zh-CN">提供商实跑</span><span data-lang="en">Provider model run</span></li><li><span data-lang="zh-CN">Token 用量</span><span data-lang="en">Token usage observed</span></li></ul></article><article class='evidence-item'><div><span><span data-lang="zh-CN">人工证据</span><span data-lang="en">Human evidence</span></span><h4><span data-lang="zh-CN">人工盲评</span><span data-lang="en">Human Adjudication</span></h4></div><p><span data-lang="zh-CN">盲评 pair 仍待真实 reviewer 决策。</span><span data-lang="en">Blind-review pairs still need real reviewer decisions.</span></p><h5><span data-lang="zh-CN">阻塞检查</span><span data-lang="en">Blocked Checks</span></h5><ul class='blocked-checks'><li><span data-lang="zh-CN">无待判定</span><span data-lang="en">No pending decisions</span></li><li><span data-lang="zh-CN">盲评完成</span><span data-lang="en">Judgments complete</span></li></ul></article><article class='evidence-item'><div><span><span data-lang="zh-CN">外部证据</span><span data-lang="en">External evidence</span></span><h4><span data-lang="zh-CN">原生权限</span><span data-lang="en">Native Permission</span></h4></div><p><span data-lang="zh-CN">原生 runtime enforcement 仍待目标客户端或外部安装器证明。</span><span data-lang="en">Native runtime enforcement still needs target-client or external-installer proof.</span></p><h5><span data-lang="zh-CN">阻塞检查</span><span data-lang="en">Blocked Checks</span></h5><ul class='blocked-checks'><li><span data-lang="zh-CN">原生执行</span><span data-lang="en">Native enforcement</span></li></ul></article><article class='evidence-item'><div><span><span data-lang="zh-CN">外部证据</span><span data-lang="en">External evidence</span></span><h4><span data-lang="zh-CN">原生遥测</span><span data-lang="en">Native Telemetry</span></h4></div><p><span data-lang="zh-CN">真实外部客户端 metadata-only 事件仍未导入。</span><span data-lang="en">Real external-client metadata-only events have not been imported yet.</span></p><h5><span data-lang="zh-CN">阻塞检查</span><span data-lang="en">Blocked Checks</span></h5><ul class='blocked-checks'><li><span data-lang="zh-CN">外部事件</span><span data-lang="en">External events</span></li><li><span data-lang="zh-CN">采用样本</span><span data-lang="en">Adoption sample</span></li></ul></article></div></article>
</div>
</section>
+74
View File
@@ -401,6 +401,80 @@
"Do not silently broaden the skill into adjacent jobs just because the examples are nearby."
]
},
"world_class_readiness": {
"ready": false,
"decision": "evidence-pending",
"entry_count": 4,
"pending_count": 4,
"accepted_count": 0,
"external_pending_count": 3,
"human_pending_count": 1,
"source_check_count": 13,
"source_pass_count": 6,
"conclusion_zh": "世界级证据尚未完成:4 项待补,0 项已接受。",
"conclusion_en": "World-class evidence is not complete: 4 pending, 0 accepted.",
"entries": [
{
"key": "provider-holdout",
"label_zh": "提供商留出",
"label_en": "Provider Holdout",
"category": "external",
"category_zh": "外部证据",
"category_en": "External evidence",
"status": "pending",
"summary_zh": "缺少真实 provider 模型运行和 token metadata。",
"summary_en": "Missing a real provider model run and token metadata.",
"blocked_checks": [
"Provider model run",
"Token usage observed"
]
},
{
"key": "human-adjudication",
"label_zh": "人工盲评",
"label_en": "Human Adjudication",
"category": "human",
"category_zh": "人工证据",
"category_en": "Human evidence",
"status": "pending",
"summary_zh": "盲评 pair 仍待真实 reviewer 决策。",
"summary_en": "Blind-review pairs still need real reviewer decisions.",
"blocked_checks": [
"No pending decisions",
"Judgments complete"
]
},
{
"key": "native-permission-enforcement",
"label_zh": "原生权限",
"label_en": "Native Permission",
"category": "external",
"category_zh": "外部证据",
"category_en": "External evidence",
"status": "pending",
"summary_zh": "原生 runtime enforcement 仍待目标客户端或外部安装器证明。",
"summary_en": "Native runtime enforcement still needs target-client or external-installer proof.",
"blocked_checks": [
"Native enforcement"
]
},
{
"key": "native-client-telemetry",
"label_zh": "原生遥测",
"label_en": "Native Telemetry",
"category": "external",
"category_zh": "外部证据",
"category_en": "External evidence",
"status": "pending",
"summary_zh": "真实外部客户端 metadata-only 事件仍未导入。",
"summary_en": "Real external-client metadata-only events have not been imported yet.",
"blocked_checks": [
"External events",
"Adoption sample"
]
}
]
},
"package_assets": {
"entries": [
{
+114
View File
@@ -88,6 +88,118 @@ def render_audit_rows(items: list[dict]) -> str:
return "".join(rows)
WORLD_CLASS_CHECK_COPY = {
"Provider model run": ("提供商实跑", "Provider model run"),
"Token usage observed": ("Token 用量", "Token usage observed"),
"No pending decisions": ("无待判定", "No pending decisions"),
"Judgments complete": ("盲评完成", "Judgments complete"),
"Native enforcement": ("原生执行", "Native enforcement"),
"External events": ("外部事件", "External events"),
"Adoption sample": ("采用样本", "Adoption sample"),
}
def render_world_class_check(check: object) -> str:
if isinstance(check, dict):
label_en = str(check.get("label_en") or check.get("label") or "")
label_zh = str(check.get("label_zh") or "")
else:
label_en = str(check)
label_zh = ""
label_zh, label_en = WORLD_CLASS_CHECK_COPY.get(label_en, (label_zh or label_en, label_en))
return f"<li>{bi_span(label_zh, label_en)}</li>"
def render_world_class_readiness(readiness: dict) -> str:
if not readiness:
return ""
kpis = [
(
"待补证据",
"Pending",
readiness.get("pending_count", 0),
"仍需外部或人工证据接受。",
"External or human evidence still needs acceptance.",
),
(
"已接受",
"Accepted",
readiness.get("accepted_count", 0),
"已通过 source check 与提交契约。",
"Passed source checks and submission contract.",
),
(
"源检查",
"Source Checks",
f"{readiness.get('source_pass_count', 0)} / {readiness.get('source_check_count', 0)}",
"通过数 / 总检查数。",
"Passed checks / total checks.",
),
]
kpi_html = "".join(
"<article class='evidence-kpi'>"
f"<span>{bi_span(zh, en)}</span>"
f"<strong>{html.escape(str(value))}</strong>"
f"<small>{bi_span(note_zh, note_en)}</small>"
"</article>"
for zh, en, value, note_zh, note_en in kpis
)
entries = readiness.get("entries", [])
if entries:
blocks = []
for item in entries:
blocked_checks = [
str(check).strip()
for check in item.get("blocked_checks", [])
if str(check).strip()
]
if blocked_checks:
checks_html = (
"<ul class='blocked-checks'>"
+ "".join(render_world_class_check(check) for check in blocked_checks)
+ "</ul>"
)
else:
checks_html = (
"<p class='blocked-checks-empty'>"
f"{bi_span('当前没有阻塞检查。', 'No blocked checks right now.')}"
"</p>"
)
blocks.append(
"<article class='evidence-item'>"
"<div>"
f"<span>{bi_span(str(item.get('category_zh', '外部证据')), str(item.get('category_en', 'External evidence')))}</span>"
f"<h4>{bi_span(str(item.get('label_zh', item.get('key', '证据项'))), str(item.get('label_en', item.get('key', 'Evidence item'))))}</h4>"
"</div>"
f"<p>{bi_span(str(item.get('summary_zh', '仍待补充证据。')), str(item.get('summary_en', 'Evidence is still pending.')))}</p>"
f"<h5>{bi_span('阻塞检查', 'Blocked Checks')}</h5>"
f"{checks_html}"
"</article>"
)
entry_html = "".join(blocks)
else:
entry_html = (
"<article class='evidence-item empty'>"
f"<p>{bi_span('尚未生成 world-class ledger;这里只保留反过度承诺提示。', 'No world-class ledger has been generated; this panel keeps the anti-overclaim guard visible.')}</p>"
"</article>"
)
status = "可宣称" if readiness.get("ready") else "证据待补"
status_en = "Claim-ready" if readiness.get("ready") else "Evidence pending"
return (
"<article class='panel world-readiness'>"
"<div class='world-readiness-head'>"
"<div>"
f"<h3>{bi_span('世界证据', 'World Evidence')}</h3>"
f"<p>{bi_span(str(readiness.get('conclusion_zh', '世界级证据状态未知。')), str(readiness.get('conclusion_en', 'World-class evidence status is unknown.')))}</p>"
"</div>"
f"<span class='world-status'>{bi_span(status, status_en)}</span>"
"</div>"
f"<div class='evidence-kpis'>{kpi_html}</div>"
f"<div class='evidence-list'>{entry_html}</div>"
"</article>"
)
def render_score_strip(scorecard: dict) -> str:
keys = ["completeness_score", "trigger_score", "evidence_score", "context_cost"]
cards = []
@@ -135,6 +247,7 @@ def render_html(summary: dict) -> str:
contract = summary.get("contract_boundary", {})
quality = summary.get("quality_review", {})
risk = summary.get("risk_governance", {})
world_readiness = summary.get("world_class_readiness", {})
assets = summary.get("package_assets", {})
roadmap = summary.get("iteration_roadmap", {})
output_execution = summary.get("output_execution", {})
@@ -385,6 +498,7 @@ def render_html(summary: dict) -> str:
</table>
</div>
</div>
{render_world_class_readiness(world_readiness)}
</div>
</section>
+119
View File
@@ -574,6 +574,122 @@ def skill_overview_css() -> str:
font-size: 12px;
}
td:first-child, th:first-child { width: 96px; }
.world-readiness {
margin-top: 16px;
display: grid;
gap: 16px;
}
.section-head > .world-readiness {
grid-column: 2;
}
.world-readiness-head {
display: grid;
grid-template-columns: minmax(0, 1fr) auto;
gap: 16px;
align-items: start;
}
.world-readiness-head p {
margin-top: 8px;
max-width: 72ch;
}
.world-status {
display: inline-flex;
align-items: center;
min-height: 30px;
padding: 4px 10px;
border-radius: 6px;
background: var(--brand-soft);
color: var(--brand);
font-size: 13px;
white-space: nowrap;
}
.evidence-kpis {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
gap: 10px;
}
.evidence-kpi {
padding: 14px;
border: 1px solid var(--line-soft);
border-radius: 8px;
background: var(--wash);
min-width: 0;
}
.evidence-kpi span {
display: block;
color: var(--muted);
font-size: 12px;
}
.evidence-kpi strong {
display: block;
margin-top: 4px;
color: var(--brand);
font-family: var(--mono);
font-size: 1.5rem;
font-weight: 500;
line-height: 1;
font-variant-numeric: tabular-nums;
}
.evidence-kpi small {
display: block;
margin-top: 8px;
color: var(--muted);
line-height: 1.45;
overflow-wrap: break-word;
}
.evidence-list {
display: grid;
grid-template-columns: repeat(2, minmax(0, 1fr));
gap: 10px;
}
.evidence-item {
padding: 14px;
border: 1px solid var(--line-soft);
border-radius: 8px;
background: #ffffff;
min-width: 0;
}
.evidence-item span {
color: var(--brand);
font-family: var(--mono);
font-size: 11px;
text-transform: uppercase;
}
.evidence-item h4 {
margin: 4px 0 8px;
color: var(--ink);
font-size: 1rem;
font-weight: 500;
line-height: 1.3;
}
.evidence-item h5 {
margin: 12px 0 6px;
color: var(--brand);
font-size: 12px;
font-weight: 500;
}
.evidence-item p {
margin: 0;
max-width: none;
color: var(--muted);
overflow-wrap: break-word;
}
.blocked-checks {
margin: 0;
padding-left: 1.05em;
color: var(--muted);
font-size: 13px;
line-height: 1.45;
}
.blocked-checks li {
overflow-wrap: break-word;
}
.blocked-checks li::marker {
color: var(--brand);
}
.blocked-checks-empty {
font-size: 13px;
}
.roadmap {
display: grid;
grid-template-columns: repeat(3, minmax(0, 1fr));
@@ -604,9 +720,11 @@ def skill_overview_css() -> str:
.report-mark { display: none; }
.report-nav a { min-width: 72px; }
.hero-grid, .section-head { grid-template-columns: 1fr; }
.section-head > .world-readiness { grid-column: auto; }
.hero-grid { gap: 24px; }
.score-strip { grid-template-columns: repeat(2, minmax(0, 1fr)); }
.metrics-primary, .two-col, .metric-grid, .chart-grid, .roadmap { grid-template-columns: 1fr; }
.evidence-list { grid-template-columns: 1fr; }
.metric-card { grid-template-columns: 86px minmax(0, 1fr); }
h1 { font-size: 2.75rem; }
}
@@ -631,6 +749,7 @@ def skill_overview_css() -> str:
.score-strip { grid-template-columns: 1fr; }
section { margin-top: 34px; padding-top: 34px; }
.panel, .metric-card, .roadmap-item, .chart-figure, .hero-card { padding: 18px; }
.world-readiness-head, .evidence-kpis { grid-template-columns: 1fr; }
.metric-card { grid-template-columns: 1fr; gap: 10px; }
.metric-card strong { margin-bottom: 2px; }
.metric-summary-list li { grid-template-columns: auto minmax(0, 1fr) auto; }
+96
View File
@@ -460,6 +460,101 @@ def package_assets(package_map: list[dict]) -> dict:
}
WORLD_CLASS_ENTRY_COPY = {
"provider-holdout": {
"label_zh": "提供商留出",
"label_en": "Provider Holdout",
"summary_zh": "缺少真实 provider 模型运行和 token metadata。",
"summary_en": "Missing a real provider model run and token metadata.",
},
"human-adjudication": {
"label_zh": "人工盲评",
"label_en": "Human Adjudication",
"summary_zh": "盲评 pair 仍待真实 reviewer 决策。",
"summary_en": "Blind-review pairs still need real reviewer decisions.",
},
"native-permission-enforcement": {
"label_zh": "原生权限",
"label_en": "Native Permission",
"summary_zh": "原生 runtime enforcement 仍待目标客户端或外部安装器证明。",
"summary_en": "Native runtime enforcement still needs target-client or external-installer proof.",
},
"native-client-telemetry": {
"label_zh": "原生遥测",
"label_en": "Native Telemetry",
"summary_zh": "真实外部客户端 metadata-only 事件仍未导入。",
"summary_en": "Real external-client metadata-only events have not been imported yet.",
},
}
def world_class_readiness(ledger: dict) -> dict:
summary = ledger.get("summary", {}) if isinstance(ledger, dict) else {}
entries = ledger.get("entries", []) if isinstance(ledger, dict) else []
if not isinstance(entries, list):
entries = []
source_check_count = int(summary.get("source_check_count", 0) or 0)
source_pass_count = int(summary.get("source_pass_count", 0) or 0)
pending_count = int(summary.get("pending_count", len(entries)) or 0)
accepted_count = int(summary.get("accepted_count", 0) or 0)
entry_count = int(summary.get("ledger_entry_count", len(entries)) or 0)
external_pending_count = int(summary.get("external_pending_count", 0) or 0)
human_pending_count = int(summary.get("human_pending_count", 0) or 0)
ready = bool(summary.get("ready_to_claim_world_class", False))
decision = str(summary.get("decision", "not-generated" if entry_count == 0 else "evidence-pending"))
if entry_count == 0:
conclusion_zh = "未生成 world-class ledger;当前报告不会宣称世界级完成。"
conclusion_en = "No world-class ledger was generated; this report does not claim world-class completion."
elif ready:
conclusion_zh = "世界级证据已被 ledger 接受,可进入公开 claim 前的最终复核。"
conclusion_en = "World-class evidence is accepted by the ledger and can move to final claim review."
else:
conclusion_zh = f"世界级证据尚未完成:{pending_count} 项待补,{accepted_count} 项已接受。"
conclusion_en = f"World-class evidence is not complete: {pending_count} pending, {accepted_count} accepted."
items = []
for entry in entries[:4]:
if not isinstance(entry, dict):
continue
key = str(entry.get("key", ""))
copy = WORLD_CLASS_ENTRY_COPY.get(key, {})
category = str(entry.get("category", "external"))
source_checklist = entry.get("source_checklist", [])
blocked_checks = [
str(check.get("label", ""))
for check in source_checklist
if isinstance(check, dict) and check.get("status") == "blocked" and str(check.get("label", "")).strip()
][:3]
items.append(
{
"key": key,
"label_zh": copy.get("label_zh", str(entry.get("label", key))),
"label_en": copy.get("label_en", str(entry.get("label", key))),
"category": category,
"category_zh": "人工证据" if category == "human" else "外部证据",
"category_en": "Human evidence" if category == "human" else "External evidence",
"status": str(entry.get("status", "pending")),
"summary_zh": copy.get("summary_zh", str(entry.get("current", ""))),
"summary_en": copy.get("summary_en", str(entry.get("current", ""))),
"blocked_checks": blocked_checks,
}
)
return {
"ready": ready,
"decision": decision,
"entry_count": entry_count,
"pending_count": pending_count,
"accepted_count": accepted_count,
"external_pending_count": external_pending_count,
"human_pending_count": human_pending_count,
"source_check_count": source_check_count,
"source_pass_count": source_pass_count,
"conclusion_zh": conclusion_zh,
"conclusion_en": conclusion_en,
"entries": items,
}
def build_report_model(skill_dir: Path) -> dict:
skill_dir = skill_dir.resolve()
skill_text = (skill_dir / "SKILL.md").read_text(encoding="utf-8")
@@ -619,6 +714,7 @@ def build_report_model(skill_dir: Path) -> dict:
"contract_boundary": contract,
"quality_review": q_review,
"risk_governance": risk_governance(output_risk, system_model, scorecard),
"world_class_readiness": world_class_readiness(world_class_evidence_ledger),
"package_assets": package_assets(package_map),
"iteration_roadmap": {"items": roadmap},
"report_contract": report_contract,
+66
View File
@@ -162,6 +162,9 @@ def main() -> None:
assert overview_json["benchmark_reproducibility"]["summary"] == {}, overview_json["benchmark_reproducibility"]
assert "world_class_evidence_ledger" in overview_json, overview_json.keys()
assert overview_json["world_class_evidence_ledger"]["summary"] == {}, overview_json["world_class_evidence_ledger"]
assert "world_class_readiness" in overview_json, overview_json.keys()
assert overview_json["world_class_readiness"]["entry_count"] == 0, overview_json["world_class_readiness"]
assert overview_json["world_class_readiness"]["decision"] == "not-generated", overview_json["world_class_readiness"]
assert "runtime_conformance" in overview_json, overview_json.keys()
assert "runtime_permissions" in overview_json, overview_json.keys()
assert overview_json["runtime_permissions"]["summary"] == {}, overview_json["runtime_permissions"]
@@ -182,6 +185,53 @@ def main() -> None:
initial_report_html = (created / "reports" / "skill-overview.html").read_text(encoding="utf-8")
assert directions_json["directions"][0]["title"] in initial_report_html, initial_report_html[:5000]
assert "世界证据" in initial_report_html, initial_report_html
assert "No world-class ledger has been generated" in initial_report_html, initial_report_html
sample_ledger = {
"schema_version": "1.0",
"ok": True,
"summary": {
"ledger_entry_count": 2,
"accepted_count": 0,
"pending_count": 2,
"external_pending_count": 1,
"human_pending_count": 1,
"source_check_count": 4,
"source_pass_count": 1,
"ready_to_claim_world_class": False,
"decision": "evidence-pending",
},
"entries": [
{
"key": "provider-holdout",
"label": "Provider Holdout",
"category": "external",
"status": "pending",
"source_checklist": [
{"label": "Provider model run", "status": "blocked"},
{"label": "Timing observed", "status": "pass"},
],
},
{
"key": "human-adjudication",
"label": "Human Adjudication",
"category": "human",
"status": "pending",
"source_checklist": [
{"label": "No pending decisions", "status": "blocked"},
],
},
],
}
(created / "reports" / "world_class_evidence_ledger.json").write_text(
json.dumps(sample_ledger, ensure_ascii=False, indent=2),
encoding="utf-8",
)
(created / "reports" / "world_class_evidence_ledger.md").write_text(
"# World Class Evidence Ledger\n",
encoding="utf-8",
)
rerender_result = run("skill-report", str(created))
assert rerender_result["ok"], rerender_result
@@ -222,6 +272,17 @@ def main() -> None:
assert "Skill name" in report_html, report_html[:5000]
assert "Turn one-off experience into a reusable, evaluable, and portable skill package." in report_html, report_html[:9000]
assert "After creation, open reports/skill-overview.html before expanding the package further." in report_html, report_html[:9000]
assert "世界证据" in report_html, report_html
assert "证据待补" in report_html, report_html
assert "世界级证据尚未完成:2 项待补,0 项已接受。" in report_html, report_html
assert "World-class evidence is not complete: 2 pending, 0 accepted." in report_html, report_html
assert "提供商留出" in report_html, report_html
assert "人工盲评" in report_html, report_html
assert "Provider Holdout" in report_html, report_html
assert "阻塞检查" in report_html, report_html
assert "Blocked Checks" in report_html, report_html
assert "Provider model run" in report_html, report_html
assert "No pending decisions" in report_html, report_html
assert '<span data-lang="en">把一次性经验沉淀为可复用、可评估、可迁移的 Skill 包体。</span>' not in report_html, report_html[:9000]
assert '<span data-lang="en">创建完成后建议先打开 reports/skill-overview.html,再继续扩展包体。</span>' not in report_html, report_html[:9000]
assert "输入材料" in report_html, report_html[:3000]
@@ -230,6 +291,11 @@ def main() -> None:
assert "下一步" in report_html, report_html[:4200]
overview_json = json.loads((created / "reports" / "skill-overview.json").read_text(encoding="utf-8"))
assert "reports/world_class_evidence_ledger.md" in overview_json["skill_summary"]["deliverables"], overview_json["skill_summary"]
assert overview_json["world_class_readiness"]["entry_count"] == 2, overview_json["world_class_readiness"]
assert overview_json["world_class_readiness"]["pending_count"] == 2, overview_json["world_class_readiness"]
assert overview_json["world_class_readiness"]["source_pass_count"] == 1, overview_json["world_class_readiness"]
assert overview_json["world_class_readiness"]["source_check_count"] == 4, overview_json["world_class_readiness"]
assert "执行流程" in report_html, report_html[:5000]
assert "调用方式" in report_html, report_html[:5000]
assert "证据不足" in report_html or "证据充分" in report_html, report_html[:8000]