Skip to content

Commit 2b5ced2

Browse files
os-zhuangclaude
andcommitted
docs(references): regenerate from spec (RowCrudActionOverride, ServiceSelfInfo, ADR-0097)
content/docs/references/ is generated from packages/spec by `gen:schema && gen:docs`, but nothing in CI regenerates and diffs it, so the output has been drifting since #3014 (2026-07-16). Regenerating dirties 7 files; every change traces to a spec change that shipped without re-running the generator: - data/object.mdx RowCrudActionOverride missing entirely (#3076) — the type is exported from @objectstack/spec/data but undiscoverable in docs - api/discovery.mdx ServiceSelfInfo missing entirely - ui/dashboard.mdx ChartWidget.filterBindings, DashboardFilter.name missing - data/field.mdx readonly: server-enforced on UPDATE (#2948/#3003) - security/permission allowTransfer: enforced now, was "pending M2" (#3004) - integration/* connector ADR-0096 → ADR-0097, expanded providerConfig prose The ADR renumber is a correctness fix, not churn: 0096 is execution-surface identity admission, 0097 is declarative connector instances (#2977). The published docs have been pointing readers at the wrong ADR. Generated output only — no hand edits. Verified deterministic: two consecutive runs produce byte-identical output, so the drift is real rather than generator noise. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
1 parent 3a8ce9d commit 2b5ced2

7 files changed

Lines changed: 55 additions & 25 deletions

File tree

content/docs/references/api/discovery.mdx

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,8 @@ not been verified (may 501 at runtime).
2828
## TypeScript Usage
2929

3030
```typescript
31-
import { ApiRoutes, Discovery, RouteHealthEntry, RouteHealthReport, ServiceInfo, WellKnownCapabilities } from '@objectstack/spec/api';
32-
import type { ApiRoutes, Discovery, RouteHealthEntry, RouteHealthReport, ServiceInfo, WellKnownCapabilities } from '@objectstack/spec/api';
31+
import { ApiRoutes, Discovery, RouteHealthEntry, RouteHealthReport, ServiceInfo, ServiceSelfInfo, WellKnownCapabilities } from '@objectstack/spec/api';
32+
import type { ApiRoutes, Discovery, RouteHealthEntry, RouteHealthReport, ServiceInfo, ServiceSelfInfo, WellKnownCapabilities } from '@objectstack/spec/api';
3333

3434
// Validate data
3535
const result = ApiRoutes.parse(data);
@@ -132,6 +132,19 @@ const result = ApiRoutes.parse(data);
132132
| **rateLimit** | `Object` | optional | Rate limit and quota info for this service |
133133

134134

135+
---
136+
137+
## ServiceSelfInfo
138+
139+
### Properties
140+
141+
| Property | Type | Required | Description |
142+
| :--- | :--- | :--- | :--- |
143+
| **status** | `Enum<'stub' \| 'degraded'>` || stub = placeholder or dev fake (do not use for real work); degraded = functional fallback with reduced capability |
144+
| **handlerReady** | `boolean` | optional | Whether the HTTP handler genuinely serves requests. Defaults: false for stub, true for degraded. |
145+
| **message** | `string` | optional | Human-readable explanation, e.g. what to install for the full implementation |
146+
147+
135148
---
136149

137150
## WellKnownCapabilities

content/docs/references/data/field.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -150,7 +150,7 @@ const result = Address.parse(data);
150150
| **conditionalRequired** | `string \| Object` | optional | Predicate (CEL) — field is required when TRUE. Alias of `requiredWhen`. |
151151
| **widget** | `string` | optional | Form widget override — names a registered field component (resolved as `field:<widget>`) to render this field instead of the `type` default. Degrades to the `type` renderer when unregistered. e.g. "object-ref", "filter-condition", "recipient-picker". |
152152
| **hidden** | `boolean` | optional | Hidden from default UI |
153-
| **readonly** | `boolean` | optional | Read-only in UI |
153+
| **readonly** | `boolean` | optional | Read-only — never editable in forms, AND server-enforced on UPDATE: a non-system write to this field is silently dropped from the payload (#2948/#3003; symmetric with `readonlyWhen`). INSERT may still seed it (defaultValue, import). |
154154
| **requiredPermissions** | `string[]` | optional | [ADR-0066 D3] Capabilities required to read/edit this field (mask on read, deny on write; AND-gate). |
155155
| **system** | `boolean` | optional | Auto-injected system/audit field (e.g. created_at, updated_by, organization_id). Tools that surface system fields separately from author-declared business fields should branch on this flag. |
156156
| **sortable** | `boolean` | optional | Whether field is sortable in list views |

content/docs/references/data/object.mdx

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,8 +14,8 @@ API Operations Enum
1414
## TypeScript Usage
1515

1616
```typescript
17-
import { ApiMethod, Index, Lifecycle, LifecycleClass, Object, ObjectAccessConfig, ObjectCapabilities, ObjectExtension, ObjectExternalBinding, ObjectFieldGroup, ObjectOwnershipEnum, ObjectRequiredPermissions, PerOperationRequiredPermissions, SoftDeleteConfig, TenancyConfig, VersioningConfig } from '@objectstack/spec/data';
18-
import type { ApiMethod, Index, Lifecycle, LifecycleClass, Object, ObjectAccessConfig, ObjectCapabilities, ObjectExtension, ObjectExternalBinding, ObjectFieldGroup, ObjectOwnershipEnum, ObjectRequiredPermissions, PerOperationRequiredPermissions, SoftDeleteConfig, TenancyConfig, VersioningConfig } from '@objectstack/spec/data';
17+
import { ApiMethod, Index, Lifecycle, LifecycleClass, Object, ObjectAccessConfig, ObjectCapabilities, ObjectExtension, ObjectExternalBinding, ObjectFieldGroup, ObjectOwnershipEnum, ObjectRequiredPermissions, PerOperationRequiredPermissions, RowCrudActionOverride, SoftDeleteConfig, TenancyConfig, VersioningConfig } from '@objectstack/spec/data';
18+
import type { ApiMethod, Index, Lifecycle, LifecycleClass, Object, ObjectAccessConfig, ObjectCapabilities, ObjectExtension, ObjectExternalBinding, ObjectFieldGroup, ObjectOwnershipEnum, ObjectRequiredPermissions, PerOperationRequiredPermissions, RowCrudActionOverride, SoftDeleteConfig, TenancyConfig, VersioningConfig } from '@objectstack/spec/data';
1919

2020
// Validate data
2121
const result = ApiMethod.parse(data);
@@ -282,6 +282,21 @@ Type: `string[]`
282282
| **delete** | `string[]` | optional | Capabilities required to delete (delete/purge). |
283283

284284

285+
---
286+
287+
## RowCrudActionOverride
288+
289+
Boolean-or-predicates override for a built-in row CRUD affordance.
290+
291+
### Properties
292+
293+
| Property | Type | Required | Description |
294+
| :--- | :--- | :--- | :--- |
295+
| **enabled** | `boolean` | optional | Object-level on/off for the generic affordance; same meaning as the bare boolean form. Omitted → managedBy bucket default. |
296+
| **visibleWhen** | `string \| Object` | optional | Per-record CEL predicate; false → hide the row button for that record. Fail-closed. |
297+
| **disabledWhen** | `string \| Object` | optional | Per-record CEL predicate; true → render the row button disabled for that record. Fail-soft. |
298+
299+
285300
---
286301

287302
## SoftDeleteConfig

content/docs/references/integration/connector.mdx

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -65,7 +65,7 @@ entries with `enabled: false`. Provider-bound declarative instances that
6565

6666
a generic executor (connector-openapi / connector-mcp) materializes at
6767

68-
boot are tracked in #2977 (ADR-0096).
68+
boot are tracked in #2977 (ADR-0097).
6969

7070
Authentication is now imported from the canonical auth/config.zod.ts.
7171

@@ -177,9 +177,9 @@ Circuit breaker configuration
177177
| **description** | `string` | optional | Connector description |
178178
| **icon** | `string` | optional | Icon identifier |
179179
| **authentication** | `Object \| Object \| Object \| Object \| Object` | optional | Authentication configuration (runtime shape with inline secrets). Provider-bound declarative instances use `auth.credentialRef` instead. |
180-
| **provider** | `string` | optional | Generic-executor key that materializes this declarative entry at boot (e.g. openapi/mcp/rest). Omit for a catalog-only descriptor. Unknown provider ⇒ hard boot error (ADR-0096). |
181-
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi). Requires `provider`. |
182-
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0096). |
180+
| **provider** | `string` | optional | Generic-executor key that materializes this declarative entry at boot (e.g. openapi/mcp/rest). Omit for a catalog-only descriptor. Unknown provider ⇒ hard boot error (ADR-0097). |
181+
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi, where spec is an inline document, a package-relative file path like './billing-openapi.json', or an http(s) URL). Requires `provider`. |
182+
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0097). |
183183
| **actions** | `Object[]` | optional | |
184184
| **triggers** | `Object[]` | optional | |
185185
| **syncConfig** | `Object` | optional | Data sync configuration |
@@ -303,9 +303,9 @@ Connector type
303303
| **description** | `string` | optional | Connector description |
304304
| **icon** | `string` | optional | Icon identifier |
305305
| **authentication** | `Object \| Object \| Object \| Object \| Object` | optional | Authentication configuration (runtime shape with inline secrets). Provider-bound declarative instances use `auth.credentialRef` instead. |
306-
| **provider** | `string` | optional | Generic-executor key that materializes this declarative entry at boot (e.g. openapi/mcp/rest). Omit for a catalog-only descriptor. Unknown provider ⇒ hard boot error (ADR-0096). |
307-
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi). Requires `provider`. |
308-
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0096). |
306+
| **provider** | `string` | optional | Generic-executor key that materializes this declarative entry at boot (e.g. openapi/mcp/rest). Omit for a catalog-only descriptor. Unknown provider ⇒ hard boot error (ADR-0097). |
307+
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi, where spec is an inline document, a package-relative file path like './billing-openapi.json', or an http(s) URL). Requires `provider`. |
308+
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0097). |
309309
| **actions** | `Object[]` | optional | |
310310
| **triggers** | `Object[]` | optional | |
311311
| **syncConfig** | `Object` | optional | Data sync configuration |

content/docs/references/integration/misc.mdx

Lines changed: 12 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -94,8 +94,8 @@ Message acknowledgment mode
9494
| **icon** | `string` | optional | Icon identifier |
9595
| **authentication** | `Object \| Object \| Object \| Object \| Object` | optional | Authentication configuration (runtime shape with inline secrets). Provider-bound declarative instances use `auth.credentialRef` instead. |
9696
| **provider** | `Enum<'postgresql' \| 'mysql' \| 'mariadb' \| 'mssql' \| 'oracle' \| 'mongodb' \| 'redis' \| 'cassandra' \| 'snowflake' \| 'bigquery' \| 'redshift' \| 'custom'>` || Database provider type |
97-
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi). Requires `provider`. |
98-
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0096). |
97+
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi, where spec is an inline document, a package-relative file path like './billing-openapi.json', or an http(s) URL). Requires `provider`. |
98+
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0097). |
9999
| **actions** | `Object[]` | optional | |
100100
| **triggers** | `Object[]` | optional | |
101101
| **syncConfig** | `Object` | optional | Data sync configuration |
@@ -301,8 +301,8 @@ File access pattern
301301
| **icon** | `string` | optional | Icon identifier |
302302
| **authentication** | `Object \| Object \| Object \| Object \| Object` | optional | Authentication configuration (runtime shape with inline secrets). Provider-bound declarative instances use `auth.credentialRef` instead. |
303303
| **provider** | `Enum<'s3' \| 'azure_blob' \| 'gcs' \| 'dropbox' \| 'box' \| 'onedrive' \| 'google_drive' \| 'sharepoint' \| 'ftp' \| 'local' \| 'custom'>` || File storage provider type |
304-
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi). Requires `provider`. |
305-
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0096). |
304+
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi, where spec is an inline document, a package-relative file path like './billing-openapi.json', or an http(s) URL). Requires `provider`. |
305+
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0097). |
306306
| **actions** | `Object[]` | optional | |
307307
| **triggers** | `Object[]` | optional | |
308308
| **syncConfig** | `Object` | optional | Data sync configuration |
@@ -409,8 +409,8 @@ File storage provider type
409409
| **icon** | `string` | optional | Icon identifier |
410410
| **authentication** | `Object \| Object \| Object \| Object \| Object` | optional | Authentication configuration (runtime shape with inline secrets). Provider-bound declarative instances use `auth.credentialRef` instead. |
411411
| **provider** | `Enum<'github' \| 'github_enterprise'>` || GitHub provider |
412-
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi). Requires `provider`. |
413-
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0096). |
412+
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi, where spec is an inline document, a package-relative file path like './billing-openapi.json', or an http(s) URL). Requires `provider`. |
413+
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0097). |
414414
| **actions** | `Object[]` | optional | |
415415
| **triggers** | `Object[]` | optional | |
416416
| **syncConfig** | `Object` | optional | Data sync configuration |
@@ -542,8 +542,8 @@ GitHub provider type
542542
| **icon** | `string` | optional | Icon identifier |
543543
| **authentication** | `Object \| Object \| Object \| Object \| Object` | optional | Authentication configuration (runtime shape with inline secrets). Provider-bound declarative instances use `auth.credentialRef` instead. |
544544
| **provider** | `Enum<'rabbitmq' \| 'kafka' \| 'redis_pubsub' \| 'redis_streams' \| 'aws_sqs' \| 'aws_sns' \| 'google_pubsub' \| 'azure_service_bus' \| 'azure_event_hubs' \| 'nats' \| 'pulsar' \| 'activemq' \| 'custom'>` || Message queue provider type |
545-
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi). Requires `provider`. |
546-
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0096). |
545+
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi, where spec is an inline document, a package-relative file path like './billing-openapi.json', or an http(s) URL). Requires `provider`. |
546+
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0097). |
547547
| **actions** | `Object[]` | optional | |
548548
| **triggers** | `Object[]` | optional | |
549549
| **syncConfig** | `Object` | optional | Data sync configuration |
@@ -603,8 +603,8 @@ GitHub provider type
603603
| **icon** | `string` | optional | Icon identifier |
604604
| **authentication** | `Object \| Object \| Object \| Object \| Object` | optional | Authentication configuration (runtime shape with inline secrets). Provider-bound declarative instances use `auth.credentialRef` instead. |
605605
| **provider** | `Enum<'salesforce' \| 'hubspot' \| 'stripe' \| 'shopify' \| 'zendesk' \| 'intercom' \| 'mailchimp' \| 'slack' \| 'microsoft_dynamics' \| 'servicenow' \| 'netsuite' \| 'custom'>` || SaaS provider type |
606-
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi). Requires `provider`. |
607-
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0096). |
606+
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi, where spec is an inline document, a package-relative file path like './billing-openapi.json', or an http(s) URL). Requires `provider`. |
607+
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0097). |
608608
| **actions** | `Object[]` | optional | |
609609
| **triggers** | `Object[]` | optional | |
610610
| **syncConfig** | `Object` | optional | Data sync configuration |
@@ -739,8 +739,8 @@ SaaS provider type
739739
| **icon** | `string` | optional | Icon identifier |
740740
| **authentication** | `Object \| Object \| Object \| Object \| Object` | optional | Authentication configuration (runtime shape with inline secrets). Provider-bound declarative instances use `auth.credentialRef` instead. |
741741
| **provider** | `Enum<'vercel'>` || Vercel provider |
742-
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi). Requires `provider`. |
743-
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0096). |
742+
| **providerConfig** | `Record<string, any>` | optional | Provider-specific config validated by the provider factory at boot (e.g. `{ spec, baseUrl }` for openapi, where spec is an inline document, a package-relative file path like './billing-openapi.json', or an http(s) URL). Requires `provider`. |
743+
| **auth** | `Object \| Object \| Object \| Object` | optional | Declarative instance auth — references credentials via `credentialRef` (resolved at boot), never inline secrets. Requires `provider` (ADR-0097). |
744744
| **actions** | `Object[]` | optional | |
745745
| **triggers** | `Object[]` | optional | |
746746
| **syncConfig** | `Object` | optional | Data sync configuration |

content/docs/references/security/permission.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ const result = AdminScope.parse(data);
8484
| **allowRead** | `boolean` || Read permission |
8585
| **allowEdit** | `boolean` || Edit permission |
8686
| **allowDelete** | `boolean` || Delete permission |
87-
| **allowTransfer** | `boolean` || [RBAC-gated; operation pending M2] Change record ownership |
87+
| **allowTransfer** | `boolean` || [RBAC-gated; ENFORCED now via insert/update owner_id guard, #3004] Change record ownership (assign/reassign/disown owner_id) |
8888
| **allowRestore** | `boolean` || [RBAC-gated; operation pending M2] Restore from trash (Undelete) |
8989
| **allowPurge** | `boolean` || [RBAC-gated; operation pending M2] Permanently delete (Hard Delete/GDPR) |
9090
| **viewAllRecords** | `boolean` || View All Data (Bypass Sharing) |

0 commit comments

Comments
 (0)