跟踪 ADR-0104 D3 wave 2 的落地。D1(#3429)、D2(#3432)、D3 wave 1(#3443,值形状契约 FileValueSchema)已在 main。Wave 2 是全案唯一带不可逆风险、跨仓、协议 major 的部分,搭 v17 大版本窗口。
覆盖整个 FILE_REFERENCE_TYPES 媒体类:file / image / avatar / video / audio。
目标终态
文件字段值从内联 blob({url,...})变成 sys_file 的 opaque id 引用——接入平台已有的一等文件世界(生命周期 GC、父记录派生下载鉴权、稳定 /files/:fileId 解析器),闭合泄漏 + GDPR 删除缺口 + 匿名读取面 + accept/maxSize 惰性配置。
PR 序列(各自可评审、各自绿灯;破坏性/不可逆步骤排最后)
不可豁免的验收门(来自 ADR-0104 Risks)
- R4:迁移窗口内 GC 冻结,直到字段引用计数被验证;reap guard 删前复核字段引用行。GC 误删 = 不可逆数据丢失。
- R5:一份经评审的公开性清单(哪些存量文件保持
public_read)。
- R6:静态扫描子键读取(公式/模板/hook/flow 里的
record.file.url),迁移报告列出。
- R7:
type: 'file' 存外链的用法退役 → 迁去 url 字段(AI 授权下是正向消歧)。
关联
🤖 Generated with Claude Code
跟踪 ADR-0104 D3 wave 2 的落地。D1(#3429)、D2(#3432)、D3 wave 1(#3443,值形状契约
FileValueSchema)已在 main。Wave 2 是全案唯一带不可逆风险、跨仓、协议 major 的部分,搭 v17 大版本窗口。覆盖整个
FILE_REFERENCE_TYPES媒体类:file / image / avatar / video / audio。目标终态
文件字段值从内联 blob(
{url,...})变成sys_file的 opaque id 引用——接入平台已有的一等文件世界(生命周期 GC、父记录派生下载鉴权、稳定/files/:fileId解析器),闭合泄漏 + GDPR 删除缺口 + 匿名读取面 +accept/maxSize惰性配置。PR 序列(各自可评审、各自绿灯;破坏性/不可逆步骤排最后)
/upload/complete返回fileId;client.storage.upload()透出 fileId。解锁下游,单独安全。fileId→ 解析成FileValueSchema(批量 IN 查询,禁 N+1,带回归测试);遗留内联 blob 在读路径现场归一成展开形态(id: null)。存量记录继续渲染。sys_attachment的引用计数泛化到字段引用(父对象 + 记录 id + 字段名 + 文件 id);写路径维护引用行。字段仍存 blob 时休眠。引用表形态是本 wave 的新设计决定(ADR-0104 addendum 提到)——在本 PR 描述里定清。authorizeFileRead;匿名 capability URL 降为 opt-inacl: 'public_read'(头像/logo)。PROTOCOL_VERSION→ 17;valueSchemaFor(file,'stored')收窄为 id;FileValueSchema成为 expanded 形态;写路径拒内联 blob(带处方);FieldSchema加accept/maxSize并从sys_file元数据权威 enforce;启用字段引用的 ADR-0057 GC。os migrate把平台托管的遗留 blob 摄入sys_file、把列重写为 id;外部 CDN 链接摄不进 → 迁移报告,不静默丢弃(service-automation: update_record reportssuccesswhen written fields are silently stripped — no observability for dropped writes (split from #3356) #3407 纪律)。objectstack-ai/objectui,同步):渲染改消费展开的FileValueSchema、提交 fileId。协议 major 前 re-pin console。不可豁免的验收门(来自 ADR-0104 Risks)
public_read)。record.file.url),迁移报告列出。type: 'file'存外链的用法退役 → 迁去url字段(AI 授权下是正向消歧)。关联
docs/adr/0104-field-runtime-value-shape-contract.md(§D3 + 2026-07-24 addendum 两波拆分)sys_filetombstone/reap)· ADR-0087(协议升级契约)🤖 Generated with Claude Code