You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
* refactor(spec,client,metadata-protocol,runtime)!: retire the workflow 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.
* docs: retire the workflow slot from four more hand-written pages (#4451)
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.
---------
Co-authored-by: Claude <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: content/docs/api/plugin-endpoints.mdx
+11-9Lines changed: 11 additions & 9 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -26,19 +26,21 @@ Authenticate with email and password (better-auth's email sign-in route, mounted
26
26
27
27
The following endpoints become available when the corresponding plugin is installed and registered with the kernel. Use the discovery `services` map to check availability.
28
28
29
-
### Workflow (`/workflow`) — Plugin Required
29
+
### Workflow (`/workflow`) — removed in v17
30
30
31
31
<Callouttype="warn">
32
-
Not yet mounted. These routes are declared in the API protocol but the core dispatcher registers no `/workflow` handler and no bundled plugin provides a `workflow` service (only an in-memory dev stub), so they return **404** today. `discovery.services.workflow` reports `unavailable` in a standard install.
32
+
There is no workflow endpoint, and there is no `workflow` service slot. The
33
+
three routes documented here were declared in the API protocol and served by
34
+
nothing — no dispatcher handler, no plugin — so they 404'd for the whole life
35
+
of the declaration. The slot, the `WorkflowProtocol` methods behind it and the
36
+
discovery fields that reported it were all retired in v17 ([#4451](https://github.com/objectstack-ai/objectstack/issues/4451)).
37
+
Use the live mechanisms instead: an object validation rule of type
38
+
`state_machine` for lifecycle transitions, an `approval` flow node for human
39
+
approval pauses (ADR-0019), and lifecycle hooks / `record_change` flows for
40
+
record-triggered automation.
33
41
</Callout>
34
42
35
-
| Method | Endpoint | Description |
36
-
|:-------|:---------|:------------|
37
-
| GET |`/workflow/:object/config`| Get workflow configuration |
38
-
| GET |`/workflow/:object/:recordId/state`| Get record's workflow state |
39
-
| POST |`/workflow/:object/:recordId/transition`| Execute state transition |
40
-
41
-
Approve/reject are **not** workflow routes (ADR-0019): approval is a flow node, and decisions are recorded on the approvals runtime via `POST /approvals/requests/:id/approve` and `POST /approvals/requests/:id/reject`.
43
+
Approve/reject were never workflow routes (ADR-0019): approval is a flow node, and decisions are recorded on the approvals runtime via `POST /approvals/requests/:id/approve` and `POST /approvals/requests/:id/reject`.
State machine transitions. No package registers the `workflow` slot
339
-
(`CORE_SERVICE_PROVIDER.workflow` is `null`). Approve/reject are not workflow
340
-
methods — per ADR-0019 they moved to the request-id-based approvals API under
341
-
`/api/v1/approvals` (`POST /requests/:id/{approve,reject,recall}`, served by
342
-
`@objectstack/plugin-approvals`).
340
+
### 6. workflow Service — retired in v17
341
+
The slot, its `IWorkflowService` contract and the three `WorkflowProtocol`
342
+
methods (`getWorkflowConfig`, `getWorkflowState`, `workflowTransition`) were
343
+
removed in [#4451](https://github.com/objectstack-ai/objectstack/issues/4451):
344
+
nothing ever registered or resolved the slot (ADR-0115 Evidence 5), no method
345
+
ever had an implementation, and no host ever mounted `/api/v1/workflow`. The
346
+
three capabilities it named are live elsewhere — state-machine transitions are
347
+
an object validation rule of type `state_machine`, approvals are `approval`
348
+
flow nodes on the approvals runtime (ADR-0019 — decisions via
349
+
`POST /api/v1/approvals/requests/:id/{approve,reject,recall}`, served by
350
+
`@objectstack/plugin-approvals`), and record-triggered automation is lifecycle
351
+
hooks + `record_change` flows.
343
352
344
353
### 7. automation Service — 1 method ✅ `@objectstack/service-automation`
345
354
`triggerAutomation`
@@ -502,11 +511,16 @@ a package that cannot be installed is a dead end, which is why
502
511
| Slot | State |
503
512
|:-------|:------------|
504
513
|**ui**| Nothing registers the slot. `ViewProtocol`'s five methods are declared and unrouted; view CRUD runs through `/api/v1/meta`, and `/api/v1/ui/view/:object` is served by the `protocol` service. |
505
-
|**workflow**| Nothing ships. `WorkflowProtocol`'s three methods have no implementation and no consumer. |
506
514
|**search**| Nothing ships. Contract and engine enum exist in `@objectstack/spec` only. |
507
515
|**ai**| Nothing in this repo — `service-ai` (chat, completion, models, conversations) is Cloud/EE. |
508
516
|**realtime transport**| The service exists but no WebSocket/SSE route is mounted, so `routes.realtime` is deliberately never advertised. |
509
517
518
+
The `workflow` slot used to sit in this table ("nothing ships, no consumer").
519
+
It was retired outright in v17 (#4451, per ADR-0115 Evidence 5): the
520
+
capability lives in `state_machine` validation rules, approval flow nodes
521
+
(ADR-0019) and `record_change` flows, so there is nothing left for a slot to
"workflow": { "enabled": false, "status": "unavailable", "message": "No implementation ships for the 'workflow' slot — register a service under it to enable" },
56
+
"search": { "enabled": false, "status": "unavailable", "message": "No implementation ships for the 'search' slot — register a service under it to enable" },
58
57
"ai": { "enabled": false, "status": "unavailable", "message": "Provided by @objectstack/service-ai in ObjectStack Cloud/Enterprise — no implementation ships in the open framework" }
0 commit comments