Repository navigation
fix(app-shell): Details and the catalog read a package the runtime refused to load as not loaded (objectui#11760) - #11766
Merged
objectstack-fleet[bot] merged 5 commits intoOct 7, 2026
Conversation
…fused to load as not loaded (objectui#11760)
The install-local listing marks an entry this runtime refused to load at
startup with `notLoaded: { code, requiredRange }`. Installed Apps reads it
since objectui#11645; three other faces still drew such an entry as
installed:
- the Details header badge ("Installed · vX") now draws the installed
version and the destructive "Not loaded" badge, with the reason line
beneath, in both the catalog view and the offline local view;
- Details' own Uninstall confirms and reports with the not-loaded texts
(`confirmNotLoaded` / `successNotLoaded`) instead of the "stays loaded
until restart" ones;
- the catalog card's "Installed vX" badge, and the org section's
"Installed" badge on the same page, read "Not loaded" for such an entry.
A loaded entry renders as before on every face. No new key.
Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8
Co-authored-by: Claude <noreply@anthropic.com>
…install as not loaded (objectui#11760) Driven by the install-local listing body the server serves (unmocked marketplaceApi over a stubbed fetch), through the real I18nProvider in en and zh, with a loaded-entry control on every face: the Details header in both the catalog view and the offline local view, Details' own Uninstall confirm and result, the catalog card and the org card. Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
… header badge (objectui#11760) So a header regression and an Uninstall regression each turn their own cases red, and nothing else. Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
…s and the catalog (objectui#11760) Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CGZy1BGCjdN5cXqL9cnvB8 Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
objectstack-fleet
Bot
deleted the
claude/issue-11760-not-loaded-other-faces
branch
October 7, 2026 07:46
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #11760
Clause-②: no
The install-local listing marks a package this runtime refused to load at startup with
notLoaded: { code, requiredRange }(objectstack PR #21833,@objectstack/*17.7.0). Installed Apps reads that marker since objectui#11645 (PR objectui#11759). This PR makes the other faces read it too. Before, all of them told an operator that a refused package was installed and running.Implemented by the dispatched dev on
claude/issue-11760-not-loaded-other-faces, sessionsession_01CGZy1BGCjdN5cXqL9cnvB8.What changes
notLoadedentryMarketplacePackagePage,localInstalledBadge), catalog view and offline local viewdoUninstallLocal)marketplace.uninstall.confirm, resultsuccessInDetail("remains loaded … until the next restart")confirmNotLoaded/successNotLoadedMarketplacePage,installedByManifestId)installedIds)marketplace.notLoaded.badge,.protocolIncompatible,.otherReason,marketplace.uninstall.confirmNotLoaded,.successNotLoaded.marketplace.versionBadgealready existed.Decisions the dispatch left to the dev
OS_PROTOCOL_INCOMPATIBLEnames the range; any other code is named byotherReason).successInDetailvssuccessNotLoaded. Read both inen.ts: the only Details-specific wording insuccessInDetailis "cached manifest for", inside the restart sentence that the not-loaded case drops. Nothing Details-specific is lost, so no new key.installedByManifestId). The org section of the same page badges a local install "Installed" throughinstalledIds, which reads the same listing. Org packages have no public listing, so for them the org card IS the catalog's face. It is the same defect class, in a claimed file, with the same key, fixed mechanically in the shape this PR pins. Its own pin and control are below. If the reviewer reads it as beyond the card, dropping it is one ternary and two test cases.Tests
New pins, both driven by the listing body the server serves (unmocked
marketplaceApiover a stubbedfetch, the refused entry in objectstack PR #21833's wire shape: marker present,withSampleDataabsent), through the realI18nProviderin en and zh, with expected text read from the packs:MarketplacePackagePage.notLoadedHeader-11760.test.tsx(17 cases): header and Uninstall, catalog view and offline local view, en and zh, each with a loaded-entry control (green "Installed · vX", no reason line,confirm/successInDetail), plus an unknown refusal code.MarketplacePage.notLoadedBadge-11760.test.tsx(8 cases): catalog card and org card, en and zh, each with a loaded control.Runs, from the worktree root:
pnpm exec vitest run --maxWorkers=2 packages/app-shell/at91c70b3:Test Files 1056 passed | 1 skipped (1057),Tests 10342 passed | 9 skipped (10351), lock VERDICT command-exit 0 (held 53m56s on a shared box).91c70b3is the head before I mergedmain(d50f724) as the dispatch asks. That merge brings in onlymain's own landed commits. None of them touches these files, and the diff ofb67f24fagainstmainis exactly this PR's five files. The lock-bound reruns atb67f24f(dependency rebuild, type-check, the marketplace tests) are NOT MEASURED locally: the lock was held by another dev's full app-shell suite for more than 30 minutes. CI runs them on this head.Type-check at
91c70b3:pnpm --filter @object-ui/app-shell type-checkexit 0 (script name echoed astype-check, after building the dependency closure withpnpm --workspace-concurrency=2 --filter '@object-ui/app-shell^...' build, exit 0).tsc -p tsconfig.test.json --listFileslists both new test files (control:marketplaceDates.displayLocale-10331.test.tsxlisted).Reverse verification, one face at a time
From committed
da68b10, each leg went throughablation-replace.mjs(anchor must hit once, on-disk blob change proven, self-restoring with a trap, restore proven by blob equal to HEAD and an emptygit diff HEAD). Each leg replaced one face'snotLoadedcondition withfalse:All loaded-entry controls stayed green in every leg. After the run, both source blobs equal HEAD (
91ed0c30,0e29f945) andgit diff HEADis empty. No dist leg: the tests import the pages by relative path, and@object-ui/i18nis aliased tosrcbyvitest.config.mts.Loaded entries are byte-identical
A one-off probe (deleted, never committed) rendered every face over loaded entries only, at head and with the base
7b17705blobs of both pages checked out, and comparedinnerHTML: Details catalog view (en 5038 bytes, zh 5040), Details offline view (en 4359, zh 4333), catalog page with a catalog card and an org card (en 12255, zh 12221). All six werecmp-identical to base.Gates
Re-run at
b67f24f(lock-free), each exit 0, verdict line as printed:pnpm check:control-bytes: OK (scanned 7772 tracked text files)pnpm check:test-path-roots: OKpnpm check:changeset-claims: No pending changeset names a file this change touches.pnpm check:pending-changeset-literals: No test source names a pending changeset.pnpm check:new-line-citations: 0 new citation(s)pnpm check:vi-mock-specifiers,check:vi-mock-inherit,check:vi-mock-override-shape: OKpnpm check:phantom-deps,check:self-import: OKpnpm check:i18n-keys: every in-scope call-site key resolves against the en packpnpm changeset:check: nomajor;node scripts/check-changeset-presence.mjs: 4 source files of 1 released package changed, 1 changeset declarednode scripts/check-governed-queue-guard.mjs --test(5 paths): NOT GOVERNEDpnpm exec eslint --no-inline-config --format jsonon the 4 touched.tsxfiles: 4 results, 0 errors, 13 warnings, none on a line this diff adds. All 4 files are in eslint's population (isPathIgnoredfalse), and the resolved config is not type-aware (noparserOptions.project/projectService), so the diff cannot move the verdict on an untouched file. Repo-widepnpm lintis left to CI.At
91c70b3:pnpm --filter @object-ui/app-shell type-checkexit 0, and the full app-shell suite above.Not run locally: the locale-pack gates (
check:i18n-drift,-dead-keys,-designer-parity), because no pack changed;check:readme-exports, because no export changed;check:sdui-registration-pinsandcheck:eager-locale-catalogues, which need a console build, because no registration and no import changed.scripts/__tests__/vite-declared-lazy-views.test.tsnames these two paths but reads onlyAppContent.tsxand the package manifest, neither touched. It is NOT MEASURED (two lock queue timeouts, exit 99), and CI runs it.Acceptance notes
InstalledListWidget(notLoadedReason) andMarketplacePackagePage(same name). A later refusal code needs both edited.InstalledListWidget.tsxis outside this card, so the two were not merged into one helper. Observation only, not filed. Carrier: none.Generated by Claude Code