单元与策略门禁
+先证明规则本身没有坏
++ 检查参数规范化、完成证据、权限和事件顺序。每次提交运行,不调用真实模型。 +
+-
+
- 模型
- 不调用
- 节奏
- 每次提交
- 失败动作
- 阻止进入高层评测
From 4c88faa19e1a81d14467e37d152b953ed8927fcb Mon Sep 17 00:00:00 2001 From: wuyang <5700876+banisherwy@user.noreply.gitee.com> Date: Tue, 28 Jul 2026 00:57:15 +0800 Subject: [PATCH] Present completion research as web document --- evaluation-site/Dockerfile | 4 + evaluation-site/README.md | 42 +- evaluation-site/assets/evidence-data.js | 2 + evaluation-site/assets/research.css | 2111 +++++++++++++++++++++++ evaluation-site/assets/research.js | 296 ++++ evaluation-site/build_research_data.py | 136 ++ evaluation-site/evaluation-v1.html | 353 ++++ evaluation-site/index.html | 981 ++++++++--- tools/check_project.py | 58 +- 9 files changed, 3698 insertions(+), 285 deletions(-) create mode 100644 evaluation-site/assets/evidence-data.js create mode 100644 evaluation-site/assets/research.css create mode 100644 evaluation-site/assets/research.js create mode 100644 evaluation-site/build_research_data.py create mode 100644 evaluation-site/evaluation-v1.html diff --git a/evaluation-site/Dockerfile b/evaluation-site/Dockerfile index 258bc2b..300861e 100644 --- a/evaluation-site/Dockerfile +++ b/evaluation-site/Dockerfile @@ -2,9 +2,13 @@ FROM nginx:1.29.5-alpine COPY --chmod=0644 nginx.conf /etc/nginx/conf.d/default.conf COPY --chmod=0644 index.html /usr/share/nginx/html/index.html +COPY --chmod=0644 evaluation-v1.html /usr/share/nginx/html/evaluation-v1.html RUN install -d -m 0755 /usr/share/nginx/html/assets COPY --chmod=0644 assets/styles.css /usr/share/nginx/html/assets/styles.css COPY --chmod=0644 assets/app.js /usr/share/nginx/html/assets/app.js +COPY --chmod=0644 assets/research.css /usr/share/nginx/html/assets/research.css +COPY --chmod=0644 assets/evidence-data.js /usr/share/nginx/html/assets/evidence-data.js +COPY --chmod=0644 assets/research.js /usr/share/nginx/html/assets/research.js EXPOSE 8080 diff --git a/evaluation-site/README.md b/evaluation-site/README.md index 28ed2eb..f815cff 100644 --- a/evaluation-site/README.md +++ b/evaluation-site/README.md @@ -1,6 +1,30 @@ -# Agent Evaluation Site +# Agent Completion Research Site -中文交互式报告,用于展示 K1412 Agent Evaluation v1 的结论、任务契约、发布门禁和相关产物。 +中文研究文档,用网页呈现“Agent 如何证明完成、验证器怎样误判、失败后如何恢复”的 +全文审计结论。 + +首页是当前研究结论,旧的 K1412 Agent Evaluation v1 说明页保留在: + +```text +/evaluation-v1.html +``` + +网页是阅读层,事实源仍是: + +- `research/completion-verification/findings.md` +- `research/completion-verification/evidence-ledger.md` + +## Build Evidence Data + +证据浏览器由 Markdown 账本确定性生成: + +```bash +python3 evaluation-site/build_research_data.py +python3 evaluation-site/build_research_data.py --check +``` + +`tools/check_project.py` 会检查生成数据的 SHA-256、40 篇全文池、37 篇审计记录和 +26 篇核心证据,防止网页与研究源漂移。 ## Local Preview @@ -8,7 +32,12 @@ python3 -m http.server 4173 --directory evaluation-site ``` -打开 `http://127.0.0.1:4173/`。 +打开: + +```text +research document: http://127.0.0.1:4173/ +archived v1 report: http://127.0.0.1:4173/evaluation-v1.html +``` ## Production @@ -18,10 +47,5 @@ python3 -m http.server 4173 --directory evaluation-site - public URL: `https://agent-eval.k1412.top/` - deployment: k1412 Unraid Compose Manager - NAS host port: `12005` -- immutable image: `docker.k1412.top/wuyang/agent-eval:20260727T084425Z-cd1eacb` -网页是阅读入口,事实源仍是: - -- `research/evaluation/k1412-agent-evaluation-v1.md` -- `data/evaluation/k1412-agent-eval-task-contracts-v1.json` -- `tools/evaluation/score_agent_runs.py` +生产部署必须使用不可变镜像,并在这里和项目状态文档中记录最终 tag。 diff --git a/evaluation-site/assets/evidence-data.js b/evaluation-site/assets/evidence-data.js new file mode 100644 index 0000000..00b2117 --- /dev/null +++ b/evaluation-site/assets/evidence-data.js @@ -0,0 +1,2 @@ +/* Generated by evaluation-site/build_research_data.py. */ +window.K1412_EVIDENCE={"source":"research/completion-verification/evidence-ledger.md","source_sha256":"5658a539bbafc25e9ef946c5254c67a897e9eedc8f51cf5868891a5d8ec1c445","counts":{"pool":40,"audited":37,"core":26,"support":11,"context":3},"records":[{"id":"2606.09863","title":"From Confident Closing to Silent Failure","url":"https://arxiv.org/abs/2606.09863","depth":"core","theme":"verification","evidence":"tau2 共 9,876 条轨迹;airline/retail 失败轨迹中的 false success 为 45%/48%,telecom 为 3%;AppWorld 的 1,879 条明确完成声明中有 1,425 条 false success;任一 LLM judge 配置 AUROC 不超过约 0.65/0.54","supports":"Agent 自述不能作为完成证据;假完成需要独立状态检查","boundary":"tau2 域间控制方式混杂,telecom 只有 15 个 false-success 样本;AppWorld 只含会明确自评的架构"},{"id":"2406.12045","title":"tau-bench","url":"https://arxiv.org/abs/2406.12045","depth":"core","theme":"verification","evidence":"最终 reward 结合数据库/动作状态和输出信息;论文明确指出最终状态对 policy compliance 必要但不充分;`pass^k` 随重复快速下降","supports":"结果状态、策略遵守和跨次可靠性应分开","boundary":"客服域、模拟用户和手写策略不代表所有 Agent 工作流"},{"id":"2407.18901","title":"AppWorld","url":"https://arxiv.org/abs/2407.18901","depth":"core","theme":"verification","evidence":"750 个任务、9 个应用、457 个 API;任务测试要求预期状态变化成立,且预期/允许集合之外无额外变化","supports":"完成应同时检查目标效果和 collateral damage,并允许不同实现路径","boundary":"任务测试人工编写;不能覆盖所有潜在副作用和 UI/多 Agent 场景"},{"id":"2404.07972","title":"OSWorld","url":"https://arxiv.org/abs/2404.07972","depth":"core","theme":"verification","evidence":"369 个任务、302 个初始状态、134 个 evaluator;作者报告约 1,800 人时构建成本,并承认 evaluator 不能发现所有 latent side effects","supports":"高质量状态 verifier 昂贵且天然不完备","boundary":"桌面任务的成本不能直接外推到 API、代码或开放研究任务"},{"id":"2408.04682","title":"ToolSandbox","url":"https://arxiv.org/abs/2408.04682","depth":"core","theme":"verification","evidence":"1,032 个场景、34 个工具;用 milestone DAG 表示必要进展,用 minefield 表示禁止事件,允许部分进度和弹性顺序","supports":"评估可以路径有弹性,同时保留必要事件和禁止动作","boundary":"milestone/minefield 仍需领域专家反复编写;模拟工具会产生自己的错误"},{"id":"2504.08942","title":"AgentRewardBench","url":"https://arxiv.org/abs/2504.08942","depth":"core","theme":"verification","evidence":"1,302 条 web 轨迹、5 个 benchmark、4 个 Agent;官方规则 evaluator precision/recall/F1 为 83.8/55.9/67.1;最佳 LLM judge precision 低于 70%","supports":"规则判分偏低召回,LLM 判分偏低精度;不能把任一方当万能 oracle","boundary":"专家标签自身在抽样上约 89.3% 一致;结果限于 web 轨迹"},{"id":"2604.18240","title":"AJ-Bench","url":"https://arxiv.org/abs/2604.18240","depth":"core","theme":"verification","evidence":"155 个任务、516 条标注轨迹,覆盖 search/data/GUI;judge 使用工具后 Avg@3 明显提高,但不同域 FPR 仍为 8.77%-56.60%","supports":"environment-aware judge 比纯文本 judge 更好,但仍不能独立作为发布门禁","boundary":"judge、任务域和标注规模有限;更多 reasoning 不稳定单调增益"},{"id":"2606.22737","title":"GroundEval","url":"https://arxiv.org/abs/2606.22737","depth":"support","theme":"verification","evidence":"定义 evidence path、temporal、access、causal 和 absence contract;96 个合成企业问题中,合理回答可获 LLM judge 高分而确定性证据为 0","supports":"可用 typed evidence contract 取代“像答案”的文本判断","boundary":"合成数据、单模型和少量 case study;未做充分 judge 对照"},{"id":"2607.20531","title":"DynamicMCPBench","url":"https://arxiv.org/abs/2607.20531","depth":"core","theme":"verification","evidence":"1,845 个任务、121 个 MCP server;Tier-1 按效果确定性判分;750 个任务人工复核 grader agreement 74%;参考答案完全正确仅 79%;126 次 live 重放中 36% 相同、33% 漂移、32% 损坏","supports":"应按效果而非 gold path 判分;live 环境、参考答案和 grader 本身都需验证","boundary":"Tier-1 是保守下界,仍会漏掉等价路径;MCP 服务样本不能代表全部生产系统"},{"id":"2607.05391","title":"LLM-as-a-Verifier","url":"https://arxiv.org/abs/2607.05391","depth":"core","theme":"verification","evidence":"连续 logit 分数和重复采样提升 pairwise 与 best-of-N 选择;但失败轨迹的 verifier-progress 相关仍达 0.769","supports":"learned verifier 适合候选选择和进度信号,不足以单独证明完成;重复可减方差但不去偏","boundary":"依赖 logit 访问;主要是候选排序/RL 设置,不是生产发布验证"},{"id":"2603.03116","title":"Beyond Task Completion / PAE","url":"https://arxiv.org/abs/2603.03116","depth":"core","theme":"verification","evidence":"tau-bench retail/airline 中加入程序 gate 后,不同模型成功率由 40%-79% 降到 9%-58%;作者人工审计 131 条 airline corrupt success,judge precision 约 93.8%-95.2%","supports":"状态成功会掩盖程序违规;“完成”可因必要过程被破坏而无效","boundary":"单 benchmark,程序 gate 和部分判定依赖 GPT-5 judge;所有违规被同等二元处理"},{"id":"2607.02599","title":"AgentLTL","url":"https://arxiv.org/abs/2607.02599","depth":"core","theme":"verification","evidence":"FO-LTL 独立检查轨迹;block/warn 在 7 个模型中改善 5 个、恶化 2 个;soft-block 在 4/7 中最差","supports":"正确性和合规性是不同轴;门禁响应策略会制造拒绝或强制终止","boundary":"主要是合成算术工具和一个 repo-QA 扩展,不能证明开放环境收益"},{"id":"2607.18575","title":"RECEIPT","url":"https://arxiv.org/abs/2607.18575","depth":"core","theme":"verification","evidence":"同一 Claude Opus 自评 27 份 XSS 报告只有 10 个 TP;隔离、浏览器 verdict、可重放 PoC 和角色分离后,作者报告 30/30 TP;消融从 45% 到 100% precision","supports":"独立、不可游戏、可重放的 verifier 比 actor 自评可靠","boundary":"单模型、白盒 XSS 和特定 harness;高 precision 可能伴随未测量的 false negative"},{"id":"2607.07405","title":"Reason Less, Verify More","url":"https://arxiv.org/abs/2607.07405","depth":"core","theme":"verification","evidence":"tau2 airline 中确定性前置 gate 把成功从 29.6% 提到 42.0%,独立种子复现约 +12.3pp;gate precision 从 5% 到 100% 不等;retail 无正增益","supports":"可判定、高价值、工具允许违规的政策适合前置 gate","boundary":"任务与 gate 同源;只有 cancellation gate 明显承担收益;block 与结构化反馈效应未分离"},{"id":"2607.06624","title":"AgentLens","url":"https://arxiv.org/abs/2607.06624","depth":"support","theme":"verification","evidence":"16 个 Java 场景 × 2 persona;分开评 final result、instruction compliance、pitfalls、tool calls、pleasantness 和 formal verification;两个 judge 在 23% pairwise 比较上选不同赢家,18% 为各自偏向同家族","supports":"轨迹质量包含多个非冗余能力;judge 家族偏差和 provider/harness 故障会污染总分","boundary":"场景很小且 Java-only;正式人类一致性研究尚未完成;QI 是未加权代理分"},{"id":"2503.15223","title":"Are \"Solved Issues\" in SWE-bench Really Solved Correctly?","url":"https://arxiv.org/abs/2503.15223","depth":"core","theme":"protocol","evidence":"检查 877 个已通过 benchmark 的补丁;补跑全部开发者测试直接发现平均 7.8% 错误;PatchDiff 暴露 29.6% 行为差异,人工审计后估计约 11% plausible patch 不正确","supports":"通过有限测试不等于需求完成;应检查测试覆盖和行为差异","boundary":"差分测试也可能误报;部分 issue 规格本身不充分,人工结论有 uncertain 类"},{"id":"2410.06992","title":"SWE-Bench+","url":"https://arxiv.org/abs/2410.06992","depth":"support","theme":"protocol","evidence":"手工筛 251 个 SWE-Agent + GPT-4 通过项;报告 32.67% answer leakage、31.08% 弱测试,过滤后分数 12.47% 降到 3.97%","supports":"泄漏和弱测试可显著抬高 coding-agent 分数","boundary":"判定定义和方法存在较强主观性,作为前述 ICSE 审计的旁证而非主证据"},{"id":"2607.22368","title":"Protocol Validity / HackDetect","url":"https://arxiv.org/abs/2607.22368","depth":"core","theme":"protocol","evidence":"审计 15 个 benchmark、2,385 条轨迹;53 条手标样本上 LLM audit F1 为 0.84;发现任务到分数协议可能允许绕过预期能力","supports":"benchmark 要证明“目标能力对得分仍然必要”,不能只检查数据和 metric","boundary":"部分系统只预选可疑样本,不能解释为全体 prevalence;依赖同一类 LLM 审计"},{"id":"2606.26300","title":"The Verification Horizon","url":"https://arxiv.org/abs/2606.26300","depth":"support","theme":"protocol","evidence":"coding-agent reward 中,过程监控抑制测试篡改/查答案等 hack;报告内部 SWE、前端和长程 reward 的多组改进","supports":"verifier 必须随 Agent 能力和攻击面共同演化,最终测试不能覆盖所有过程 hack","boundary":"大量结果来自 Qwen 内部 benchmark 和训练管线,外部可复核性有限"},{"id":"2607.13085","title":"Baselines Before Architecture","url":"https://arxiv.org/abs/2607.13085","depth":"core","theme":"protocol","evidence":"XBOW 104 个任务、两次运行;普通 Codex 基线随 GPT-5→5.2→5.5 从 67.3→79.8→92.3,模型匹配后剩余架构增益明显缩小","supports":"必须用同模型、同预算的简单基线分离模型能力和架构贡献","boundary":"公开系统并非完全同预算,且公开安全 benchmark 可能有训练污染"},{"id":"2607.22520","title":"The Regression Tax","url":"https://arxiv.org/abs/2607.22520","depth":"support","theme":"protocol","evidence":"5,832 个 office task-condition run;skills 带来 553 个 gain、324 个 regression,回归抵消约 59% 增益;Bonferroni 后仅 3/18 显著","supports":"新组件必须同时报告 gain 和 regression,平均值会藏住负迁移","boundary":"主要显著结果集中在一个模型/benchmark;部分原 grader 有 artifact"},{"id":"2508.11027","title":"Hell or High Water","url":"https://arxiv.org/abs/2508.11027","depth":"core","theme":"recovery","evidence":"830 题、4,450 个函数;第一工具不可用但保证有最多三步替代路径;多模型从 clean 到 failure 条件下降约 22-30pp,53%-66% 失败在工具搜索","supports":"外部故障后的替代路径发现是独立能力,显式错误和已知可行路径也不保证恢复","boundary":"Spider 派生、工具库很大但路径短;结果受 prompt 和工具检索接口影响"},{"id":"2606.05806","title":"ToolMaze","url":"https://arxiv.org/abs/2606.05806","depth":"core","theme":"recovery","evidence":"controlled DAG 覆盖显式/隐式 × 瞬时/永久故障;有 hint 时平均恢复率为 81.44%、27.68%、38.12%、17.58%;模型规模对 recovery 的拟合斜率远低于 task success","supports":"隐式永久故障最难;恢复能力不会随一般任务能力等速增长","boundary":"程序生成 DAG 和故障模板,不是开放生产环境;规模相关不证明因果"},{"id":"2606.21409","title":"Don't Blindly Trust It","url":"https://arxiv.org/abs/2606.21409","depth":"core","theme":"recovery","evidence":"HotpotQA/FEVER matched loop;错误或冲突反馈使结果远差于无反馈;首步预测器在 recoverable conflict 上 AUC 跌到 0.516;requery 对不同模型可正可负","supports":"检出坏反馈只是一层过滤,最终表现受 fallback 能力限制","boundary":"主要是 QA 和模拟 corruption,只有 GPT-4o 是闭源强模型;calculator 只是 pilot"},{"id":"2607.04623","title":"R2Act","url":"https://arxiv.org/abs/2607.04623","depth":"core","theme":"recovery","evidence":"302 个 Kubernetes incident;最强 RAG 的 root service 识别 91.4%-99.7%,恢复动作有效率仅 36.8%-60.3%;Qwen live replay 恢复 146/302","supports":"诊断、动作有效性和真实状态恢复是三个不同阶段","boundary":"单一微服务系统和有限故障类型;组织权限/策略未充分覆盖"},{"id":"2509.25370","title":"AgentDebug","url":"https://arxiv.org/abs/2509.25370","depth":"core","theme":"recovery","evidence":"200 条失败轨迹;检测 exact step 45%,step+module 31.3%,全部精确 24.3%;从定位点重跑在三套任务上提高恢复","supports":"定位错误步骤可比从头盲目改写更有效,但自动根因判断仍弱","boundary":"标注者 κ=0.55;样本和域小,部分图表分母不够清晰"},{"id":"2607.18754","title":"AgentDebugX","url":"https://arxiv.org/abs/2607.18754","depth":"core","theme":"recovery","evidence":"Who&When 184 条轨迹上 strict agent+step 由 21.7% 提到 28.8%;GAIA 73 条失败一次重跑修复 13 条,三个基线为 4-6 条;约 1.6× 单次读取 Token","supports":"结构化归因可提高后续恢复,但严格根因定位仍远未解决","boundary":"所有方法可见参考答案;GAIA 只用一个 policy model,比较的是完整 recipe,未隔离归因效应"},{"id":"2607.19338","title":"CodeRescue","url":"https://arxiv.org/abs/2607.19338","depth":"core","theme":"recovery","evidence":"约 27,300 次代码任务尝试;固定 reflect/replan/escalate 恢复率为 27.5/45.3/68.6%,router 为 81.7%;可恢复失败中 cheap-only/escalation-only/both 为 28/45/27%","supports":"不存在统一最优恢复动作;根据失败上下文和成本路由有直接价值","boundary":"单次路由决策、代码 benchmark 和特定模型;高成功率不代表安全恢复"},{"id":"2607.17641","title":"VRR-Stop","url":"https://arxiv.org/abs/2607.17641","depth":"core","theme":"recovery","evidence":"在 verifier/repair 不匹配 stress 中,固定五轮 repair 从 0.700 降到 0.116,VRR-Stop 为 0.722;55% 正确计划被破坏","supports":"verify-repair loop 必须有停止/保护条件,更多轮次可能主动伤害","boundary":"巨大差值来自刻意 stress;正常条件下相对 no-repair 的提升较小且 CI 可跨 0"},{"id":"2303.11366","title":"Reflexion","url":"https://arxiv.org/abs/2303.11366","depth":"support","theme":"recovery","evidence":"HumanEval Rust50 消融:base 60、无测试自反思 52、仅测试 60、测试+反思 68;自生成测试在 MBPP 有更多 false positive","supports":"反思依赖可靠外部反馈;无证据自反思会损伤正确答案","boundary":"较早模型、特定 coding/QA/ALFWorld 设置,不能代表当前 Agent"},{"id":"2305.11738","title":"CRITIC","url":"https://arxiv.org/abs/2305.11738","depth":"support","theme":"recovery","evidence":"外部工具反馈在 QA/math/toxicity 有增益;数学中修复 32.2% 初始错误,同时错误修改 14.3%,并使原本正确项下降 4.3%","supports":"外部反馈有用,但 correction 不是单调改进,必须复验","boundary":"多为短程任务,工具质量和 prompt 强烈影响结果"},{"id":"2604.18847","title":"Human-Guided Harm Recovery","url":"https://arxiv.org/abs/2604.18847","depth":"support","theme":"recovery","evidence":"775 个场景、20 名标注者、1,130 个计划偏好;在 50 个 OSWorld harm 场景上,人偏好 reward/rubric 重排计划","supports":"有伤害后的恢复涉及规范和人类偏好,不能只优化任务成功","boundary":"假设已有外部 harm classifier;评的是计划偏好,不是客观状态恢复"},{"id":"2606.01416","title":"Self-Healing Agentic Orchestrators","url":"https://arxiv.org/abs/2606.01416","depth":"support","theme":"recovery","evidence":"100 个作者构造任务、确定性工具和故障模板中报告 98.8% 成功;live model 部分只有 15 个任务,三种方法最终都 100%;作者明确承认 benchmark 与 recovery policy 可能同源","supports":"`detect-diagnose-recover-verify` 和 bounded budget 是可用系统词汇","boundary":"不能用其高分证明生产自愈;合成任务、受控故障、弱 baseline 和饱和 live set 外部效度低"},{"id":"2512.07850","title":"SABER","url":"https://arxiv.org/abs/2512.07850","depth":"core","theme":"reliability","evidence":"tau-bench 中 mutating action 仅占 14%-18%,但与失败强相关;confirmation/reflection/verifier 可提高多数组合,full 组合在部分 retail 设置反而回归","supports":"高副作用动作值得前置集中审查;保护组件也需报告回归","boundary":"mutation 与失败的回归关系可能受路径距离混杂;只研究确认型 safeguard"},{"id":"2506.07982","title":"tau2-bench","url":"https://arxiv.org/abs/2506.07982","depth":"core","theme":"reliability","evidence":"新增共享世界状态和用户工具,区分 no-user、oracle-plan 和 dual-control;telecom `pass^1` 约 34%;用户模拟器 critical error 为 6%,retail/airline 为 12%/13%","supports":"指导用户、协调共享状态和纯自主执行是不同能力;user simulator 也是误差源","boundary":"三个客服域,专家-新手差距未显式建模;域扩展仍依赖专家"},{"id":"2401.13178","title":"AgentBoard","url":"https://arxiv.org/abs/2401.13178","depth":"support","theme":"reliability","evidence":"1,013 个任务、9 个环境;把 success 与人工定义 progress rate 分开","supports":"部分进展有诊断价值,不能只保留二元成功","boundary":"progress 仍依赖任务作者定义,且模拟环境与当前模型不同"},{"id":"2410.10934","title":"Agent-as-a-Judge","url":"https://arxiv.org/abs/2410.10934","depth":"support","theme":"reliability","evidence":"DevAI 55 个任务上,Agent judge 可主动读取环境;作者专家评估耗时 58/86.5 小时,Agent judge 与人类对齐约 84%-90%","supports":"judge 主动取证比只看最终文本更合理,也可降低人工成本","boundary":"样本小、主观任务多;对齐率不足以支持自动发布"},{"id":"2304.05128","title":"Self-Debugging","url":"https://arxiv.org/abs/2304.05128","depth":"context","theme":"context","evidence":"","supports":"","boundary":"早期代码自调试背景;本轮已有 Reflexion、CRITIC 和更新的恢复对照承担该结论"},{"id":"2307.13854","title":"WebArena","url":"https://arxiv.org/abs/2307.13854","depth":"context","theme":"context","evidence":"","supports":"","boundary":"作为交互环境历史锚点;完成证明由 tau/AppWorld/OSWorld 的更直接状态设计承担"},{"id":"2310.06770","title":"SWE-bench","url":"https://arxiv.org/abs/2310.06770","depth":"context","theme":"context","evidence":"","supports":"","boundary":"作为 coding benchmark 历史锚点;测试误认证由 2503.15223 的专门审计承担"}]}; diff --git a/evaluation-site/assets/research.css b/evaluation-site/assets/research.css new file mode 100644 index 0000000..b332f63 --- /dev/null +++ b/evaluation-site/assets/research.css @@ -0,0 +1,2111 @@ +:root { + color-scheme: light; + --page: #f6f7f5; + --paper: #ffffff; + --paper-soft: #eef1ee; + --ink: #131715; + --ink-soft: #53605a; + --line: #cbd2cd; + --line-strong: #9da9a2; + --teal: #00796f; + --teal-soft: #dcefeb; + --red: #a33d32; + --red-soft: #f4e4e1; + --blue: #365f91; + --blue-soft: #e3ebf5; + --amber: #8b6414; + --amber-soft: #f2ead6; + --header-height: 72px; + --content: 1240px; + --reading: 820px; + font-family: + Inter, ui-sans-serif, -apple-system, BlinkMacSystemFont, "Segoe UI", + "PingFang SC", "Microsoft YaHei", sans-serif; + font-synthesis: none; + letter-spacing: 0; +} + +* { + box-sizing: border-box; +} + +html { + scroll-behavior: smooth; + scroll-padding-top: calc(var(--header-height) + 24px); +} + +body { + margin: 0; + color: var(--ink); + background: var(--page); + font-size: 16px; + line-height: 1.7; + letter-spacing: 0; + text-rendering: optimizeLegibility; +} + +body, +button, +input { + font-family: inherit; +} + +a { + color: inherit; +} + +button, +input { + font-size: inherit; +} + +button { + color: inherit; +} + +::selection { + color: var(--ink); + background: #b9ded7; +} + +.skip-link { + position: fixed; + z-index: 1000; + top: 8px; + left: 8px; + padding: 8px 12px; + color: #fff; + background: var(--ink); + border-radius: 4px; + transform: translateY(-150%); +} + +.skip-link:focus { + transform: translateY(0); +} + +.reading-progress { + position: fixed; + z-index: 1001; + top: 0; + left: 0; + width: 100%; + height: 3px; + background: transparent; +} + +.reading-progress span { + display: block; + width: 0; + height: 100%; + background: var(--teal); + transition: width 120ms linear; +} + +.site-header { + position: sticky; + z-index: 100; + top: 0; + display: grid; + grid-template-columns: minmax(210px, auto) 1fr auto; + align-items: center; + min-height: var(--header-height); + padding: 0 28px; + background: rgba(246, 247, 245, 0.96); + border-bottom: 1px solid var(--line); + backdrop-filter: blur(14px); +} + +.brand { + display: inline-flex; + gap: 10px; + align-items: center; + width: fit-content; + color: var(--ink); + text-decoration: none; +} + +.brand-mark { + display: grid; + width: 34px; + height: 34px; + place-items: center; + color: #fff; + background: var(--ink); + border-radius: 2px; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 15px; + font-weight: 700; +} + +.brand > span:last-child { + display: flex; + flex-direction: column; + line-height: 1.15; +} + +.brand strong { + font-size: 13px; + text-transform: uppercase; +} + +.brand small { + margin-top: 4px; + color: var(--ink-soft); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 10px; +} + +.primary-nav { + display: flex; + gap: 4px; + justify-content: center; +} + +.primary-nav a, +.header-actions a { + padding: 7px 10px; + color: var(--ink-soft); + border-radius: 4px; + font-size: 13px; + font-weight: 650; + text-decoration: none; + white-space: nowrap; +} + +.primary-nav a:hover, +.primary-nav a:focus-visible, +.header-actions a:hover, +.header-actions a:focus-visible { + color: var(--ink); + background: var(--paper-soft); + outline: none; +} + +.primary-nav a.is-active { + color: #fff; + background: var(--ink); +} + +.header-actions { + display: flex; + gap: 2px; + justify-content: flex-end; +} + +.header-actions a:first-child { + color: var(--blue); +} + +.section-shell { + width: min(100%, var(--content)); + margin: 0 auto; + padding: 92px 40px; + border-bottom: 1px solid var(--line); +} + +.cover { + display: grid; + grid-template-columns: minmax(0, 1.15fr) minmax(390px, 0.85fr); + gap: 70px; + padding-top: 88px; + padding-bottom: 54px; +} + +.cover-copy { + align-self: center; +} + +.eyebrow, +.section-kicker, +.finding-label, +.capability-code, +.chain-label { + margin: 0; + color: var(--teal); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 12px; + font-weight: 750; + line-height: 1.4; + text-transform: uppercase; +} + +.cover h1 { + max-width: 760px; + margin: 18px 0 24px; + font-family: "Noto Serif SC", "Source Han Serif SC", "Songti SC", serif; + font-size: 66px; + font-weight: 760; + line-height: 1.14; + letter-spacing: 0; +} + +.lead { + max-width: 720px; + margin: 0; + color: #39433e; + font-family: "Noto Serif SC", "Source Han Serif SC", "Songti SC", serif; + font-size: 20px; + line-height: 1.85; +} + +.cover-actions { + display: flex; + gap: 14px; + align-items: center; + margin-top: 34px; +} + +.primary-link, +.text-link { + display: inline-flex; + align-items: center; + min-height: 40px; + padding: 8px 14px; + border-radius: 4px; + font-size: 14px; + font-weight: 720; + text-decoration: none; +} + +.primary-link { + color: #fff; + background: var(--ink); +} + +.primary-link:hover, +.primary-link:focus-visible { + background: var(--teal); + outline: none; +} + +.text-link { + color: var(--teal); + border: 1px solid var(--line-strong); +} + +.text-link:hover, +.text-link:focus-visible { + border-color: var(--teal); + outline: none; +} + +.completion-figure { + align-self: center; + margin: 0; + padding: 24px; + color: #fff; + background: var(--ink); + border: 1px solid #000; + border-radius: 6px; + box-shadow: 10px 10px 0 var(--line); +} + +.completion-figure figcaption { + display: flex; + align-items: baseline; + justify-content: space-between; + margin-bottom: 18px; + padding-bottom: 16px; + border-bottom: 1px solid #465049; +} + +.completion-figure figcaption span { + color: #abb5af; + font-size: 12px; +} + +.completion-figure figcaption strong { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 12px; +} + +.claim-line { + display: grid; + grid-template-columns: 32px 1fr auto; + gap: 12px; + align-items: center; + min-height: 66px; + padding: 10px 0; + border-bottom: 1px solid #39423d; +} + +.claim-index { + display: grid; + width: 28px; + height: 28px; + place-items: center; + color: #fff; + background: var(--teal); + border-radius: 50%; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 10px; + font-weight: 800; +} + +.claim-negative .claim-index { + background: var(--red); +} + +.claim-process .claim-index { + background: var(--blue); +} + +.claim-unknown .claim-index { + color: var(--ink); + background: #d2ad4e; +} + +.claim-line div { + display: flex; + flex-direction: column; +} + +.claim-line strong { + font-size: 15px; +} + +.claim-line small { + color: #96a19a; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 10px; +} + +.claim-state { + color: #c8d1cb; + font-size: 12px; + font-weight: 700; +} + +.completion-figure > p { + margin: 18px 0 0; + color: #aeb9b2; + font-size: 12px; + line-height: 1.7; +} + +.audit-strip { + display: grid; + grid-column: 1 / -1; + grid-template-columns: repeat(4, 1fr); + margin: 48px 0 0; + padding-top: 24px; + border-top: 1px solid var(--line); +} + +.audit-strip > div { + min-width: 0; + padding: 0 22px; + border-left: 1px solid var(--line); +} + +.audit-strip > div:first-child { + padding-left: 0; + border-left: 0; +} + +.audit-strip dt { + color: var(--ink-soft); + font-size: 12px; +} + +.audit-strip dd { + margin: 2px 0 0; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 34px; + font-weight: 800; + line-height: 1.2; +} + +.audit-strip small { + display: block; + margin-top: 4px; + color: var(--ink-soft); + font-size: 11px; + line-height: 1.45; +} + +.section-heading { + margin-bottom: 44px; +} + +.section-heading h2 { + max-width: 900px; + margin: 9px 0 0; + font-family: "Noto Serif SC", "Source Han Serif SC", "Songti SC", serif; + font-size: 40px; + line-height: 1.28; + letter-spacing: 0; +} + +.section-heading > p:last-child { + max-width: 680px; + margin: 14px 0 0; + color: var(--ink-soft); +} + +.split-heading { + display: grid; + grid-template-columns: minmax(0, 1fr) minmax(300px, 0.55fr); + gap: 70px; + align-items: end; +} + +.split-heading > p:last-child { + margin: 0 0 4px; +} + +.conclusion-index { + padding-top: 72px; + padding-bottom: 84px; +} + +.conclusion-list { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + margin: 0; + padding: 0; + border-top: 1px solid var(--line-strong); + list-style: none; +} + +.conclusion-list li { + border-bottom: 1px solid var(--line); +} + +.conclusion-list li:nth-child(odd) { + border-right: 1px solid var(--line); +} + +.conclusion-list a { + display: grid; + grid-template-columns: 42px 1fr; + gap: 0 18px; + min-height: 118px; + padding: 22px; + text-decoration: none; +} + +.conclusion-list a:hover, +.conclusion-list a:focus-visible { + background: var(--paper); + outline: none; +} + +.conclusion-list span { + grid-row: 1 / 3; + color: var(--teal); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 12px; + font-weight: 800; +} + +.conclusion-list strong { + font-size: 18px; + line-height: 1.45; +} + +.conclusion-list small { + margin-top: 5px; + color: var(--ink-soft); + font-size: 13px; + line-height: 1.6; +} + +.capability-grid { + display: grid; + grid-template-columns: repeat(5, minmax(0, 1fr)); + border-top: 1px solid var(--line-strong); + border-bottom: 1px solid var(--line-strong); +} + +.capability-grid article { + min-width: 0; + padding: 22px 18px 26px; + border-left: 1px solid var(--line); +} + +.capability-grid article:first-child { + border-left: 0; +} + +.capability-code { + color: var(--ink-soft); + font-size: 10px; +} + +.capability-grid h3 { + margin: 9px 0 18px; + font-size: 18px; +} + +.capability-grid ul { + display: grid; + gap: 15px; + margin: 0; + padding: 0; + list-style: none; +} + +.capability-grid li { + display: flex; + flex-direction: column; + gap: 1px; +} + +.capability-grid li strong { + font-size: 13px; +} + +.capability-grid li span { + color: var(--ink-soft); + font-size: 11px; + line-height: 1.5; +} + +.research-question { + display: grid; + grid-template-columns: 150px 1fr; + gap: 30px; + margin: 42px 0 0; + padding: 28px 0 0; + border: 0; + border-top: 3px solid var(--ink); +} + +.research-question span { + color: var(--teal); + font-size: 12px; + font-weight: 750; +} + +.research-question p { + max-width: 830px; + margin: 0; + font-family: "Noto Serif SC", "Source Han Serif SC", "Songti SC", serif; + font-size: 23px; + font-weight: 680; + line-height: 1.7; +} + +.two-chain-model { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 22px; +} + +.chain-panel { + overflow: hidden; + background: var(--paper); + border: 1px solid var(--line-strong); + border-radius: 6px; +} + +.chain-label { + padding: 18px 20px; + color: #fff; + background: var(--teal); +} + +.recovery-panel .chain-label { + background: var(--blue); +} + +.chain-panel ol { + margin: 0; + padding: 0 20px; + list-style: none; +} + +.chain-panel li { + display: grid; + grid-template-columns: 34px 1fr; + gap: 12px; + align-items: center; + min-height: 68px; + border-bottom: 1px solid var(--line); +} + +.chain-panel li > span { + color: var(--teal); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 11px; + font-weight: 800; +} + +.recovery-panel li > span { + color: var(--blue); +} + +.chain-panel li div { + display: flex; + flex-direction: column; +} + +.chain-panel li strong { + font-size: 14px; +} + +.chain-panel li small { + color: var(--ink-soft); + font-size: 11px; +} + +.chain-outcome { + display: flex; + flex-direction: column; + gap: 3px; + padding: 18px 20px; + background: var(--teal-soft); +} + +.chain-outcome span { + color: var(--teal); + font-size: 10px; + font-weight: 800; +} + +.chain-outcome strong { + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 12px; +} + +.chain-outcome.warning { + background: var(--amber-soft); +} + +.chain-outcome.warning span { + color: var(--amber); +} + +.verifier-roles { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + margin-top: 30px; + border-top: 1px solid var(--line-strong); +} + +.verifier-roles > div { + padding: 22px 20px 0; + border-left: 1px solid var(--line); +} + +.verifier-roles > div:first-child { + padding-left: 0; + border-left: 0; +} + +.verifier-roles strong { + font-size: 14px; +} + +.verifier-roles p { + margin: 8px 0 0; + color: var(--ink-soft); + font-size: 12px; + line-height: 1.65; +} + +.arguments-section { + padding-bottom: 54px; +} + +.finding { + display: grid; + grid-template-columns: 92px minmax(0, var(--reading)); + gap: 24px; + justify-content: center; + padding: 66px 0; + border-top: 1px solid var(--line); +} + +.finding:first-of-type { + border-top: 2px solid var(--ink); +} + +.finding-number { + padding-top: 3px; + color: var(--line-strong); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 31px; + font-weight: 800; +} + +.finding-label { + color: var(--ink-soft); + font-size: 10px; +} + +.finding h3 { + margin: 7px 0 14px; + font-family: "Noto Serif SC", "Source Han Serif SC", "Songti SC", serif; + font-size: 32px; + line-height: 1.35; + letter-spacing: 0; +} + +.finding-thesis { + margin: 0; + color: #2b3530; + font-family: "Noto Serif SC", "Source Han Serif SC", "Songti SC", serif; + font-size: 19px; + line-height: 1.9; +} + +.evidence-points { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1px; + margin-top: 28px; + background: var(--line); + border: 1px solid var(--line); +} + +.evidence-points > div { + min-width: 0; + padding: 18px; + background: var(--paper); +} + +.evidence-points strong { + display: block; + color: var(--teal); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 22px; +} + +.evidence-points span { + display: block; + margin-top: 4px; + color: var(--ink-soft); + font-size: 11px; + line-height: 1.55; +} + +.finding details { + margin-top: 24px; + border-top: 1px solid var(--line); + border-bottom: 1px solid var(--line); +} + +.finding summary { + position: relative; + padding: 14px 36px 14px 0; + cursor: pointer; + font-size: 13px; + font-weight: 750; + list-style: none; +} + +.finding summary::-webkit-details-marker { + display: none; +} + +.finding summary::after { + position: absolute; + top: 13px; + right: 4px; + content: "+"; + color: var(--teal); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 18px; +} + +.finding details[open] summary::after { + content: "−"; +} + +.detail-copy { + padding: 0 0 18px; +} + +.detail-copy p { + margin: 10px 0 0; + color: var(--ink-soft); + font-size: 14px; + line-height: 1.8; +} + +code { + padding: 1px 4px; + color: #23493f; + background: var(--teal-soft); + border-radius: 2px; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 0.9em; +} + +.formula { + overflow-x: auto; + margin: 26px 0 0; + padding: 18px; + color: #dbe3de; + background: var(--ink); + border-radius: 4px; +} + +.formula code { + padding: 0; + color: inherit; + background: transparent; + font-size: 13px; + line-height: 1.7; +} + +.contrast-table { + margin-top: 26px; + border-top: 1px solid var(--line-strong); +} + +.contrast-table > div { + display: grid; + grid-template-columns: 1fr 180px 180px; + gap: 16px; + padding: 13px 0; + border-bottom: 1px solid var(--line); + font-size: 13px; +} + +.contrast-table strong { + color: var(--teal); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 12px; +} + +.before-after { + display: grid; + grid-template-columns: 1fr 36px 1fr; + gap: 10px; + align-items: stretch; + margin-top: 28px; +} + +.before-after > div:not(.arrow) { + display: flex; + flex-direction: column; + padding: 18px; + background: var(--paper); + border: 1px solid var(--line); + border-radius: 4px; +} + +.before-after small { + color: var(--ink-soft); + font-size: 11px; +} + +.before-after strong { + margin-top: 3px; + color: var(--teal); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 27px; + line-height: 1.2; +} + +.before-after span { + margin-top: 5px; + color: var(--ink-soft); + font-size: 11px; +} + +.before-after .arrow { + display: grid; + place-items: center; + color: var(--line-strong); + font-size: 24px; +} + +.repair-risk { + grid-template-columns: 1fr 28px 1fr 28px 1fr; +} + +.before-after .negative-result { + background: var(--red-soft); + border-color: #d9aaa4; +} + +.before-after .negative-result strong { + color: var(--red); +} + +.path-model { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 14px; + margin-top: 28px; +} + +.path-model > div { + display: flex; + flex-direction: column; + padding: 18px; + border-left: 4px solid var(--teal); + background: var(--paper); +} + +.path-model > div:last-child { + border-left-color: var(--red); +} + +.path-model small { + color: var(--ink-soft); + font-size: 10px; +} + +.path-model strong { + margin-top: 2px; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 13px; +} + +.path-model span { + margin-top: 7px; + color: var(--ink-soft); + font-size: 12px; +} + +.route-table { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + margin-top: 28px; + border-top: 1px solid var(--line-strong); +} + +.route-table > div { + display: grid; + grid-template-columns: 82px 1fr; + gap: 2px 16px; + padding: 13px 10px 13px 0; + border-bottom: 1px solid var(--line); +} + +.route-table > div:nth-child(odd) { + border-right: 1px solid var(--line); +} + +.route-table > div:nth-child(even) { + padding-left: 18px; +} + +.route-table strong { + grid-row: 1 / 3; + color: var(--blue); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 12px; +} + +.route-table span { + font-size: 12px; + font-weight: 650; +} + +.route-table small { + color: var(--ink-soft); + font-size: 10px; +} + +.timeline { + display: grid; + grid-template-columns: repeat(4, minmax(0, 1fr)); + border-top: 4px solid var(--ink); +} + +.timeline article { + position: relative; + min-width: 0; + padding: 28px 22px 24px; + border-left: 1px solid var(--line); +} + +.timeline article:first-child { + padding-left: 0; + border-left: 0; +} + +.timeline time { + color: var(--teal); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 22px; + font-weight: 800; +} + +.timeline h3 { + min-height: 54px; + margin: 12px 0 8px; + font-size: 16px; + line-height: 1.55; +} + +.timeline p { + margin: 0; + color: #39433e; + font-size: 12px; + line-height: 1.65; +} + +.timeline small { + display: block; + margin-top: 14px; + padding-top: 12px; + color: var(--red); + border-top: 1px solid var(--line); + font-size: 10px; + line-height: 1.55; +} + +.progress-verdict { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1px; + margin-top: 38px; + background: var(--line); + border: 1px solid var(--line); +} + +.progress-verdict > div { + padding: 22px; + background: var(--paper); +} + +.progress-verdict span { + color: var(--teal); + font-size: 10px; + font-weight: 800; +} + +.progress-verdict div:nth-child(2) span { + color: var(--blue); +} + +.progress-verdict div:nth-child(3) span { + color: var(--red); +} + +.progress-verdict strong { + display: block; + margin-top: 4px; + font-size: 16px; +} + +.progress-verdict p { + margin: 8px 0 0; + color: var(--ink-soft); + font-size: 11px; + line-height: 1.65; +} + +.inference-note { + padding: 14px 16px; + color: #5f4711 !important; + background: var(--amber-soft); + border-left: 4px solid #c39735; +} + +.system-flow { + display: grid; + grid-template-columns: repeat(7, minmax(0, 1fr)); + margin: 0; + padding: 0; + border-top: 1px solid var(--line-strong); + list-style: none; +} + +.system-flow li { + min-width: 0; + padding: 20px 14px; + border-left: 1px solid var(--line); +} + +.system-flow li:first-child { + padding-left: 0; + border-left: 0; +} + +.system-flow li > span { + display: block; + color: var(--teal); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 11px; + font-weight: 800; +} + +.system-flow strong { + display: block; + margin-top: 10px; + font-size: 13px; + line-height: 1.4; + overflow-wrap: anywhere; +} + +.system-flow p { + margin: 7px 0 0; + color: var(--ink-soft); + font-size: 10px; + line-height: 1.55; +} + +.certificate-preview { + max-width: 900px; + margin: 34px auto 0; + color: #fff; + background: var(--ink); + border-radius: 6px; + box-shadow: 10px 10px 0 var(--line); +} + +.certificate-header { + display: flex; + gap: 20px; + justify-content: space-between; + padding: 18px 20px; + border-bottom: 1px solid #465049; +} + +.certificate-header span { + color: #aeb8b2; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 10px; +} + +.certificate-header strong { + color: #ffcf66; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 11px; +} + +.certificate-preview dl { + margin: 0; + padding: 8px 20px 18px; +} + +.certificate-preview dl > div { + display: grid; + grid-template-columns: 190px 1fr; + gap: 20px; + padding: 11px 0; + border-bottom: 1px solid #39423d; +} + +.certificate-preview dl > div:last-child { + border-bottom: 0; +} + +.certificate-preview dt { + color: #9da9a2; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 10px; +} + +.certificate-preview dd { + margin: 0; + font-size: 12px; +} + +.evidence-tools { + position: sticky; + z-index: 20; + top: calc(var(--header-height) + 3px); + display: grid; + grid-template-columns: minmax(220px, 1fr) auto auto; + gap: 20px; + align-items: end; + padding: 16px 0; + background: rgba(246, 247, 245, 0.97); + border-top: 1px solid var(--line); + border-bottom: 1px solid var(--line); + backdrop-filter: blur(14px); +} + +.evidence-search, +.filter-group { + display: flex; + flex-direction: column; + gap: 7px; +} + +.evidence-search > span, +.filter-group > span { + color: var(--ink-soft); + font-size: 10px; + font-weight: 800; +} + +.evidence-search input { + width: 100%; + height: 38px; + padding: 0 12px; + color: var(--ink); + background: var(--paper); + border: 1px solid var(--line-strong); + border-radius: 4px; + outline: none; +} + +.evidence-search input:focus { + border-color: var(--teal); + box-shadow: 0 0 0 2px var(--teal-soft); +} + +.segmented { + display: flex; + min-height: 38px; + padding: 2px; + background: var(--paper-soft); + border: 1px solid var(--line); + border-radius: 5px; +} + +.segmented button { + min-width: 52px; + padding: 6px 9px; + color: var(--ink-soft); + background: transparent; + border: 0; + border-radius: 3px; + cursor: pointer; + font-size: 11px; + font-weight: 700; + white-space: nowrap; +} + +.segmented button:hover, +.segmented button:focus-visible { + color: var(--ink); + outline: none; +} + +.segmented button.is-active { + color: #fff; + background: var(--ink); +} + +.theme-filter button { + min-width: auto; +} + +.evidence-summary { + display: flex; + align-items: center; + justify-content: space-between; + min-height: 54px; + border-bottom: 1px solid var(--line-strong); +} + +.evidence-summary p { + margin: 0; + color: var(--ink-soft); + font-size: 12px; +} + +.evidence-summary button { + padding: 6px 0; + color: var(--teal); + background: transparent; + border: 0; + cursor: pointer; + font-size: 12px; + font-weight: 750; +} + +.evidence-summary button:hover, +.evidence-summary button:focus-visible { + color: var(--ink); + outline: none; +} + +.evidence-list { + border-bottom: 1px solid var(--line-strong); +} + +.evidence-item { + border-top: 1px solid var(--line); +} + +.evidence-item:first-child { + border-top: 0; +} + +.evidence-item summary { + display: grid; + grid-template-columns: 96px minmax(0, 1fr) auto; + gap: 18px; + align-items: center; + min-height: 86px; + padding: 14px 8px; + cursor: pointer; + list-style: none; +} + +.evidence-item summary::-webkit-details-marker { + display: none; +} + +.evidence-item summary:hover, +.evidence-item summary:focus-visible { + background: var(--paper); + outline: none; +} + +.evidence-id { + color: var(--ink-soft); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 11px; +} + +.evidence-heading { + min-width: 0; +} + +.evidence-heading h3 { + margin: 0; + font-size: 15px; + line-height: 1.5; + overflow-wrap: anywhere; +} + +.evidence-tags { + display: flex; + flex-wrap: wrap; + gap: 6px; + margin-top: 6px; +} + +.evidence-tag { + padding: 2px 6px; + color: var(--ink-soft); + background: var(--paper-soft); + border-radius: 2px; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 9px; + font-weight: 750; + line-height: 1.4; +} + +.evidence-tag.core { + color: #055b53; + background: var(--teal-soft); +} + +.evidence-tag.support { + color: #2f537c; + background: var(--blue-soft); +} + +.evidence-tag.context { + color: #73520e; + background: var(--amber-soft); +} + +.evidence-open { + color: var(--teal); + font-size: 11px; + font-weight: 750; +} + +.evidence-detail { + display: grid; + grid-template-columns: repeat(3, minmax(0, 1fr)); + gap: 1px; + margin: 0 8px 18px 122px; + background: var(--line); + border: 1px solid var(--line); +} + +.evidence-detail.context-detail { + grid-template-columns: 1fr; +} + +.evidence-detail > div { + min-width: 0; + padding: 16px; + background: var(--paper); +} + +.evidence-detail h4 { + margin: 0 0 6px; + color: var(--ink-soft); + font-size: 10px; + text-transform: uppercase; +} + +.evidence-detail p { + margin: 0; + color: #303a35; + font-size: 12px; + line-height: 1.7; +} + +.evidence-detail .evidence-boundary { + background: #fbf6f5; +} + +.evidence-source { + display: flex; + justify-content: flex-end; + margin: -4px 8px 18px; +} + +.evidence-source a { + color: var(--blue); + font-size: 11px; + font-weight: 700; +} + +.empty-evidence { + padding: 40px 0; + color: var(--ink-soft); + text-align: center; +} + +.unknown-layout { + display: grid; + grid-template-columns: repeat(2, minmax(0, 1fr)); + gap: 70px; +} + +.unknown-layout h3 { + margin: 0 0 18px; + font-size: 17px; +} + +.unknown-list, +.prediction-list { + margin: 0; + padding: 0; + border-top: 1px solid var(--line-strong); + list-style: none; +} + +.unknown-list li, +.prediction-list li { + display: grid; + grid-template-columns: 38px 1fr; + gap: 12px; + padding: 14px 0; + border-bottom: 1px solid var(--line); +} + +.unknown-list span, +.prediction-list span { + color: var(--red); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 10px; + font-weight: 800; +} + +.prediction-list span { + color: var(--teal); +} + +.unknown-list p, +.prediction-list p { + margin: 0; + color: #303a35; + font-size: 13px; + line-height: 1.65; +} + +.prediction-list strong { + color: var(--teal); + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 0.92em; +} + +.site-footer { + display: flex; + gap: 40px; + align-items: flex-end; + justify-content: space-between; + width: min(100%, var(--content)); + margin: 0 auto; + padding: 42px 40px 56px; +} + +.site-footer strong { + font-size: 13px; +} + +.site-footer p { + max-width: 760px; + margin: 7px 0 0; + color: var(--ink-soft); + font-size: 11px; +} + +.site-footer a { + color: var(--blue); +} + +.footer-meta { + display: flex; + gap: 8px; + flex-wrap: wrap; + justify-content: flex-end; +} + +.footer-meta span { + padding: 3px 7px; + color: var(--ink-soft); + background: var(--paper-soft); + border-radius: 2px; + font-family: ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; + font-size: 9px; +} + +.noscript-note { + margin: 0; + padding: 12px; + color: #fff; + background: var(--red); + font-size: 12px; + text-align: center; +} + +@media (max-width: 1120px) { + .site-header { + grid-template-columns: auto 1fr; + } + + .primary-nav { + grid-column: 1 / -1; + grid-row: 2; + justify-content: flex-start; + overflow-x: auto; + margin: 0 -28px; + padding: 6px 28px 9px; + border-top: 1px solid var(--line); + scrollbar-width: none; + } + + .primary-nav::-webkit-scrollbar { + display: none; + } + + .site-header { + min-height: auto; + padding-top: 12px; + } + + :root { + --header-height: 116px; + } + + .cover { + grid-template-columns: 1fr 380px; + gap: 42px; + } + + .cover h1 { + font-size: 52px; + } + + .capability-grid { + grid-template-columns: repeat(3, minmax(0, 1fr)); + } + + .capability-grid article:nth-child(4) { + border-left: 0; + border-top: 1px solid var(--line); + } + + .capability-grid article:nth-child(5) { + border-top: 1px solid var(--line); + } + + .system-flow { + grid-template-columns: repeat(4, minmax(0, 1fr)); + } + + .system-flow li:nth-child(5) { + padding-left: 0; + border-top: 1px solid var(--line); + border-left: 0; + } + + .system-flow li:nth-child(n + 6) { + border-top: 1px solid var(--line); + } + + .evidence-tools { + grid-template-columns: 1fr 1fr; + } + + .evidence-search { + grid-column: 1 / -1; + } +} + +@media (max-width: 840px) { + :root { + --header-height: 111px; + } + + .site-header { + padding: 10px 18px 0; + } + + .brand small { + display: none; + } + + .header-actions a { + padding-right: 5px; + padding-left: 5px; + font-size: 11px; + } + + .primary-nav { + margin: 0 -18px; + padding-right: 18px; + padding-left: 18px; + } + + .section-shell { + padding: 70px 24px; + } + + .cover { + grid-template-columns: 1fr; + gap: 42px; + padding-top: 56px; + } + + .cover-copy { + max-width: 700px; + } + + .completion-figure { + max-width: 620px; + } + + .audit-strip { + grid-template-columns: repeat(2, 1fr); + gap: 20px 0; + } + + .audit-strip > div:nth-child(3) { + padding-left: 0; + border-left: 0; + } + + .split-heading { + grid-template-columns: 1fr; + gap: 14px; + } + + .conclusion-list { + grid-template-columns: 1fr; + } + + .conclusion-list li:nth-child(odd) { + border-right: 0; + } + + .capability-grid { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .capability-grid article:nth-child(3), + .capability-grid article:nth-child(5) { + border-left: 0; + } + + .capability-grid article:nth-child(n + 3) { + border-top: 1px solid var(--line); + } + + .research-question { + grid-template-columns: 1fr; + gap: 10px; + } + + .two-chain-model { + grid-template-columns: 1fr; + } + + .verifier-roles { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .verifier-roles > div:nth-child(3) { + padding-left: 0; + border-left: 0; + } + + .finding { + grid-template-columns: 58px minmax(0, 1fr); + } + + .timeline { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .timeline article:nth-child(3) { + padding-left: 0; + border-top: 1px solid var(--line); + border-left: 0; + } + + .timeline article:nth-child(4) { + border-top: 1px solid var(--line); + } + + .progress-verdict { + grid-template-columns: 1fr; + } + + .system-flow { + grid-template-columns: repeat(2, minmax(0, 1fr)); + } + + .system-flow li:nth-child(odd) { + padding-left: 0; + border-left: 0; + } + + .system-flow li:nth-child(n + 3) { + border-top: 1px solid var(--line); + } + + .evidence-tools { + position: static; + grid-template-columns: 1fr; + } + + .evidence-search { + grid-column: auto; + } + + .segmented { + overflow-x: auto; + } + + .evidence-detail { + grid-template-columns: 1fr; + margin-left: 8px; + } + + .unknown-layout { + grid-template-columns: 1fr; + gap: 48px; + } +} + +@media (max-width: 560px) { + :root { + --header-height: 108px; + } + + body { + font-size: 15px; + } + + .brand strong { + font-size: 11px; + } + + .brand-mark { + width: 30px; + height: 30px; + } + + .header-actions a:first-child { + display: none; + } + + .section-shell { + padding: 56px 18px; + } + + .cover { + gap: 34px; + padding-top: 42px; + padding-bottom: 42px; + } + + .cover h1 { + margin-top: 12px; + font-size: 39px; + line-height: 1.22; + } + + .lead { + font-size: 17px; + line-height: 1.8; + } + + .cover-actions { + align-items: stretch; + flex-direction: column; + gap: 8px; + margin-top: 26px; + } + + .primary-link, + .text-link { + justify-content: center; + } + + .completion-figure { + padding: 18px; + box-shadow: 6px 6px 0 var(--line); + } + + .completion-figure figcaption { + align-items: flex-start; + flex-direction: column; + gap: 3px; + } + + .claim-line { + grid-template-columns: 30px 1fr; + } + + .claim-state { + display: none; + } + + .audit-strip { + margin-top: 38px; + } + + .audit-strip > div { + padding: 0 12px; + } + + .audit-strip dd { + font-size: 28px; + } + + .section-heading { + margin-bottom: 30px; + } + + .section-heading h2 { + font-size: 30px; + } + + .conclusion-list a { + grid-template-columns: 30px 1fr; + gap: 0 10px; + min-height: 102px; + padding: 18px 4px; + } + + .conclusion-list strong { + font-size: 16px; + } + + .capability-grid { + grid-template-columns: 1fr; + } + + .capability-grid article { + padding: 20px 4px; + border-top: 1px solid var(--line); + border-left: 0; + } + + .capability-grid article:first-child { + border-top: 0; + } + + .capability-grid article:nth-child(2) { + border-top: 1px solid var(--line); + border-left: 0; + } + + .capability-grid article:nth-child(4) { + border-left: 0; + } + + .research-question p { + font-size: 19px; + } + + .verifier-roles { + grid-template-columns: 1fr; + } + + .verifier-roles > div { + padding: 16px 0; + border-top: 1px solid var(--line); + border-left: 0; + } + + .finding { + grid-template-columns: 1fr; + gap: 7px; + padding: 50px 0; + } + + .finding-number { + font-size: 17px; + } + + .finding h3 { + font-size: 26px; + } + + .finding-thesis { + font-size: 17px; + line-height: 1.8; + } + + .evidence-points { + grid-template-columns: 1fr; + } + + .contrast-table > div { + grid-template-columns: 1fr; + gap: 3px; + padding: 12px 0; + } + + .before-after, + .repair-risk { + grid-template-columns: 1fr; + } + + .before-after .arrow { + height: 24px; + transform: rotate(90deg); + } + + .path-model, + .route-table { + grid-template-columns: 1fr; + } + + .route-table > div:nth-child(odd) { + border-right: 0; + } + + .route-table > div:nth-child(even) { + padding-left: 0; + } + + .timeline { + grid-template-columns: 1fr; + } + + .timeline article, + .timeline article:first-child, + .timeline article:nth-child(3) { + padding: 22px 0; + border-top: 1px solid var(--line); + border-left: 0; + } + + .timeline article:first-child { + border-top: 0; + } + + .timeline h3 { + min-height: 0; + } + + .system-flow { + grid-template-columns: 1fr; + } + + .system-flow li, + .system-flow li:first-child, + .system-flow li:nth-child(5), + .system-flow li:nth-child(odd) { + display: grid; + grid-template-columns: 32px 1fr; + gap: 10px; + padding: 15px 0; + border-top: 1px solid var(--line); + border-left: 0; + } + + .system-flow li:first-child { + border-top: 0; + } + + .system-flow strong { + margin-top: 0; + } + + .system-flow p { + grid-column: 2; + } + + .certificate-preview { + box-shadow: 6px 6px 0 var(--line); + } + + .certificate-header { + align-items: flex-start; + flex-direction: column; + gap: 6px; + } + + .certificate-preview dl > div { + grid-template-columns: 1fr; + gap: 3px; + } + + .evidence-tools { + gap: 14px; + } + + .filter-group { + min-width: 0; + } + + .segmented { + width: 100%; + } + + .evidence-summary { + align-items: flex-start; + flex-direction: column; + justify-content: center; + padding: 10px 0; + } + + .evidence-item summary { + grid-template-columns: 1fr auto; + gap: 8px 12px; + padding: 16px 2px; + } + + .evidence-id { + grid-column: 1 / -1; + } + + .evidence-heading h3 { + font-size: 14px; + } + + .evidence-detail { + margin: 0 0 16px; + } + + .evidence-source { + margin-right: 0; + } + + .site-footer { + align-items: flex-start; + flex-direction: column; + padding: 34px 18px 44px; + } + + .footer-meta { + justify-content: flex-start; + } +} + +@media (prefers-reduced-motion: reduce) { + html { + scroll-behavior: auto; + } + + .reading-progress span { + transition: none; + } +} diff --git a/evaluation-site/assets/research.js b/evaluation-site/assets/research.js new file mode 100644 index 0000000..81bf407 --- /dev/null +++ b/evaluation-site/assets/research.js @@ -0,0 +1,296 @@ +(() => { + "use strict"; + + const evidenceData = window.K1412_EVIDENCE; + const evidenceList = document.querySelector("#evidence-list"); + const evidenceCount = document.querySelector("#evidence-count"); + const emptyEvidence = document.querySelector("#empty-evidence"); + const searchInput = document.querySelector("#evidence-search"); + const expandButton = document.querySelector("#expand-evidence"); + const depthButtons = [...document.querySelectorAll("[data-depth]")]; + const themeButtons = [...document.querySelectorAll("[data-theme]")]; + + const depthLabels = { + core: "核心证据", + support: "旁证", + context: "历史背景", + }; + + const themeLabels = { + verification: "完成证明", + protocol: "协议审计", + recovery: "失败恢复", + reliability: "风险可靠性", + context: "历史背景", + }; + + const state = { + query: "", + depth: "all", + theme: "all", + expanded: false, + }; + + function normalize(value) { + return String(value || "") + .toLocaleLowerCase("zh-CN") + .replace(/\s+/g, " ") + .trim(); + } + + function searchableText(record) { + return normalize( + [ + record.id, + record.title, + record.depth, + record.theme, + record.evidence, + record.supports, + record.boundary, + ].join(" ") + ); + } + + function filteredRecords() { + if (!evidenceData || !Array.isArray(evidenceData.records)) { + return []; + } + + const terms = normalize(state.query).split(" ").filter(Boolean); + return evidenceData.records.filter((record) => { + if (state.depth !== "all" && record.depth !== state.depth) { + return false; + } + if (state.theme !== "all" && record.theme !== state.theme) { + return false; + } + const haystack = searchableText(record); + return terms.every((term) => haystack.includes(term)); + }); + } + + function tag(label, className) { + const element = document.createElement("span"); + element.className = `evidence-tag ${className || ""}`.trim(); + element.textContent = label; + return element; + } + + function detailColumn(title, text, className = "") { + const wrapper = document.createElement("div"); + wrapper.className = className; + + const heading = document.createElement("h4"); + heading.textContent = title; + const paragraph = document.createElement("p"); + paragraph.textContent = text || "本轮未将该论文用于直接论证。"; + + wrapper.append(heading, paragraph); + return wrapper; + } + + function evidenceItem(record) { + const details = document.createElement("details"); + details.className = "evidence-item"; + details.dataset.depth = record.depth; + details.open = state.expanded; + + const summary = document.createElement("summary"); + + const id = document.createElement("span"); + id.className = "evidence-id"; + id.textContent = record.id; + + const heading = document.createElement("div"); + heading.className = "evidence-heading"; + const title = document.createElement("h3"); + title.textContent = record.title; + const tags = document.createElement("div"); + tags.className = "evidence-tags"; + tags.append( + tag(depthLabels[record.depth] || record.depth, record.depth), + tag(themeLabels[record.theme] || record.theme) + ); + heading.append(title, tags); + + const openLabel = document.createElement("span"); + openLabel.className = "evidence-open"; + openLabel.textContent = details.open ? "收起" : "展开"; + + summary.append(id, heading, openLabel); + details.append(summary); + + if (record.depth === "context") { + const detail = document.createElement("div"); + detail.className = "evidence-detail context-detail"; + detail.append( + detailColumn("本轮位置", record.boundary, "evidence-boundary") + ); + details.append(detail); + } else { + const detail = document.createElement("div"); + detail.className = "evidence-detail"; + detail.append( + detailColumn("核过的直接证据", record.evidence), + detailColumn("可支持的判断", record.supports), + detailColumn("不能外推", record.boundary, "evidence-boundary") + ); + details.append(detail); + } + + const source = document.createElement("div"); + source.className = "evidence-source"; + const sourceLink = document.createElement("a"); + sourceLink.href = record.url; + sourceLink.target = "_blank"; + sourceLink.rel = "noreferrer"; + sourceLink.textContent = "打开 arXiv 原文"; + source.append(sourceLink); + details.append(source); + + details.addEventListener("toggle", () => { + openLabel.textContent = details.open ? "收起" : "展开"; + }); + + return details; + } + + function updateFilterButtons(buttons, value, attribute) { + buttons.forEach((button) => { + const active = button.dataset[attribute] === value; + button.classList.toggle("is-active", active); + button.setAttribute("aria-pressed", String(active)); + }); + } + + function renderEvidence() { + if (!evidenceData) { + evidenceCount.textContent = "证据数据未载入。"; + emptyEvidence.hidden = false; + return; + } + + const records = filteredRecords(); + const fragment = document.createDocumentFragment(); + records.forEach((record) => fragment.append(evidenceItem(record))); + evidenceList.replaceChildren(fragment); + + const counts = evidenceData.counts; + evidenceCount.textContent = + `显示 ${records.length} / ${counts.pool} 篇` + + ` · 核心 ${counts.core} · 旁证 ${counts.support} · 背景 ${counts.context}`; + emptyEvidence.hidden = records.length !== 0; + expandButton.disabled = records.length === 0; + expandButton.textContent = state.expanded ? "收起当前结果" : "展开当前结果"; + } + + depthButtons.forEach((button) => { + button.addEventListener("click", () => { + state.depth = button.dataset.depth; + state.expanded = false; + updateFilterButtons(depthButtons, state.depth, "depth"); + renderEvidence(); + }); + }); + + themeButtons.forEach((button) => { + button.addEventListener("click", () => { + state.theme = button.dataset.theme; + state.expanded = false; + updateFilterButtons(themeButtons, state.theme, "theme"); + renderEvidence(); + }); + }); + + searchInput?.addEventListener("input", (event) => { + state.query = event.target.value; + state.expanded = false; + renderEvidence(); + }); + + expandButton?.addEventListener("click", () => { + state.expanded = !state.expanded; + document.querySelectorAll(".evidence-item").forEach((item) => { + item.open = state.expanded; + const label = item.querySelector(".evidence-open"); + if (label) { + label.textContent = state.expanded ? "收起" : "展开"; + } + }); + expandButton.textContent = state.expanded ? "收起当前结果" : "展开当前结果"; + }); + + function updateReadingProgress() { + const documentHeight = + document.documentElement.scrollHeight - window.innerHeight; + const progress = documentHeight > 0 ? window.scrollY / documentHeight : 0; + const bar = document.querySelector("#reading-progress"); + if (bar) { + bar.style.width = `${Math.min(1, Math.max(0, progress)) * 100}%`; + } + } + + let progressFrame = 0; + window.addEventListener( + "scroll", + () => { + if (progressFrame) { + return; + } + progressFrame = window.requestAnimationFrame(() => { + updateReadingProgress(); + progressFrame = 0; + }); + }, + { passive: true } + ); + updateReadingProgress(); + + const navAliases = { + conclusions: "overview", + synthesis: "model", + }; + const navLinks = [...document.querySelectorAll(".primary-nav a")]; + const sections = [...document.querySelectorAll("[data-section]")]; + + const sectionObserver = new IntersectionObserver( + (entries) => { + const visible = entries + .filter((entry) => entry.isIntersecting) + .sort((a, b) => b.intersectionRatio - a.intersectionRatio)[0]; + if (!visible) { + return; + } + const targetId = navAliases[visible.target.id] || visible.target.id; + navLinks.forEach((link) => { + const active = link.getAttribute("href") === `#${targetId}`; + link.classList.toggle("is-active", active); + if (active) { + const nav = link.closest(".primary-nav"); + if (nav && nav.scrollWidth > nav.clientWidth) { + nav.scrollTo({ + left: Math.max(0, link.offsetLeft - nav.clientWidth / 2), + behavior: "smooth", + }); + } + } + }); + }, + { + rootMargin: "-18% 0px -62% 0px", + threshold: [0, 0.08, 0.2], + } + ); + sections.forEach((section) => sectionObserver.observe(section)); + + renderEvidence(); + + if (window.location.hash) { + window.requestAnimationFrame(() => { + window.requestAnimationFrame(() => { + document.querySelector(window.location.hash)?.scrollIntoView(); + }); + }); + } +})(); diff --git a/evaluation-site/build_research_data.py b/evaluation-site/build_research_data.py new file mode 100644 index 0000000..fb3b521 --- /dev/null +++ b/evaluation-site/build_research_data.py @@ -0,0 +1,136 @@ +#!/usr/bin/env python3 +"""Build the browser evidence index from the committed Markdown ledger.""" + +from __future__ import annotations + +import argparse +import hashlib +import json +import re +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +LEDGER = ROOT / "research" / "completion-verification" / "evidence-ledger.md" +OUTPUT = ROOT / "evaluation-site" / "assets" / "evidence-data.js" + +SECTION_SLUGS = { + "完成证明与 evaluator 误差": "verification", + "测试、benchmark 和协议会不会错误认证": "protocol", + "故障发现、定位和恢复": "recovery", + "变更风险、协作和重复可靠性": "reliability", + "全文池与排除": "context", +} + + +def parse_link(value: str) -> tuple[str, str]: + match = re.fullmatch(r"\[([^\]]+)\]\((https?://[^)]+)\)", value.strip()) + if not match: + raise ValueError(f"Invalid paper link: {value}") + return match.group(1), match.group(2) + + +def parse_ledger(text: str) -> list[dict[str, str]]: + section = "" + records: list[dict[str, str]] = [] + + for raw_line in text.splitlines(): + heading = re.match(r"^## \d+\.\s+(.+)$", raw_line) + if heading: + title = heading.group(1).strip() + section = SECTION_SLUGS.get(title, "") + continue + + if not raw_line.startswith("| ["): + continue + + columns = [column.strip() for column in raw_line.strip().strip("|").split("|")] + if len(columns) not in {3, 5}: + raise ValueError(f"Unexpected table row with {len(columns)} columns: {raw_line}") + + title, url = parse_link(columns[0]) + arxiv_match = re.search(r"(\d{4}\.\d{5})", url) + if not arxiv_match: + raise ValueError(f"Missing arXiv id: {url}") + arxiv_id = arxiv_match.group(1) + title = re.sub(rf",\s*{re.escape(arxiv_id)}$", "", title) + + record = { + "id": arxiv_id, + "title": title, + "url": url, + "depth": columns[1], + "theme": section, + } + + if len(columns) == 5: + record.update( + { + "evidence": columns[2], + "supports": columns[3], + "boundary": columns[4], + } + ) + else: + record.update( + { + "evidence": "", + "supports": "", + "boundary": columns[2], + } + ) + + records.append(record) + + return records + + +def build_payload(text: str) -> dict[str, object]: + records = parse_ledger(text) + counts = { + "pool": len(records), + "audited": sum(record["depth"] in {"core", "support"} for record in records), + "core": sum(record["depth"] == "core" for record in records), + "support": sum(record["depth"] == "support" for record in records), + "context": sum(record["depth"] == "context" for record in records), + } + return { + "source": "research/completion-verification/evidence-ledger.md", + "source_sha256": hashlib.sha256(text.encode("utf-8")).hexdigest(), + "counts": counts, + "records": records, + } + + +def render(payload: dict[str, object]) -> str: + body = json.dumps(payload, ensure_ascii=False, separators=(",", ":")) + return ( + "/* Generated by evaluation-site/build_research_data.py. */\n" + f"window.K1412_EVIDENCE={body};\n" + ) + + +def main() -> int: + parser = argparse.ArgumentParser() + parser.add_argument( + "--check", + action="store_true", + help="Fail if the generated browser data is stale.", + ) + args = parser.parse_args() + + expected = render(build_payload(LEDGER.read_text(encoding="utf-8"))) + if args.check: + if not OUTPUT.exists() or OUTPUT.read_text(encoding="utf-8") != expected: + print(f"stale: {OUTPUT.relative_to(ROOT)}") + return 1 + print(f"ok: {OUTPUT.relative_to(ROOT)}") + return 0 + + OUTPUT.write_text(expected, encoding="utf-8") + print(f"wrote: {OUTPUT.relative_to(ROOT)}") + return 0 + + +if __name__ == "__main__": + raise SystemExit(main()) diff --git a/evaluation-site/evaluation-v1.html b/evaluation-site/evaluation-v1.html new file mode 100644 index 0000000..fd7230b --- /dev/null +++ b/evaluation-site/evaluation-v1.html @@ -0,0 +1,353 @@ + + +
+ + + + +K1412 Agent Evaluation v1 · 2026.07.27
++ 固定模型、任务、工作区和预算,只改变一个 Agent 行为假设。 + 用独立验证回答它改善了什么、破坏了什么,以及证据是否足以进入生产。 +
++ 下面是方法演算,不是真实跑分。它使用与仓库评分器一致的配对逻辑和统计口径。 +
++ 新增成功多于回归,且没有安全或假完成阻断项。进入轨迹复核,而不是直接发布。 +
+ +真实模型评测建立在单测、隔离和伪模型链路之上,不替代它们。
+单元与策略门禁
++ 检查参数规范化、完成证据、权限和事件顺序。每次提交运行,不调用真实模型。 +
+最终状态、命令结果和副作用 Validator 才决定任务是否真的完成。
+没有匹配的任务。
+网页是阅读入口,Git 仓库仍是事实源。
+python3 tools/evaluation/score_agent_runs.py results.jsonl --baseline v3 --variant v4 --format markdown
+
+ Implementation order
+抽出 LiveEvalRunner从现有单次脚本提取可复用运行器。
接入独立 Validator先覆盖脚本报告与数据分析两个任务。
导出 Result JSONL固定模型、Prompt、工具、镜像、预算与版本。
运行配对 Smoke确定性层全部通过后才调用真实模型。
复核回归轨迹检查 gains、regressions、both-fail 与假完成。
K1412 Agent Evaluation v1 · 2026.07.27
-- 固定模型、任务、工作区和预算,只改变一个 Agent 行为假设。 - 用独立验证回答它改善了什么、破坏了什么,以及证据是否足以进入生产。 -
+FULL-TEXT RESEARCH AUDIT · 2026.07.27
++ 完成不是 Agent 的一句话,也不是 benchmark 里的一个绿色勾。 + 它是关于外部世界的证据合同:目标效果发生了、禁止效果没有发生、 + 必要过程没有被绕过,证明不到的部分仍被诚实保留。 +
+ - -缺少任意一层,都只能说“部分可证”,不能用自信语气补齐。
+ + +01 · 先读结论
+先建立判断框架,再进入论文、数字和例外。
+02 · 能力拆解
+- 下面是方法演算,不是真实跑分。它使用与仓库评分器一致的配对逻辑和统计口径。 + “题有没有做完”只是结果位。真正可诊断的评估,需要知道哪一段能力发生了变化。
+- 新增成功多于回归,且没有安全或假完成阻断项。进入轨迹复核,而不是直接发布。 -
- -负责机器可观察的效果和禁止副作用。精确、可复现,但合同昂贵且覆盖有限。
+负责确认、授权、顺序和禁止动作。能看过程,但过严时会拒绝合法路径。
+负责剩余语义、等价路径和部分进展。适合辅助判断,不适合独立发布认证。
+负责高风险、冲突、不可观察和价值判断。不是无限资源,应由明确异常触发。
04 · 逐条论证
+真实模型评测建立在单测、隔离和伪模型链路之上,不替代它们。
-每一条都同时保留直接证据和不能外推的边界。
+ -单元与策略门禁
-
- 检查参数规范化、完成证据、权限和事件顺序。每次提交运行,不调用真实模型。
+ COMPLETION
+ Agent 的语言只能报告完成,不能构成完成。可相信的对象是外部状态、禁止副作用、
+ 必要过程和仍未被观察的部分。
+ tau-bench、AppWorld 和 OSWorld 把完成落到数据库、文件或桌面状态;
+ AppWorld 还检查允许集合之外是否出现额外变化。Procedure-Aware Evaluation
+ 又证明,状态成功仍可能绕过必要确认和策略。
+
+ 这些比例来自不同子集,不能直接互比。结论不是“形式化一切”,而是系统只能在
+ 证据覆盖范围内声称完成;开放任务需要保留 PROTOCOL
+ 一个 Agent 分数实际衡量的是模型、prompt、orchestrator、工具、环境、用户模拟器、
+ verifier、预算和版本的乘积。
+
+ DynamicMCPBench 的 126 次 live 重放中,只有 36% 返回完全相同,33% 漂移,
+ 32% 已损坏。AgentLens 的 provider 工具参数解析故障,也会被误读成模型能力差。
+
+ 因此每个结果都要携带模型版本、prompt、工具、环境快照、validator、预算和种子。
+ 没有 manifest,跨版本分数没有稳定含义。
+ VERIFIER
+ 规则判分更容易漏报,模型 judge 更容易误报。可靠方案不是让两者投票,
+ 而是让它们承担不同责任。
+
+ AgentRewardBench 给出了 precision/recall 对照;AJ-Bench 中让 judge 使用工具
+ 虽然明显改善判断,不同任务域 false-positive rate 仍为 8.77%-56.60%。
+ AgentLens 的两个 judge 在 23% 比较上选择不同赢家。
+
+ LLM judge 可以处理规则未覆盖的语义等价,也可以提出异常;它不应单独把一个
+ 确定性失败降级为成功。
+ INDEPENDENCE
+ 同一个 Agent 同时行动、解释和批准自己,会形成最危险的确认偏差闭环。
+ verifier 应拥有 actor 无法伪造的状态、权限和重放环境。
+
+ RECEIPT 的消融说明,关键变化来自浏览器判决、隔离、可重放 PoC 和角色分离,
+ 不是让 judge 再思考一轮。
+
+ 这是单模型、白盒 XSS 和特定 harness 的结果,不能当通用精度保证;它支持的是
+ 分权原则,而不是那组绝对分数。
+ EQUIVALENCE
+ 实现路径原则上可以等价;授权、确认、来源和不可逆操作如果属于任务义务,
+ 则必须被证明。两者不能混为一谈。
+
+ AppWorld 用状态测试允许多个合法实现;DynamicMCPBench 采用 path-agnostic
+ effect scoring,并发现 reference answer 完全正确的比例只有 79%。
+ ToolSandbox 则用 milestone DAG 与 minefield 同时保留弹性和禁止动作。
+ RECOVERY
+ 发现错误、定位原因、选择响应、执行恢复、再次证明,是五个不同的能力。
+ 只展示最终分数,会隐藏增益究竟来自诊断、更多尝试还是更强 fallback。
+
+ Hell or High Water 保证存在短替代路径,模型仍下降约 22-30 个成功率点。
+ R2Act 中根因服务定位可达 91.4%-99.7%,恢复动作有效率却只有 36.8%-60.3%。
+
+ AgentDebugX 的 GAIA 对照比较的是完整 recipe,且可见参考答案,不能把全部增益
+ 归因于定位方法。
+ ROUTING
+ 重试适合瞬时且幂等的错误;局部修复适合已定位错误;重规划适合路径失效;
+ 回滚处理已有副作用;升级和停止处理权限、能力与不可逆风险。
+
+ CodeRescue 的固定 reflect / replan / escalate 恢复率分别为
+ 27.5% / 45.3% / 68.6%,学习 router 为 81.7%。可恢复失败中,
+ 28% 只能由便宜策略解决,45% 只能升级解决,27% 两者均可。
+
+ 这是代码任务、特定模型和单次路由结果;它支持“策略依赖状态”,
+ 不证明该 router 可以直接进入生产。
+ STOPPING
+ 重复询问同一个有偏 judge,只会得到更稳定的偏差。只有新增独立证据或改变恢复策略,
+ 下一轮才有信息价值。
+
+ VRR-Stop 的巨大差值来自刻意制造的 verifier/repair mismatch,不能解释成一般收益。
+ 但 Reflexion、CRITIC 和 AgentLTL 也分别观察到无测试反思、错误修改和强制终止回归。
+
+ 停止条件至少要问:有没有新独立证据、失败类型是否变化、状态是否改善、
+ 下一步是否可逆、预期收益是否仍大于成本和风险。
+ 05 · 发展脉络 最终状态、命令结果和副作用 Validator 才决定任务是否真的完成。 这不是一条成功率持续上涨的曲线,而是研究对象逐步被拆开。 Reflexion、CRITIC、自调试证明外部执行反馈有用。 WebArena、SWE-bench、tau-bench、AppWorld、OSWorld 引入状态、轨迹与 `pass^k`。 AgentRewardBench、SWE 测试审计、tau2、AgentDebug、替代路径 benchmark。 PAE、AgentLTL、RECEIPT、ToolMaze、CodeRescue、VRR-Stop、DynamicMCPBench。完成是证据合同,不是最终文本
+ 证据与边界
+ AMBIGUOUS 和
+ UNVERIFIABLE。
+ 评估对象是整个运行协议,不只是模型
+
+ model × prompt × orchestrator × tools × environment
+× user/simulator × verifier × budget × version证据与边界
+ 不存在一个通用 verifier
+ 证据与边界
+ verifier 必须与 actor 分权
+ 证据与边界
+ 验证效果,不要要求复制 gold path
+ 证据与边界
+ 验证失败不等于会恢复
+ 证据与边界
+ 恢复策略必须依赖失败状态
+ 证据与边界
+ 没有新证据的恢复循环会开始破坏结果
+ 证据与边界
+
-
任务描述不是真值
+ 最近的进步,主要是把失败说清楚
让模型根据反馈自我修正
+ 检查 Agent 是否真的改变环境
+ 开始审计 evaluator 和故障恢复
+ 验证过程、隔离证据、路由并停止
+