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
the `ETLEndpointType` / `ETLTransformationType` / `ETLSyncMode` / `ETLRunStatus`
9
+
enums and the `ETL` factory are REMOVED under ADR-0049 enforce-or-remove. The whole
10
+
file goes, on the same reading #4738 used to retire L1 `DataSyncConfig` one layer up:
11
+
**narrative-only**. No engine ever parsed, scheduled or executed an `ETLPipeline`.
12
+
13
+
Measured on `origin/main` immediately before the removal: the only non-spec
14
+
references in this repo are two fumadocs-generated documentation sources
15
+
(`apps/docs/.source/*.ts`), not executors; objectui has no reference at all; and
16
+
there is no `packages/spec/liveness/etl.json`, so no ADR-0049 gate ever had a reading
17
+
on the surface — while the same file family's EXECUTED half does have one
18
+
(`liveness/mapping.json`), which is what makes that absence meaningful rather than an
19
+
oversight.
20
+
21
+
FROM → TO, layer by layer — with one gap stated plainly instead of redirected:
22
+
23
+
| removed | use instead |
24
+
|---|---|
25
+
|`ETLPipeline.source` + `syncMode` + `schedule` (scheduled extraction from an external system) |`ConnectorSchema.syncConfig` (`integration/connector.zod.ts`) — the live, parsed sync surface: strategy, direction, cron schedule, `conflictResolution`, batching, delete mode |
26
+
|`ETLTransformation` of type `map` / `cast`-like per-field work |`mapping.fieldMapping[].transform` (`data/mapping.zod.ts`) — `none`/`constant`/`map`/`split`/`join`/`lookup`, applied row by row by the REST import path |
|`ETLTransformation` of type `join` / `aggregate` / `script` / `merge` / `deduplicate` / … |**nothing.** There is no replacement because there was never an implementation — those ten transformation types named capabilities no runtime had. Do the work where it runs (the destination warehouse's ELT, a `flow`, a scheduled job), and let multi-stage movement return through ADR-0049's ENFORCE route: the engine first, the vocabulary second |
29
+
30
+
**The fix:** delete the import. Nothing was ever deployed under an `ETLPipeline` —
31
+
that is the finding, not a consolation — so there is no data migration; `tsc` reports
32
+
TS2724/TS2305 at every import of a retired name.
33
+
34
+
**`packages/spec/docs/SYNC_ARCHITECTURE.md` is rewritten in the same change**, and
35
+
that is not incidental. It named `ETLPipeline` as the recommended destination for
36
+
authors displaced by the L1 retirement and tabulated ten transformation types with
37
+
copyable examples down to `script | Custom JavaScript/Python`. Retiring the schema
38
+
while the doc still recommended it would have been self-contradictory, and
39
+
forwarding L1's authors to a second layer with no executor was the defect compounding
40
+
rather than closing.
41
+
42
+
**Absorbed:** the #4962`etl-retry-converged-onto-retry-policy` entry (`retry.maxAttempts`
43
+
→ `maxRetries`, default 3 → 0) — both land in the unreleased protocol 17, so composed,
44
+
a rename on a shape that does not survive the major has no observable effect, and its
45
+
`retiredKey()` tombstone goes with the shape that carried it.
46
+
47
+
The retirement kit — route 3: no tombstone, no D2 conversion.
48
+
`RETIRED_DEFS_BY_MAJOR[17]` (9 defs) plus the D3 `SemanticMigration`
`ServerCapabilities` / `ServerCapabilitiesParsed` and `ServerStatusSchema` /
9
+
`ServerStatus` are REMOVED under ADR-0049 enforce-or-remove. This is the second and
10
+
final pass over the file: #4938 removed its CONFIG half (`HttpServerConfigSchema`,
11
+
nine keys, zero readers, zero authoring entry), and this removes the RUNTIME half —
12
+
a 7-member lifecycle event union, an eight-boolean capability report and a
13
+
five-state status record with connection and request counters. Nothing ever emitted,
14
+
consumed or parsed any of them.
15
+
16
+
FROM → TO:
17
+
18
+
| removed | what actually decides it |
19
+
|---|---|
20
+
|`ServerEventType` / `ServerEvent(Schema)`| nothing emits a server event feed. Lifecycle is the transport plugin's own start/stop seam; observability is `system/metrics.zod.ts` + `system/logging.zod.ts`, and `OS_SERVER_TIMING` for timings |
21
+
|`ServerCapabilities(Schema/Parsed)`| a transport plugin declares what it provides by implementing the kernel plugin contract — the seams it registers ARE the capability statement |
22
+
|`ServerStatus(Schema)`|`/health` for liveness, the metrics surface for counters |
23
+
24
+
**The fix:** delete the import. There is no replacement key, because there was
25
+
never a key — none of the four was authorable on any shape. Server-level
26
+
configuration that IS authorable is untouched: `defineStack({ server: { trustProxy,
27
+
security } })` / `StackServerConfigSchema` (#5006) parses exactly as it did in 16.x,
28
+
as does the route-registration half of the same module (`RouteHandlerMetadata`,
29
+
`MiddlewareType`, `MiddlewareConfig`).
30
+
31
+
**Why now, and what unblocked it.** The card was held rather than queued on a real
32
+
doubt: a response/capability vocabulary can legitimately be a REFERENCE surface for
33
+
host implementers, so "zero consumers in this repo" is weaker evidence for one of
34
+
those than for an authorable key. It was lifted by measuring the reference reader
35
+
itself — `plugin-hono-server`, the one in-tree host implementation, neither
36
+
implements nor reports any of the three: it names no capability record, no status
37
+
shape and no event union, and what it registers is routes and middleware. The
38
+
control passed in the same sweep (`MiddlewareConfig`, twelve lines away, resolves to
39
+
`packages/runtime/src/middleware.ts`).
40
+
41
+
The retirement kit — route 3 of the retirement playbook, as #4938 was in this same
42
+
file: **no `retiredKey()` tombstone and no D2 conversion**, because a prescription
43
+
nobody can receive is noise and there is no authored document to rewrite.
44
+
`RETIRED_DEFS_BY_MAJOR[17]` (4 defs) plus the D3 `SemanticMigration`
45
+
`http-server-runtime-vocabulary-retired` are the declaration; the generated
These five are **optional members of `ViewProtocol` that nothing implements and no
328
-
route reaches** — `view` is a metadata type, so view CRUD goes through the metadata
329
-
API (`/api/v1/meta`), not through them. Nothing anywhere registers the `ui` slot
330
-
either (#4093 / #4146), so `CORE_SERVICE_PROVIDER.ui` names
331
-
`@objectstack/metadata-protocol` rather than a `ui` plugin: the one route the `/ui`
332
-
domain serves is `GET /api/v1/ui/view/:object[/:type]`, which calls `getUiView` on
333
-
the **`protocol`** service that `assembleMetadataProtocol()` registers (invoked by
327
+
Nothing anywhere registers the `ui` slot (#4093 / #4146), so `CORE_SERVICE_PROVIDER.ui`
328
+
names `@objectstack/metadata-protocol` rather than a `ui` plugin: the one route the
329
+
`/ui` domain serves is `GET /api/v1/ui/view/:object[/:type]`, which calls `getUiView`
330
+
on the **`protocol`** service that `assembleMetadataProtocol()` registers (invoked by
334
331
`ObjectQLPlugin`, or by the standalone `createMetadataProtocolPlugin()`). Without it
335
332
the domain answers **501** with that remedy spelled out, not a generic "install a ui
336
333
plugin".
337
334
</Callout>
338
335
336
+
#### Retired in v17: `ViewProtocol`'s five methods
337
+
`listViews`, `getView`, `createView`, `updateView`, `deleteView` — and their ten
338
+
Request/Response schemas — were removed in
339
+
[#6239](https://github.com/objectstack-ai/objectstack/issues/6239) under ADR-0049
340
+
enforce-or-remove. This checklist had recorded them as declared-and-unrouted since it
341
+
was written; the removal makes that reading permanent instead of re-derivable. Views
342
+
are read and written through the surfaces that always served them: the metadata API
343
+
(`/api/v1/meta/view/:name`, `view` being a metadata type) for the stored definition,
344
+
and `getUiView` above for the resolved render-time view.
345
+
346
+
The concrete cost of leaving it declared is on the record: **#5948's issue body and its
347
+
2026-08-07 maintainer ruling both read `GetViewResponseSchema` — this retired block,
348
+
zero implementations — as the contract of `GET /ui/view/:object/:type`**, whose declared
349
+
response is `GetUiViewResponseSchema`. One word apart, and identical to a grep.
350
+
339
351
### Retired in v17: the `workflow` slot
340
352
The slot, its `IWorkflowService` contract and the three `WorkflowProtocol`
341
353
methods (`getWorkflowConfig`, `getWorkflowState`, `workflowTransition`) were
@@ -509,7 +521,7 @@ a package that cannot be installed is a dead end, which is why
509
521
510
522
| Slot | State |
511
523
|:-------|:------------|
512
-
|**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. |
524
+
|**ui**| Nothing registers the slot. `ViewProtocol`'s five declared-and-unrouted methods were **retired in v17** (#6239); view CRUD runs through `/api/v1/meta`, and `/api/v1/ui/view/:object` is served by the `protocol` service. |
513
525
|**search**| Nothing ships. Contract and engine enum exist in `@objectstack/spec` only. |
514
526
|**ai**| Nothing in this repo — `service-ai` (chat, completion, models, conversations) is Cloud/EE. |
515
527
|**realtime transport**| The service exists but no WebSocket/SSE route is mounted, so `routes.realtime` is deliberately never advertised. |
0 commit comments