# N-025 Scripting 与平台 状态:`BLOCKED`(默认拒绝策略、真实 Main Text 来源清单、签名 manifest、权限/资源预算、 平台报告、服务端 hash 门和请求决策审计已落地;本地隔离执行、真实 server job 与发布审计未实现) ## 已验证切片 1. N-025-A:脚本默认拒绝网络、autorun、driver expression 和 add-on 安装;entry/dependency path 必须在项目内,未知权限和重复 ID 会拒绝。 2. N-025-B(部分):脚本 manifest 要求 SHA-256、固定长度签名、publisher/keyId、权限 allowlist、CPU/内存/墙钟预算,并检查脚本依赖图。 3. N-025-C(门):合法脚本仍要求隔离 sandbox;server job 需要 script/source/input hash 一致,但当前 endpoint 未配置,返回 `SERVER_JOB_UNAVAILABLE`。 4. N-025-D:Worker/WebGPU/OffscreenCanvas/OPFS 与 native/CUDA/Metal/HIP/OptiX capability 报告只反映 API 存在或显式 `BLOCKED`。 5. N-025-A(Main reader):从 Blender `Text`/`TextLine` 重建最多 1 MiB、65,536 行的完整 UTF-8 内嵌来源,记录项目相对外部路径、`use_module` autorun 请求和 SHA-256;所有来源均为 只读且 `executionStatus=BLOCKED`,autorun 请求按默认拒绝处理,不引入 Python 执行入口。 6. `test:scripting-isolation` 独立验证未批准 key 返回 `SCRIPT_SIGNATURE_INVALID`,批准 key 仍返回 `SCRIPT_SANDBOX_UNAVAILABLE`,server job 返回 `SERVER_JOB_UNAVAILABLE`;测试不创建 本地执行器,也不把签名校验误报为 sandbox。 7. 每次本地脚本请求都可生成冻结的 `ScriptExecutionAuditIR`:绑定 canonical manifest/source SHA-256、权限、CPU/内存/墙钟预算、批准 key 命中、UTC 时间戳、请求摘要和明确拒绝码; 审计凭证仍只能是 `DENY`,不能绕过 sandbox 门。 8. N-025-E(审计链):至多 65,536 条拒绝审计按 sequence、前项 SHA-256 与 canonical entry SHA-256 串联;读取时重新校验请求摘要和整条链,拒绝 requestId 重放、非递增 UTC 时间戳、内容篡改、断链与超预算日志。该链是内存/序列化协议,不声称已持久化发布审计。 ## 仍然阻断 - N-025-B/C:签名验证密钥管理、无网络 CPython/native sandbox、server Blender job 和 output hash 提交。 - N-025-D/E:真实 GPU/native window/file watcher 适配、恶意脚本/依赖混淆/逃逸/重放、 审计日志持久化和发布门;本地请求级审计凭证已完成,不代表隔离执行完成。 ## 验收 ```bash npm --prefix web run test:script-main-reader npm --prefix web run test:scripting-isolation WEB_TEST_PORT=5325 npm --prefix web run test:e2e -- --grep "N-025 script" ```