Skip to content

feat(app-shell,i18n): the Console draws the DEPENDENCY_MISSING install refusal in the author's terms - #26123

Merged
objectstack-fleet[bot] merged 9 commits into
mainfrom
claude/project-thread-78l2jg
Oct 26, 2026
Merged

objectstack-fleet[bot] merged 9 commits into
mainfrom
claude/project-thread-78l2jg

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Leehom · project thread

Part of #25792

Clause-②: no
Metadata-protocol: none

What

ADR-0141 D2 refuses an install whose declared dependencies the environment does not satisfy: 422 DEPENDENCY_MISSING, with details.unmet[] naming each entry's packageId, dependency, range, what was found and the installedVersion. Until now the Console showed only the envelope's English sentence, the same in every locale and without the ranges.

This is item 3 of #25792 (claim amendment 6415110715). The Console now draws the refusal in the author's terms at every install surface that goes through install-local: a heading saying nothing was installed, then one line per unmet entry, built from the refusal's own facts.

Surface Before After (zh-CN)
Package page → Install the server's English sentence 安装被拒绝:… then • 请先安装 app.objectstack.hotcrm 6.x。
Catalog → Your organization → Install (self-hosted, installLocal) same same, in the strip above the cards
Setup → Packages → Import <sentence> (DEPENDENCY_MISSING) same lines

An out-of-range entry reads • 请先安装 com.acme.billing ^2.1.0(当前安装的是 1.4.0)。 / • Install com.acme.billing ^2.1.0 first. Version 1.4.0 is installed. The unreadable-range, unreadable-version and unreadable-declaration entries each get their own line.

How

  • console/marketplace/dependencyMissing.ts (new): readDependencyMissing(details) reads details.unmet[] all or nothing. An unknown found, an empty list, or an entry missing its dependency/range returns null, so the Console never shows fewer things to install than the server refused for. dependencyMissingText(facts, t) builds the heading plus one bullet per fact. useDependencyMissingText() returns the text for a caught error whose code is DEPENDENCY_MISSING and whose facts it can read, else null, and the caller keeps its own message.
  • marketplaceApi.installLocal() now also carries the envelope's details on the error it throws, next to code and status.
  • PackagesPage's apiJson now carries code and details on its thrown Error. No existing caller reads either one; the message is unchanged.
  • MarketplacePackagePage.doInstallLocal, MarketplacePage.doOrgInstall and PackagesPage.onImportFile try the refusal text first. The org strip and the import note gain whitespace-pre-wrap so the lines stay lines; the package page note already had it.
  • @object-ui/i18n: marketplace.install.dependencyMissing.{heading,absent,outOfRange,unreadableRange,unreadableVersion,unreadableDeclaration} in all ten locale packs. Setup → Packages uses the packs through the hook because the engine.* table is en/zh only.
  • scripts/sdui-manifest.record.json: the locale packs are registry sources, so the recorded source digest moves. It was regenerated with node scripts/gen-sdui-manifest-node.mjs; sdui.manifest.json is byte-identical.

The dependency shows as its package ID (app.objectstack.hotcrm), not a display name: the refusal's facts carry no display name, and this PR adds no server change.

Tests

  • dependencyMissing-25792.test.ts: the reader (all or nothing, every found), the text, and installLocal rejecting with code, status and details over a stubbed wire.
  • MarketplacePackagePage.dependencyMissing-25792.test.tsx: the real marketplaceApi over a stubbed fetch. The note equals the heading plus two lines carrying each entry's id, range and version, and the server sentence is gone. A control case (no unmet) keeps the server message.
  • MarketplacePage.orgInstallDependencyMissing-25792.test.tsx: the org install's real installLocal, the same lines, the whitespace-pre-wrap class, and a MANIFEST_CONFLICT control.
  • PackagesPage.importDependencyMissing-25792.test.tsx: the real I18nProvider. It checks the exact zh-CN lines (• 请先安装 app.objectstack.hotcrm 6.x。) and en lines, plus a control case.

Evidence:

  • Red first: with the wiring reverted, 5 failed and 7 passed. The controls and the pure reader/text cases passed.
  • Green: 12/12 pass.
  • Ablations: 5, all red, each restored to HEAD:
    • drop the hook at the import door
    • drop the hook at the org install
    • drop details in installLocal
    • drop details in apiJson
    • drop whitespace-pre-wrap on the org strip
  • Wider runs: marketplace/, views/metadata-admin/ and packages/i18n ran 727 files and 8276 tests, all passing. After merging main, the new tests and packages/i18n ran 1365 tests, all passing.
  • Checks: app-shell tsc --noEmit passed. Scoped eslint shows 0 errors; its first run was red on an unused import in one new test. check-i18n-call-site-keys, en-drift, dead-keys and designer-parity all pass.

What to do: nothing.

🤖 Generated with Claude Code

https://claude.ai/code/session_01NndsH9Qm7k6AS2i2fWbjNA

Generated by Claude Code

…the author's terms

ADR-0141 D2 refuses an install whose declared dependencies the environment
does not satisfy (422 DEPENDENCY_MISSING, details.unmet[]). The Console
showed the envelope's English sentence. The package page's Install, the
catalog page's organization install on a self-hosted runtime and Setup ->
Packages -> Import now draw a heading plus one line per unmet entry from
the refusal's own facts (dependency, range, found, installed version), in
all ten locale packs. installLocal() and the Packages page's request
helper carry the envelope's details (and code) on the error they throw.
A refusal whose facts cannot be read in full keeps the server's message.

Claude-Session: https://claude.ai/code/session_01NndsH9Qm7k6AS2i2fWbjNA
Co-authored-by: Claude <noreply@anthropic.com>
…ck keys

The ten @object-ui/i18n locale packs are registry sources, so the new
marketplace.install.dependencyMissing keys move the digest that
check-sdui-manifest compares. Regenerated with
`node scripts/gen-sdui-manifest-node.mjs`: sdui.manifest.json is
byte-identical; only the recorded digest changes.

Claude-Session: https://claude.ai/code/session_01NndsH9Qm7k6AS2i2fWbjNA
Co-authored-by: Claude <noreply@anthropic.com>
scripts/sdui-manifest.record.json conflicted on the registry source
digest; resolved by regenerating with
`node scripts/gen-sdui-manifest-node.mjs` over the merged tree
(sdui.manifest.json unchanged).

Claude-Session: https://claude.ai/code/session_01NndsH9Qm7k6AS2i2fWbjNA
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/l documentation Improvements or additions to documentation tests tooling labels Oct 26, 2026
Under `Metadata-protocol: none` the entry is graded `patch`
(Check Changeset).

Claude-Session: https://claude.ai/code/session_01NndsH9Qm7k6AS2i2fWbjNA
Co-authored-by: Claude <noreply@anthropic.com>
The locale packs auto-merged with both sides' keys kept.
scripts/sdui-manifest.record.json conflicted on the registry source
digest; resolved by regenerating with
`node scripts/gen-sdui-manifest-node.mjs` over the merged tree
(sdui.manifest.json unchanged).

Claude-Session: https://claude.ai/code/session_01NndsH9Qm7k6AS2i2fWbjNA
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · ACCEPT · domain:server seat 1 · os-project-manager · session_01R1q2xdtYgU6FKrZ7LgjPCC · 2026-10-26T13:45Z

Head d70fd79740, report 6416975195 (on #25792), claim amendment 6415110715 (item 3). No contract review owed: no packages/spec/** diff and no narrowing. The Console now renders a refusal the server already sends.

item reading
Shape draft, base main, Part of #25792 (item 3), patch changeset, mergeable clean after a main merge.
Files ui/packages/app-shell/src/console/marketplace/dependencyMissing.ts (new reader), marketplaceApi.ts, MarketplacePackagePage.tsx, MarketplacePage.tsx, views/metadata-admin/PackagesPage.tsx, four new test files, 10 locale packs, and one changeset.
Fix The three install-local surfaces (the package page, the catalog org install, and Setup → Packages → Import) draw 422 DEPENDENCY_MISSING from details.unmet[]. Each shows one heading plus one line per unmet entry, keyed by found (absent, out-of-range, unreadable range, unreadable version, unreadable declaration). The reader is all-or-nothing: an unknown found or a malformed entry leaves the server's message standing. Other errors are unchanged; apiJson only adds code/details to the thrown error.
Departures (accepted) (1) scripts/sdui-manifest.record.json was re-recorded with gen-sdui-manifest-node.mjs, because the locale packs are registry sources. The digest changed; sdui.manifest.json did not. (2) The changeset is patch, since Check Changeset refuses minor under Metadata-protocol: none.
Evidence 54 check runs success and 7 expected skips on this head, 0 failed. check-sdui-manifest and the i18n checks (call-site keys, en drift, dead keys, designer-table parity) exit 0. New tests plus packages/i18n: 1,365 passed.
Carried The line names the dependency by package id (「请先安装 app.objectstack.hotcrm 6.x」), not by display name, because the refusal's facts carry no name. A display name needs a server field and would be a follow-up. The open locale-key PRs will conflict on the sdui record line; whichever lands second re-records it with the same tool.
Landing 「按照 pm-dispatch 规则复核过的都授权」 (Leehom, 2026-10-25T11:35Z): ready and auto-merge through the relay.

Generated by Claude Code

The locale packs auto-merged with both sides' keys kept. #26120 split
the sdui record into one file per registry package, so
scripts/sdui-manifest.record.json takes main's version and
`node scripts/gen-sdui-manifest-node.mjs` re-records only
scripts/sdui-manifest.sources/i18n.json for the new locale keys
(sdui.manifest.json unchanged).

Claude-Session: https://claude.ai/code/session_01NndsH9Qm7k6AS2i2fWbjNA
Co-authored-by: Claude <noreply@anthropic.com>
The locale packs auto-merged with both sides' keys kept.
scripts/sdui-manifest.sources/i18n.json conflicted on the i18n digest;
resolved by regenerating with `node scripts/gen-sdui-manifest-node.mjs`
over the merged tree (only the i18n record moves; sdui.manifest.json
unchanged).

Claude-Session: https://claude.ai/code/session_01NndsH9Qm7k6AS2i2fWbjNA
Co-authored-by: Claude <noreply@anthropic.com>
The locale packs auto-merged with both sides' keys kept (main deleted
unread keys in #26158; the dependencyMissing block is untouched).
scripts/sdui-manifest.sources/i18n.json conflicted on the i18n digest;
resolved by regenerating with `node scripts/gen-sdui-manifest-node.mjs`
over the merged tree (sdui.manifest.json unchanged).

Claude-Session: https://claude.ai/code/session_01NndsH9Qm7k6AS2i2fWbjNA
Co-authored-by: Claude <noreply@anthropic.com>
Brings in #26231, which re-points the ObjectSchema corpus guards to 48
(main's own red on Test UI). Clean merge.

Claude-Session: https://claude.ai/code/session_01NndsH9Qm7k6AS2i2fWbjNA
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Re-armed · domain:server seat 1 · session_01R1q2xdtYgU6FKrZ7LgjPCC · 2026-10-26T17:29Z

ACCEPT 6417558550 stands. The queue ejected this PR on conflicts with main, the sdui manifest record and the locale keys. The dev merged main three times and resolved each conflict through the repo's tooling: scripts/sdui-manifest.sources/i18n.json was re-recorded with gen-sdui-manifest-node.mjs. Since those merges the head is 8142154bcb, which carries #26231, the 47→48 ObjectSchema guard re-point that turned main red. No file on this PR's own surface changed meaning in the merges. On this head, 54 check runs succeeded and 7 were expected skips, with 0 failed, and mergeable is clean. Auto-merge is enabled again under 「按照 pm-dispatch 规则复核过的都授权」 (Leehom, 2026-10-25T11:35Z).


Generated by Claude Code

@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 26, 2026
Merged via the queue into main with commit 934810c Oct 26, 2026
61 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-78l2jg branch October 26, 2026 18:21
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/l tests tooling

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants