Skip to content

feat(pages)!: retire the App Launcher and Utility Bar pages, which had no way in and promised shell roles the console does not give - #2119

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-2118-retire-launcher-utility-bar
Oct 15, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-2118-retire-launcher-utility-bar

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #2118

Clause-②: no

Retires app_launcher_page and utility_bar_page, on the maintainer's ruling 「下线(推荐)」 (the open question on #2060 item 5). Neither page had a way in, and their page types promised shell roles the console does not give: type: 'app' gave a search box and a one-app strip that copies the console's own app switcher, and type: 'utility' laid out inline in the main column, because the console has no slot for a utility bar (objectstack-ai/objectstack#23610).

What changed

  • The pages. Deleted src/sales/pages/app_launcher.page.ts, src/sales/pages/utility_bar.page.ts and their two exports in src/sales/pages/index.ts. The app package's page list is byExportName({ ...salesPages }) in objectstack.composition.ts, a spread of that barrel, so nothing else registered them.
  • Locale packs. Removed pages.app_launcher_page and pages.utility_bar_page from src/sales/translations/{en,es-ES,ja-JP,zh-CN}/app.ts (two 9-line blocks per pack).
  • test/metadata-references.test.ts. The empty-container rule's KNOWN_EMPTY held one entry, utility_bar_page/quick_notes. Once the page was deleted and the test left untouched, its stale arm went red and named that line: exemptions whose container is no longer empty — delete these lines: utility_bar_page/quick_notes. Removing the entry would leave the set empty, and no other test reads it, so the list, its stale arm and the paragraph describing them are removed. The docstring now says why.
  • docs/STATUS.md. The pasted pnpm validate summary goes from 8 Pages to 6 Pages. test/docs-declared-versions.test.ts pins that figure against the registered stack and went red on the first full run (Pages: page says 8, the stack registers 6). This path is outside the claim's file surface. It is there because it holds the page count the card asks us to keep true.
  • Docs that described the pages as shipping. docs/feature-inventory.md ADM-003 is now 已移除 (#2118), with anchor 已删除. The row is kept, as the file's stable-ID rule requires and as ADM-011 and SVC-011 already do. docs/architecture/module-split-plan.md (~L125) now says the app package holds the one page authored against no object (home). The objectstack.composition.ts comment is updated the same way.
  • docs/architecture/module-split-inventory.json. This file is hand-maintained: its $maintenance.how says "By hand. There is no generator in this repository". The two files[] rows are removed, and the edit is logged in $hand_edits the way module-split-inventory.json says "regenerate, never hand-edit" but no generator is in the repo — it now lists a deleted flow file #1698 and demo_bootstrap runs every 10 minutes forever in production tenants (1,776 runs in 13 days, longest 26 min) — a bootstrap should run once #1892 logged theirs (169 rows before, 167 after). The figures stay as measured, per do_not_hand_patch. The file still round-trips byte-for-byte through JSON.stringify(_, null, 1).
  • Changeset. .changeset/2118-retire-launcher-utility-bar.md is minor, the same level the A quote's total ignores line-item tax: lines total 10,945 while the quote shows 9,810 (the rollup sums pre-tax subtotals and never fills crm_quote.tax) #2069 field removal used.

Evidence

  • Built artifact, base d211930b against this branch. pages[] drops from 8 to 6. The app package now holds account_detail_page, account_workbench, lead_detail_page, opportunity_detail_page and sales_home_page, and the service package holds case_detail_page. A string walk of dist/objectstack.json for app_launcher|utility_bar finds 10 hits before (two pages[].name and eight translation keys) and 0 after. Every remaining page's JSON is identical before and after. Every locale pack is identical apart from the two removed keys. Build warnings: 8 before, 8 after.
  • Dev server on :4166, same database on both boots. On base, GET /api/v1/meta/page/{app_launcher_page,utility_bar_page,sales_home_page} answered 200, 200, 200. On this branch the same reads answered 404, 404, 200, with RESOURCE_NOT_FOUND for the two retired pages. Control: no_such_page_2118 answered 404 on both boots. The sales_home_page item is identical before and after. The page list endpoint no longer names either page.
  • One-time reverse verification of the exemption-free rule. I put utility_bar.page.ts and its export back on top of the new test. no page region renders an empty container went red: utility_bar_page/quick_notes: page:card "Quick Notes" has no body — it renders as a title over nothing. Restoring the tree left git diff HEAD empty, git status clean, and the index hash equal to the HEAD blob.

Gates, all run at a15e2113

Playwright e2e runs in CI.

Acceptance notes

  • Mentions of the two pages that remain. CHANGELOG.md is history. AGENTS.md L104-105 still lists `home` / `app_launcher` / `utility_bar` among the app package's items; it is a governed path (Tier H), so it is not edited here and the seat carries the change. ADM-003's removal row and the inventory's $hand_edits entry are removal records that each file's own maintenance rule requires.
  • Counts left as measured on purpose. module-split-plan.md L10 says 8 pages, and feature-inventory.md 总览统计 says 8 个页面. Both files say these are point-in-time measurements. docs/archive/2026-02/SALESFORCE_FEATURE_COMPARISON.md lists the utility page type as implemented, and it is archived.
  • A comment that was already wrong. test/metadata-references.test.ts ~L359 says "every one of the 18 component types these pages author has an id, and none of the 8 action-shaped types does". It did not match base: a walk of the base artifact finds 19 types that carry an id and none that are action-shaped. After this PR the walk finds 16. Its conclusion, that every page component type carries an id, still holds, so it is not edited.
  • A figure the pin test does not read. The validate summary pasted in docs/STATUS.md has no 5 Picklists on its Data line, though pnpm validate prints it. The pin test does not check that line, so it is not edited.
  • The exemption's owner card is gone. The removed KNOWN_EMPTY entry named utility_bar_page ships an empty Quick Notes card — a titled bordered box with nothing under it #1215 as its owner, and REST now answers 404 for hotcrm#1215.

Generated by Claude Code

Neither page had a way in: no navigation entry, action target, page
block or permission named either, so each rendered only at a typed URL.
The App Launcher duplicated the console's own app switcher; the Utility
Bar laid out inline in the main column (the console has no shell slot
for a utility page) around an empty Quick Notes card. As the exemplar
app, both taught that `type: 'app'` makes a launcher and `type:
'utility'` makes a floating bar, which the platform does not do.

Deleted: the two page files, their barrel exports (the app package's
page list spreads that barrel, so nothing else registered them), and
their keys in the four locale packs. The empty-container rule's
exemption list held only `utility_bar_page/quick_notes`; with the page
gone its stale arm went red naming that line, and the list, now empty,
is removed with its mechanism. The feature inventory marks ADM-003
removed, the split plan and the composition comment list only the page
that remains, and the hand-maintained split inventory drops the two
rows and logs the edit in `$hand_edits`, as its `$maintenance` asks.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv
`test/docs-declared-versions.test.ts` pins the figures docs/STATUS.md
transcribes from `pnpm validate` against the registered stack; with the
App Launcher and Utility Bar retired the stack registers 6 pages, not 8.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01P8mZuzuyZAHSrgQKmv6ASv
@vercel

vercel Bot commented Oct 15, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

1 Skipped Deployment
Project Deployment Actions Updated
hotcrm Ignored Ignored Oct 15, 2026 6:51am UTC

Request Review

@github-actions github-actions Bot added documentation Improvements or additions to documentation ci/cd CI plumbing and the verification pipeline metadata Declarative metadata — schema, security posture, UI surfaces configuration Build and app configuration files labels Oct 15, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

复核人:repo:hotcrm 执行席(#1353)· 判决 ACCEPT · 钉 head a15e2113e7e17b030a6669cc4f10b899fddeeec0 · 2026-10-15T07:01Z

形态:Fixes #2118,Clause-②: no;14 文件,+40/−265(两个被删页面文件占 −135;其余 +40/−130 = 170 行,派发估约 40——超出部分全是卡片点名要删的内容:四个语言包 72 行、清单 18 行、测试豁免机制 34 行;新增 40 行里 22 行是 changeset);路径面无 governed 面(AGENTS.md 按派发令未动)→ 非 Tier H,席位落地。origin/main d211930b 是 head 的祖先。2 个提交 trailer 均为无模型名的 Co-authored-by: Claude + Claude-Session。标题 feat(pages)!: + changeset minor,与本仓先例一致(#2089 删 tax_rate、#1519 删 Review Queue 均为 ! + minor)。

依据:维护者在席位会话里对「App Launcher / Utility Bar:给入口、下线还是保留」的裁决,原话「下线(推荐)」(记录见 #2060 评论)。

diff 逐行读过:

dev 读数:构建产物页面 8 → 6,app_launcher|utility_bar 字符串 10 处 → 0;其余 6 个页面与四个语言包除被删 key 外逐字节相同;同一数据库两次启动,GET /api/v1/meta/page/{app_launcher_page, utility_bar_page, sales_home_page} 基线 200/200/200、分支 404/404/200。反向验证:把 utility_bar.page.ts 放回,新测试按名报出 utility_bar_page/quick_notes,恢复后 git diff HEAD 为空。

门禁 check-runs(钉 head):Build and Test (22.x) ✓ · Quality Checks ✓ · Check Changeset ✓ · Playwright ✓ · link-check ✓ · CodeQL ✓ · Analyze Code (javascript) ✓ · Label Pull Request ✓ · Vercel Preview Comments ✓ — 9/9 success(未触及 content/docs/**,Typecheck and Build 不触发属正常),mergeable_state clean,base d211930b = 当前 origin/main(未移动,无需在合并树上复读 token ratchet)。

接受的偏差:① 认领面加宽一行:docs/STATUS.md 的页面计数(计数型测试,名字 grep 找不到,正是卡片说的「any test that counts pages」)。② 行数超估,全为卡片点名的删除。③ 豁免机制整体删除(按派发令「无其它测试需要时不保留机制」)。

范围外去向:

  • AGENTS.md L104-105「home / app_launcher / utility_bar」在本 PR 落地后过时——受管路径,席位带到下一次受管 AGENTS.md 改动(已写入席位帖与巡检提示)。
  • metadata-references.test.ts ~L359 注释里的类型计数(18 / 8)在基线上就不准、结论仍成立;docs/STATUS.md 摘要缺 5 Picklists;KNOWN_EMPTY 曾指向的 utility_bar_page ships an empty Quick Notes card — a titled bordered box with nothing under it #1215 为 404——均记录于 PR Acceptance notes,承接者:无。

落地条款:席位经中继 pr_ready + automerge_enable,以 objectstack-fleet[bot] 入合并队列;合并即关闭 #2118。之后席位向维护者汇报并回到待命:其余 p3 卡无维护者的话不派。

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 15, 2026 07:02
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 15, 2026
Merged via the queue into main with commit 63db83e Oct 15, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

ci/cd CI plumbing and the verification pipeline configuration Build and app configuration files documentation Improvements or additions to documentation metadata Declarative metadata — schema, security posture, UI surfaces

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Retire app_launcher_page and utility_bar_page: two pages with no UI path, whose page types promise shell roles the console does not give

2 participants