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

vercelBot commented Jul 31, 2026

Copy link
Copy Markdown

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

1 Skipped Deployment
ProjectDeploymentActionsUpdated (UTC)
objectstackIgnoredIgnoredJul 31, 2026 6:42am

Request Review

@github-actionsgithub-actionsBot 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 mainJul 31, 2026
18 checks passed
@os-zhuang
os-zhuang deleted the claude/retire-dev-marker branch July 31, 2026 06:55
Sign up for freeto join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentationImprovements or additions to documentationsize/mteststooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

1 participant

@os-zhuang