# Feature 003 需求与动效追溯

当前为既有项目的代码修复检查点。浏览器访问被安全策略拒绝，状态为 `blocked_security_policy`；没有启动、渲染、截图、代理或替代地址。Node 仅检查模型和替身控制器，数字覆盖不能作为 Design Ready。

## 14 组设计记录

| DR | 入口 / 锚点 | 连续路径 | 状态 |
|---|---|---|---|
| 003-DR-01 轻量默认 Popup | `[data-testid="primary-action"]` / `#popup` | 打开入口；默认、缺失标题、连接和草稿提示 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-02 编辑与单一位置 | `[data-testid="details-toggle"]` / `#details-panel` | 补充信息；标题/备注/标签/位置及草稿状态 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-03 选区优先 | `[data-testid="selection-toggle"]` / `#selection-block` | 载入带选区来源；全文预览或明确仅链接 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-04 主动安全裁剪 | `[data-testid="crop-trigger"]` / `#crop-dialog` | 补充信息 → 裁剪；键盘范围 → 预览 → 确认 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-05 提交与可信回执 | `[data-testid="receive-delivered"]` / `#receipt` | 保存 → 可见模拟接收端 → 可靠送达 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-06 重复与独立记录 | `[data-testid="unapplied"]` / `#receipt` | 重复/追加场景 → 保存 → 接收；未应用字段保留 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-07 仅链接降级 | `[data-testid="source-select"]` / `#receipt` | 仅支持链接的合成来源 → 保存 → 接收 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-08 待发送与恢复 | `[data-testid="pending-open"]` / `#sheet` | 断连 → 保存 → 待发送；时钟观察与重连 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-09 失败与取消竞争 | `[data-testid="current-cancel"]` / `#sheet` | 待发送取消、未知先核对、已送达胜出 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-10 来源或范围失效 | `[data-testid="reconfirm-same"]` / `#context-message` | 模拟页面/选区/裁剪变化 → 重新确认 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-11 不支持与安全阻断 | `[data-testid="source-select"]` / `#blocked-message` | 载入内部页、敏感参数或不明来源 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-12 同对象桌面落点 | `[data-testid="desktop-open"]` / `#sheet` | 可靠回执 → 打开已有/在桌面查看 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-13 键盘与中文语义 | `[data-testid="crop-workspace"]` / `#popup` | 真实业务控件支持 Tab/Escape/方向键；IME 组合态保护 | 原型接线已实现；浏览器安全阻断 |
| 003-DR-14 窄档与偏好 | `[data-testid="narrow"]` / `#popup` | 演示区域切换 320 px/文字 200%/深色/减少动效与透明 | 原型接线已实现；浏览器安全阻断 |

## 28 个场景

使用演示区域场景选择器载入相应 ID；确认重置后按下列路径操作。

| 场景 | 标题与操作 | DR | Node 模型 | 浏览器 |
|---|---|---|---|---|
| R03-US1-A1 | 默认来源与单一保存：确认来源后保存，在下方模拟接收端确认送达。 | 003-DR-01 | passed | blocked_security_policy |
| R03-US1-A2 | 公开视频只保存来源：保存视频链接；查看模拟桌面记录，确认没有下载或生成。 | 003-DR-01、003-DR-07 | passed | blocked_security_policy |
| R03-US1-A3 | 可信回执前保持保存中：点击保存后观察状态；动画结束不会自行成功。 | 003-DR-05、003-DR-09 | passed | blocked_security_policy |
| R03-US1-A4 | 收集箱同一个对象：保存 → 模拟送达 → 在桌面查看。 | 003-DR-05、003-DR-12 | passed | blocked_security_policy |
| R03-US1-A5 | 重复来源不覆盖：直接保存，确认打开已有对象且不添加空记录。 | 003-DR-06 | passed | blocked_security_policy |
| R03-US1-A6 | 不支持正文时仅链接：保存 → 模拟送达，核对仅链接说明。 | 003-DR-07 | passed | blocked_security_policy |
| R03-US1-A7 | 内部页阻断：检查原因与返回入口，无空对象或待发送项。 | 003-DR-11 | passed | blocked_security_policy |
| R03-US1-A8 | 断连与安全排队：保存后进入待发送；可模拟重连或取消。 | 003-DR-08、003-DR-09、003-DR-11 | passed | blocked_security_policy |
| R03-US1-A9 | 重复触发收敛同一意图：保存后反复确认送达，检查记录身份。 | 003-DR-06、003-DR-09 | passed | blocked_security_policy |
| R03-US1-A10 | 同对象定位与关闭恢复：在桌面查看 → 关闭 Popup → 从模拟桌面入口找回。 | 003-DR-12 | passed | blocked_security_policy |
| R03-US1-A11 | 跨 7 天与 30 天重连：推进观察时间，再重连并确认原意图送达。 | 003-DR-08、003-DR-09 | passed | blocked_security_policy |
| R03-US1-A12 | 新项未入队不自动补发：入队写入失败后恢复存储，确认须手动重新入队。 | 003-DR-08、003-DR-09 | passed | blocked_security_policy |
| R03-US1-A13 | 待发送容量独立边界：已有 100 项；尝试保存，再取消一项并重新确认。字节边界见容量样本。 | 003-DR-08、003-DR-09 | passed | blocked_security_policy |
| R03-US1-A14 | 一来源一份本机草稿：恢复草稿并核对来源；关闭、重开不会自动发送。 | 003-DR-01、003-DR-02、003-DR-08、003-DR-10 | passed | blocked_security_policy |
| R03-US1-A15 | 取消保留与明确放弃：待发送列表 → 取消发送；核对草稿与原内容。 | 003-DR-09 | passed | blocked_security_policy |
| R03-US2-A1 | 选区优先与链接回退：展开完整选区，或明确改为仅链接。 | 003-DR-03 | passed | blocked_security_policy |
| R03-US2-A2 | 编辑与异步标题保护：展开编辑标题后保存，再触发元数据到达。 | 003-DR-02、003-DR-05、003-DR-06 | passed | blocked_security_policy |
| R03-US2-A3 | 主动裁剪安全范围：补充信息 → 裁剪；方向键调整，预览后确认。 | 003-DR-04、003-DR-11 | passed | blocked_security_policy |
| R03-US2-A4 | 默认最小采集：直接保存，在接收明细中核对仅来源与必要元数据。 | 003-DR-01、003-DR-02 | passed | blocked_security_policy |
| R03-US2-A5 | 页面与捕获范围失效：先补充备注，再模拟页面变化；恢复必须重新确认。 | 003-DR-10 | passed | blocked_security_policy |
| R03-US2-A6 | 保存范围保持克制：默认、展开和回执均无知识生成入口。 | 003-DR-01、003-DR-02、003-DR-07 | passed | blocked_security_policy |
| R03-US2-A7 | 追加独立采集记录：已有来源提交新选区/备注，接收后打开同一对象。 | 003-DR-06、003-DR-12 | passed | blocked_security_policy |
| R03-US2-A8 | 同意图与独立新意图：先保存并确认，再发起另一次保存；旧记录不覆盖。 | 003-DR-06、003-DR-09 | passed | blocked_security_policy |
| R03-US2-A9 | 旧对象存在不等于追加成功：保存后模拟追加失败或回执丢失，按同一意图恢复。 | 003-DR-06、003-DR-09 | passed | blocked_security_policy |
| R03-US2-A10 | 完整字符与 URL 字节：标题含完整表情且超限；修改或明确仅链接后重新校验。 | 003-DR-01、003-DR-02、003-DR-03、003-DR-10 | passed | blocked_security_policy |
| R03-US2-A11 | 标签创建与同名去重：添加已有或新标签；试验英文大小写变体和近义词。 | 003-DR-02、003-DR-06 | passed | blocked_security_policy |
| R03-US2-A12 | 图片预览与容量：裁剪内选择尺寸/格式样本；压缩预览需再次确认。 | 003-DR-04 | passed | blocked_security_policy |
| R03-US2-A13 | 未应用字段保留草稿：新标题/标签/位置与备注混合提交，确认只追加备注且保留其余草稿。 | 003-DR-02、003-DR-06 | passed | blocked_security_policy |

## 24 条功能需求

完整需求文字和对应测试 ID 见 `traceability.json`。

| FR | 设计落实 | 模型检查 / 范围 | 正式验收 |
|---|---|---|---|
| FR-001 | 003-DR-01、003-DR-10 | R03-US1-A1 | not_checked |
| FR-002 | 003-DR-01、003-DR-02 | R03-US1-A1 | not_checked |
| FR-003 | 003-DR-01、003-DR-03、003-DR-11 | R03-US2-A4 | not_checked |
| FR-004 | 003-DR-03 | R03-US2-A1、R03-US2-A10、LIMIT-note、LIMIT-selection | not_checked |
| FR-005 | 003-DR-02、003-DR-05、003-DR-06 | R03-US2-A2、R03-US2-A10、R03-US2-A11、LIMIT-note、LIMIT-selection、LIMIT-TAGS、TARGET-INVALID、METADATA-LATE | not_checked |
| FR-006 | 003-DR-04 | R03-US2-A3、R03-US2-A12 | not_checked |
| FR-007 | 003-DR-04、003-DR-11 | R03-US2-A3、SELECTION-SAFE | not_checked |
| FR-008 | 003-DR-05、003-DR-06、003-DR-09、003-DR-12 | R03-US1-A3、R03-US1-A4、R03-US2-A9、RECEIPT-LOST、RECEIVER-FAIL、PERSIST-DENIED | not_checked |
| FR-009 | 003-DR-06 | R03-US1-A5、R03-US2-A7、R03-US2-A13、URL-CONSERVATIVE、ONLY-OTHER-FIELDS、RESIDUE-FAIL、RANDOM-REPLAY、EDIT-AFTER-RECEIPT、REPAIR-HASH-IDENTITY、REPAIR-RESIDUE-OWNERSHIP、REPAIR-NAVIGATION-EVIDENCE | not_checked |
| FR-010 | 003-DR-07 | R03-US1-A6 | not_checked |
| FR-011 | 003-DR-11 | R03-US1-A7 | not_checked |
| FR-012 | 003-DR-11 | UI/正式入口要求；代码与静态门检查，不能以模型替代 | not_checked |
| FR-013 | 003-DR-08、003-DR-09、003-DR-11 | R03-US1-A8、R03-US1-A11、R03-US1-A13、LIMIT-ITEM、LIMIT-QUEUE-TOTAL、QUEUE-ONE-BYTE、REPAIR-INTERLEAVED-RETRY、REPAIR-DRAFT-HANDOFF、REPAIR-WRITE-GATE | not_checked |
| FR-014 | 003-DR-05、003-DR-06、003-DR-08、003-DR-09 | R03-US1-A9、R03-US2-A8、RECEIPT-LOST、MULTI-MODEL、RANDOM-REPLAY、EDIT-AFTER-RECEIPT、REPAIR-INTERLEAVED-RETRY、REPAIR-FAILED-WRITER-RELEASE、REPAIR-WRITE-GATE | not_checked |
| FR-015 | 003-DR-02、003-DR-06、003-DR-08、003-DR-09、003-DR-10 | R03-US1-A12、R03-US1-A14、R03-US2-A9、R03-US2-A10、R03-US2-A13、LIMIT-URL、LIMIT-ITEM、LIMIT-QUEUE-TOTAL、LIMIT-DRAFT-COUNT、LIMIT-DRAFT-TOTAL、DRAFT-UPDATE-FAIL、DRAFT-SOURCE-CONFLICT、RECEIVER-FAIL、PERSIST-DENIED、TARGET-AFTER、RESIDUE-FAIL、DRAFT-ONE-BYTE、DRAFT-SINGLE-ONE-BYTE、DIRTY-SWITCH-FAIL、SELECT-INTENT-SAFE、CANCEL-DRAFT-RESTORE-GATE、REPAIR-INTERLEAVED-RETRY、REPAIR-FAILED-WRITER-RELEASE、REPAIR-READ-FAIL-CLOSED、REPAIR-DRAFT-CREATION、REPAIR-DRAFT-STALE-UPDATE、REPAIR-DRAFT-HANDOFF、REPAIR-DRAFT-REVIEW-RACE、REPAIR-DRAFT-CONFLICT-CHOICES、REPAIR-DRAFT-DELETED-VERSION、REPAIR-DRAFT-LEGACY、REPAIR-RESIDUE-OWNERSHIP、REPAIR-NAVIGATION-EVIDENCE、REPAIR-WRITE-GATE、REPAIR-WRITE-GATE-UNAVAILABLE、REPAIR-WRITE-GATE-RELEASE-RACE、REPAIR-WRITE-GATE-REJECT | not_checked |
| FR-016 | 003-DR-05、003-DR-06、003-DR-09、003-DR-12 | R03-US1-A15、CANCEL-SAVE-FAIL、CANCEL-DISCARD、CANCEL-DELIVERED、CANCEL-UNKNOWN、RANDOM-REPLAY、CANCEL-CURRENT-ERASE、CANCEL-DRAFT-RESTORE-GATE | not_checked |
| FR-017 | 003-DR-09 | R03-US2-A6、CANCEL-DISCARD | not_checked |
| FR-018 | 003-DR-12 | R03-US2-A6 | not_checked |
| FR-019 | 003-DR-06 | R03-US2-A6 | not_checked |
| FR-020 | 003-DR-01、003-DR-02、003-DR-07 | R03-US1-A2、R03-US2-A6 | not_checked |
| FR-021 | 003-DR-04、003-DR-10、003-DR-11 | R03-US2-A5、SECURITY-ZERO、SELECTION-SAFE、REPAIR-FRAGMENT-CREDENTIALS、REPAIR-NAVIGATION-EVIDENCE、REPAIR-WRITE-GATE-SCOPE | not_checked |
| FR-022 | 003-DR-01、003-DR-02、003-DR-05、003-DR-06、003-DR-07、003-DR-08、003-DR-09、003-DR-10、003-DR-11、003-DR-12 | R03-US1-A10、DESKTOP-FAIL | not_checked |
| FR-023 | 003-DR-13、003-DR-14 | UI/正式入口要求；代码与静态门检查，不能以模型替代 | not_checked |
| FR-024 | 003-DR-01、003-DR-05、003-DR-12 | UI/正式入口要求；代码与静态门检查，不能以模型替代 | not_checked |

## 8 项动效合同

所有值均为 ExoBrain 派生候选，`provisional / measurement_pending`。联系表与历史报告只支持短促、上下文连续和可非对称的观察，不支持 Popup 源码值。

| ID | 表面 | Enter / Exit | 位移 | 曲线 | 生命周期测试 | 像素与真实焦点 |
|---|---|---|---|---|---|---|
| 003-M01 编辑展开/收起 | `#details-panel` | 140 / 110 ms | 0px | `cubic-bezier(.2,.7,.2,1)` | passed | not_checked |
| 003-M02 位置选择器开合 | `#location-picker` | 120 / 90 ms | 3px | `cubic-bezier(.2,.7,.2,1)` | passed | not_checked |
| 003-M03 选区全文开合 | `#selection-full` | 120 / 90 ms | 0px | `cubic-bezier(.2,.7,.2,1)` | passed | not_checked |
| 003-M04 安全裁剪开合与调整 | `#crop-layer` | 130 / 100 ms | 0px | `cubic-bezier(.2,.7,.2,1)` | passed | not_checked |
| 003-M05 提交到可信回执 | `#receipt` | 100 / 80 ms | 0px | `cubic-bezier(.2,.7,.2,1)` | passed | not_checked |
| 003-M06 待发送行变化 | `[data-od-id^="pending-"]` | 120 / 100 ms | 2px | `cubic-bezier(.2,.7,.2,1)` | passed | not_checked |
| 003-M07 原位错误与恢复 | `#form-error` | 90 / 70 ms | 0px | `cubic-bezier(.2,.7,.2,1)` | passed | not_checked |
| 003-M08 公开元数据到达 | `#source-title` | 100 / 70 ms | 0px | `cubic-bezier(.2,.7,.2,1)` | passed | not_checked |

展开/选区保留当前可见高度继续反向；弹层退出即停止键盘捕获，完成退出后再隐藏。队列行按意图 ID 局部更新，退出回调不能删除重开的行。裁剪确认绑定页面与范围版本；失焦取消旧确认。回执由接收事实驱动，动画不产生成功。错误紧邻当前字段/意图，唯一恢复提示不自动消失。元数据只更新回退展示，离开旧来源后不覆盖新输入。

减少动效可动态切换到等义终态，无旋转/脉冲，保留草稿和发送意图；减少透明度使用实色。DOM 中的保护逻辑与 Node 生命周期检查不能代替实际帧时间、快速反向视觉和辅助技术观察。

## 10 条正式成功标准

| SC | 必须取得的正式证据 | 当前 |
|---|---|---|
| SC-001 | DR-01、05、12；20 个真实公开网页/视频页；20/20 仅可靠落地后成功，桌面定位同一对象；原型样例不计数 | not_checked |
| SC-002 | DR-05、09；从确认到可信终态计时；连接正常时至少 95% ≤2s；动画完成和“等待”不能计作可靠终态 | not_checked |
| SC-003 | DR-06、09；100 次含无新增、独立新增和同意图重试的操作；另测仅其他字段/混合字段；最终 1 来源对象、原内容/信息覆盖 0；每个成功新增意图恰好 1 条记录，重试额外记录 0，无新增空记录 0；未应用字段不被追加成功清除 | not_checked |
| SC-004 | DR-02～04、10、11；20 次真实选区+20 次真实裁剪；另测文本/URL/标签/图片边界；40/40 最终确认内容与原 URL 对应，未获准内容 0；超限不截断、URL 不裁短、压缩未确认不采用；合成安全框不替代正式捕获 | not_checked |
| SC-005 | DR-07、12；10 个暂不支持处理的公开来源；10/10 链接可重开，知识/正文误报 0 | not_checked |
| SC-006 | DR-01/02/06、08～10；断连/页面关闭/失败/浏览器重启各 10 次，含首次保存和追加；另测队列/草稿数值边界、跨时长、草稿写入失败与取消保留分支；虚假成功 0、同意图额外记录 0，获准意图恢复 100%，受保护/不明正文入队 0；已入队项不因时间删除/停发，满时旧项不删，新项恢复后须重新确认；本机草稿核对来源、不串页、不自动提交，取消保留失败不清空原可恢复内容；旧对象存在不计作追加成功 | not_checked |
| SC-007 | DR-04、10、11；10 个获准安全测试样本；Cookie/密码/表单/授权头/敏感参数泄露 0；检查全链而非仅截图 | not_checked |
| SC-008 | DR-01、05、07；至少 10 名首次使用者；至少 9 人 2 分钟内完成且区分保存来源/生成知识；自动化不代替用户理解 | not_checked |
| SC-009 | DR-13、14，覆盖全部核心旅程；100% 仅键盘；200%/窄 Popup 主动作、裁剪确认和错误可达；中文辅助技术单列 | not_checked |
| SC-010 | DR-01、05、12；每个真实样本登记；本轮新接收标识/捕获时间，来源重开 100%；冻结/历史/合成样本计入分母 0 | not_checked |

## 本次修复与父级反例

父级脚本逐字保留，修复前后均直接执行只读原文件；输入 SHA-256 与全部观察值见 `reports/parent-model-before.json`、`reports/parent-model-after.json` 和 `reports/parent-motion-after.json`。

| 反例 | 合同 | 修复前 | 修复后 |
|---|---|---|---|
| M01 内容路由片段不得猜测合并 | 002 FR-008/009；003 FR-009 / DEC-003-01 | failed | passed |
| M02 片段中的明显凭据不得进入安全队列 | 003 FR-021；002 FR-021 | failed | passed |
| M03 双实例交错写入不能丢失已确认入队项 | 003 FR-013/014/015；DEC-003-01/02 | failed | passed |
| M04 同来源已有可靠草稿不能被另一实例静默覆盖 | 003 FR-015；DEC-003-07 | failed | passed |
| M05 切换来源时保存失败必须保留当前安全输入 | 003 FR-015；DEC-003-07；003-DR-10 | passed | passed |
| M06 明确放弃的未发送载荷不应残留在持久化状态 | 003 FR-016；DEC-003-08 | passed | passed |
| M07 异常片段编码应返回受控结果 | 003 FR-011/012/015；003-DR-11 | passed | passed |

父级模型 7/7；父级动效控制器 24/24；自身模型/门禁替身 95/95；静态 14/14。全部是代码层检查。

修复后的共享模型 SHA-256：

`67cbfdd695e7f3f1759db2d826fba03d6944842d865ca039e13d74d339abcf30`

详细机制、历史失败和剩余缺口见 [代码修复检查点.md](代码修复检查点.md)。
