Skip to content

refactor(spec,client,metadata-protocol,runtime)!: 退役 workflow 服务槽位与 graphql 残留 (#4451) - #4473

Merged
os-zhuang merged 5 commits into
mainfrom
claude/discovery-cache-queue-route-conflict-8fwmfc
Aug 1, 2026
Merged

refactor(spec,client,metadata-protocol,runtime)!: 退役 workflow 服务槽位与 graphql 残留 (#4451)#4473
os-zhuang merged 5 commits into
mainfrom
claude/discovery-cache-queue-route-conflict-8fwmfc

Conversation

@os-zhuang

Copy link
Copy Markdown
Contributor

Closes #4451.

维护者判断:workflow 的能力"是 automation 还是 approval,应该都有了",确认是旧设计、无业务价值 → 在 v17 一并退役#4451 提的两条残留在这个 PR 里一起清掉。

为什么是退役而不是补实现

workflow 是 ADR-0078 那种"声明了、从未实现"的形态,而且是每一层同时如此:

  • CoreServiceName 'workflow' —— 从没有任何东西注册或解析这个槽位。ADR-0115 Evidence 5 双仓核实过:"no code in this repository resolves either slot",唯一的触碰是 plugin-dev 那张已退役的 stub 表和通用 discovery 遍历;
  • IWorkflowService(87 行契约)—— 零实现;
  • WorkflowProtocol 的三个方法 —— 没有任何代码提供;
  • ApiRoutes.workflow —— 没有 builder 能如实填充;
  • /api/v1/workflow —— 没有任何 host 挂载过。Retire DEFAULT_DISPATCHER_ROUTES and the stale graphql entry in ApiRoutesSchema (spec-major) — #3563 follow-up #3586 删掉的 DEFAULT_DISPATCHER_ROUTES 注释里就写着它属于 "routes that never existed"。

这不是从谁手上拿走东西 —— 它承诺的能力早就活在别处,而且已经好几个 major 了:

承诺 实际活着的机制
记录状态机 state_machine 验证规则(StateMachineSchema 仍然可授权在 object 上)
审批 flow 的 Approval 节点 + approvals runtime(ADR-0019 已把独立审批流程折进 Flow)
记录触发的自动化 生命周期 hook + record_change flow(service-automation)

所以这里没有"要先建的功能",只有三个已存在机制的第四个名字。ADR-0115 D5 授权在 17.x rc 窗口内直接切,不设弃用期。

一并清掉的 graphql 残留

graphql 根本不是 CoreServiceName —— 没有东西能占据这个槽位,条目本身不可达 —— 但它声明了一条 dispatcher 早已作为"不在产品计划内"删除的路径(http-dispatcher.ts: // /graphql removed — GraphQL is not in the product plan,#2462 follow-on)。它能一直没人管,是因为 provider 守卫只校验"每个槽位都有条目",从不校验"每个条目都是槽位"。

退役套件

.claude/skills/spec-property-retirement 走完:

  • 迁移登记:workflow-service-slot-retired SemanticMigration 挂在 major-17 步骤上,FROM → TO 进入 spec-changes.json、生成的 upgrade guide 和 spec_changes MCP 工具;
  • 无 load-path 转换:这些是 TS/API 面和 discovery 响应字段,从不存进 stack 元数据,所以没有源可重写,os migrate meta 无事可做;
  • 基线行按第三条路线删除:21 行 authorable-surface.json + 7 个 json-schema.manifest.json 条目刻意删除,遵循 plugin-runtime 先例 —— retiredKey() 的价值在于让作者在能到达的 parse 上收到处方,而这些形态已经没有任何东西再 parse,处方无人可收即是噪音;
  • changeset:spec/client major,runtime/metadata-protocol minor,携带完整 FROM → TO 与一行修复;
  • 文档:v17 release notes 的 Dead spec clusters removed 表 + 升级清单、services-checklist(从 "Still open" 移除并说明去向)、http-protocol 示例(顺带修掉示例里同样虚构的 graphql 路由)。

os explain workflow 保留为 redirect 条目而非删除,与 content/docs/automation/workflows.mdx 的处理一致 —— 它原本在教一个 spec 里从来不存在的形态(states[] / transitions[] / approvers),现在改为指向三个真实机制。

被 gate 抓住三次,都走了正路

  1. json-schema.manifest.json 绊线 —— 7 个 schema "disappeared";
  2. authorable-surface.json 21 个 key vanish —— 按 §2 的第三条路线(没人 parse ⇒ 删基线并在 changeset 里说明);
  3. provider 守卫把注释里带引号的 'workflow' 读成了枚举成员 —— 它的解析器抓 CoreServiceName 块内所有单引号 token,注释也算。改用反引号并在原地留了注记,免得下一个人重踩。

全仓 pnpm build 的 tsc 清扫是主要的消费者扫雷手段(退役套件 §1 的做法),它找出了 StateMachineSchema 变成未使用 import 这类 grep 抓不到的点。

验证

关联:#4451#4318(PR #4448)、ADR-0115 Evidence 5 / D5、ADR-0019、ADR-0049、ADR-0078、#3586#2462


Generated by Claude Code

claude added 2 commits August 1, 2026 08:58
… service slot and the stray graphql entry (#4451)

The `workflow` slot was ADR-0078's silently-inert declaration at every layer
at once, and had been since it was written: a `CoreServiceName` nothing ever
registered or resolved, an `IWorkflowService` contract with zero
implementations, a `WorkflowProtocol` whose three methods no code ever
provided, an `ApiRoutes.workflow` field no builder could truthfully populate,
and an `/api/v1/workflow` advertisement for a path no host ever mounted. The
pre-#3586 `DEFAULT_DISPATCHER_ROUTES` already listed that path among "routes
that never existed"; ADR-0115 Evidence 5 verified the slot itself across both
repositories — "no code in this repository resolves either slot", the only
touches being plugin-dev's since-retired stub probe and the generic discovery
walk.

Nothing here is being taken away from anyone, because the capability the slot
promised has been live elsewhere for majors: record state machines are
enforced by the `state_machine` validation rule (`StateMachineSchema` stays
authorable on the object), approvals are first-class flow nodes on the
approvals runtime (ADR-0019 folded the standalone approval process into Flow),
and record-triggered automation is lifecycle hooks + `record_change` flows.
That is why this is a removal rather than an enforcement: there is no feature
to build, only a second name for three that exist.

Removed with it: the `graphql` entry in `CORE_SERVICE_PROVIDER` and the
`graphql: { route: '/graphql' }` discovery entry. `graphql` was never a
`CoreServiceName` — so nothing could occupy the slot and the entry was
unreachable — and it declared a path the dispatcher had already dropped as out
of the product plan (#2462 follow-on). The provider guard only checks that
every SLOT has an entry, never that every entry is a slot, which is how the
stray sat unchallenged.

Direct cut inside the 17.x rc window, per ADR-0115 D5. The retirement kit: a
`workflow-service-slot-retired` SemanticMigration on the major-17 step carries
the FROM -> TO into spec-changes.json, the generated upgrade guide and the
`spec_changes` MCP tool. These are TS/API surfaces and discovery RESPONSE
fields — never stored in stack metadata — so there is no load-path conversion
and nothing for `os migrate meta` to rewrite. The 21 `authorable-surface.json`
baseline lines and 7 `json-schema.manifest.json` entries are dropped
deliberately in the same change, following the plugin-runtime precedent: a
`retiredKey()` prescription earns its keep at a parse the author reaches, and
nothing parses these shapes any more.

`os explain workflow` is kept as a redirect topic rather than deleted, mirroring
content/docs/automation/workflows.mdx. It had been teaching a shape the spec
never had (`states[]` / `transitions[]` / `approvers`); it now names the three
live mechanisms instead.
@vercel

vercel Bot commented Aug 1, 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 Aug 1, 2026 9:49am

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation protocol:system tests tooling labels Aug 1, 2026
@github-actions

github-actions Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 5 package(s): @objectstack/cli, @objectstack/client, @objectstack/metadata-protocol, @objectstack/runtime, @objectstack/spec.

119 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, packages/client, @objectstack/spec)
  • content/docs/ai/skills.mdx (via @objectstack/spec)
  • content/docs/api/client-sdk.mdx (via @objectstack/cli, @objectstack/client, packages/runtime, @objectstack/spec)
  • content/docs/api/data-flow.mdx (via @objectstack/cli, @objectstack/client)
  • content/docs/api/environment-routing.mdx (via @objectstack/cli, @objectstack/client, @objectstack/spec)
  • content/docs/api/error-catalog.mdx (via @objectstack/cli, @objectstack/client, @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 packages/cli, @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/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/metadata-protocol, @objectstack/runtime, packages/spec)
  • content/docs/concepts/north-star.mdx (via 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/backup-restore.mdx (via @objectstack/cli)
  • content/docs/deployment/cli.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/deployment/index.mdx (via @objectstack/runtime)
  • content/docs/deployment/production-readiness.mdx (via @objectstack/runtime)
  • content/docs/deployment/self-hosting.mdx (via @objectstack/cli)
  • 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 packages/cli, @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/cli, @objectstack/client, @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/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, packages/client)
  • content/docs/kernel/runtime-services/email-service.mdx (via packages/spec)
  • content/docs/kernel/runtime-services/index.mdx (via packages/cli, packages/client, 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/metadata-protocol, @objectstack/spec)
  • content/docs/kernel/services.mdx (via @objectstack/spec)
  • content/docs/permissions/authentication.mdx (via @objectstack/cli, @objectstack/client, @objectstack/runtime)
  • content/docs/permissions/authorization.mdx (via 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/development.mdx (via @objectstack/spec)
  • content/docs/plugins/index.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/plugins/packages.mdx (via @objectstack/cli, @objectstack/client, @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/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/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/lifecycle.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/protocol/kernel/plugin-spec.mdx (via @objectstack/cli, @objectstack/spec)
  • content/docs/protocol/kernel/realtime-protocol.mdx (via @objectstack/cli, @objectstack/client)
  • 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/cli, @objectstack/client, @objectstack/runtime, @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/cli, @objectstack/client, @objectstack/spec)
  • content/docs/releases/v17.mdx (via @objectstack/runtime, @objectstack/spec)
  • content/docs/releases/v9.mdx (via @objectstack/metadata-protocol, @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.

@github-actions github-actions Bot added the size/l label Aug 1, 2026
claude and others added 3 commits August 1, 2026 09:07
The docs-drift check on PR #4473 earned its keep: my symbol-shaped grep
(`IWorkflowService`, `WorkflowProtocol`, `api/v1/workflow`) found three pages
and missed four PROSE mentions that describe the same retired slot in words.

- `api/plugin-endpoints.mdx` documented three `/workflow/*` routes under a
  "not yet mounted … return 404 today" caveat. The caveat was already the
  tell: routes that 404 for the whole life of the declaration are not "not
  yet", and the slot behind them is gone now. The section becomes a redirect
  naming the three live mechanisms.
- `kernel/services-checklist.mdx` carried it in three more places — the
  legend's 36-method count (now 33), the `null`-provider explanation, and a
  full "6. workflow Service" section still describing the three methods as
  pending rather than removed.

The remaining `workflow` hits in `content/docs` are the ordinary English word
(approval workflow, build workflow, GitHub Actions workflows) and stay.
@os-zhuang
os-zhuang merged commit dadb43f into main Aug 1, 2026
10 checks passed
@os-zhuang
os-zhuang deleted the claude/discovery-cache-queue-route-conflict-8fwmfc branch August 1, 2026 09:49
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:system size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

discovery 的 workflow / graphql 槽位还声明着两条无人挂载的 route —— #4318 同款,但目前"上了膛没击发"

2 participants