Skip to content

Commit 0b5debb

Browse files
os-steveclaude
andauthored
docs(releases): name 17.2.0 as the current v17 series (#11937)
`content/docs/releases/index.mdx` still ended its v17 entry with "(current series: 17.1.0, released 2026-08-20)" after the 17.2.0 train published (packages/spec version-packages commit e7d2cc6, 2026-08-23T06:29:35Z; confirmed via packages/spec/CHANGELOG.md's `## 17.2.0` heading and package.json's "version": "17.2.0" — the newest GA 17.x release). content/docs/releases/v17.mdx had no heading naming the 17.2 series at all. - index.mdx: v17 status parenthetical now names 17.2.0 (released 2026-08-23), and the summary clause gets a 17.2 continuation matching the existing per-minor shape. - v17.mdx: frontmatter description, release-status blockquote and a new "## Highlights — 17.2.0" section (matching the existing 17.0.0/17.1.0 sections) summarizing the 17.2.0 train's most significant changes across the 69 packages that published it: the by-id update/delete accept-set tightenings (#11009, #11142), further ADR-0049 retirements (sys_position.permissions #9885, MetricSchema.filters #10414, record:highlights icon #10054, themes #10485), the http_request_errors_total retirement (#9834), analytics cross-object-filter refusals (#10759, #10861), driver-sql introspection failing loudly instead of reporting silent absence (#11161), two CLI authoring-surface retirements (#10359, #10917), and the per-item publish ?package= org-scope fix. Docs-only, per the stated exception to "never edit content/docs/releases/ in a code PR": this is the dedicated docs-only PR, not a rider. Not attempted: the full "N.N.0 in detail" + "Upgrade checklist" + "References" depth 17.0.0/17.1.0 carry, and a failing gate leg for index staleness (out of scope per triage). Card relationship is declared in the PR body, not here (a squashed branch must not carry conflicting per-commit Fixes/Part-of trailers). Claude-Session: https://claude.ai/code/session_015ahemw8RcTgqtxrj15PEZx Co-authored-by: Claude <noreply@anthropic.com>
1 parent 7899f57 commit 0b5debb

2 files changed

Lines changed: 72 additions & 17 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-
- [v17.0.0](/docs/releases/v17) — Files become owned `sys_file` records with server-enforced `accept`/`maxSize` and a governed download path, bulk export becomes its own opt-in privilege, the SDK is reconciled against the routes the server actually mounts (21 dead methods out, 40+ real ones in), approval nodes route approvers dynamically via CEL expressions and decision outputs, a datasource that cannot connect fails the boot, and Node 22 becomes the supported floor; 17.1 adds partial field masking, record-view auditing on `sys_audit_log`, and a per-object read-only approval visibility tier — and makes a deactivated permission set or position actually stop granting access, withdraws the bulk-export wildcard from the shipped admin sets, and gives all three flow doors one honest HTTP status table (current series: 17.1.0, released 2026-08-20).
21+
- [v17.0.0](/docs/releases/v17) — Files become owned `sys_file` records with server-enforced `accept`/`maxSize` and a governed download path, bulk export becomes its own opt-in privilege, the SDK is reconciled against the routes the server actually mounts (21 dead methods out, 40+ real ones in), approval nodes route approvers dynamically via CEL expressions and decision outputs, a datasource that cannot connect fails the boot, and Node 22 becomes the supported floor; 17.1 adds partial field masking, record-view auditing on `sys_audit_log`, and a per-object read-only approval visibility tier — and makes a deactivated permission set or position actually stop granting access, withdraws the bulk-export wildcard from the shipped admin sets, and gives all three flow doors one honest HTTP status table; 17.2 tightens by-id `update`/`delete` against a silently-dropped `where` predicate or a mismatched id, retires `sys_position.permissions` and other dead ADR-0049 surfaces, and stops analytics from answering the wrong number on a cross-object filter (current series: 17.2.0, released 2026-08-23).
2222
- [v16.0.0](/docs/releases/v16) — One org identifier (`organizationId`) across hooks and actions, quorum + per-group sign-off (会签) approvals with metadata-declared decision actions, time-relative automations, filtered roll-ups, strict dashboard widgets, an identity-scoped MCP stdio transport, and a platform-wide enforce-or-remove sweep that makes dead metadata loud; 16.1 adds a `requires` capability-provider preflight, two more dashboard build gates, and `runAs:'user'` automations that run with the triggering user's real grants (final release: 16.1.0).
2323
- [v15.0.0](/docs/releases/v15) — Explain record access layer by layer, a docked AI workspace in the Console, project-ready Gantt charts, and phone sign-in; 15.1 adds permission-following attachments, no-code third-party connectors, dashboard-wide filters, pinyin search, and whole-record inline editing — with materially safer multi-tenant and write-path defaults (final release: 15.1.1).
2424
- [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 (final release: 14.8.0).

content/docs/releases/v17.mdx

Lines changed: 71 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
---
22
title: v17.0.0
3-
description: Files become platform records with governed download, bulk export becomes its own opt-in privilege, the SDK reaches every route the server actually mounts, approvals route approvers dynamically, and a boot that cannot reach its datasource stops pretending it can. Backend and Console notes for 17.0.0 and 17.1.0.
3+
description: Files become platform records with governed download, bulk export becomes its own opt-in privilege, the SDK reaches every route the server actually mounts, approvals route approvers dynamically, and a boot that cannot reach its datasource stops pretending it can. Backend and Console notes for 17.0.0, 17.1.0, and 17.2.0.
44
---
55

66
**The v17 line** is a truth-telling release. Where v16 made *declared metadata*
@@ -13,22 +13,25 @@ readable by everyone in the tenant. Alongside that, `agent.tools[]`, the
1313
GraphQL surface, the `ObjectStackProtocol` alias, and a long tail of
1414
parsed-but-never-enforced spec clusters are removed rather than maintained.
1515

16-
> **Release status: 17.1.0 is released**, and is the current version of the v17
17-
> line. It was published to the `latest` tag on 2026-08-20, taking over from
18-
> 17.0.0 — which was published on 2026-08-14, closing a train that ran through
19-
> `17.0.0-rc.0``rc.6` (the last of them cut 2026-08-10). A plain install now
20-
> resolves 17.1.0. `changeset pre exit` ran with the 17.0.0 cut, so the
21-
> `@objectstack/*` packages no longer publish as `17.0.0-rc.N`. Caret ranges on
22-
> `^16.x` hold at 16.x until you opt in, which is the reason this train is a
23-
> major at all: its breaking density (the `ApiMethod` shrink, the GraphQL
24-
> removal, the ADR-0104 write cutover, the dead-cluster retirements) is too high
25-
> to auto-upgrade `^16.x` consumers into on their next install.
16+
> **Release status: 17.2.0 is released**, and is the current version of the v17
17+
> line. It was published to the `latest` tag on 2026-08-23, taking over from
18+
> 17.1.0 — published 2026-08-20, which took over from 17.0.0 — published
19+
> 2026-08-14, closing a train that ran through `17.0.0-rc.0``rc.6` (the last
20+
> of them cut 2026-08-10). A plain install now resolves 17.2.0. `changeset pre
21+
> exit` ran with the 17.0.0 cut, so the `@objectstack/*` packages no longer
22+
> publish as `17.0.0-rc.N`. Caret ranges on `^16.x` hold at 16.x until you opt
23+
> in, which is the reason this train is a major at all: its breaking density
24+
> (the `ApiMethod` shrink, the GraphQL removal, the ADR-0104 write cutover, the
25+
> dead-cluster retirements) is too high to auto-upgrade `^16.x` consumers into
26+
> on their next install.
2627
>
27-
> ⚠️ **17.1.0 is a minor by version number, not by blast radius.** Several of its
28-
> security corrections change who can read or write on an existing deployment,
29-
> and several accept-set narrowings that landed after the 17.0.0 cut ship as
30-
> `minor` under the lockstep launch-window convention. Read the 17.1.0 upgrade
31-
> checklist before upgrading.
28+
> ⚠️ **17.1.0 and 17.2.0 are minors by version number, not by blast radius.**
29+
> Several of 17.1.0's security corrections change who can read or write on an
30+
> existing deployment — read its upgrade checklist below. 17.2.0 adds write-path
31+
> accept-set tightenings of the same shape: a by-id `update`/`delete` that used
32+
> to silently drop an extra `where` predicate, or a mismatched `data.id` /
33+
> `where.id`, now refuses loudly instead (#11009, #11142) — read **Highlights —
34+
> 17.2.0** below before upgrading.
3235
3336
## Highlights — 17.0.0
3437

@@ -149,6 +152,58 @@ parsed-but-never-enforced spec clusters are removed rather than maintained.
149152
host-performed `submitBehavior.url` redirects for consoles mounted at a
150153
sub-path.
151154

155+
## Highlights — 17.2.0
156+
157+
- **Two write-path guardrails close the "silently dropped predicate" hole.** A
158+
by-id `update`/`delete` whose `where` names anything besides `id` now refuses
159+
loudly instead of binding the row unconditionally and discarding the extra
160+
keys — a compare-and-set written as `{ where: { id, status: {...} } }` used to
161+
land unconditionally with no diagnostic (#11009). A by-id `update` whose
162+
`data.id` and `where.id` are both truthy scalars that **disagree** now refuses
163+
`UPDATE_ID_MISMATCH` (HTTP 400) instead of writing the payload row and
164+
silently dropping the losing id (#11142). Both were unconditional writes
165+
masquerading as conditional ones, not failures — flow `update_record` /
166+
`delete_record` nodes that named `id` plus other filter keys without
167+
declaring `multi: true` are where this is most likely to surface.
168+
- **Further ADR-0049 enforce-or-remove retirements.** `sys_position.permissions`
169+
— a security-object column no producer ever wrote and no runtime path ever
170+
read — is gone (#9885); so are `MetricSchema.filters`, the per-metric raw-SQL
171+
filter nothing read (#10414), the `record:highlights` field `icon` (#10054),
172+
and the `themes` carrier key plus `ThemeSchema``app.branding` remains the
173+
one color-authoring surface (#10485).
174+
- **`http_request_errors_total` is retired** (#9834). Its only emitter never
175+
saw the REST data API, the auth mount, or any inbound surface but the
176+
dispatcher's own route Proxy, so the series undercounted from day one. A
177+
dashboard or alert keyed on it now reads a flat zero — that zero is the
178+
removal, not a healthy server.
179+
- **Analytics stops answering the wrong number on a cross-object filter.** A
180+
filter nested inside a combinator (`$or`, `$not`, a nested `$and`) on the
181+
ObjectQL path used to reach `engine.aggregate` unchecked, because the
182+
cross-object envelope check only saw a top-level AND-ed leaf; both analytics
183+
doors now refuse it the same way a top-level cross-object filter already was
184+
(#10759), and a dataset's own definition-level `filter` gets the identical
185+
guard (#10861).
186+
- **Driver introspection stops guessing.** `driver-sql`'s
187+
`introspectPrimaryKeys` / `introspectForeignKeys` / `introspectUniqueConstraints`
188+
used to swallow a failed read and report "no keys" with no diagnostic; a
189+
failed read now throws by default (`{ onFailure: 'partial' }` opts back into
190+
the old behaviour) — schema-drift comparisons and federated-object codegen
191+
were consuming that silent absence as a real answer (#11161).
192+
- **CLI: two dead authoring surfaces are gone.** `os g agent` is retired and
193+
now says why and points at skills — the kernel ships exactly two agents
194+
(`ask`/`build`) per ADR-0063 §2, so scaffolding a third was already discarded
195+
(#10359). The `@capabilities` hook-body directive comment is retired — the
196+
build strips the `//` comment it read before any handler is a runtime
197+
function, so it never reached a build that used it (#10917).
198+
- **A per-item publish naming `?package=` stops matching another package's
199+
draft.** `POST /api/v1/meta/:type/:name/publish?package=PKG_ID` now resolves
200+
its draft's org scope package-exactly, closing a path where the scope probe
201+
could match a different package's draft in the caller's org and the
202+
package-exact promote then 404'd over the caller's own publishable draft
203+
sitting env-wide. A publish that states `?package=` no longer discovers a
204+
package-less draft of the same `(type, name)` — retry without the query
205+
parameter for that draft.
206+
152207
---
153208

154209
# 17.0.0 in detail

0 commit comments

Comments
 (0)