Repository navigation
fix(app-shell): Browse Marketplace reads an unreachable catalog as unreachable, its raw cause behind More - #26213
Conversation
…ble 502 as unreachable The runtime's marketplace proxy answers 502 MARKETPLACE_PROXY_FAILED only when its own fetch to the catalog throws. The panel picked its class line by status alone, so that 502 read as the catalog answering with an error, and the raw transport text (fetch failed) sat in full view. The load failure now carries the stamped code: that code, or no status at all, is the unreachable class, whose raw text sits behind a More / Less disclosure reusing the refusalDetails keys. Answered failures keep answeredError and their visible server text; the online hint is unchanged. Claude-Session: https://claude.ai/code/session_01SMps7wq7rBTk53e8KTSEup Co-authored-by: Claude <noreply@anthropic.com>
…ss line Claude-Session: https://claude.ai/code/session_01SMps7wq7rBTk53e8KTSEup Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01SMps7wq7rBTk53e8KTSEup Co-authored-by: Claude <noreply@anthropic.com>
席位核对ACCEPT ·
|
|
Seat 2 · 2026-10-26T16:00Z · CI red that is not this PR's
The fix is card #26218, claimed and in development: a test-only re-point of the guard to the measured count. Nothing is ported into this PR, so its diff stays as reviewed. Once #26218 merges, a merge of |
Fixes #25891
Clause-②: no
Metadata-protocol: none
What changed
The runtime's marketplace proxy answers
502 MARKETPLACE_PROXY_FAILEDonly when its own fetch to the catalog throws (packages/cloud-connection/src/marketplace-proxy-plugin.ts). Upstream answers pass through with their own status and code.marketplaceApi.tscall()already stampscodeon the error. The load-error panel inMarketplacePage.tsxnever read it: it picked its class line by status alone. So a runtime that could not reach the catalog read "The marketplace catalog answered with an error (HTTP 502)", with the raw Node textfetch failedin full view.LoadFailurenow carriescodeand anunreachableclass: no status (no server answered), orcode === 'MARKETPLACE_PROXY_FAILED'.marketplace.load.unreachable. Its raw transport text (fetch failed,Failed to fetch) sits behind a More / Less disclosure with a copy button, reusing the existingrefusalDetails.more/less/copy/copiedkeys, the same shapeRefusalMessagegives a refusal's detail.RefusalMessageitself is not reused because it splits a server text into lead + rest, and here the lead is our own sentence, not part of the text.answeredErrorwith their status and the server's text in full view, as objectui#11688 made them.Tests
ui/packages/app-shell/src/console/marketplace/__tests__/MarketplacePage.loadFailureCause-11688.test.tsx, realcall()over a stubbedfetch:502 MARKETPLACE_PROXY_FAILEDnow readsmarketplace.load.unreachable, neveransweredError;fetch failedis not on screen until More is pressed, then it is, More reads Less, and the copy button is labelledrefusalDetails.copy. The configured-plane hint is still drawn.503 SERVICE_UNAVAILABLEand a403plain-text refusal both keepansweredError, their text in full view, and no disclosure. The 503 keeps the hint and the 403 does not.TypeError: Failed to fetch) also asserts the unreachable line and that the raw text is not in full view.Run at head
a7b293f0, under the verify lock:vitest run packages/app-shell/src/console/marketplace/__tests__/MarketplacePage*: Test Files 9/9, Tests 67/67. The suites includeMarketplacePage.sameOriginHint-11726.test.tsxandMarketplacePage.loadingStates-12710.test.tsxunchanged and green.pnpm --filter @object-ui/app-shell run type-checkpassed with exit 0 (bothtsc --noEmitandtsconfig.test.json).eslinton the two changed files reported 0 errors and 3 warnings, all on pre-existing lines.Ablation, run at head
24315db2viascripts/ablation-replace.mjs:unreachable: status === undefined || code === PROXY_UNREACHABLE_CODE,becameunreachable: status === undefined,. The anchor count went from 1 to 0 and the blob fromf19da1750ab1to46ac6aa14f87. The 11688 suite then had 1 failed and 9 passed; the failure was exactly the flipped 502 case. The tool then restored the file (blob equals HEAD, andgit diff HEADis empty).Gates
Derived with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackata7b293f0: 35 commands, every one run, every one exit 0.--ranreconciliation: 35 derived, 35 run, 0 NOT-MEASURED, 0 UNRUN (a derived zero, exit codes recorded).node scripts/check-sdui-manifest.mjspassed with exit 0, andscripts/sdui-manifest.*is untouched. The roster gate flagged for.changeset/,node scripts/check-changeset-fixed.mjs, passed with exit 0. CI-owned families (the type-check lanes, Test UI, Lint UI) are left to this PR's check-runs.Acceptance notes
MARKETPLACE_PROXY_FAILEDis compared as a string literal in app-shell. The spec's error-code ledger lists it, but there is no per-code exported constant to import.MarketplacePage.tsx(an import nearmiddleTruncate.js, a hook,installLocal). This diff stays out of those regions.Generated by Claude Code