Skip to content

Commit 514a422

Browse files
docs(adr): ADR-0146 amended in place — an upgrade plan may report a .custom override that hides a vendor change, as advice only (#30899)
Fixes #30881 Clause-②: no Metadata-protocol: none ## 维护者速读 - **改了什么**:只改 ADR-0146 的文字(就地修订,状态行加一条 2026-11-06 的「Amended in place」):允许基础包的升级预览(upgrade plan)给出一条**提示**,列出「这个 `.custom` 覆盖挡住了本次升级对同名项的修改」,以及 `basedOn` 与已安装版本不一致的覆盖。 - **为什么改**:执行你在 cloud#3652 上对 D2 的裁决「修订为允许只提示(推荐)」;原文写死了「不产出升级差异、`basedOn` 不被读取」,挡住了后续的漂移提示卡(#30886)。 - **风险与回滚**:零运行时风险,没有代码、spec 或文档站改动;`basedOn` 仍然「只记录、永不拦截」,不拒绝安装、不自动合并、不自动 rebase。回滚 = revert 这一个提交。 - **先看**:`docs/adr/0146-…md` 的 D2 段(`basedOn` 那一句,风险最高:它定义了提示的两种情形 a/b);其次 D6 的「Not done」一条和 Consequences 第三条。 - **两分钟验证**:`git diff origin/main -- docs/adr/0146-*` 应只见 7 处文字改动 + 1 条 Refs;`pnpm check:adr-index` 应打印 `docs/adr/README.md is current`。 - **需要你做的**:审阅后亲手合并(Tier H,草稿状态,席位不会转 ready、不入队、不开 auto-merge)。 ## What changes ADR-0146 is amended in place for decision D2 on epic objectstack-ai/cloud#3652 (ruling record [`6681380041`](objectstack-ai/cloud#3652 (comment)), maintainer, verbatim: 「修订为允许只提示(推荐)」). A base's upgrade plan may list, as advisory findings, (a) a `.custom` item whose declared override names a base item the upgrade changes, and (b) an override whose `basedOn` is not the installed base's `manifest.version`. `basedOn` stays recorded and never gates: no refusal, no token, no automatic merge, rebase or rewrite. Whole-document replace, ADR-0141 D3's deferral and merge question 1's `^MAJOR` reasoning are unchanged. The diff touches only `docs/adr/0146-studio-designs-setup-administers-one-editor-per-item-paired-customize-package.md`. `pnpm adr:index` was regenerated and wrote a byte-identical `docs/adr/README.md` (the index shows a truncated status prefix, which this amendment does not reach), so the README is not in the diff. ### Before / after of each amended sentence | Passage (line on `d55acb78`) | Before | After | |:---|:---|:---| | Status line (`:23`, appended) | (no 2026-11-06 note) | "· **Amended in place** (2026-11-06, decision D2 on epic objectstack-ai/cloud#3652, ruling record `6681380041`, maintainer, verbatim: 「修订为允许只提示(推荐)」): a base's upgrade plan may report, as advice, each `.custom` override that hides a vendor change; `basedOn` still never gates, and nothing is refused, merged or rebased on the finding (D2, D6, the Supersede table's §9 row, Consequences, merge question 2). It lands by the maintainer's hand-merge of the PR cut from #30881." | | D2 (`:210-212`) | "**`basedOn` is recorded, not judged**: no door compares it with the installed base's version, no upgrade diff is produced, and nothing is refused on it (epic #28236, …recorded only)." | "**`basedOn` is recorded and never gates** (epic #28236, …recorded only). **One reader is admitted, as advice** (amended 2026-11-06, …): a base's **upgrade plan** … may list as advisory findings (a) a `.custom` item whose declared override names a base item the upgrade changes between the installed and the new version ("this override hides a vendor change"), and (b) an override whose `basedOn` is not the installed base's `manifest.version`. On either finding no door refuses, no token is asked, and nothing is merged, rebased or rewritten automatically; the upgrade proceeds as it would without it, and re-basing stays the customer's act. The plan carries both findings in an **advisory class** that its refusal never reads and that no finding-set token covers, so neither becomes a gate by sharing a response with a refusing finding. The finding is not the base-upgrade interception ADR-0141 D3 defers, because it refuses nothing, and D3's `^MAJOR` reasoning (merge question 1) is unchanged." | | D2, §9 lift (`:262`) | "**Diff-vs-base and the upgrade skip-report stay deferred**" | "**The advisory upgrade finding above is chartered; a field-level diff-vs-base view and the upgrade skip-report as a merge tool stay deferred** (amended 2026-11-06)" | | D6 "Not done" (`:393`) — not named by the card | "**No clone lineage, no upgrade diff, no `basedOn` judgement** (D2, D4)." | "**No clone lineage, no field-level upgrade diff, no gate on `basedOn`** (D2, D4) — the upgrade plan's advisory finding (D2, amended 2026-11-06) refuses, merges and rebases nothing." | | Supersede table, ADR-0126 §7.4/§9 row, *Rule now* (`:563`) | "badge, customization list and revert are chartered on served facts, diff-vs-base and the skip-report stay deferred (D2)." | "badge, customization list and revert are chartered on served facts; the upgrade plan's advisory finding is chartered (amended 2026-11-06); a field-level diff-vs-base view and the skip-report as a merge tool stay deferred (D2)." | | Consequences, third bullet (`:600-601`) | "…until the customer re-bases it, and the platform computes no diff to help (D6)." | "…until the customer re-bases it. The base's upgrade plan names each override that now hides a change, as advice (D2, amended 2026-11-06); re-basing stays the customer's act, and the platform computes no field-level diff and merges nothing (D6)." | | Merge question 2 (`:679-681`) | "**`basedOn` is recorded and never judged** — … no card reads `basedOn` as a gate (D2)." | "**`basedOn` is recorded and never gates** — … no card reads `basedOn` as a gate (D2). One reader is admitted, as advice (amended 2026-11-06, …): the upgrade plan's finding of D2, which lists an override whose base item the upgrade changes or whose `basedOn` is not the installed base version, and refuses nothing." | | Refs (appended) | — | a bullet naming card #30881, the ruling record, and the finding's own card #30886 on the upgrade plan of #30884. | Unchanged on purpose: D3's dependency-range bullet ("where `basedOn` is read by a human") and merge question 1 (the `^MAJOR` reasoning), per the card's item 6; the Supersede row's *Gate and pin* column (the finding's code is card #30886's). ## Acceptance notes - **D6's "Not done" bullet was amended although the card does not list it.** Left as written ("no upgrade diff, no `basedOn` judgement") it would contradict the amended D2 inside the same record; the change keeps it as narrow as the ruling (no gate, no field-level diff). - **`scripts/adr-index.mjs` reads header fields from a record's first 40 lines only (`HEADER_WINDOW = 40`).** A status note that pushes `**Supersedes in part**` past line 40 makes the regenerated index silently empty that record's Supersedes cell, and `pnpm check:adr-index` still exits 0 because its `--report` never fails. This PR keeps the status note to 3 lines: ADR-0146's Supersedes line sits at `:38` and its index row is unchanged (zero `docs/adr/README.md` diff after `pnpm adr:index`). The producer fix is #30916, a separate non-governed card, not part of this Tier H PR. - **Quotes of the old sentence elsewhere, listed and not edited:** - Governed: `docs/adr/0126-packaged-metadata-customization-model.md:3` (its status-line pointer: "diff-vs-base and the skip-report stay deferred"); `skills/objectstack-platform/evals/config-plugins-ops.json:169` ("`basedOn` recorded and never judged"). - Not governed, and not the same sentence (they describe today's runtime, where nothing reads `basedOn` yet — editing them before #30886 lands would advertise an undelivered capability): `content/docs/api/metadata-api.mdx:105`, `content/docs/concepts/metadata-lifecycle.mdx:121`. - Generated / code (card #30886's surface): `packages/spec/src/kernel/override-declaration.zod.ts:98`, `:137`, `:141` and the `content/docs/references/**` pages generated from it; `packages/metadata-protocol/src/served-override.ts:35`, `protocol-packaged-base-refusal.ts:1016`. - **Changeset:** none — `docs/adr/**` publishes nothing; `skip-changeset` is declared with this PR. - **Tier H — the maintainer merges.** `docs/adr/**` is a governed surface (Prime Directive #14). This PR stays a draft; no seat readies it, requests review, queues it or arms auto-merge. ## Verification All on head `9647da16` (objectstack), gates from `node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --commands` (the same 21 families as at `561b3b2d`), exit codes captured before any pipe. <details><summary>Derived gate families — 21 of 21 run locally, all exit 0; plus check:pm-governed-prose</summary> ```text 0 | node scripts/check-adr-links.mjs (991 relative link destination(s) under docs/adr/ resolve) 0 | node scripts/check-adr-links.mjs --self-test 0 | node scripts/check-closing-keyword-parity.mjs 0 | node scripts/check-closing-keyword-parity.mjs --self-test 0 | node scripts/check-comment-mask-corpus.mjs 0 | node scripts/ci/plan-test-core-shards.mjs --self-test 0 | pnpm check:adr-anchors 0 | pnpm check:adr-index (docs/adr/README.md is current, every record parsed) 0 | pnpm check:adr-symbol-anchors (3163 anchors across 150 records resolve) 0 | pnpm check:ci-filter-parity 0 | pnpm check:closed-ceremony-text 0 | pnpm check:cross-package-test-inputs 0 | pnpm check:doc-authoring 0 | pnpm check:driver-memory-census 0 | pnpm check:gitlink-declared 0 | pnpm check:nul-bytes (no raw ASCII control bytes) 0 | pnpm check:pm-governed-merges 0 | pnpm check:pm-prior-rulings 0 | pnpm check:refd-timer-probe 0 | pnpm check:watch-hint-literal 0 | pnpm check:pm-governed-prose (card acceptance; 13 registered governed surfaces named) 0 | pnpm --filter @objectstack/lint run check:doc-formula-expressions (first run exit 3, PREREQUISITE NOT MET; re-run after building @objectstack/formula and @objectstack/lint under the verify lock: VERDICT command-exit 0, Tasks 4/4) dispatch-gates --ran: 21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED (a DERIVED zero — all 21 recorded an exit code and none of them is 3). ``` </details> No tests, typecheck or dogfood: the diff touches no package, and the title carries no `!`. --- _Generated by [Claude Code](https://claude.ai/code/session_01Q4EjjRhUZjdy8VXs6Kkur2)_ <!-- signed: repo:cloud#3 · hotlong · session_01Q4EjjRhUZjdy8VXs6Kkur2 --> --------- Co-authored-by: Claude <noreply@anthropic.com>
1 parent 253eab0 commit 514a422

1 file changed

Lines changed: 33 additions & 10 deletions

File tree

‎docs/adr/0146-studio-designs-setup-administers-one-editor-per-item-paired-customize-package.md‎

Lines changed: 33 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ declaration to any package in the closure is withdrawn, and a dependent's same-n
2121
[`6549129352`](https://github.com/objectstack-ai/objectstack/issues/28404#issuecomment-6549129352) on #28404, follow-up c);
2222
[D9](#d9)'s `action` paragraph reads the landed ledger switch; the [Consequences](#consequences) carry the base-upgrade
2323
displacement cost. The amendment lands as the rewrite did — by the maintainer's hand-merge of the PR cut from #28390.
24+
· **Amended in place** (2026-11-06, decision D2 on epic [objectstack-ai/cloud#3652](https://github.com/objectstack-ai/cloud/issues/3652), ruling record [`6681380041`](https://github.com/objectstack-ai/cloud/issues/3652#issuecomment-6681380041), maintainer, verbatim: 「修订为允许只提示(推荐)」):
25+
a base's upgrade plan may report, as advice, each `.custom` override that hides a vendor change; `basedOn` still never gates, and nothing is refused, merged or rebased on the finding ([D2](#d2), [D6](#d6), the [Supersede table](#supersede-table)'s §9 row, [Consequences](#consequences), merge question 2).
26+
It lands by the maintainer's hand-merge of the PR cut from #30881.
2427
**Decided by**: the maintainer, 2026-10-30, in the desktop session that re-planned the epic, verbatim and
2528
untranslated as epic #28236 records them — the direction 「方向定为包级覆盖:代码和 Studio 用同一机制,定制都进 .custom。」; the suffix 「同意 后缀改成 .custom」; the eight questions 「等我拍板的 8 个问题,全部同意」; the extension
2629
fields 「扩展字段用 __c 后缀,只有 .custom 包能用。」; the item toolbar 「同意新增 2h「Studio 项工具栏」并放在 2a 之前」;
@@ -207,9 +210,17 @@ replaces the base's item **whole** for every read that serves the base's name ([
207210
item document — not in a manifest list, not in a side table — so it travels with the item through export and git, and
208211
the `.custom` manifest needs no index of what it overrides (Q2, 「全部同意」: declaration in the item body). `package`
209212
names the base; `basedOn` records which version of the base **package** — its `manifest.version`, not a history version
210-
of the item — the author started from (ruling record 6549129352 on #28404, aligned here). **`basedOn` is recorded,
211-
not judged**: no door compares it with the installed base's version, no upgrade diff is produced, and nothing is
212-
refused on it (epic #28236, *Not in this epic*: upgrade diff / `basedOn` checking, recorded only). Whole-document
213+
of the item — the author started from (ruling record 6549129352 on #28404, aligned here). **`basedOn` is recorded and
214+
never gates** (epic #28236, *Not in this epic*: upgrade diff / `basedOn` checking, recorded only). **One reader is
215+
admitted, as advice** (amended 2026-11-06, decision D2 on objectstack-ai/cloud#3652): a base's **upgrade plan** — the
216+
preview of a base upgrade before it runs — may list as advisory findings (a) a `.custom` item whose declared override
217+
names a base item the upgrade changes between the installed and the new version ("this override hides a vendor
218+
change"), and (b) an override whose `basedOn` is not the installed base's `manifest.version`. On either finding no door
219+
refuses, no token is asked, and nothing is merged, rebased or rewritten automatically; the upgrade proceeds as it would
220+
without it, and re-basing stays the customer's act. The plan carries both findings in an **advisory class** that its
221+
refusal never reads and that no finding-set token covers, so neither becomes a gate by sharing a response with a
222+
refusing finding. The finding is not the base-upgrade interception ADR-0141 D3 defers, because it refuses nothing, and [D3](#d3)'s `^<major>`
223+
reasoning (merge question 1) is unchanged. Whole-document
213224
replace is ADR-0005's binding principle 3 and ADR-0131 D6's O rule carried over unchanged: no field-level patch, no
214225
three-way merge — the author who changes one column ships the whole view.
215226
@@ -259,7 +270,8 @@ customer pull for in-place customization appears; deferred again here." The pull
259270
**three of the five** on facts the platform serves: the **badge** (an item of `.custom` is marked "customization"; an
260271
override is marked "overrides `<base>`" from its declaration), the **customization list** (the per-package read of
261272
[D8](#d8), and the landing's counts) and **revert** ("Restore package original" = delete the overriding item from
262-
`.custom`, so the base's document is served again). **Diff-vs-base and the upgrade skip-report stay deferred**, and §9's
273+
`.custom`, so the base's document is served again). **The advisory upgrade finding above is chartered; a field-level
274+
diff-vs-base view and the upgrade skip-report as a merge tool stay deferred** (amended 2026-11-06), and §9's
263275
second bullet — no clone provenance — stands ([D4](#d4)). ADR-0131 D6's sentence that the customer's change is
264276
"environment-level state beside" the managed item is superseded: the change is an item of a package beside it. Its
265277
other sentences stand — no door edits a managed definition, environment scope, no per-organization axis.
@@ -390,7 +402,8 @@ Maintainer, verbatim: 「「Edit {app} in Studio」代码包/已安装包一律
390402
anything DDL or a stored value depends on stay the vendor's ([D10](#d10)); the customer hides through views and
391403
permissions, as ADR-0131 D6's table has it.
392404
- **No code-only type** (`hook`, `job`, `api`, `agent`, `field` on its own, …) gains an override channel.
393-
- **No clone lineage, no upgrade diff, no `basedOn` judgement** ([D2](#d2), [D4](#d4)).
405+
- **No clone lineage, no field-level upgrade diff, no gate on `basedOn`** ([D2](#d2), [D4](#d4)) — the upgrade plan's
406+
advisory finding ([D2](#d2), amended 2026-11-06) refuses, merges and rebases nothing.
394407
- **No fields table in the object designer** (#27356 row 14, letter **C**, maintainer 2026-10-30T10:07Z). The Records
395408
grid's columns and the Form canvas each enumerate every field and open the one field inspector; objectui#5813 and
396409
objectui#12450 stand. Maintainer, verbatim: 「Studio 的对象设计器,第一栏数据不就是每一个字段吗?表单对应的不也是每一个字段吗」.
@@ -560,7 +573,7 @@ recorded sentences stay in their records; their Status lines carry the dated poi
560573
| **ADR-0141 D3** (deferred, by name) — the uninstall row | "**Uninstall protection** — refusing to uninstall a package another installed package depends on" · "The uninstall proceeds; the dependent's lookups dangle. Only ADR-0029's extender refusal stands" · "A first customer uninstall that strands a dependent" | For the **paired case** the item is decided: uninstalling a base is refused while its `<base>.custom` exists, naming it ([D3](#d3)). The general item — a dependent that is not the base's own `.custom` — stays deferred with its trigger. | `packages/objectql/src/registry.ts#uninstallPackage` gains the pair check beside the ADR-0029 extender refusal (`packages/objectql/src/registry.ts#PackageUninstallExtendedError` is the shape). Pin: `packages/objectql/src/registry-assert-package-uninstallable.test.ts`. Card N-14. |
561574
| **ADR-0070 D3** (select-or-create a base first) and **D5** (retire the stopgaps via a migration affordance) — the paired case | D3: "Every authoring surface follows the same contract; none silently defaults into a catch-all:" · D5: "Existing `package_id = null` rows are not broken." · "A small migration (or admin action) can bulk-assign legacy orphans to a default base named for the environment." | For a customer's first customization of an installed base, the base is `<base>.custom`, created by the ensure door without a prompt ([D3](#d3)) — a deterministic, declared, per-base target, not a catch-all; everywhere else D3's prompt stands. A package-less overlay row of a packaged item migrates into that pair as a declared override, not into "a default base named for the environment", and the package-less write then closes ([D11](#d11)); a package-less row no package ships keeps D5's treatment. | `packages/metadata-protocol/src/protocol-write-package-scope.ts#resolveWritePackageScope` (the target package the ensure door hands the write); `packages/metadata-protocol/src/protocol-environment-rows.ts#packagelessAddress` (closes after the migration). Pin: `packages/metadata-protocol/src/protocol.packageless-save-address.test.ts`. Cards N-13, N-16. |
562575
| **ADR-0029 D7** (shell + slots; contributions) — amended, not superseded | the D7 heading, verbatim: *Shared admin surfaces are "shell + slots"; capability plugins contribute navigation* | The contribution model is unchanged. What D7 did not fix is fixed here: an item another package contributes to a base (a navigation contribution, an extension field, a flow on the base's objects) is drawn **greyed, with its source package named**, when the base is open in Studio ([D3](#d3)). | No gate or pin exists today for the drawing; the Studio one-surface card adds the pin. Card N-19. |
563-
| **ADR-0126 §7.4** (surface) and **§9** first bullet — moved and lifted in part, not reversed | §7.4: "**Leaning D2 — a Setup page for packaged automation** (final call rides this ADR's merge)" · §9: "The ServiceNow-style overlay layer (badge / customization list / diff-vs-base / revert / upgrade skip-report) — recorded as the mature direction **if** customer pull for in-place customization appears; deferred again here." | The switch moves to the item in Studio and the Setup page retires after the landing counts ([D4](#d4)); badge, customization list and revert are chartered on served facts, diff-vs-base and the skip-report stay deferred ([D2](#d2)). | `packages/runtime/src/domains/activation-gate.ts#refuseUngrantedActivationWrite` is unchanged (the authority stays the door's); the console binds it from Studio (`ui/packages/app-shell/src/views/setup/packagedFlows.ts#activationReading`). Cards N-04, N-15, N-24, N-28. |
576+
| **ADR-0126 §7.4** (surface) and **§9** first bullet — moved and lifted in part, not reversed | §7.4: "**Leaning D2 — a Setup page for packaged automation** (final call rides this ADR's merge)" · §9: "The ServiceNow-style overlay layer (badge / customization list / diff-vs-base / revert / upgrade skip-report) — recorded as the mature direction **if** customer pull for in-place customization appears; deferred again here." | The switch moves to the item in Studio and the Setup page retires after the landing counts ([D4](#d4)); badge, customization list and revert are chartered on served facts; the upgrade plan's advisory finding is chartered (amended 2026-11-06); a field-level diff-vs-base view and the skip-report as a merge tool stay deferred ([D2](#d2)). | `packages/runtime/src/domains/activation-gate.ts#refuseUngrantedActivationWrite` is unchanged (the authority stays the door's); the console binds it from Studio (`ui/packages/app-shell/src/views/setup/packagedFlows.ts#activationReading`). Cards N-04, N-15, N-24, N-28. |
564577
565578
Two anchors the epic's territory names are **not** superseded clauses and are listed so they are not read as one:
566579
`packages/spec/src/kernel/namespace-prefix.ts#deriveNamespaceFromPackageId` keeps its rule — an explicitly declared
@@ -597,8 +610,9 @@ is fixed above where it bites.
597610
future type answers "where is it edited" and "where does a customization live" by rule.
598611
- **The vendor's upgrade and the customer's changes never meet.** Upgrades rewrite the base; `.custom` is untouched;
599612
`basedOn` tells a human what the override was taken from. The cost is ADR-0005's and ADR-0131's already: an overridden
600-
item shadows the vendor's later change to that one item until the customer re-bases it, and the platform computes no
601-
diff to help ([D6](#d6)).
613+
item shadows the vendor's later change to that one item until the customer re-bases it. The base's upgrade plan names
614+
each override that now hides a change, as advice ([D2](#d2), amended 2026-11-06); re-basing stays the customer's act,
615+
and the platform computes no field-level diff and merges nothing ([D6](#d6)).
602616
- **The clauses of eight records move** — six superseded in part (ADR-0126, 0131, 0005, 0048, 0141, 0070) and two
603617
amended (ADR-0009, 0029) — each with its gate and pin named ([Supersede table](#supersede-table)); every
604618
implementation card cites its row and changes exactly that pin. No pin is deleted.
@@ -676,9 +690,12 @@ of Q1's refusal and `action` — were ruled by the maintainer on 2026-10-31 (dec
676690
the pair after any patch of the base. The major is the reversible middle, and its payoff comes with ADR-0141 D3: when
677691
a base upgrade is intercepted, the pair's `^<major>` is what stops a major upgrade of the base until the
678692
customization is revisited.
679-
2. **`basedOn` is recorded and never judged** — not silent, and nothing to accept here: the epic's *Not in this epic*
693+
2. **`basedOn` is recorded and never gates** — not silent, and nothing to accept here: the epic's *Not in this epic*
680694
line rules it, verbatim "upgrade diff / `basedOn` checking (recorded only)". It is listed only so the declaration's
681-
contract carries the ruling and no card reads `basedOn` as a gate ([D2](#d2)).
695+
contract carries the ruling and no card reads `basedOn` as a gate ([D2](#d2)). One reader is admitted, as advice
696+
(amended 2026-11-06, decision D2 on objectstack-ai/cloud#3652): the upgrade plan's finding of [D2](#d2), which lists
697+
an override whose base item the upgrade changes or whose `basedOn` is not the installed base version, and refuses
698+
nothing.
682699
3. **The uninstall refusal's shape** is the ADR-0029 extender refusal's family, `409`, from the same door ([D3](#d3)):
683700
one resource-state conflict for "another package still stands on this one", two causes, one envelope.
684701
4. **The display-property class is defined by a test, not a list** ([D10](#d10)): a property is admitted when changing
@@ -718,6 +735,12 @@ of Q1's refusal and `action` — were ruled by the maintainer on 2026-10-31 (dec
718735
names the whole-deployment export `GET /packages/export`, landed for
719736
[#28914](https://github.com/objectstack-ai/objectstack/issues/28914) by PR [#29755](https://github.com/objectstack-ai/objectstack/pull/29755),
720737
as composing the per-package exports unchanged, the pair after its base).
738+
- Card [#30881](https://github.com/objectstack-ai/objectstack/issues/30881) (2026-11-06, the amendment in place that
739+
admits the upgrade plan's advisory finding — decision D2 on epic
740+
[objectstack-ai/cloud#3652](https://github.com/objectstack-ai/cloud/issues/3652), ruling record
741+
[`6681380041`](https://github.com/objectstack-ai/cloud/issues/3652#issuecomment-6681380041)); the finding itself is
742+
card [#30886](https://github.com/objectstack-ai/objectstack/issues/30886), on the upgrade plan of
743+
[#30884](https://github.com/objectstack-ai/objectstack/issues/30884).
721744
- [#27356](https://github.com/objectstack-ai/objectstack/issues/27356) rows 12, 13, 14, 19, 20, 21 and their landed
722745
PRs #27376, #27927, #28076.
723746
- ADR-0005, ADR-0009, ADR-0010, ADR-0029, ADR-0048 (and its 2026-10-08 addendum), ADR-0070, ADR-0126, ADR-0131,

0 commit comments

Comments
 (0)