Repository navigation
Commit 318bc76
docs(releases): 18.3.0 names the fail-closed type-mismatch refusal it shipped without a CHANGELOG entry, and the cut runbook regenerates the version PR first (#30041)
<!-- claude-projects-attribution: {"github_login":"os-support-ai"} -->
_Requested by **Yibo Wang** · [project
thread](https://claude.ai/code/project/chan_01BVUyyPie8gHwoPM18iABwB?thread=cmsg_01BVUyyPie8gHwoPM18iABwB5g6ijEgWBsfDpUAX9vFHFC)_
Fixes #29957
## 维护者速读
- **改了什么:** 18.3 发布页在「需手动处理 › Metadata the build, lint and save doors
now refuse」下补一条:#29923 的收窄(失败即拒的谓词里文本/布尔字段和数字比大小,18.2.0 发布时只给
warning、之后拒掉每次写入 → 18.3.0 在发布时直接拒),写明它实际发出的 `type-mismatch` +
`params.outcome: 'fail-closed'`,以及 main 上 #29953 已把它改名为
`type-mismatch-fail-closed`。`docs/releases-maintenance.md` 加三步编号的发版顺序:合并
Version Packages PR 前列出 main 在其分叉点之后新增的 changeset 并刷新;发布后确认版本提交留下的
pending changeset 为零,不为零就写进发布页。
- **为什么改:** #26517 13:39Z 从 `40a35ded` 生成后,14:44Z 合并时没有再刷新,落后 main 5
次合入,4 个 changeset(其中 1 个是破坏性的 #29923)的代码进了 18.3.0,但 CHANGELOG
没有它们。发布页的「Release facts」里已经点名了这 4 个,但破坏性那条不在需手动处理列表里,也没写出实际的拒绝码。
- **风险与回滚:** 只改两份文档,无代码、无 changeset、无 workflow
改动。没有加守卫:`scripts/release-pending-publish.mjs` 里 #23818 已测量过 main 约每 20
分钟一次带 changeset 的合入,拒绝过期 PR 的检查几乎会拦住每次发版,所以选运行手册步骤。回滚 = revert。
- **先看:** `content/docs/releases/v18/18-3.mdx` 新增的那条(约第 283 行起),以及
`docs/releases-maintenance.md` 的「The cut, in order」三步。
- **两分钟验证:** 在完整 clone 上跑 `node scripts/release-pending-publish.mjs
unconsumed --version-commit 83d7e4a --version 18.3.0`,预期列出 4 个
changeset;第 1 步的命令换成 `git merge-base 72d7db0 b1c4119`(#26517 的
head)后同样列出这 4 个文件。
- **需要你做的:** 无,席位审阅落地(文档 PR,`skip-changeset`)。
Clause-②: no
Metadata-protocol: none
## What changes
- **`content/docs/releases/v18/18-3.mdx`.** Under 需手动处理 › *Metadata the
build, lint and save doors now refuse*, the count line now says "8
entries, and one more that 18.3.0 ships with no entry in its
CHANGELOGs", followed by a bullet for #29923: the sites (validation rule
`condition` / `when`, `requiredWhen`, `readonlyWhen`, option
`visibleWhen`, hook `condition`), the before and after (18.2.0 published
with an `expression-invalid` warning and then refused every write it
could not evaluate; 18.3.0 refuses at `os validate`, `os build`, the
object save door and publish at `severity: error`), the refusal it
carries (`type-mismatch` with `params.outcome: 'fail-closed'`, the same
on MCP `validate_expression` for `site: 'validation'`), the remedy, the
upgrade-guide entry `validation-type-mismatch-refused`, and that `main`
serves it as `type-mismatch-fail-closed` since #29953. The *Release
facts* note that already named the four leaked changesets now points to
that bullet. The counts the page takes from the CHANGELOGs (8, 264,
1,379) are unchanged, because the entry is not in them.
- **`docs/releases-maintenance.md`.** *Cutting a GA release* gains "The
cut, in order": (1) list the changesets `main` gained since the Version
Packages PR's branch point, with the command, and refresh until the list
is empty; (2) the existing wait for a nearer `CI` run; (3) confirm the
version commit left zero changesets pending (the Release run's
`Changesets:` summary, or `unconsumed` on a full clone), and name any
leak in the curated page, a breaking one under 需手动处理. It says why this
is a step and not a check, with the 18.3.0 measurement. The stale
"#4935" in the *First, check* paragraph becomes "the Version Packages
PR".
## Why
### The CHANGELOG question
`docs/releases-maintenance.md` says the per-package `CHANGELOG.md` files
are generated and never hand-edited, and that the curated page is where
the platform narrative lives. The CHANGELOG half of the erratum is
already automatic: the root `version` script runs
`release-pending-publish.mjs annotate-shipped` before `changeset
version`, so the next cut renders each of these four entries with a lead
line `**Shipped in 18.3.0**, whose CHANGELOG missed this entry; listed
here one release late.` (as 18.3.0 did for four of 18.2.0's). So this PR
edits no CHANGELOG and no pending changeset.
### Every changeset 18.3.0 skipped
Measured with `git log --diff-filter=A --format=%H -1 origin/main --
<f>` and `git merge-base --is-ancestor <sha> 83d7e4a` over all 43
pending `.changeset/*.md` on `main` at `c618e890`. Four are ancestors of
the cut. `node scripts/release-pending-publish.mjs unconsumed
--version-commit 83d7e4a --version 18.3.0` (full clone) names the same
four:
| Changeset | Added by | Operator-visible | On the 18.3 page |
| :--- | :--- | :--- | :--- |
| `29904-type-mismatch-fail-closed.md` | `4c2cd29a` (#29923) | yes,
breaking: publish refuses what 18.2.0 accepted | Release facts note,
sweep table, upgrade checklist step 2; **now also under 需手动处理 with the
served refusal (this PR)** |
| `29903-base-export-without-pair-extension.md` | `5f474102` (#29930) |
yes: a base's own export no longer carries its `.custom` pair's
extension | Release facts note and sweep table (since #29938) |
| `password-reset-revocation-trail.md` | `7b2bb668` (#29921) | yes: a
self-service reset keeps and stamps `sys_session` rows (`revoke_reason:
password_reset`) instead of deleting them | Release facts note (since
#29938) |
| `org-admin-removal-caller-read.md` | `72d7db03` (#29932) | yes: an org
admin's refused removal answers the same 403 for an unreadable row as
for a missing one | Release facts note (since #29938) |
The three non-breaking ones need no further line: each is a fix that
declares no breaking change and no protocol kind, which the page's 其他修复
section counts but does not list, and the *Release facts* note already
names each with its commit. None of them is in the 其他修复 counts, which
come from the CHANGELOGs.
### Why #26517 merged stale
`83d7e4ae` is the squash of #26517 onto `72d7db03`. The PR's head
`b1c4119e` (committed 13:39Z) has parent `40a35ded` (#29922, 13:07Z).
`git log --first-parent 40a35de..72d7db0` is five landings: `7b2bb668`
(#29921), `4c2cd29a` (#29923), `242665f1` (#29931, a checklist edit),
`5f474102` (#29930), `72d7db03` (#29932). `git diff --name-only
--diff-filter=A 40a35de 72d7db0 -- .changeset/` lists exactly the four
changesets above. The PR was merged at 14:44Z without another refresh.
The runbook already said to check the PR is current, but gave no
command; the Release run's `unconsumed` report did warn "Name them in
the 18.3.0 release notes", and #29938 named them, but only in the facts
note.
### Guard or runbook step
Runbook step. `scripts/release-pending-publish.mjs` (under
`annotate-shipped`, #23818) records why refusing a stale Version
Packages PR is not the remedy: `main` took a changeset-bearing landing
about every twenty minutes (77 of 111 landings in 24 h), so such a check
would refuse nearly every cut. The repo answers the leak with
`unconsumed` (report) and `annotate-shipped` (next CHANGELOG). The order
allows a guard only if it would not block the release flow on false
positives; this one would block on true positives almost every time, so
this PR adds no check and no `.github/workflows/**` edit.
## Verification
Gates from `node scripts/pm/dispatch-gates.mjs --commands` for this
change set, run at `d7feeed3` after a `turbo run build` of
`@objectstack/formula`, `@objectstack/lint` and `@objectstack/spec`:
**51 derived, 51 run, all exit 0**; `dispatch-gates --ran`: "51 derived,
51 run, 0 NOT-MEASURED, 0 UNRUN", exit 0. One family,
`check:skill-examples`, exited 3 on the first pass
(`packages/client-react/dist` not built, nothing measured); after `turbo
run build --filter=@objectstack/client-react...` it exited 0 (283
examples). Among them: `check:doc-anchors`, `check:doc-authoring`,
`check:release-section-coverage` (plain, `--strict`, `--self-test`),
`check:closed-ceremony-text`, `check:issue-citations`,
`check-adr-links`.
The step-1 command, replayed on 18.3.0 (`origin/main` → `72d7db03`,
`origin/changeset-release/main` → `b1c4119e`): merge base `40a35ded`,
four files listed. Anti-no-op: the same diff from `72d7db03` to itself
lists zero.
`content/docs/releases/` is release-owned (AGENTS.md); this is the
dedicated docs-only PR AGENTS.md prescribes for a factual gap on a
releases page, with no code riding along. Changeset: none
(`skip-changeset`), docs only.
## Human Minimum
- [x] 1. Schemas start as Zod; `packages/spec` holds no runtime logic.
(not touched)
- [x] 2. Every name I added uses the casing for its kind. (none added)
- [x] 3. No formatter ran. No code changed, so `pnpm lint` has nothing
new to judge.
- [x] 4. One issue, one branch off an up-to-date `main`, one pull
request.
- [x] 5. A change that publishes carries a changeset, and both
declaration lines are filled in here and in the changeset. (publishes
nothing)
- [x] 6. `packages/spec` touched: its generated artifacts are
regenerated and committed. (not touched)
- [ ] 7. No hand edits to `content/docs/references/`,
`packages/*/CHANGELOG.md` or `content/docs/releases/`. Edits
`content/docs/releases/v18/18-3.mdx` as a docs-only erratum PR, per
AGENTS.md's "factual error on a releases page → dedicated docs-only PR".
- [x] 8. Title, body and comments are in English. (the 维护者速读 block is
the dispatch convention)
- [x] The *Before Submitting* list in CONTRIBUTING.md is done.
🤖 Generated with [Claude Code](https://claude.com/claude-code)
https://claude.ai/code/session_01WGufziWtqgnT2f4C6ThaSM
Co-authored-by: Claude <noreply@anthropic.com>1 parent 8d5aab3 commit 318bc76
2 files changed
Lines changed: 62 additions & 6 deletions
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
121 | 121 | | |
122 | 122 | | |
123 | 123 | | |
124 | | - | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
125 | 128 | | |
126 | 129 | | |
127 | 130 | | |
| |||
280 | 283 | | |
281 | 284 | | |
282 | 285 | | |
283 | | - | |
| 286 | + | |
| 287 | + | |
| 288 | + | |
| 289 | + | |
| 290 | + | |
| 291 | + | |
| 292 | + | |
| 293 | + | |
| 294 | + | |
| 295 | + | |
| 296 | + | |
| 297 | + | |
| 298 | + | |
| 299 | + | |
| 300 | + | |
| 301 | + | |
| 302 | + | |
| 303 | + | |
| 304 | + | |
| 305 | + | |
284 | 306 | | |
285 | 307 | | |
286 | 308 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
231 | 231 | | |
232 | 232 | | |
233 | 233 | | |
234 | | - | |
235 | | - | |
236 | | - | |
237 | | - | |
| 234 | + | |
| 235 | + | |
| 236 | + | |
| 237 | + | |
| 238 | + | |
| 239 | + | |
| 240 | + | |
| 241 | + | |
| 242 | + | |
| 243 | + | |
| 244 | + | |
| 245 | + | |
| 246 | + | |
| 247 | + | |
| 248 | + | |
| 249 | + | |
| 250 | + | |
| 251 | + | |
| 252 | + | |
| 253 | + | |
| 254 | + | |
| 255 | + | |
| 256 | + | |
| 257 | + | |
| 258 | + | |
| 259 | + | |
| 260 | + | |
| 261 | + | |
| 262 | + | |
| 263 | + | |
| 264 | + | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
238 | 272 | | |
239 | 273 | | |
240 | 274 | | |
| |||
0 commit comments