Skip to content

Commit d506281

Browse files
os-zhuangclaude
andauthored
docs(releases): complete v9.0.0 coverage — non-changeset features + Cloud; 3-repo collector (#1704)
The v9 page was written from the 8 consumed changesets, but the range @objectstack/spec@8.0.1..9.0.0 contains 41 commits — changeset discipline is partial, and the ADR-0007 package publish/install work lives in the cloud repo, which the page didn't cover at all. Page additions: - Automation: nested durable pause (subflow chains) + wait timers re-armed after cold boot - Publishing: seed rows materialize on every publish path (seedApplied) - AI service: tools stream progress mid-execution (data-* parts) - ObjectStack Cloud section: in-environment install via reconciliation (ADR-0007 ①), environment API authorization hardening; notes ADR-0007 ② (org-default publish) ships next release - Fixes: create-objectstack starts cleanly under pnpm, Setup settings i18n collect-release-notes.sh now emits four sections: ALL framework commits in the range (completeness check), consumed changesets (curated prose), objectui pin range, and cloud commits in the release time window (cloud has no pin — it links the framework workspace and versions independently). Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
1 parent 649e56b commit d506281

3 files changed

Lines changed: 114 additions & 18 deletions

File tree

content/docs/releases/index.mdx

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,10 @@ ObjectStack ships as a single release train: all `@objectstack/*` packages are
77
version-locked, so one version number describes the whole platform. The
88
Console UI (built from the [objectui](https://github.com/objectstack-ai/objectui)
99
repository) is frozen into `@objectstack/console` at release time, so each
10-
release note here also covers what changed in Studio/Console.
10+
release note here also covers what changed in Studio/Console. ObjectStack
11+
Cloud (the hosted control plane) versions independently and deploys
12+
continuously — developer-facing Cloud changes are summarized in the release
13+
note for the framework version they accompany.
1114

1215
Each release page is written for **third-party developers** building apps,
1316
plugins, or clients on ObjectStack. It leads with breaking changes and

content/docs/releases/v9.mdx

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,37 @@ human-readable with no frontend work:
104104
gains optional `label` and `format`, so a chart can display "Tasks" and
105105
"$616,000" while keeping raw numbers for plotting.
106106

107+
### Automation: durable pause survives subflows and restarts
108+
109+
Two reliability upgrades to `@objectstack/service-automation`'s durable pause
110+
(ADR-0019):
111+
112+
- **Nested durable pause.** A pausing node (approval, screen, wait) inside a
113+
subflow used to fail the parent run. The whole chain now suspends as linked
114+
runs: the child's screen surfaces through the parent, resume signals
115+
delegate down to the suspended child, and a completed child auto-resumes its
116+
parent.
117+
- **Wait timers re-arm after a cold boot.** A timer `wait` scheduled its wake-up
118+
in process memory, so a restart left the suspended run paused forever. The
119+
wake deadline is now persisted with the run; on boot the service resumes
120+
overdue runs immediately and re-schedules future ones.
121+
122+
### Publishing: seed data lands on every publish path
123+
124+
Whether a `seed` draft's rows actually materialized used to depend on which
125+
route you published through — the per-ref publish (used by the Studio home
126+
banner) never applied them, yielding "Published!" with empty tables. Seed
127+
application now lives in the protocol itself (`@objectstack/objectql`), so
128+
every publish path converges on it and reports the outcome under
129+
`seedApplied`. A seed problem never fails the publish.
130+
131+
### AI service: tools stream progress while they run
132+
133+
`ToolExecutionContext.onProgress(part)` lets a long-running tool report
134+
progress before it returns, emitted as custom `data-*` parts on the UI message
135+
stream (this is what powers the live build tree in Console's Build-with-AI).
136+
Existing tools that never emit behave exactly as before.
137+
107138
### Auth: Google sign-in and an extension hook
108139

109140
`@objectstack/plugin-auth` binds the `auth` settings namespace to better-auth
@@ -146,10 +177,31 @@ improvements:
146177
- **Charts**: crowded bar-chart x-axis labels angle and truncate instead of
147178
overlapping.
148179

180+
## ObjectStack Cloud
181+
182+
ObjectStack Cloud (the hosted control plane) versions independently of this
183+
release train and deploys continuously; changes that affect how you ship apps
184+
are summarized here when a framework release lands.
185+
186+
- **Package install via reconciliation (ADR-0007 ①).** Installing a published
187+
package into an environment is now a control-plane operation: the
188+
environment's **Installed** view in Console reads the control-plane install
189+
list when cloud-bound, and publish → install is the documented deployment
190+
path (install from the environment Marketplace, not a publish flag).
191+
- **Authorization hardening across the environment API surface** — environment
192+
reads are org-scoped, and destructive environment/organization operations
193+
require an owner/admin role.
194+
195+
The second phase of ADR-0007 — org-scoped private package catalogs with
196+
`os package publish` defaulting to organization visibility — ships in the next
197+
framework release.
198+
149199
## Notable fixes
150200

151201
- Publishing pending drafts by ref so package-less drafts can't get stuck in
152202
the metadata-admin publish queue.
203+
- New projects scaffolded by `create-objectstack` start cleanly under pnpm.
204+
- Setup → System Settings menu labels and pages are fully translated.
153205
- `FlowRunner` closes cleanly when a terminal resume fails instead of leaving
154206
a dead dialog.
155207
- The AI service treats a stored or env-locked `provider=memory` as an explicit

scripts/collect-release-notes.sh

Lines changed: 58 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,19 @@
11
#!/usr/bin/env bash
22
# Collect the raw material for a release-notes page in content/docs/releases/.
33
#
4-
# Aggregates, for the release between two framework refs:
5-
# 1. The changesets consumed by the release (full text, grouped as the
6-
# per-package CHANGELOGs were generated from them).
7-
# 2. The objectui (Console UI) commit range, derived from the .objectui-sha
8-
# pin at each ref, with feat/fix commits listed first.
4+
# The platform spans three repositories; a release page must aggregate all of
5+
# them. For the release between two framework refs this prints:
6+
# 1. ALL framework commits in the range (feat/fix first). Changesets are a
7+
# curated subset — commits land without one, so the full log is the
8+
# source of truth for coverage.
9+
# 2. The changesets consumed by the release (full text — the best prose for
10+
# items that have one).
11+
# 3. The objectui (Console UI) commit range, derived from the .objectui-sha
12+
# pin at each ref.
13+
# 4. The cloud (control plane) commits inside the release's time window.
14+
# Cloud is not pinned by the framework (it tracks it via link: deps and
15+
# versions independently), so the window between the two refs' commit
16+
# dates is the best available scope — review its edges by hand.
917
#
1018
# Usage:
1119
# scripts/collect-release-notes.sh <prev-ref> [<new-ref>]
@@ -15,21 +23,45 @@
1523
# Output is markdown on stdout — pipe it to a file and write the curated
1624
# release page from it:
1725
# scripts/collect-release-notes.sh "@objectstack/spec@9.0.0" > /tmp/v10-material.md
26+
#
27+
# Sibling checkouts are found at ../objectui and ../cloud; override with
28+
# OBJECTUI_ROOT / CLOUD_ROOT.
1829

1930
set -euo pipefail
2031

2132
FRAMEWORK_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
2233
OBJECTUI_ROOT="${OBJECTUI_ROOT:-$(cd "${FRAMEWORK_ROOT}/../objectui" 2>/dev/null && pwd || true)}"
34+
CLOUD_ROOT="${CLOUD_ROOT:-$(cd "${FRAMEWORK_ROOT}/../cloud" 2>/dev/null && pwd || true)}"
2335

2436
PREV_REF="${1:?usage: collect-release-notes.sh <prev-ref> [<new-ref>]}"
2537
NEW_REF="${2:-HEAD}"
2638

2739
cd "$FRAMEWORK_ROOT"
2840

41+
# Print a commit list with feat/fix first, the rest after — `chore!:` and
42+
# similar breakage hides in the second bucket, so it stays visible.
43+
print_log_split() { # <git-dir> <range-or-window...>
44+
local dir="$1"; shift
45+
local all
46+
all=$(git -C "$dir" log --no-merges --pretty='- %h %s' "$@")
47+
echo "### feat / fix"
48+
echo
49+
grep -E '^- [0-9a-f]+ (feat|fix)' <<< "$all" || echo "_none_"
50+
echo
51+
echo "### everything else (watch for chore!: / refactor!: breakage)"
52+
echo
53+
grep -Ev '^- [0-9a-f]+ (feat|fix)' <<< "$all" || echo "_none_"
54+
}
55+
2956
echo "# Release material: ${PREV_REF}${NEW_REF}"
3057
echo
3158

32-
echo "## Framework changesets consumed in this release"
59+
echo "## 1. Framework — all commits in the range"
60+
echo
61+
print_log_split "$FRAMEWORK_ROOT" "${PREV_REF}".."${NEW_REF}"
62+
echo
63+
64+
echo "## 2. Framework — changesets consumed in this release"
3365
echo
3466

3567
# Changesets deleted anywhere in the range were consumed by `changeset
@@ -53,7 +85,7 @@ else
5385
done <<< "$consumed"
5486
fi
5587

56-
echo "## Console UI (objectui) commit range"
88+
echo "## 3. Console UI (objectui) — pin range"
5789
echo
5890

5991
prev_sha=$(git show "${PREV_REF}:.objectui-sha" 2>/dev/null || true)
@@ -70,18 +102,27 @@ elif [[ "$prev_sha" == "$new_sha" ]]; then
70102
elif [[ -z "$OBJECTUI_ROOT" || ! -d "$OBJECTUI_ROOT/.git" ]]; then
71103
echo "_objectui checkout not found (set OBJECTUI_ROOT); range is ${prev_sha}..${new_sha}_"
72104
else
73-
echo "### feat / fix"
74-
echo
75-
git -C "$OBJECTUI_ROOT" log --no-merges --pretty='- %h %s' "${prev_sha}..${new_sha}" \
76-
| grep -E '^- [0-9a-f]+ (feat|fix)' || echo "_none_"
77-
echo
78-
echo "### everything else"
79-
echo
80-
git -C "$OBJECTUI_ROOT" log --no-merges --pretty='- %h %s' "${prev_sha}..${new_sha}" \
81-
| grep -Ev '^- [0-9a-f]+ (feat|fix)' || echo "_none_"
105+
print_log_split "$OBJECTUI_ROOT" "${prev_sha}..${new_sha}"
106+
fi
107+
echo
108+
109+
echo "## 4. Cloud (control plane) — time window"
110+
echo
111+
112+
prev_date=$(git log -1 --format=%cI "${PREV_REF}")
113+
new_date=$(git log -1 --format=%cI "${NEW_REF}")
114+
echo "- window: ${prev_date}${new_date} (cloud is not pinned; window edges are approximate)"
115+
echo
116+
117+
if [[ -z "$CLOUD_ROOT" || ! -d "$CLOUD_ROOT/.git" ]]; then
118+
echo "_cloud checkout not found (set CLOUD_ROOT); scan it by this window manually._"
119+
else
120+
print_log_split "$CLOUD_ROOT" --since="$prev_date" --until="$new_date"
82121
fi
83122

84123
echo
85124
echo "---"
86125
echo "_Write the curated page at content/docs/releases/, register it in"
87-
echo "content/docs/releases/meta.json, and link it from index.mdx._"
126+
echo "content/docs/releases/meta.json, and link it from index.mdx. Items with a"
127+
echo "changeset have the best prose in section 2; section 1 is the completeness"
128+
echo "check — every developer-visible feat/fix should be accounted for._"

0 commit comments

Comments
 (0)