# 验证与交付

## 证据分层

| 检查 | 能证明什么 | 不能证明什么 |
| --- | --- | --- |
| 数据/资源工具 | 材料依赖闭合、边界有序、本地资源存在、可解析 | 科学方法正确、画面可读 |
| JS 语法 | 解析通过 | Three.js API、材质、运行正确 |
| 浏览器交互 | 场景与控件实际运行，错误状态可见 | 全部工艺参数真实 |
| 截图/录像 | 所选视角和时间点的布局与视觉状态 | 未取样的全部状态、工程精度 |
| HTTPS 字节校验 | 发布版本对应本地资源 | CSP 下脚本可执行、动画可交互 |

至少逐章检查 0、约 0.5、约 0.95、1，再回拖到早期时刻；有多个子阶段时增加边界附近样本。
验证重入、首尾循环、暂停/继续、倍速、拖动、键盘、镜头重置与图表联动。
检查窄屏、横屏及减少动态效果偏好。对实际改动覆盖必要测试，不因一处文案改动重跑所有视觉验收。

优先使用环境中已有浏览器工具。不默默安装一整套测试依赖；没有浏览器时完成静态检查并
如实记录视觉/交互验证缺口，不能将“没有发现错误”写成“已在浏览器验收”。

## 工具

```bash
# 不覆盖非空目录，显式复制匹配版本的 vendor
python3 scripts/animation_tool.py scaffold ./demo --title "新动画" --vendor-dir ./vendor

# 工艺数据、相对引用，及 Node 可用时的 JS 解析
python3 scripts/animation_tool.py validate ./demo --node-check

# 已有项目可只检查资源，不强制改成模板数据格式
python3 scripts/animation_tool.py validate ./existing-site --resources-only \
  --manifest publish.json --node-check

# publish.json 是精确的相对文件路径数组，不是自动递归目录
python3 scripts/animation_tool.py package ./demo --manifest publish.json --output /tmp/demo.zip
```

脚本不登录、不建服务、不上传，也不声称检查图像真实性。它拒绝越界路径、符号链接、
已知私有文件名和可检测的发布凭据形态，但不能证明任意内容不存在隐私；仍须人工检查
用户授权的发布范围。失败时修复具体原因，不能通过把整个工作目录加入白名单绕开检查。

示例 `publish.json`：

```json
["index.html", "style.css", "scene.js", "player.js", "process-data.js", "theme.js", "vendor/three.min.js"]
```

上例只展示格式，不是模板的完整依赖列表；scaffold 会生成实际需要的完整名单。
CSS 的 `url()` 和本地 import 也必须被打包。外部论文链接不需要复制到包里，外部字体
和运行脚本则要考虑目标平台 CSP 与离线要求。

## 托管发布

只有当前请求或既有授权允许时才发布。保留已选托管方、站点身份和访问策略；不因某个
案例用了 OpenDrop 就将所有新项目上传到同一站点。
若用 OpenDrop，读取现有发布技能和站点回执，在进程中使用所有者凭据执行 replace。
不要打印回执、token 或 claim URL；按所有者返回的版本核对，不根据本地旧回执猜版本。

发布前检查根入口、相对引用、库版本配套、许可、favicon 和精确白名单。不要把 Agent
文档、传输回执、账号缓存、临时测试文件或本机绝对路径一并上传。
文档/skill 只有用户明确要求分享时才加入发布范围。

上传成功后，用 HTTPS GET 比对关键文件或全量 manifest 的哈希；再通过公网域名打开
页面，检查 CSP、浏览器错误、真实资源请求、主要交互和分享链接。
若控制台 404 来自 favicon，补齐图标或显式定义本地图标后重验，不把它误报成 3D 引擎故障。

更新超时后先读取现有站点状态和内容，确定是否已经发布，再决定重试。
已发布的不可变版本可作为回溯证据，但不要声称它等同于已执行回滚。
交付区分：本地完成、已打包、已上传、线上运行验收；报告剩余缺口。
