Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
56 changes: 56 additions & 0 deletions .changeset/prune-aspirational-config-3494.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
---
"@objectstack/spec": minor
---

feat(spec)!: prune the still-dead aspirational config from Theme / Translation / Webhook (#3494)

Removes the authorable-but-never-consumed props confirmed dead by the 2026-06
liveness audit (follow-up to #1878/#1893; same treatment as the #2377 and
#3464 prunes). Authoring any of these was a silent no-op.

## Removed

**Theme** (`ThemeSchema`) — the theme engine (objectui `generateThemeVars`)
never emitted or consumed them:
- Props: `spacing`, `breakpoints`, `logo`, `density`, `wcagContrast`, `rtl`,
`touchTarget`, `keyboardNavigation`
- Exports: `SpacingSchema`, `BreakpointsSchema`, `DensityModeSchema` (+
deprecated `DensityMode` alias), `WcagContrastLevelSchema` (+ deprecated
`WcagContrastLevel` alias), and the `Spacing` / `Breakpoints` /
`DensityMode` / `WcagContrastLevel` types

**Translation** (`TranslationConfigSchema`) — no runtime reader; there is no
ICU engine and interpolation is always simple `{variable}` substitution:
- Props: `fileOrganization`, `messageFormat`, `lazyLoad`, `cache`
- Exports: `MessageFormatSchema`, `TranslationFileOrganizationSchema`, and the
`MessageFormat` / `TranslationFileOrganization` types

**Webhook** (`WebhookSchema`) — the delivery path always sends its own fixed
envelope and only applies HMAC signing via `secret`; delivery retries are owned
by the messaging outbox's fixed schedule:
- Props: `body`, `payloadFields`, `includeSession`, `authentication`
(bearer/basic/api-key were never attached; HMAC via `secret` stays),
`retryPolicy`, `tags`
- Exports: the entire inbound `WebhookReceiverSchema` + `WebhookReceiver` type
(never consumed by any runtime)

## Migration

Delete these keys from your configs — they never did anything, so removing
them changes no behavior. Parsed output no longer contains the previously
defaulted keys (`includeSession: false`, `fileOrganization: 'per_locale'`,
`messageFormat: 'simple'`, `lazyLoad: false`, `cache: true`). Webhook HMAC
signing (`secret`), `headers`, and `timeoutMs` are unaffected. File layout for
translations remains a pure authoring convention — no config knob needed.

## Deliberately NOT removed

- Translation `supportedLocales` — it has a live reader (pinyin-search
capability toggle in `serve.ts`).
- Job `retryPolicy` / `timeout` — being implemented (built, not pruned) in the
#3494 follow-up PR.
- The materialized webhook props (`name`, `object`, `triggers`, `url`,
`method`, `headers`, `timeoutMs`, `secret`, `isActive`, `description`,
`label`) — live via the #3489 bridge; ledger flip tracked in #3490.

Refs #3494, #1878, #1893.
7 changes: 4 additions & 3 deletions content/docs/automation/webhooks.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -514,7 +514,7 @@ Four phases. Each phase delivers visible user value.
> `system/*` Zod schemas. There is no `system/webhook-delivery.zod.ts` and no
> `SysWebhookSchema` / `SysWebhookDeliverySchema` /
> `WebhookSignatureHeaderSchema` / `WebhookEventPayloadSchema`. Instead it
> reused the existing `WebhookSchema` (and `WebhookReceiverSchema`) in
> reused the existing `WebhookSchema` in
> `automation/webhook.zod.ts`, defined `sys_webhook` as an
> `ObjectSchema.create()` in the plugin, and reused
> service-messaging's `sys_http_delivery` outbox for deliveries (ADR-0018 M3).
Expand Down Expand Up @@ -555,8 +555,9 @@ Four phases. Each phase delivers visible user value.
## 16. Non-goals (v1)

- **Inbound webhooks.** Receiving HTTP from third parties is a separate
protocol (`WebhookReceiverSchema` already exists). The two systems
share no runtime.
protocol (the aspirational `WebhookReceiverSchema` was removed unbuilt in
#3494 — reintroduce it only alongside a real inbound runtime). The two
systems share no runtime.
- **Webhook chaining / fan-in.** No "if receiver returns a payload,
emit a new event". Out of scope.
- **GraphQL subscriptions / WebSocket fan-out.** Different transport,
Expand Down
2 changes: 1 addition & 1 deletion content/docs/getting-started/quick-reference.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -157,7 +157,7 @@ Flows, state machines, approvals, and integrations.
| **[Flow](/docs/references/automation/flow)** | `flow.zod.ts` | Flow, FlowNode | Visual workflow builder |
| **[Approval](/docs/references/automation/approval)** | `approval.zod.ts` | ApprovalNodeConfig | Flow approval-node config |
| **[State Machine](/docs/references/automation/state-machine)** | `state-machine.zod.ts` | StateMachine | State machine definitions |
| **[Webhook](/docs/references/automation/webhook)** | `webhook.zod.ts` | Webhook, WebhookReceiver | Outbound webhooks |
| **[Webhook](/docs/references/automation/webhook)** | `webhook.zod.ts` | Webhook | Outbound webhooks |
| **[ETL](/docs/references/automation/etl)** | `etl.zod.ts` | ETLPipeline | Data transformation pipelines |
| **[Trigger Registry](/docs/references/automation/trigger-registry)** | `trigger-registry.zod.ts` | TriggerRegistry | Event-driven triggers |
| **[Sync](/docs/references/automation/sync)** | `sync.zod.ts` | DataSyncConfig, SyncMode | Bi-directional data sync |
Expand Down
28 changes: 3 additions & 25 deletions content/docs/protocol/kernel/i18n-standard.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -322,10 +322,8 @@ const label = i18n.t('account.fields.unknown', 'en');
<Callout type="warn">
**Design intent.** Automatic CLDR plural selection (the `key` / `key_plural`
convention) is not yet implemented by the file adapter — `t()` performs only
`{{param}}` interpolation. To pluralize today, set `messageFormat: 'icu'` and
author ICU MessageFormat strings (see
[Use ICU MessageFormat](#4-use-icu-messageformat-for-complex-messages) below),
or select the form in application code.
`{{param}}` interpolation. To pluralize today, select the plural form in
application code before calling `t()`.
</Callout>

```typescript
Expand Down Expand Up @@ -855,15 +853,7 @@ export default defineStack({
}
```

### 4. Use ICU MessageFormat for Complex Messages

```json
{
"accountStatus": "{count, plural, =0 {No accounts} =1 {One account} other {# accounts}}"
}
```

### 5. Test All Locales
### 4. Test All Locales

```typescript
// ✓ GOOD: Test with actual locales
Expand Down Expand Up @@ -891,18 +881,6 @@ export default defineStack({
// Fallback chain
fallbackLocale: 'en',

// File organization: 'bundled' | 'per_locale' | 'per_namespace' (default 'per_locale')
fileOrganization: 'per_locale',

// Message format: 'simple' {variable} interpolation (default) | 'icu' MessageFormat
messageFormat: 'simple',

// Load translations on demand? (default false)
lazyLoad: true,

// Cache translations? (default true)
cache: true,

// Translation service — design intent, not yet a recognized config key
// translationService: {
// provider: 'google-translate',
Expand Down
26 changes: 2 additions & 24 deletions content/docs/references/automation/webhook.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -46,8 +46,8 @@ value that silently never fires.
## TypeScript Usage

```typescript
import { Webhook, WebhookReceiver, WebhookTriggerType } from '@objectstack/spec/automation';
import type { Webhook, WebhookReceiver, WebhookTriggerType } from '@objectstack/spec/automation';
import { Webhook, WebhookTriggerType } from '@objectstack/spec/automation';
import type { Webhook, WebhookTriggerType } from '@objectstack/spec/automation';

// Validate data
const result = Webhook.parse(data);
Expand All @@ -68,32 +68,10 @@ const result = Webhook.parse(data);
| **url** | `string` | ✅ | External webhook endpoint URL |
| **method** | `Enum<'GET' \| 'POST' \| 'PUT' \| 'PATCH' \| 'DELETE'>` | ✅ | HTTP method |
| **headers** | `Record<string, string>` | optional | Custom HTTP headers |
| **body** | `any` | optional | Request body payload (if not using default record data) |
| **payloadFields** | `string[]` | optional | Fields to include. Empty = All |
| **includeSession** | `boolean` | ✅ | Include user session info |
| **authentication** | `{ type: Enum<'none' \| 'bearer' \| 'basic' \| 'api-key'>; credentials?: Record<string, string> }` | optional | Authentication configuration. [EXPERIMENTAL — not enforced] The webhook delivery path only applies HMAC signing via `secret`; bearer/basic/api-key credentials are not attached to outbound requests yet (liveness audit #1878/#1893). |
| **retryPolicy** | `{ maxRetries: integer; backoffStrategy: Enum<'exponential' \| 'linear' \| 'fixed'>; initialDelayMs: integer; maxDelayMs: integer }` | optional | Retry policy configuration |
| **timeoutMs** | `integer` | ✅ | Request timeout in milliseconds |
| **secret** | `string` | optional | Signing secret for HMAC signature verification |
| **isActive** | `boolean` | ✅ | Whether webhook is active |
| **description** | `string` | optional | Webhook description |
| **tags** | `string[]` | optional | Tags for organization |


---

## WebhookReceiver

### Properties

| Property | Type | Required | Description |
| :--- | :--- | :--- | :--- |
| **name** | `string` | ✅ | Webhook receiver unique name (lowercase snake_case) |
| **path** | `string` | ✅ | URL Path (e.g. /webhooks/stripe) |
| **verificationType** | `Enum<'none' \| 'header_token' \| 'hmac' \| 'ip_whitelist'>` | ✅ | |
| **verificationParams** | `{ header?: string; secret?: string; ips?: string[] }` | optional | |
| **action** | `Enum<'trigger_flow' \| 'script' \| 'upsert_record'>` | ✅ | |
| **target** | `string` | ✅ | Flow ID or Script name |


---
Expand Down
6 changes: 0 additions & 6 deletions content/docs/references/integration/connector.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -470,16 +470,10 @@ Synchronization strategy
| **url** | `string` | ✅ | External webhook endpoint URL |
| **method** | `Enum<'GET' \| 'POST' \| 'PUT' \| 'PATCH' \| 'DELETE'>` | ✅ | HTTP method |
| **headers** | `Record<string, string>` | optional | Custom HTTP headers |
| **body** | `any` | optional | Request body payload (if not using default record data) |
| **payloadFields** | `string[]` | optional | Fields to include. Empty = All |
| **includeSession** | `boolean` | ✅ | Include user session info |
| **authentication** | `{ type: Enum<'none' \| 'bearer' \| 'basic' \| 'api-key'>; credentials?: Record<string, string> }` | optional | Authentication configuration. [EXPERIMENTAL — not enforced] The webhook delivery path only applies HMAC signing via `secret`; bearer/basic/api-key credentials are not attached to outbound requests yet (liveness audit #1878/#1893). |
| **retryPolicy** | `{ maxRetries: integer; backoffStrategy: Enum<'exponential' \| 'linear' \| 'fixed'>; initialDelayMs: integer; maxDelayMs: integer }` | optional | Retry policy configuration |
| **timeoutMs** | `integer` | ✅ | Request timeout in milliseconds |
| **secret** | `string` | optional | Signing secret for HMAC signature verification |
| **isActive** | `boolean` | ✅ | Whether webhook is active |
| **description** | `string` | optional | Webhook description |
| **tags** | `string[]` | optional | Tags for organization |
| **events** | `Enum<'record.created' \| 'record.updated' \| 'record.deleted' \| 'sync.started' \| 'sync.completed' \| 'sync.failed' \| 'auth.expired' \| 'rate_limit.exceeded'>[]` | optional | Connector events to subscribe to (not yet enforced — no runtime dispatches these; see #3197) |
| **signatureAlgorithm** | `Enum<'hmac_sha256' \| 'hmac_sha512' \| 'none'>` | ✅ | Webhook signature algorithm |

Expand Down
1 change: 0 additions & 1 deletion content/docs/references/integration/meta.json
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
"connector",
"connector-auth",
"mapping",
"translation",
"---Transport & Storage---",
"http",
"message-queue",
Expand Down
20 changes: 18 additions & 2 deletions content/docs/references/integration/misc.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,8 @@ description: Misc protocol schemas
## TypeScript Usage

```typescript
import { AckMode, ApiVersionConfig, BuildConfig, CdcConfig, DatabaseConnector, DatabasePoolConfig, DatabaseTable, DeliveryGuarantee, DeploymentConfig, DlqConfig, DomainConfig, EdgeFunctionConfig, EnvironmentVariables, FileAccessPattern, FileFilterConfig, FileMetadataConfig, FileStorageConnector, FileStorageProvider, FileVersioningConfig, GitHubActionsWorkflow, GitHubCommitConfig, GitHubConnector, GitHubIssueTracking, GitHubProvider, GitHubPullRequestConfig, GitHubReleaseConfig, GitHubRepository, GitRepositoryConfig, MessageQueueConnector, ProducerConfig, SaasConnector, SaasObjectType, SaasProvider, SslConfig, StorageBucket, TopicQueue, VercelConnector, VercelFramework, VercelMonitoring, VercelProject, VercelProvider, VercelTeam } from '@objectstack/spec/integration';
import type { AckMode, ApiVersionConfig, BuildConfig, CdcConfig, DatabaseConnector, DatabasePoolConfig, DatabaseTable, DeliveryGuarantee, DeploymentConfig, DlqConfig, DomainConfig, EdgeFunctionConfig, EnvironmentVariables, FileAccessPattern, FileFilterConfig, FileMetadataConfig, FileStorageConnector, FileStorageProvider, FileVersioningConfig, GitHubActionsWorkflow, GitHubCommitConfig, GitHubConnector, GitHubIssueTracking, GitHubProvider, GitHubPullRequestConfig, GitHubReleaseConfig, GitHubRepository, GitRepositoryConfig, MessageQueueConnector, ProducerConfig, SaasConnector, SaasObjectType, SaasProvider, SslConfig, StorageBucket, TopicQueue, VercelConnector, VercelFramework, VercelMonitoring, VercelProject, VercelProvider, VercelTeam } from '@objectstack/spec/integration';
import { AckMode, ApiVersionConfig, BuildConfig, CdcConfig, DatabaseConnector, DatabasePoolConfig, DatabaseTable, DeliveryGuarantee, DeploymentConfig, DlqConfig, DomainConfig, EdgeFunctionConfig, EnvironmentVariables, FileAccessPattern, FileFilterConfig, FileMetadataConfig, FileStorageConnector, FileStorageProvider, FileVersioningConfig, GitHubActionsWorkflow, GitHubCommitConfig, GitHubConnector, GitHubIssueTracking, GitHubProvider, GitHubPullRequestConfig, GitHubReleaseConfig, GitHubRepository, GitRepositoryConfig, MessageFormat, MessageQueueConnector, ProducerConfig, SaasConnector, SaasObjectType, SaasProvider, SslConfig, StorageBucket, TopicQueue, VercelConnector, VercelFramework, VercelMonitoring, VercelProject, VercelProvider, VercelTeam } from '@objectstack/spec/integration';
import type { AckMode, ApiVersionConfig, BuildConfig, CdcConfig, DatabaseConnector, DatabasePoolConfig, DatabaseTable, DeliveryGuarantee, DeploymentConfig, DlqConfig, DomainConfig, EdgeFunctionConfig, EnvironmentVariables, FileAccessPattern, FileFilterConfig, FileMetadataConfig, FileStorageConnector, FileStorageProvider, FileVersioningConfig, GitHubActionsWorkflow, GitHubCommitConfig, GitHubConnector, GitHubIssueTracking, GitHubProvider, GitHubPullRequestConfig, GitHubReleaseConfig, GitHubRepository, GitRepositoryConfig, MessageFormat, MessageQueueConnector, ProducerConfig, SaasConnector, SaasObjectType, SaasProvider, SslConfig, StorageBucket, TopicQueue, VercelConnector, VercelFramework, VercelMonitoring, VercelProject, VercelProvider, VercelTeam } from '@objectstack/spec/integration';

// Validate data
const result = AckMode.parse(data);
Expand Down Expand Up @@ -527,6 +527,22 @@ GitHub provider type
| **autoDeployPreview** | `boolean` | ✅ | Auto-deploy preview branches |


---

## MessageFormat

Message format/serialization

### Allowed Values

* `json`
* `xml`
* `protobuf`
* `avro`
* `text`
* `binary`


---

## MessageQueueConnector
Expand Down
39 changes: 0 additions & 39 deletions content/docs/references/integration/translation.mdx

This file was deleted.

33 changes: 2 additions & 31 deletions content/docs/references/system/translation.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,8 @@ Translation data for a single field.
## TypeScript Usage

```typescript
import { ActionResultDialogTranslation, AppTranslationBundle, CoverageBreakdownEntry, FieldTranslation, Locale, MessageFormat, ObjectTranslationData, ObjectTranslationNode, TranslationBundle, TranslationConfig, TranslationCoverageResult, TranslationData, TranslationDiffItem, TranslationDiffStatus, TranslationFileOrganization } from '@objectstack/spec/system';
import type { ActionResultDialogTranslation, AppTranslationBundle, CoverageBreakdownEntry, FieldTranslation, Locale, MessageFormat, ObjectTranslationData, ObjectTranslationNode, TranslationBundle, TranslationConfig, TranslationCoverageResult, TranslationData, TranslationDiffItem, TranslationDiffStatus, TranslationFileOrganization } from '@objectstack/spec/system';
import { ActionResultDialogTranslation, AppTranslationBundle, CoverageBreakdownEntry, FieldTranslation, Locale, ObjectTranslationData, ObjectTranslationNode, TranslationBundle, TranslationConfig, TranslationCoverageResult, TranslationData, TranslationDiffItem, TranslationDiffStatus } from '@objectstack/spec/system';
import type { ActionResultDialogTranslation, AppTranslationBundle, CoverageBreakdownEntry, FieldTranslation, Locale, ObjectTranslationData, ObjectTranslationNode, TranslationBundle, TranslationConfig, TranslationCoverageResult, TranslationData, TranslationDiffItem, TranslationDiffStatus } from '@objectstack/spec/system';

// Validate data
const result = ActionResultDialogTranslation.parse(data);
Expand Down Expand Up @@ -99,18 +99,6 @@ Translation data for a single field
---


---

## MessageFormat

Message interpolation format: ICU MessageFormat or simple `{variable}` replacement

### Allowed Values

* `icu`
* `simple`


---

## ObjectTranslationData
Expand Down Expand Up @@ -169,10 +157,6 @@ Internationalization configuration
| **defaultLocale** | `string` | ✅ | Default locale (e.g., "en") |
| **supportedLocales** | `string[]` | ✅ | Supported BCP-47 locale codes |
| **fallbackLocale** | `string` | optional | Fallback locale code |
| **fileOrganization** | `Enum<'bundled' \| 'per_locale' \| 'per_namespace'>` | ✅ | File organization strategy |
| **messageFormat** | `Enum<'icu' \| 'simple'>` | ✅ | Message interpolation format (ICU MessageFormat or simple). [EXPERIMENTAL — 'icu' not enforced] No ICU MessageFormat engine is wired; messageFormat:'icu' is accepted but interpolation falls back to simple substitution (liveness audit #1878/#1893). |
| **lazyLoad** | `boolean` | ✅ | Load translations on demand |
| **cache** | `boolean` | ✅ | Cache loaded translations. [EXPERIMENTAL — not enforced] No runtime consumer reads this cache flag yet (liveness audit #1878/#1893). |


---
Expand Down Expand Up @@ -252,16 +236,3 @@ Translation diff status: missing from bundle, redundant (no matching metadata),

---

## TranslationFileOrganization

Translation file organization strategy

### Allowed Values

* `bundled`
* `per_locale`
* `per_namespace`


---

2 changes: 1 addition & 1 deletion content/docs/references/ui/responsive.mdx
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ description: Responsive protocol schemas

Breakpoint Name Enum

Matches the breakpoint names defined in theme.zod.ts BreakpointsSchema.
Standard Tailwind-style breakpoint names (xs–2xl).

<Callout type="info">
**Source:** `packages/spec/src/ui/responsive.zod.ts`
Expand Down
Loading