# ExoBrain 003 Browser Save

版本：`0.4.0-prototype`。规格基线：Feature 003 V0.4，2026-09-08。

此交付是独立的中文 HTML 交互原型。14 组 DR、28 个场景、24 条 FR 和 8 项动效都有入口及追溯；业务控件和 Node 测试消费同一状态模型。范围包含原型模拟，不是生产代码或浏览器扩展。

**当前状态：`not_design_ready / browser_blocked_security_policy / dependency_pending`。** 本次只完成现有项目的代码修复检查点，详见 [代码修复检查点.md](代码修复检查点.md)。浏览器访问已被安全策略明确拒绝，禁止启动、渲染、截图、代理、复制页面到其他地址或预览绕过。 纯 Node 与源码检查不能关闭视觉、浏览器交互、中文系统输入法、VoiceOver、真实 Popup 生命周期或 002 集成验收。

## 入口与文件

- 入口：[index.html](index.html)。脚本与样式均在 `assets/`，相对路径，不用 CDN。
- 实际状态模型：[assets/model.js](assets/model.js)。UI 和确定性测试共用此文件。
- 交互与演示：[assets/app.js](assets/app.js)、[assets/fixtures.js](assets/fixtures.js)。
- 动效模型与适配器：[assets/motion.js](assets/motion.js)。
- [需求与动效追溯.md](需求与动效追溯.md)、[traceability.json](traceability.json)。
- [reports/test-results.json](reports/test-results.json)、[reports/static-results.json](reports/static-results.json)。
- [delivery-manifest.json](delivery-manifest.json)、[SHA256SUMS.txt](SHA256SUMS.txt)。

绝对项目目录：

`/Users/liyingjie/Library/Application Support/Open Design/namespaces/release-stable/data/projects/98cdac9e-a2d8-405a-af2a-78cb638f21c1`

项目名称为 **ExoBrain 003 Browser Save**，登记在 `project.json`。首次制作只使用这个独立 Open Design 管理目录；本次在原文件上修复，没有新建项目或复制旧 001/002 业务原型。仅按本次明确指定路径读取并本地化 Phosphor 图标与 MIT 许可。模型选择由会话宿主负责；用户请求为 GPT-6-Astra，文件不伪造宿主模型切换或项目列表元数据更新的证据。

## 连续交互

默认 Popup 只显示来源、模拟连接与保存。按需展开可修改标题、备注、标签，选择一个模拟位置，核对选区或进入主动裁剪。默认来源只包含合成 URL 与必要元数据，没有正文抓取或截图。

1. 在 Popup 点击保存。进入“保存中”，等待多久都不会因动画结束而成功。
2. 在独立“原型演示”区域选择“确认可靠送达”。这是显式模拟接收，不是真实桌面 IPC。
3. Popup 出现来源回执。通过“在桌面查看”进入同一对象的模拟桌面落点，可核对对象 ID、原位置及独立记录。
4. 可模拟元数据到达或失败；用户标题不被覆盖，回执与来源身份不变。
5. 模拟重复来源、追加失败、丢失回执、取消竞争或断连，均沿同一意图恢复。

原型演示区域提供 28 个场景的合成前提。点击“载入场景”后明确确认替换演示数据，才会重置本原型的对象、队列和草稿。没有第二套只用于测试的业务逻辑。场景是同一交互界面的前提，不是截图或 28 个静态页面。

“当前合成来源”切换与“模拟页面变化”不同：前者保存安全草稿后切换，后者使尚未确认的来源/选区/裁剪失效，必须核对。保存草稿失败时保留当前来源和会话输入，不静默丢失后切页。

## 已实现的恢复合同

- 保守 URL 等价：默认保留全部未知片段（包括 hash 内容路由）；只有完整 URL 与片段都匹配明确的 `navigationEvidence` 才可忽略该导航片段。仍移除本原型审核列出的 `utm_*` 跟踪项；保留内容参数、路径和 HTTP/HTTPS 区别，不猜测短链或跳转。
- 重复来源无新增文字时不建空记录；新增选区/备注在原对象下形成独立记录。同意图重试复用记录，新操作有新意图。
- 旧对象存在不作为本次追加成功证据。回执丢失先查原意图，不盲目发送。
- 重复时原标题、标签、封面和位置保持原值。此前填写的其他字段说明未应用并保留剩余草稿，已交付选区/备注不进入自动重放。
- 公开意图可靠入队后没有 TTL。模拟时钟推进只用于观察，重连恢复同意图；未入队项不会自动补发。
- 队列 100 条 / 100 MB / 单项 5 MB；草稿一来源一份、20 份 / 20 MB / 单份 5 MB。均以实际序列化 UTF-8 载荷计量，容量样本没有注入假占用数。
- 计量包含 URL、规范身份、文字、图片数据 URI 和最小模型元数据。图片 3 MB 指解码后的二进制大小；队列中 Base64 表示本身也计入字节，因此图片并不等于整条容量。
- 取消先核对未送达。默认保留草稿，保留失败则停止发送并继续保留原队列载荷。另行放弃会移除本次未送达输入，不删对象或旧记录。
- 标题 200、备注 10,000、选区 50,000、标签 20×30，使用 `Intl.Segmenter` 计算完整可见字符；URL 按 16,000 UTF-8 字节验证，不裁短。
- 草稿写入、交接和删除均核对已读版本；另一实例新建或更新后拒绝旧版本，可靠草稿与当前输入都保留。冲突面板核对两份内容，明确恢复或删除后才继续。草稿写入失败不覆盖最后可靠版本。刷新后的接收结果按原意图恢复，草稿仍需显式核对和提交。

持久化仅使用 `exobrain-prototype-003-state-v04` 与 `exobrain-prototype-003-session-v04` 两个命名空间；不调用整个存储的 `clear()`。同运行域使用覆盖读取、分配 ID 和写入的互斥保护，竞争方明确拒绝。页面持久化经 `assets/storage.js` 的独占 Web Locks 门禁，第二页、门禁缺失或失败时只读，保留会话输入并显示具体状态，不退回无保护写入。重试取得写入权本身不保存、不发送；仍需明确业务动作。该原生门禁尚未在真实宿主运行验证。

## 主动裁剪

裁剪只作用于本地 Canvas 合成内容。没有读取真实标签、屏幕、用户文件、Cookie、表单值或剪贴板。只有用户在模拟桌面明确点击“复制安全来源”时才尝试写入该安全合成 URL；从不读取剪贴板。

方向键移动、Shift + 方向键调整尺寸，数值输入和指针均可操作。越界或覆盖不可捕获区域时不生成可保存图像。退出、失焦、页面变化使旧确认失效。PNG/JPEG/WebP 都由浏览器 Canvas 实际编码；超像素或字节样本先预览，再明确采用。尺寸保持比例。取消压缩保留此前已经确认的图片。

3 MB 临界样本在本地 PNG 中加入合法的合成 `tEXt` 辅助块，精确构造字节容量；压缩通过 Canvas 重新编码移除该合成块。它用于字节边界，不是现实摄影图片压缩效果的证据。“仍超限”样本保留超限，不能采用。无论哪种条件都没有请求整页截图。

## 视觉观察与原创转译

首次制作时实际打开并目视了：Craft `41-全局新任务浮层.png`、Recall `08-AddContent新增内容.png`，以及 Inspector、Sidebar、Quick Open 的三张既有动效联系表。本次代码修复未重新查看图片或播放视频；原始视频在首次制作时也没有播放或重新逐帧测量，时长包络引用既有报告，不能写成本轮测得的 Popup 时长。

| 维度 | 观察与来源 | 决策 | 本原型 |
|---|---|---|---|
| 字体 | Craft 浮层系统字、紧凑轻量字段；Recall Web 私有字体不借用 | Adapt / Reject 私有字体 | 系统中文字体，不装入竞品字体 |
| 灰白层次 | Craft 原文背景仍可辨识；Recall 白色 Add Content 面与灰底分离 | Adapt | 中性灰画布、白色 Popup；不复制整套品牌界面 |
| 间距 | Craft 少量默认字段，任务层不占满工作区 | Adapt | 4px 网格，14/20 正文，13/18 字段 |
| 圆角 | 两份证据不是同态原生 Popup | Adapt | 字段 8px、Popup 12px、主动作 10px 派生候选 |
| 边缘 | 浮层薄边、近场小阴影，原文上下文稳定 | Adapt | 细边与轻阴影，不把玻璃作为强制效果 |
| 主动作 | Recall URL 输入与主动作重心明确；Craft 提交单一 | Adopt 层级 / Reject 品牌资产 | 唯一保存主动作；ExoBrain 提供的橙色转换为 OKLch，深字确保对比 |
| 状态反馈 | 保存之后围绕同一来源继续；研究未证明 Recall 去重细节 | Adopt 对象连续 / Reject 推测 | 对象、记录、草稿、待发送分别表达事实 |
| 动效 | 联系表显示局部表面进退与上下文连续；报告有非对称包络 | Adapt | 8 项短促派生过渡、退出后卸载、过时回调保护与减少动效 |
| 裁剪 | Recall 精确选区裁剪尚无充分真实证据 | 原创 | 合成安全区域、确认和失效保护 |
| 外围功能 | 研究含完整编辑、Graph、Chat 等 | Defer | 本原型不设假入口 |

参考图仅观察，没有嵌入业务 UI、复制账号内容或打包竞品私有素材。业务图片由本原型对明确合成内容进行裁剪生成；没有远程图片、生成式替代 Logo 或图片热链。文档、关闭、展开和回执等业务图标已改为指定 Phosphor 原路径；静态 SVG 与动态渲染路径均逐字核对，MIT 许可保留在 `assets/phosphor/PHOSPHOR-LICENSE.txt`。没有从旧项目复制业务页面，品牌只写 ExoBrain 名称。

种子复用：`web-prototype/assets/template.html` 的 reset、容器、字段、按钮和布局类系统保存在 `assets/seed.css`；Layout 2 的分栏骨架用于合成上下文与 Popup，Layout 7 的列表骨架用于恢复记录。根据当前明确应用原型要求，未使用营销 hero、统计、CTA 条或衬线展示字体。当前 Feature 003 和 DESIGN §0 优先于旧暖白主题及插件默认营销结构。

浅深色声明颜色对用数值计算验证；正常文字最低 5.74:1（保存按钮深色文字与当前橙色的组合）。这不等于实际像素或显示器视觉验收。Hover 尽量只改变边缘，焦点独立可辨认。完整令牌见 [brand-spec.md](brand-spec.md)。

## Node-only 检查入口

在本项目目录执行，无依赖安装、无网络、无数据库：

```sh
node tests/verify-delivery.cjs
node tests/parent-checks.cjs
node tests/run.cjs
node tests/static-check.cjs
node tests/package-delivery.cjs
node tests/verify-delivery.cjs
```

测试程序使用 Node 内置 `assert`、UTF-8 编码及 `Intl.Segmenter`，需要支持这些 API 的现代 Node。机器结果记录实际 Node 版本、执行时间、各用例耗时与实际模型 SHA-256。

第一轮模型测试真实失败为 13 项，记录在 `reports/test-results-first-run.json`。修复空输入自动保存导致的草稿阻断、畸形 URL 片段、取消放弃后的内容清理；随后加入 1 字节边界、失败切页保护、成功后的新输入意图、取消草稿恢复核对，以及实际动效适配器减少动效测试。最终结果以 `reports/test-results.json` 为准，不用首轮通过数冒充冻结版本。

本次先记录父级 7 项反例中 3 通过 / 4 失败，再修复为 7 通过；父级 24 项控制器检查前后通过。首轮修复全量回归为 75/76，失败的旧导航测试假设已修正为显式导航证据，并补充未知片段不得合并的断言。父级原脚本与断言没有改动。静态首轮新增门检查曾误把像素尺寸的乘号当图标；仅缩小为业务图标的准确检测，原始失败报告保留。最终数值以绑定源码哈希的报告为准。

静态检查验证闭合标签、静态 ID、资源路径、控件引用、无网络调用、基本键盘保护与声明颜色对；不启动 DOM 浏览器，不用节点数量代替交互或视觉验收。

## 待独立验证与已知限制

| 项目 | 状态 | 具体缺口 |
|---|---|---|
| 浏览器连续交互、实际布局及截图 | blocked_security_policy | 安全策略明确拒绝浏览器访问；本检查点没有启动、渲染、截图、代理或替代地址，也不要求父级绕过 |
| 320 px、真实 200% 缩放、深浅色 | not_checked | 有重流与文字放大候选；宿主几何、行尾及实际裁切尚待查看 |
| 动效帧时间、反向运动视觉、减少透明度 | not_checked | 状态生命周期已做 Node 检查，像素表现与实际帧率尚未测 |
| 中文系统 IME / VoiceOver | not_checked | 只有 DOM 事件保护及中文语义代码；未使用真实输入法候选窗或读屏 |
| 原生 Popup 关闭、扩展后台恢复 | not_checked | 仅页面内模拟关闭与模型重建；不能等同浏览器扩展生命周期 |
| 真正多窗口并发写入 | not_checked | 模型交错竞争和 Web Locks 门禁替身通过；尚未验证原生锁、页面崩溃释放、BFCache 和 storage 事件。缺失门禁时页面只读，不宣称可靠保存 |
| 历史损坏数据修复 | not_recoverable_from_current_state | 已被旧版本合并或覆盖的原始差异可能不再存在；不自动拆对象、迁移旧来源键或补造丢失内容 |
| 实际存储容量 | host_dependent | 100 MB 是产品/模型边界，真实 localStorage 配额通常更低；实际写入失败会拒绝并保留旧可靠数据，不承诺 100 MB 可用 |
| 图像浏览器解码与真实裁剪隐私 | not_checked | Canvas 合成范围，不代表扩展截图权限、真实 DOM 去敏或摄影图压缩质量 |
| 安全分类 | simulation_only | 合成白名单分类与危险 URL 拦截；不是生产安全分类器 |
| 桌面定位、来源重开、002 集成 | dependency_pending | 只在同页面打开模拟对象与合成来源；没有跨进程、外网或正式对象证据 |
| FR-024、SC-001～010 正式产品验收 | not_checked | 真实任务 ID、接收时间、真实来源重开、用户理解和正式扩展分母尚未取得 |
| 宿主项目显示名及具体运行模型 | host_not_verified | 本项目文件已命名；未操纵 Open Design UI 或外部数据库核对宿主元数据 |

没有新增生产依赖、生产代码、数据库、Git/Figma/私人账户或外部网络变更。没有开启浏览器、后台监控或常驻任务。正式仓库设计就绪清单保持只读、未勾选；001/002 以及全产品的验收状态没有提升。

## 后续动态验收边界

本检查点的浏览器验收被安全策略阻断。以下定位器只作为现有交付文档保留，不是本次运行指令或绕过授权；未来另有明确许可时才执行。

优先从 `index.html` 默认态跑完整旅程，再通过 28 场景与可见模拟控件覆盖异常。主要定位器：`data-testid="primary-action"`、`title`、`note`、`location-trigger`、`selection-toggle`、`crop-workspace`、`crop-confirm`、`pending-open`、`drafts-open`、`receive-delivered`、`receive-lost`。恢复行使用稳定的 `data-od-id="pending-<intentId>"`，动态动作使用 `data-sheet-action` 与 `data-arg`。`window.ExoPrototype.snapshot()` 只读返回当前合成事实，适合对照 UI；不能作为真实桌面事实。

快照、动效帧及可访问性结果须与交付 SHA-256 绑定。任何后续修改使对应冻结哈希失效，修复后重新验证受影响项。最终 Design Ready 由正式评审逐项证据决定。
