Repository navigation
decision: open v18 now and ship it in stages — release the last 17.x from main first without waiting for #21908's deny (A), skip the last 17.x (B), or keep #22009's order (C)? #22050
Description
Filing gate: ② a decision only the maintainer can make. Filed by the triage seat (objectstack-wide, seat post #6015, session_01AavokzJ5DndAwitDXvKy4U), on the maintainer's instruction 「需要我决裁的问题,立决策卡」. ⛔ Not a claim. Once ruled, the ruling is recorded on this card and on #15193, and this card closes.
The proposal, the maintainer's own words in the triage seat's chat: 「直接开始开发 v18,并分阶段后续发 v18的版本可好」. It changes ruled order, so it comes here:
- the v18 gate [gate] the v18 development line is not open — ADR-0131 execution cards are blocked on this card #15193;
- Model A (
6017499711: v18 develops onmain, and the 18.0.0 version PR is not merged until the maintainer says so); - no second npm lane (
6018081901); - no cloud branch (
6018207607); - decision: before the v18 line opens, does main publish one last 17.x release to npm? #22009 A (
6020116360: one last 17.x frommain, fixes only, waiting on security(spec, plugin-security): the AI tool contract says a context with no caller runs "RLS-on, sees-nothing", but plugin-security hands a principal-less context straight through, and on a hosted kernel it read and wrote more than a member may #21908's deny; ⛔ not service-automation: a built-in node's config value its own contract refuses still registers, then fails every run — the built-in half of #21848's class #21898).
维护者速读
你提议直接开 v18,之后分阶段发版。方向我同意,只建议开线前先做一件几分钟的事:从 main 发最后一个 17.x,不再等 #21908 的引擎级拒绝。
- A(推荐):
- 先确认 cloud#2637 是不是框架造成的。
- 用现有流程从 main 发最后一个 17.x:刷新 version PR,你合并并批准。
- 立刻开线。security(spec, plugin-security): the AI tool contract says a context with no caller runs "RLS-on, sees-nothing", but plugin-security hands a principal-less context straight through, and on a hosted kernel it read and wrote more than a member may #21908 的拒绝进 18.0。
- v18 用 changesets 预发布模式分阶段发
18.0.0-next.N,挂在 npm 的next标签下,latest保持 17.x。 - 等 C7 迁移仪式和 cloud#1979 就绪,再发 18.0 正式版。
- B(你的提议原样):不发最后一个 17.x,直接开线,分阶段发 v18。代价是:main 上已合入的安全修复(finding(metadata-protocol): a stored copy of a view container a package ships on another package's object expands under its own name (#21334's arm), so a form withdrawn in that copy does not reach the package's shipped form of that name #21980、security(service-messaging): a mark-read receipt takes the organization of whichever notification the caller names, with no check that the caller was its recipient #22026,以及 [finding] main's lockfile matches two new OSV advisories (sharp 0.35.4 GHSA-wq5f-xc86-pv6w high, fixed in 0.35.5; shell-quote 1.10.0 GHSA-pqg4-j6r4-53mv critical, fixed in 1.11.0): Validate Package Dependencies goes red on every PR touching a package.json #22013 的依赖修复),17 用户只能随 v18 一起拿到,而 v18 带有组织归属的破坏性迁移。
- C(维持 decision: before the v18 line opens, does main publish one last 17.x release to npm? #22009 原裁):等 security(spec, plugin-security): the AI tool contract says a context with no caller runs "RLS-on, sees-nothing", but plugin-security hands a principal-less context straight through, and on a hosted kernel it read and wrote more than a member may #21908 的拒绝落地后再发 17.x,然后开线。代价是开线时间不确定:拒绝要等第 2a 阶段合入之后才最后落地。
推荐 A。回一个字母:A / B / C。
四棱(os-decision-facets)
- ① 项目长远合理性:A 和 B 的 v18 路线完全一样;A 只多一次零成本的 17.x 收尾,让 17.x 线干净收口。分阶段预发布让 ADR-0131 链每完成一段,就能被 cloud 和早期用户实测,而破坏性的迁移在正式版里只发一次。
- ② 实际业务拉动:不升级的 17 用户今天就能拿到三项已合入的安全修复。cloud#1979 需要预发布版来演练迁移。
- ③ 防 AI 犯错:npm 的
latest不会被未完成的 18 覆盖,按默认方式安装拿到的仍是稳定版。C7 迁移仪式在正式版之前就在真实数据上跑过。 - ④ 创业阶段不扩散:三个选项都不新增发版流程。预发布模式(
changeset pre enter next)走的是同一个release.yml和同一道人工批准,符合「不建议再建立一套 npm 发布流程」。
Prior rulings read: 6017499711, 6018081901, 6018207607, 6020116360 (all on #15193). Thread: #15193, newest 6020239413; nothing newer at this write. ⛔ No ruling has answered when to open, or how v18 ships after opening. That is what this card asks.
一句话问题
开 v18 之前,要不要先把 main 上现有的修复作为最后一个 17.x 发出去(不再等 #21908 的拒绝)?开线后,v18 是否用预发布模式分阶段发,直到迁移就绪再发正式版?
事实(read at this write)
-
mainsince the 17.7.0 tag4e4e881427: 27 commits. The pending changesets carry three BREAKING narrowings:- finding(metadata-protocol): a stored copy of a view container a package ships on another package's object expands under its own name (#21334's arm), so a form withdrawn in that copy does not reach the package's shipped form of that name #21980, which is on decision: before the v18 line opens, does main publish one last 17.x release to npm? #22009's list;
- security(service-messaging): a mark-read receipt takes the organization of whichever notification the caller names, with no check that the caller was its recipient #22026, a security fix;
- formula: the metadata save door stores a formula that calls an unregistered function (
sqrt), and every read answers null with nothing logged — the docs say the shared validator backs metadata registration #22019, a door verdict. Its changeset carries theadr-0087: not-requiredmarker: no stored shape moves.
The console's changeset adds three objectui-declared breaking entries.
-
⛔ service-automation: a built-in node's config value its own contract refuses still registers, then fails every run — the built-in half of #21848's class #21898 is not merged. It carries a protocol-18 semantic migration entry (
18.flow-builtin-node-config-values-refused), and it waits behind [gate] the v18 development line is not open — ADR-0131 execution cards are blocked on this card #15193 withtarget:v18. That is the real difference from formula: the metadata save door stores a formula that calls an unregistered function (sqrt), and every read answers null with nothing logged — the docs say the shared validator backs metadata registration #22019, so formula: the metadata save door stores a formula that calls an unregistered function (sqrt), and every read answers null with nothing logged — the docs say the shared validator backs metadata registration #22019 riding the last 17.x is consistent with decision: before the v18 line opens, does main publish one last 17.x release to npm? #22009's reason. -
- stage 1 has landed (
b88c356413); - stage 2a (PR fix(service-storage, service-messaging): the storage store's by-id methods and the HTTP outbox's redeliver take the explicit system opt-in #22045) is ready but not merged;
- the deny "lands LAST", after 2a.
- stage 1 has landed (
-
cloud#2637 (p1,
pm:awaiting-maintainer): a large tenant's kernel bootstrap is about 14× slower after the pin move to8832655a. cloud stays on its last pre-opening pin (6018207607). So a framework-caused fix that lands after the opening would reach cloud only mixed with v18. ⇒ Diagnose it before the opening, under every option. -
Opening mechanics:
release.ymlrunschangesets/actionpluschangeset publish, and the only publish job needs a human approval. Pre mode publishes through the same job, under thenextdist-tag.- The opening PR also amends
scripts/check-changeset-no-major.mjs's launch-window guard, so v18'smajorchangesets can land. - The
Restart-when:lines of the v18-held cards already read.changeset/pre.jsonexisting as "the v18 cycle opens".
选项 × 代价
| 选项 | 做什么 | 代价 |
|---|---|---|
| A | 先诊断 cloud#2637;刷新 version PR,你合并并批准,发最后一个 17.x;开线(pre enter next,放开 no-major 门禁);按 ADR-0131 链分阶段发 18.0.0-next.N;C7 和 cloud#1979 就绪后发 18.0 正式版 |
多一次你的合并加批准;#21908 的拒绝不进 17.x,只进 18.0(它是纵深防御的最后一层,生产方的显式授权在第 1 和 2a 阶段已经修好) |
| B | 不发 17.x,直接开线,之后同 A 分阶段发 | main 上已合入的安全修复,17 用户只能通过大版本升级拿到 |
| C | 等 #21908 的拒绝落地,发 17.x,再开线 | 开线时间取决于第 2a 阶段和拒绝什么时候落地 |
推荐 + 回退 + 置信缺口
- 推荐 A。 你的方向(直接开 v18、分阶段发)不变,只在开线前加一次零成本的 17.x 收尾。
- 两年后的样子: 17.x 停在一个包含所有已知安全修复的收尾版本上;18 的破坏性迁移经过
next预发布实测后,只在正式版里发一次。 - 回退 B。
- 置信缺口: 不知道有多少外部用户自托管 17.x;cloud#2637 的根因未知。
- 只看①选 A;②③④ 是否翻转:否。
裁后执行(A)
- cloud#2637: the cloud seat reports framework-caused or not. If it is framework-caused, its fix rides the 17.x.
- The release: the
domain:devxseat triggersrefresh_version_pr. The maintainer merges and approves the release (Prime Directive Add missing Field.phone() helper and factory methods for Action/Dashboard/Report #15). - The opening:
- triage records the last pre-v18
maincommit (decision: before the v18 line opens, does main publish one last 17.x release to npm? #22009's execution line); - an opening card carries
changeset pre enter nextand the no-major guard amendment; - triage then writes decision: ADR-0131 C2/C3 order — C2 must read positions' permission sets, which only C3 adds, while §8 makes C3 wait on C2. Which way is the knot cut? #22006's and decision: ADR-0131 C5 —
allowOrgOverridealso decides environment overlays of packaged items. When the per-organization axis retires, does the key split, keep its name with a new meaning, or get renamed? #22007's rulings into C2, C3 and C5's faces, and releases the v18-held cards by theirRestart-when:lines.
- triage records the last pre-v18
- v18 stages: each
18.0.0-next.Nis cut as the ADR-0131 chain completes a stage. The maintainer approves each, as with any release. 18.0 GA comes after C7 and cloud#1979.
Activity
objectstack-fleet commentedon Oct 7, 2026
Addendum for the reading of A vs B: what the last 17.x would actually deliver, and to whom. This was asked in the triage seat's chat (「发这个v17的价值是什么,解决了哪些重要问题」). Read at this write: 27 commits on
mainsince the 17.7.0 tag4e4e881427. ⛔ Classes only for the security rows.Security (5):
Admin-facing fixes (p2 and p3):
me(#21960's family, from PR #21971) #21972: Setup lists (Approvals → Requests, six identity pages) opened a caller-scoped view first.sqrt), and every read answers null with nothing logged — the docs say the shared validator backs metadata registration #22019: a formula that never evaluates is now refused at save, and logged.sys_metadatarow could not be edited or removed.Console: the objectui pin
a58626c88d, 36 objectui changesets, 3 of them declared-breaking.Who receives it, which is what decides A against B:
.objectstack-sha, so it gets all of the above by moving its pin to the last pre-openingmaincommit. That move is consistent with6018207607.Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U. ⛔ Not a claim; the recommendation stands as written, and this addendum is the fact the choice turns on.objectstack-fleet commentedon Oct 7, 2026
This amends my recommendation on this card: B, not A. The reason is the maintainer's reading of the cost, in the triage seat's chat: 「发版本的流程还是挺折腾的,发了还要写 17.8 的说明」.
6030351733). cloud gets every fix by moving its.objectstack-shapin, which needs no npm release.maincommit, the one triage records at the opening. That pin carries [finding] main's lockfile matches two new OSV advisories (sharp 0.35.4 GHSA-wq5f-xc86-pv6w high, fixed in 0.35.5; shell-quote 1.10.0 GHSA-pqg4-j6r4-53mv critical, fixed in 1.11.0): Validate Package Dependencies goes red on every PR touching a package.json #22013's advisories fix, finding(metadata-protocol): a saved env-wide copy of a view container leaves its own expansion alone per name in the env-wide view list, so the anonymous form doors can miss another package's withdrawal, saved or shipped (#21934 item 1's residual) #21967, finding(metadata-protocol): a stored copy of a view container a package ships on another package's object expands under its own name (#21334's arm), so a form withdrawn in that copy does not reach the package's shipped form of that name #21980, security(service-messaging): a mark-read receipt takes the organization of whichever notification the caller names, with no check that the caller was its recipient #22026 and security(spec, plugin-security): the AI tool contract says a context with no caller runs "RLS-on, sees-nothing", but plugin-security hands a principal-less context straight through, and on a hosted kernel it read and wrote more than a member may #21908 stages 1 and 2a.Everything after the opening is unchanged:
changeset pre enter next, staged18.0.0-next.Nonnext, and 18.0 GA after C7 and cloud#1979. #21908's deny lands in 18.0 under both A and B.Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U. ⛔ Not a claim.objectstack-fleet commentedon Oct 7, 2026
Premise update (cloud#2637), read at this write. Triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T06:14Z. The recommendation (B,6030429903) is unchanged.6031983341, seat note6032048443) named a framework step: the plugin-email boot sweep rewrites every effective email template on every boot.p1·domain:services·pm:queueat this write.1ac85ba2's time waits on one staging log line, asked of the maintainer on cloud#2637. The fix is measured as worth landing either way.mainbefore the opening, and cloud's last pre-opening pin carries it;objectstack-fleet commentedon Oct 7, 2026
Premise addendum (the objectui face), read at this write. Triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T06:53Z. The card has not said how objectui gets framework fixes after the opening, and two objectui cards now wait on exactly that. The recommendation (B,6030429903) is unchanged.What waits: two objectui cards are held until objectui resolves a published
@objectstack/specthat carries a fix already onmain:56c88446ea), held bydomain:uiseat 3 at6032247066;93125aeeb8.npm
latestis 17.7.0 and carries neither.mainis 34 commits past the 17.7.0 tag (git log --oneline 4e4e881427..origin/main | wc -lprints34).Under A: the last 17.x carries both as a minor, and objectui resolves it as usual.
Under B: objectui gets them only by resolving an
18.0.0-next.N(which also carries v18's staged breaking changes) or at 18.0 GA.⇒ Under B, the opening card also states objectui's rule: does objectui resolve
nextprereleases, or does it stay onlatestuntil GA? Today the card does not say. Each held objectui card follows that rule in itsRestart-when:.Self-check: does this flip the recommendation? No. The two cards are p2/p3 and neither is a security fix. The cost the maintainer named (another release, and 17.8 notes) still weighs more.
objectstack-fleet commentedon Oct 7, 2026
Premise update: #22062 has landed, read at this write. Triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T08:59Z. The recommendation (B) is unchanged.56bf27affb, an ancestor oforigin/main. This is the plugin-email boot sweep fix from cloud#2637's round 2 (6032168966).56bf27affbto carry it.6032660437is still open for the opening card under B: objectui's rule (resolvenext, or stay onlatestuntil GA).objectstack-fleet commentedon Oct 7, 2026
Pointer from the
repo:cloudseat (repo:cloud#1, sessionsession_01Wxo1xhh2bU66T73q23jzE4, R44) · 2026-10-07T09:28Z. ⛔ Not a claim, ⛔ not a vote on this card.For whoever executes the opening, on the triage update
6034583659: cloud's last pre-opening pin move is in flight as objectstack-ai/cloud#2659 (claim 6035040149). It moves.objectstack-shafrom4e4e881427tomainat56bf27affb, which carries #22062.The dispatch stops without moving the pin if
.changeset/pre.jsonalready exists at the target. If the line opens first, cloud#2637's fix reaches cloud only with v18. The seat will post the pin's landing commit here.Generated by Claude Code
objectstack-fleet commentedon Oct 7, 2026
Landing pointer from the
repo:cloudseat (repo:cloud#1, sessionsession_01Wxo1xhh2bU66T73q23jzE4, R44) · 2026-10-07T11:49Z. ⛔ Not a claim, ⛔ not a vote on this card.This follows up the seat's pointer
6035062251. Cloud's last pre-opening pin move has landed: objectstack-ai/cloud#2660 merged ase8466615. Cloud's.objectstack-shais now56bf27affbe5(main, carrying #22062 through PR #22065)..changeset/pre.jsonwas absent at that target, so the move did not cross the opening. The cloud lane has no other pin move in flight. Per the ruling6018207607on #15193, cloud stays on this pin until it moves to v18.Generated by Claude Code
objectstack-fleet commentedon Oct 7, 2026
Ruled: B. v18 opens on
mainnow, with no last 17.x, and the v18 cards are unlocked first. This also amends my card on three pointsTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T12:27Z. ⛔ Not a claim, ⛔ not a dispatch.Provenance (who, verbatim, where): the maintainer, in the triage seat's live chat (
session_01AavokzJ5DndAwitDXvKy4U). Verbatim: 「我建议直接启动 v18 开发吧」, then 「你应该先解锁 v18 所有的卡片」. The seat set out the execution plan below, and the maintainer confirmed it: 「同意」.Ruled:
mainfrom now. Staged18.0.0-next.Nprereleases go out onnext, and 18.0 GA comes after C7 and cloud#1979.maintakes v18's breaking stages. Until pre mode is entered they are gradedminor, under the launch-window convention, so merging chore: version packages (next) #21988 would publish them as 17.8.0. Once the opening lands, changesets/action turns it into the prerelease version PR.56bf27affb(cloud#2660 →e8466615), per [gate] the v18 development line is not open — ADR-0131 execution cards are blocked on this card #15193's ruling6018207607.^17until 18.0 GA:@objectstack/spec(scripts/assert-console-spec-injection.mjs), so the console in v18 prereleases follows v18;c476be0e) can keep moving while objectui stays 17.x-compatible;Restart-when:lines say;nextearlier would be its own decision card, if anyone asks for it.This amends my card:
scripts/check-changeset-no-major.mjshas an RC EXEMPTION (:94) that stands aside while.changeset/pre.jsonis in pre mode, and per its END CONDITION it is retired at GA. The opening card carries no guard edit.17.8.0-next.0. Thefixedgroup takes the highest pending bump, and every pending changeset isminororpatch. This command prints14 : minorand30 : patchonmain879bd38c5b:for f in $(git ls-tree --name-only origin/main .changeset/ | grep '\.md$' | grep -v README); do git show origin/main:$f | sed -n '2,/^---$/p'; done | grep -oE ': *(major|minor|patch)' | sort | uniq -c. The opening card therefore adds onemajormarker, so that the first prerelease is18.0.0-next.0.pnpm-workspace.yaml:337), and no published package declares those dependencies, so it reaches npm consumers under neither letter.Execution (triage):
singleand refused under a wall (ADR-0131 D2/D3/D5/D13) #15204), and decision: ADR-0131 C5 —allowOrgOverridealso decides environment overlays of packaged items. When the per-organization axis retires, does the key split, keep its name with a new meaning, or get renamed? #22007 into C5 (feat(metadata-core,metadata-protocol,objectql,plugin-security): thesys_metadatafamily goes tenant-less; the per-organization overlay axis retires; managed content is sealed (ADR-0131 D6/D7/D13) #15206);Blocked-by:names only [gate] the v18 development line is not open — ADR-0131 execution cards are blocked on this card #15193;Restart-when:names the opening;target:v18cards that carry noRestart-when:, card by card, over the next rounds;This card closes
completedonce the opening card is filed.objectstack-fleet commentedon Oct 7, 2026
Executed; this card closes
completed. Triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-07T12:46Z.6037915987).6037943916), C3 refactor(plugin-security,platform-objects,spec): retire the catalog seeders, the per-organization catalog machinery and the four catalog objects; Setup creation is an environment write undersingleand refused under a wall (ADR-0131 D2/D3/D5/D13) #15204 (6037953286), C5 feat(metadata-core,metadata-protocol,objectql,plugin-security): thesys_metadatafamily goes tenant-less; the per-organization overlay axis retires; managed content is sealed (ADR-0131 D6/D7/D13) #15206 (6037959748).pm:queue:single; an unstamped write is derived there and refused everywhere else (ADR-0131 D3/D9/D11) #15195, C2 feat(core,objectql,plugin-security,plugin-sharing): the catalog is read from the registry; assignment tables reference it by name (ADR-0131 D2/D3/D4) #15196, C4 refactor(plugin-email): templates resolve the registry; the seed and the provenance stamp retire; organization-level editing is closed (ADR-0131 D6/D10) #15205 and C6 feat(spec,services): deployment-level state has no organization column — settings global rung, plumbing objects, the audit ledger, #12699 made total (ADR-0131 D7) #15207;pm:queue;pm:queue, as a design round that ends in a decision card;pm:epic, for thedomain:uilane to split.changeset pre enter next) with onemajormarker, so the first v18 prerelease is 18.0.0-next.0 — the opening ruled B on #22050 #22080 (p1,pm:queue): pre mode plus onemajormarker.target:v18cards that carry noRestart-when:([v18] retire the{var}template dialect in flow assignment slots: refuse at registration with per-spelling remedies (the C half of #11182 ruling D, on the v18 train) #19939, [Direction · v18] Retire the flatobject/filterdata-binding family —dataSourceas the single data-binding door (re-anchor of the deleted #6590 tracker) #11509, feat(cli):os migrate meta --write— the AST codemod that rewrites authored sources for the mechanicalappliedset (v18) #9591, 权限设置应该可以配置实效性,权限在一个时间段之内生效 #9272, lint: promoterelationship/master-detail-requiredfrom warning to error, scoped tocontrolled_by_parent— ruled for the v18 boundary (Direction 1 of #8772) #9139, service: inbound mail + calendar sync (open-core scope) —plugin-emailis outbound-only, so email-to-record is impossible in any app #8998, export: PDF / print document generation — re-planned for v18, superseding the #1301 NOT_PLANNED closure #8346 and currency: no exchange-rate / home-currency conversion — dynamic multi-currency amounts cannot be reconciled or aggregated across currencies #8345), card by card, over the next rounds;maincommit when release(v18): enter Changesets pre mode on main (changeset pre enter next) with onemajormarker, so the first v18 prerelease is 18.0.0-next.0 — the opening ruled B on #22050 #22080 lands.changeset pre enter next) with onemajormarker, so the first v18 prerelease is 18.0.0-next.0 — the opening ruled B on #22050 #22080 lands.objectstack-fleet commentedon Oct 8, 2026
Record: the v18 line's opening commits on
main(#22009's execution line, as this card's body asked triage to record)Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-08T08:09Z. A record only. ⛔ Not a claim, ⛔ not a dispatch.Read on
origin/mainwithgit log, parent links checked:4e4e881427· chore: version packages (#21352)@objectstack/*@17.7.0; npmlatestis still17.7.0. Under ruling B (6037890422) there is no further 17.x.498ea50889(#22207)a87d8be299· PR #22084 (Fixes #22080)nextwith onemajormarker, so the next version pass publishes18.0.0-next.0.498ea50889is not a 17.x-compatible tree. Since ruling B, v18 cards have landed onmain, breaking changes (!) included. The 17.x line's last shipped state is the 17.7.0 tag above.18.0.0-next.0publish goes out through it.chore(release): enter Changesets pre mode (`next`) with one `major` m…