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 与 D1 非媒体类型的按部署扫描门禁 + D2 动作参数 17.0 默认严格 —— 证据来源与载体已定于 ADR-0104 2026-07-30 附录(修订版) #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

vercelBot commented Jul 24, 2026

Copy link
Copy Markdown

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

ProjectDeploymentActionsUpdated (UTC)
specBuildingBuildingPreview, CommentJul 24, 2026 2:44pm

Request Review

@github-actionsgithub-actionsBot 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 mainJul 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 freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationprotocol:datasize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants

@os-zhuang@claude