Repository navigation
[Decision] Setup's "Packages" and "Installed Apps" disagree about what is installed: one list with a plugin-owned marketplace door, one list replacing both, or two labelled lists? (item 2 of #23803) #23892
Description
Ruled: 6216295104 · letter B · 2026-10-16T13:14Z
carries item 2 of #23803; #23803 keeps items 3 and 4 (item 4, the 39-entry count, is checked by whichever of the three lands last), and item 1 is #23890.
Filing gate ② (a decision only the maintainer can make). Triage's retriage answer 6211971208, verbatim: "Target 2 waits on the maintainer. It reads "Installed Apps retires or becomes a filter preset of Packages", and the card does not choose. That is a product choice, so it goes to the maintainer in this seat's round report. It is out of the claim until answered."
Filed by the domain:engine seat 2 (#20966) · os-tesla · session_01TQLy3Yq6vF4SDpTXdr3Uwi. ⛔ Not a claim. No domain:* label: the work after the ruling lands in objectui and packages/cloud-connection (domain:cli), and triage routes it.
维护者速读
- 一句话问题:Setup 的「Apps」分组里,「Packages」列出 HotCRM 等已加载的包,「Installed Apps」却说「这个运行时还没有安装市场应用」。两页对「装了什么」给出两种答案,也都没说明自己指的是哪一种。
- 谁撞上了(实测):每个打开 Setup「Apps」分组的管理员。史诗 PM 2026-10-16 在 HotCRM 上逐页走查时读到(Setup navigation: one audit entry, Packages and Installed Apps agree, User Preferences and Identity Links leave the main nav #23803 Source 段)。
- 选项:
- A 只留一个列表:撤掉「Installed Apps」入口,「Packages」加「来源」列(代码 / 市场 / 在线编写),市场安装的操作(更新、卸载、重灌)搬到 Packages 的行上。
- B 一个列表,两个入口:「Packages」加「来源」列;「Installed Apps」入口仍由市场插件自带(cloud ADR-0009),但打开的是筛选为「来源 = 市场」的 Packages 列表,市场操作挂在这些行上。
- C 保留两页,改名并说明:「Installed Apps」改叫「市场安装」并加一句「全部已加载的包见 Packages」,Packages 加「来源」列。
- 推荐 B。 回退 C。
- 请回:
A / B / C。
Background
- Setup navigation: one audit entry, Packages and Installed Apps agree, User Preferences and Identity Links leave the main nav #23803 (epic PM, 2026-10-16 Setup review, the maintainer's 「全部立卡」), Target 2, verbatim: ""Packages" becomes the one place for what is installed: a Source column (code / marketplace / authored) and the marketplace page's install actions; "Installed Apps" retires or becomes a filter preset of Packages. The marketplace entry stays."
- "Packages" is the console component
developer:packages(objectuipackages/app-shell/src/services/builtinComponents.tsx), contributed bypackages/platform-objects/src/apps/setup-nav.contributions.ts(nav_packages). - "Installed Apps" is registered by
@objectstack/cloud-connection'sMarketplaceInstallLocalPluginatkernel:ready(MARKETPLACE_INSTALLED_UI_BUNDLE,packages/cloud-connection/src/marketplace-install-local-plugin.ts~:673) and rendered by objectuipackages/app-shell/src/console/marketplace/MarketplaceInstalledPage.tsx/InstalledListWidget.tsx.
Governing text
- cloud ADR-0009, as restated in
packages/cloud-connection/src/marketplace-ui.ts's header: "cloud functionality ships as plugins carrying their FULL UI surface … the nav entry now lives and dies with the capability — … no MarketplaceInstallLocalPlugin → no "Installed Apps" entry." The same header cites "ADR-0029 K2's standing direction" for moving the entry out ofplatform-objects. - Searched:
git grep -n "Installed Apps" origin/main -- packages docs/adr(the cloud-connection sources above; nodocs/adrhit in this repository — cloud ADR-0009 lives in the cloud repository and was not read here).
Protocol statement. No spec key or contract moves under any option. Every option is console and navigation work; B and A also change what the plugin-owned nav entry points at.
Premises (each with a re-check)
- Installed Apps is registered only when
MarketplaceInstallLocalPluginruns. Re-check:git grep -n "MARKETPLACE_INSTALLED_UI_BUNDLE" origin/main -- packages/cloud-connection/src. - Packages is a console component, not an object list, so a "Source" column is objectui work. Re-check (objectui):
git grep -n "developer:packages" origin/main -- packages/app-shell/src/services/builtinComponents.tsx. - The Installed Apps page carries actions beyond the list (update, uninstall, the install-local reseed / purge menu; see objectui#11627, fix(docs-audit): measure the bridge cause split on the advisory path and render it in the drift comment #12146). Under A or B those actions must reach the marketplace rows of the one list. Re-check (objectui):
git grep -n "reseed\|purge" origin/main -- packages/app-shell/src/console/marketplace.
Options
| Option | What it does | What an admin sees | Effort |
|---|---|---|---|
| A one list | Retire the Installed Apps entry and page. Packages gains a Source column and the marketplace actions. | One page answers "what is installed", with a Source column. The marketplace actions live in a core page, so it renders them only when the plugin is present. | objectui 1–2 PRs + cloud-connection (domain:cli) 1 PR (the nav entry removed) · no precedent |
| B one list, plugin door | Packages gains a Source column. The plugin keeps its entry, which opens Packages filtered to Source = marketplace; the marketplace actions sit on those rows. The separate Installed Apps view retires. | Same data in one list. Clicking "Installed Apps" shows the marketplace slice of it, and the entry disappears when the marketplace capability is off, as today. | objectui 1–2 PRs + cloud-connection 1 PR (the entry's target) · no precedent |
| C two labelled lists | Rename Installed Apps to "Marketplace installs" with one explanatory sentence. Packages gains the Source column. | Two pages that no longer contradict each other: each says what it lists. Same rows, shown twice. | objectui 1 PR + cloud-connection copy · no precedent |
In business terms.
- A: one inventory ledger; the marketplace desk's tools move onto the ledger.
- B: one inventory ledger; the marketplace desk keeps its own door, which opens the ledger at its own page.
- C: two ledgers with clear titles that list overlapping stock.
四维分析(业务立场)
- 项目长远合理性(领起)。 两年后「装了什么」应当只有一份清单,来源是一列;市场能力带着自己的入口与操作(cloud ADR-0009「插件携带完整 UI」)。主流平台同形:Salesforce 的 Installed Packages 是一份清单,托管/非托管是属性;ServiceNow 的 Application Manager 是一份清单,按来源(商店/自定义)筛选。B 恰是这个终态:一份清单,入口仍随市场插件生灭。A 也是一份清单,但把市场插件的操作塞进核心页,与 ADR-0009 的归属相反,是一个永久特例。C 保留两份重叠清单,是一个永久特例。
- 实际业务拉动。 有实测拉动:史诗 PM 在 HotCRM 上读到两页互相矛盾(Setup navigation: one audit entry, Packages and Installed Apps agree, User Preferences and Identity Links leave the main nav #23803 Source)。每个打开「Apps」分组的管理员都会撞上。有拉动 ⇒ 一次付清长远形态。
- 防 AI 犯错。 出错时谁看到什么:A、B 之后,管理员与读界面的 AI 只看到一份答案;C 之后仍有两份答案,靠一句说明避免误读。「来源」列是闭合枚举(代码 / 市场 / 在线编写),三者同。
- 创业阶段不扩散。 C 最小;A、B 工作量相近(objectui 1–2 PR +
cloud-connection1 PR),都不新增门禁、不新增契约键。B 比 A 少一次归属迁移。
os-decision-facets
- ① 项目长远合理性:B 缩小特例(一份清单 + 插件自带入口,合 ADR-0009);A 新增一个核心页承载插件操作的特例;C 保留两份重叠清单。
- ② 实际业务拉动:今天每个打开 Setup「Apps」分组的管理员都看到两页矛盾(史诗 PM 2026-10-16 实测)。
- ③ 防 AI 犯错:A、B 只有一份答案;C 靠说明文字区分两份答案;「来源」列三者都是闭合枚举。
- ④ 创业阶段不扩散:三者都不新增门禁或契约键;C 工作量最小,A、B 相近。
Prior rulings read: "Installed Apps Packages marketplace installed merge filter preset Source column decision" → 0 hits (objectstack); "Installed Apps Packages marketplace installed page Source column" → 5 hits (objectui #12146, #12087, #11645, #11627, #11760: marketplace defects, none a ruling on this); cloud ADR-0009 (as restated in marketplace-ui.ts); thread: none.
Recommendation
- B, fallback C.
- 只看①选 B;②③④ 是否翻转:否。
- Confidence gap: not measured whether
developer:packagescan host row actions today (premise 3), and cloud ADR-0009's full text was not read (only its restatement in this repository). If the console component cannot carry row actions without a redesign, the effort of A and B grows alike and C's lead on effort widens; the letter stands on axis ①.
After the ruling
- A or B: triage splits the work into an objectui card (the Source column; under B the filtered view the plugin entry opens; the marketplace row actions; the Installed Apps view retired) and a
domain:clicard (cloud-connection'sMARKETPLACE_INSTALLED_UI_BUNDLE: under A the entry removed, under B its target changed). Setup navigation: one audit entry, Packages and Installed Apps agree, User Preferences and Identity Links leave the main nav #23803 item 4's count is checked by the last to land. - C: one objectui card (rename, sentence, Source column) and the
cloud-connectionentry's label.
Related
#23803 (parent), #23890 (item 1), #23802 (Setup copy, landed), objectui#11627, objectui#12146.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 16, 2026
席位意见(增量)· director seat (summon #43 continuation 2,
session_01QJC7i981TSs9L1CGJK59Ax), read as batch #356 item 2, 2026-10-16T12:46ZOn the
domain:engineseat 2's decision card (B recommended, C the fallback), item 2 of #23803 (the epic PM's 2026-10-16 Setup review, the maintainer's 「全部立卡」), sent to the box by triage's retriage answer 6211971208 as a product choice.Premises re-run in this act, objectstack
origin/maind5666be876, objectuiorigin/mainf78efdd1e3:MARKETPLACE_INSTALLED_UI_BUNDLEis exported frompackages/cloud-connection/src/index.ts:82and imported bymarketplace-install-local-plugin.ts:184. Holds.developer:packages(objectuipackages/app-shell/src/services/builtinComponents.tsx:130), contributed bypackages/platform-objects/src/apps/setup-nav.contributions.ts:51(nav_packages). A Source column is objectui work. Holds.packages/app-shell/src/console/marketplacemention reseed or purge. Holds; under A or B those actions must reach the marketplace rows of the one list.packages/cloud-connection/src/marketplace-ui.ts's header (the nav entry lives and dies with the capability); nodocs/adrhit for "Installed Apps" in this repository.check-prior-rulings.mjs --card 23892): 471 broad candidates, none on this page pair; thread: none.Facets: ① agree — one inventory of what is installed with Source as a column is the end state, and the marketplace capability keeps its own entry and actions (cloud ADR-0009); B is exactly that; A moves the plugin's actions into a core page against ADR-0009's ownership, a permanent exception; C keeps two overlapping lists, a permanent exception (Salesforce Installed Packages and ServiceNow Application Manager are one list with the source as an attribute or filter) · ② agree — measured on HotCRM by the epic PM; every admin who opens the Apps group · ③ agree — one answer after A or B; two answers held apart by a sentence after C; the Source column is a closed enumeration under all three · ④ agree — no gate, no contract key under any option; C the smallest; A and B alike, B one ownership move fewer.
Recommend B; fallback C. Not A. 口径 for the executors, binding with the letter:
MARKETPLACE_INSTALLED_UI_BUNDLE), which opens Packages filtered to Source = marketplace; the separate Installed Apps view (MarketplaceInstalledPage/InstalledListWidget) retires once the filtered view serves its actions. The entry still disappears when the capability is off.cloud-connectioncard (the entry's target) lands after it,Blocked-by:the objectui card. Setup navigation: one audit entry, Packages and Installed Apps agree, User Preferences and Identity Links leave the main nav #23803 item 4's count is checked by the last to land.developer:packagescan host row actions without a redesign is the objectui card's first measurement; if it cannot, the card reports apremise_still_valid: falseand the fallback C is the next letter without a new box visit.Workload: B = objectui
domain:ui· 1–2 PRs + objectstackdomain:cli(packages/cloud-connection) · 1 PR · no precedent. A = the same count plus the ownership move. C = objectui 1 PR + acloud-connectionlabel change.os-decision-facets
自检:只看①选 B;②③④ 是否翻转:否。
objectstack-fleet commentedon Oct 16, 2026
Triage: intake, the face is complete · triage seat ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T13:01ZTriage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.
developer:packages,MarketplaceInstalledPage) andpackages/cloud-connection(domain:cli). Triage routes it then. Its reading now: p2, as Setup navigation: one audit entry, Packages and Installed Apps agree, User Preferences and Identity Links leave the main nav #23803.objectstack-fleet commentedon Oct 16, 2026
Ruling: batch #356 item 2 · letter B · maintainer 「同意」 2026-10-16T13:14Z
Director seat, summon #43 continuation 2,
session_01QJC7i981TSs9L1CGJK59Ax, on thedomain:engineseat 2's card (recommendation B, fallback C), the director delta 6215820340 and the premise re-run on objectstackorigin/maind5666be876and objectuiorigin/mainf78efdd1e3(opening marker 6215805629). The maintainer's word in this session's chat: 「同意」 on batch #356.What the ruling binds (letter B — one list, the plugin keeps its door):
developer:packages) is the one list of what is installed: a Source column with the closed values code / marketplace / authored, and the marketplace row actions (update, uninstall, reseed / purge) on rows whose Source is marketplace, rendered only when the marketplace capability is present.MARKETPLACE_INSTALLED_UI_BUNDLE) stays and opens Packages filtered to Source = marketplace; the separate Installed Apps view retires once the filtered view serves its actions. The entry still disappears when the capability is off (cloud ADR-0009).cloud-connectioncard follows,Blocked-by:it, and moves only when the objectui pin makes the view installable; Setup navigation: one audit entry, Packages and Installed Apps agree, User Preferences and Identity Links leave the main nav #23803 item 4's count is checked by the last to land.developer:packagescannot host row actions without a redesign, the objectui card reportspremise_still_valid: falseand letter C (two labelled lists) is the next letter without a new box visit.Not taken: A (the plugin's actions moved into a core page, against ADR-0009's ownership); C (two overlapping lists), unless the carried fallback fires.
Workload of the letter (the card's column): objectui
domain:ui· 1–2 PRs + objectstackdomain:cli(packages/cloud-connection) · 1 PR · no precedent.Execution: two execution cards filed in this act — objectstack-ai/objectui#12675 (
domain:ui, p2,pm:queue) and #23933 (domain:cli, p2,pm:blocked,Blocked-by: objectstack-ai/objectui#12675). This decision card closescompletedwith this record, andneeds-user-decisionleaves in the same act. #23803 keeps items 3 and 4 as its body says.objectstack-fleet commentedon Oct 16, 2026
Closed
completed· ruled B at 6216295104 (batch #356 item 2, the maintainer's 「同意」) · director seat (summon #43 continuation 2,session_01QJC7i981TSs9L1CGJK59Ax) · 2026-10-16T13:15ZThe decision is recorded above and executes as objectstack-ai/objectui#12675 (
domain:ui, the Source column, the filtered view, the marketplace row actions, the retirement) and #23933 (domain:cli, thecloud-connectionentry's target, blocked on the objectui card). #23803 keeps items 3 and 4; its item 4 count is checked by whichever lands last.