Skip to content

feat(spec): declared media value shape — ADR-0104 D3 wave 1 + addendum#3443

Merged
os-zhuang merged 1 commit into
mainfrom
docs/adr-0104-d3-addendum
Jul 24, 2026
Merged

feat(spec): declared media value shape — ADR-0104 D3 wave 1 + addendum#3443
os-zhuang merged 1 commit into
mainfrom
docs/adr-0104-d3-addendum

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

承接 D1(#3429)/ D2(#3432),推进 ADR-0104 的 D3 第一波,并把 D3 的决策补记进 ADR。

背景:回答"除了 file,image 等是不是也算"

算,而且从 D1 起就是同一个类。 D1 已经把 file / image / avatar / video / audio 五个都归进 FILE_REFERENCE_TYPES——它们今天存同一种内联 blob、同样绕开 sys_file、同样要一起改。D3 全程用 file 只是这个媒体类的简称,没有单独的 image 故事。本 PR 在 ADR 里把这点写明。

ADR-0104 addendum(2026-07-24)

结合"企业级 + 未来主要由 AI 写元数据、要防 AI 犯错"的方向,对 D3 做了两点细化:

  1. D3 拆成两波——因为 D3 与 D1/D2 不同:破坏性、跨仓(objectui)、协议大版本,且是全案唯一带不可逆风险(R4,GC 删文件字节)的部分。
    • Wave 1(本 PR):值形状契约,单仓、非破坏、无迁移、无不可逆风险。
    • Wave 2(门控):sys_file 引用存储模型 + GC + 受治理下载 + accept/maxSize 权威 enforce + 迁移,协议大版本,带 R4/R5/R6 硬性验收门,需与 objectui 同步。
  2. enforcement-point 原则:对 AI 生产者,防错的是构建期硬拒(os validate 报错),运行期 warn-first 只保护存量部署数据。目标终态是两个 enforcement point 各司其职——这也回头收敛 D1/D2 已落地的 warn-first 与 tracking: 翻转 ADR-0104 值形状/参数强校验为默认严格(D1 + D2 warn-first → error) #3438 的翻转策略。

Wave 1 代码(spec,非破坏)

  • @objectstack/spec/data 新增 FileValueSchema:媒体类今天实际存的内联形态 { url, name?, size?, mimeType?, alt?, duration? }(url 必填),替换 D1 那个宽松的过渡 union。
  • valueSchemaFor(file 类, 'stored') 现在能抓住畸形媒体值(数字、空对象、没有 url{name} 碎片)——过去被当 opaque payload 放过;同时仍接受 opaque id/url 字符串形态(import 兼容)。
  • enforcement 沿用 D1 已有的写路径 warn-first 姿态,存量记录不 strand

Wave 1 刻意不做:不给 FieldSchemaaccept/maxSize——它们治的是真实上传,权威 enforce 需要服务端知道真实字节(即 sys_file 模型),现在加就是 ADR-0078 禁止的惰性开关。归 Wave 2。

测试

  • spec 6850 ✓(含新增媒体类用例:五个类型的对象形态必须带 url,url-less 碎片被拒)
  • field-zoo 契约-oracle 互锁 45 ✓({url,...} 形态全部仍通过)
  • 无仓内消费方依赖旧的宽松 FileLikeValueSchema;api-surface(+FileValueSchema 导出)与生成参考文档已同步。

不在本 PR 范围

Wave 2 全部(存储迁移 / GC / 受治理下载 / 协议大版本 / objectui 同步)——按 ADR 与我的建议,它带不可逆风险且跨仓,需要单独排期 + 明确 go,不在此自动执行。

🤖 Generated with Claude Code

https://claude.ai/code/session_01SHpGw3GBA9aFpfwVArRWfd


Generated by Claude Code

ADR-0104 addendum (2026-07-24): split D3 (file-as-reference) into two waves and
record the enforcement-point principle (build-time hard reject for AI-authored
metadata + runtime warn-first for deployed data). Makes explicit that D3 covers
the whole FILE_REFERENCE_TYPES media class (file/image/avatar/video/audio), not
just `file`.

Wave 1 (this change, single-repo, no migration): spec now exports
FileValueSchema — the declared inline media form ({url, name?, size?, mimeType?,
alt?, duration?}, url required) — tightening D1's loose transitional union so a
malformed media value is caught instead of waved through as an opaque payload;
the id/url string form stays accepted for import compat. Enforcement rides D1's
warn-first write path, so deployed records aren't stranded.

Wave 2 (accept/maxSize, sys_file reference model, GC, governed download,
protocol-major migration) is deliberately gated — not in this PR.

spec suite 6850 green (incl. new media-class cases); api-surface + generated
reference docs regenerated.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SHpGw3GBA9aFpfwVArRWfd
@vercel

vercel Bot commented Jul 24, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
spec Building Building Preview, Comment Jul 24, 2026 2:44pm

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:data tests tooling labels Jul 24, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/spec.

104 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:

  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/spec)
  • content/docs/api/environment-routing.mdx (via @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/spec)
  • content/docs/automation/approvals.mdx (via packages/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via packages/spec)
  • content/docs/automation/hooks.mdx (via @objectstack/spec)
  • content/docs/automation/index.mdx (via @objectstack/spec)
  • content/docs/automation/webhooks.mdx (via @objectstack/spec)
  • content/docs/automation/workflows.mdx (via @objectstack/spec)
  • content/docs/concepts/architecture.mdx (via @objectstack/spec)
  • content/docs/concepts/design-principles.mdx (via packages/spec)
  • content/docs/concepts/index.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-driven.mdx (via @objectstack/spec)
  • content/docs/concepts/metadata-lifecycle.mdx (via packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/spec)
  • content/docs/data-modeling/external-datasources.mdx (via @objectstack/spec)
  • content/docs/data-modeling/field-types.mdx (via @objectstack/spec)
  • content/docs/data-modeling/fields.mdx (via @objectstack/spec)
  • content/docs/data-modeling/formulas.mdx (via @objectstack/spec)
  • content/docs/data-modeling/index.mdx (via @objectstack/spec)
  • content/docs/data-modeling/objects.mdx (via @objectstack/spec)
  • content/docs/data-modeling/queries.mdx (via @objectstack/spec)
  • content/docs/data-modeling/schema-design.mdx (via @objectstack/spec)
  • content/docs/data-modeling/seed-data.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation-rules.mdx (via @objectstack/spec)
  • content/docs/data-modeling/validation.mdx (via @objectstack/spec)
  • content/docs/deployment/cli.mdx (via @objectstack/spec)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/common-patterns.mdx (via @objectstack/spec)
  • content/docs/getting-started/examples.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-reference.mdx (via @objectstack/spec)
  • content/docs/getting-started/quick-start.mdx (via @objectstack/spec)
  • content/docs/getting-started/your-first-project.mdx (via @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/auth-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/cache-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/data-engine.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/index.mdx (via @objectstack/spec)
  • content/docs/kernel/contracts/metadata-service.mdx (via packages/spec)
  • content/docs/kernel/contracts/storage-service.mdx (via packages/spec)
  • content/docs/kernel/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/queue-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sharing-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/sms-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authorization.mdx (via @objectstack/spec)
  • content/docs/permissions/permission-sets.mdx (via @objectstack/spec)
  • content/docs/permissions/permissions-matrix.mdx (via @objectstack/spec)
  • content/docs/permissions/positions.mdx (via @objectstack/spec)
  • content/docs/permissions/rls.mdx (via @objectstack/spec)
  • content/docs/permissions/sharing-rules.mdx (via @objectstack/spec)
  • content/docs/plugins/adding-a-metadata-type.mdx (via @objectstack/spec)
  • content/docs/plugins/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/kernel/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/query-syntax.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/schema.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/security.mdx (via packages/spec)
  • content/docs/protocol/objectql/state-machine.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/actions.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/concept.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/index.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/layout-dsl.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/record-alert.mdx (via @objectstack/spec)
  • content/docs/protocol/objectui/widget-contract.mdx (via @objectstack/spec)
  • content/docs/releases/implementation-status.mdx (via @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/spec)
  • content/docs/ui/actions.mdx (via @objectstack/spec)
  • content/docs/ui/create-vs-edit-form.mdx (via @objectstack/spec)
  • content/docs/ui/dashboards.mdx (via @objectstack/spec)
  • content/docs/ui/forms.mdx (via @objectstack/spec)
  • content/docs/ui/index.mdx (via @objectstack/spec)
  • content/docs/ui/public-data-collection.mdx (via @objectstack/spec)
  • content/docs/ui/setup-app.mdx (via @objectstack/spec)
  • content/docs/ui/translations.mdx (via @objectstack/spec)
  • content/docs/ui/views.mdx (via @objectstack/spec)

Advisory only. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs origin/main → pass the list as args.docs.

@os-zhuang
os-zhuang marked this pull request as ready for review July 24, 2026 14:57
@os-zhuang
os-zhuang merged commit 71f76e1 into main Jul 24, 2026
16 of 17 checks passed
@os-zhuang
os-zhuang deleted the docs/adr-0104-d3-addendum branch July 24, 2026 14:57
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation protocol:data size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants