From a20f7146c023cc984201f0a7e4312ff3b48ddb74 Mon Sep 17 00:00:00 2001 From: dingyucanada <15076805+dingyucanada@users.noreply.github.com> Date: Sun, 16 Aug 2026 16:57:05 +0800 Subject: [PATCH] Reframe product story and publish interactive demo --- .github/workflows/pages.yml | 2 +- CITATION.cff | 2 + README.md | 348 ++++++------------ artifacts/external-evidence/claim-status.json | 13 +- config/trust/action-issuers.json | 2 +- demo/README.md | 13 +- demo/app.js | 298 +++++++++++++-- demo/data/scenarios.json | 10 +- demo/index.html | 218 ++++++++--- demo/styles.css | 212 +++++------ docs/95-plus-evidence-runbook.md | 207 ----------- docs/agentteams-official-mapping.md | 2 +- docs/architecture.md | 2 +- docs/competition-research.md | 121 ------ ....png => console-compensated-reference.png} | Bin docs/defense-qa.md | 101 ----- docs/demo-script.md | 109 ------ docs/demo-video-script-v2.md | 227 ------------ docs/deployment.md | 2 +- docs/evaluation.md | 4 +- docs/judge-scorecard.md | 33 -- docs/public-dataset-benchmark.md | 2 +- docs/public-demo-boundary.md | 38 +- docs/submission-copy.md | 42 --- docs/winning-solution.md | 93 ----- pyproject.toml | 5 + sbom.cdx.json | 4 +- .../run_authorization_contract_replay.py | 2 +- scripts/build_public_demo.py | 7 +- scripts/build_release.py | 2 - scripts/generate_reference_artifacts.py | 2 +- scripts/validate_external_evidence.py | 10 +- .../benchmarks/authorization_replay.py | 2 +- src/proofmesh/static/index.html | 2 +- tests/test_api_contract.py | 2 +- tests/test_clean_runtime.py | 2 +- tests/test_public_demo.py | 45 +++ 37 files changed, 745 insertions(+), 1441 deletions(-) delete mode 100644 docs/95-plus-evidence-runbook.md delete mode 100644 docs/competition-research.md rename docs/{judge-console-compensated-current.png => console-compensated-reference.png} (100%) delete mode 100644 docs/defense-qa.md delete mode 100644 docs/demo-script.md delete mode 100644 docs/demo-video-script-v2.md delete mode 100644 docs/judge-scorecard.md delete mode 100644 docs/submission-copy.md delete mode 100644 docs/winning-solution.md create mode 100644 tests/test_public_demo.py diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index 2c35d3f..2491bd1 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -1,4 +1,4 @@ -name: Deploy read-only evidence replay +name: Deploy interactive action decision lab on: push: diff --git a/CITATION.cff b/CITATION.cff index 05db2cb..cbedb4d 100644 --- a/CITATION.cff +++ b/CITATION.cff @@ -5,6 +5,8 @@ type: software version: 1.0.0 license: Apache-2.0 date-released: 2026-08-13 +repository-code: "https://github.com/dingyucanada/ProofMesh" +url: "https://dingyucanada.github.io/ProofMesh/" abstract: >- A policy-bound execution and evidence control plane for multi-agent business side effects, with Action Passports, recoverable operations, Human approval, diff --git a/README.md b/README.md index 4d6b726..4aaf216 100644 --- a/README.md +++ b/README.md @@ -1,53 +1,88 @@ # ProofMesh — Agent Action Control Plane -> 模型可以提出退款,但不能直接拿到付款按钮。 +Agent 已经能查订单、改工单、发起退款、执行发布。企业真正犹豫的是最后一步:**当一次写操作超时、参数变化或需要审批时,系统怎么保证它不会多做一次、做错对象,或者在事后说不清发生了什么?** -一笔 90 元退款已经在支付侧成功,CRM 关单却失败。如果 Agent 把报错当成“没有执行”再次重试,客户可能收到两笔退款。 +ProofMesh 是放在 Agent 协作层与企业工具之间的动作控制面。AgentTeams 负责任务分工,ProofMesh 负责每一次有副作用的动作:先确定这次允许做什么,再执行;遇到不确定结果先对账;最后留下可以独立复核的证据。 -ProofMesh 位于 AgentTeams 与支付、CRM 等写工具之间: +[在线动作决策台](https://dingyucanada.github.io/ProofMesh/) · [10 分钟本地复现](#10-分钟本地复现) · [架构说明](docs/architecture.md) · [安全边界](SECURITY.md) -- **Action Passport** 冻结主体、租户、工具、参数、审批与时效; -- **Action Gateway** 在执行瞬间逐项核对,写操作不能绕过; -- **reconcile-before-retry** 先查询上游结果,查不清就停止; -- **External Verifier** 使用 Proof 包外公钥复核审批、回执与业务终态。 +## 为什么企业需要这一层 -[只读在线演示](https://dingyucanada.github.io/ProofMesh/) · [10 分钟复现](#10-分钟复现) · [架构说明](docs/architecture.md) · [公网演示边界](docs/public-demo-boundary.md) · [安全边界](SECURITY.md) +常见的 Agent 工具链已经能回答“这个角色能不能调用退款接口”。它通常回答不了更细的四个问题: -当前已有 Team=`Active`、7/7 Worker=`Running`、direct MCP 生命周期 7/7 与 162 项测试。边界同样明确:`modelDriven=false`,没有接入真实支付/CRM 账户,也没有客户生产试点。 +- 这一次调用允许处理哪个租户、哪笔业务对象和哪些参数? +- 人工审批批准的是原计划,还是审批后被替换过的计划? +- 上游已经执行但响应丢失时,能否安全重试? +- 审计者能否在不信任执行方的情况下,复核审批、回执和最终业务状态? -本地参考环境会实际改变隔离商务库:扣减可退款余额、创建退款、关闭工单,并在下游故障时执行补偿恢复。它不是生产系统,也不是返回固定答案的聊天动画。 +退款只是其中一个例子。同样的问题也会出现在生产发布、配置变更、理赔付款、授信调整和批量消息发送中。它们的共同点不是行业,而是都会改变真实业务状态。 -## 一眼看懂 +## ProofMesh 怎么处理一次动作 ```mermaid flowchart LR - AT["AgentTeams running collaboration plane\nTeam Active · direct MCP 7/7"] --> C["CAS Workflow\nL2 deterministic run"] - H["Independent Human"] --> C - C -->|"short-lived Action Passport"| G["MCP Action Gateway"] - G -->|"fenced logical operation"| B["Payments / CRM / Memory"] - B -->|"result or reconciliation"| G - G --> R["signed receipts + chain"] - C --> P["sealed workflow proof"] - X["external trust + pinned policy"] --> V["semantic verifier"] - P --> V + AT["AgentTeams\n分工与状态同步"] --> WF["Workflow\n冻结计划"] + HU["Human\n只负责审批"] --> WF + WF --> AP["Action Passport\n本次动作的短时许可证"] + AP --> GW["Action Gateway\n执行前逐项核对"] + GW --> TOOLS["支付 / CRM / 运维工具"] + TOOLS -->|"结果或对账状态"| GW + GW --> PR["签名回执与 Proof"] + TRUST["Proof 包外公钥与策略"] --> VE["External Verifier"] + PR --> VE ``` -| 不是 | 而是 | -|---|---| -| Agent 自己说“我有权限” | 网关在执行瞬间验签并精确匹配工具、资源、参数、金额、策略与审批 | -| 审批按钮顺便执行 | 审批只转 `WAITING_APPROVAL → AUTHORIZED`,Executor 另行领取 | -| JTI 级简单去重 | logical operation 与 credential attempt 分离,owner/generation/lease/fencing | -| 崩溃后盲目重试 | 先按稳定 operation id 向上游对账;不确定进入 `UNKNOWN` | -| 写一条“rollback”日志 | 真实 Saga compensation + 新鲜业务状态回查 | -| Proof 包自带根并自证 | Verifier 使用包外 trust bundle 与钉住策略做跨证据语义核对 | +一次写操作会经过四道约束: -## 10 分钟复现 +1. **Action Passport** 绑定主体、租户、工具、业务对象、参数摘要、策略、审批、调用次数和有效期。 +2. **Action Gateway** 在真正调用工具之前逐项匹配。任何工具、参数或上下文漂移都会被拒绝。 +3. **reconcile-before-retry** 在超时或崩溃后先查询上游结果。确认未执行才重派;无法确认就进入 `UNKNOWN_MANUAL`。 +4. **External Verifier** 使用 Proof 包外的信任材料,重新核对审批、任务回执、工具回执和业务终态。 -环境:Python 3.10+;CI 和推荐复现环境为 Python 3.11。先确认版本: +这套约束位于执行路径上,不依赖模型“记住规则”。模型、Prompt 或业务适配器可以替换,写操作仍要经过同一套合同。 -```bash -python3.11 --version -``` +## 两个参考场景 + +### 客服退款 + +支付渠道已经完成退款,CRM 关单却返回失败。系统不能从一个报错推断“退款没有发生”。ProofMesh 会用稳定的 operation id 查询支付终态,再决定完成、补偿或转人工,避免重复退款。 + +### 生产运维变更 + +发布、配置和回滚同样使用 `AuthorizedToolCaller → Action Passport → Action Gateway → signed Receipt → External Verifier`。仓库包含低风险完成、高风险审批、健康门失败后恢复和无法判定时停止四条参考路径。 + +两套场景共用同一协议,业务工具和策略可以替换。它们都是确定性参考环境,不代表客户生产系统已经接入。 + +## 已经验证到哪一步 + +| 问题 | 当前结果 | 证据边界 | +|---|---:|---| +| 错工具、错参数、错上下文会不会穿过网关 | 0 次错误通过 | AgentDojo 629 组授权合同回放,不是模型 ASR | +| 故障恢复会不会产生重复副作用 | 0 / 240 | 独立进程 HTTP 合成故障,不是客户工单 | +| 可判定的故障能否完成或补偿 | 180 / 180 | 合成沙箱中的四类故障 | +| 上游结果无法判定时是否停止自动重派 | 60 / 60 | 全部进入 `UNKNOWN_MANUAL` | +| AgentTeams 控制面是否真实运行 | Team Active;7/7 Worker Running;direct MCP 7/7 | `modelDriven=false`,尚未证明模型自主协作 | +| 公开客服文本能否安全分流 | Banking77 accuracy 81.79%,退款 recall 85% | 结论为 `NOT_PRODUCTION_READY` | +| CFPB 公开投诉能否无原文落盘地处理 | 240 / 240 | 只做无写操作 shadow,不报告准确率 | + +当前测试集为 **164 passed**。生产身份、托管密钥、真实供应商账户、客户授权数据与生产 SLA 尚未接入。 + +## AgentTeams、Skill、MCP 与 RAG + +项目以 AgentTeams 为协作基点。已验证基线为 `v1.2.0-beta.1`、commit `78d0ceda336befa6e62bf89fc1a6b08b965e128d`;当前 stable `v1.2.2` 是迁移目标,尚未在 ProofMesh 上验证。 + +- **AgentTeams**:1 个 Leader 拆解任务,6 个 Worker 分别处理接入、上下文、策略、执行、验证和记忆;Human 单独审批。 +- **7 个 Skill**:每个角色都有闭合的输入、输出、权限和失败合同。 +- **TeamHarness MCP**:管理 Project / Task 协同与状态传递。 +- **ProofMesh role MCP**:只暴露各角色需要的业务窄口。 +- **Action Gateway**:所有高风险副作用的唯一执行入口。 +- **RAG**:当前不使用。上下文由共享 CAS 状态、脱敏终态记忆和 trace / receipt 可观测性提供。 + +完整映射见 [AgentTeams 官方能力映射](docs/agentteams-official-mapping.md) 与 [Agent Identity 清单](docs/agent-identity-register.md)。 + +## 10 分钟本地复现 + +需要 Python 3.10+,推荐 Python 3.11: ```bash python3.11 -m venv .venv @@ -57,48 +92,18 @@ make clean-runtime pytest -q ``` -运行两条无需模型/API Key 的真实业务路径: +运行低风险完成路径与下游故障补偿路径: ```bash -# 低风险:自动授权 → 退款 → 关单 → 独立回查 → Proof seal PYTHONPATH=src python3 -m proofmesh.cli --home . demo-refund TKT-LOW-001 - -# 下游故障:退款 → CRM 故障 → 补偿 → 余额/工单回查 → Proof seal PYTHONPATH=src python3 -m proofmesh.cli --home . demo-refund TKT-SAGA-001 ``` -高风险路径必须暂停: - -```bash -PYTHONPATH=src python3 -m proofmesh.cli --home . demo-refund TKT-HIGH-001 -# 复制输出中的 WORKFLOW_ID -PYTHONPATH=src python3 -m proofmesh.cli --home . approval-challenge \ - --output /tmp/proofmesh-approval-challenge.json -# 将 challenge 交给独立审批服务;reference issuer 示例及私钥边界见 docs/deployment.md -PYTHONPATH=src python3 -m proofmesh.cli --home . approve \ - --approver separation-of-duties-reviewer \ - --reason '已复核冻结计划、金额、范围与补偿条件' \ - --approval-assertion-file /path/from/external-approval-service/assertion.jws -PYTHONPATH=src python3 -m proofmesh.cli --home . resume -PYTHONPATH=src python3 -m proofmesh.cli --home . verify-proof \ - artifacts/workflows//workflow-proof.json -``` - -固定工单不能被重复退款。重复整场演示前停止服务并再次执行 `make clean-runtime`;公开 benchmark 不会被清除。 - -## 第二业务域:生产运维配置变更 - -除客服退款外,仓库已有可运行的运维变更 reference adapter,复用同一 `AuthorizedToolCaller → Action Passport → Action Gateway → GatewayStore → signed Receipt → external Verifier` 协议路径:低风险成功、高风险外部签名审批、健康门失败后精确恢复,以及不可对账时进入 `UNKNOWN_MANUAL` 并停止自动重派。代码、冻结证据、限制和真实平台迁移合同见 [第二业务域说明](docs/second-domain-operations.md) 与 [operations-reference](artifacts/operations-reference/report.json)。 - -该实现是确定性本地 reference,不是生产集群、客户数据或试点;`risk_units` 不是金额或 ROI。 - -## 评委控制台 - -API 默认 fail closed,没有角色身份就不能变更状态: +本地 FastAPI 控制台: ```bash cp .env.example .env -# 将每个 replace-with-* 替换为不同随机值,然后: +# 将 replace-with-* 替换为不同的随机值 set -a source .env set +a @@ -106,203 +111,76 @@ PROOFMESH_HOME=. PYTHONPATH=src uvicorn proofmesh.api:app \ --host 127.0.0.1 --port 8000 --no-server-header ``` -打开 `http://127.0.0.1:8000`,在“角色凭证”中填入七个 Agent 角色、External Assertion Approver 与 Auditor 共九个 token。高风险门禁还必须粘贴外部审批服务签发的 JWS;API Bearer subject 与 assertion subject 必须一致。Workflow、Gateway、包外 Verifier 三处独立验签,控制面不持审批私钥。参考 issuer 是 synthetic 脚本边界,不冒充企业 IdP 或 MFA。 - -![ProofMesh 补偿终态控制台](docs/judge-console-compensated-current.png) - -## 七角色闭环 +打开 `http://127.0.0.1:8000`。本地参考环境会实际改变隔离数据库,但不会连接真实支付、CRM 或生产系统。重复固定工单前请停止服务并运行 `make clean-runtime`。 -| 阶段 | AgentTeams Worker | 角色 MCP 工具 | 关键约束 | -|---|---|---|---| -| create | `case-orchestrator` | `create_case`, `get_state` | 只创建案件/项目,不串行跑完整流程 | -| normalize | `ticket-intake` | `normalize_case` | 输入闭合、task id、revision CAS | -| context | `context-investigator` | `gather_context` | 新鲜工单/订单读取、context digest | -| policy | `risk-policy-sentinel` | `evaluate_policy` | 冻结 policy snapshot、plan、金额与版本 | -| approval | 外部 `proofmesh-approver` | REST `approve` | assertion issuer allowlist、subject/revision/challenge/action/plan/policy 绑定 | -| execute | `action-executor` | `execute_authorized` | Passport、预算、退款/关单/补偿 Saga | -| verify | `outcome-verifier` | `verify_outcome` | 重新读取余额、退款、工单 postconditions | -| memory | `case-memory-curator` | `curate_memory` | 仅已验证终态可写脱敏经验并 seal proof | +## 公开 Demo -每个转换要求认证角色、租户权限、当前 `expected_revision` 与 `task_id`;状态更新、签名 task receipt 与 outbox 同事务提交。Worker 看不到原始 Action Passport,无法把它复制到另一个工具。 +[GitHub Pages 动作决策台](https://dingyucanada.github.io/ProofMesh/)包含两部分: -## Action Passport 与恢复协议 +- 浏览器中的确定性决策实验:可以调整业务场景、风险、审批、上游结果和合同篡改方式,观察 Gateway 的放行、拒绝、对账、补偿与 `UNKNOWN_MANUAL` 决策; +- 三条冻结 Proof 的证据回放:浏览器复核 SHA-256,并跳转到机器可读的验真报告。 -Action Passport 是 Ed25519 compact JWS,精确绑定: +它不接收凭证或客户数据,也不调用真实后端。这个设计让公开链接保持安全和可重复,同时不把前端模拟包装成线上生产运行。细节见 [公网演示边界](docs/public-demo-boundary.md)。 -```text -tenant / subject / workflow / tool / resource / scopes / arguments digest -context / policy / approval / mode / calls / amount / workflow budget / currency -issued_at / not_before / expires_at -``` - -网关把 `(tenant, workflow, tool, idempotency_key)` 作为逻辑操作,固化请求和授权合同;本次凭证只属于一次 attempt。过期租约接管时: - -1. 新 Passport 必须完整验签且不可变合同逐项相等; -2. 先用稳定 operation id 向上游 `reconcile`; -3. 已成功则封存原结果,不重复调用;确认未发生才安全重派; -4. 结果不确定持久化为 `UNKNOWN`,禁止自动重放; -5. finalize 必须持有当前 owner/generation,旧进程不能越过 fencing。 - -详细设计见 [架构说明](docs/architecture.md)。 - -## Proof Verifier - -工作流证明包含冻结请求/计划、审批、签名 task receipts、签名 gateway receipts、双哈希链、由商务上游独立 key 签名的新鲜终态快照和 bundle signature。策略签发、执行回执、任务回执、Proof seal、商务快照五类 key usage 严格分离。验证时必须显式提供证明包之外的 trust bundle 和策略: - -```bash -proofmesh --home . verify-proof artifacts/workflows//workflow-proof.json \ - --trust-bundle config/trust/action-issuers.json \ - --policy data/policies/refund_policy.json -``` - -Verifier 不止验签,还核对角色 DAG、revision、职责分离、tenant、policy/plan/approval、request/result digest、工具参数、金额/币种、订单版本、退款与工单关联、余额公式和 memory 状态。Proof Sealer 即使持有自己的合法密钥,也不能伪造由另一个受信 key 签发的商务快照。整包换根重签或“签名都对但业务拼错”都会失败。 - -三条评委参考路径可从空白隔离运行时重新执行并导出: +## 进一步复现 ```bash +# 三条退款参考路径和包外验真 make reference-evidence -``` - -[参考证据清单](artifacts/reference/manifest.json)包含低风险自动完成、高风险“先暂停且零副作用、审批后完成”、下游故障后补偿三条路径。每个最终 Proof 都使用另行导出的公钥信任包与钉住策略再次验真;目录不含私钥、token、数据库或运行缓存。这些是确定性商务靶场证据,不是模型质量或生产可用性指标。 -独立进程 HTTP 合成盲测可用一条命令重放: - -```bash +# 240 条独立进程合成故障实验 make synthetic-http-shadow -``` - -它冻结 240 条确定性合成案例,让支付和 CRM 在两个独立本地进程、两个独立数据库中运行,并注入关单失败、提交后超时和对账 UNKNOWN。报告与 SHA-256 清单见 [synthetic-http-shadow](artifacts/synthetic-http-shadow/report.md);这不是企业历史数据、客户试点、第三方支付接入、人工审批断言覆盖或生产 SLA。 - -## Stripe / HubSpot sandbox-ready 边界 - -`StripeHubSpotSandboxBackend` 在同一个 `ActionGateway` 下实现 Stripe test-mode Refund 与 HubSpot developer test-account Ticket 合同:稳定 operation id / provider idempotency、提交后超时先对账、精确 tenant/workflow/resource/amount 回绑、错误分类、UNKNOWN fail-closed、live Stripe key 拒绝与 secret 零日志。仓库内只使用本地 HTTP provider 仿真器验证合同,**不声称真实账户已实跑**。 - -```bash -make vendor-readiness PYTHON=python3.11 -pytest -q tests/test_vendor_sandbox.py -``` - -配置字段、HubSpot 自定义属性、最小权限与真实 test-account 取证流程见 [供应商边界](docs/vendor-sandbox-boundary.md)。密钥只放未跟踪 `.env` / secret manager,永远不要放进聊天、截图、Git 或 evidence artifact。 - -## AgentDojo 629 case 授权合同回放 - -仓库固定 AgentDojo 0.1.35 / benchmark v1 的 97 个 user tasks、27 个 injection goals、629 个组合。输入 artifact SHA-256: - -```text -20146525d139f83d732bc47e0286b0eccdf67118cdc5eba84f5f079863f5546b -``` - -运行: -```bash +# AgentDojo 629 组授权合同回放 make validate-agentdojo make replay-agentdojo -``` - -| 指标 | 结果 | -|---|---:| -| 合法 user ground-truth calls | 2,159 / 2,159 接受 | -| 同键缓存回放 | 2,159 / 2,159;副作用重复 0 | -| 参数/工具/上下文错配错误通过 | 各 0 / 2,159 | -| 未注册调用错误通过 | 0 / 629 | -| 一次性 Passport 换键复用拒绝 | 2,159 / 2,159 | -| Receipt 外部验签 / chain | 各 2,159 / 2,159 | -| 首次合法执行本机 p50 / p95 / p99 | 1.132 / 2.429 / 4.789 ms | - -完整结果与 Wilson 95% 区间见 [authorization-contract-replay.md](artifacts/public-benchmark/authorization-contract-replay.md)。这是**授权合同工程回归**,不运行模型,不代表 AgentDojo ASR、task utility、提示注入检测率或端到端 Agent 能力。 - -## AgentTeams 与 Skills - -`agentteams/` 锁定官方 AgentTeams `v1.2.0-beta.1` / commit `78d0ced...` 作为**已实跑可复现基线**;当前官方 stable `v1.2.2` 是迁移目标,尚未在 ProofMesh 上验证,不能写成已兼容。官网五项要求的完整映射、调用方式、Agent / Skill / MCP / RAG 关系与升级门禁见 [AgentTeams 官方要求映射](docs/agentteams-official-mapping.md)。 -| 官网要求 | AgentTeams 原生落点 | 本项目证据与边界 | -|---|---|---| -| 角色编排 | Human / Worker / Team CR;`workerMembers` + `admin` | Team 以 1 Leader + 6 Worker 编排,admin 引用 1 Human;Team Active、7/7 Running | -| 任务拆解 | TeamHarness projectflow / taskflow、DAG / Task | `refund-dag.yaml`;direct create / plan / delegate 已通过 | -| 上下文传递 | Project / Task / result、Shared Storage / Matrix | ID + trace + 前驱 digest;Matrix 文件发布 `ATB-007` 仍开放 | -| 协同执行 | TeamHarness MCP;外部 Human Gate 映射 paused/resume | 跨 Leader / Worker direct lifecycle 7/7;`modelDriven=false` | -| 状态追踪 | Team / Project / node / Task / result 状态 | AgentTeams 协同账本与 ProofMesh 业务 CAS 双账关联 | - -## 公开数据评测:补输入证据,不冒充客户试点 - -公开数据用于补足“真实语言输入能否进入安全分流”的证据层;它不提供订单、金额、授权、支付或 CRM 终态,因此不会被直接转成退款执行请求。 +# Banking77 与 CFPB 公开数据评测 +make banking77-routing +make cfpb-shadow +``` -| 数据与范围 | 实跑结果 | 能证明 | 不能证明 | -|---|---|---|---| -| Banking77 official test 3,080 条、77 intents | accuracy 81.79%、macro-F1 81.82%;退款检测 recall 85.00%;无审批敏感旁路 80/80 拒绝、upstream dispatch=0 | 公开有标签英语意图上的透明 baseline 与保守安全分流 | 生产就绪、中文效果、真实退款或客户收益;质量门槛未全过,结论为 `NOT_PRODUCTION_READY` | -| CFPB 公开投诉 240 条,四产品各 60 | 240/240 内存摄取并分到人工复核;原文/身份字段落盘 0,写工具调用 0 | 真实公开、未验证 narrative 的隐私最小化 no-write shadow 输入适配 | accuracy、授权正确性、统计代表性或企业试点 | +主要报告: -复现与完整边界见 [公开数据评测说明](docs/public-dataset-benchmark.md)、[Banking77 报告](artifacts/public-domain-evaluation/banking77/report.md)和 [CFPB 报告](artifacts/public-domain-evaluation/cfpb/report.md)。第三方原始文本不进入 Apache-2.0 发布包;发布包只含来源锁、归属、摘要与聚合结果。 +- [退款参考证据](artifacts/reference/manifest.json) +- [生产运维参考证据](artifacts/operations-reference/report.json) +- [授权合同回放](artifacts/public-benchmark/authorization-contract-replay.md) +- [合成故障实验](artifacts/synthetic-http-shadow/report.md) +- [公开数据评测](docs/public-dataset-benchmark.md) +- [试点指标设计](docs/pilot-value-scorecard.md) -交付包含: +## 安全与生产边界 -- 1 Human manifest、7 个 `qwenpaw` Worker manifests、1 Team manifest(当前 runtime Team=`Active`,`modelDriven=false`); -- 7 个官方 ZIP 根目录结构:`manifest.json`、`config/AGENTS.md`、`config/SOUL.md`、`skills/...`; -- 退款 DAG、状态映射、角色 MCP、两阶段 `hiclaw` bootstrap; -- 严格 validator:拒绝宿主 `file://`、错误 ZIP 根、错误工具/字段/状态/错误码; -- 7 个 Skill 的 closed JSON Schema、调用条件、失败策略、安全边界、证据和错误码。 +生产参考接口包含 OIDC / JWKS、PostgreSQL GatewayStore、mTLS 远程签名、Kubernetes admission、SBOM 与 CI provenance。它们已经有代码和测试,但尚未连接企业 IdP、KMS、托管 PostgreSQL 或生产集群。 -```bash -make package-agentteams -make validate-agentteams -pytest -q tests/test_agentteams.py -``` +Stripe / HubSpot adapter 实现了 test-mode 合同、幂等与对账语义,当前只使用本地 HTTP 仿真器验证,没有使用真实测试账户。高风险人工审批需要外部签名 JWS;参考 issuer 仅用于本地与冻结证据,不代表企业 MFA。 -静态校验、官方控制面资源、TeamHarness 健康/MCP 调用、direct project/task 生命周期与模型驱动自主协同是不同证据级别。当前已实测 Manager/Controller、Human、7/7 Worker、7/7 TeamHarness health;最小兼容补丁已让七成员 Team 进入 `Active`,并跨 Leader / ticket-intake 两个真实容器完成 `create_project → plan_dag → delegate_task → ack_task → submit_task → check_task → accept_task_result`。这些调用是 direct MCP 控制面取证,placeholder provider 下仍不声明模型自主协同。原始去敏证据和边界见 [agentteams/README.md](agentteams/README.md) 及 `agentteams/runtime-evidence/`。 +请勿把 `.env`、token、私钥、数据库、客户记录或真实 sandbox trace 提交到仓库。完整披露见 [SECURITY.md](SECURITY.md) 与 [部署说明](docs/deployment.md)。 -## Kubernetes 与容器边界 +## 开源与复用 -- 容器 UID/GID 10001、只读根文件系统、capabilities 全移除、`no-new-privileges`; -- API Bearer RBAC + tenant scope;原始 `/mcp` 只允许内部 gateway 身份; -- Admission 检查 containers/initContainers/ephemeralContainers,要求 active policy digest 精确白名单、非空安全设置和生产 image digest; -- `failurePolicy: Fail`、管理员 namespaceSelector、Agent egress 默认拒绝; -- NetworkPolicy 不是身份,受保护上游仍必须只接受 gateway mTLS/SPIFFE 身份。 +核心代码、动作协议、7 个 Skill、Gateway 和 Verifier 采用 Apache-2.0。第三方基准数据不随 Apache 代码重许可;仓库只保留必要的锁文件、派生结果与来源说明。 -部署与生产差距见 [部署文档](docs/deployment.md) 和 [安全策略](SECURITY.md)。 +如果要接入新的业务域,通常只需替换三类组件: -## 设计与复现文档 +1. 业务工具适配器与 `reconcile` 逻辑; +2. 可签名、可固定摘要的策略; +3. 可独立读取的业务终态 attestation。 -- [AgentTeams 官方能力映射](docs/agentteams-official-mapping.md):角色编排、任务拆解、上下文传递、协同执行与状态追踪逐项落到 AgentTeams 对象; -- [Agent Identity 清单](docs/agent-identity-register.md):逐角色列出 Name、Role、Capabilities、Inputs、Outputs、Dependencies、Decision Boundary 与 Trace; -- [七个 Skill 合同](skills/):每个 Skill 都包含输入输出、调用条件、依赖、失败、安全边界和可复用接口; -- [阿里云 SLS Skill 采用边界](docs/aliyun-skill-adoption.md):只读查询与最小 RAM 权限已经设计,尚未安装或云端实跑; -- [架构](docs/architecture.md)、[部署](docs/deployment.md)、[安全](SECURITY.md)与[公开 Demo 边界](docs/public-demo-boundary.md)。 +协议层继续负责身份、参数、审批、幂等、恢复和验真。 -AgentDojo 原始导出只在需要重生成 `cases.jsonl` 时依赖 `agentdojo==0.1.35`。发布包内的完整性校验不导入 AgentDojo,可直接运行 `make validate-agentdojo`;若要重导出,先在独立环境安装锁定版本,再运行 `make export-agentdojo AGENTDOJO_PYTHON=/path/to/python`。Makefile 不依赖开发者机器上的 `../../work` 路径。 - -## 项目结构 +## Repository map ```text -src/proofmesh/ - api.py REST、角色 MCP、内部 MCP、health/readiness - workflow.py 七角色 CAS 状态机、审批、outbox、Proof seal - gateway.py Action Passport、logical operation、lease/reconcile - capabilities.py canonical JWS、key usage、外部 trust verifier - business.py 事务商务靶场与真实 Saga compensation - workflow_verifier.py 签名 + chain + 跨证据业务语义验真 - admission.py Kubernetes fail-closed admission - static/ 实际调用 v1 API 的评委控制台 -agentteams/ Human/Workers/Team、DAG、ZIP、bootstrap、运行证据 -skills/ 七个可复用 Skill 与 schema/错误码 -artifacts/public-benchmark AgentDojo cases、JSON/Markdown 回放报告 -artifacts/reference 三条真实执行路径、外部验真报告与哈希清单 -deploy/kubernetes/ webhook 与 NetworkPolicy 参考边界 -tests/ 业务、并发、崩溃、权限、证明、AgentTeams、benchmark -docs/ 架构、部署、评测、答辩和提交材料 +src/proofmesh/ action protocol, workflow, gateway, verifier, adapters +agentteams/ Team / Worker manifests, packages, runtime evidence +skills/ seven reusable role Skills +artifacts/ frozen reference and benchmark reports +demo/ interactive browser lab and evidence replay +docs/ architecture, deployment, evaluation and boundaries +tests/ positive, negative, crash and tamper tests ``` -## 诚实边界 - -- SQLite 靶场执行真实事务,但不是生产支付/CRM; -- 开发仍可使用文件型 Ed25519;生产强制 mTLS 远程签名代理,控制面不持有私钥; -- SQLite store 不是 HA 数据库; -- AgentDojo 回放不是模型安全率; -- 成功执行有签名 receipt;拒绝当前是 SQLite audit row,不是签名拒绝回执; -- 官方 AgentTeams 资源运行不等于模型自主协同; -- 尚无第三方渗透测试、生产历史盲测或真实商业 KPI。 - -这些限制不会被 PPT 隐藏。当前已实现 OIDC/JWKS 验证、KMS/HSM 签名代理协议、PostgreSQL Gateway 原子账本、CycloneDX SBOM 与 SLSA/GitHub attestation 流水线;仍需真实企业 IdP/KMS/PostgreSQL 环境、其余状态 HA 迁移、真实上游、WORM/透明日志、故障演练和独立安全评估。 - -## 开源 +## License -核心代码采用 Apache-2.0。第三方来源和许可见 [THIRD_PARTY_NOTICES.md](THIRD_PARTY_NOTICES.md) 与 `data/benchmarks/THIRD_PARTY_AGENTDOJO.md`。贡献说明见 [CONTRIBUTING.md](CONTRIBUTING.md)。 +Apache-2.0。数据集、上游项目与云产品的许可和归属分别记录在对应目录与 [NOTICE](NOTICE)。 diff --git a/artifacts/external-evidence/claim-status.json b/artifacts/external-evidence/claim-status.json index 275555c..701f403 100644 --- a/artifacts/external-evidence/claim-status.json +++ b/artifacts/external-evidence/claim-status.json @@ -1,10 +1,6 @@ { "schema_version": "proofmesh.external-claim-register/v1", - "policy": "fail-closed: a claim remains PENDING until every declared requirement is represented by a hashed release artifact and an external reviewer is named", - "score_target": { - "engineering": "approximately 88 internal target; not an official competition score", - "external_evidence": "95+ competitiveness target; not a promise or judge result" - }, + "policy": "fail-closed: a maturity claim remains PENDING until every declared requirement is represented by a hashed release artifact and an external reviewer is named", "claims": [ { "id": "model_driven_agentteams", @@ -80,17 +76,16 @@ "verified_at": null }, { - "id": "public_repository_and_identity", + "id": "public_release_and_maintenance", "status": "PENDING", - "allowed_claim": "A scrubbed local release is reproducible; public repository and competition identity links are not yet supplied.", + "allowed_claim": "The scrubbed source repository is public at https://github.com/dingyucanada/ProofMesh; an immutable signed release, public security contact, and independent adoption evidence are not yet verified.", "prohibited_claims": [ "public open-source adoption evidence", - "public competition identity verified" + "maintained production-grade open-source project" ], "evidence_requirements": [ "public_repository_record", "immutable_release_record", - "competition_identity_record", "public_contact_record" ], "evidence_files": [], diff --git a/config/trust/action-issuers.json b/config/trust/action-issuers.json index f1e188f..87e6a05 100644 --- a/config/trust/action-issuers.json +++ b/config/trust/action-issuers.json @@ -52,4 +52,4 @@ ] } } -} \ No newline at end of file +} diff --git a/demo/README.md b/demo/README.md index 0365cf1..5dd3bd6 100644 --- a/demo/README.md +++ b/demo/README.md @@ -1,10 +1,13 @@ -# Public evidence replay +# Public action decision lab -This directory is the source for the GitHub Pages demo. It is intentionally static and read-only. +This directory powers the GitHub Pages demo. It has two deliberately separate layers: -The page replays three frozen reference workflows and links to the corresponding proof bundles, external verification reports, AgentDojo authorization replay, and independent-process HTTP fault experiment. The deployment workflow copies only those selected evidence files into the Pages artifact. +1. a browser-side decision simulator for exploring policy, approval, contract mismatch, reconciliation, compensation, and `UNKNOWN_MANUAL` outcomes; +2. a replay of three frozen reference workflows with SHA-256 verification and links to their machine-readable proofs. -It does **not** run the FastAPI service, call a model, use payment or CRM accounts, accept customer data, or create side effects. For the real local reference workflow, follow the repository root README. +The simulator is interactive but deterministic. It implements the documented decision rules in client-side JavaScript and never claims to be a hosted ProofMesh backend. The frozen proofs were produced by the local reference runtime. + +The page does not accept free text, credentials, workflow IDs, approval assertions, or customer records. It does not call a model, payment provider, CRM, deployment platform, or FastAPI service. Local preview: @@ -13,4 +16,4 @@ python3 scripts/build_public_demo.py --output /tmp/proofmesh-pages python3 -m http.server 4173 --directory /tmp/proofmesh-pages ``` -The GitHub Pages deployment uses `.github/workflows/pages.yml`. +The GitHub Pages workflow is `.github/workflows/pages.yml`. diff --git a/demo/app.js b/demo/app.js index 80e1803..9aec41e 100644 --- a/demo/app.js +++ b/demo/app.js @@ -6,6 +6,46 @@ const state = { stepIndex: 0, }; +const domainSpecs = { + refund: { + label: "客服退款", + tenant: "retail-demo", + actor: "action-executor", + tool: "payments.issue_refund", + resource: "refund-case/ref-demo-042", + scope: "refund:issue", + arguments: { amount_bucket: "100-500", currency: "CNY" }, + downstream: "crm.close_ticket", + completed: "COMPLETED", + compensated: "COMPENSATED", + successText: "退款完成,工单状态随后得到核对。", + recoveryText: "支付动作已发生;系统使用原 operation id 对账,没有再次退款。", + compensationText: "支付成功但 CRM 失败;系统执行补偿,并重新核对余额与工单状态。", + }, + operations: { + label: "生产变更", + tenant: "platform-demo", + actor: "change-executor", + tool: "deployment.apply_change", + resource: "service/catalog-api", + scope: "change:apply", + arguments: { risk_units: 35, environment: "staging" }, + downstream: "health.verify_release", + completed: "COMPLETED", + compensated: "ROLLED_BACK_VERIFIED", + successText: "变更完成,健康检查与目标版本一致。", + recoveryText: "发布已经提交;系统查询发布平台后确认原操作完成,没有重复创建发布。", + compensationText: "变更已应用但健康检查失败;系统回滚并重新核对服务版本。", + }, +}; + +const mutationSpecs = { + none: { label: "合同未变化", mismatch: null }, + arguments: { label: "执行参数已变化", mismatch: "arguments_digest_mismatch" }, + tool: { label: "执行工具已变化", mismatch: "tool_mismatch" }, + context: { label: "业务上下文已变化", mismatch: "context_digest_mismatch" }, +}; + const byId = (id) => document.getElementById(id); function textNode(tag, text, className) { @@ -15,6 +55,207 @@ function textNode(tag, text, className) { return node; } +function formValue(name) { + return document.querySelector(`input[name="${name}"]:checked`)?.value; +} + +function decisionStep(title, detail, tone = "neutral") { + return { title, detail, tone }; +} + +function buildPassport(domain, risk, approval) { + const spec = domainSpecs[domain]; + return { + issuer: "proofmesh-policy-issuer", + subject: spec.actor, + tenant: spec.tenant, + tool: spec.tool, + resource: spec.resource, + scope: [spec.scope], + arguments: spec.arguments, + policy: risk === "high" ? "human-gated" : "automatic-reference", + approval: risk === "high" && approval === "signed" ? "external-signed-assertion" : risk === "low" ? "AUTOMATIC" : "MISSING", + calls: 1, + ttl_seconds: 90, + }; +} + +function evaluateLab(input) { + const spec = domainSpecs[input.domain]; + const mutation = mutationSpecs[input.mutation]; + const passport = buildPassport(input.domain, input.risk, input.approval); + + if (input.risk === "high" && input.approval !== "signed") { + return { + badge: "WAITING_APPROVAL", + tone: "amber", + title: "先停下来,等独立审批", + summary: `这次${spec.label}属于高风险动作。系统只冻结计划和审批挑战,不调用业务工具。`, + dispatches: 0, + duplicates: 0, + terminal: "WAITING_APPROVAL", + passport, + steps: [ + decisionStep("计划已经冻结", "工具、业务对象、参数、策略和上下文都进入本次动作摘要。", "done"), + decisionStep("审批断言缺失", "Human 需要通过独立审批服务签发短时断言;控制面不能替他签名。", "warn"), + decisionStep("Gateway 不派发", "审批前写副作用保持为 0。", "blocked"), + ], + }; + } + + if (mutation.mismatch) { + return { + badge: "REJECTED", + tone: "red", + title: "合同发生变化,Gateway 拒绝执行", + summary: `${mutation.label}。许可证只批准原工具、原参数和原上下文,因此请求在到达业务系统前被拦截。`, + dispatches: 0, + duplicates: 0, + terminal: "REJECTED", + passport, + steps: [ + decisionStep("许可证有效", "签名、签发者、时效和一次性调用次数通过检查。", "done"), + decisionStep("精确绑定不一致", `拒绝原因:${mutation.mismatch}。`, "blocked"), + decisionStep("业务系统没有收到请求", "支付、CRM 或发布平台调用次数为 0。", "blocked"), + ], + }; + } + + const common = [ + decisionStep("许可证通过", "身份、租户、工具、业务对象、参数、策略、审批和有效期逐项一致。", "done"), + decisionStep("建立逻辑操作", "稳定 operation id 与本次凭证分开保存,重试不会重新扣预算。", "done"), + ]; + + if (input.outcome === "success") { + return { + badge: "COMPLETED", + tone: "green", + title: "本次动作可以完成", + summary: spec.successText, + dispatches: 1, + duplicates: 0, + terminal: spec.completed, + passport, + steps: [...common, + decisionStep("调用业务工具", "上游返回成功,Gateway 封存结果摘要和签名回执。", "done"), + decisionStep("重新读取终态", "Verifier 核对业务状态与批准的计划一致。", "done"), + ], + }; + } + + if (input.outcome === "timeout_committed") { + return { + badge: "RECOVERED", + tone: "cyan", + title: "响应丢了,先对账再继续", + summary: spec.recoveryText, + dispatches: 1, + duplicates: 0, + terminal: "RECOVERED_COMPLETED", + passport, + steps: [...common, + decisionStep("上游响应超时", "超时发生在提交之后,系统不把它解释成“没有执行”。", "warn"), + decisionStep("按 operation id 对账", "上游确认原操作已经成功。", "done"), + decisionStep("封存原结果", "不再派发第二次写操作,继续验证最终状态。", "done"), + ], + }; + } + + if (input.outcome === "downstream_failure") { + return { + badge: "COMPENSATED", + tone: "cyan", + title: "前一步已发生,系统执行精确恢复", + summary: spec.compensationText, + dispatches: 2, + duplicates: 0, + terminal: spec.compensated, + passport, + steps: [...common, + decisionStep("第一步已经成功", "系统保留原回执,不把后续失败解释成整条流程都没执行。", "done"), + decisionStep("下游检查失败", `${spec.downstream} 返回失败,工作流进入恢复分支。`, "warn"), + decisionStep("执行补偿或回滚", "只撤销已经确认发生的动作,并重新读取业务终态。", "done"), + ], + }; + } + + return { + badge: "UNKNOWN_MANUAL", + tone: "amber", + title: "结果无法确认,停止自动执行", + summary: "对账仍无法判断上游是否执行。系统保留现场并转人工,不用一次冒险重试换取表面上的成功。", + dispatches: 1, + duplicates: 0, + terminal: "UNKNOWN_MANUAL", + passport, + steps: [...common, + decisionStep("上游响应不确定", "执行结果没有可靠回执。", "warn"), + decisionStep("对账仍无结论", "系统无法证明已执行,也无法证明未执行。", "warn"), + decisionStep("停止自动重派", "案件进入人工队列,保留 operation、租约和审计轨迹。", "blocked"), + ], + }; +} + +function renderPassport(passport) { + const fields = byId("passport-fields"); + fields.replaceChildren(); + const summaryFields = { + 执行主体: passport.subject, + 业务租户: passport.tenant, + 允许工具: passport.tool, + 业务对象: passport.resource, + 审批来源: passport.approval, + 有效时间: `${passport.ttl_seconds} 秒`, + }; + Object.entries(summaryFields).forEach(([label, value]) => { + const row = document.createElement("div"); + row.append(textNode("dt", label)); + row.append(textNode("dd", value)); + fields.append(row); + }); + byId("passport-json").textContent = JSON.stringify(passport, null, 2); +} + +function renderLab(result) { + const panel = document.querySelector(".decision-panel"); + panel.dataset.tone = result.tone; + byId("decision-title").textContent = result.title; + byId("decision-badge").textContent = result.badge; + byId("decision-summary").textContent = result.summary; + byId("dispatch-count").textContent = String(result.dispatches); + byId("duplicate-count").textContent = String(result.duplicates); + byId("terminal-state").textContent = result.terminal; + + const list = byId("decision-steps"); + list.replaceChildren(); + result.steps.forEach((step) => { + const item = document.createElement("li"); + item.className = step.tone; + item.append(textNode("strong", step.title)); + item.append(textNode("span", step.detail)); + list.append(item); + }); + renderPassport(result.passport); +} + +function runLab(event) { + event?.preventDefault(); + renderLab(evaluateLab({ + domain: formValue("domain"), + risk: byId("risk-input").value, + approval: byId("approval-input").value, + outcome: byId("outcome-input").value, + mutation: formValue("mutation"), + })); +} + +function syncApprovalControl() { + const approval = byId("approval-input"); + const isLow = byId("risk-input").value === "low"; + approval.disabled = isLow; + if (isLow) approval.value = "missing"; +} + function renderTabs() { const tabs = byId("scenario-tabs"); tabs.replaceChildren(); @@ -31,7 +272,7 @@ function renderTabs() { button.addEventListener("click", () => { state.scenarioIndex = index; state.stepIndex = 0; - render(); + renderReplay(); }); tabs.append(button); }); @@ -61,25 +302,6 @@ function renderTimeline(scenario) { }); } -function renderEvidence(scenario) { - const step = scenario.steps[state.stepIndex]; - byId("evidence-json").textContent = JSON.stringify( - { - scenario: scenario.id, - step: state.stepIndex + 1, - name: step.name, - ...step.evidence, - }, - null, - 2, - ); - const proofLink = byId("proof-link"); - proofLink.href = scenario.proof; - proofLink.textContent = "查看冻结 Proof"; - byId("integrity-badge").textContent = "正在复核 SHA-256"; - verifyProofHash(scenario); -} - async function verifyProofHash(scenario) { const badge = byId("integrity-badge"); try { @@ -100,6 +322,18 @@ async function verifyProofHash(scenario) { } } +function renderEvidence(scenario) { + const step = scenario.steps[state.stepIndex]; + byId("evidence-json").textContent = JSON.stringify( + { scenario: scenario.id, step: state.stepIndex + 1, name: step.name, ...step.evidence }, + null, + 2, + ); + byId("proof-link").href = scenario.proof; + byId("integrity-badge").textContent = "正在复核 SHA-256"; + verifyProofHash(scenario); +} + function renderScenario() { const scenario = state.data.scenarios[state.scenarioIndex]; byId("case-id").textContent = scenario.case_id; @@ -109,10 +343,7 @@ function renderScenario() { renderFacts(scenario); renderTimeline(scenario); renderEvidence(scenario); - - const nextButton = byId("next-button"); - const isLast = state.stepIndex === scenario.steps.length - 1; - nextButton.textContent = isLast ? "回到第一步" : "下一步"; + byId("next-button").textContent = state.stepIndex === scenario.steps.length - 1 ? "回到第一步" : "下一步"; } function renderMetrics() { @@ -136,15 +367,14 @@ function renderMetrics() { }); } -function render() { +function renderReplay() { renderTabs(); renderScenario(); } async function copyEvidence() { - const text = byId("evidence-json").textContent; try { - await navigator.clipboard.writeText(text); + await navigator.clipboard.writeText(byId("evidence-json").textContent); byId("copy-button").textContent = "已复制"; window.setTimeout(() => { byId("copy-button").textContent = "复制这一步"; }, 1600); } catch (_error) { @@ -153,22 +383,24 @@ async function copyEvidence() { } async function load() { + syncApprovalControl(); + runLab(); try { const response = await fetch(DATA_URL, { cache: "no-store" }); if (!response.ok) throw new Error(`HTTP ${response.status}`); state.data = await response.json(); - document.querySelectorAll("[data-repo-link]").forEach((link) => { - link.href = state.data.repository; - }); - render(); + document.querySelectorAll("[data-repo-link]").forEach((link) => { link.href = state.data.repository; }); + renderReplay(); renderMetrics(); } catch (error) { - byId("demo").replaceChildren( - textNode("p", `证据数据加载失败:${error.message}。请通过 HTTP 服务打开本页面,而不是直接双击文件。`), + byId("replay").replaceChildren( + textNode("p", `冻结证据加载失败:${error.message}。请通过 HTTP 服务打开本页面。`), ); } } +byId("lab-form").addEventListener("submit", runLab); +byId("risk-input").addEventListener("change", syncApprovalControl); byId("next-button").addEventListener("click", () => { const scenario = state.data.scenarios[state.scenarioIndex]; state.stepIndex = (state.stepIndex + 1) % scenario.steps.length; diff --git a/demo/data/scenarios.json b/demo/data/scenarios.json index 2d7dc86..ed1d5cb 100644 --- a/demo/data/scenarios.json +++ b/demo/data/scenarios.json @@ -1,7 +1,7 @@ { - "schema_version": "proofmesh.public-evidence-replay/v1", + "schema_version": "proofmesh.public-action-lab/v2", "repository": "https://github.com/dingyucanada/ProofMesh", - "generated_from": "frozen reference artifacts; no live backend", + "generated_from": "browser decision simulator plus frozen reference artifacts; no live backend", "scenarios": [ { "id": "automatic", @@ -14,7 +14,7 @@ "verification": "evidence/reference/automatic/external-verification.json", "proof_sha256": "a987ca1b408d3b300fe68c40ecb56d3869d284dff1a386d563bc1d31f1f3fc4b", "facts": { - "金额": "¥80.00", + "参考金额": "¥80.00", "审批": "自动策略", "Gateway 回执": "6", "包外验真": "15 / 15" @@ -58,7 +58,7 @@ "verification": "evidence/reference/human-approval/external-verification.json", "proof_sha256": "de262ede0d8ae7a9241393121d83190fe1c5854c7cf2c4a4f0f9ced609bf7561", "facts": { - "金额": "¥129.00", + "参考金额": "¥129.00", "审批来源": "外部签名 JWS", "Gateway 回执": "5", "包外验真": "15 / 15" @@ -102,7 +102,7 @@ "verification": "evidence/reference/compensation/external-verification.json", "proof_sha256": "f335674b87003af13851ce0c4423afdd184ad48aad9f4804116a664ae395d0b3", "facts": { - "金额": "¥90.00", + "参考金额": "¥90.00(仅为该条 fixture)", "CRM": "依赖故障", "可退款余额": "已恢复", "包外验真": "15 / 15" diff --git a/demo/index.html b/demo/index.html index 66da02c..759ebe1 100644 --- a/demo/index.html +++ b/demo/index.html @@ -5,67 +5,187 @@ - ProofMesh|只读证据回放 + ProofMesh|Agent 动作决策台 - +
ProofMesh
-

READ-ONLY EVIDENCE REPLAY · 非实时后端

-

退款已经成功,CRM 却失败。
Agent 该不该再试一次?

+

AGENT ACTION CONTROL PLANE

+

Agent 会调用工具之后,谁来管住它的下一步?

- ProofMesh 不让 Agent 猜。它先核对动作通行证,再向上游对账;结果查不清,就停在人工处理,不盲目重试。 + 退款、发布、配置变更都会改变真实业务状态。ProofMesh 在 AgentTeams 和企业工具之间核对每一次动作;遇到超时先查上游,结果不明就停。

-
-
- AgentTeams 分工 - 动作通行证 - Action Gateway - 对账与补偿 - 包外验真 +
+
+
+

THE MISSING CONTROL

+

权限系统管长期身份,企业还需要管住“这一次”

+
+

一个角色有权调用接口,不等于它可以在任意时间、用任意参数、重复执行同一个动作。

+
+
+
+ 01 +

报错可能发生在执行之后

+

支付已成功、响应却超时;发布已提交、回执却丢失。直接重试可能制造第二个副作用。

+
+
+ 02 +

审批后计划仍可能变化

+

审批人看过原金额或原变更范围,执行时的参数却可能已经漂移。

+
+
+ 03 +

日志通常由执行方自己解释

+

审计者需要从系统外加载信任材料,重新核对审批、回执和最终业务状态。

+
+
+
+ +
+ AgentTeams 分工 + + Action Passport 冻结本次许可 + + Gateway 执行前核对 + + Reconcile 失败后先对账 + + Verifier 包外复核 +
+ +
+
+
+

INTERACTIVE DECISION LAB

+

给系统一个场景,看它会不会冒险

+
+

这是浏览器中的确定性协议模拟。它不调用真实后端,但会按同一套门禁和故障规则解释每个决定。

+
+ +
+
+
+ 1. 选择业务动作 +
+ + +
+
+ +
+ + +
+ + + +
+ 2. 要不要篡改合同 +
+ + + + +
+
+ + +

不要输入真实订单号、凭证或客户信息;这个页面也没有文本输入框。

+
+ +
+
+
+

GATEWAY DECISION

+

等待运行

+
+ READY +
+

选择条件后运行,系统会说明是否执行、是否对账,以及最终由谁接手。

+
    + +
    + + +
    -
    +
    -

    THREE FROZEN PATHS

    -

    同一笔动作,三种不同结局

    +

    FROZEN EXECUTION EVIDENCE

    +

    模拟负责解释,冻结 Proof 负责证明

    -

    选一条路径,再逐步播放。每一步都对应仓库内可以复算的证据。

    +

    下面三条路径由本地参考后端真实执行并封存。可以逐步回放,并在浏览器里复核 Proof 的 SHA-256。

    -
    +
    @@ -77,9 +197,7 @@

    -
      -
      @@ -108,19 +226,17 @@

      当前证据

      WHAT HAS ACTUALLY RUN

      -

      四组实验,各回答一个问题

      +

      每组实验只回答一个问题

      -

      数字只按各自的实验边界解释,不把公开数据或合成故障写成客户成绩。

      +

      公开数据、合成故障与本地参考路径分开报告,不把它们合并成客户成绩。

      AGENTTEAMS RUNTIME

      -

      协同控制面真的跑过,但模型自主协同还没有。

      -

      - 已验证基线为 AgentTeams v1.2.0-beta.1:Team Active、7/7 Worker Running,跨两个真实容器完成 direct MCP 生命周期 7/7。 -

      +

      协同控制面已经跑通,模型自主协作还没有。

      +

      已验证 AgentTeams v1.2.0-beta.1:Team Active、7/7 Worker Running,并在两个真实容器间完成 direct MCP 生命周期 7/7。

      1 + 6Leader + Workers @@ -132,26 +248,26 @@

      协同控制面真的跑过,但模型自主协同还没有。

      -

      HONEST BOUNDARY

      -

      这个链接证明什么,也说明还缺什么

      +

      CURRENT BOUNDARY

      +

      现在能验证什么,下一步还要补什么

      -

      已经能复核

      +

      仓库内可复核

        -
      • 冻结 Proof 的哈希和 15 项包外验真结果
      • -
      • 授权参数错配被 Gateway 拦截
      • -
      • 超时后先对账,未知状态停止自动重试
      • -
      • AgentTeams 控制面与 direct MCP 生命周期
      • +
      • 动作合同的工具、参数与上下文绑定
      • +
      • 故障后的对账、补偿和 UNKNOWN 停机
      • +
      • 冻结 Proof 的哈希与包外验真结果
      • +
      • AgentTeams 控制面和 direct MCP 生命周期
      -

      仍未完成

      +

      尚未完成

        -
      • 模型驱动的七 Agent 自主协同
      • +
      • 模型驱动的七 Agent 自主协作
      • 真实 Stripe、HubSpot 或企业系统账户
      • -
      • 客户授权工单与生产试点
      • -
      • 企业 IdP、KMS、PostgreSQL 与 SLA 验证
      • +
      • 客户授权数据与生产试点
      • +
      • 企业 IdP、KMS、托管数据库与 SLA 验证
      @@ -159,9 +275,9 @@

      仍未完成

      -

      ProofMesh · Apache-2.0 · 冻结证据回放

      -

      本页面不收集输入,不调用后端,不产生业务副作用。

      +

      ProofMesh · Apache-2.0 · Agent Action Control Plane

      +

      浏览器实验不收集输入,不调用后端,不产生业务副作用。

      - + diff --git a/demo/styles.css b/demo/styles.css index d7029aa..070fb4c 100644 --- a/demo/styles.css +++ b/demo/styles.css @@ -20,14 +20,14 @@ html { scroll-behavior: smooth; } body { margin: 0; background: - radial-gradient(circle at 82% 10%, rgba(45, 113, 230, 0.22), transparent 32rem), - radial-gradient(circle at 5% 45%, rgba(40, 185, 167, 0.1), transparent 28rem), + radial-gradient(circle at 82% 8%, rgba(45, 113, 230, 0.22), transparent 32rem), + radial-gradient(circle at 4% 43%, rgba(40, 185, 167, 0.11), transparent 29rem), var(--bg); color: var(--ink); line-height: 1.65; } a { color: inherit; } -button, a { -webkit-tap-highlight-color: transparent; } +button, select, input, a { -webkit-tap-highlight-color: transparent; } .skip-link { position: fixed; left: 1rem; @@ -73,45 +73,29 @@ button, a { -webkit-tap-highlight-color: transparent; } nav { display: flex; align-items: center; gap: 1.4rem; } nav a { color: var(--muted); text-decoration: none; font-size: .92rem; } nav a:hover, nav a:focus-visible { color: var(--ink); } -.repo-link { - padding: .45rem .75rem; - border: 1px solid var(--line); - border-radius: .6rem; -} +.repo-link { padding: .45rem .75rem; border: 1px solid var(--line); border-radius: .6rem; } main, footer { width: min(1180px, calc(100% - 2.5rem)); margin-inline: auto; } .hero { - min-height: 39rem; + min-height: 42rem; display: grid; - grid-template-columns: 1.55fr .75fr; + grid-template-columns: 1.32fr .68fr; gap: 4.5rem; align-items: center; padding: 6.5rem 0 4rem; } -.eyebrow { - margin: 0 0 .7rem; - color: var(--cyan); - font-size: .74rem; - font-weight: 750; - letter-spacing: .14em; -} +.eyebrow { margin: 0 0 .7rem; color: var(--cyan); font-size: .74rem; font-weight: 750; letter-spacing: .14em; } h1, h2, h3, p { margin-top: 0; } -h1 { - max-width: 13ch; - margin-bottom: 1.4rem; - font-size: clamp(2.6rem, 5.7vw, 5.3rem); - line-height: 1.03; - letter-spacing: -.055em; -} +h1 { max-width: 13ch; margin-bottom: 1.4rem; font-size: clamp(2.8rem, 5.8vw, 5.35rem); line-height: 1.03; letter-spacing: -.055em; } h2 { font-size: clamp(2rem, 3.5vw, 3.25rem); line-height: 1.12; letter-spacing: -.04em; } h3 { font-size: 1.3rem; line-height: 1.3; letter-spacing: -.018em; } -.lede { max-width: 42rem; color: #c9d5e6; font-size: 1.12rem; } +.lede { max-width: 45rem; color: #c9d5e6; font-size: 1.14rem; } .hero-actions, .replay-controls, .evidence-actions { display: flex; flex-wrap: wrap; gap: .8rem; align-items: center; } .button { display: inline-flex; justify-content: center; align-items: center; - min-height: 2.8rem; + min-height: 2.85rem; padding: .65rem 1.05rem; border: 1px solid transparent; border-radius: .75rem; @@ -124,106 +108,95 @@ h3 { font-size: 1.3rem; line-height: 1.3; letter-spacing: -.018em; } .button.primary:hover { background: var(--cyan); } .button.secondary { color: var(--ink); background: transparent; border-color: var(--line); } .button.secondary:hover { border-color: var(--blue); } -.button:focus-visible, .scenario-tab:focus-visible, .text-button:focus-visible, a:focus-visible { +.button.wide { width: 100%; } +.button:focus-visible, .scenario-tab:focus-visible, .text-button:focus-visible, a:focus-visible, select:focus-visible, input:focus-visible { outline: 3px solid rgba(121, 183, 255, .55); outline-offset: 3px; } -.truth-card { - padding: 1.8rem; - border: 1px solid var(--line); - border-radius: 1.25rem; - background: rgba(13, 25, 43, .82); - box-shadow: var(--shadow); -} -.truth-card p { color: var(--muted); } -.truth-card .truth-title { margin: .9rem 0 .2rem; color: var(--ink); font-weight: 750; } -.status-dot { display: inline-block; width: .7rem; height: .7rem; border-radius: 50%; background: var(--green); box-shadow: 0 0 0 .35rem rgba(131,230,163,.12); } +.hero-proof { padding: 1.8rem; border: 1px solid var(--line); border-radius: 1.25rem; background: rgba(13, 25, 43, .82); box-shadow: var(--shadow); } +.hero-proof-label { color: var(--muted); font-size: .82rem; } +.hero-proof ol { list-style: none; margin: 0; padding: 0; } +.hero-proof li { display: grid; grid-template-columns: 2.4rem 1fr; align-items: center; gap: .8rem; padding: .9rem 0; border-top: 1px solid var(--line); } +.hero-proof li span { color: var(--cyan); font: 700 .76rem ui-monospace, SFMono-Regular, Menlo, monospace; } -.flow-strip { - display: flex; - justify-content: space-between; - gap: 1rem; - padding: 1.15rem 1.4rem; - border-block: 1px solid var(--line); - color: #dce8f7; - font-size: .9rem; -} -.flow-strip b { color: #51647e; } - -.demo-section, .evidence-section, .boundary-section { padding: 7.5rem 0 1rem; } +.problem-section, .lab-section, .demo-section, .evidence-section, .boundary-section { padding: 7.5rem 0 1rem; } .section-heading { display: flex; justify-content: space-between; align-items: end; gap: 3rem; margin-bottom: 2.2rem; } -.section-heading h2 { margin-bottom: 0; } +.section-heading h2 { max-width: 18ch; margin-bottom: 0; } .section-heading > p { max-width: 31rem; margin-bottom: .4rem; color: var(--muted); } +.problem-grid { display: grid; grid-template-columns: repeat(3, 1fr); gap: 1rem; } +.problem-grid article { min-height: 16rem; padding: 1.55rem; border: 1px solid var(--line); border-radius: 1rem; background: linear-gradient(150deg, rgba(17,31,52,.9), rgba(13,25,43,.66)); } +.problem-grid p { color: var(--muted); } +.problem-number { display: block; margin-bottom: 2.4rem; color: var(--blue); font: 700 .8rem ui-monospace, SFMono-Regular, Menlo, monospace; } + +.solution-strip { display: flex; justify-content: space-between; gap: 1rem; margin-top: 4rem; padding: 1.15rem 1.4rem; border-block: 1px solid var(--line); color: #b9c8db; font-size: .86rem; } +.solution-strip strong { color: var(--ink); } +.solution-strip b { color: #51647e; } + +.lab-grid { display: grid; grid-template-columns: .82fr 1.18fr; gap: 1rem; align-items: stretch; } +.lab-controls, .decision-panel, .passport-panel { padding: 1.5rem; border: 1px solid var(--line); border-radius: 1.1rem; background: rgba(13,25,43,.84); } +.lab-controls { grid-row: span 2; } +.lab-controls fieldset { margin: 0 0 1.25rem; padding: 0; border: 0; } +.lab-controls legend, .lab-controls label > span:first-child { display: block; margin-bottom: .55rem; color: #dce7f5; font-size: .82rem; font-weight: 700; } +.control-row { display: grid; grid-template-columns: 1fr 1fr; gap: .8rem; margin-bottom: 1.25rem; } +.lab-controls > label { display: block; margin-bottom: 1.25rem; } +select { width: 100%; min-height: 2.8rem; padding: .6rem .75rem; border: 1px solid var(--line); border-radius: .7rem; background: #081323; color: var(--ink); font: inherit; } +.segmented, .mutation-grid { display: grid; gap: .55rem; } +.segmented { grid-template-columns: 1fr 1fr; } +.mutation-grid { grid-template-columns: repeat(2, 1fr); } +.segmented label, .mutation-grid label { cursor: pointer; } +.segmented input, .mutation-grid input { position: absolute; opacity: 0; pointer-events: none; } +.segmented label span, .mutation-grid label span { display: grid; place-items: center; min-height: 2.75rem; margin: 0; padding: .5rem; border: 1px solid var(--line); border-radius: .7rem; color: var(--muted); font-size: .86rem; } +.segmented input:checked + span, .mutation-grid input:checked + span { border-color: var(--blue); color: var(--ink); background: rgba(60,121,217,.18); } +select:disabled { opacity: .48; cursor: not-allowed; } +.form-note { margin: .75rem 0 0; color: #72839a; font-size: .74rem; } + +.decision-panel { min-height: 24rem; } +.decision-panel[data-tone="green"] { border-color: rgba(131,230,163,.36); } +.decision-panel[data-tone="cyan"] { border-color: rgba(94,233,209,.36); } +.decision-panel[data-tone="amber"] { border-color: rgba(255,202,114,.38); } +.decision-panel[data-tone="red"] { border-color: rgba(255,143,148,.4); } +.decision-head, .replay-head, .evidence-head { display: flex; justify-content: space-between; gap: 1rem; align-items: start; } +.decision-badge, .terminal-badge, .integrity-badge { flex: 0 0 auto; padding: .32rem .6rem; border: 1px solid var(--line); border-radius: 999px; color: var(--cyan); font: 700 .72rem ui-monospace, SFMono-Regular, Menlo, monospace; } +.decision-summary { color: var(--muted); } +.decision-steps { list-style: none; margin: 1.35rem 0; padding: 0; } +.decision-steps li { position: relative; padding: 0 0 1rem 1.8rem; border-left: 1px solid #29405f; } +.decision-steps li::before { content: ""; position: absolute; left: -.33rem; top: .25rem; width: .6rem; height: .6rem; border-radius: 50%; background: var(--blue); } +.decision-steps li.warn::before { background: var(--amber); } +.decision-steps li.blocked::before { background: var(--red); } +.decision-steps strong { display: block; } +.decision-steps span { color: var(--muted); font-size: .87rem; } +.decision-footer { display: grid; grid-template-columns: .75fr .75fr 1.5fr; gap: .55rem; } +.decision-footer div { min-width: 0; padding: .75rem; border: 1px solid var(--line); border-radius: .75rem; background: rgba(7,16,31,.6); } +.decision-footer span { display: block; color: var(--muted); font-size: .7rem; } +.decision-footer strong { display: block; overflow: hidden; color: var(--ink); font-size: .95rem; text-overflow: ellipsis; white-space: nowrap; } + +.passport-panel { grid-column: 2; } +.passport-panel > p { color: var(--muted); } +.passport-panel dl { display: grid; grid-template-columns: repeat(3, 1fr); gap: .55rem; } +.passport-panel dl div { min-width: 0; padding: .65rem; border-bottom: 1px solid var(--line); } +.passport-panel dt { color: var(--muted); font-size: .7rem; } +.passport-panel dd { margin: .1rem 0 0; overflow: hidden; font-size: .78rem; font-weight: 700; text-overflow: ellipsis; white-space: nowrap; } +.passport-panel pre, .evidence-panel pre { overflow: auto; margin: 1rem 0 0; padding: 1rem; border-radius: .8rem; background: #07101f; color: #bed3ec; font: .75rem/1.6 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; white-space: pre-wrap; word-break: break-word; } +.passport-panel pre { max-height: 15rem; } + .scenario-tabs { display: grid; grid-template-columns: repeat(3, 1fr); gap: .7rem; margin-bottom: 1rem; } -.scenario-tab { - min-height: 4.9rem; - padding: .9rem 1rem; - border: 1px solid var(--line); - border-radius: .9rem; - background: rgba(13,25,43,.7); - color: var(--muted); - text-align: left; - font: inherit; - cursor: pointer; -} +.scenario-tab { min-height: 4.9rem; padding: .9rem 1rem; border: 1px solid var(--line); border-radius: .9rem; background: rgba(13,25,43,.7); color: var(--muted); text-align: left; font: inherit; cursor: pointer; } .scenario-tab strong { display: block; margin-bottom: .15rem; color: var(--ink); } .scenario-tab[aria-selected="true"] { border-color: var(--blue); background: rgba(60,121,217,.16); color: #d8e8ff; } .replay-grid { display: grid; grid-template-columns: 1.05fr .95fr; gap: 1rem; } -.replay-panel, .evidence-panel { - min-height: 34rem; - padding: 1.6rem; - border: 1px solid var(--line); - border-radius: 1.15rem; - background: rgba(13,25,43,.82); -} -.replay-head, .evidence-head { display: flex; justify-content: space-between; gap: 1rem; align-items: start; } +.replay-panel, .evidence-panel { min-height: 34rem; padding: 1.6rem; border: 1px solid var(--line); border-radius: 1.15rem; background: rgba(13,25,43,.82); } .case-id { margin-bottom: .15rem; color: var(--muted); font: 600 .78rem ui-monospace, SFMono-Regular, Menlo, monospace; } -.terminal-badge, .integrity-badge { - flex: 0 0 auto; - padding: .32rem .6rem; - border: 1px solid var(--line); - border-radius: 999px; - color: var(--cyan); - font: 700 .72rem ui-monospace, SFMono-Regular, Menlo, monospace; -} .scenario-summary { color: var(--muted); } .timeline { list-style: none; margin: 1.5rem 0; padding: 0; } -.timeline li { - position: relative; - margin-left: .6rem; - padding: 0 0 1.05rem 2.1rem; - color: #74849b; - border-left: 1px solid #263751; -} -.timeline li::before { - content: ""; - position: absolute; - left: -.38rem; - top: .2rem; - width: .7rem; - height: .7rem; - border-radius: 50%; - background: #31445f; -} +.timeline li { position: relative; margin-left: .6rem; padding: 0 0 1.05rem 2.1rem; color: #74849b; border-left: 1px solid #263751; } +.timeline li::before { content: ""; position: absolute; left: -.38rem; top: .2rem; width: .7rem; height: .7rem; border-radius: 50%; background: #31445f; } .timeline li strong { display: block; color: #77889f; } .timeline li.done { color: #c1cede; } .timeline li.done strong { color: var(--ink); } .timeline li.done::before { background: var(--cyan); } .timeline li.current { color: #dce9f8; } .timeline li.current::before { background: var(--amber); box-shadow: 0 0 0 .32rem rgba(255,202,114,.12); } -.evidence-panel pre { - min-height: 15rem; - max-height: 20rem; - overflow: auto; - margin: 1.2rem 0; - padding: 1rem; - border-radius: .8rem; - background: #07101f; - color: #bed3ec; - font: .77rem/1.65 ui-monospace, SFMono-Regular, Menlo, Consolas, monospace; - white-space: pre-wrap; - word-break: break-word; -} +.evidence-panel pre { min-height: 15rem; max-height: 20rem; } .fact-list { display: grid; grid-template-columns: 1fr 1fr; gap: .5rem 1rem; margin: 1rem 0; } .fact-list div { padding: .65rem 0; border-bottom: 1px solid var(--line); } .fact-list dt { color: var(--muted); font-size: .75rem; } @@ -251,27 +224,28 @@ footer { display: flex; justify-content: space-between; gap: 2rem; padding: 1.5r footer p { margin: 0; } noscript { display: block; padding: 1rem; background: var(--amber); color: #251500; text-align: center; } -@media (max-width: 900px) { +@media (max-width: 960px) { nav a:not(.repo-link) { display: none; } .hero { grid-template-columns: 1fr; gap: 2rem; min-height: auto; } - .truth-card { max-width: 38rem; } - .flow-strip { overflow-x: auto; justify-content: start; white-space: nowrap; } - .replay-grid, .agentteams-card, .boundary-section { grid-template-columns: 1fr; } + .hero-proof { max-width: 40rem; } + .solution-strip { overflow-x: auto; justify-content: start; white-space: nowrap; } + .lab-grid, .replay-grid, .agentteams-card, .boundary-section { grid-template-columns: 1fr; } + .lab-controls { grid-row: auto; } + .passport-panel { grid-column: auto; } .metric-grid { grid-template-columns: 1fr 1fr; } - .runtime-facts { min-height: 7rem; } } -@media (max-width: 620px) { +@media (max-width: 680px) { main, footer { width: min(100% - 1.4rem, 1180px); } .topbar { padding-inline: .8rem; } .hero { padding-top: 4rem; } - h1 { font-size: 2.65rem; } + h1 { font-size: 2.7rem; } .section-heading { display: block; } - .scenario-tabs, .metric-grid, .boundary-grid { grid-template-columns: 1fr; } - .scenario-tab { min-height: auto; } - .replay-panel, .evidence-panel { padding: 1rem; } - .fact-list { grid-template-columns: 1fr; } - .runtime-facts { grid-template-columns: 1fr; } + .problem-grid, .scenario-tabs, .metric-grid, .boundary-grid, .control-row { grid-template-columns: 1fr; } + .segmented, .mutation-grid { grid-template-columns: 1fr 1fr; } + .decision-footer, .passport-panel dl { grid-template-columns: 1fr; } + .replay-panel, .evidence-panel, .lab-controls, .decision-panel, .passport-panel { padding: 1rem; } + .fact-list, .runtime-facts { grid-template-columns: 1fr; } .runtime-facts span { border-left: 0; border-top: 1px solid var(--line); } footer { display: block; } } diff --git a/docs/95-plus-evidence-runbook.md b/docs/95-plus-evidence-runbook.md deleted file mode 100644 index 68eb7a9..0000000 --- a/docs/95-plus-evidence-runbook.md +++ /dev/null @@ -1,207 +0,0 @@ -# ProofMesh:从工程强度到 95+ 证据的行动手册 - -> 版本口径:本手册把“代码能力”“可复现证据”“真实外部证据”分开。任何账号、密钥、客户数据、合作方名称都不得发到聊天、Issue、截图或 Git 仓库。评委分数无法由参赛者保证;“88 / 95+”是内部冲刺目标,不是官方承诺。 - -## 0. 先理解评分差距 - -| 层级 | 评委真正要看的东西 | 可由开发者单独完成 | 必须由你或外部主体完成 | -|---|---|---:|---:| -| 工程竞争力目标约 88 | 真实模型接入通道、第二业务域、生产身份/数据/密钥接口、自动化测试、SBOM、可复现包 | 是 | 模型服务凭证用于最终实跑 | -| 95+ 竞争力 | 支付与 CRM 的真实 sandbox trace、200–500 条经授权盲测、公开仓库历史、外部复现签名、真实参赛身份 | 否 | 是 | -| 生产采用 | 企业 IdP/KMS、正式数据处理协议、小流量试点、生产 SLA、安全评估 | 否 | 是 | - -最短路径不是继续堆功能,而是把同一冻结版本依次通过:`模型自主轨迹 → sandbox 双写与故障恢复 → 授权数据盲测 → 独立机器复现`。 - -## 1. 你今天要完成的五件事 - -完成一项后只把“已配置/链接/非敏感 ID”告诉开发者;**永远不要发送 secret、token、客户原文或身份证明扫描件**。 - -### 1.1 模型服务:优先百炼,Ollama 作离线备份 - -#### 路径 A:阿里云百炼 / Model Studio(推荐) - -1. 用你的阿里云账号开通 Model Studio,选择与后续数据合规策略一致的地域和 Workspace。 -2. 在 Workspace 中创建**仅用于本项目、可随时撤销**的 API Key;不要复用个人主账号长期密钥。 -3. 在官方 Playground 先完成一次最小对话,记录非敏感的:地域、Base URL、Workspace ID、模型 ID。 -4. 在本机私密环境中设置以下变量;值不要写入 `.env.example`、日志或截图: - - ```text - PROOFMESH_MODEL_PROVIDER=aliyun-model-studio - PROOFMESH_MODEL_BASE_URL=<你的地域对应 OpenAI-compatible URL> - PROOFMESH_MODEL_NAME=<实际可用模型 ID> - PROOFMESH_MODEL_API_KEY=<仅在本机秘密存储> - ``` - -5. 回复开发者:`百炼已配置;region=...;model=...`。只给 region/model,不给 key。 -6. 设每日费用上限与告警;评测完成后轮换或撤销该 key。 - -百炼官方说明其 API 提供 OpenAI-compatible 接入;Base URL 与 Key 需按地域和 Workspace 配置:[Model Studio 概览](https://www.alibabacloud.com/help/en/model-studio/what-is-model-studio)、[首次调用 Qwen](https://www.alibabacloud.com/help/en/model-studio/first-api-call-to-qwen)。 - -#### 路径 B:本地 Ollama(无云端数据外发的备份) - -1. 从 [Ollama 官方下载页](https://ollama.com/download) 安装与你机器匹配的版本。 -2. 拉取一个支持工具调用、机器内存可承受的模型,并确认本地 `/v1/chat/completions` 可用。 -3. 设置: - - ```text - PROOFMESH_MODEL_PROVIDER=ollama - PROOFMESH_MODEL_BASE_URL=http://127.0.0.1:11434/v1 - PROOFMESH_MODEL_NAME=<本地模型名> - PROOFMESH_MODEL_API_KEY=ollama - ``` - -4. 回复开发者:`Ollama 已配置;model=...`。 - -Ollama 的 OpenAI-compatible 接口与工具调用能力见[官方兼容性文档](https://docs.ollama.com/api/openai-compatibility)。 - -#### 模型验收门槛 - -同一冻结版本、固定 seed/temperature(模型支持时)至少运行 30 次,覆盖四条路径: - -- 低风险成功; -- 高风险暂停并等待 Human assertion; -- 支付成功、CRM 失败后的补偿; -- 参数/工具/上下文篡改被 Gateway 拒绝。 - -必须导出模型原始 tool-call trace、Proof workflow id、失败原因和 token/延迟;不得把 direct MCP 脚本轨迹冒充模型自主轨迹。 - -### 1.2 支付 sandbox:Stripe 测试环境 - -1. 注册 Stripe 账号,切换到 **Sandbox / test environment**;禁止使用真实银行卡或 live key。 -2. 创建项目专用 sandbox。用官方测试支付方式先创建一笔模拟支付,再做一次退款。 -3. 创建**受限测试密钥**:只允许读取 PaymentIntent/Charge、创建/读取 Refund、读取 Event;不要给客户、转账、账户管理等无关权限。 -4. 如有固定出口 IP,再限制密钥来源 IP;启用请求日志。 -5. 在本机秘密存储: - - ```text - PROOFMESH_VENDOR_TENANT_ID=acme-cn - PROOFMESH_STRIPE_SECRET_KEY= - PROOFMESH_STRIPE_API_BASE=https://api.stripe.com - ``` - -6. 生成 20–50 个 sandbox 案例,至少覆盖:成功、重复幂等请求、退款失败/异步失败、网络在上游成功后中断、对账为 UNKNOWN。 -7. 回复开发者:`Stripe sandbox 已配置;account_id=...`,不要发送 key。 - -Stripe 官方明确测试环境不会移动真实资金,并要求测试调用使用测试密钥:[Testing use cases](https://docs.stripe.com/testing-use-cases)、[Test card numbers](https://docs.stripe.com/testing)。密钥应放在 secret manager/环境变量并使用最小权限的 restricted key:[API key best practices](https://docs.stripe.com/keys-best-practices)。ProofMesh 的 operation id 应映射到 Stripe idempotency key;同一 key 不得改变参数,规则见[Idempotent requests](https://docs.stripe.com/api/idempotent_requests)。 - -### 1.3 CRM sandbox:HubSpot 开发测试账户 - -1. 注册 HubSpot 开发者账号。 -2. 进入 `Development → Testing → Test Accounts → Create`,创建隔离的 configurable test account。 -3. 建立仅安装到该测试账户的 private/static app;只申请 `tickets` scope,不申请 `tickets.sensitive` 或 `tickets.highly_sensitive`。 -4. 创建字段:`proofmesh_workflow_id`、`refund_state`、`refund_amount_bucket`、`proof_digest`。不要创建姓名、电话、地址等演示无关字段。 -5. 在本机秘密存储: - - ```text - PROOFMESH_HUBSPOT_ACCESS_TOKEN=<测试账户 app token> - PROOFMESH_HUBSPOT_API_BASE=https://api.hubapi.com - PROOFMESH_HUBSPOT_OPEN_STAGE_ID=<测试 pipeline 的 open stage ID> - PROOFMESH_HUBSPOT_CLOSED_STAGE_ID=<测试 pipeline 的 closed stage ID> - PROOFMESH_VENDOR_TIMEOUT_SECONDS=3.0 - ``` - -6. 建 20–50 个 ticket,覆盖更新成功、版本冲突、超时后对账成功、权限拒绝和可重试 5xx。 -7. 回复开发者:`HubSpot test account 已配置;account_id=...`,不要发送 token。 - -HubSpot 官方说明开发测试账户用于隔离测试,且可从 Development 页面创建:[Account types](https://developers.hubspot.com/docs/getting-started/account-types)、[Configurable test accounts](https://developers.hubspot.com/docs/developer-tooling/local-development/configurable-test-accounts)。Ticket API 的最小 scope 是 `tickets`:[Scopes](https://developers.hubspot.com/docs/apps/developer-platform/build-apps/authentication/scopes)。 - -### 1.4 公开 GitHub 仓库与参赛身份 - -1. 登录参赛者本人或团队组织的 GitHub;开启 2FA。 -2. 新建公开仓库,建议名称 `proofmesh-action-control-plane`,描述写清 Agent Infra / AgentTeams / Apache-2.0。 -3. **不要初始化 README/LICENSE**,避免与本地发布树冲突;先给开发者空仓库 URL,之后再由你明确授权推送。 -4. 提供以下非敏感信息,写入提交材料: - - - 团队名称; - - 参赛成员姓名与角色; - - 单位/学校(如允许公开); - - 公开联系邮箱; - - GitHub URL; - - 比赛报名编号(如有)。 - -5. 首次发布使用冻结 tag(例如 `v1.0.0-competition`),上传源码、release ZIP、SHA256SUMS、SBOM、PPT PDF 和复现说明。 -6. 开启 Issues、Discussions、Actions;保护 `main`;Actions 默认 `GITHUB_TOKEN` 只读;任何云服务密钥只进入 Actions secrets/environment,不能进入代码或日志。 -7. 邀请独立复现者为只读/triage;如果他要提交报告,优先用 Issue/PR,不给管理员权限。 - -GitHub 的官方建仓步骤见[Creating a new repository](https://docs.github.com/en/repositories/creating-and-managing-repositories/creating-a-new-repository),secret 设置见[Using secrets in GitHub Actions](https://docs.github.com/en/actions/how-tos/write-workflows/choose-what-workflows-do/use-secrets),最小权限和 fork 安全边界见[Secure use reference](https://docs.github.com/en/actions/reference/security/secure-use)。 - -### 1.5 200–500 条工单与一位独立复现者 - -#### 数据:先授权,再匿名化,再搬出数据方环境 - -1. 找一家具备真实退款/售后流程的小型电商、SaaS 或校内服务团队;明确这里只做离线 shadow,不触达生产支付。 -2. 由数据负责人签署本仓 `docs/templates/data-authorization-and-anonymization-checklist.md`;写明目的、字段白名单、数量、保留期、删除日和可公开聚合指标。 -3. **在数据所有方环境内**先删自由文本和直接标识符;不要先导出再脱敏。 -4. 推荐只保留:风险分层、金额区间、币种、商品类别、订单年龄区间、是否重复请求、当前状态、期望动作、最终标签、故障类别。时间只保留相对区间。 -5. 工单/订单 ID 用项目专用随机映射,不用可逆的明文哈希;映射表留在数据方且不交付。 -6. 由不参与开发的人抽查重识别风险;发现姓名、手机号、邮箱、地址、证件、账号、聊天原文即停止导入。 -7. 冻结数据集摘要与 schema;只把匿名数据文件放到本机受限目录,不上传聊天。公开仓库只提交数据字典、聚合统计、数据集 hash 和评测报告。 -8. 先用 50 条 dry run,再盲跑剩余 150–450 条;不得根据测试标签临时改策略。报告全部失败样本和置信区间。 - -仓内已经提供严格导入器。它要求 case 与 blind label 分离、200–500 条、closed enum schema、随机 `pmc_` 标识、分层覆盖和授权引用;报告只输出计数与 hash,不回显工单内容: - -```text -PYTHONPATH=src python scripts/pilot/validate_pilot_dataset.py \ - --cases /受限目录/cases.jsonl \ - --labels /受限目录/blind-labels.jsonl \ - --origin AUTHORIZED_HISTORICAL \ - --authorization-ref AUTH-2026-PM-001 \ - --reviewed-by reviewer@example.org \ - --output /受限目录/pilot-dataset-report.json -``` - -这份报告仍只证明 schema/hash/覆盖;“客户试点”只有在外部 claim gate 同时绑定授权记录和独立评审后才能升级为 VERIFIED。 - -中国《个人信息保护法》要求处理个人信息遵循合法、正当、必要、最小范围;“去标识化”仍不同于“匿名化”,只有无法识别且不能复原才符合其匿名化定义。操作前应由数据方负责人/法务确认授权与处理基础,本手册不替代法律意见。官方全文见[工业和信息化部转载文本](https://www.miit.gov.cn/jgsj/zfs/fl/art/2022/art_515a4b20c12f430eab54bb4f56d89f56.html)。 - -#### 独立复现:必须与开发过程分离 - -复现者最好是未参与代码开发的安全、平台、审计或业务同学。把以下材料交给他: - -- 冻结 release URL、tag、commit 和 SHA256; -- 一页 quickstart,不提供开发机数据库/私钥; -- 预期只描述“不变量”,不要提前告诉具体输出 hash; -- 本仓 `docs/templates/independent-reproduction-attestation.md`。 - -他应在干净机器完成:校验 ZIP hash、安装、全量测试、三条 reference proof 包外复验、629 授权回放、240 合成故障盲测、至少一个篡改负例。开发者不能远程操作其机器;如需帮助,先记录原始失败,再另开修复版本。最终提交签名报告、机器环境、开始/结束时间、命令结果、差异和公开 Issue URL。 - -## 2. 两周执行节奏 - -| 时间 | 你负责 | 开发侧负责 | 完成定义 | -|---|---|---|---| -| D0–D1 | 模型、Stripe、HubSpot、GitHub 建号 | 冻结 adapter 合同与 secret 边界 | 四项均只在本机配置,仓库无 secret | -| D2 | 运行模型 4 路径 | 固化 tool trace / ablation / Proof 关联 | ≥30 次模型轨迹,可复算、失败全量披露 | -| D3–D4 | 提供 sandbox 非敏感 ID | 接通支付/CRM、故障注入与对账 | 无真实资金;重复副作用为 0;UNKNOWN 停机 | -| D5 | 确认公开身份与仓库 | 发布 tag、CI、SBOM、复现包 | 外部从 URL 可下载并验 hash | -| D6–D8 | 获得书面数据授权并在数据方环境匿名化 | 导入器、schema 校验、冻结策略 | 200–500 条;无直接标识符;dataset hash 固定 | -| D9–D10 | 安排独立评审 | 只响应公开缺陷,不代跑 | 独立报告含原始失败与最终结果 | -| D11–D12 | 确认允许公开的聚合结果 | 更新 PPT/白皮书/视频 | 所有数字可追到 artifact,不夸大 sandbox/试点 | -| D13–D14 | 完成报名与最终签字 | 重建 release + SHA + submission gate | 提交物一致、链接有效、身份完整 | - -## 3. 给开发者的安全回执格式 - -你可以复制下列格式回复;未完成的行留空。不要附密钥或客户文件。 - -```text -模型:provider=百炼/OpenAI/Ollama;region=...;model=...;本机已配置=yes/no -Stripe:sandbox account id=...;restricted test key 本机已配置=yes/no -HubSpot:test account id=...;tickets-only token 本机已配置=yes/no -GitHub:公开空仓库 URL=... -参赛身份:团队名=...;成员/角色=...;单位=...;公开邮箱=...;报名号=... -数据:数据方书面授权=yes/no;预计匿名工单数=...;文件仅在本机受限目录=yes/no -复现者:角色/单位(可匿名描述)=...;预计复现日期=... -``` - -## 4. 95+ 的严格 Claim Gate - -只有下表全通过,材料才可升级措辞: - -| 拟声称内容 | 必需证据 | 不足时的准确措辞 | -|---|---|---| -| “模型自主多 Agent 协同” | 模型服务原始 trace + TeamHarness 7 步 + 4 业务路径 + 多次重复统计 | “direct MCP lifecycle 已验证,模型通道待外部凭证实跑” | -| “真实支付/CRM 集成” | 供应商 sandbox request id、幂等 key、对账日志、无 live 数据证明 | “独立 HTTP 合成 sandbox” | -| “客户试点” | 数据方授权、真实业务样本、冻结方案、盲测报告 | “合成/公开基准评测” | -| “独立复现” | 外部人员、独立机器、冻结 hash、签名报告和公开链接 | “开发者本机复验” | -| “生产就绪” | 企业 IdP/KMS/数据库、容量与故障演练、安全评估、SLA | “生产边界接口与部署参考已实现” | - -任何一项不满足,都保留右栏表述。这样做不是保守,而是让评委无法用一个追问击穿整套可信度。 diff --git a/docs/agentteams-official-mapping.md b/docs/agentteams-official-mapping.md index 93de3fd..a5cc2d6 100644 --- a/docs/agentteams-official-mapping.md +++ b/docs/agentteams-official-mapping.md @@ -60,7 +60,7 @@ flowchart LR 选择 AgentTeams 首先是赛题强制要求,其次是它的原生 Human / Worker / Team 资源、TeamHarness Project / Task 状态流、Matrix 协作面和 MCP / Skill 接口与本项目“角色职责分离 + 可审计交接”一致。ProofMesh 没有在 AgentTeams 外另造一个同名编排器来规避框架。 -竞赛提交中 **AgentTeams 不可替换**。在赛后产品化中,可替换的是模型 provider、Worker runtime、对象存储、Matrix 展示面以及支付/CRM/记忆后端;替换必须保留以下合同:稳定 Project/Task ID、显式 DAG 与前驱 digest、角色身份、可暂停的 Human gate、幂等任务状态、结果摘要和审计 trace。ProofMesh 的 Action Passport、Gateway 与 Proof Verifier 不依赖某个模型厂商,但仍通过适配层与 AgentTeams 协同账本关联。 +ProofMesh 把 **AgentTeams 作为协作平面**。产品化时可替换模型 provider、Worker runtime、对象存储、Matrix 展示面以及支付/CRM/记忆后端;替换必须保留稳定 Project/Task ID、显式 DAG 与前驱 digest、角色身份、可暂停的 Human gate、幂等任务状态、结果摘要和审计 trace。ProofMesh 的 Action Passport、Gateway 与 Proof Verifier 不依赖某个模型厂商,但仍通过适配层与 AgentTeams 协同账本关联。 ## 6. `v1.2.2` 迁移门禁与成本 diff --git a/docs/architecture.md b/docs/architecture.md index 2511d36..1dd35cc 100644 --- a/docs/architecture.md +++ b/docs/architecture.md @@ -9,7 +9,7 @@ ProofMesh 不负责让模型“更聪明”,而负责让多 Agent 的业务动 - **失败后可恢复**:重试以逻辑操作而不是本次 token 为中心,崩溃后先对账,再决定回放或进入未知态; - **执行后可证明**:独立 Verifier 使用系统之外的信任锚复算签名、链,并验证由商务上游独立身份签名的业务终态。 -竞赛用例是一条客户退款 Saga。SQLite 商务靶场会真实执行余额扣减、退款记录、工单关闭和补偿恢复,因此能验证事务与故障恢复;它不连接真实企业账户。 +退款参考用例是一条本地 Saga。SQLite 商务靶场会真实执行余额扣减、退款记录、工单关闭和补偿恢复,因此能验证事务与故障恢复;它不连接真实企业账户。 ## 2. 控制面与数据面 diff --git a/docs/competition-research.md b/docs/competition-research.md deleted file mode 100644 index 3bdda04..0000000 --- a/docs/competition-research.md +++ /dev/null @@ -1,121 +0,0 @@ -# GOAI「新智基座 Agent Infra」赛题研究与获奖策略 - -> 版本基准:2026-08-12。赛程可能调整,提交前应再次核对[官方赛道页](https://www.goaihz.com/tracks?track=infra)与组委会通知。 - -## 1. 官方要求的本质 - -官方把赛道目标写得非常明确:面向企业级复杂任务构建多 Agent 基础设施与协同系统,推动 Agent “从 Demo 走向 Production”;作品需设计不少于 3 个不同职能 Agent,并覆盖任务拆解、上下文传递、工具调用、结果验证、执行证据、安全审计、审批/回滚与经验沉淀。 - -三个不能规避的要求: - -- **AgentTeams 必选**:不是在 PPT 写一个名字,而是把角色编排、任务拆解、上下文、协同执行和状态追踪映射到真实框架能力; -- **Skill 必选**:要有输入输出、调用条件、依赖工具、失败处理、安全边界、验证方式、复用、版本和分发; -- **工程证据优先**:复赛要求可执行 AgentTeams 包与可运行 Demo/视频,评审要看日志、Trace、Metrics、运行报告、权限、密钥、审批、回滚、降级和审计。 - -官方还明确:推荐云产品不按数量加分,关键是必要性、接口契约、可替换性、权限边界、闭环证据与迁移成本。因而“堆产品 Logo”不是获奖路线。 - -## 2. 为什么选智能客服退款 - -官方开放选题的“智能客服自主闭环”示例直接包含:多渠道工单、意图分级、退款/换货/账户变更、结果核验、客户确认和知识沉淀。ProofMesh 选择退款不是随便造一个 Demo,而是把官方建议场景中最难、最可审计的一类副作用做深: - -- 退款有真实金额与累计预算,错误不能靠重新生成文本弥补; -- 工单、订单、退款跨系统,天然需要上下文一致性; -- 高风险金额需要职责分离与人工审批; -- 支付成功而 CRM 失败是标准分布式 Saga; -- 最终结论必须回查余额和工单,而不是相信 Agent 自报成功。 - -更重要的是,参赛成果不是“退款机器人”,而是可迁移到换货、账户变更、理赔、授信、运维修复和研发发布的 **Agent Action Control Plane**。退款是第一个苛刻验证靶场;生产运维变更已作为第二业务域运行四条路径,证明协议迁移并非只停留在叙事层。 - -## 3. 评审权重与 ProofMesh 对位 - -| 官方维度 | 权重 | ProofMesh 的得分抓手 | 必须展示的证据 | -|---|---:|---|---| -| 场景价值与行业复制 | 25% | 高风险客服副作用;Action Passport/Verifier 可跨行业复用 | 退款事故链、迁移矩阵、[试点 KPI 计分卡](pilot-value-scorecard.md) | -| 多 Agent 协同与闭环 | 25% | 7 角色、CAS 状态机、Human pause/resume、Saga 补偿、独立验真 | AgentTeams DAG、task receipt、异常分支、职责隔离 | -| Skill 工程体系 | 25% | 7 个官方布局 Skill/ZIP,闭合 schema、错误码、安全边界 | 每个 Skill 的合同、版本、校验与分发包 | -| 工程、安全、运行验证 | 20% | MCP 双面、Action Passport、逻辑操作/租约/对账、外部信任锚、K8s admission、629 case 回放 | 实跑 Demo、Proof Valid、测试、报告、容器与部署材料 | -| 开放/开源 | 5% | Apache-2.0、AgentDojo 归属、可复现脚本、接口文档 | LICENSE、THIRD_PARTY、README、公开仓库 | - -## 4. 差异化:评委为什么不应把它归为普通 Agent Demo - -普通方案常停在“七个角色依次输出文本”。ProofMesh 的差异是把协同结论变成**执行许可与可验证业务结果**: - -1. Worker 只调用高层任务工具,底层 Action Passport 对模型不可见; -2. 许可证精确绑定工具、资源、参数、金额、预算、策略与审批; -3. 审批只把状态从 `WAITING_APPROVAL` 变为 `AUTHORIZED`,不会把审批按钮偷偷做成执行按钮; -4. 重试围绕逻辑操作,用 owner/generation/lease/fencing 与上游对账避免重复退款; -5. CRM 失败后执行真实补偿,并由另一个 Agent 回查余额恢复和工单开放; -6. Proof Verifier 不信任包内 trust root,能拒绝“整包换根重签”和“签名正确但金额/工单拼错”; -7. 公开 AgentDojo 629 case 回放提供可复现合同指标,不把合成样例冒充模型 ASR。 - -一句话获奖主张: - -> 目标架构中,AgentTeams 负责多 Agent 协作;ProofMesh 负责证明动作被正确的人、在正确范围内授权并可恢复执行,并且失败后回到了可验证状态。 - -## 5. 官方技术项覆盖 - -| 官方项 | 当前实现 | 判断 | -|---|---|---| -| 至少 3 Agent | 7 个 Worker Agents;另有 1 个 Human approver;Team 是编排资源,不计作 Agent | 超额覆盖 | -| Agent Identity 清单 | `docs/agent-identity-register.md`(附录 A 八字段)+ `human.yaml`、`workers.yaml`、`team.yaml`、manifest/SOUL/AGENTS | 已覆盖 | -| AgentTeams 基点 | 已实跑基线锁定 v1.2.0-beta.1 / commit `78d0ced...`;资源、ZIP、bootstrap、TeamHarness DAG;针对 Manager REST 缺失 `workerMembers` 映射提供 commit/hash 锁定的最小兼容补丁 | Team Active 与 direct lifecycle 已证;当前 stable v1.2.2 仅为迁移目标,尚未验证;[五项官方映射与迁移门禁](agentteams-official-mapping.md) | -| Skill | 7 个 Skill,输入/输出 schema、调用条件、依赖、失败、安全、错误码 | 已覆盖 | -| MCP | 7 个角色端点 + 内部动作网关;JSON-RPC initialize/list/call | 已覆盖 | -| 上下文能力至少 2 项 | 共享状态 + 记忆存储 + 轨迹/回执/指标 | 不依赖 RAG 仍满足 | -| 可观测 | 事件链、task/gateway receipt、Prometheus metrics、OTel GenAI 字段 | 已覆盖,生产后端待接 | -| 官方云 Skill | `alibabacloud-sls-query` 的只读采用 / RAM / 脱敏契约 | 设计已覆盖;无云账号与运行日志,不冒充实跑 | -| 审批/回滚 | digest-bound approval + Saga compensation + postcondition verify | 已覆盖 | -| 运行验证 | 业务 E2E、并发/崩溃测试、629 case 合同回放、Verifier 负向测试 | 已覆盖 | -| 开源 | Apache-2.0、第三方归属、构建/测试/部署说明 | 已覆盖 | - -## 6. 当前证据分级 - -为了避免评委发现“包装”,所有主张采用四级标签: - -- **L1 静态可审计**:YAML、Skill、schema、ZIP、架构和源代码; -- **L2 本地确定性实跑**:三条真实 SQLite 业务路径、自动化测试、Proof Verifier; -- **L3 官方控制面实跑**:官方 AgentTeams Manager/Controller 进程、资源 CR、Worker/TeamHarness health 与直接 MCP project/task 生命周期; -- **L4 模型驱动协同实跑**:真实模型凭证下由 QwenPaw Leader/Workers 自主认领并完成任务。 - -L4 没有原始日志时绝不宣称“七 Agent 自主运行成功”。这份诚实边界本身就是安全与工程成熟度证据。 - -当前 L3 的精确边界是:锁定官方源码的最小补丁已通过三个 Go 合同测试并构建为单层兼容镜像;Human、七个 Worker 与 TeamHarness health 已实测,七成员 Team=`Active`。同一 Project 下的 direct MCP `create → plan → delegate → ack → submit → check → accept` 已跨 Leader / Worker 容器完成。它证明控制面状态流,不证明 placeholder provider 下的模型自主协同;可选 Matrix artifact publication 仍有 ATB-007 open finding。 - -## 7. 赛程与提交策略 - -官方赛程(北京时间): - -| 阶段 | 时间 | 提交 | -|---|---|---| -| 初赛 | 7.16–8.16 | 500 字内作品简介、方案 PPT/PDF;AgentTeams 代码包可选 | -| 初赛评审 | 8.17–8.24 | Top 30 进入复赛 | -| 复赛 | 8.25–9.3 | 更新方案、可执行 AgentTeams 包、可运行 Demo/视频 | -| 复赛评审 | 9.4–9.10 | Top 15 进入决赛 | -| 决赛 | 9.22 | 现场路演 PPT、现场 Demo、最终仓库/工程材料 | -| GOAI DAY | 9.23 | 颁奖、展示与生态对接 | - -截至 2026 年 8 月 13 日,官网列示初赛于 8 月 16 日截止;具体提交时刻以报名系统和组委会最新通知为准。当前策略不是继续无边界加功能,而是: - -1. 先锁定真实、可复现、无夸张的代码与指标; -2. 初赛 PPT 用“行业痛点 → 核心机制 → 三条实跑证据 → 评分映射 → 复赛路线”完成闭环; -3. 可选代码包主动提交,利用超出初赛强制要求的工程完成度拉开差距; -4. 复赛只增加真实模型驱动 AgentTeams 证据、视频、外部存储/网关适配,不推翻架构; -5. 决赛准备断网可演示的本地路径,同时保留 L3/L4 原始日志与一键验真。 - -## 8. 仍会丢分的地方与行动 - -| 风险 | 影响 | 行动 | -|---|---|---| -| 缺少真实模型 API 凭证 | 不能完成 L4 QwenPaw 自主协同证据 | 复赛前配置合规模型账号,跑官方 E2E 风格任务并保留 Matrix/TeamHarness 原始记录 | -| placeholder provider 未产生模型协同 | Team 与 direct MCP lifecycle 已实证,但不能证明模型自主规划 / 认领 | 接入合规模型凭证,跑七角色业务 trace,并保留 Matrix/TeamHarness 与 ProofMesh 双账本 | -| 生产 adapters 仍是参考实现 | 评委可能误以为 OIDC/PostgreSQL/remote signer 已连接真实设施 | 明示“代码已实现、环境未接入”;复赛连接企业测试设施并保留去敏部署与故障证据 | -| Stripe/HubSpot adapter 未实跑 | sandbox-ready 不等于已接真实测试账户 | 用最小权限测试凭证跑成功、补偿、UNKNOWN、重复和参数漂移路径,保存上游对账回执 | -| 无第三方安全评估 | 安全主张仍是自证 | 发布威胁模型,邀请独立审查,记录整改前后证据 | -| 价值 KPI 主要是推演 | 25% 场景价值可能不足 | 按[统一计分卡](pilot-value-scorecard.md)找 1 家客服/电商团队做 200–500 条历史工单 shadow / sandbox 盲测 | -| 初赛叙事过技术化 | 评委可能看不见商业价值 | 首页先讲“防错付、可追责、可恢复”,技术细节下沉到证据页 | - -## 9. 最终判断 - -这个方向有获奖潜力,因为它同时命中官方推荐的智能客服场景、AgentTeams/Skill 强制项和“Demo → Production”的赛道主轴,而且选择了多数参赛方案最薄弱的执行安全与证明层。真正的竞争优势不在代码行数,而在于把每一项高分主张都变成评委可以当场复现、篡改、拒绝和验真的证据。 - -按官网 25/25/25/20/5 维度形成的**工程准备度内部自评约为 88/100(22/20/22/20/4)**:退款三路径与生产运维四路径证明协议跨两个业务域复用;162 项测试、生产迁移参考适配、Team Active 与 direct MCP lifecycle 提升了工程完整度。这不是主办方评分:`modelDriven=false`,生产 adapters 未接真实设施,Stripe/HubSpot 仅 sandbox-ready,且模型实跑、vendor sandbox、授权历史试点、独立复现、公开仓库/身份、生产设施六项外部 Claim 全部 `PENDING`。95+ 只能靠这些外部证据,不能靠继续增加本地代码或合成样本。逐项口径与门槛见 [judge-scorecard.md](judge-scorecard.md) 和 [95+ evidence runbook](95-plus-evidence-runbook.md)。 diff --git a/docs/judge-console-compensated-current.png b/docs/console-compensated-reference.png similarity index 100% rename from docs/judge-console-compensated-current.png rename to docs/console-compensated-reference.png diff --git a/docs/defense-qa.md b/docs/defense-qa.md deleted file mode 100644 index 911d5e3..0000000 --- a/docs/defense-qa.md +++ /dev/null @@ -1,101 +0,0 @@ -# 决赛答辩高压 Q&A - -## 1. 这不还是一个退款 Demo 吗? - -不是。退款是第一个验证靶场;第二个已实现的业务域是生产运维变更。退款域有自动、审批、补偿 3 条参考路径;运维域有低风险完成、高风险外部签名审批完成、健康失败补偿、对账不明 `UNKNOWN_MANUAL` 4 条路径。两域复用 Action Passport、AuthorizedToolCaller、GatewayStore、Execution Receipt 与包外 Verifier,但各自拥有独立 policy、业务状态和补偿语义。因此可迁移性已有运行证据,不只是把字段换名字;它仍是 reference workflow,不等于真实企业运维平台已接入。 - -## 2. 为什么说不是玩具? - -因为它真的改变事务状态,并对生产故障语义负责:余额与退款记录原子提交;并发 revision 使用 CAS;长调用续租;旧进程用 fencing 失去提交权;崩溃接管先上游对账;结果未知停止自动重放;CRM 失败后真实补偿;独立 Verifier 回查余额、退款和工单。界面只是这些机制的观察窗。 - -## 3. 没有真实模型,怎么叫多 Agent? - -控制面能力与模型推理能力必须分开。七个身份、角色工具、状态机、task receipt 和 AgentTeams 资源是确定的;模型驱动 QwenPaw 自主认领仍必须有真实模型凭证和原始 TeamHarness/Matrix 记录。当前 L1/L2 已验证,L3 已有 Team Active 与跨 Leader/Worker 的 direct MCP 生命周期实证,但不声明 L4。这样避免把控制面直调冒充模型自主协同。 - -## 4. AgentTeams 是不是只写进了 PPT? - -不是。交付锁定官方 v1.2.0-beta.1,包含 Human、7 qwenpaw Workers、Team 定义、退款 DAG、7 个官方根目录 ZIP、bootstrap 和严格 validator;每个 Worker 绑定唯一角色 MCP 与工具。我们针对 beta Manager REST 未映射 `workerMembers` 的缺口构建了最小补丁 Controller;补丁镜像上 Team 已 `Active`,Leader 与六个 Worker ready,7/7 Worker Running。 - -我们没有用旧 inline Team 绕过,因为那会重复创建 Worker,破坏解耦身份。补丁只让 Create REST DTO 接收 `workerMembers`,非空时走既有解耦控制器,空时完全保留 legacy 校验/映射;三个 Go 合同测试已通过,镜像已从锁定源码构建并运行。随后 direct MCP 在同一 Project 下跨 Leader 与 ticket-intake 两个真实容器完成 `create → plan → delegate → ack → submit → check → accept`。这证明控制面生命周期,不证明 placeholder provider 下的模型自主协同。 - -## 5. 审批是不是万能放行? - -不是。审批只能在 `WAITING_APPROVAL` 状态记录,要求与请求者不同的已认证主体、当前 revision、足够理由、精确 scope、plan digest 与 policy digest 一致。成功后只进入 `AUTHORIZED`,不会执行副作用。Executor 还要单独调用;网关在执行瞬间再次验证 approval digest。 - -高风险审批现在必须携带包外 approval-service Ed25519 JWS。断言精确绑定 issuer、subject、workflow / project / tenant、当前 revision、context / policy / plan、理由摘要、两项具体动作参数、金额、币种与短时窗口;API Bearer subject 与 assertion subject 必须一致。Workflow、Gateway 和包外 Verifier 三处分别验签,Gateway 对超过固定自动金额阈值却伪标 `AUTOMATIC` 的 Passport 直接拒绝。审批服务 issuer 必须出现在包外 trust bundle 的独立 allowlist;控制面和 `build_runtime` 不持有审批私钥。 - -参考证据中的断言由独立脚本/目录中的 synthetic key 签发,`acr=urn:proofmesh:reference:synthetic-approval`、`amr=[reference-script]`,不冒充企业 SSO 或 MFA。生产必须替换为真实企业 IdP / 审批服务及其 assurance claim。当前 Gateway 能独立重算金额门槛,但没有独立风险评分事实源;“低金额但因风险分要求人工”的控制面攻陷绕过仍是待生产化的残余边界。 - -## 6. 为什么不承诺 exactly-once? - -跨进程和外部系统无法只靠本地数据库数学保证 exactly-once。ProofMesh 提供可实现的语义:稳定 logical operation id、上游幂等、fenced owner、租约、对账和 UNKNOWN 停止重放。只有上游也支持按 operation id 去重/查询时,才能把重复副作用风险压到协议边界内;否则诚实地进入人工对账。 - -## 7. 进程在扣预算后、上游执行后、写 receipt 前崩溃怎么办? - -新的等价凭证接管同一逻辑操作,不再次扣预算。过期租约后先用稳定 operation id 查询上游:已成功则用查询结果完成封存;确认不存在才重派;无法判断则 `UNKNOWN`。finalize 还需 owner/generation CAS,旧进程恢复也不能覆盖新 owner。 - -## 8. 攻击者替换 Proof 包里的公钥,再把整包重签呢? - -Verifier 不使用包内根。trust bundle 是命令行/部署侧外部输入,并严格验证 public key、issuer、token type、有效期和撤销字段。攻击者能重签自己的包,但无法让外部 pinned key 接受。 - -## 9. 如果每个签名都有效,但把金额或工单拼错呢? - -这正是语义 Verifier 与“只验签”的差别。Verifier 跨 request、plan、approval、task receipt、gateway receipt 和由 Commerce 独立 key 签名的最终 snapshot,核对 tenant、workflow、tool、resource、amount、currency、order/ticket/refund 关系与余额公式。Proof Sealer 无权签 Commerce attestation;签名正确但语义不一致仍然失败。 - -## 10. 拒绝请求也有签名证明吗? - -当前没有。成功执行产生签名 execution receipt;拒绝写入 `gateway_denials` SQLite audit row。报告明确区分,未把拒绝行包装成外部不可抵赖回执。生产版可以增加独立 denial signer/透明日志,但必须考虑拒绝洪泛和存储成本。 - -## 11. AgentDojo 的 100% 是不是“安全率 100%”? - -不是。100% 指在 2,159 个固定 user ground-truth 合同上全部接受,并对工具/参数/上下文错配全部拒绝;它不运行模型,不测提示注入 ASR 或 task utility。报告给出 Wilson 区间,并将 placeholder 保留为符号值。我们证明授权网关符合合同,不证明模型不会生成危险计划。 - -## 12. 为什么用 TraceBackend,不执行 AgentDojo 真实外部工具? - -本实验测的是控制面授权一致性和幂等副作用计数。TraceBackend 是确定性、无外部账号的效果接收器,能精确判断是否重复派发。要测端到端 utility/ASR,必须在独立环境运行官方模型 runner,并与本实验分开报告。 - -## 13. SQLite 怎么能叫企业级? - -SQLite 是可审计参考靶场,不是最终 HA 存储。项目现已增加 PostgreSQL GatewayStore 参考实现,覆盖事务锁、租约/fencing、reconcile 与 `UNKNOWN`;生产容器依赖也已分层。但它尚未连接真实 PostgreSQL 集群,工作流/业务/ledger 仍有 SQLite 边界,也未完成迁移、备份恢复和 HA 演练。因此只能说“生产迁移接口已实现”,不能说“生产数据库已验证”。 - -## 14. Saga compensation 就等于 rollback 吗? - -不是所有外部副作用都能物理回滚。这里的补偿是新的受控业务动作:将退款标记为 `COMPENSATED`、恢复可退款余额、确保工单开放。它有独立 Passport、receipt 和 postcondition。若补偿失败,系统 `BLOCKED` 并升级人工,而不是写一条“已回滚”日志。 - -## 15. 为什么不用 RAG?是否不满足赛题? - -官方要求在记忆、知识库 RAG、共享状态、轨迹可观测四项中至少实现两项。ProofMesh 实现共享状态、脱敏记忆和可观测回执/事件/指标,因此不需要为了 Logo 强行加 RAG。真实客服知识检索可在 Investigator Skill 后接,但授权控制面不应依赖非确定性检索结论。 - -## 16. Kubernetes NetworkPolicy 就能防 Worker 旁路吗? - -不能单独防。NetworkPolicy 限制网络路径;Admission 防止工作负载自行改策略摘要/镜像;上游工具还必须验证 gateway 的 mTLS/SPIFFE 身份并拒绝 Agent ServiceAccount。三者共同形成边界,标签本身不是凭证。 - -## 17. Skills 的复用在哪里? - -七个 Skill 都有闭合输入/输出 schema、调用状态、依赖 MCP、失败策略、安全边界、证据要求和错误码;Worker 包使用官方目录结构,能独立版本和分发。退款与运维两个业务域已复用同一授权、恢复和验真协议,证明它们不是一次性 prompt;当前仍缺外部使用者和云端实跑证据。 - -## 18. 商业价值如何量化? - -当前能直接测的工程 KPI 是重复副作用、非法错误通过、人工门禁、补偿恢复和审计复算时间。商业 KPI 需在真实历史工单盲测:自动闭环率、人工触达率、重复退款率、平均处理时长、异常恢复时长和审计取证时间。PPT 中应将目标值标为待试点验证,不能把工程回放推成财务收益。 - -统一定义、数据源、公式与两周试点流程已写入 `docs/pilot-value-scorecard.md`。年度风险避免 / 审计效率公式只在企业提供工单量、基线异常率、损失和人力成本后代入;不能凭空填一个“节省 XX%”。 - -## 19. 最大已知风险是什么? - -三个:一是上游缺少稳定幂等/对账接口时无法消除未知副作用;二是真实模型驱动 AgentTeams 协同尚缺模型凭证和端到端业务 trace;三是尚无真实 sandbox、授权历史工单和独立复现形成外部证据。我们分别用 `UNKNOWN` fail-closed、`modelDriven=false` 和六项 Claim 全部 `PENDING` 约束宣传口径。 - -## 20. 为什么这个项目可能赢? - -它不是把七个 Agent 排成流水线,而是补上赛题“Demo → Production”最难的执行层:谁能做什么、这一次能做多少、重试如何不重复、失败如何恢复、系统之外如何验证。每个主张都有可运行代码、负向测试和诚实边界,评委可以当场篡改并看到系统拒绝。 - -## 21. 为什么没有直接堆阿里云官方 Skills? - -官网明确推荐项目和云产品不按使用数量评分。ProofMesh 只选择一个与证据链直接相关的官方 Skill 接入点:`alibabacloud-sls-query`,用于对脱敏 workflow / gateway / verifier 事件做只读检索;它只需要 GetIndex / GetLogsV2 权限,无退款写权限,也不能决定 Proof 是否有效。当前只有采用契约,没有阿里云账号与运行日志,因此不声称云端实跑。权限和复赛验收材料见 `docs/aliyun-skill-adoption.md`。 - -## 22. 如果你是评委,现在会给多少分? - -工程准备度内部自评约 88/100:场景 22/25、多 Agent 20/25、Skill 22/25、工程 20/20、开源 4/5。依据是两个业务域、162 项测试、Team Active/direct lifecycle、生产迁移参考适配与供应链门禁。这不是主办方评分:`modelDriven=false`,production adapters 未连接真实设施,Stripe/HubSpot 仅 sandbox-ready,公开仓库、授权试点和独立复现尚未完成,六项外部 Claim 全部 `PENDING`。所以当前不能严谨自称 95+、前三或冠军。见 `docs/judge-scorecard.md`。 - -## 23. 生产适配器和 Stripe/HubSpot 代码不是已经解决外部证据了吗? - -没有。OIDC/JWKS、PostgreSQL GatewayStore、remote signer 和供应链 provenance 是生产边界的参考实现,尚未连接真实企业 IdP/KMS/数据库;Stripe 与 HubSpot adapter 已实现真实 API 语义和密钥护栏,但没有测试账户 run。只有保存去敏环境标识、请求/对账摘要、上游回执、失败样本、commit 和独立验证结果,才可把对应 Claim 从 `PENDING` 升级。完整步骤见 `docs/95-plus-evidence-runbook.md`。 diff --git a/docs/demo-script.md b/docs/demo-script.md deleted file mode 100644 index bac70fd..0000000 --- a/docs/demo-script.md +++ /dev/null @@ -1,109 +0,0 @@ -# ProofMesh 现场 Demo 脚本(4 分 30 秒) - -## 演示前 10 分钟 - -1. 停止旧服务,运行 `make clean-runtime`; -2. 加载七个 Agent 角色、职责分离的 Approver 与 Auditor 共九个不同 token,启动 `127.0.0.1:8000`; -3. 确认 `/health` 与 `/ready` 成功; -4. 预跑 `pytest -q` 和 629 case 报告校验; -5. 浏览器保持 100% 缩放,先折叠角色凭证; -6. 另开终端准备证明验真命令,断网也能运行。 - -不要在录屏或投屏中展示 `.env`、AgentTeams 管理员口令、模型 key 或 gateway consumer key。 - -## 0:00–0:35|痛点与主张 - -画面:控制台首页。 - -讲述: - -> 多 Agent 会调用退款、工单和账户工具,但企业真正担心的是:模型临时改了参数怎么办?重试会不会退两次?审批是不是顺手就执行了?日志能不能被整包重签?ProofMesh 给每个副作用发一张短期、精确范围的 Action Passport,并在执行后生成可由系统之外复算的证明。 - -指出页面右上角 `mcp-action-gateway · external trust` 与七角色 DAG。 - -## 0:35–1:35|高风险审批不是执行按钮 - -1. 选择“高风险人工审批”; -2. 点击“创建隔离案件”; -3. 点击“推进至下一门禁”。 - -必须看到: - -- `WAITING_APPROVAL`; -- `next task = record_human_approval`; -- 推进按钮禁用; -- 计划摘要与 scope 展示; -- 事件链 `VALID`; -- 此时没有 `saga.executed`。 - -讲述: - -> Orchestrator、Intake、Investigator 和 Policy 分别提交带 revision 的签名任务回执。策略冻结了金额、订单版本和动作范围,然后项目真正暂停。审批绑定 plan digest 与完整 scope,而且请求者不能审批。 - -点击“记录限定审批”。必须停在 `AUTHORIZED`,`next task = execute_authorized`。 - -> 注意,审批只改变授权状态,没有隐藏执行;Executor 仍需单独领取任务。 - -再点击“推进至下一门禁”,到 `COMPLETED`,点击“离线语义验真”,必须显示 `PROOF VALID`。 - -## 1:35–2:40|故障发生在真实副作用之后 - -点击“开始另一案件”,选择“下游故障与补偿”,创建并推进。 - -必须看到: - -- 最终 `COMPENSATED`; -- `next task = terminal`; -- 网关回执数量增加; -- 事件包含 `saga.executed`、`postconditions.verified`、`workflow.sealed`; -- 点击验真得到 `PROOF VALID`。 - -讲述: - -> 这不是把 JSON 里的 `passed` 改成 true。系统先真实扣减订单可退款余额并创建退款,随后 CRM 关单故障。Executor 使用另一张补偿许可证恢复余额;Verifier 重新读取退款、订单和工单,确认退款为 COMPENSATED、余额回到原值、工单仍开放,Memory Worker 才能封存证明。 - -## 2:40–3:30|为什么重试不会退两次 - -画面:架构/PPT 的 logical operation 图或 `docs/architecture.md`。 - -讲述: - -> ProofMesh 把逻辑操作和本次 token 分开。逻辑操作唯一绑定 tenant、workflow、tool 和 idempotency key;尝试拥有 owner、generation、lease 和 heartbeat。进程崩溃后,新凭证先向上游按稳定 operation id 对账。确认成功就复用结果,确认未发生才重派;结果不确定直接进入 UNKNOWN,绝不自动赌一次。 - -补一句验证证据:旧 token 换新等价 token、长调用超过租约、并发重试和 UNKNOWN 均有自动化测试。 - -## 3:30–4:05|公开 629 case,不冒充模型评测 - -画面:`artifacts/public-benchmark/authorization-contract-replay.md`。 - -讲述: - -> 我们固定了 AgentDojo 0.1.35/v1 的 97 个用户任务、27 个注入目标、629 个组合,共 2,159 个用户 ground-truth 调用。合法合同全部接受,同键重放没有第二次副作用;参数、工具和上下文错配各 0 次错误通过,2,159 个 receipt 全部通过外部验签和链验证。 - -必须立刻说明边界: - -> 这是授权合同一致性回放,不是模型 ASR、AgentDojo utility 或提示注入检测率。我们没有运行模型,也没有把这个数字包装成模型安全率。 - -## 4:05–4:30|AgentTeams 与结束语 - -画面:7 Worker/Team 图或运行证据页。 - -讲述: - -> 七个 qwenpaw Worker、一个 Human、一个 Team 定义和七个官方结构 Skill ZIP 已锁定 AgentTeams v1.2.0-beta.1。我们为 beta Manager REST 未映射 `workerMembers` 的缺口提供了最小兼容补丁:patched Controller 已运行,Team=`Active`,Human Active、7/7 Worker Running、7/7 TeamHarness health,并跨 Leader/Worker 完成 direct MCP `create → plan → delegate → ack → submit → check → accept`。这只证明控制面生命周期;当前仍为 `modelDriven=false`,不冒充模型自主协同。 - -结束语: - -> AgentTeams 让多个 Agent 把事情做完;ProofMesh 证明这件事被正确的人、在正确范围内、只做了一次,失败后恢复到了可验证状态。 - -## 断网/页面故障备用 - -```bash -make clean-runtime -PYTHONPATH=src python3 -m proofmesh.cli --home . demo-refund TKT-SAGA-001 -PYTHONPATH=src python3 -m proofmesh.cli --home . verify-proof \ - artifacts/workflows//workflow-proof.json -PYTHONPATH=src python3 scripts/benchmarks/run_authorization_contract_replay.py -``` - -若现场时间只剩 2 分钟:只演示高风险停门、审批只到 `AUTHORIZED`、Saga `COMPENSATED + PROOF VALID`,629 case 用一页结果带过。 diff --git a/docs/demo-video-script-v2.md b/docs/demo-video-script-v2.md deleted file mode 100644 index 07d3983..0000000 --- a/docs/demo-video-script-v2.md +++ /dev/null @@ -1,227 +0,0 @@ -# ProofMesh 3–5 分钟录屏与材料升级门槛(v2) - -> 目的:用一条可复现的业务证据链回答“企业为什么敢让 Agent 退款”,并规定未来何时才允许升级 PPT / 白皮书主张。本文是录屏执行稿和材料变更门禁,不代表下列未来证据已经完成。 - -## 1. 结论与成片规格 - -- **建议主版:4 分 20 秒**。当前 `demo-script.md` 的 4 分 30 秒结构可压缩;删除单独的重试原理页,把幂等、fencing 和 `UNKNOWN` 合并到 Saga 讲解中。 -- **必须保留的三个画面**:高风险案件停在 `WAITING_APPROVAL`;审批后仍停在 `AUTHORIZED`;¥90 案件到 `COMPENSATED` 且 `PROOF VALID`。 -- **只能作为短证据卡的内容**:当前验证清单、AgentDojo 629 cases / 2,159 calls、AgentTeams 当前运行边界。不要现场滚终端日志或朗读指标表。 -- 画面 16:9、1080p、浏览器 100% 缩放;鼠标路径预演,敏感字段区域不进入画面。全片只用当前控制台、两张证据卡和结尾页,不切代码编辑器。 -- 每个结论出现时,至少同时展示一个可核对字段;禁止用旁白替代证据。 - -## 2. 录制前门禁(不进入成片) - -1. 从干净状态启动服务并预跑完整流程;固定浏览器窗口大小与 100% 缩放。 -2. 九个本地角色 token 已加载,但折叠“角色凭证”;画面中不得出现 `.env`、模型 key、AgentTeams 管理员口令或 gateway consumer key。 -3. `/health`、`/ready` 正常;运行提交前的最新全量测试并记录 `162 passed`;退款域三条 reference Proof 与运维域三条已知终态 Proof 能用包外 trust bundle 与 pinned policy 复验;运维 `UNKNOWN_MANUAL` 路径必须拒绝伪造成功 Proof。 -4. 为录屏准备三张全屏证据卡: - - `artifacts/public-benchmark/authorization-contract-replay.md` 的四个数字与“非模型评测”声明; - - `agentteams/runtime-evidence/` 的去敏状态摘要,必须与录制当日事实一致。 - - 两域与 Claim 摘要:`refund 3 paths · operations 4 paths · 162 passed · external claims 0/6 VERIFIED`。 -5. 固定业务工单只能使用一次。正式录制前若需重置,停止服务后执行 `make clean-runtime`;需要保全的运行证据不得清理。 -6. 录制一次彩排并计时。若任一步未达到本文“必须看到”的字段,停止录制并排障,不能后期用字幕伪造状态。 - -## 3. 4:20 主版逐秒脚本 - -### 0:00–0:25|问题:¥90 退款到底完成了吗? - -**画面**:控制台首页,已选“下游故障与补偿”,暂不点击。 - -**旁白**: - -> AI 会调用退款工具,不等于企业敢让它退款。支付成功、CRM 失败时,盲重试可能退两次,不重试又会留下永久错账。ProofMesh 不替 Agent 做决定;它把每次副作用变成一份精确授权、一个可恢复操作和一份可由 Proof 包外信任材料复验的证明。 - -**必须看到**:页面标题“每个副作用,先有许可证,再有证明”;左侧 ¥90 Saga 用例;右上 `external trust` 运行状态。 - -### 0:25–1:28|高风险先停门:审批不等于执行 - -**画面动作**: - -1. 切换“高风险人工审批”,点击“创建隔离案件”; -2. 点击“推进至下一门禁”; -3. 在 `WAITING_APPROVAL` 停留约 12 秒,指向状态、`next task`、金额、Plan digest 和 Scope; -4. 将 synthetic reference approval service 根据当前 challenge 签发的 JWS 粘贴到断言框,点击“记录限定审批”; -5. 在 `AUTHORIZED` 停留约 8 秒,不继续执行。 - -**旁白**: - -> Orchestrator、Intake、Investigator 和 Policy 各自提交带 revision 的任务回执。策略冻结金额、计划和完整 scope 后,项目真的停在 `WAITING_APPROVAL`:这时没有退款或关单写副作用。审批者与请求者职责分离,审批只把当前 digest-bound 计划原子改成 `AUTHORIZED`;Executor 仍要单独领取任务。 - -**必须看到**: - -- `WAITING_APPROVAL`、`next task = record_human_approval`; -- 审批前退款为空或等价的“无写副作用”证据;事件链 `VALID`; -- 审批后 `AUTHORIZED`、`next task = execute_authorized`; -- 点击审批后没有自动跳到 `EXECUTED / COMPLETED`。 - -**当前诚实边界字幕**(2 秒即可): - -> approval origin = EXTERNAL_SIGNED_ASSERTION;当前 issuer 为 synthetic reference service,不是企业 IdP / MFA 证据。 - -### 1:28–2:40|真实失败后补偿:先恢复,再验真 - -**画面动作**:清空当前视图,切换“下游故障与补偿”,创建并推进至终态;点击“独立语义验真”。 - -**旁白**: - -> 现在看更难的路径。系统先创建 ¥90 退款并扣减可退余额,随后注入 CRM 关单故障。Executor 不能盲重试原退款,而是用另一张精确许可证执行补偿。逻辑操作绑定稳定 operation id;租约过期后先 reconcile,结果不确定就进入 `UNKNOWN` 并停止自动重放。Verifier 再读取新鲜退款、余额和工单快照:退款必须是 `COMPENSATED`,余额恢复,工单保持 `OPEN`,Memory 才能封存 Proof。 - -**必须看到**: - -- 最终 `COMPENSATED`、`next task = terminal`; -- `saga.executed`、`postconditions.verified`、`workflow.sealed` 或界面中的等价证据; -- 网关回执、任务回执、独立 actor 计数均非零; -- 点击验真后出现 `PROOF VALID` 与“外部信任 / 跨证据语义一致”。 - -**禁止旁白**:不要说“绝对 exactly-once”“生产支付已接入”或“所有故障都能回滚”。 - -### 2:40–3:12|公开回放:测网关,不冒充测模型 - -**画面**:切到准备好的 AgentDojo 结果卡;只展示摘要,不滚动 JSON。 - -**旁白**: - -> 我们还把 AgentDojo v1 的 629 个公开组合、2,159 个 ground-truth 调用送入真实 Action Gateway 做授权合同回放。合法合同全部接受;工具、参数和上下文错配错误通过为零;同键重放没有第二次副作用。它只证明网关符合合同,不运行模型,也不代表模型 ASR、utility 或提示注入检测率。 - -**必须看到**:`629 cases`、`2,159 calls`、`0 duplicate side effects`,以及同屏的 `does_not_measure: model ASR / task utility`。 - -### 3:12–3:48|多 Agent 与当前边界 - -**画面**:七角色 DAG / 官方 Identity 八字段矩阵,再切当日 AgentTeams 证据卡。 - -**旁白(当前版本)**: - -> 七个 Agent 不是七段提示词,而是七个最小权限合同。官方 AgentTeams v1.2.0-beta.1 的 Manager、Controller、Human 和 7/7 Worker 已运行;七成员 Team 已 Active。同一 Project 下,Leader 与 ticket-intake 两个真实容器直接通过 MCP 完成 create、plan、delegate、ack、submit、check、accept。这里证明的是控制面生命周期;模型仍是 placeholder,所以不冒充模型自主协同。 - -**必须看到**:`Human Active`、`7/7 Worker Running`、`Team Active`、`direct lifecycle 7/7 passed`、`modelDriven=false` 同屏出现;若展示 Matrix artifact,必须同时标出 ATB-007 未验证。 - -### 3:48–4:20|跨域复用与诚实边界 - -**画面**:结尾页;显示 `refund 3 paths · operations 4 paths · 162 passed`,角落固定 `Team Active · direct 7/7 · modelDriven=false · external claims 0/6 VERIFIED`。 - -**旁白**: - -> ProofMesh 开源的不是退款页面,而是 Action Passport、可恢复 Gateway、七个 Skill 合同和包外 Verifier。同一协议已经跑过退款三路径和生产运维变更四路径,其中未知状态会停止自动执行。162 项测试证明工程准备度,不替代真实模型、真实 vendor sandbox、授权试点、公开仓库和独立复现;这六类外部 Claim 目前全部待完成。每个副作用,先有许可证,再有证明。 - -## 4. 3:00 压缩版 - -| 时间 | 保留内容 | 删除 / 合并 | -|---|---|---| -| 0:00–0:18 | ¥90 冲突与一句话方案 | 删除七角色总览 | -| 0:18–1:03 | `WAITING_APPROVAL → AUTHORIZED`,明确审批不执行 | 不跑高风险终态 | -| 1:03–2:05 | Saga 到 `COMPENSATED + PROOF VALID` | 把 logical operation / reconcile 压成一句 | -| 2:05–2:28 | 629 / 2,159 结果卡与非模型评测边界 | 不念各类 Wilson 区间 | -| 2:28–2:45 | AgentTeams 当日边界卡 | 只说已证 / 未证各一句 | -| 2:45–3:00 | 两域、162 passed、model false、Claim 0/6 与结束语 | 删除路线图 | - -不得压掉 `AUTHORIZED` 停留、`COMPENSATED` 业务终态、`PROOF VALID` 和 AgentTeams 未验证边界;否则视频会重新退化成“点按钮成功”的 Demo。 - -## 5. 后期与验收清单 - -- 只做裁切空等候、放大关键字段、加章节条;不得改写运行值、拼接不存在的状态或遮盖失败。 -- 字幕中的数字、版本和状态必须来自同一次冻结证据;不要把之后新增的结果贴到旧录像上。 -- 高风险段必须有两个独立停帧:`WAITING_APPROVAL` 与 `AUTHORIZED`。 -- Saga 段必须同时交代业务结果和证明结果:`refund=COMPENSATED`、余额恢复、ticket=`OPEN`、Proof=`VALID`。 -- 不展示 token、私钥、`.env`、真实客户 PII、管理员 URL 或可复用审批 assertion。 -- 成片末尾保留 2 秒边界卡:`production adapters = reference, not connected · vendor adapters = sandbox-ready, not run · modelDriven=false · external claims 0/6 VERIFIED`;当对应实证升级后再按第 6 节替换。 -- 导出后从头观看一次,检查字幕遮挡、光标误触、敏感信息、静音、跳帧和状态跨案件混用。 - -## 6. 下一阶段材料更新门禁 - -以下三类证据互相独立。某一类达标,只能更新它对应的页和主张;不能因为 Team 跑通就声称外部业务试点或企业审批来源也已完成。 - -### 6.1 AgentTeams Team / 生命周期 / 模型协同 - -#### 严格主张层级 - -| 可升级主张 | 必须同时满足的证据 | 仍然不能推出 | -|---|---|---| -| `Team created / Active` | 官方版本/commit 与构建镜像 digest;Team CR `resourceCreated=true` 且 phase=`Active`;Human/7 Worker UID 与 Team roster 一致;时间戳和去敏原始响应 | 不等于 TeamHarness lifecycle 跑通;不等于模型自主协同 | -| `TeamHarness 完整生命周期已实测` | 同一 Project 下 `create → plan → delegate → ack → submit → check → accept` 全部真实执行;Project/Task ID、状态、时间、角色、失败重试与最终 accept 可关联;无手工改 DB / 假事件;ProofMesh `workflow_id/task_id/revision/trace_id/digest` 能与 TeamHarness 双账本一一核对 | 若是脚本直调,只能称“direct MCP lifecycle”,不能称模型自主 | -| `模型驱动七角色协同已验证` | 非 placeholder provider;模型/版本/推理参数与调用时间有去敏记录;Leader/Worker 由真实 assignment / room 驱动并实际调用各自 MCP;至少成功、Human pause/resume、CRM 故障补偿、篡改拒绝四条路径;保存 Matrix/room、project/task、Worker 日志与 Proof;至少一次从干净环境复跑 | 不等于模型安全率、生产 SLA 或所有任务泛化;仍需报告失败率与人工干预 | - -出现任一证据断链、跨 run 拼接、只读 health、静态 manifest 或 `welcomeSent=false` 时,不得升级到下一层。 - -#### 达标后替换材料 - -- **PPT 第 3 页“当前控制台”**:可增加 Team / Project / Task 与 ProofMesh workflow 的同屏关联,但不得删掉业务终态与包外验真。 -- **PPT 第 4 页“动作控制平面”**:把“AgentTeams 目标映射”改为已运行协作面,图中标出官方 Team / TeamHarness 与 ProofMesh 控制面的真实边界。 -- **PPT 第 5 页“七个 Agent”**:以真实 roster、assignment、handoff/receipt 取代静态映射图;官方八字段 Identity 矩阵继续保留。 -- **PPT 第 8 页“可复算证据”**:新增 Team/Task 双账本证据格;只在模型路径满足上表第三层时增加模型 run 数、成功/失败和人工干预统计。 -- **PPT 第 11 页“自评分与边界”**:仅移除已经被真实证据消除的扣分项,按同一评分规则重新自评;不得只加分不重列剩余扣分。 -- **白皮书第 4 页(03 · JUDGE LENS)**:重算多 Agent 分项与总分,写清直接生命周期与模型生命周期的区别。 -- **白皮书第 6 页(05 · ARCHITECTURE)**、**第 7 页(06 · MULTI-AGENT)**:更新运行架构、项目/任务状态映射、角色 handoff 与失败恢复证据。 -- **白皮书第 18 页(15 · AGENTTEAMS)**:整页换成新的 L1–L4 证据梯,列出 Team UID、Project/Task 关联、模型 provider 状态、成功与失败样本;旧兼容缺口降为修复历史。 -- **白皮书第 19 页(16 · OPEN SOURCE + ROADMAP)**:把已完成 Team 项从路线图移入成果,保留真实模型/社区采用等未完成项。 -- **白皮书第 21 页(18 · CLAIM REGISTER)**:逐条把 `禁止声称 / 限定声称` 改为有证据的窄主张;不要删除非模型 ASR、非生产支付等其他边界。 -- **录屏**:只有 Team Active 时,替换 3:12–3:48 的资源边界卡;只有 direct lifecycle 时,旁白必须带“控制面直调”;只有完整模型层达标,才可展示真实 room/assignment 片段并说“模型驱动协同已验证”。 - -### 6.2 外部支付 / CRM 沙箱与真实试点 - -#### 严格主张门槛 - -当前 Stripe/HubSpot adapter 已 sandbox-ready,但没有真实测试账户运行证据。要说“已接外部沙箱”,至少需要: - -1. 连接的确是项目进程之外、由独立凭证和账户控制的支付 / CRM sandbox;报告供应方、API 环境标识、adapter 版本、时间窗,凭证去敏; -2. 每个写调用携带稳定 operation id / 上游 idempotency key,保存请求摘要、HTTP/业务回执和查询/对账结果;ProofMesh 不能自签冒充上游 attestation; -3. 真实跑通低风险成功、高风险审批、支付成功/CRM 失败补偿、超时未知、重复请求、参数漂移六类路径;`UNKNOWN` 不能被自动写成成功; -4. 独立 Verifier 使用包外 trust/policy 和上游签名响应或可信审计代理复算终态;支付流水、CRM 状态、Proof 能按 operation/workflow 对齐; -5. 从干净账户或可重置沙箱复跑,公开失败样本与限制。只有 API mock、录制响应或内置 SQLite adapter 时,仍只能叫“隔离事务靶场”。 - -要进一步说“企业试点产生价值”,还必须预注册样本与口径,使用 200–500 条脱敏历史工单做 shadow / sandbox 盲测,并由非开发者复核:重复副作用率、错误放行率、审批前写副作用、可恢复终态率、人工触达率、恢复时长、验真成功率和审计取证时长。ROI 只能使用客户提供的基线、时间窗、样本量和成本输入;629-case 回放与本机延迟不得外推为客户收益或 SLA。 - -#### 达标后替换材料 - -- **PPT 第 2 页**:保留 ¥90 冲突,但用外部 sandbox 的支付/CRM 回执与补偿对账截图替换内置靶场示意。 -- **PPT 第 3 页**:三大结果改为同一外部 run 的“审批前零写、补偿后余额恢复、包外 VALID”,同时显示外部 operation / ticket 关联。 -- **PPT 第 4 页**:架构图把 Commerce sandbox 改为真实 adapter、上游 idempotency / reconcile API 与独立 attestation 来源。 -- **PPT 第 6 页**:用外部故障时间线和 `UNKNOWN → reconcile / 人工` 证据替换当前本地 Saga 截图。 -- **PPT 第 8 页**:增加外部 run 样本量、失败类型、独立验真率;不要删除 AgentDojo 的“仅授权合同回放”免责声明。 -- **PPT 第 10 页**:只有盲测试点达标后才填 KPI 实测值、基线、样本量和时间窗;未达标前继续只展示定义。 -- **PPT 第 11 页**:外部试点达标后重算场景价值/工程分;“生产支付、HA、KMS、SLA”仍需各自证据,不能一并宣称。 -- **白皮书第 2–3 页(01–02)**:将业务故事和当前控制台换为同一外部 run 的可追溯事实。 -- **白皮书第 4–5 页(03–04)**:重算自评,并把 KPI 定义表升级为“定义 + 基线 + 结果 + 样本量 + 置信区间 / 限制”。 -- **白皮书第 6 页(05)**、**第 10–11 页(09–10)**、**第 13 页(12)**:更新 adapter、reconcile、补偿、业务快照与 reference evidence。 -- **白皮书第 17 页(14 · ENGINEERING)**:记录外部身份、网络、限流、超时、上游 SLA 和仍未完成的 KMS/HA 边界。 -- **白皮书第 19、21 页(16、18)**:更新路线图与 claim register;仅在盲测和外部复核完成后写“试点结果”,不能把 sandbox 集成写成“客户采用”。 -- **录屏**:用外部 sandbox 专用账户录制,必须遮挡账号和凭证,但保留环境标识、operation id 尾部、支付/CRM 查询结果与 Proof 关联;不能拼接不同 run 的成功画面。 - -### 6.3 企业 IdP / 审批服务 assertion - -#### 严格主张门槛 - -当前已达到“外部可验证 synthetic 审批来源”的协议与密码学门槛;升级为企业身份 assurance 仍必须满足: - -1. assertion 由 ProofMesh 控制面之外的企业 IdP、WebAuthn 服务或审批服务签发;Verifier 的 issuer/key/policy 来自包外 pinned trust,不从 Proof 内自举; -2. 断言至少绑定 issuer、subject、audience、tenant、workflow、revision、plan digest、policy digest、完整 scope、decision、issued/expiry、nonce/challenge;MFA / assurance level 只能在上游真实提供时记录; -3. 控制面校验时效、audience、tenant、nonce 一次性、撤销/密钥轮换和 requester/approver 职责分离,成功后仍只做 `WAITING_APPROVAL → AUTHORIZED`; -4. Proof 保留原始 assertion 或可验证封装及其 digest;包外 Verifier 独立验签并与 task/gateway receipt、计划、策略和最终业务结果交叉绑定; -5. 负测至少覆盖伪造签名、错误 issuer/audience/tenant、旧 revision、plan/policy/scope 漂移、过期、重放、撤销 key、低 assurance、不符合职责分离;全部 fail closed 并留审计; -6. 生产模式继续禁用本地任填 approver CLI;必须将 reference-script ACR / AMR 替换为企业上游真实提供的身份 assurance。 - -满足后,Verifier 应输出窄而明确的 assurance 枚举(例如 `EXTERNAL_ASSERTION_VERIFIED`,以最终 schema 为准),而不是笼统的“独立 Human 签名”。 - -#### 达标后替换材料 - -- **PPT 第 3 页**:高风险参考结果增加“外部 assertion 验证通过”,但仍与业务执行、Proof 终态分开显示。 -- **PPT 第 6 页**:用 challenge → IdP/审批服务 assertion → 控制面授权 → Executor 领取的真实序列替换当前本地审批说明。 -- **PPT 第 7–8 页**:将 approval issuer 加入包外信任输入与可复算证据;如果它使用第六类独立 key,必须同步修改“五钥”表述、trust schema、代码和全部证据后才能改成“六钥”,不能只改图。 -- **PPT 第 11 页**:删除已解决的审批来源缺口,保留真实上游、KMS/HA、第三方评估等剩余缺口并重算自评。 -- **白皮书第 4 页(03)**、**第 7 页(06)**、**第 11 页(10)**:更新 assurance 枚举、assertion 字段、职责分离与负测结果。 -- **白皮书第 12 页(11 · EXTERNAL PROOF)**:将 assertion issuer / key 纳入外部 trust 和跨证据检查;同步解释它与 task receipt 的不同职责。 -- **白皮书第 17 页(14)**、**第 21 页(18)**:把生产缺口和 claim register 改成有证据的窄主张;不能因此声称全套企业 IAM、不可否认性或合规认证已完成。 -- **录屏**:替换 0:25–1:28 的当前边界字幕,短暂展示去敏 assertion 字段和 Verifier assurance;不展示可重放的 assertion、cookie、QR、设备标识或用户 PII。 - -## 7. 三类证据同时完成后的重构顺序 - -1. 先冻结证据目录、时间窗、版本、测试和负测,生成 claim register; -2. 再更新 `docs/demo-video-script-v2.md` 的旁白边界与镜头; -3. 重录视频,确保 Team、外部 sandbox、assertion 来自同一或明确关联的 run; -4. 更新白皮书的证据页、KPI、架构和 claim register; -5. 最后更新 PPT 第 2–11 页及来源备注,重新做逐页渲染、溢出、文本和禁词扫描; -6. 二进制材料冻结后,才重建 release、清单与 SHA256SUMS。 - -任何一步只有截图、口头确认或单个 happy path 时,都不满足材料升级门槛。 - -工程准备度约 88/100 只是 22/20/22/20/4 的内部自评,不是官方赛事成绩。模型实跑、真实 vendor sandbox、授权历史试点、独立复现、公开仓库/身份、生产设施六项 Claim 当前均为 `PENDING`;任何一项升级必须通过 `scripts/validate_external_evidence.py` 的 fail-closed 校验。 diff --git a/docs/deployment.md b/docs/deployment.md index adf992b..33bb070 100644 --- a/docs/deployment.md +++ b/docs/deployment.md @@ -38,7 +38,7 @@ PYTHONPATH=src python3 -m proofmesh.cli --home . verify-proof \ CLI 的 `demo-refund` 是本地确定性 smoke runner;它调用同一控制面,但不证明 AgentTeams Worker 已认领任务。真实 AgentTeams 路径必须逐步调用角色 MCP。 -## 2. 评委控制台 +## 2. 本地复现控制台 API 默认 fail closed。先复制 `.env.example`,将每个 `replace-with-*` 替换为不同的随机值,再加载环境: diff --git a/docs/evaluation.md b/docs/evaluation.md index e1bd51e..d35519d 100644 --- a/docs/evaluation.md +++ b/docs/evaluation.md @@ -19,7 +19,7 @@ ProofMesh 的核心主张不是“模型不会受攻击”,而是:给定一 | `TKT-HIGH-001` | `WAITING_APPROVAL` | 审批后退款 12900、工单关闭 | 审批只转 `AUTHORIZED`,Executor 后 `COMPLETED` | | `TKT-SAGA-001` | 自动策略 | 退款成功、CRM 注入故障、补偿恢复 | `COMPENSATED`,余额恢复、工单开放、Proof Valid | -评委控制台已按实际 HTTP 合同点击验证三条路径;自动化测试同时检查旧 revision 冲突、并发审批只能成功一次、请求者不能审批、计划/范围漂移拒绝、跨租户读取拒绝和角色工具升级拒绝。 +本地控制台已按实际 HTTP 合同验证三条路径;自动化测试同时检查旧 revision 冲突、并发审批只能成功一次、请求者不能审批、计划/范围漂移拒绝、跨租户读取拒绝和角色工具升级拒绝。 ## 3. 网关故障与并发不变量 @@ -70,7 +70,7 @@ make validate-agentdojo make export-agentdojo AGENTDOJO_PYTHON=/absolute/path/to/agentdojo-0.1.35/bin/python ``` -评委从发布包解压后应先运行 `make validate-agentdojo`;不依赖开发者工作区中的 `work/` 路径。重新导出属于可选溯源步骤,需要单独安装并锁定官方 AgentDojo 0.1.35。 +复现者从发布包解压后应先运行 `make validate-agentdojo`;不依赖开发者工作区中的 `work/` 路径。重新导出属于可选溯源步骤,需要单独安装并锁定官方 AgentDojo 0.1.35。 ## 5. 授权合同一致性回放 diff --git a/docs/judge-scorecard.md b/docs/judge-scorecard.md deleted file mode 100644 index c421fcf..0000000 --- a/docs/judge-scorecard.md +++ /dev/null @@ -1,33 +0,0 @@ -# ProofMesh 评委自审计(工程冻结口径) - -> 这不是主办方打分,也不预测其他队伍质量。下表是按官网 25 / 25 / 25 / 20 / 5 维度形成的**工程准备度内部自评**;它衡量代码、协议和可复现材料的完整度,不把尚未取得的外部证据计为已完成。当前目标值约 **88 / 100**,不等于赛事得分,更不构成“95+”承诺。 - -| 官方维度 | 权重 | 工程准备度自评 | 已有工程证据 | 尚未获得的外部证据 | -|---|---:|---:|---|---| -| 场景价值与行业可复制 | 25 | 22 | 退款域 3 条参考路径;生产运维变更域 4 条路径复用同一授权、恢复和验真协议;240 条独立进程 HTTP 合成故障盲测 | 200–500 条经授权脱敏历史工单、真实合作方基线、客户证言和 ROI 均未完成 | -| 多 Agent 协同与自主闭环 | 25 | 20 | 七角色最小权限、Human 门禁、异常/补偿/Proof 闭环;官方 AgentTeams Team=`Active`;跨 Leader/Worker 的 direct MCP lifecycle 7/7 | `modelDriven=false`;尚无非 placeholder 模型生成的规划、认领、对话和七角色端到端业务 trace | -| Skill 工程体系与生态复用 | 25 | 22 | 七个 closed-schema Skill、错误码、安全边界、Worker ZIP、生命周期与双 validator;控制协议已跨两个业务域复用 | 官方云 Skill 尚无云端实跑;暂无外部使用者或第三方扩展 Skill | -| 工程落地、运行验证与安全可审计 | 20 | 20 | 162 项测试;Saga、fencing、reconcile-before-retry、`UNKNOWN` fail-closed、外部签名审批、包外 Verifier、629+240 评测;OIDC/JWKS、PostgreSQL GatewayStore、远程签名、SBOM/供应链是可运行参考实现 | 生产适配器尚未连接真实 IdP/KMS/PostgreSQL;Stripe/HubSpot adapter 已 sandbox-ready 但未用真实测试账户运行;无 HA、渗透测试或生产 SLA | -| 开放 / 开源贡献 | 5 | 4 | Apache-2.0、完整源码/schema/测试/证据/归属、公开发布准备和独立复现模板 | 尚无公开 GitHub URL、真实参赛身份绑定、外部复现记录、issue/下载/采用数据 | -| **合计** | **100** | **约 88** | **代码与材料已达到高强度工程提交准备度** | **不能把本地参考实现替代为真实外部运行证据** | - -## 中肯判断 - -- **工程准备度约 88 / 100。** 这是内部评估:两个业务域、162 项测试和生产边界参考实现已补上此前的主要工程短板。 -- **赛事实际得分不能由该数字推出。** 评委若只采信公开仓库、真实账号运行、客户数据和第三方复现,当前外部证据成熟度会明显低于 88。 -- **95+ 不能靠继续增加本地代码或合成测试。** 必须补齐模型实跑、Stripe/HubSpot 真实 sandbox、授权历史工单/合作方试点、公开仓库与参赛身份、独立复现五类证据。 -- **六项外部 Claim 当前全部 `PENDING`。** Claim register 采用 fail-closed 规则;只有要求的证据文件、哈希、时间和外部验证者完整绑定后,才允许升级为 `VERIFIED`。 - -## 从 88 到 95+ 的五个证据门槛 - -1. **模型门槛**:接入可用模型,至少跑低风险、高风险审批、补偿、篡改拒绝四类路径,并保留模型版本、参数、Leader/Worker 轨迹和 ProofMesh 双账本关联。 -2. **真实 sandbox 门槛**:在 Stripe 测试模式与 HubSpot 开发者测试账户中运行同一 operation id、幂等、对账、补偿和 `UNKNOWN` 路径;当前 adapter 代码不等于已实跑。 -3. **试点门槛**:先取得数据所有方授权,再用 200–500 条严格脱敏历史工单做预注册 shadow/sandbox 盲测;不得把 629 或 240 条合成证据外推为客户 ROI。 -4. **开放门槛**:发布公开 GitHub 仓库和不可变 tag,绑定真实参赛身份,确保无密钥、客户数据或本机路径泄露。 -5. **独立复现门槛**:至少一名非开发者从干净环境复跑发布包,提交环境、版本、结果、失败项和签名证明。 - -具体安全步骤与可验收格式见 `docs/95-plus-evidence-runbook.md`;机器可读状态见 `artifacts/external-evidence/claim-status.json`。 - -## 评委一句话 - -ProofMesh 已从单场景 Demo 升级为跨退款与生产运维两个业务域复用的可信执行协议;约 88 分代表工程准备度,不代表外部真实性。能否冲击 95+,取决于参赛者补齐真实模型、真实 sandbox、合法试点、公开仓库和第三方复现,而不是继续把本地证据包装成生产成绩。 diff --git a/docs/public-dataset-benchmark.md b/docs/public-dataset-benchmark.md index b35c417..f48bc32 100644 --- a/docs/public-dataset-benchmark.md +++ b/docs/public-dataset-benchmark.md @@ -22,7 +22,7 @@ python3 scripts/benchmarks/run_banking77_routing.py \ ## 输出 - `report.json`:分子、分母、比率、95% Wilson 区间、质量门槛与不宣称项; -- `report.md`:评委可读结论; +- `report.md`:人类可读结论; - `case-results.jsonl`:3,080 条逐样本结果,只含文本 SHA-256,不含原始话术; - `source-lock.json`:来源、commit、许可和文件摘要。 diff --git a/docs/public-demo-boundary.md b/docs/public-demo-boundary.md index d92e409..f3d3259 100644 --- a/docs/public-demo-boundary.md +++ b/docs/public-demo-boundary.md @@ -1,34 +1,28 @@ # Public demo boundary -The public URL is a **read-only evidence replay**, not a hosted ProofMesh control plane. +The public URL combines an **interactive browser decision lab** with a **frozen evidence replay**. It is more useful than a slide animation, while remaining safe to expose anonymously. -## What the page does +## Interactive decision lab -- reads a small, deterministic scenario summary from `demo/data/scenarios.json`; -- replays the automatic, externally approved, and compensated reference paths; -- exposes selected frozen proofs and external-verification reports; -- links each metric to its machine-readable artifact; -- makes the experimental boundaries visible next to the results. +Visitors can choose a refund or production-change action, set its risk level and approval state, inject an upstream outcome, and mutate the approved tool, arguments, or context. Client-side logic then explains whether the Gateway would: -## What the page cannot do +- wait for a signed Human approval; +- reject a mismatched contract before dispatch; +- complete a normal action; +- reconcile a committed action after a lost response; +- compensate or roll back a confirmed partial execution; +- stop in `UNKNOWN_MANUAL` when upstream state cannot be established. -- execute a refund, close a ticket, or call any other write-capable tool; -- accept arbitrary prompts, credentials, workflow IDs, or approval assertions; -- invoke an LLM or prove model-driven collaboration; -- connect to Stripe, HubSpot, customer infrastructure, or production identity systems; -- demonstrate a customer pilot, production SLA, ROI, or real-user outcome. +The lab uses deterministic rules in `demo/app.js`. It does not execute the Python workflow or assert that a remote control plane ran. -## Why the live API is not exposed +## Frozen evidence replay -The local FastAPI console mutates an isolated reference database and requires separate role credentials. Publishing it as a shared anonymous service would require per-visitor isolation, quotas, rate limits, payload limits, TTL cleanup, abuse controls, TLS, and a safe external approval path. GitHub Pages does not run Python services. A static replay therefore gives judges a stable, inspectable URL without pretending that a browser animation is a live backend. +The second part reads `demo/data/scenarios.json`, replays three reference workflows, exposes selected frozen proofs and verification reports, and verifies each proof SHA-256 in the browser. -## Evidence copied to Pages +## Deliberate safety limits -The deployment workflow publishes only: +The page cannot execute a refund, close a ticket, deploy software, accept arbitrary prompts, store customer data, invoke an LLM, or connect to Stripe, HubSpot, a customer network, or a production identity system. -- the three reference workflow proofs and their external-verification reports; -- the AgentDojo authorization-contract replay report; -- the synthetic independent-process HTTP shadow report; -- the AgentTeams redacted runtime evidence. +The local FastAPI console does mutate an isolated reference database and requires separate role credentials. Hosting that API for anonymous users would need per-visitor isolation, quotas, request limits, TTL cleanup, abuse controls, TLS, and a safe external approval service. GitHub Pages cannot provide those controls or run Python. -No private key, bearer token, database, `.env`, customer record, raw public narrative, or runtime workflow directory is included. +The deployment workflow publishes only selected proofs, verification reports, benchmark summaries, and redacted AgentTeams runtime evidence. It excludes private keys, bearer tokens, databases, `.env` files, customer records, raw public narratives, and runtime workflow directories. diff --git a/docs/submission-copy.md b/docs/submission-copy.md deleted file mode 100644 index 069ea0f..0000000 --- a/docs/submission-copy.md +++ /dev/null @@ -1,42 +0,0 @@ -# 初赛提交文案 - -## 项目名称(20 字以内) - -ProofMesh:可信动作控制面 - -## 作品简介(500 字以内) - -ProofMesh 面向企业客服与运维团队,是多 Agent 高风险动作可信控制面。它把计划冻结为 Action Passport,绑定主体、租户、工具、参数、策略、审批和时效;以租约、幂等及上游对账避免盲目重试,未知即停。7 个 Agent 与 7 个 Skill 以 AgentTeams 完成拆解、交接、审批、退款/补偿、验真和脱敏记忆;退款 3 路径与运维 4 路径复用 Gateway、签名回执和包外 Verifier。已完成 Team Active、direct lifecycle 7/7、162 项测试、629 组授权回放、240 条故障盲测、Banking77 3,080 条分流和 CFPB 240 条 no-write shadow;`modelDriven=false`,公开数据不冒充客户试点。不用 RAG,已实现共享状态、脱敏记忆、轨迹可观测;官方 SLS Skill 仅完成采用契约。Apache-2.0 开源,生产设施与外部 Claim 待验证。 - -## 一句话定位 - -AgentTeams 承载多角色协作;ProofMesh 让退款与运维变更等副作用在精确授权下可恢复执行,并由 Proof 包外信任材料独立复验。 - -## 三项创新点 - -1. **Proof-carrying action**:执行时精确验签的 Action Passport,不把底层权限交给模型。 -2. **Reconcile-before-retry**:logical operation 与 credential attempt 分离,崩溃后先对账,不确定即停止重放。 -3. **Semantic Proof Verifier**:使用包外信任锚,跨审批、计划、回执与业务终态做语义验真。 - -## 当前进展 - -- 代码与本地三条业务路径:已完成; -- 第二业务域生产运维变更四条路径:已完成; -- 完整测试:`162 passed`; -- 7 个 AgentTeams Worker manifests、1 个 Team manifest、1 个 Human manifest、7 个 Skill ZIP 与 bootstrap:已完成; -- AgentDojo 629 case 授权回放与报告:已完成; -- 上下文增强:明确不使用 RAG;共享状态、脱敏记忆与轨迹可观测已实现,满足四项能力至少实现两项的要求; -- 阿里云官方 Skill:`alibabacloud-sls-query` 的只读采用、最小 RAM 权限、脱敏与失败边界契约已完成,尚无阿里云账号运行日志,不声称云端实跑; -- 官方 AgentTeams 控制面运行证据:已实跑可复现基线为 `v1.2.0-beta.1` / commit `78d0ced...`;Human Active、7/7 Worker Running、7/7 health、Team Active,以及跨 Leader / Worker 的 direct MCP `create_project → plan_dag → delegate_task → ack_task → submit_task → check_task → accept_task_result`;该证据不等于模型自主协同;当前 stable `v1.2.2` 仅为迁移目标,尚未验证; -- 真实模型驱动 QwenPaw 自主协同:尚未运行,不与静态/控制面证据混淆; -- OIDC/JWKS、PostgreSQL GatewayStore、远程 signer 与供应链 provenance:参考实现已完成,尚未接真实企业设施; -- Stripe/HubSpot adapter:sandbox-ready,尚无真实测试账户 run; -- 外部证据:模型、vendor sandbox、授权历史试点、独立复现、公开仓库/身份、生产设施六项 Claim 全部 `PENDING`; -- 工程准备度内部自评约 88/100(22/20/22/20/4),不是主办方评分;95+ 只能由真实外部证据推动。 - -## 提交链接 - -- 代码仓库:`[提交前填写]` -- Demo 视频:`[提交前填写]` -- 在线体验:`[可选,提交前填写]` -- 开源协议:Apache-2.0 diff --git a/docs/winning-solution.md b/docs/winning-solution.md deleted file mode 100644 index d2caf4a..0000000 --- a/docs/winning-solution.md +++ /dev/null @@ -1,93 +0,0 @@ -# 获奖方案总纲:ProofMesh Agent Action Control Plane - -## 核心命题 - -企业不会因为 Agent 能写出正确答案,就允许它直接退款、封号、改配置或发布代码。真正缺失的基础设施是:让每个副作用同时具备可验证授权、可恢复执行语义、失败恢复和 Proof 包外验真。 - -ProofMesh 的产品定义: - -> 面向多 Agent 企业动作的 Proof-Carrying Execution 控制面。 - -AgentTeams 承载角色协同;ProofMesh 位于协同系统与企业工具之间,把 Agent 的计划变成短期、精确范围的 Action Passport,并将任务、执行、补偿和终态封存为可独立复算的 Proof。当前退款域三路径与生产运维变更域四路径已复用同一控制协议;AgentTeams Team 已 `Active`,direct MCP project/task 生命周期已跨两个 Worker 容器跑通,但 `modelDriven=false`,模型自主协同仍未验证。 - -## 两个可运行业务域 - -智能客服退款闭环:工单进入后,由 Orchestrator、Intake、Investigator、Policy、Executor、Verifier、Memory 七角色协议通过 L2 确定性角色 API 协作;高风险计划暂停等待外部 Human;执行涉及支付与 CRM;下游失败触发补偿;最终必须重新读取退款、余额和工单状态。 - -选择这一场景有三层价值: - -- 官方赛题明确把退款列为智能客服闭环示例; -- 金额、审批、跨系统和补偿让安全机制可被客观验证; -- 控制协议可迁移到理赔、授信、账户变更、运维修复与研发发布。 - -为避免“可迁移”停留在口号,项目已加入第二域 `production-operations-change`:低风险变更完成、高风险签名审批完成、健康检查失败补偿、对账不明 `UNKNOWN_MANUAL`。运维域使用独立 policy、健康检查和回滚语义,但复用 AuthorizedToolCaller、Action Passport、GatewayStore、Execution Receipt 与包外 Verifier。它是确定性 reference workflow,不冒充真实企业运维平台。 - -## 六个决定性创新 - -### 1. 模型不可见的 Action Passport - -Passport 由控制面内部签发,Worker 只看到高层角色工具。它精确绑定 tenant、subject、workflow、tool、resource、args digest、context、policy、approval、金额、预算、次数和 TTL;网关在执行瞬间使用外部 trust bundle 验证。 - -### 2. 审批与执行物理分步 - -Human approval 只能把 `WAITING_APPROVAL` 原子转为 `AUTHORIZED`,必须绑定当前 revision、plan digest、policy digest 和完整 scope。它不会调用任何业务工具;Executor 必须单独领取任务。 - -### 3. 逻辑操作而非 token 的幂等 - -logical operation 与 credential attempt 分离,使用 owner UUID、fencing generation、lease heartbeat 和 finalize CAS。旧 token 过期后可用新的等价 token 恢复,但合同任一字段变化都会被拒绝。 - -### 4. 对账优先的崩溃恢复 - -租约过期后先用稳定 operation id 向上游查询。成功则封存原结果,确认不存在才重派;不确定进入 `UNKNOWN`,永不自动赌第二次。这是对“exactly once”边界的工程化诚实回答。 - -### 5. 可验证 Saga,而不是写日志式回滚 - -支付成功、CRM 失败时执行独立授权的 compensation,恢复余额并保持工单开放;Verifier 再读取业务数据库确认 postconditions。补偿失败会安全阻断,不会把事件名写成“rollback completed”。 - -### 6. 外部信任锚 + 跨证据语义 Verifier - -Verifier 不信任 Proof 包里的根;外部 trust bundle 与 pinned policy 是独立输入。除验签和链外,还核对 approval、plan、tool args、金额、币种、订单版本、余额公式、退款/工单关系和 memory 状态,能拒绝“签名正确但业务拼错”。 - -## 可运行证据 - -- 三条事务业务路径:自动退款、高风险审批、CRM 故障补偿,最终分别 `COMPLETED / COMPLETED / COMPENSATED` 且 Proof Valid; -- 四条生产运维变更路径:`COMPLETED / COMPLETED / COMPENSATED / UNKNOWN_MANUAL`;三条已知终态 Proof 可包外复验,未知终态严格 fail closed; -- 自动化负向测试:角色越权、跨租户、并发审批、revision 过期、key usage、撤销/时效、预算拆分、长调用租约、崩溃对账、UNKNOWN、语义篡改; -- AgentDojo 0.1.35/v1:629 cases、2,159 user calls 的授权合同回放;合法接受 2,159/2,159,参数/工具/上下文错配错误通过均 0/2,159,副作用重复 0; -- AgentTeams:1 Human manifest、7 个 qwenpaw Worker manifests、1 个 Team manifest、7 个官方结构 Skill ZIP、bootstrap 与严格 validator;运行证据为 Human Active、7/7 Worker Running、7/7 health、Team=`Active`,以及跨 Leader / Worker 的 direct MCP 七步 lifecycle;modelDriven=false; -- 工程证据:完整测试 `162 passed`;FastAPI + MCP、Prometheus、Kubernetes fail-closed admission;OIDC/JWKS、PostgreSQL GatewayStore、remote Ed25519 signer、SBOM/provenance 为生产迁移参考实现; -- Vendor 边界:Stripe 测试退款与 HubSpot 开发者测试 Ticket adapter 已 sandbox-ready,但没有真实账户运行,不能称外部 sandbox 已验证。 - -## 比赛叙事 - -PPT 不从架构图开始,而按以下顺序: - -1. 一次重复退款/错范围审批如何发生; -2. 为什么多 Agent 协同本身不能解决执行可信; -3. ProofMesh 的“一张 Passport + 一个 logical operation + 一份外部可验 Proof”; -4. 高风险停门、审批不执行、Saga 补偿三段实跑; -5. 629 case 与负向测试; -6. AgentTeams/Skill 的真实映射; -7. 生产迁移与证据边界; -8. 开源与试点计划。 - -## 复赛到决赛路线 - -### 复赛前 - -- 使用真实模型凭证完成 QwenPaw Leader/Workers 的 TeamHarness 自主任务,保留 Matrix、project/task、Worker 日志与 ProofMesh 双账本关联; -- 接入一个真实沙箱业务 API,验证稳定 operation id、幂等与 reconciliation; -- 取得数据所有方授权,用 200–500 条严格脱敏历史工单做预注册 shadow/sandbox 盲测; -- 发布公开 GitHub tag 并由至少一位独立复现者从干净环境验收; -- 录制 4 分钟 Demo,并提供一键验真与断网备用路径。 - -### 决赛前 - -- 将现有 remote signer/PostgreSQL adapter 接到真实 KMS/数据库,完成迁移、备份恢复和 HA 演练; -- 至少一家团队的历史工单盲测,分开报告自动闭环率、误放行、误阻断、人工触达、MTTR 和审计耗时; -- 第三方安全审查、故障演练和链头外部锚定; -- 将 Action Passport schema、Verifier 和 reference gateway 做成独立开源组件。 - -## 不可夸大的边界 - -当前业务域是 reference workflow,不是生产支付或生产运维;AgentDojo 结果不是模型 ASR/utility;production adapters 尚未连接真实 IdP/KMS/PostgreSQL;Stripe/HubSpot 仅 sandbox-ready;AgentTeams Team Active/direct 7/7 不等于模型自主协同。模型实跑、真实 vendor sandbox、授权试点、独立复现、公开仓库/身份、生产设施六项外部 Claim 当前全部 `PENDING`。约 88/100 是 22/20/22/20/4 的工程准备度内部自评,不是官方成绩;95+ 只能靠上述外部证据。 diff --git a/pyproject.toml b/pyproject.toml index eb3df7a..5ebe193 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -26,6 +26,11 @@ production = ["psycopg[binary]==3.2.9"] proofmesh = "proofmesh.cli:main" proofmesh-mcp = "proofmesh.mcp_server:main" +[project.urls] +Homepage = "https://dingyucanada.github.io/ProofMesh/" +Repository = "https://github.com/dingyucanada/ProofMesh" +Issues = "https://github.com/dingyucanada/ProofMesh/issues" + [tool.setuptools] package-dir = {"" = "src"} include-package-data = true diff --git a/sbom.cdx.json b/sbom.cdx.json index d6cae19..7abb2bf 100644 --- a/sbom.cdx.json +++ b/sbom.cdx.json @@ -1,7 +1,7 @@ { "bomFormat": "CycloneDX", "specVersion": "1.5", - "serialNumber": "urn:uuid:d1dc6323-22a5-b389-e1dc-9390c5502a0c", + "serialNumber": "urn:uuid:fb1fa645-716d-e470-495f-5357d8db2f0b", "version": 1, "metadata": { "component": { @@ -18,7 +18,7 @@ "properties": [ { "name": "proofmesh:source-manifest-sha256", - "value": "d1dc632322a5b389e1dc9390c5502a0c3f5299bc6ca33c059b6c316d9aa1c385" + "value": "fb1fa645716de470495f5357d8db2f0b20dfbd26780c0a639be0246b016c7e63" }, { "name": "proofmesh:source-file-count", diff --git a/scripts/benchmarks/run_authorization_contract_replay.py b/scripts/benchmarks/run_authorization_contract_replay.py index 2fbb634..bb2878c 100644 --- a/scripts/benchmarks/run_authorization_contract_replay.py +++ b/scripts/benchmarks/run_authorization_contract_replay.py @@ -63,7 +63,7 @@ def build_parser() -> argparse.ArgumentParser: type=Path, default=PROJECT_ROOT / "artifacts/public-benchmark/authorization-contract-replay.md", - help="judge-facing result", + help="human-readable result", ) parser.add_argument( "--limit", diff --git a/scripts/build_public_demo.py b/scripts/build_public_demo.py index 8006e6f..fb2f79e 100644 --- a/scripts/build_public_demo.py +++ b/scripts/build_public_demo.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Build the narrowly scoped, read-only GitHub Pages artifact.""" +"""Build the narrowly scoped interactive GitHub Pages artifact.""" from __future__ import annotations @@ -97,7 +97,8 @@ def build(output: Path) -> dict: manifest = { "schema_version": "proofmesh.public-demo-manifest/v1", - "mode": "READ_ONLY_EVIDENCE_REPLAY", + "mode": "INTERACTIVE_DECISION_LAB_WITH_FROZEN_EVIDENCE", + "decision_engine": "CLIENT_SIDE_DETERMINISTIC_SIMULATION", "live_backend": False, "model_driven": False, "customer_data": False, @@ -117,7 +118,7 @@ def main() -> None: args = parser.parse_args() manifest = build(args.output) print( - f"built {manifest['file_count']} read-only files at " + f"built {manifest['file_count']} public demo files at " f"{args.output.resolve()} (live_backend=false, model_driven=false)" ) diff --git a/scripts/build_release.py b/scripts/build_release.py index ea1eab9..b5ad461 100644 --- a/scripts/build_release.py +++ b/scripts/build_release.py @@ -71,12 +71,10 @@ Path("artifacts/reference/manifest.json"), Path("artifacts/reference/trust-bundle.json"), Path("artifacts/reference/pinned-refund-policy.json"), - Path("docs/judge-scorecard.md"), Path("docs/agent-identity-register.md"), Path("docs/pilot-value-scorecard.md"), Path("docs/aliyun-skill-adoption.md"), Path("docs/synthetic-http-shadow-evaluation.md"), - Path("docs/95-plus-evidence-runbook.md"), Path("docs/templates/data-authorization-and-anonymization-checklist.md"), Path("docs/templates/independent-reproduction-attestation.md"), Path("artifacts/external-evidence/claim-status.json"), diff --git a/scripts/generate_reference_artifacts.py b/scripts/generate_reference_artifacts.py index 72cba66..cc75a17 100644 --- a/scripts/generate_reference_artifacts.py +++ b/scripts/generate_reference_artifacts.py @@ -1,5 +1,5 @@ #!/usr/bin/env python3 -"""Generate judge-facing evidence by executing isolated ProofMesh workflows. +"""Generate reviewer-facing evidence by executing isolated ProofMesh workflows. The files are derived from real state transitions in the deterministic commerce sandbox. They are not model-quality or production-availability measurements. diff --git a/scripts/validate_external_evidence.py b/scripts/validate_external_evidence.py index 594f5f5..9eaebc5 100644 --- a/scripts/validate_external_evidence.py +++ b/scripts/validate_external_evidence.py @@ -19,10 +19,10 @@ "stripe_hubspot_sandbox", "authorized_historical_pilot", "independent_reproduction", - "public_repository_and_identity", + "public_release_and_maintenance", "production_readiness", } -TOP_LEVEL_KEYS = {"schema_version", "policy", "score_target", "claims"} +TOP_LEVEL_KEYS = {"schema_version", "policy", "claims"} CLAIM_KEYS = { "id", "status", @@ -138,11 +138,6 @@ def validate(root: Path = ROOT) -> dict[str, Any]: raise ExternalEvidenceError("unsupported external claim register schema") if not isinstance(register["policy"], str) or "fail-closed" not in register["policy"]: raise ExternalEvidenceError("claim register must declare a fail-closed policy") - score_target = register["score_target"] - if not isinstance(score_target, dict) or set(score_target) != {"engineering", "external_evidence"}: - raise ExternalEvidenceError("score_target must separate engineering and external evidence") - if any(not isinstance(value, str) or "not " not in value.lower() for value in score_target.values()): - raise ExternalEvidenceError("score targets must explicitly disclaim official scoring") claims = register["claims"] if not isinstance(claims, list) or not all(isinstance(claim, dict) for claim in claims): raise ExternalEvidenceError("claims must be an object list") @@ -185,4 +180,3 @@ def main() -> int: if __name__ == "__main__": raise SystemExit(main()) - diff --git a/src/proofmesh/benchmarks/authorization_replay.py b/src/proofmesh/benchmarks/authorization_replay.py index 69e1846..65138bf 100644 --- a/src/proofmesh/benchmarks/authorization_replay.py +++ b/src/proofmesh/benchmarks/authorization_replay.py @@ -1175,7 +1175,7 @@ def _record_attack( def render_markdown(report: Mapping[str, Any]) -> str: - """Render the machine report as a concise, judge-facing Markdown artifact.""" + """Render the machine report as a concise, human-readable Markdown artifact.""" dataset = report["dataset"] metrics = report["metrics"] diff --git a/src/proofmesh/static/index.html b/src/proofmesh/static/index.html index 4904515..d2999f7 100644 --- a/src/proofmesh/static/index.html +++ b/src/proofmesh/static/index.html @@ -40,7 +40,7 @@

      角色凭证

      凭证仅保存在当前浏览器会话;源码不内置任何通行令牌。

      - 配置评委本地凭证 + 配置本地角色凭证
      diff --git a/tests/test_api_contract.py b/tests/test_api_contract.py index eafe021..634dfa8 100644 --- a/tests/test_api_contract.py +++ b/tests/test_api_contract.py @@ -301,7 +301,7 @@ def test_readiness_requires_every_security_boundary_identity(monkeypatch, action assert "gateway" in unavailable.json()["detail"]["missing_authenticated_roles"] -def test_judge_console_targets_the_role_separated_api_contract(): +def test_operator_console_targets_the_role_separated_api_contract(): static_dir = Path(__file__).resolve().parents[1] / "src/proofmesh/static" app_source = (static_dir / "app.js").read_text(encoding="utf-8") page_source = (static_dir / "index.html").read_text(encoding="utf-8") diff --git a/tests/test_clean_runtime.py b/tests/test_clean_runtime.py index 6e64813..237d215 100644 --- a/tests/test_clean_runtime.py +++ b/tests/test_clean_runtime.py @@ -39,7 +39,7 @@ def test_clean_runtime_removes_only_ephemeral_targets(tmp_path, capsys): (tmp_path / "docs/demo-waiting-approval.png").write_text("legacy", encoding="utf-8") (tmp_path / "docs/demo-final-rollback.png").write_text("legacy", encoding="utf-8") (tmp_path / "docs/judge-console-compensated.png").write_text("legacy", encoding="utf-8") - current_console = tmp_path / "docs/judge-console-compensated-current.png" + current_console = tmp_path / "docs/console-compensated-reference.png" current_console.write_text("current", encoding="utf-8") module.main() diff --git a/tests/test_public_demo.py b/tests/test_public_demo.py new file mode 100644 index 0000000..6522fbc --- /dev/null +++ b/tests/test_public_demo.py @@ -0,0 +1,45 @@ +from __future__ import annotations + +import importlib.util +import json +from pathlib import Path + + +ROOT = Path(__file__).resolve().parents[1] +SCRIPT = ROOT / "scripts/build_public_demo.py" + + +def _module(): + spec = importlib.util.spec_from_file_location("proofmesh_public_demo", SCRIPT) + assert spec and spec.loader + module = importlib.util.module_from_spec(spec) + spec.loader.exec_module(module) + return module + + +def test_public_demo_build_is_interactive_but_has_no_backend(tmp_path: Path): + report = _module().build(tmp_path / "site") + assert report["mode"] == "INTERACTIVE_DECISION_LAB_WITH_FROZEN_EVIDENCE" + assert report["decision_engine"] == "CLIENT_SIDE_DETERMINISTIC_SIMULATION" + assert report["live_backend"] is False + assert report["model_driven"] is False + assert report["customer_data"] is False + + html = (tmp_path / "site/index.html").read_text(encoding="utf-8") + javascript = (tmp_path / "site/app.js").read_text(encoding="utf-8") + assert "给系统一个场景,看它会不会冒险" in html + assert "evaluateLab" in javascript + assert "UNKNOWN_MANUAL" in javascript + assert "fetch(" in javascript # frozen evidence only + assert "/api/" not in javascript + + +def test_public_demo_contains_only_selected_evidence(tmp_path: Path): + output = tmp_path / "site" + report = _module().build(output) + manifest = json.loads((output / "PUBLIC_DEMO_MANIFEST.json").read_text(encoding="utf-8")) + assert manifest["file_count"] == report["file_count"] + assert not list(output.rglob("*.ed25519")) + assert not list(output.rglob("*.db")) + assert not list(output.rglob(".env")) + assert (output / "evidence/reference/automatic/workflow-proof.json").is_file()