Skip to content

Commit 39aa3f6

Browse files
refactor(spec)!: retire the ragPipelines collection listings no stack can declare (#31456)
<!-- claude-projects-attribution: {"github_login":"marchtian"} --> _Requested by **田騏** · [project thread](https://claude.ai/code/project/chan_01VmuUhXU9SSUzqJYyXSmYSi?thread=cmsg_01VmuUhXU9SSUzqJYyXSmYSiQQmi2TjBrbnC33qdD1Dhr1)_ Fixes #31380 Clause-②: no (narrowing) Metadata-protocol: narrowed Skills-docs: none — no skill or doc page names `ragPipelines` or `rag_pipeline` (`git grep` over `skills/` and `content/docs/` at the head: zero hits) ## 维护者速读 - **改了什么:** 把 `ragPipelines` 从四张登记表里撤掉(spec 的复数→单数映射、引擎的集合表、metadata 插件的产物映射、runtime 的应用载荷探针),连带撤掉门禁里给它开的四行豁免。`rag_pipeline` 因此退出 `/meta` 的 URL 拼写契约:会开新命名空间的写入改为被拒(400,和 theme 退役同形;部署的 sys_metadata 里已有 rag_pipeline 行时,写门的旧命名空间豁免仍接受写入,直到这些行删光),`/meta/types` 不再把它列为可创建。 - **为什么改:** `defineStack` 从来不接受 `ragPipelines`,任何作者都写不出这个集合,四张表却都把它当成一种元数据类型,读到这些表的人或 AI 会以为平台有「RAG 管道」集合。按分诊裁定「零拉动 ⇒ 退役」。 - **风险与回滚:** 唯一的外部可见变化是 `PUT /meta/rag_pipeline/...` 在没有旧行的部署上从「存任意 JSON」变成拒绝(已有旧行的部署按旧命名空间豁免继续接受,删光后才拒);objectstack、ui、hotcrm、gallery 里没有任何写入者,cloud 未测(座位落地前另核)。已存的旧行不改写,仍可读可删,但不再随包导出。回滚即 revert。 - **先看:** `packages/spec/src/meta-spelling/manifest-collection-spelling.ts`(删行本身);`packages/spec/src/migrations/entries/semantic/18.meta-type-rag-pipeline-retired.ts`(给升级者的说明);`packages/qa/dogfood/test/package-export-type-read-failure.dogfood.test.ts`(样本改法)。 - **两分钟验证:** `node scripts/check-stack-collection-maps.mjs`,预期 `8 enumerations reconciled … (16 waiver rows …)`,豁免里不再有 `ragPipelines`。 - **需要你做的:** 无,席位落地。 ## What changes `ragPipelines` was listed as a metadata collection in four registries while `ObjectStackDefinitionSchema` never declared the key, so `defineStack` refused it and no stack could ever ship one. This retires every listing (ADR-0049 enforce-or-remove, triage ruling 6717949516; seat ruling in the card thread to retire the URL-contract entry with it): - **`@objectstack/spec`** — the `ragPipelines: 'rag_pipeline'` row leaves `PLURAL_TO_SINGULAR` (so also `SINGULAR_TO_PLURAL` and the regenerated `META_URL_TO_SINGULAR`). `rag_pipeline` leaves the `/meta` URL-spelling contract exactly as `theme` did (commit 35ad101): `PUT /meta/rag_pipeline/:name` now gets the unrecognised-type refusal (`400 INVALID_REQUEST`) instead of the no-schema branch that stored any JSON — unless the deployment's `sys_metadata` already holds `rag_pipeline` rows, in which case the write door's legacy-namespace exemption keeps accepting writes until those rows are deleted — and `GET /meta/types` stops advertising it as creatable. Upgraders get the D3 semantic entry `meta-type-rag-pipeline-retired` plus a step-18 rationale fragment. No `retiredKey()` tombstone (the key is on no schema) and no D2 conversion (no stack source can hold it). - **`@objectstack/objectql`** — out of `METADATA_ARRAY_KEYS`. - **`@objectstack/metadata`** — out of `ARTIFACT_FIELD_TO_TYPE`. - **`@objectstack/runtime`** — out of the `APP_CATEGORY_KEYS` probe. - **`scripts/check-stack-collection-maps.mjs`** — the four `ragPipelines` waiver rows and the header note go; the gate now holds every map to the schema with no exception for it, which is the tree-wide guard against the row coming back (reverse-verified below). - **`ObjectStackDefinitionSchema`** — a `guidance` entry prescribes the never-declared `ragPipelines` key. - **Tests** — the specimens that used `rag_pipeline` move to a still-present kind and keep their intent: the no-static-entry write control in `objectql/protocol-meta.test.ts` is now `connector`; `rag_pipeline` joins `theme` on the refused/withdrawn side in `metadata-url-spelling.test.ts`, `protocol.unrecognised-meta-type.test.ts`, `protocol.meta-types-mint-door-agreement.test.ts` and a new `CHANGED BEHAVIOUR` case in `protocol-meta.test.ts`. - **Dogfood** — `package-export-type-read-failure` used `rag_pipeline` as the showcase's one exportable type its live vocabulary does not list. After this change no such type exists on the showcase (measured: every exportable plural folds to a listed type), so case 4 now drops `connector` from `getMetaTypes` for one leg beside the failed read, and asserts the real vocabulary does list it. ## Acceptance notes - **cloud producer census: NOT MEASURED** (repo not readable from this session). objectstack, `ui/`, hotcrm and gallery have no writer of `rag_pipeline`. The seat checks cloud before landing. - **Export door:** `GET /packages/:id/export` and `GET /packages/export` build their collections from `PLURAL_TO_SINGULAR`, so a legacy `rag_pipeline` row a deployment wrote through the old `/meta` door is no longer exported (it stays readable and deletable through `/meta`). A customization-pair install refuses an older export carrying a non-empty `ragPipelines` array, naming the key; an empty one is skipped. - **Stack prescription:** `ObjectStackDefinitionSchema`'s `guidance` now answers `ragPipelines` with a prescription instead of the generic unrecognized-key fallback (pinned in `stack-top-level-strict.test.ts`). - **Two edited metadata-protocol suites** gained the module-top `import '@objectstack/lint'` that `check:test-source-alias` asks of an edited test whose source reaches that dynamic import. - Out of bounds and unchanged: `docs/adr/0048-…` still says `rag_pipeline` "cannot be declared through `defineStack`", which stays true; CHANGELOGs are history. ## Verification All readings on head `0f4f7ccc` (the head after it only marks the changeset summary breaking) (branch merged with `origin/main` at `ae816c40b`; full `pnpm build` green after the merge). - **Unit suites** (`pnpm --filter PKG test` / `typecheck`, all exit 0): spec 822 files / 25980 tests; metadata-protocol 326 files / 22562 tests; objectql 569 / 11547; metadata 70 / 972; runtime 555 / 8957. Touched files: `eslint --no-inline-config` exit 0. - **Full dogfood battery** (`pnpm --filter @objectstack/dogfood test`, `(narrowing)` arm): exit 0 — Test Files 438 passed, 3 skipped (441); Tests 3622 passed, 41 skipped. - **Derived gates** (`node scripts/pm/dispatch-gates.mjs --commands`, 118 families, each `CMD :: exit N` recorded before any pipe): 117 exit 0; `node scripts/check-plugin-teardown-shape.mjs --self-test` exit 3 = NOT MEASURED (its positive control is a pinned commit a shallow clone cannot reach; CI runs it). `--ran` reconciliation: `118 derived famil(ies) accounted for — 117 run, 1 NOT-MEASURED`. - **The waiver-free gate**: `node scripts/check-stack-collection-maps.mjs` → `8 enumerations reconciled against 35 declared collections (16 waiver rows, each with a reason)`. Reverse verification: putting `'ragPipelines'` back into `APP_CATEGORY_KEYS` turns it red (`APP_CATEGORY_KEYS enumerates ragPipelines, which ObjectStackDefinitionSchema does not declare`), restored by byte copy. - **Before/after census** (`git grep -n -i 'ragPipelines\|rag_pipeline'` outside CHANGELOGs and `docs/adr`): before, live rows in four registries plus four gate waivers; after, only code comments, the tests that pin the refusal, the `LIVE_TYPES` fixture of the mint-door suite (a legacy live set, like `theme`), the stack `guidance` prescription and the migration entries. - **Fable review** (spec diff, independent agent): PASS, no must-fix; both should-fixes taken (the stack `guidance` prescription; the export-door consequence stated in the changeset and the semantic entry); incremental re-review PASS. 🤖 Generated with [Claude Code](https://claude.com/claude-code) <!-- signed: domain:spec#4 · marchtian · session_017ihL2eAG5J8aqAyPZif4BJ --> --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent c6c2426 commit 39aa3f6

26 files changed

Lines changed: 312 additions & 92 deletions
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
---
2+
'@objectstack/spec': minor
3+
'@objectstack/objectql': minor
4+
'@objectstack/metadata': minor
5+
'@objectstack/runtime': minor
6+
---
7+
8+
refactor(spec)!: retire the `ragPipelines` collection listings no stack can declare, and with them the `rag_pipeline` metadata type at the `/meta` door (#31380)
9+
10+
Clause-②: no (narrowing) — `PLURAL_TO_SINGULAR` (a published `@objectstack/spec` export, typed `Record<string, string>`) loses its `ragPipelines` row, so `/meta/rag_pipeline` leaves the URL-spelling contract and a write that would start the type's namespace is refused where it was stored before. Nothing is widened.
11+
Metadata-protocol: narrowed
12+
13+
<!-- adr-0087: registered meta-type-rag-pipeline-retired -->
14+
15+
**BREAKING** for a client that writes metadata under the type `rag_pipeline` through `PUT /meta/rag_pipeline/:name`, or that reads `PLURAL_TO_SINGULAR.ragPipelines` / `SINGULAR_TO_PLURAL.rag_pipeline`.
16+
17+
- **`@objectstack/spec`.** `ragPipelines` is removed from `PLURAL_TO_SINGULAR` (and so from `SINGULAR_TO_PLURAL` and the generated `META_URL_TO_SINGULAR`). The stack schema never declared the key, so `defineStack({ ragPipelines })` was refused before and still is, now with a prescription instead of the bare unrecognized-key message; no stack could ever ship one. Retiring the row takes `rag_pipeline` out of the `/meta` URL-spelling contract, as the `themes` row's retirement did for `theme`: the type now gets the unrecognised-type refusal (`400 INVALID_REQUEST`, "'rag_pipeline' is not a metadata type") at the write door instead of the no-schema branch that stored any JSON, and `GET /meta/types` no longer advertises it as creatable. The refusal is not unconditional: the write door keeps accepting a type whose namespace already exists in the deployment's `sys_metadata`, so a deployment that already holds `rag_pipeline` rows still has schema-less writes to that type accepted until those rows are deleted. The upgrade guide carries the semantic entry `meta-type-rag-pipeline-retired`. No ADR-0087 conversion: no stack source can hold the key, so `os migrate meta` has nothing to rewrite.
18+
- **`@objectstack/objectql`.** `ragPipelines` leaves the collections the engine registers from a manifest and from a nested plugin. A parsed stack never carried it; only a hand-built manifest handed straight to `registerApp` could, and its `ragPipelines` array is now ignored like any other undeclared key.
19+
- **`@objectstack/metadata`.** `ragPipelines` leaves the artifact field map; the strict stack parse already refused an artifact definition that carried it.
20+
- **`@objectstack/runtime`.** `ragPipelines` leaves the app-payload probe that decides whether a bundle with no app id was meant to register an app.
21+
- **Package export.** `GET /packages/:id/export` and `GET /packages/export` build their collections from `PLURAL_TO_SINGULAR`, so a `rag_pipeline` row a deployment wrote under a package through the old door is no longer exported. Such a row is not rewritten: `/meta` reads still answer and `DELETE /meta/rag_pipeline/:name` still works, so delete the residue rather than rely on an export to carry it. Deleting the last row also closes the namespace, after which a write to the type is refused there too. An older export carrying a non-empty `ragPipelines` array is refused by a customization-pair install, which names the key; an empty one is skipped as before.
22+
23+
**The remedy.** Delete any `ragPipelines` key from a stack source, artifact or hand-built manifest, and stop writing `/meta/rag_pipeline`; nothing replaces it. Retrieval sources are described by the knowledge-source schemas in `@objectstack/spec/ai` and indexed by the knowledge service a deployment installs, not by a stack collection.

‎packages/cli/test/lint-namespace-prefix.test.ts‎

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ describe('lint — every package-authored name carries the package namespace (ru
2828
// set by a floor and by the types the decision's audit named.
2929
expect(Object.keys(NAME_JUDGED_ELSEWHERE).sort()).toEqual(['docs', 'objects', 'views']);
3030
for (const reason of Object.values(NAME_JUDGED_ELSEWHERE)) expect(reason.length).toBeGreaterThan(20);
31-
expect(JUDGED.length).toBeGreaterThanOrEqual(28);
31+
// 27, not 28: #31380 retired `ragPipelines` from `PLURAL_TO_SINGULAR`.
32+
expect(JUDGED.length).toBeGreaterThanOrEqual(27);
3233
expect(JUDGED).toEqual(expect.arrayContaining([
3334
'apps', 'pages', 'dashboards', 'reports', 'datasets', 'actions', 'flows', 'jobs',
3435
'positions', 'permissions', 'capabilities', 'sharingRules', 'queues', 'assignmentRules',

‎packages/metadata-protocol/src/protocol-discovery-and-bases.ts‎

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -694,12 +694,13 @@ export class ProtocolDiscoveryAndBasesFacet {
694694
//
695695
// What this keeps, and it is the whole point: the legitimate
696696
// plugin kinds with no static registry entry — `webhook`,
697-
// `connector`, `analytics_cube`, `rag_pipeline` — are IN the static
698-
// spelling contract (limb 1 of the URL map), so the predicate
699-
// accepts them and they stay advertised as creatable. (`theme` and
700-
// `sharing_rule` were two more: `theme` left the contract with its
701-
// carrier, and ADR-0131 D6 gave `sharing_rule` a code-only registry
702-
// entry, so it takes the registry arm above.)
697+
// `connector`, `analytics_cube` — are IN the static spelling
698+
// contract (limb 1 of the URL map), so the predicate accepts them
699+
// and they stay advertised as creatable. (`theme`, `rag_pipeline`
700+
// and `sharing_rule` were three more: `theme` left the contract with
701+
// its carrier, `rag_pipeline` with its retired listing row — no
702+
// stack could declare it — and ADR-0131 D6 gave `sharing_rule` a
703+
// code-only registry entry, so it takes the registry arm above.)
703704
// `PUT /meta/theme/dark` is the operation the plugin path exists to
704705
// serve and this change must not touch it.
705706
//

‎packages/metadata-protocol/src/protocol.meta-types-mint-door-agreement.test.ts‎

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -38,13 +38,15 @@
3838
* 1. **statically declared** (`view`, `hook`, `agent`) — the flag comes off
3939
* the registry entry, as it always did, in both the `true` and the `false`
4040
* direction;
41-
* 2. **URL-map-only plugin kinds** (`webhook`, and its three siblings) — no
41+
* 2. **URL-map-only plugin kinds** (`webhook`, and its two siblings) — no
4242
* registry entry, IN the static spelling contract, still advertised and
4343
* still mintable. This is the discriminating control: without it the change
4444
* cannot show its narrowing is narrow;
4545
* 3. **withdrawn** (`policy`, `data`, `package`, `kind` — and, since commit 35ad101bc,
4646
* `theme`, whose carrier retired out of the spelling contract while legacy
47-
* stored rows can still hold the key live) — live `SchemaRegistry` keys,
47+
* stored rows can still hold the key live, and `rag_pipeline`, which left
48+
* the contract the same way when its listing row was retired) — live
49+
* `SchemaRegistry` keys,
4850
* in NEITHER half of the static contract, advertised `false` and refused.
4951
*
5052
* Harness: the real `getMetaTypes()` and the real `saveMetaItem()` on one
@@ -54,6 +56,11 @@
5456
* is where `data`, `kind` and `package` come from in production, and why the
5557
* listing must have an opinion about them at all.
5658
*/
59+
// `@objectstack/lint` is reached through the save door's author-time gate, a
60+
// dynamic `import()` (`metadata-diagnostics.ts`). Paid here, at collection, so no
61+
// case's `testTimeout` window pays that first load
62+
// (`scripts/check-test-source-alias.mjs`, "The source reach").
63+
import '@objectstack/lint';
5764
import { describe, expect, it } from 'vitest';
5865
// [#5619] The producer's OWN write-verb dispatch decisions, so the fake engine
5966
// below cannot accept a call ObjectQL itself refuses.
@@ -191,6 +198,17 @@ const SAMPLE: Array<{
191198
creatable: false,
192199
item: { name: 'probe_theme', label: 'Probe', colors: { primary: '#3b82f6' } },
193200
},
201+
{
202+
// `rag_pipeline` moved from class 2 to class 3 exactly as `theme` did: its
203+
// `ragPipelines` listing row retired out of the spelling contract (ADR-0049 —
204+
// no stack could declare the collection), while a legacy environment's
205+
// stored rows can still hold the key in the live set. Until then it was
206+
// class 2's one kind with no schema at all.
207+
type: 'rag_pipeline',
208+
klass: 'withdrawn',
209+
creatable: false,
210+
item: { name: 'probe_rag_pipeline', label: 'Probe' },
211+
},
194212
{ type: 'policy', klass: 'withdrawn', creatable: false, item: { name: 'probe_policy', label: 'Probe' } },
195213
{ type: 'data', klass: 'withdrawn', creatable: false, item: { name: 'probe_data', label: 'Probe' } },
196214
{ type: 'package', klass: 'withdrawn', creatable: false, item: { name: 'probe_package', label: 'Probe' } },
@@ -261,17 +279,18 @@ describe('#8421 — the read door and the mint door agree, across all three clas
261279
}
262280
});
263281

264-
it('the four URL-map-only plugin kinds are ALL still advertised as creatable', async () => {
282+
it('the three URL-map-only plugin kinds are ALL still advertised as creatable', async () => {
265283
// The blanket-flip guard, quantified rather than sampled. `webhook`
266284
// above is the one driven end-to-end through a write; the others have
267285
// no hand-written spec-valid body here, so they are pinned on the door
268286
// that this change actually moved — the advertisement. Breaking any of
269287
// them is the one outcome that would make this change worse than the
270-
// defect it closes. (`theme` left the set at commit 35ad101bc.)
288+
// defect it closes. (`theme` left the set at commit 35ad101bc, and
289+
// `rag_pipeline` when its listing row was retired.)
271290
const { protocol } = makeProtocol();
272291
const listing = await protocol.getMetaTypes();
273292
for (const kind of [
274-
'analytics_cube', 'connector', 'rag_pipeline', 'webhook',
293+
'analytics_cube', 'connector', 'webhook',
275294
]) {
276295
const entry = listing.entries.find((e: any) => e.type === kind);
277296
expect(entry, `${kind} must be listed`).toBeDefined();

‎packages/metadata-protocol/src/protocol.unrecognised-meta-type.test.ts‎

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,11 @@
5151
* `protocol.code-only-types.test.ts` uses. A gate INSIDE `saveMetaItem` cannot
5252
* be measured against a harness that mocks `saveMetaItem`.
5353
*/
54+
// `@objectstack/lint` is reached through the save door's author-time gate, a
55+
// dynamic `import()` (`metadata-diagnostics.ts`). Paid here, at collection, so no
56+
// case's `testTimeout` window pays that first load
57+
// (`scripts/check-test-source-alias.mjs`, "The source reach").
58+
import '@objectstack/lint';
5459
import { describe, expect, it } from 'vitest';
5560
// [#5619] The producer's OWN write-verb dispatch decisions, so the fake engine
5661
// below cannot accept a call ObjectQL itself refuses.
@@ -180,6 +185,18 @@ describe('#8421 — an unrecognised `/meta` type is refused instead of minted',
180185
expect(metaRows(rows).length).toBe(0);
181186
});
182187

188+
it('`rag_pipeline` is on the refused side too — its listing row was retired', async () => {
189+
// The same exit as `theme`: `rag_pipeline` was a URL-map-only kind with no
190+
// schema, so this door stored any JSON under it. Its `ragPipelines` fold
191+
// left `PLURAL_TO_SINGULAR` (ADR-0049 — no stack could declare the
192+
// collection), so it now earns the same refusal, and nothing is stored.
193+
const { protocol, rows } = makeProtocol();
194+
await expect(
195+
protocol.saveMetaItem({ type: 'rag_pipeline', name: 'my_pipeline', item: { name: 'my_pipeline', label: 'Test' } }),
196+
).rejects.toMatchObject({ code: 'INVALID_REQUEST', status: 400 });
197+
expect(metaRows(rows).length).toBe(0);
198+
});
199+
183200
it('names the offending type and why, per the 2026-08-12 refusal ruling', async () => {
184201
const { protocol } = makeProtocol();
185202
await expect(

‎packages/metadata/src/plugin.ts‎

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -194,7 +194,10 @@ const ARTIFACT_FIELD_TO_TYPE: Record<string, string> = {
194194
agents: 'agent',
195195
tools: 'tool',
196196
skills: 'skill',
197-
ragPipelines: 'rag_pipeline',
197+
// `ragPipelines: 'rag_pipeline'` removed (ADR-0049 enforce-or-remove), the
198+
// fourth retirement of the `policies` shape: the stack schema declares no
199+
// `ragPipelines` key, so the strict parse below refuses a definition that
200+
// carries one and this entry could never match.
198201
hooks: 'hook',
199202
mappings: 'mapping',
200203
// Shared option lists. Registered as items here so the artifact boot

‎packages/objectql/src/engine-nested-plugin-collections.test.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -174,7 +174,6 @@ describe('the two registration seams enumerate ONE collection list (#7049)', ()
174174
['roles', 'ADR-0090 retired'],
175175
['profiles', 'ADR-0088 retired'],
176176
['policies', 'ADR-0088 retired'],
177-
['ragPipelines', 'not declared by ObjectStackDefinitionSchema'],
178177
];
179178

180179
const excluded = new Set(NOT_COMPARABLE.map(([k]) => k));
@@ -224,8 +223,10 @@ describe('the two registration seams enumerate ONE collection list (#7049)', ()
224223
// `views` left this list in #7163 — the only entry that was ever excluded
225224
// for a BEHAVIOUR difference rather than a retired-kind one. Every survivor
226225
// is a kind the schema rejects before either seam runs.
226+
// `ragPipelines` left too: never declared by the stack schema, it was
227+
// retired from the engine's list itself (ADR-0049), not merely excluded here.
227228
expect(NOT_COMPARABLE.map(([k]) => k)).toEqual([
228-
'workflows', 'approvals', 'roles', 'profiles', 'policies', 'ragPipelines',
229+
'workflows', 'approvals', 'roles', 'profiles', 'policies',
229230
]);
230231
expect(NOT_COMPARABLE.map(([k]) => k)).not.toContain('views');
231232
});

‎packages/objectql/src/engine-top-level.ts‎

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4082,8 +4082,9 @@ const METADATA_ARRAY_KEYS = [
40824082
// queue service, the assignment seam), so a declaration must reach it with
40834083
// its package stamped, as every collection on this list does.
40844084
'queues', 'assignmentRules',
4085-
// AI Protocol
4086-
'agents', 'tools', 'skills', 'ragPipelines',
4085+
// AI Protocol. (`ragPipelines` was retired from this list under ADR-0049:
4086+
// the stack schema never declared it, so no stack could ship one.)
4087+
'agents', 'tools', 'skills',
40874088
// API Protocol
40884089
'apis',
40894090
// Data Extensions

‎packages/objectql/src/manifest-service-residual-objects.test.ts‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -446,7 +446,7 @@ describe('ADR-0130 D4 — the manifest service registers every other residual ty
446446
apps: 'app', pages: 'page', dashboards: 'dashboard', reports: 'report', actions: 'action',
447447
workflows: 'workflow', positions: 'position', permissions: 'permission', capabilities: 'capability',
448448
sharingRules: 'sharing_rule', apis: 'api', webhooks: 'webhook', agents: 'agent', tools: 'tool',
449-
skills: 'skill', ragPipelines: 'rag_pipeline', hooks: 'hook', mappings: 'mapping',
449+
skills: 'skill', hooks: 'hook', mappings: 'mapping',
450450
analyticsCubes: 'analytics_cube', emailTemplates: 'email_template', docs: 'doc', books: 'book',
451451
};
452452
const itemOf = (type: string) => ({ name: `acme_top_${type}`, label: `Top ${type}` });

‎packages/objectql/src/metadata-validation-sweep.test.ts‎

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,11 @@
1515
* (#19586) the refusal must be the SCHEMA's, naming the broken field —
1616
* never an author-time gate rule, which throws the same envelope.
1717
*
18-
* Types without a Zod schema in the central registry (today only
19-
* `rag_pipeline` among the URL-map kinds — `theme`/`webhook` and their
20-
* siblings all resolve schemas via `UNREGISTERED_KIND_SCHEMAS` since
21-
* #6245 / commit 2306a765c) are still expected to pass through unvalidated — that is
18+
* Types without a Zod schema in the central registry (none among the URL-map
19+
* kinds today — `webhook` and its siblings all resolve schemas via
20+
* `UNREGISTERED_KIND_SCHEMAS` since #6245 / commit 2306a765c, and `rag_pipeline`,
21+
* the last schema-less one, left the URL-spelling contract when its listing row
22+
* was retired) are still expected to pass through unvalidated — that is
2223
* the documented fall-through, not a regression. We pin it explicitly so any
2324
* future coverage gap is visible in the report.
2425
*

0 commit comments

Comments
 (0)