Skip to content

feat(data): enable.feeds/activities real opt-out gates + trackHistory contract (#2707)#2733

Merged
os-zhuang merged 1 commit into
mainfrom
feat/2707-enable-capability-gates
Jul 10, 2026
Merged

feat(data): enable.feeds/activities real opt-out gates + trackHistory contract (#2707)#2733
os-zhuang merged 1 commit into
mainfrom
feat/2707-enable-capability-gates

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes #2707。按"分 flag 接线(enforce),不移除"处置——评估结论:四个 flag 并不同质,移除方案不可行(trackHistory 实为 live;spec 在 fixed 组移字段=全平台 major;examples/下游有真实使用)。

分 flag 处置

flag 处置 契约
activities 接线为 opt-out writer 闸门 spec 默认 false→true;显式 false 时 plugin-audit 只跳过 sys_activity 时间线镜像(审计行不受影响)。行为兼容;同时是 ADR-0057 想要的按对象 activity 增长控制杆
feeds 接线为 opt-out + 服务端强制 spec 默认 false→true;显式 false → 引擎 hook 缝拒绝 sys_comment 创建,403 FEEDS_DISABLED(fail-closed,复用 CLONE_DISABLED 模式)+ mapDataError 专属分支(通用 data 路由不走 sendError.status 透传——运行时冒烟抓到 403 退化成 400 后补)
trackHistory ledger 纠错→live + 契约成文 ledger 定性"dead"是错的:objectui 自 2026-05 起用它门控 History 标签页(按 ledger 自己的规则 objectui 消费者算 live 证据)。旧 authorWarn hint("改用 Field.trackHistory")照做会丢 History 标签页——已替换为两级契约:对象 flag=History 标签页总开关;Field.trackHistory=diff 选择器;审计采集保持无条件(合规账本)
files 保持 dead+authorWarn,roadmap #2727 唯一两层都无消费者的 flag。describe() 改为如实标注 RESERVED,不再宣传不存在的能力

默认值翻转是必须的:default(false) 会把"没设"编译成显式 false,opt-out 语义无法区分"作者显式关"和"默认"——与 trash/mru/clone 同姿态。

为什么不把 lint 升级成 error

advisory-only 是 lint-liveness-properties 文件头写明的设计决定(signal over noise);修复路线是把 flag 变 live(enforce-or-remove 里选 enforce),不是把警告变错误。收口后 authorWarn 只剩 enable.files 一个,警告面从 4 降到 1。

验证

  • 单测:plugin-audit 28 ✓(含新增 opt-out/403 gate 测试)、rest 217+1 ✓、cli 468 ✓(lint 契约测试更新)、objectql 804 ✓、spec 6671 ✓(唯一红=存量 [spec] PROTOCOL_MAJOR (12) drifted from package major (13) — protocol-version lockstep test red on main #2729,与本 PR 无关,已单独报)
  • 闸门:check:liveness ✓、check:api-surface ✓(表面无变化)
  • 编译期:app-todo(四 flag 全 true)编译告警从 4 条降到 1 条(仅 enable.files,hint 已更新)
  • 运行时端到端(fresh showcase):默认对象=activity 镜像 ✓ + 评论 201 ✓;探针对象(feeds:false, activities:false)=0 条 activity 镜像 + 1 条审计行 + 评论 403 FEEDS_DISABLED
  • 文档:references/data/object.mdx 由 gen:docs 再生成(仅本表)

配套

🤖 Generated with Claude Code

…istory contract defined (#2707)

Disposition per flag (enforce-or-remove; removal rejected — trackHistory is
live in the console, spec removal = platform major, and the flags match the
industry-standard object-capability model):

- enable.activities: opt-OUT writer gate. Spec default false→true;
  plugin-audit skips ONLY the sys_activity timeline mirror on explicit
  `activities:false` (audit row untouched). Behavior-preserving; gives
  ADR-0057 its per-object activity-growth lever.
- enable.feeds: opt-OUT + server-side enforcement. Spec default false→true;
  explicit `feeds:false` rejects sys_comment creation at the engine hook
  seam, 403 FEEDS_DISABLED (fail-closed, CLONE_DISABLED pattern) + a
  mapDataError branch so generic data routes surface the 403 (they bypass
  sendError's .status passthrough — caught in the runtime smoke test).
- enable.trackHistory: ledger misclassified it dead — objectui has gated
  the record History tab on it since 2026-05 (a live consumer under the
  ledger's own rules). Reclassified live; the old authorWarn hint ("use
  Field.trackHistory instead") would have lost users the History tab and
  is replaced by the two-grain contract (object flag = History-tab master
  switch; Field.trackHistory = diff selector; audit capture stays
  unconditional as a compliance ledger).
- enable.files: stays dead + authorWarn — reserved for the generic
  Attachments related-list, tracked in #2727; describe() now says so
  instead of advertising a capability that doesn't exist.

Default flips are required for opt-out semantics: default(false)
materializes `false` for every enable-block object, making explicit
opt-out indistinguishable from the default.

Verified: unit (plugin-audit gates, mapDataError, lint contract tests,
spec defaults), liveness gate green, app-todo compile now warns only on
enable.files, and a live showcase run — default object: activity mirrored
+ comment 201; probe object with explicit false flags: 0 activity rows,
1 audit row, comment → 403 FEEDS_DISABLED.

Companion objectui PR gates the record feed/timeline UI on the same flags.
Closes #2707.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
@vercel

vercel Bot commented Jul 10, 2026

Copy link
Copy Markdown

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

Project Deployment Actions Updated (UTC)
spec Ready Ready Preview, Comment Jul 10, 2026 3:50am

Request Review

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 4 package(s): @objectstack/cli, @objectstack/plugin-audit, @objectstack/rest, @objectstack/spec.

98 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 packages/cli, @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/data-flow.mdx (via @objectstack/cli)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli, @objectstack/rest, @objectstack/spec)
  • content/docs/api/error-handling-client.mdx (via @objectstack/spec)
  • content/docs/api/error-handling-server.mdx (via @objectstack/rest, @objectstack/spec)
  • content/docs/api/index.mdx (via @objectstack/rest, @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/cli, 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/production-readiness.mdx (via @objectstack/plugin-audit)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/getting-started/build-with-claude-code.mdx (via @objectstack/spec)
  • content/docs/getting-started/cli.mdx (via @objectstack/cli, @objectstack/plugin-audit, @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/validating-metadata.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/data-service.mdx (via packages/cli)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli, 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/storage-service.mdx (via packages/spec)
  • content/docs/kernel/services-checklist.mdx (via @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/cli)
  • content/docs/permissions/authorization.mdx (via packages/rest, @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/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/rest, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/cli, @objectstack/plugin-audit, @objectstack/rest, @objectstack/spec)
  • content/docs/protocol/backward-compatibility.mdx (via @objectstack/spec)
  • content/docs/protocol/diagram.mdx (via packages/spec)
  • content/docs/protocol/knowledge.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/config-resolution.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/lifecycle.mdx (via @objectstack/spec)
  • content/docs/protocol/objectos/plugin-spec.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/protocol/objectos/realtime-protocol.mdx (via @objectstack/cli)
  • content/docs/protocol/objectos/runtime-capabilities.mdx (via @objectstack/spec)
  • content/docs/protocol/objectql/index.mdx (via packages/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 packages/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/cli, @objectstack/plugin-audit, @objectstack/rest, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v9.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/setup-app.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 merged commit e2fa074 into main Jul 10, 2026
17 checks passed
@os-zhuang
os-zhuang deleted the feat/2707-enable-capability-gates branch July 10, 2026 03:51
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.

[spec/cli] 对象 enable.files/trackHistory/activities/feeds 为 dead property:schema 接受、liveness 仅告警不拦

1 participant