Skip to content

Commit 7b4d2e4

Browse files
claudeos-zhuang
authored andcommitted
docs(releases): fold 14.5 into the v14 platform page
14.5.0 has shipped (all @objectstack/* packages version-bumped, per-package changelogs generated), but the curated platform page still read "current: 14.4.0" and covered only 14.1 → 14.4. Per docs/releases-maintenance.md a minor folds into the current major's page rather than getting its own. - Bump the "current" marker to 14.5.0 (July 13, 2026) and the covered range to 14.1 → 14.5, in both v14.mdx and the releases index. - New capabilities: MCP agents run under a scope-derived ceiling (ADR-0090 D10) and the ADR-0057 data-lifecycle follow-ups (retention sweepers retired, retention.onlyWhen, telemetry datasource split, Studio lifecycle block). - Notable fixes: the settings-routes (Critical, #2848), share-link-routes (#2851), and analytics-scope (#2852) verified-authz hardenings. - Console: extend the bundled objectui range to 839536b1 and add the Edit-as-CTA / inline-edit and permission-sets (Studio designs, Setup assigns) frontend work. - Upgrade checklist: retention-option removal, MCP OAuth scope ceilings, and the settings/share-link verified-credential requirement. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01CxYGfsQTH35x4nBBjKkVvp
1 parent 703099a commit 7b4d2e4

2 files changed

Lines changed: 94 additions & 4 deletions

File tree

content/docs/releases/index.mdx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ migration steps, then covers new capabilities and notable fixes.
1818

1919
## Versions
2020

21-
- [v14.0.0](/docs/releases/v14) — ADR-0090 vocabulary convergence completed, object `enable.*` flags become real gates, admin user management, phone/SMS auth, book-audience enforcement, data-lifecycle contract, and effective-dated grants (current series: 14.4.0).
21+
- [v14.0.0](/docs/releases/v14) — ADR-0090 vocabulary convergence completed, object `enable.*` flags become real gates, admin user management, phone/SMS auth, book-audience enforcement, data-lifecycle contract, and effective-dated grants (current series: 14.5.0).
2222
- [v13.0.0](/docs/releases/v13) — Permission Model v2 (ADR-0090): Roles and Profiles converge on Positions, custom objects default to private, plus an explain engine, delegated administration, and self-serve MCP OAuth.
2323
- [v12.0.0](/docs/releases/v12) — Anonymous data access denied by default (ADR-0056 D2), adaptive record surfaces, an enforced protocol-version handshake, and build-gating author-time lints.
2424
- [v9.0.0](/docs/releases/v9) — Analytics single-form cutover (ADR-0021), honest chart taxonomy, canonical `OS_*` settings env vars, Google sign-in, AI build experience.

content/docs/releases/v14.mdx

Lines changed: 93 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,10 @@ title: v14.0.0
33
description: The v14 series completes the ADR-0090 vocabulary convergence, makes object enable.* capability flags real gates, and adds admin user management, phone/SMS auth, book-audience enforcement, a data-lifecycle contract, and effective-dated grants.
44
---
55

6-
**Released July 2026 — current: 14.4.0 (July 11, 2026).** All `@objectstack/*`
6+
**Released July 2026 — current: 14.5.0 (July 13, 2026).** All `@objectstack/*`
77
packages are version-locked, so one number describes the whole platform. This
88
page covers the **v14 series**: it opens with the 14.0.0 breaking change, then
9-
folds in the capabilities that shipped across 14.1 → 14.4.
9+
folds in the capabilities that shipped across 14.1 → 14.5.
1010

1111
The v14 line finishes the ADR-0090 permission-model convergence (the last
1212
role/profile vocabulary leftovers), turns the object `enable.*` capability flags
@@ -179,6 +179,55 @@ bespoke UI. `GET /me/apps` now sources the engine registry (the authority the
179179
meta routes use) so `tabPermissions` and `AppSchema.requiredPermissions` have a
180180
real enforced consumer.
181181

182+
### MCP agents run under a scope-derived ceiling (14.5.0, ADR-0090 D10)
183+
184+
The agent principal goes live. An MCP request authenticated with an OAuth access
185+
token now resolves as an AI **agent acting on behalf of** the human `sub`, and
186+
its effective permission is the **intersection** of a scope-derived capability
187+
ceiling **and** the user's own grants — never more than either:
188+
189+
- `data:read` → read-only, `data:write` → full CRUD, neither → no data access.
190+
`userId` stays the human, so owner-stamping and `current_user.*` RLS still
191+
resolve to them; the user's own `systemPermissions` are cleared so a
192+
capability-gated action can't ride the user's capabilities.
193+
- A mis-resolved agent falls back to the **restricted** (no-object-access) set,
194+
so it fails **closed**, never open. A token without an authorized client stays
195+
an ordinary `human` principal.
196+
- Capability-gated business **actions** are delegated **only** when the token
197+
carries the `actions:execute` scope — the user's explicit consent to let the
198+
agent act on their behalf. Data reach is unaffected: an action's reads/writes
199+
still flow through the CRUD/FLS/RLS ceiling ∩ user intersection.
200+
201+
**Security tightening.** Previously an OAuth request executed with the logged-in
202+
user's *full* authority and scopes narrowed only the tool surface; now the scope
203+
is also a real data-layer ceiling, so a `data:read` token can never write any
204+
record no matter what the user could do.
205+
206+
### Data-lifecycle follow-ups (14.5.0, ADR-0057)
207+
208+
The lifecycle contract that landed in 14.4 is now the single owner of platform
209+
data bounding:
210+
211+
- **Per-plugin retention sweepers retired**`JobRunRetention` /
212+
`NotificationRetention` and the `retentionDays` / `retentionSweepMs` options on
213+
`JobServicePlugin` / `MessagingServicePlugin` are **removed** (breaking, shipped
214+
as minor per the launch-window convention). The platform LifecycleService
215+
enforces the same windows from the `lifecycle` declarations (`sys_job_run` 30d,
216+
notifications 90d), tunable via the `lifecycle` settings namespace
217+
(`retention_overrides`, tenant-scoped).
218+
- **`retention.onlyWhen` status predicate** — a mixed table can scope its age
219+
reap to a row filter, so `sys_automation_run` reaps only `completed` / `failed`
220+
runs and never strands a `paused`, in-flight approval. Rejected when combined
221+
with rotation `storage` or `archive`.
222+
- **Telemetry datasource split**`objectstack dev` provisions a dedicated
223+
`telemetry` datasource (`<primary>.telemetry.db`) so lifecycle-classed system
224+
data stops sharing the business dev DB (`OS_TELEMETRY_DB=0` opts out,
225+
`=<path>` opts in anywhere). New **`os db clean`** runs the one-time `VACUUM`
226+
that lets legacy files adopt `auto_vacuum=INCREMENTAL` and reports reclaimed
227+
bytes.
228+
- **Studio** — the object metadata form now exposes the `lifecycle` block (class
229+
+ retention / TTL / rotation / archive / reclaim).
230+
182231
## Notable fixes
183232

184233
- **FLS keys must be object-qualified** (14.4.0) — the evaluator matches
@@ -195,10 +244,32 @@ real enforced consumer.
195244
consumer yet (authoring lint + Studio badges only); its liveness entry moves to
196245
`planned` + `authorWarn`, and the docs say external-principal evaluation lands
197246
with the principal-taxonomy phase.
247+
- **Settings routes no longer trust identity headers (14.5.0, Critical, #2848)**
248+
`GET/PUT/POST /api/settings/*` derived the caller from spoofable
249+
`x-user-id` / `x-tenant-id` / `x-permissions` headers and `setMany` ran no
250+
permission check, so on a default `os serve --server` deployment an
251+
**unauthenticated** client could write tenant- or platform-scoped settings and
252+
enumerate every namespace. Identity now comes from the verified resolution
253+
(`resolveAuthzContext`), manifest `readPermission` / `writePermission` are
254+
enforced at the HTTP boundary, and the missing `setup.write` capability is now
255+
declared and granted to `admin_full_access` / `organization_admin`.
256+
In-process/boot callers are unchanged.
257+
- **Share-link routes hardened (14.5.0, #2851)** — the raw-app
258+
`POST/GET/DELETE /api/v1/share-links` routes trusted `x-user-id` / `x-tenant-id`
259+
headers and ignored the caller on revoke, so an attacker could forge link
260+
attribution, enumerate another user's tokens (`?createdBy=<victim>`), and revoke
261+
anyone's links. Identity is now verified; list is forced to the caller's own
262+
links; revoke requires the link's creator; and `createLink` checks the record is
263+
visible to the caller first. The public `/:token/resolve` route stays public.
264+
- **Analytics queries scoped to the caller (14.5.0, #2852)**`handleAnalytics`
265+
dropped the execution context, so the per-object read-scope provider ran with no
266+
tenant/RLS filter and a caller could read rows their row-level security hides.
267+
The execution context is now threaded into `analyticsService.query` /
268+
`generateSql`, scoping every object by its read filter.
198269

199270
## New in Console (Studio)
200271

201-
The Console bundled across the 14.x line (objectui `397dcad7..6fa8e6ae`) carries:
272+
The Console bundled across the 14.x line (objectui `397dcad7..839536b1`) carries:
202273

203274
- **Position assignment panels**`relationshipValueField` renderer support
204275
(aligned to 14.3) renders the `sys_user` **Positions** tab and the
@@ -212,6 +283,12 @@ The Console bundled across the 14.x line (objectui `397dcad7..6fa8e6ae`) carries
212283
- **Dynamic runtime branding** consumed across the console, a cloud **AI
213284
model-status** admin panel, and spreadsheet attachments that reach the build
214285
agent.
286+
- **Edit as the primary CTA** (14.5) — record detail leads with Edit, and you
287+
enter inline edit by **double-clicking a field** (objectui #2401 / #2402); the
288+
affordance honors `userActions.edit` on managed objects instead of
289+
blanket-disabling fields (ADR-0092 D4).
290+
- **Permission sets — Studio designs, Setup assigns** (14.5, ADR-0056,
291+
objectui #2403) — the two apps split the design vs. assignment surfaces.
215292

216293
The record **Attachments panel** and the **"why can this user access?" explain
217294
panel** landed in the console bundled during the 13.x line — see
@@ -234,3 +311,16 @@ For exhaustive, per-commit frontend detail, see the
234311
keys.
235312
6. Optionally adopt the `lifecycle` contract on high-volume custom objects and
236313
the `sms` namespace + `auth.plugins.phoneNumber` for phone auth.
314+
7. **(14.5)** Drop any `retentionDays` / `retentionSweepMs` options on
315+
`JobServicePlugin` / `MessagingServicePlugin` (removed) — retention is now
316+
enforced from `lifecycle` declarations; tune it via the `lifecycle` settings
317+
namespace (`retention_overrides`).
318+
8. **(14.5)** MCP OAuth integrations: an agent no longer inherits the user's full
319+
authority — confirm each client's token scopes (`data:read` / `data:write` /
320+
`actions:execute`) grant the intended ceiling, and add `actions:execute` where
321+
an agent must run capability-gated actions.
322+
9. **(14.5)** Any custom integration hitting `/api/settings/*` or
323+
`/api/v1/share-links` must present a verified session / API-key / OAuth
324+
credential (the header-trusted default is removed); grant `setup.write` to
325+
principals that write branding / company / localization / feature-flag
326+
namespaces.

0 commit comments

Comments
 (0)