Skip to content

refactor(spec)!: the honesty layer reads one marker — _dev is retired (#4319) - #4333

Merged
os-zhuang merged 2 commits into
mainfrom
claude/retire-dev-marker
Jul 31, 2026
Merged

refactor(spec)!: the honesty layer reads one marker — _dev is retired (#4319)#4333
os-zhuang merged 2 commits into
mainfrom
claude/retire-dev-marker

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

背景

readServiceSelfInfo 识别两种标记:标准的 __serviceInfo 描述符,以及 plugin-dev 的遗留 _dev: true(归一为 { status: 'stub', handlerReady: false })。

_dev生产者已清零:ADR-0115 退役了写它的 stub 表,framework / objectui / cloud 三个仓扫下来只剩注释。也就是说这个分支只被测试 fixture 触发。

为什么删而不是留个无害别名

一个 boolean 说不出"这个服务是哪一种不真实"。

  • stub —— 编造答案,dispatcher 域拒绝调用它;
  • degraded —— 真的在服务,只是能力削减,域继续服务它。

这是每个 consumer 实际据以判断的分界,而 _dev: true 把两者压成同一个"fake"。#4058 的"要不要把 dispatcher 门推广到所有域"之所以长期答不了,正是因为这个压缩 —— 直到 #4082 把它拆开(plugin-dev 的实现按真实类别重新分类)才有了答案。

三种标记至此归一为一种,而且两次退役都不是教 reader 认新方言,是把生产者迁到描述符上:

标记 结局
_fallback: true #4082:五个 kernel 兜底改带 __serviceInfo(它本来就没有任何 reader —— 这正是它们被报成 available 的原因)
_dev: true 本 PR:ADR-0115 退役 stub 表后已无生产者,删除 reader
__serviceInfo 唯一存活

代价(已写进 changeset、ADR 和一条测试)

一个仍然带着 _dev: true 的服务,现在读作无标记,即完全真实 —— 这是过度上报,正是 D12 要防的方向。之所以可接受,只因为生产者计数为零。外部实现者通过 npm 包的 CHANGELOG.md 拿到 FROM → TO 映射(升级时 agent 会 grep 的正是这个)。

改动

  • SERVICE_DEV_MARKER_KEY 导出与 readServiceSelfInfo_dev 分支;api-surface.json 重新生成(减一行),spec 八个 artifact 门全绿
  • 四处测试 fixture 改写为 __serviceInfo: { status: 'stub' } —— 它们钉的一直是"stub 绝不被报成 available",不是标记的拼写
  • 一条测试反转,钉住新事实:退役标记读作无标记
  • ADR-0076 结论 11 记录本次退役及其代价
  • breaking changeset,body 带 FROM → TO 与"不迁移会怎样"

验证

@objectstack/spec 7149/7149、@objectstack/objectql 1374/1374、@objectstack/runtime 951/951、@objectstack/core 437/437 全部通过;pnpm build 通过(删公开导出没有编译期断链);check:generated 八门全绿。

Closes #4319

🤖 Generated with Claude Code

…ed (#4319)

`readServiceSelfInfo` recognized two spellings: the standard `__serviceInfo`
descriptor and plugin-dev's legacy `_dev: true`, normalized to
`{ status: 'stub', handlerReady: false }`. The `_dev` branch had no producers
left — ADR-0115 retired the stub table that wrote it, and a sweep of framework,
objectui and cloud found only comments — so it fired from test fixtures alone.

Deleting rather than keeping a harmless alias, because a boolean cannot say
WHICH kind of unreal a service is. `stub` (fabricates — the domain refuses it)
versus `degraded` (really serves with reduced capability — the domain keeps
serving it) is the split every consumer gates on, and collapsing both into
"fake" is exactly what made "adopt the dispatcher gate everywhere?"
unanswerable until #4082 unpicked it. Three markers have now become one, and
neither retirement taught the reader a new dialect: both moved their producers
onto the descriptor instead.

The cost, stated in the changeset, the ADR and the test that pins it: a service
still carrying `_dev: true` now reads as unmarked, i.e. as fully real —
over-reporting, the direction D12 exists to prevent. Acceptable only because
the producer count was zero; consumers get the FROM → TO mapping through the
package CHANGELOG, which is what an upgrading agent greps.

- `SERVICE_DEV_MARKER_KEY` export and the `_dev` branch removed; api-surface
  regenerated (one line), all 8 spec artifact gates green
- four test fixtures rewritten to `__serviceInfo: { status: 'stub' }` — they
  were always pinning "a stub is never reported available", not the spelling
- one test inverted to pin the new fact: retired markers read as unmarked
- ADR-0076 conclusion 11 records the retirement and its cost

Closes #4319

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

vercel Bot commented Jul 31, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
Project Deployment Actions Updated (UTC)
objectstack Ignored Ignored Jul 31, 2026 6:42am

Request Review

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

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 3 package(s): @objectstack/core, @objectstack/runtime, @objectstack/spec.

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

  • content/docs/ai/actions-as-tools.mdx (via @objectstack/core)
  • content/docs/ai/agents.mdx (via @objectstack/spec)
  • content/docs/ai/knowledge-rag.mdx (via @objectstack/core)
  • content/docs/ai/natural-language-queries.mdx (via @objectstack/core)
  • content/docs/ai/skills-reference.mdx (via @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via packages/runtime, @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/runtime, @objectstack/spec)
  • content/docs/api/wire-format.mdx (via @objectstack/runtime)
  • content/docs/automation/approvals.mdx (via @objectstack/spec)
  • content/docs/automation/connectors.mdx (via @objectstack/spec)
  • content/docs/automation/flows.mdx (via @objectstack/spec)
  • content/docs/automation/hook-bodies.mdx (via @objectstack/runtime, 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/core, @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 @objectstack/runtime, packages/spec)
  • content/docs/concepts/north-star.mdx (via packages/core, packages/runtime, packages/spec)
  • content/docs/data-modeling/analytics.mdx (via @objectstack/spec)
  • content/docs/data-modeling/drivers.mdx (via @objectstack/runtime, @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/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/migration-from-objectql.mdx (via @objectstack/core)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/runtime)
  • content/docs/deployment/single-project-mode.mdx (via @objectstack/runtime)
  • content/docs/deployment/troubleshooting.mdx (via @objectstack/spec)
  • content/docs/deployment/validating-metadata.mdx (via @objectstack/spec)
  • content/docs/deployment/vercel.mdx (via @objectstack/runtime)
  • 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/runtime, @objectstack/spec)
  • content/docs/kernel/cluster.mdx (via @objectstack/runtime, @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/core, @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/examples.mdx (via @objectstack/core)
  • 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/core, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/core, @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/core, @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via packages/core, packages/runtime, @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/anatomy.mdx (via @objectstack/core)
  • content/docs/plugins/development.mdx (via @objectstack/core, @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/core, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/core, @objectstack/runtime, @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/core, @objectstack/spec)
  • content/docs/protocol/kernel/http-protocol.mdx (via @objectstack/runtime)
  • content/docs/protocol/kernel/i18n-standard.mdx (via @objectstack/spec)
  • content/docs/protocol/kernel/index.mdx (via @objectstack/core, @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/core, @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/core, @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/core, @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/index.mdx (via @objectstack/spec)
  • content/docs/releases/v12.mdx (via @objectstack/core, @objectstack/spec)
  • content/docs/releases/v13.mdx (via @objectstack/spec)
  • content/docs/releases/v15.mdx (via @objectstack/core)
  • content/docs/releases/v16.mdx (via @objectstack/spec)
  • content/docs/releases/v17.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 merged commit e87fea1 into main Jul 31, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the claude/retire-dev-marker branch July 31, 2026 06:55
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 size/m tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

诚实层的 _dev 遗留标记生产者已清零 —— 按 enforce-or-remove 收敛到唯一的 __serviceInfo

1 participant