@@ -1569,6 +1569,261 @@ Followup to M10.30a. Walked every Setup menu in a real tenant; produced verdict
15691569- 176 service-ai tests passing (18 new tests for stream encoder, route
15701570 dual-mode, systemPrompt, flat options, array content)
15711571
1572+ > ** Versioning note (protocol releases).** From ` 10.0.0 ` onward the protocol version is
1573+ > the published version of ** ` @objectstack/spec ` ** (per-package changesets releases; the
1574+ > full raw per-release record lives in ` packages/spec/CHANGELOG.md ` , which also ships
1575+ > inside the npm artifact as of 11.10.0). The sections below backfill the
1576+ > ** protocol-facing** changes of the ` 10.x ` –` 11.x ` line — breaking changes,
1577+ > deprecations/retirements, and additions to the authorable surface — so this file again
1578+ > does what its header promises. Releases ` 4.0.2 ` –` 9.11.0 ` remain documented in the
1579+ > per-package changelogs. For every ` 10.x → 11.x ` migration step see
1580+ > [ docs/upgrading-to-11.md] ( ./docs/upgrading-to-11.md ) ; the compatibility gates that
1581+ > govern what may break and when are ADR-0059, and the upgrade-communication contract is
1582+ > ADR-0087.
1583+
1584+ ## [ 11.10.0] — 2026-07-03
1585+
1586+ ### Removed — deprecation window closed
1587+ - ** ` compactLayout ` alias retired** (deprecated since 11.7.0, ADR-0085; #2536 ): the
1588+ canonical key is ` highlightFields ` . ` ObjectSchema.create() ` now rejects
1589+ ` compactLayout ` as an unknown key (with tombstone guidance, below); lenient ` parse() `
1590+ strips it; the parse-time alias and the back-fill transition mirror are removed —
1591+ served metadata carries the canonical key only.
1592+
1593+ ### Added
1594+ - ** Tombstone guidance for retired keys** (#2543 ): ` create() ` rejecting a retired key
1595+ (` compactLayout ` , the ` detail ` block, object-level ` views ` , ` defaultDetailForm ` ) names
1596+ the replacement, the version/decision that removed it, and the one-line fix — the
1597+ error * is* the upgrade guide. Tombstones age out ~ two majors after removal.
1598+ - ** ` CHANGELOG.md ` ships inside the npm package** and ` llms.txt ` gains an "Upgrading
1599+ Across Spec Versions" section for agent consumers (#2543 ).
1600+
1601+ ## [ 11.9.0] — 2026-07-03
1602+
1603+ - Doc-text only: stale ` compactLayout ` / ` defaultDetailForm ` teachings scrubbed from
1604+ schema descriptions (#2530 ). No schema shape or behavior change.
1605+
1606+ ## [ 11.8.0] — 2026-07-03
1607+
1608+ - No protocol-facing changes.
1609+
1610+ ## [ 11.7.0] — 2026-07-02
1611+
1612+ ADR-0085: object presentation intent is declared as cross-surface ** semantic roles** ,
1613+ never as per-surface hint blocks (#2521 ).
1614+
1615+ ### Added
1616+ - ** ` stageField: string | false ` ** — names the object's linear lifecycle field (` false `
1617+ suppresses every consumer's stage heuristics).
1618+ - ** ` deriveFieldGroupLayout(def) ` ** in ` @objectstack/spec/data ` — the single source of
1619+ fieldGroups rendering semantics.
1620+ - ` validateSemanticRoles ` lint (via ` os lint ` ): flags dangling ` Field.group ` /
1621+ ` stageField ` / ` highlightFields ` pointers that are Zod-valid but silently inert
1622+ (ADR-0078).
1623+
1624+ ### Changed / Deprecated
1625+ - ** ` compactLayout ` → ` highlightFields ` ** (the value is an ordered field list, not a
1626+ layout). ` compactLayout ` stays accepted as a parse-time alias for one release window
1627+ (closed in 11.10.0).
1628+ - ** ` fieldGroups[].collapse: 'none' | 'expanded' | 'collapsed' ` ** replaces
1629+ ` defaultExpanded ` and the UI-dialect ` collapsible ` /` collapsed ` boolean pair; old keys
1630+ map onto the enum at parse and remain accepted for one minor.
1631+
1632+ ### Removed
1633+ - ` fieldGroups[].visibleOn ` (no consumer anywhere — ADR-0049 enforce-or-remove).
1634+ - The ` detail: { … }.passthrough() ` UI-hints block (zero authors across framework and
1635+ objectui; documented dead-surface exception, evidence in ADR-0085).
1636+
1637+ ## [ 11.6.0] — 2026-07-02
1638+
1639+ - No protocol-facing changes.
1640+
1641+ ## [ 11.5.0] — 2026-07-02
1642+
1643+ ### Added
1644+ - ** FormView presentation options completed** : ` FormViewSchema ` gains the per-` type `
1645+ (tabbed/wizard/split/drawer/modal) presentation config the renderer already accepted —
1646+ ` layout ` , ` columns ` , ` title ` , ` description ` , ` defaultTab ` , ` tabPosition ` , ` allowSkip ` ,
1647+ ` showStepIndicator ` , ` splitDirection ` , ` splitSize ` , ` splitResizable ` , ` drawerSide ` ,
1648+ ` drawerWidth ` , ` modalSize ` . Spec↔frontend conformance for object-form: 14 → 0
1649+ frontend-only props.
1650+ - ** ` REACT_BLOCKS ` ** react-tier component contract index (ADR-0081): maps each curated
1651+ public block of ` kind:'react' ` pages to its spec zod schema; the AI-facing contract is
1652+ generated from it.
1653+
1654+ ## [ 11.4.0] — 2026-06-30
1655+
1656+ ### Added
1657+ - ** ` PageSchema.kind ` gains ` 'html' ` and ` 'react' ` ** (ADR-0081 honest tiers): ` 'html' `
1658+ is the constrained parse-never-execute tier (the renamed ` 'jsx' ` ); ` 'react' ` is the
1659+ real-React tier, gated server-side by ` OS_PAGE_REACT=off ` . ` source ` is required for
1660+ all three kinds; react source is transpile-checked at ` os build ` .
1661+ - ` userActions.editInline ` toggle (inline record editing; default ` false ` ).
1662+
1663+ ### Deprecated
1664+ - ` kind: 'jsx' ` — kept as a deprecated alias of ` 'html' ` .
1665+
1666+ ## [ 11.3.0] — 2026-06-29
1667+
1668+ ### Changed
1669+ - The optional ` ai ` peer dependency moves ` ^6 ` → ` ^7 ` (all re-exported message/stream
1670+ types verified present in ` ai@7 ` ).
1671+
1672+ ### Deprecated
1673+ - ** ` titleFormat ` ** (ADR-0079): a render-only template the server can neither return nor
1674+ query — use ** ` nameField ` ** (canonical; ` displayNameField ` is the deprecated alias).
1675+ New advisory lints ` title-format-retired ` / ` title-unresolvable ` in ` os build ` /
1676+ ` os lint ` ; the schema still parses existing metadata.
1677+
1678+ ## [ 11.2.0] — 2026-06-29
1679+
1680+ ### Added
1681+ - ** ` ObjectStackProtocol ` segmented into per-domain interfaces** (ADR-0076 D9):
1682+ ` DataProtocol ` , ` MetadataProtocol ` , ` AnalyticsProtocol ` , ` AutomationProtocol ` ,
1683+ ` PackageProtocol ` , ` ViewProtocol ` , ` PermissionProtocol ` , ` WorkflowProtocol ` ,
1684+ ` RealtimeProtocol ` , ` NotificationProtocol ` , ` AiProtocol ` , ` I18nProtocol ` ,
1685+ ` FeedProtocol ` — all newly exported. The composed interface is shape-identical to the
1686+ previous flat one (non-breaking); new code should depend on the narrowest slice.
1687+ - ` PageSchema ` gains ` kind: 'jsx' ` + ` source ` (authoritative JSX text) + ` requires ` ,
1688+ with a completeness ` superRefine ` (ADR-0080; superseded by the 11.4.0 tier split).
1689+
1690+ ## [ 11.1.0] — 2026-06-28
1691+
1692+ Completes the 11.0 breaking line (see
1693+ [ docs/upgrading-to-11.md] ( ./docs/upgrading-to-11.md ) ).
1694+
1695+ ### Removed
1696+ - ** ` DriverInterface ` type alias** (deprecated in 11.0) — use ` IDataDriver ` (same
1697+ shape). Unrelated to the live ` IDataEngine ` and to the zod-derived runtime driver
1698+ schema in ` /data ` , both unchanged.
1699+ - ** ` PolicySchema ` / ` definePolicy ` and the stack ` policies ` collection** (#1882 ,
1700+ ADR-0049): 100% unenforced — no runtime consumer ever read it. No migration needed;
1701+ ` SharingRule ` , ` PermissionSet ` , RLS and the ` *PolicySchema ` siblings are unaffected.
1702+ - ** Dead, unauthored properties** (#2377 , ADR-0049): field ` caseSensitive ` / ` maxRating ` ;
1703+ object ` partitioning ` (+ ` PartitioningConfigSchema ` ) / ` defaultDetailForm ` .
1704+
1705+ ### Added
1706+ - ** ` ActionSchema.openIn: 'self' | 'new-tab' ` ** — declarative new-tab control for static
1707+ ` type:'url' ` actions (previously stripped as an unknown key; now preserved
1708+ end-to-end).
1709+
1710+ ## [ 11.0.0] — 2026-06-27
1711+
1712+ ** Major.** Every breaking change of the 11 line, each with a concrete migration, is in
1713+ [ docs/upgrading-to-11.md] ( ./docs/upgrading-to-11.md ) (also covering the package-level
1714+ breaks outside the spec surface: Hono-only HTTP adapters, ` client-react ` canonical query
1715+ fields, ` OS_* ` env renames).
1716+
1717+ ### Breaking
1718+ - ** Open edition is MCP-only** (ADR-0025 S2): the bundled AI authoring service
1719+ (` @objectstack/service-ai ` ) is no longer part of the open distribution; AI integrates
1720+ through ` @objectstack/mcp ` plus the documented opt-in seam (a host app that
1721+ * declares* ` @objectstack/service-ai ` still loads it).
1722+ - ** Flow-node aliases ` http_request ` / ` http_call ` / ` webhook ` removed** (ADR-0018 M3
1723+ cleanup): author ` type: 'http' ` (identical behavior — durable outbox when
1724+ ` config.durable ` , inline fetch otherwise). Authoring a removed type now fails fast at
1725+ parse. The trigger ` eventType: 'webhook' ` and the ` webhook ` resume event are
1726+ unaffected.
1727+ - ** ` IUIService ` removed** — use ` IMetadataService ` (views/dashboards are metadata).
1728+
1729+ ### Changed — behavior
1730+ - ** ` flow.runAs ` is now enforced** (#1888 ; the ` [EXPERIMENTAL — not enforced] ` marker is
1731+ removed): ` runAs:'user' ` (the default) runs CRUD nodes under the triggering user's
1732+ identity and RLS; ` runAs:'system' ` runs elevated. ** Declare ` runAs:'system' ` on any
1733+ flow that must read or write beyond the triggering user's access.** A
1734+ schedule-triggered user-mode data run (no trigger user ⇒ unscoped) is now audible: a
1735+ ` flow-schedule-runas-unscoped ` author-time lint plus a one-per-run runtime warning.
1736+ - ** ` PageTypeSchema ` is the live set** (` record ` , ` home ` , ` app ` , ` utility ` , ` list ` ):
1737+ the six renderless roadmap types (` dashboard ` , ` form ` , ` record_detail ` ,
1738+ ` record_review ` , ` overview ` , ` blank ` ) are removed from the enum and tracked in
1739+ ` PAGE_TYPE_ROADMAP ` ; the dead ` blank ` /` record_review ` config schemas are hard-removed
1740+ (documented ADR-0059 §4 exception — authoring them already failed at runtime).
1741+ - ** AI service is opt-in via a declared dependency** (resolvability is no longer
1742+ enough), and ` config.tiers ` is now honored by ` defineStack ` .
1743+
1744+ ### Added
1745+ - ** Field type ` 'user' ` ** (person picker) — a semantic specialization of
1746+ ` lookup('sys_user') ` with ` Field.user() ` , ` multiple ` , and
1747+ ` defaultValue: 'current_user' ` ; storage identical to lookup (zero migration).
1748+ - ** Formula typing** : ` FieldSchema.returnType ` + ` inferExpressionType() ` .
1749+ - ** Datasets** : multi-hop to-one relationship joins (≤3 hops, per-hop read-scope
1750+ enforced; ADR-0071); ` aggregate ` optional for derived measures; a ` defineForm `
1751+ authoring layout for datasets.
1752+ - ** Authoritative create seeds** : ` getMetadataCreateSeed(type) ` + ` createSeed ` exposed
1753+ via ` /meta/types ` — designers derive create defaults from the spec instead of
1754+ hardcoding them.
1755+ - ` passwordRejectBreached ` auth setting (default off; ADR-0069 D1);
1756+ ` RecordRelatedListProps.add ` (add-existing-via-picker); ` element:text_input ` ;
1757+ ` ChartConfig.colors ` accepts a palette or a value→color map.
1758+
1759+ ### Fixed
1760+ - Dashboard widget ` layout ` optional (auto-flow); page ` regions ` / component
1761+ ` properties ` / slotted ` slots ` optional — Studio-authored pages and dashboards no
1762+ longer 422 on save.
1763+
1764+ ## [ 10.3.0] — 2026-06-23
1765+
1766+ - No protocol-facing changes recorded.
1767+
1768+ ## [ 10.2.0] — 2026-06-22
1769+
1770+ ### Added
1771+ - ** ` responsiveStyles ` ** on the UI page-component envelope (ADR-0065): per-breakpoint
1772+ CSS-property maps compiled to id-scoped CSS — the build-independent styling channel
1773+ for metadata-authored pages.
1774+
1775+ ## [ 10.1.0] — 2026-06-22
1776+
1777+ ### Added
1778+ - ** ` datasource.autoConnect ` ** (ADR-0062 Phase 1): a declared external datasource
1779+ connects to a live driver and its federated objects are queryable with zero app code;
1780+ auto-connect is gated (external, explicitly bound, or ` autoConnect: true ` ) so existing
1781+ apps are byte-for-byte unchanged.
1782+ - Federated analytics correctness: ` NativeSQLStrategy ` declines federated objects and
1783+ routes them through the driver's physical-table resolution (additive
1784+ ` StrategyContext.isExternalObject ` hook).
1785+
1786+ ## [ 10.0.0] — 2026-06-22
1787+
1788+ ** Major.**
1789+
1790+ ### Breaking
1791+ - ** ` sys_department ` renamed to ` sys_business_unit ` ** — object, member table
1792+ (` sys_department_member ` → ` sys_business_unit_member ` ), fields, and i18n, with ** no
1793+ compatibility alias** . Any deployment holding ` sys_department ` rows or metadata
1794+ referencing the object by name (lookups, list views, queries, sharing/approval
1795+ scopes) must migrate. Verified against the ADR-0059 pre-publish hotcrm gate.
1796+
1797+ ### Added
1798+ - ** ADR-0057 ERP authorization core** : permission-grant access ** depth**
1799+ (` own ` / ` own_and_reports ` / ` unit ` / ` unit_and_below ` / ` org ` ); the platform-owned
1800+ ` sys_user_role ` assignment; stack-declared ` roles ` / ` sharingRules ` seeded into
1801+ ` sys_role ` / ` sys_sharing_rule ` at boot. Hierarchy-relative scopes delegate to a
1802+ pluggable ` IHierarchyScopeResolver ` (open edition fails closed to owner-only).
1803+ - ** ` defineX ` factories for the remaining 16 writable domains** + 6 missing ` XInput `
1804+ aliases (#2035 ) — one consistent, validated authoring entry per domain; purely
1805+ additive. (The foundation of the ADR-0059 author-time gate.)
1806+ - ` ListView.type: 'tree' ` (+ ` TreeConfigSchema ` ); ` SkillSchema.surface ` /
1807+ ` AgentSchema.surface ` (` ask ` /` build ` , ADR-0063/0064 — the ` agent ` type is closed to
1808+ third-party authoring); ` DatasetMeasure.currency ` and ` ExecutionContext.currency `
1809+ (ISO 4217).
1810+
1811+ ### Changed
1812+ - ** ` script ` actions must declare an executable binding** (` body ` or ` target ` ,
1813+ enforced via ` superRefine ` ) — rejects only configurations that were already
1814+ non-functional at runtime.
1815+ - ** RLS predicates are canonical CEL** (` == ` , ` in ` ; ADR-0058 D1): all seeded predicates
1816+ migrated; a stored SQL-style predicate still compiles through the ** deprecated**
1817+ ` sqlPredicateToCel ` shim with a warning (no silent deny on legacy data).
1818+
1819+ ### Deprecated
1820+ - The ` sqlPredicateToCel ` transitional bridge (author canonical CEL).
1821+
1822+ ### Fixed
1823+ - Federation reads honor ` external.remoteName ` / ` external.remoteSchema ` (ADR-0015);
1824+ a nested ` where ` inside ` expand ` is honored (AND-merged); ` GanttConfigSchema ` is
1825+ ` .passthrough() ` (renderer knobs no longer stripped by the bundled console copy).
1826+
15721827## [ 4.0.1] — 2026-03-31
15731828
15741829### Fixed
0 commit comments