# 接收端确认的来源清理回执

## 实施状态

源码实现已写入；按用户要求，自动测试、静态分析、构建及运行验收均留待用户回来后执行。本次不新增任何平台验收结论。既有可选来源结束扩展及 LocalSend 原始传送协议保持不变。

## 产品行为

- 来源结束通知保留接收端返回的回执编号、实际移除临时文件数和逻辑字节数，不再仅将结果缩减成状态后丢弃数量。
- 只有存在含数量的接收端回执时，列表才显示紧凑的数量摘要。点击通知在页内对话框显示状态、精确逻辑字节数及可选取的回执编号。
- 对话框明确区分移除文件的逻辑大小与实际释放磁盘空间的测量值。数量描述临时文件，不是已发布的目标文件。
- 已发布文件仍明确标为保留。接收端保留已发布文件、同时确认临时文件清理时，只显示临时文件的数量。
- 待通知、未知、过期、不支持、共享来源、需授权和忙碌状态不生成虚构的零数量。旧终态通知没有回执也继续加载，详情明确表示缺少数量回执。
- 包含英文、简体中文和繁体中文文案；香港语言沿用既有通知语言助手的繁体文案。

## 持久化与信息边界

私有第一版通知日志新增可选 `cleanup` 对象，既有必填字段不变：

```json
{
  "receiptId": "11111111-1111-4111-8111-111111111111",
  "removedFiles": 1,
  "unlinkedBytes": 4096
}
```

以上仅为结构示例，不是实测证据。来源结束结果本来就包含这些值；实现不使用文件大小或下载进度推算清理数量，也不为缺少字段的旧记录补零。

只有 `removed` 与 `publishedPreserved` 状态接受该对象。回执编号为规范的第四版 UUID；文件数为零至二的整数，与既有接收端单来源账本一致。字节数非负；零文件必须对应零字节。终态结果的回执格式错误时，清理保持未确认，不发布错误证明。旧回调仍受既有通知版本检查约束。新授权和重试转换会清除旧回执；迟到的本地完成通知保留已经持久化的接收端回执。

公开原生任务通知仅投影 `receiptId`、`removedFiles`、`unlinkedBytes`，这些值没有清理授权能力。授权、令牌、续传键、路径、路线信息继续保持私有。公开嵌套回执为不可变投影，通知条数和编码后响应体上限继续生效。

## 接口兼容

`GET /native-tasks/source-end` 与重试响应可以带有可选 `cleanup`。服务端严格检查对象字段和终态，拒绝额外字段及敏感字段。旧通知不带 `cleanup` 仍然有效。端点、请求必填字段、权限范围及原始传送格式不变。

Rust OpenAPI 源码与 `docs/api` 下的四份快照已进行源码和纯数据同步，未调用依赖测试执行的导出器。软件内离线文档由主批次统一同步。

## 待验证

- 实际清理回执保存后重启日志，确认数量完全一致且没有授权信息泄露。
- 兼容没有回执字段的第一版日志及公开响应，包括旧终态通知。
- 验证格式错误、结果状态不匹配、迟到回调和日志写入结果未知的分支。
- 确认保留已发布文件的结果不会被展示成已删除目标文件，并区分真实零数量回执与没有回执。
- 核对 OpenAPI 快照、公开响应严格校验、响应大小限制和重试请求重放。
- 检查页内详情、编号选取、窄屏、大字体与四个支持的语言标签。
- 执行真实接收端清理，对照已移除临时文件的逻辑大小核对回执；如需物理空间数值，另行测量。
