Repository navigation
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
Conversation
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
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
席位核对复核人:repo:hotcrm 执行席(#1353)· 判决 ACCEPT · 钉 head 形态: 依据:维护者在席位会话里对「App Launcher / Utility Bar:给入口、下线还是保留」的裁决,原话「下线(推荐)」(记录见 #2060 评论)。 diff 逐行读过:
dev 读数:构建产物页面 8 → 6, 门禁 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(未触及 接受的偏差:① 认领面加宽一行: 范围外去向:
落地条款:席位经中继 |
Fixes #2118
Clause-②: no
Retires
app_launcher_pageandutility_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, andtype: 'utility'laid out inline in the main column, because the console has no slot for a utility bar (objectstack-ai/objectstack#23610).What changed
src/sales/pages/app_launcher.page.ts,src/sales/pages/utility_bar.page.tsand their two exports insrc/sales/pages/index.ts. The app package's page list isbyExportName({ ...salesPages })inobjectstack.composition.ts, a spread of that barrel, so nothing else registered them.pages.app_launcher_pageandpages.utility_bar_pagefromsrc/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'sKNOWN_EMPTYheld 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 pastedpnpm validatesummary goes from8 Pagesto6 Pages.test/docs-declared-versions.test.tspins 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/feature-inventory.mdADM-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). Theobjectstack.composition.tscomment is updated the same way.docs/architecture/module-split-inventory.json. This file is hand-maintained: its$maintenance.howsays "By hand. There is no generator in this repository". The twofiles[]rows are removed, and the edit is logged in$hand_editsthe waymodule-split-inventory.jsonsays "regenerate, never hand-edit" but no generator is in the repo — it now lists a deleted flow file #1698 anddemo_bootstrapruns 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, perdo_not_hand_patch. The file still round-trips byte-for-byte throughJSON.stringify(_, null, 1)..changeset/2118-retire-launcher-utility-bar.mdisminor, 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
d211930bagainst this branch.pages[]drops from 8 to 6. The app package now holdsaccount_detail_page,account_workbench,lead_detail_page,opportunity_detail_pageandsales_home_page, and the service package holdscase_detail_page. A string walk ofdist/objectstack.jsonforapp_launcher|utility_barfinds 10 hits before (twopages[].nameand 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.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, withRESOURCE_NOT_FOUNDfor the two retired pages. Control:no_such_page_2118answered 404 on both boots. Thesales_home_pageitem is identical before and after. The page list endpoint no longer names either page.utility_bar.page.tsand its export back on top of the new test.no page region renders an empty containerwent red:utility_bar_page/quick_notes: page:card "Quick Notes" has no body — it renders as a title over nothing. Restoring the tree leftgit diff HEADempty,git statusclean, and the index hash equal to the HEAD blob.Gates, all run at
a15e2113pnpm validate: exit 0,✓ Validation passed,UI: 1 Apps 14 Views 6 Pages 5 Dashboards 10 Reports 31 Actionspnpm typecheck: exit 0 (the--listFilesoutput includestest/metadata-references.test.ts)pnpm lint: exit 0,18 suggestion(s)pnpm lint:i18n-gate: exit 0,✓ i18n lint gate: 0 i18n/missing-* issuespnpm hygiene: exit 0,✓ source hygiene cleanpnpm hygiene:tokens: exit 0,✓ source token ratchet clean. All ceilings are ruled (chore(deps): upgrade@objectstack/*past 17.7.0 once the next release publishes — it carries the platform fixes #2016, #2000, #1583 and #1585 wait on #2031), so none is lowered here.pnpm build: exit 0,✓ Build complete,6 Pagespnpm test: exit 0,Test Files 181 passed (181),Tests 3690 passed | 1 skipped (3691)Playwright e2e runs in CI.
Acceptance notes
CHANGELOG.mdis history.AGENTS.mdL104-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_editsentry are removal records that each file's own maintenance rule requires.module-split-plan.mdL10 says8 pages, andfeature-inventory.md总览统计 says8 个页面. Both files say these are point-in-time measurements.docs/archive/2026-02/SALESFORCE_FEATURE_COMPARISON.mdlists theutilitypage type as implemented, and it is archived.test/metadata-references.test.ts~L359 says "every one of the 18 component types these pages author has anid, 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 anidand none that are action-shaped. After this PR the walk finds 16. Its conclusion, that every page component type carries anid, still holds, so it is not edited.docs/STATUS.mdhas no5 Picklistson its Data line, thoughpnpm validateprints it. The pin test does not check that line, so it is not edited.KNOWN_EMPTYentry namedutility_bar_pageships an emptyQuick Notescard — a titled bordered box with nothing under it #1215 as its owner, and REST now answers 404 for hotcrm#1215.Generated by Claude Code