时间语义与附件字段
# 时间语义与附件字段 ## 时间语义 个人记录不能假设所有事件都有精确时间。系统统一支持: | 精度 | 含义 | 典型输入 | |---|---|---| | `EXACT` | 精确日期时间 | 2026-07-17 14:30 | | `DAY` | 只知道日期 | 2026-07-17 | | `MONTH` | 只知道月份 | 2026年7月 | | `YEAR` | 只知道年份 | 2026年 | | `RANGE` | 时间区间 | 2018年至2022年 | | `FUZZY` | 自然语言模糊表达 | 大学时期、刚毕业几年 | | `UNKNOWN` | 明确不知道 | 暂时无法回忆 | `UNKNOWN` 是业务状态,不等同于遗漏字段。字段定义可以决定是否允许未知时间以及允许哪些精度。 ## TemporalValue 时间字段统一保存精度、表达式、开始和结束边界,不用一个 `datetime-local` 模拟所有情况。Web 使用 `TemporalValueInput`,移动端使用 `MobileTemporalField`。 ## 附件类型 动态字段支持: ```text IMAGE AUDIO VIDEO DOCUMENT LINK DATASET CHAT_EXPORT VOICE_NOTE SCREENSHOT ``` 字段定义可限制允许种类和多选行为。Web 与移动端选择器必须根据类型提供不同采集入口,例如图片选择、录音、文件选择和链接输入,不把所有附件降级为普通文本框。 ## 安全边界 - 附件只保存对象引用、MIME、大小和哈希,正文由对象存储处理。 - 移动端弱网时可保存上传任务,但 `SECRET` 与 `LEGACY_ONLY` 内容不得进入普通持久化缓存。 - OCR、转写、视觉理解等结果只能生成派生内容或 AI 提案,不能覆盖原始附件。 ## 2026-10-01 附件生命周期复核 Web 单值附件和链接仅在新值确认后替换旧值;多值上传逐项关联已确认文件,后项失败不隐藏前项,明确重试只选择未完成项。上传期间固定类型和批注,重复事件不并发发送。 双端附件组件只属于挂载时会话。账号切换或卸载后清理待选择与待重试文件、批注、链接及能力状态;迟到选择回调不能启动上传,旧上传回包不再写回或继续下一项,旧下载回包不能打开文件。移动选择回调只消费一次,并固定打开选择器时的类型和批注。 验证使用真实 Vue setup 和合成传输边界,不等同于浏览器、原生设备、真实文件上传或数据库验收。普通文件上传的服务端幂等能力在本批没有增加;不确定失败后的人工重试可能留下重复文件,该边界不能以客户端防双击替代。 ## 2026-10-01 普通附件上传原键重试 双端每次选择为每个文件生成独立上传键,发送到原 `POST /files/upload` 路由。Web 使用原 File 对象;Mobile 使用原临时路径。失败后只保留未完成文件、最初元数据与各自原键,显式重试不重新生成键;已确认文件不再次发送。上传期间字段转为只读或提交冻结时,在回写和下一文件请求前暂停,未关联文件及原键保留;重新可编辑后必须明确继续,已经上传但尚未关联的一项仍用原键回读式重试。组件卸载或账号切换清除这些仅存内存的键。 Web 上传封装接收可选第二参数,Mobile 接收可选第四参数;未指定时生成新键,空白、前后空格或超过 160 字符在传输前拒绝。服务端对应修复以 owner+key(operation 用于校验操作作用域) 和收到的字节、文件名、MIME、大小、PRIVATE 指纹重放最小回执;不同内容不能重用原键。该去重受既有 24 小时平台 TTL 约束,不承诺无限期 exactly-once;关闭页面后重新选择也属于新意图。 客户端新增实际封装头部测试和丢失回包的原键重试测试;服务端真实 PostgreSQL 与对象写入计数的证据另见本次普通上传幂等报告。真实浏览器、原生临时路径寿命与网络设备验收仍未运行。 ## 2026-10-01 旧 file 字段上传恢复与会话隔离 旧 file 字段(ModuleFieldEditor 与 MobileFileField)保持文件编号数组合同。上传逐项写回已确认编号,后项失败保留原附件和已成功项;显式重试仅发送未完成文件及原幂等键,移动端同时固定原临时路径和文件名。选择、上传与移除互斥,原生选择回调仅消费一次。账号切换或卸载后清除未完成项,迟到选择不发送,旧上传不写回或继续队列,旧下载不打开,旧能力回包不恢复入口。只读状态的陈旧事件同样拒绝。 新增实际 Vue setup 回归覆盖 Web 14 项、Mobile 17 项,另复跑既有 JSON 编辑器 3 项;模板编译随夹具执行。它们使用合成文件与传输回执,不证明真实浏览器、真机临时路径寿命或对象存储验收。服务端幂等有效期和 owner 边界沿用上一节,未增加任何新接口或持久队列。 ## 2026-10-01 已提交附件下载完整性 普通文件下载和系统反馈附件下载在发送任何文件头或字节前,使用 `StorageService.getVerified` 校验当前 owner 的文件元数据、已登记 Provider 类别、实际字节大小及 SHA-256。权限仍先于数据库查询;不存在与跨 owner 仍统一 404。反馈还必须先通过反馈记录及附件绑定的 owner 检查。损坏或配置到不同类别的 Provider 时,经既有错误过滤器返回不含字节、对象键或底层诊断的 `INTERNAL_ERROR`,不会把未知内容作为成功附件返回。 普通下载成功响应增加 `private, no-store`,与反馈附件已有缓存边界一致。上传回执仍只代表已提交文件引用,不替代每次下载的授权与完整性校验;上传原键重试及 24 小时 TTL 不变。`stored_file` 未保存 Provider 位置指纹,本修复不承诺检测同类别根目录/桶改变,只验证 Provider 类别和当前字节与数据库摘要一致。 内部原始 `StorageService.get` 保留给 Media/Knowledge 等执行专用校验的消费者;MED-005 仍可取得损坏字节并保存 FAILED 诊断。隐私等级和领域权限合同不在本修复中调整。新增测试使用真实 Controller/Storage、隔离 Nest/pg-mem HTTP 及内存 Provider,真实 PostgreSQL、S3、浏览器和真机验收仍须独立执行。
2026-09-30 移动交互修复
移动 UIUX 修复(2026-09-30):单附件成功后原子替换;取消或失败保留原附件。多附件逐项关联已上传内容,未完成项可显式重试。链接采用明确替换语义并限制 http/https。真实上传、下载权限与跨平台控件仍待运行验收。
2026-09-30 移动分页与阅读补齐
MOB-10(2026-09-30):自建记录详情按 TemporalValue 精度显示自然日/月/年、范围与模糊表达;附件显示已返回文件名、批注和安全 http/https 地址,不把 fileId/hash 当正文。下载沿用原 file:read 与 owner 文件端点,高敏字段保持封闭。普通 URL 仅显式复制,不执行任意协议。
2026-10-01 旧 file 字段上传恢复与会话隔离
旧 file 字段(ModuleFieldEditor 与 MobileFileField)保持文件编号数组合同。上传逐项写回已确认编号,后项失败保留原附件和已成功项;显式重试仅发送未完成文件及原幂等键,移动端同时固定原临时路径和文件名。选择、上传与移除互斥,原生选择回调仅消费一次。账号切换或卸载后清除未完成项,迟到选择不发送,旧上传不写回或继续队列,旧下载不打开,旧能力回包不恢复入口。只读状态的陈旧事件同样拒绝。
新增实际 Vue setup 回归覆盖 Web 14 项、Mobile 17 项,另复跑既有 JSON 编辑器 3 项;模板编译随夹具执行。它们使用合成文件与传输回执,不证明真实浏览器、真机临时路径寿命或对象存储验收。服务端幂等有效期和 owner 边界沿用上一节,未增加任何新接口或持久队列。
正式框架时间控件(2026-10-25)
Web共享ModuleDateInput改用Nuxt UI分段输入和日历/月年面板,TemporalValueInput、ModuleFieldEditor复用。H5月份/年份改为Wot专用面板,修正空值变1970与自然日UTC漂移。月/年不写占位日;相同分钟确认保留原偏移和秒毫秒,禁用后迟到事件不写入。此处不代表完整日历展开态、API或真机验收。
正式日期展开态核验(2026-10-25)
PC日期/日期时间/月/年使用同一Nuxt UI分段输入和日历,中文导航、选中项初始焦点及Esc返回;Vite固定同一日期类实例,避免datetime遗漏时分段。清空可用,空值不写今天或1970。H5普通及自建动态表单共用Wot日期适配,月年保留业务精度、历史日期可选;同分钟确认保留原ISO偏移、秒和毫秒。390px正式页面日/月/年展开无横向溢出;H5保存栏低于Wot弹层,反馈浮钮在动画结束后重新避让。区间、所有权限、原生设备和所有领域入口不因这组截图自动验收。
证据:_work/handoff/uiux-production-20261025-phase2;逐项范围见production-70-ledger.json,测试、截图和独立回读分别留证。
2026-10-26 正式源码r13阶段证据与边界
Integration五类时间使用MobileExactDateTimeField及专用严格投影,原35模型和全局时间helper不变。空值只定位光标,打开/取消不写今天;epoch0与0001–0099由受管Wot补丁修正。相同显示分钟保原offset/秒/小数/fold,变更分钟数值减本地秒毫秒以免历史秒偏移和重复小时改错instant。UTC/NY各77及真实H5有限路径有证,不能覆盖设备全部时间语义。
权威范围与历史更正:docs/设计与计划/验证记录/2026-10-25-正式UIUX十四批阶段记录.md;需求70项仍全部fullAcceptance=false,样例只读,未启worker或部署远端。