From 3f7f989e3e2514222e1ec46bb77770e04e39037c Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 7 Sep 2026 08:02:57 +0000 Subject: [PATCH 1/3] fix(spec): emit one api-surface row per declared kind TypeScript merges `export const X` and `export type X` into one symbol carrying both flags. `build-api-surface.ts` mapped that symbol through a first-match-wins `kindOf` that tested TypeAlias before Variable, so the shard recorded `X (type)` alone and the value half was never enumerated. Deleting `export const X` therefore left the shard byte-identical and `check:api-surface` green on a removed public value export. `kindsOf` now returns every kind the flags declare, and `buildSurface` emits one row per kind. The row grammar `Name (kind)` is unchanged; only completeness moves. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01T6HeZvT9wdSJD1ZxJb5Eno --- .../api-surface-dual-kind-rows.pin.test.ts | 123 ++++++++++++++++++ packages/spec/scripts/build-api-surface.ts | 47 +++++-- .../spec/scripts/docs-import-surface.test.ts | 42 +++++- .../spec/scripts/lib/docs-import-surface.ts | 28 ++-- 4 files changed, 211 insertions(+), 29 deletions(-) create mode 100644 packages/spec/scripts/api-surface-dual-kind-rows.pin.test.ts diff --git a/packages/spec/scripts/api-surface-dual-kind-rows.pin.test.ts b/packages/spec/scripts/api-surface-dual-kind-rows.pin.test.ts new file mode 100644 index 0000000000..3b34f4b69b --- /dev/null +++ b/packages/spec/scripts/api-surface-dual-kind-rows.pin.test.ts @@ -0,0 +1,123 @@ +// Copyright (c) 2026 ObjectStack. Licensed under the Apache-2.0 license. + +/** + * Dual-kind row pin (#15919) — the committed `api-surface/` shards must record + * BOTH halves of a name that is declared as a const and as a type. + * + * ## What went wrong, and why the gate could not see it + * + * TypeScript merges `export const X` and `export type X` into ONE symbol whose + * flags carry both. `build-api-surface.ts` used to map that symbol through a + * first-match-wins `kindOf` that tested `TypeAlias` before `Variable`, so the + * shard recorded `X (type)` and nothing else — the value half was never + * enumerated. Ablated on `origin/main`: deleting `export const + * RestApiRouteRegistration` while keeping `export type RestApiRouteRegistration` + * left all 17 shards byte-identical, the export total unmoved and + * `check:api-surface` printing "public API surface + factory signatures + * unchanged" at exit 0 — on a removed public value export, which is the exact + * removal ADR-0059's breadth gate exists to make loud. + * + * ## Why this pin exists ON TOP of `check:api-surface` + * + * `check:api-surface` compares the generator against its own committed output, + * so it cannot notice the generator becoming less complete: revert + * `kindsOf` and regenerate, and the gate is green again on a surface that has + * silently dropped 130-odd value exports. This pin reads the COMMITTED shards + * and asserts the property directly, so that regression is loud even when the + * baseline is regenerated in the same commit. + * + * ## The controls + * + * A pin that only asserted "some name carries two kinds" would also pass on a + * generator that stamped every kind onto every name. So the negative controls + * are asserted in the same run and out of the same parse: const-only names and + * type-only names must both still exist. Together with the non-empty aggregate, + * a silently emptied or uniformly-stamped surface fails here rather than + * reading as agreement. + */ +import path from 'node:path'; +import { fileURLToPath } from 'node:url'; + +import { describe, expect, it } from 'vitest'; + +import { aggregateApiSurfaceShards, API_SURFACE_DIR_NAME } from './lib/sharded-artifacts'; + +const HERE = path.dirname(fileURLToPath(import.meta.url)); +const SURFACE_DIR = path.resolve(HERE, '..', API_SURFACE_DIR_NAME); + +const ROW = /^(\S+) \((\w+)\)$/; + +const read = aggregateApiSurfaceShards(SURFACE_DIR); +if (!read) throw new Error(`no api-surface shards at ${SURFACE_DIR}`); +const SURFACE: Record = read.surface; + +/** `entry -> name -> kinds`, parsed out of the committed shards. */ +function readKinds(): { byEntry: Map>>; rows: number } { + const byEntry = new Map>>(); + let rows = 0; + for (const [entry, names] of Object.entries(SURFACE)) { + const kinds = new Map>(); + for (const row of names) { + const m = ROW.exec(row); + if (!m) throw new Error(`cannot parse row "${row}" under "${entry}"`); + rows++; + let set = kinds.get(m[1]); + if (!set) kinds.set(m[1], (set = new Set())); + set.add(m[2]); + } + byEntry.set(entry, kinds); + } + return { byEntry, rows }; +} + +const { byEntry, rows } = readKinds(); + +/** Every name in the artifact, collapsed across entry points. */ +const allNames = [...byEntry.values()].flatMap((kinds) => [...kinds.entries()]); + +describe('api-surface records one row per declared kind (#15919)', () => { + it('parsed a non-empty artifact — the control that makes every assertion below a reading', () => { + // Without this, an empty or unreadable `api-surface/` would satisfy every + // "no name is wrong" assertion vacuously. + expect(byEntry.size).toBeGreaterThan(10); + expect(rows).toBeGreaterThan(1000); + }); + + it('records both halves of `EpochMs`, the worked example from the card', () => { + // `packages/spec/src/shared/epoch.zod.ts` declares the name twice: + // export const EpochMs = z.number().int()… + // export type EpochMs = z.input + // Before #15919 `./shared` carried `EpochMs (type)` alone. + const shared = byEntry.get('./shared'); + expect(shared, 'the ./shared entry point must exist').toBeDefined(); + expect(shared!.get('EpochMs')).toEqual(new Set(['const', 'type'])); + }); + + it('carries a real population of dual-declared names, not one special case', () => { + const dual = allNames.filter(([, kinds]) => kinds.has('const') && kinds.has('type')); + // Measured at 134 (name, entry) pairs over 10 entry points when the repair + // landed. Asserted as a floor, not an equality: this family grows with + // every new `z.enum` idiom in the spec, and a pin that reddened on ordinary + // growth would be edited away rather than believed. + expect(dual.length).toBeGreaterThanOrEqual(100); + }); + + it('NEGATIVE CONTROL: does not stamp every kind onto every name', () => { + // If the emitter had gone from "first match wins" to "everything always", + // these two buckets would be empty and the assertion above would pass on a + // meaningless artifact. + const constOnly = allNames.filter(([, k]) => k.size === 1 && k.has('const')); + const typeOnly = allNames.filter(([, k]) => k.size === 1 && k.has('type')); + expect(constOnly.length).toBeGreaterThan(0); + expect(typeOnly.length).toBeGreaterThan(0); + }); + + it('never records the same name twice under one kind in one entry point', () => { + // The row grammar is unchanged by #15919: rows are still `Name (kind)` and + // a (name, kind) pair is still unique per entry. Two rows for one name are + // two DIFFERENT kinds, never a duplicate. + for (const [entry, names] of Object.entries(SURFACE)) { + expect(new Set(names).size, `${entry} has duplicate rows`).toBe(names.length); + } + }); +}); diff --git a/packages/spec/scripts/build-api-surface.ts b/packages/spec/scripts/build-api-surface.ts index e7e3d11582..6f94596274 100644 --- a/packages/spec/scripts/build-api-surface.ts +++ b/packages/spec/scripts/build-api-surface.ts @@ -10,9 +10,12 @@ * with the spec in the same commit. See ADR-0059. * * Two committed artifacts, both checked in CI: - * - api-surface/.json — every exported `name (kind)` for ONE public - * entry point (breadth: did an export - * disappear?). One file per entry point since + * - api-surface/.json — one `name (kind)` row per DECLARED KIND of + * every export of ONE public entry point + * (breadth: did an export disappear?). A + * name declared as both a const and a type + * is two rows, so either half can go missing + * loudly. One file per entry point since * #5837, so two PRs that touch different entry * points do not collide in the merge queue — * which is where `merge=os-regen` cannot help, @@ -97,15 +100,31 @@ function collectEntries(): Record { return entries; } -function kindOf(flags: ts.SymbolFlags): string { - if (flags & ts.SymbolFlags.Function) return 'function'; - if (flags & ts.SymbolFlags.Class) return 'class'; - if (flags & ts.SymbolFlags.Enum) return 'enum'; - if (flags & ts.SymbolFlags.Interface) return 'interface'; - if (flags & ts.SymbolFlags.TypeAlias) return 'type'; - if (flags & ts.SymbolFlags.Variable) return 'const'; - if (flags & ts.SymbolFlags.Namespace) return 'namespace'; - return 'other'; +/** + * EVERY kind the symbol's flags declare, not just the first one that matches. + * + * TypeScript merges an `export const X` and an `export type X` into ONE symbol + * whose flags carry BOTH. A first-match-wins lookup therefore reported the + * merged name as `type` alone and never enumerated the value half, so deleting + * `export const X` left `X (type)` byte-identical in the shard and this gate + * green on a removed public value export — the exact removal it exists to make + * loud (#15919, ablated). One row per declared kind fixes that without touching + * the row grammar: `Name (kind)` is unchanged, only completeness moves, and the + * two halves become independently removable. + * + * Order is preserved from the old lookup so the shards stay stable, and `other` + * remains the answer for a symbol matching no branch — never an empty row set. + */ +function kindsOf(flags: ts.SymbolFlags): string[] { + const kinds: string[] = []; + if (flags & ts.SymbolFlags.Function) kinds.push('function'); + if (flags & ts.SymbolFlags.Class) kinds.push('class'); + if (flags & ts.SymbolFlags.Enum) kinds.push('enum'); + if (flags & ts.SymbolFlags.Interface) kinds.push('interface'); + if (flags & ts.SymbolFlags.TypeAlias) kinds.push('type'); + if (flags & ts.SymbolFlags.Variable) kinds.push('const'); + if (flags & ts.SymbolFlags.Namespace) kinds.push('namespace'); + return kinds.length > 0 ? kinds : ['other']; } const entries = collectEntries(); @@ -132,8 +151,10 @@ function buildSurface(): Record { const surface: Record = {}; for (const [sub, file] of Object.entries(entries)) { surface[sub] = moduleExports(file, sub) - .map((s) => `${s.getName()} (${kindOf(unalias(s).getFlags())})`) + .flatMap((s) => kindsOf(unalias(s).getFlags()).map((kind) => `${s.getName()} (${kind})`)) // Code-unit sort (NOT localeCompare): deterministic across CI platforms. + // A dual-declared name's rows land adjacent under it, `(const)` before + // `(type)`, so this repair reads as a pure insertion in the shards. .sort(); } return surface; diff --git a/packages/spec/scripts/docs-import-surface.test.ts b/packages/spec/scripts/docs-import-surface.test.ts index c02c443c65..3e554274c7 100644 --- a/packages/spec/scripts/docs-import-surface.test.ts +++ b/packages/spec/scripts/docs-import-surface.test.ts @@ -36,12 +36,15 @@ const BASELINE_PATH = path.join(SPEC_DIR, 'docs-import-surface.baseline.json'); * Widget — `export const WidgetSchema` + `export type Widget` (healthy) * Gadget — `export const GadgetSchema`, NO type alias (#4570) * Flavor — `export const Flavor = z.enum(…)` + `export type Flavor` - * (merged declaration; api-surface reports `type` only) + * (merged declaration; since #15919 api-surface records BOTH + * `Flavor (const)` and `Flavor (type)`, one row per declared + * kind — before it, the value half was never enumerated) * Ghost — documented by a page, exported by nothing */ const API_SURFACE = { '.': ['defineStack (function)'], './demo': [ + 'Flavor (const)', 'Flavor (type)', 'GadgetSchema (const)', 'Widget (type)', @@ -70,8 +73,10 @@ describe('resolveValueName', () => { }); it('falls back to the bare name for a merged const+type declaration', () => { - // api-surface reports `Flavor (type)` — kindOf tests TypeAlias before - // Variable — so value-ness cannot be read off the kind. Presence can. + // There is no `FlavorSchema`, so the bare-name candidate is what resolves. + // This resolver asks only whether the name is exported — presence, never + // the kind — which is why it was already correct while api-surface still + // recorded `Flavor (type)` alone (before #15919). expect(resolveValueName('Flavor', demo)).toBe('Flavor'); }); @@ -89,6 +94,37 @@ describe('resolveTypeName', () => { expect(resolveTypeName('GadgetSchema', demo)).toBeNull(); expect(resolveTypeName('Gadget', demo)).toBeNull(); }); + + // #15919: `build-api-surface.ts` now emits one row per DECLARED kind, so a + // merged const+type name arrives as TWO rows instead of one. This asserts the + // property that made two rows the right encoding: `loadEntrySurfaces` already + // models a name as a SET of kinds, so the extra `(const)` row joins the set + // and BOTH resolvers answer exactly what they answered before. The + // alternative encoding — a single combined `Flavor (const, type)` row — + // cannot do that, and the two cases below are why. + it('is unmoved by the extra `(const)` row of a dual-declared name', () => { + const oneRow = loadEntrySurfaces({ './demo': ['Flavor (type)'] }).get('demo')!; + const twoRows = loadEntrySurfaces({ './demo': ['Flavor (const)', 'Flavor (type)'] }).get('demo')!; + + expect(twoRows.get('Flavor')).toEqual(new Set(['const', 'type'])); + expect(resolveTypeName('Flavor', twoRows)).toBe(resolveTypeName('Flavor', oneRow)); + expect(resolveTypeName('Flavor', twoRows)).toBe('Flavor'); + expect(resolveValueName('Flavor', twoRows)).toBe(resolveValueName('Flavor', oneRow)); + }); + + it('would have thrown on a combined kind, and lied after widening the parser', () => { + // Leg 1 — the parser refuses it outright, which is the loud half. + expect(() => loadEntrySurfaces({ './demo': ['Flavor (const, type)'] })).toThrow( + /cannot parse entry/, + ); + // Leg 2 — the silent half, and the reason a combined kind stays rejected: + // widen the parser to admit it and the string `const, type` is in no + // TYPE_KINDS set, so `import type { Flavor }` vanishes from the page with + // no error anywhere. Simulated here by a kind spelled as one token, which + // is what any widened parser would hand the resolver. + const combined = loadEntrySurfaces({ './demo': ['Flavor (const_type)'] }).get('demo')!; + expect(resolveTypeName('Flavor', combined)).toBeNull(); + }); }); describe('resolveImports', () => { diff --git a/packages/spec/scripts/lib/docs-import-surface.ts b/packages/spec/scripts/lib/docs-import-surface.ts index d4bdfad8f4..b3fa2afe27 100644 --- a/packages/spec/scripts/lib/docs-import-surface.ts +++ b/packages/spec/scripts/lib/docs-import-surface.ts @@ -24,19 +24,21 @@ * `api-surface/` records `name (kind)` for every public entry point, so it * answers both questions directly. Two asymmetries drive the rules below: * - * - **Type side is decidable.** `build-api-surface.ts`'s `kindOf` tests - * TypeAlias/Interface BEFORE Variable, so a name that carries a type is - * never reported as `const`. A `type`/`interface`/`class`/`enum` kind - * therefore PROVES `import type { N }` resolves, and `const` proves it does - * not. - * - **Value side is not.** The same ordering hides the value half of a merged - * declaration: `export const FieldType = z.enum(…)` plus - * `export type FieldType = …` is reported as `type` only. So value-ness - * cannot be read off the kind, and PRESENCE is the strongest sound signal. - * That is enough here, because `build-schemas.ts` derives a JSON Schema's - * name from an actual runtime export key of that same entry by stripping a - * `Schema` suffix — so the const behind schema `N` is `NSchema` or `N`, and - * whichever of the two the entry exports is it. + * - **Type side is decidable.** `build-api-surface.ts` emits one row per + * DECLARED kind, so every kind a name carries is in its set here. A + * `type`/`interface`/`class`/`enum` kind in that set PROVES + * `import type { N }` resolves, and a set without one proves it does not. + * - **Value side is read by PRESENCE, deliberately.** Until #15919 it had to + * be: a first-match-wins `kindOf` reported a merged + * `export const FieldType = z.enum(…)` + `export type FieldType = …` as + * `type` alone, so value-ness could not be read off the kind at all. That is + * fixed — such a name now records BOTH `FieldType (const)` and + * `FieldType (type)` — but this resolver still asks only whether the name is + * exported, because presence is sound for every shape and needs no kind list + * to maintain. It is enough here, because `build-schemas.ts` derives a JSON + * Schema's name from an actual runtime export key of that same entry by + * stripping a `Schema` suffix — so the const behind schema `N` is `NSchema` + * or `N`, and whichever of the two the entry exports is it. * * A name that resolves to nothing is not emitted (the docs stop advertising a * dead import) AND is reported as a gap, so the omission is loud rather than From 5b454fac063faf5f9e37eb9e4b5747eaf3c7c7ee Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 7 Sep 2026 08:06:42 +0000 Subject: [PATCH 2/3] chore(spec): regenerate api-surface with the const half of dual declarations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Mechanical `gen:api-surface` output. +134 rows over 10 of 17 entry points, every one of them the previously-unenumerated `(const)` half of a name that also declares a type. Pure insertion: 0 rows removed, 0 modified, no reordering — the code-unit sort places `Name (const)` immediately before its existing `Name (type)`. Export total 5277 -> 5411; api-surface-signatures.json unchanged. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01T6HeZvT9wdSJD1ZxJb5Eno --- packages/spec/api-surface/api.json | 48 +++++++++++++++++++++++ packages/spec/api-surface/automation.json | 6 +++ packages/spec/api-surface/data.json | 13 ++++++ packages/spec/api-surface/identity.json | 1 + packages/spec/api-surface/kernel.json | 4 ++ packages/spec/api-surface/root.json | 1 + packages/spec/api-surface/security.json | 5 +++ packages/spec/api-surface/shared.json | 3 ++ packages/spec/api-surface/system.json | 39 ++++++++++++++++++ packages/spec/api-surface/ui.json | 14 +++++++ 10 files changed, 134 insertions(+) diff --git a/packages/spec/api-surface/api.json b/packages/spec/api-surface/api.json index 9319ef1d27..45eb3a35cd 100644 --- a/packages/spec/api-surface/api.json +++ b/packages/spec/api-surface/api.json @@ -30,6 +30,7 @@ "AiPendingActionStatusSchema (const)", "AiStreamChunk (type)", "AiStreamChunkSchema (const)", + "AnalyticsEndpoint (const)", "AnalyticsEndpoint (type)", "AnalyticsMetadataResponse (type)", "AnalyticsMetadataResponseParsed (type)", @@ -46,9 +47,11 @@ "ApiChangelogEntry (type)", "ApiChangelogEntryParsed (type)", "ApiChangelogEntrySchema (const)", + "ApiDocumentationConfig (const)", "ApiDocumentationConfig (type)", "ApiDocumentationConfigParsed (type)", "ApiDocumentationConfigSchema (const)", + "ApiEndpoint (const)", "ApiEndpoint (type)", "ApiEndpointParsed (type)", "ApiEndpointSchema (const)", @@ -59,6 +62,7 @@ "ApiMappingSchema (const)", "ApiRoutes (type)", "ApiRoutesSchema (const)", + "ApiTestCollection (const)", "ApiTestCollection (type)", "ApiTestCollectionParsed (type)", "ApiTestCollectionSchema (const)", @@ -68,6 +72,7 @@ "ApiTestingUiConfig (type)", "ApiTestingUiConfigParsed (type)", "ApiTestingUiConfigSchema (const)", + "ApiTestingUiType (const)", "ApiTestingUiType (type)", "AppDefinitionResponse (type)", "AppDefinitionResponseParsed (type)", @@ -87,6 +92,7 @@ "AuthFeaturesConfig (type)", "AuthFeaturesConfigParsed (type)", "AuthFeaturesConfigSchema (const)", + "AuthProvider (const)", "AuthProvider (type)", "AuthProviderInfo (type)", "AuthProviderInfoParsed (type)", @@ -95,6 +101,7 @@ "AutomationActionsResponseParsed (type)", "AutomationActionsResponseSchema (const)", "AutomationApiContracts (const)", + "AutomationApiErrorCode (const)", "AutomationApiErrorCode (type)", "AutomationFlowPathParams (type)", "AutomationFlowPathParamsSchema (const)", @@ -129,6 +136,7 @@ "BatchOperationResult (type)", "BatchOperationResultParsed (type)", "BatchOperationResultSchema (const)", + "BatchOperationType (const)", "BatchOperationType (type)", "BatchOptions (type)", "BatchOptionsParsed (type)", @@ -143,6 +151,7 @@ "BatchUpdateResponseSchema (const)", "BulkDataEvent (type)", "BulkDataEventSchema (const)", + "BulkDataEventType (const)", "BulkDataEventType (type)", "BulkRequest (type)", "BulkRequestParsed (type)", @@ -153,12 +162,14 @@ "CHANNEL_SURFACE_SLOTS (const)", "CacheControl (type)", "CacheControlSchema (const)", + "CacheDirective (const)", "CacheDirective (type)", "CacheInvalidationRequest (type)", "CacheInvalidationRequestParsed (type)", "CacheInvalidationRequestSchema (const)", "CacheInvalidationResponse (type)", "CacheInvalidationResponseSchema (const)", + "CacheInvalidationTarget (const)", "CacheInvalidationTarget (type)", "CapabilityDescriptor (type)", "CapabilityDescriptorSchema (const)", @@ -180,6 +191,7 @@ "ConceptListResponse (type)", "ConceptListResponseParsed (type)", "ConceptListResponseSchema (const)", + "ConflictResolutionStrategy (const)", "ConflictResolutionStrategy (type)", "CreateAiConversationRequest (type)", "CreateAiConversationRequestSchema (const)", @@ -223,6 +235,7 @@ "CrudEndpointsConfig (type)", "CrudEndpointsConfigParsed (type)", "CrudEndpointsConfigSchema (const)", + "CrudOperation (const)", "CrudOperation (type)", "CursorMessage (type)", "CursorMessageSchema (const)", @@ -239,11 +252,13 @@ "DEFAULT_VERSIONING_CONFIG (const)", "DataEvent (type)", "DataEventSchema (const)", + "DataEventType (const)", "DataEventType (type)", "DataLoaderConfig (type)", "DataLoaderConfigParsed (type)", "DataLoaderConfigSchema (const)", "DataProtocol (interface)", + "DeduplicationStrategy (const)", "DeduplicationStrategy (type)", "DeleteDataRequest (type)", "DeleteDataRequestSchema (const)", @@ -292,6 +307,7 @@ "DispatcherConfig (type)", "DispatcherConfigParsed (type)", "DispatcherConfigSchema (const)", + "DispatcherErrorCode (const)", "DispatcherErrorCode (type)", "DispatcherErrorResponse (type)", "DispatcherErrorResponseSchema (const)", @@ -311,6 +327,7 @@ "EditMessageSchema (const)", "EditOperation (type)", "EditOperationSchema (const)", + "EditOperationType (const)", "EditOperationType (type)", "EmailPasswordConfigPublic (type)", "EmailPasswordConfigPublicSchema (const)", @@ -327,7 +344,9 @@ "EnhancedApiError (type)", "EnhancedApiErrorParsed (type)", "EnhancedApiErrorSchema (const)", + "ErrorCategory (const)", "ErrorCategory (type)", + "ErrorCode (const)", "ErrorCode (type)", "ErrorHandlingConfig (type)", "ErrorHandlingConfigParsed (type)", @@ -345,6 +364,7 @@ "EventSubscription (type)", "EventSubscriptionSchema (const)", "ExportApiContracts (const)", + "ExportFormat (const)", "ExportFormat (type)", "ExportImportTemplate (type)", "ExportImportTemplateParsed (type)", @@ -352,6 +372,7 @@ "ExportJobProgress (type)", "ExportJobProgressParsed (type)", "ExportJobProgressSchema (const)", + "ExportJobStatus (const)", "ExportJobStatus (type)", "ExportJobSummary (type)", "ExportJobSummarySchema (const)", @@ -361,6 +382,7 @@ "FIELD_SORTABLE_UNPROVISIONED_ANCHOR (const)", "FIELD_UNSORTABLE_VIRTUAL_TYPE (const)", "FieldError (type)", + "FieldErrorCode (const)", "FieldErrorCode (type)", "FieldErrorSchema (const)", "FieldMappingEntry (type)", @@ -499,6 +521,7 @@ "HistoryMetaItemResponse (type)", "HistoryMetaItemResponseSchema (const)", "HttpFindQueryParamsSchema (const)", + "HttpMethod (const)", "HttpMethod (type)", "HttpStatusErrorCodeMap (const)", "I18nProtocol (interface)", @@ -510,6 +533,7 @@ "ImportJobProgressSchema (const)", "ImportJobResults (type)", "ImportJobResultsSchema (const)", + "ImportJobStatus (const)", "ImportJobStatus (type)", "ImportJobSummary (type)", "ImportJobSummarySchema (const)", @@ -526,10 +550,12 @@ "ImportValidationConfig (type)", "ImportValidationConfigParsed (type)", "ImportValidationConfigSchema (const)", + "ImportValidationMode (const)", "ImportValidationMode (type)", "ImportValidationResult (type)", "ImportValidationResultParsed (type)", "ImportValidationResultSchema (const)", + "ImportWriteMode (const)", "ImportWriteMode (type)", "InitiateChunkedUploadRequest (type)", "InitiateChunkedUploadRequestParsed (type)", @@ -601,6 +627,7 @@ "LoginRequest (type)", "LoginRequestParsed (type)", "LoginRequestSchema (const)", + "LoginType (const)", "LoginType (type)", "MarkAllNotificationsReadRequest (type)", "MarkAllNotificationsReadRequestSchema (const)", @@ -639,6 +666,7 @@ "MetadataEvent (type)", "MetadataEventSchema (const)", "MetadataEventSubject (type)", + "MetadataEventType (const)", "MetadataEventType (type)", "MetadataExistsResponse (type)", "MetadataExistsResponseParsed (type)", @@ -718,6 +746,7 @@ "OpenApiSecuritySchemeSchema (const)", "OpenApiServer (type)", "OpenApiServerSchema (const)", + "OpenApiSpec (const)", "OpenApiSpec (type)", "OpenApiSpecParsed (type)", "OpenApiSpecSchema (const)", @@ -725,6 +754,7 @@ "OperatorMappingSchema (const)", "PROVENANCE_WAIVERS (const)", "PackageApiContracts (const)", + "PackageApiErrorCode (const)", "PackageApiErrorCode (type)", "PackageExportManifest (type)", "PackageExportManifestParsed (type)", @@ -759,6 +789,7 @@ "PresenceMessageSchema (const)", "PresenceState (type)", "PresenceStateSchema (const)", + "PresenceStatus (const)", "PresenceStatus (type)", "PresenceUpdate (type)", "PresenceUpdateSchema (const)", @@ -798,10 +829,12 @@ "RealtimeDisconnectResponseSchema (const)", "RealtimeEvent (type)", "RealtimeEventSchema (const)", + "RealtimeEventType (const)", "RealtimeEventType (type)", "RealtimePresence (type)", "RealtimePresenceSchema (const)", "RealtimeProtocol (interface)", + "RealtimeRecordAction (const)", "RealtimeRecordAction (type)", "RealtimeSubscribeRequest (type)", "RealtimeSubscribeRequestSchema (const)", @@ -845,25 +878,31 @@ "ResponseEnvelopeConfig (type)", "ResponseEnvelopeConfigParsed (type)", "ResponseEnvelopeConfigSchema (const)", + "RestApiConfig (const)", "RestApiConfig (type)", "RestApiConfigParsed (type)", "RestApiConfigSchema (const)", "RestApiEndpoint (type)", "RestApiEndpointParsed (type)", "RestApiEndpointSchema (const)", + "RestApiPluginConfig (const)", "RestApiPluginConfig (type)", "RestApiPluginConfigParsed (type)", "RestApiPluginConfigSchema (const)", + "RestApiRouteCategory (const)", "RestApiRouteCategory (type)", + "RestApiRouteRegistration (const)", "RestApiRouteRegistration (type)", "RestApiRouteRegistrationParsed (type)", "RestApiRouteRegistrationSchema (const)", "RestQueryAdapter (type)", "RestQueryAdapterParsed (type)", "RestQueryAdapterSchema (const)", + "RestServerConfig (const)", "RestServerConfig (type)", "RestServerConfigParsed (type)", "RestServerConfigSchema (const)", + "RetryStrategy (const)", "RetryStrategy (type)", "RevertPackageCommitResponse (type)", "RevertPackageCommitResponseParsed (type)", @@ -874,6 +913,7 @@ "RollbackToPackageCommitResponse (type)", "RollbackToPackageCommitResponseParsed (type)", "RollbackToPackageCommitResponseSchema (const)", + "RouteCategory (const)", "RouteCategory (type)", "RouteDefinition (type)", "RouteDefinitionParsed (type)", @@ -915,6 +955,7 @@ "ServiceInfoSchema (const)", "ServiceSelfInfo (type)", "ServiceSelfInfoSchema (const)", + "ServiceStatus (const)", "ServiceStatus (type)", "Session (type)", "SessionResponse (type)", @@ -936,6 +977,7 @@ "SingleRecordResponseParsed (type)", "SingleRecordResponseSchema (const)", "StandardApiContracts (const)", + "StandardErrorCode (const)", "StandardErrorCode (type)", "StandardSynonymViolation (interface)", "StandardSynonymWaiver (type)", @@ -952,6 +994,7 @@ "ToggleFlowResponse (type)", "ToggleFlowResponseParsed (type)", "ToggleFlowResponseSchema (const)", + "TransportProtocol (const)", "TransportProtocol (type)", "TriggerFlowRequest (type)", "TriggerFlowRequestSchema (const)", @@ -1031,15 +1074,18 @@ "ValidateDataRequestSchema (const)", "ValidateDataResponse (type)", "ValidateDataResponseSchema (const)", + "ValidationMode (const)", "ValidationMode (type)", "VersionDefinition (type)", "VersionDefinitionSchema (const)", "VersionNegotiationResponse (type)", "VersionNegotiationResponseSchema (const)", + "VersionStatus (const)", "VersionStatus (type)", "VersioningConfig (type)", "VersioningConfigParsed (type)", "VersioningConfigSchema (const)", + "VersioningStrategy (const)", "VersioningStrategy (type)", "WELL_KNOWN_CAPABILITY_KEYS (const)", "WebSocketConfig (type)", @@ -1049,7 +1095,9 @@ "WebSocketEventSchema (const)", "WebSocketMessage (type)", "WebSocketMessageSchema (const)", + "WebSocketMessageType (const)", "WebSocketMessageType (type)", + "WebSocketPresenceStatus (const)", "WebSocketPresenceStatus (type)", "WebSocketServerConfig (type)", "WebSocketServerConfigParsed (type)", diff --git a/packages/spec/api-surface/automation.json b/packages/spec/api-surface/automation.json index d3f87a2aea..099a823985 100644 --- a/packages/spec/api-surface/automation.json +++ b/packages/spec/api-surface/automation.json @@ -21,6 +21,7 @@ "ActionParadigmSchema (const)", "ActionRef (type)", "ActionRefSchema (const)", + "ApprovalDecision (const)", "ApprovalDecision (type)", "ApprovalEscalation (type)", "ApprovalEscalationParsed (type)", @@ -31,6 +32,7 @@ "ApprovalNodeConfigParsed (type)", "ApprovalNodeConfigSchema (const)", "ApproverOrgSymbol (type)", + "ApproverType (const)", "ApproverType (type)", "ApproverValueBinding (type)", "AssignmentConfig (type)", @@ -93,10 +95,12 @@ "ExecutionError (type)", "ExecutionErrorParsed (type)", "ExecutionErrorSchema (const)", + "ExecutionErrorSeverity (const)", "ExecutionErrorSeverity (type)", "ExecutionLog (type)", "ExecutionLogParsed (type)", "ExecutionLogSchema (const)", + "ExecutionStatus (const)", "ExecutionStatus (type)", "ExecutionStepLog (type)", "ExecutionStepLogParsed (type)", @@ -127,6 +131,7 @@ "FlowFunctionEntrySchema (const)", "FlowGraph (interface)", "FlowNode (type)", + "FlowNodeAction (const)", "FlowNodeAction (type)", "FlowNodeExpressionPath (interface)", "FlowNodeExpressionRole (type)", @@ -245,6 +250,7 @@ "Webhook (type)", "WebhookParsed (type)", "WebhookSchema (const)", + "WebhookTriggerType (const)", "WebhookTriggerType (type)", "analyzeRegion (function)", "approverTypeIsOrgScoped (function)", diff --git a/packages/spec/api-surface/data.json b/packages/spec/api-surface/data.json index b817cdf3e3..81bbd507da 100644 --- a/packages/spec/api-surface/data.json +++ b/packages/spec/api-surface/data.json @@ -19,7 +19,9 @@ "AddressValueSchema (const)", "AggregationCase (interface)", "AggregationExpectation (interface)", + "AggregationFunction (const)", "AggregationFunction (type)", + "AggregationMetricType (const)", "AggregationMetricType (type)", "AggregationNode (type)", "AggregationNodeSchema (const)", @@ -31,6 +33,7 @@ "AnalyticsQuery (type)", "AnalyticsQuerySchema (const)", "ApiExposureDenialReason (type)", + "ApiMethod (const)", "ApiMethod (type)", "ApiMethodsMode (type)", "ApiOperation (type)", @@ -178,6 +181,7 @@ "DefaultValueToken (type)", "Dimension (type)", "DimensionSchema (const)", + "DimensionType (const)", "DimensionType (type)", "DisplayNameObjectMeta (interface)", "Document (type)", @@ -209,6 +213,7 @@ "DriverOptionsSchema (const)", "DriverSslToggle (type)", "DriverSslToggleSchema (const)", + "DriverType (const)", "DriverType (type)", "DriverVocabularyEntry (interface)", "DroppedFieldsEvent (type)", @@ -263,8 +268,11 @@ "FILTER_TOKEN_WRAPPED_RE (const)", "FORMER_CREDENTIAL_ALIASES (const)", "FORMULA_RETURN_TYPE_AS_FIELD_TYPE (const)", + "FeedFilterMode (const)", "FeedFilterMode (type)", + "FeedItemType (const)", "FeedItemType (type)", + "Field (const)", "Field (type)", "FieldGroupCollapse (type)", "FieldGroupSection (interface)", @@ -283,6 +291,7 @@ "FieldReference (type)", "FieldReferenceSchema (const)", "FieldSchema (const)", + "FieldType (const)", "FieldType (type)", "FileLikeValue (type)", "FileLikeValueSchema (const)", @@ -324,6 +333,7 @@ "GroupByNodeSchema (const)", "Hook (type)", "HookBody (type)", + "HookBodyCapability (const)", "HookBodyCapability (type)", "HookBodyParsed (type)", "HookBodySchema (const)", @@ -425,6 +435,7 @@ "ObjectAccessConfig (type)", "ObjectAccessConfigParsed (type)", "ObjectAccessConfigSchema (const)", + "ObjectCapabilities (const)", "ObjectCapabilities (type)", "ObjectCapabilitiesParsed (type)", "ObjectDependencyGraph (type)", @@ -638,8 +649,10 @@ "TextOperatorDoorRefusalCase (interface)", "TextOperatorDoorTypeClass (interface)", "TextOperatorDoorVerdict (type)", + "TimeUpdateInterval (const)", "TimeUpdateInterval (type)", "TitleEligibleFieldDef (interface)", + "TransformType (const)", "TransformType (type)", "TursoConfig (type)", "TursoConfigParsed (type)", diff --git a/packages/spec/api-surface/identity.json b/packages/spec/api-surface/identity.json index 2b6fa1a32f..2c52656d64 100644 --- a/packages/spec/api-surface/identity.json +++ b/packages/spec/api-surface/identity.json @@ -30,6 +30,7 @@ "Invitation (type)", "InvitationParsed (type)", "InvitationSchema (const)", + "InvitationStatus (const)", "InvitationStatus (type)", "MEMBERSHIP_ROLE_ADMIN (const)", "MEMBERSHIP_ROLE_DELEGATED_ADMIN (const)", diff --git a/packages/spec/api-surface/kernel.json b/packages/spec/api-surface/kernel.json index f44ed487cc..42af1484bc 100644 --- a/packages/spec/api-surface/kernel.json +++ b/packages/spec/api-surface/kernel.json @@ -86,6 +86,7 @@ "EventPersistence (type)", "EventPersistenceParsed (type)", "EventPersistenceSchema (const)", + "EventPriority (const)", "EventPriority (type)", "EventQueueConfig (type)", "EventQueueConfigParsed (type)", @@ -366,6 +367,7 @@ "RuntimeConfig (type)", "RuntimeConfigParsed (type)", "RuntimeConfigSchema (const)", + "RuntimeMode (const)", "RuntimeMode (type)", "SBOM (type)", "SBOMEntry (type)", @@ -407,6 +409,7 @@ "ServiceRegistryConfig (type)", "ServiceRegistryConfigParsed (type)", "ServiceRegistryConfigSchema (const)", + "ServiceScopeType (const)", "ServiceScopeType (type)", "StartupOptions (type)", "StartupOptionsParsed (type)", @@ -448,6 +451,7 @@ "ValidationWarningSchema (const)", "VersionConstraint (type)", "VersionConstraintSchema (const)", + "VulnerabilitySeverity (const)", "VulnerabilitySeverity (type)", "WEBHOOK_WITHOUT_TRIGGERS (const)", "checkFieldCompleteness (function)", diff --git a/packages/spec/api-surface/root.json b/packages/spec/api-surface/root.json index 0dd41d5a57..73a4730e7f 100644 --- a/packages/spec/api-surface/root.json +++ b/packages/spec/api-surface/root.json @@ -68,6 +68,7 @@ "ExpandViewResult (interface)", "ExpandedViewItem (interface)", "Expression (type)", + "ExpressionDialect (const)", "ExpressionDialect (type)", "ExpressionInput (type)", "ExpressionInputSchema (const)", diff --git a/packages/spec/api-surface/security.json b/packages/spec/api-surface/security.json index 1b5aa5c6ae..7c636172c0 100644 --- a/packages/spec/api-surface/security.json +++ b/packages/spec/api-surface/security.json @@ -39,6 +39,7 @@ "FieldPermission (type)", "FieldPermissionParsed (type)", "FieldPermissionSchema (const)", + "OWDModel (const)", "OWDModel (type)", "ObjectAccessScope (type)", "ObjectAccessScopeSchema (const)", @@ -59,17 +60,21 @@ "RLS (const)", "RLSEvaluationResult (type)", "RLSEvaluationResultSchema (const)", + "RLSOperation (const)", "RLSOperation (type)", "RLSUserContext (type)", "RLSUserContextSchema (const)", "RowLevelSecurityPolicy (type)", "RowLevelSecurityPolicyParsed (type)", "RowLevelSecurityPolicySchema (const)", + "ShareRecipientType (const)", "ShareRecipientType (type)", + "SharingLevel (const)", "SharingLevel (type)", "SharingRule (type)", "SharingRuleParsed (type)", "SharingRuleSchema (const)", + "SharingRuleType (const)", "SharingRuleType (type)", "TENANCY_POSTURES (const)", "TenancyPosture (type)", diff --git a/packages/spec/api-surface/shared.json b/packages/spec/api-surface/shared.json index 4c96f90956..f60e60ce9d 100644 --- a/packages/spec/api-surface/shared.json +++ b/packages/spec/api-surface/shared.json @@ -13,11 +13,13 @@ "EVALUATED_EXPRESSION_SOURCE_REQUIRED (const)", "EXTERNAL_ERROR_CODES (const)", "EXTERNAL_ERROR_HTTP_STATUS (const)", + "EpochMs (const)", "EpochMs (type)", "EvaluatedExpression (type)", "EvaluatedExpressionParsed (type)", "EvaluatedExpressionSchema (const)", "Expression (type)", + "ExpressionDialect (const)", "ExpressionDialect (type)", "ExpressionInput (type)", "ExpressionInputSchema (const)", @@ -31,6 +33,7 @@ "F (const)", "FieldMapping (type)", "FieldMappingSchema (const)", + "HttpMethod (const)", "HttpMethod (type)", "HttpMethodSubset (type)", "HttpMethodSubsetSchema (const)", diff --git a/packages/spec/api-surface/system.json b/packages/spec/api-surface/system.json index d1b46c83aa..9b57063e2c 100644 --- a/packages/spec/api-surface/system.json +++ b/packages/spec/api-surface/system.json @@ -64,6 +64,7 @@ "BatchProgress (type)", "BatchProgressParsed (type)", "BatchProgressSchema (const)", + "BatchTask (const)", "BatchTask (type)", "BatchTaskParsed (type)", "BatchTaskSchema (const)", @@ -90,6 +91,7 @@ "CRDTState (type)", "CRDTStateParsed (type)", "CRDTStateSchema (const)", + "CRDTType (const)", "CRDTType (type)", "CREATION_ATTESTED_MIGRATION_IDS (const)", "CacheAvalanchePrevention (type)", @@ -113,6 +115,7 @@ "ChangeSet (type)", "ChangeSetParsed (type)", "ChangeSetSchema (const)", + "CollaborationMode (const)", "CollaborationMode (type)", "CollaborationSession (type)", "CollaborationSessionConfig (type)", @@ -134,6 +137,7 @@ "ConsoleDestinationConfig (type)", "ConsoleDestinationConfigParsed (type)", "ConsoleDestinationConfigSchema (const)", + "CoreServiceName (const)", "CoreServiceName (type)", "CounterOperation (type)", "CounterOperationSchema (const)", @@ -143,6 +147,7 @@ "CronSchedule (type)", "CronScheduleParsed (type)", "CronScheduleSchema (const)", + "CursorColorPreset (const)", "CursorColorPreset (type)", "CursorSelection (type)", "CursorSelectionSchema (const)", @@ -167,6 +172,7 @@ "DatabaseProviderSchema (const)", "DatasetLike (interface)", "DatasetMemberLike (interface)", + "DeleteObjectOperation (const)", "DeleteObjectOperation (type)", "DeployBundle (type)", "DeployBundleParsed (type)", @@ -222,7 +228,9 @@ "EnvironmentArtifact (type)", "EnvironmentArtifactParsed (type)", "EnvironmentArtifactSchema (const)", + "ExecuteSqlOperation (const)", "ExecuteSqlOperation (type)", + "ExtendedLogLevel (const)", "ExtendedLogLevel (type)", "ExternalServiceDestinationConfig (type)", "ExternalServiceDestinationConfigSchema (const)", @@ -270,6 +278,7 @@ "Job (type)", "JobExecution (type)", "JobExecutionSchema (const)", + "JobExecutionStatus (const)", "JobExecutionStatus (type)", "JobParsed (type)", "JobSchema (const)", @@ -287,6 +296,7 @@ "LWWRegisterSchema (const)", "LegacyObjectFirstKey (type)", "License (type)", + "LicenseMetricType (const)", "LicenseMetricType (type)", "LicenseSchema (const)", "LifecycleAction (type)", @@ -303,13 +313,16 @@ "LogDestination (type)", "LogDestinationParsed (type)", "LogDestinationSchema (const)", + "LogDestinationType (const)", "LogDestinationType (type)", "LogEnrichmentConfig (type)", "LogEnrichmentConfigParsed (type)", "LogEnrichmentConfigSchema (const)", "LogEntry (type)", "LogEntrySchema (const)", + "LogFormat (const)", "LogFormat (type)", + "LogLevel (const)", "LogLevel (type)", "LoggerConfig (type)", "LoggerConfigParsed (type)", @@ -372,6 +385,7 @@ "MetricAggregationConfig (type)", "MetricAggregationConfigParsed (type)", "MetricAggregationConfigSchema (const)", + "MetricAggregationType (const)", "MetricAggregationType (type)", "MetricDataPoint (type)", "MetricDataPointSchema (const)", @@ -383,14 +397,18 @@ "MetricExportConfigSchema (const)", "MetricLabels (type)", "MetricLabelsSchema (const)", + "MetricType (const)", "MetricType (type)", + "MetricUnit (const)", "MetricUnit (type)", "MetricsConfig (type)", "MetricsConfigParsed (type)", "MetricsConfigSchema (const)", + "MiddlewareConfig (const)", "MiddlewareConfig (type)", "MiddlewareConfigParsed (type)", "MiddlewareConfigSchema (const)", + "MiddlewareType (const)", "MiddlewareType (type)", "MigrationDependency (type)", "MigrationDependencySchema (const)", @@ -407,6 +425,7 @@ "MigrationStatement (type)", "MigrationStatementParsed (type)", "MigrationStatementSchema (const)", + "ModifyFieldOperation (const)", "ModifyFieldOperation (type)", "MultipartUploadConfig (type)", "MultipartUploadConfigParsed (type)", @@ -430,6 +449,7 @@ "OTComponentSchema (const)", "OTOperation (type)", "OTOperationSchema (const)", + "OTOperationType (const)", "OTOperationType (type)", "OTTransformResult (type)", "OTTransformResultSchema (const)", @@ -451,6 +471,7 @@ "OpenTelemetryCompatibility (type)", "OpenTelemetryCompatibilityParsed (type)", "OpenTelemetryCompatibilitySchema (const)", + "OtelExporterType (const)", "OtelExporterType (type)", "PAGE_COMPONENT_COPY_KEYS (const)", "PKG_CONVENTIONS (const)", @@ -475,6 +496,7 @@ "PlanSchema (const)", "PresignedUrlConfig (type)", "PresignedUrlConfigSchema (const)", + "QueueConfig (const)", "QueueConfig (type)", "QueueConfigParsed (type)", "QueueConfigSchema (const)", @@ -494,7 +516,9 @@ "RegistryUpstream (type)", "RegistryUpstreamParsed (type)", "RegistryUpstreamSchema (const)", + "RemoveFieldOperation (const)", "RemoveFieldOperation (type)", + "RenameObjectOperation (const)", "RenameObjectOperation (type)", "RenderOperationMessageInput (interface)", "RenderOperationMessageOptions (interface)", @@ -522,7 +546,9 @@ "RowLevelIsolationStrategyParsed (type)", "RowLevelIsolationStrategySchema (const)", "SETTINGS_CHANGE_EVENT (const)", + "SamplingDecision (const)", "SamplingDecision (type)", + "SamplingStrategyType (const)", "SamplingStrategyType (type)", "Schedule (type)", "ScheduleParsed (type)", @@ -585,12 +611,14 @@ "SpanAttributesSchema (const)", "SpanEvent (type)", "SpanEventSchema (const)", + "SpanKind (const)", "SpanKind (type)", "SpanLink (type)", "SpanLinkParsed (type)", "SpanLinkSchema (const)", "SpanParsed (type)", "SpanSchema (const)", + "SpanStatus (const)", "SpanStatus (type)", "Specifier (type)", "SpecifierHandler (type)", @@ -602,6 +630,7 @@ "SpecifierSchema (const)", "SpecifierScope (type)", "SpecifierScopeSchema (const)", + "SpecifierType (const)", "SpecifierType (type)", "SpecifierValueDomain (type)", "SpecifierValueDomainSchema (const)", @@ -639,21 +668,27 @@ "SupplierSecurityRequirement (type)", "SupplierSecurityRequirementParsed (type)", "SupplierSecurityRequirementSchema (const)", + "SystemFieldName (const)", "SystemFieldName (type)", + "SystemObjectName (const)", "SystemObjectName (type)", + "SystemUserId (const)", "SystemUserId (type)", "TASK_PRIORITY_VALUES (const)", "TRANSLATABLE_METADATA_TYPES (const)", "TRANSLATE_PLACEHOLDER (const)", + "Task (const)", "Task (type)", "TaskExecutionResult (type)", "TaskExecutionResultSchema (const)", "TaskParsed (type)", + "TaskPriority (const)", "TaskPriority (type)", "TaskRetryPolicy (type)", "TaskRetryPolicyParsed (type)", "TaskRetryPolicySchema (const)", "TaskSchema (const)", + "TaskStatus (const)", "TaskStatus (type)", "Tenant (type)", "TenantConnectionConfig (type)", @@ -661,6 +696,7 @@ "TenantIsolationConfig (type)", "TenantIsolationConfigParsed (type)", "TenantIsolationConfigSchema (const)", + "TenantIsolationLevel (const)", "TenantIsolationLevel (type)", "TenantQuota (type)", "TenantQuotaSchema (const)", @@ -687,6 +723,7 @@ "TraceContextSchema (const)", "TraceFlags (type)", "TraceFlagsSchema (const)", + "TracePropagationFormat (const)", "TracePropagationFormat (type)", "TraceSamplingConfig (type)", "TraceSamplingConfigParsed (type)", @@ -711,6 +748,7 @@ "TranslationDiffStatusSchema (const)", "TranslationItem (type)", "TranslationItemSchema (const)", + "UserActivityStatus (const)", "UserActivityStatus (type)", "VALIDATION_MESSAGE_FALLBACK_LOCALE (const)", "VALIDATION_MESSAGE_KEY_PREFIX (const)", @@ -721,6 +759,7 @@ "ViewLike (interface)", "ViewTabLike (interface)", "WidgetLike (interface)", + "WorkerConfig (const)", "WorkerConfig (type)", "WorkerConfigParsed (type)", "WorkerConfigSchema (const)", diff --git a/packages/spec/api-surface/ui.json b/packages/spec/api-surface/ui.json index f31a383e00..97f79ba197 100644 --- a/packages/spec/api-surface/ui.json +++ b/packages/spec/api-surface/ui.json @@ -6,6 +6,7 @@ "ACTION_PARAM_BUILTIN_KEYS (const)", "AIChatWindowProps (const)", "ASSEMBLED_VIEW_ITEMS_KEY (const)", + "Action (const)", "Action (type)", "ActionAi (type)", "ActionAiParsed (type)", @@ -26,10 +27,12 @@ "ActionSchema (const)", "ActionSession (type)", "ActionSessionSchema (const)", + "ActionType (const)", "ActionType (type)", "AddRecordConfig (type)", "AddRecordConfigParsed (type)", "AddRecordConfigSchema (const)", + "App (const)", "App (type)", "AppBranding (type)", "AppBrandingSchema (const)", @@ -104,6 +107,7 @@ "ComponentPropsMap (const)", "DATE_RANGE_DEFAULT_RANGES (const)", "DATE_RANGE_PRESETS (const)", + "Dashboard (const)", "Dashboard (type)", "DashboardHeader (type)", "DashboardHeaderAction (type)", @@ -271,7 +275,9 @@ "PageComponent (type)", "PageComponentParsed (type)", "PageComponentSchema (const)", + "PageComponentType (const)", "PageComponentType (type)", + "PageContainerProps (const)", "PageContainerProps (type)", "PageHeaderProps (const)", "PageNavItem (type)", @@ -305,19 +311,26 @@ "RecordActivityProps (const)", "RecordAlertAction (type)", "RecordAlertActionSchema (const)", + "RecordAlertProps (const)", "RecordAlertProps (type)", "RecordAlertPropsParsed (type)", "RecordChatterProps (const)", "RecordDetailsProps (const)", + "RecordHighlightsField (const)", "RecordHighlightsField (type)", "RecordHighlightsProps (const)", + "RecordHistoryProps (const)", "RecordHistoryProps (type)", + "RecordPathProps (const)", "RecordPathProps (type)", + "RecordQuickActionsProps (const)", "RecordQuickActionsProps (type)", + "RecordReferenceRailProps (const)", "RecordReferenceRailProps (type)", "RecordRelatedListProps (const)", "ReferenceRailEntry (type)", "ReferenceRailEntrySchema (const)", + "Report (const)", "Report (type)", "ReportChart (type)", "ReportChartParsed (type)", @@ -330,6 +343,7 @@ "ReportSort (type)", "ReportSortParsed (type)", "ReportSortSchema (const)", + "ReportType (const)", "ReportType (type)", "ResolvedActionParam (interface)", "ResponsiveStyles (type)", From 5c8fa344bb0eeb615dff8d3cc844082f2e9db6c8 Mon Sep 17 00:00:00 2001 From: Claude Date: Mon, 7 Sep 2026 08:20:48 +0000 Subject: [PATCH 3/3] test(spec): pin the dual-kind rows and add the changeset api-surface-dual-kind-rows.pin.test.ts asserts the committed shards carry both halves of a dual-declared name, with negative controls so a generator that stamped every kind onto every name fails here too. check:api-surface cannot catch that regression on its own: it compares the generator against its own regenerated output. docs-import-surface's fixture now models the merged declaration as the two rows the generator really emits, and two new cases pin why two rows and not a combined kind: the extra row leaves both resolvers unmoved, while a combined kind throws and, after widening the parser, silently resolves to no type at all. Co-Authored-By: Claude Opus 5 Claude-Session: https://claude.ai/code/session_01T6HeZvT9wdSJD1ZxJb5Eno --- .changeset/api-surface-dual-kind-rows.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 .changeset/api-surface-dual-kind-rows.md diff --git a/.changeset/api-surface-dual-kind-rows.md b/.changeset/api-surface-dual-kind-rows.md new file mode 100644 index 0000000000..22836997d4 --- /dev/null +++ b/.changeset/api-surface-dual-kind-rows.md @@ -0,0 +1,13 @@ +--- +"@objectstack/spec": patch +--- + +`api-surface/` now records the value half of a name declared as both a const and a type, so deleting it is a breaking change the gate reports. + +TypeScript merges an `export const X` and an `export type X` into ONE symbol whose flags carry both. `build-api-surface.ts` mapped that symbol through a first-match-wins lookup that tested `TypeAlias` before `Variable`, so the shard recorded `X (type)` alone and the value half was never enumerated. Ablated: deleting `export const RestApiRouteRegistration` while keeping its type alias left all 17 shards byte-identical, the export total unmoved, and `check:api-surface` printing "public API surface + factory signatures unchanged" at exit 0 — on a removed public value export, which is the exact removal the ADR-0059 breadth gate exists to make loud. On the fixed generator the same deletion reports `- RestApiRouteRegistration (const)` as 1 breaking change and exits 1. + +The generator now emits one row per DECLARED kind. The shipped `api-surface/` shards gain **134 rows across 10 of 17 entry points** — every one of them the previously-missing `(const)` half of a name that also declares a type — as a pure insertion: zero rows removed, zero modified, no reordering. + +**Why `patch` and not `minor`, measured against what a consumer can observe.** No export was added, removed or renamed: `dist/` is byte-identical across this change, and the row grammar `Name (kind)` is untouched, so anything that parsed the artifact before parses it now. The 134 new rows describe exports that already existed — the record got more complete, no capability arrived. What changes is the accuracy of a shipped record and the strictness of this repo's own gate, which is a fix. + +One consequence for the release seat, stated because it is not visible from the diff: `build-spec-changes.ts --previous-surface` is a release-time join, so a release crossing this change will list those 134 rows as `added` surface entries. They are not new API — they are the same exports, newly recorded.