Skip to content

tracking: ADR-0104 D3 wave 2 — file-as-reference (sys_file 引用存储 + GC + 受治理下载 + 迁移,v17 协议 major) #3459

Description

@os-zhuang

跟踪 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 序列(各自可评审、各自绿灯;破坏性/不可逆步骤排最后)

  • PR-1 存储管道(附加、非破坏):/upload/complete 返回 fileId;client.storage.upload() 透出 fileId。解锁下游,单独安全。
  • PR-2 读路径双读归一(附加):读到 fileId → 解析成 FileValueSchema(批量 IN 查询,禁 N+1,带回归测试);遗留内联 blob 在读路径现场归一成展开形态(id: null)。存量记录继续渲染。
  • PR-3 引用行基础设施(附加、暗):把 sys_attachment 的引用计数泛化到字段引用(父对象 + 记录 id + 字段名 + 文件 id);写路径维护引用行。字段仍存 blob 时休眠。引用表形态是本 wave 的新设计决定(ADR-0104 addendum 提到)——在本 PR 描述里定清。
  • PR-4 受治理下载(opt-in):字段引用文件走父记录派生 authorizeFileRead;匿名 capability URL 降为 opt-in acl: 'public_read'(头像/logo)。
  • PR-5 v17 切换(破坏、协议 major):PROTOCOL_VERSION → 17;valueSchemaFor(file,'stored') 收窄为 id;FileValueSchema 成为 expanded 形态;写路径拒内联 blob(带处方);FieldSchemaaccept/maxSize 并从 sys_file 元数据权威 enforce;启用字段引用的 ADR-0057 GC。
  • PR-6 迁移工具:os migrate 把平台托管的遗留 blob 摄入 sys_file、把列重写为 id;外部 CDN 链接摄不进 → 迁移报告,不静默丢弃(service-automation: update_record reports success when written fields are silently stripped — no observability for dropped writes (split from #3356) #3407 纪律)。
  • PR-7 objectui(objectstack-ai/objectui,同步):渲染改消费展开的 FileValueSchema、提交 fileId。协议 major 前 re-pin console。

不可豁免的验收门(来自 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

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions