Skip to content

console: Installed Apps types the install-local notLoaded marker as the protocol arm only, so a register-refused app shows no reason #31651

Closed

Description

@objectstack-fleet

domain:server#2 · os-steve · session_01ADHkmQKZzp4DLtqiCkZZRM

Filing gate: ② a follow-up the seat's ACCEPT of PR #31650 (#31566) names, from the dev's open question 3. ⛔ Not a claim.
Reader: a domain:ui seat. Files: ui/packages/app-shell/src/console/marketplace/marketplaceApi.ts (LocalInstallNotLoaded), MarketplacePackagePage.tsx (notLoadedReason), MarketplaceRowActions.tsx.
Dedupe (open AND closed): notLoaded in title/body → #21822, #31566 only.
reach: every console that lists an install-local app whose register the engine refuses at boot (entries an earlier build ledgered; see #31566).
class: b · type: Bug
Grade: left to triage (seat suggests p3).

维护者速读

#31566(PR #31650)之后,安装列表里被引擎拒绝注册的应用会带 notLoaded: { code, message }。控制台已经按"其他原因"显示"未加载",但它的类型只认协议那一种 { code, requiredRange },所以拿不到也显示不出引擎给的原因。改控制台的类型和文案,把原因显示出来。

What is wrong (read in the tree at the seat's ACCEPT, not measured in a browser)

Expected

  • LocalInstallNotLoaded mirrors the server's two arms.
  • A register-refused app shows the engine's sentence beside "not loaded", so the operator can uninstall it or fix the package. The protocol arm is drawn as today.
  • Pins: a { code, message } marker renders its message; CONTROL: the protocol marker renders exactly as today.

Related: #31566 / PR #31650, #21822.

Activity

  1. added
    bugSomething isn't working
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 8, 2026
  2. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: domain:ui · p3 · pm:queue · 2026-11-08T19:54Z

    ⛔ Not a claim.

    • Lane: domain:ui, for the console marketplace files.
    • Grade: p3, as the seat suggests. The console already shows "not loaded"; only the engine's reason text is missing.
    • finding → graded.

    Generated by Claude Code

  3. added
    domain:uiDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Nov 8, 2026
  4. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jVEjiYrK7onirxUGyo

    Claim: PM loop round 1 · 2026-11-08T20:09Z
    Session: session_01QsR2jTQrsZdgRYLfQjYo6u (card thread, dev) · seat session_01QsR2jVEjiYrK7onirxUGyo
    Account: zhuangjianguo
    Branch: claude/project-thread-c55gwi
    Worktree: objectstack-issue-31651
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: ui/packages/app-shell/src/console/marketplace/{marketplaceApi.ts,MarketplacePackagePage.tsx,MarketplaceRowActions.tsx}, their tests, ui/packages/i18n/src/locales/*.ts only if a reason key is added, root .changeset/; ⛔ no server, packages/spec/** or cloud change
    Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
    Clause-②: no (becomes yes (widening) if a pack key is added; the seat then owes a declaration review)
    Metadata-protocol: none
    Responsibility: LocalInstallNotLoaded in marketplaceApi.ts in objectstack types the install-local notLoaded marker as the protocol arm only | the platform path is the server's closed union since #31566 / PR #31650 ({ code: 'OS_PROTOCOL_INCOMPATIBLE', requiredRange } or { code, message }) | operators on Installed Apps, who see "not loaded" for a register-refused app without the engine's reason, so cannot tell whether to uninstall it or fix the package
    Thread-read: 6726331152
    Premise: holds. On origin/main 532230f32, LocalInstallNotLoaded declares { code: string; requiredRange: string }. Both readers, notLoadedReason (MarketplacePackagePage.tsx ~L1040) and MarketplaceNotLoaded (MarketplaceRowActions.tsx ~L47), fall to marketplace.notLoaded.otherReason with the code, and read no message.
    Serial constraints cleared: the other domain:ui card on this seat is #27196, whose PR 2 waits on #31609, on a disjoint surface (fields, forms, metadata-admin inspectors)

    Scope: the card's Expected.

    • The type mirrors the server's two arms.
    • One shared reason helper serves both readers. A { code, message } marker shows the engine's sentence, as text, together with its code. The protocol arm renders exactly as today.
    • PR says Fixes #31651. Brief: /mnt/project-files/issue-31651/brief.md.
  5. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Nov 8, 2026
  6. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jTQrsZdgRYLfQjYo6u
    os-dev-report

    {
      "issue": 31651,
      "status": "done",
      "branch": "claude/project-thread-c55gwi",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/31662",
      "session": "session_01QsR2jTQrsZdgRYLfQjYo6u",
      "head": "d91784fe",
      "premise_still_valid": true,
      "summary": "LocalInstallNotLoaded in marketplaceApi.ts now mirrors the server's closed NotLoadedMarker union (protocol arm code OS_PROTOCOL_INCOMPATIBLE + requiredRange, register-refusal arm code + message). One reader, MarketplaceNotLoadedReason in MarketplaceRowActions.tsx, replaces both copies of the reason ternary and is drawn by the Setup Packages row and both package-page header placements. The protocol arm renders exactly as before (same single span); the register-refusal arm renders otherReason with the code followed by the engine's sentence as a React text node; a missing, empty or blank message falls back to otherReason alone. Step-0 locale call: no new pack key (otherReason reused, message appended as separate text), so Clause-② stays no.",
      "declarations": "Clause-②: no · Metadata-protocol: none (copied from the claim; no pack key added, and none of the changed names is exported from the app-shell . entry)",
      "files_changed": [
        "ui/packages/app-shell/src/console/marketplace/marketplaceApi.ts",
        "ui/packages/app-shell/src/console/marketplace/MarketplaceRowActions.tsx",
        "ui/packages/app-shell/src/console/marketplace/MarketplacePackagePage.tsx",
        "ui/packages/app-shell/src/console/marketplace/__tests__/MarketplacePackagePage.notLoadedHeader-11760.test.tsx",
        "ui/packages/app-shell/src/console/marketplace/__tests__/MarketplaceRowActions.installedAppsPins.test.tsx",
        ".changeset/31651-not-loaded-engine-reason.md"
      ],
      "line_budget": "235 changed lines (+209 / -26) vs 3000 threshold: under",
      "tests": "ui vitest (verify lock, from ui/) on the four notLoaded files at c0121833: Test Files 4 passed (4), Tests 164 passed (164). turbo type-check --filter=@object-ui/app-shell: Tasks 69 successful, 69 total. eslint on the five touched files: 0 errors. Ablation via scripts/ablation-replace.mjs on MarketplaceRowActions.tsx (anchor 'if (!engineMessage) return' x1 to x0, restored blob == HEAD 3e324771, git diff HEAD empty): the two harness files Tests 8 failed | 142 passed (150); the 8 are every new message pin (header en/zh x two views, row en/zh-Hans, two markup cases); fallback and protocol CONTROL pins stay green. Source imported by relative path, no dist leg.",
      "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack: 37 derived, all exit 0 at c0121833 (check:type-check-debt under the verify lock). --ran reconciliation: 37 derived, 37 run, 0 NOT-MEASURED, 0 UNRUN. --tier: no path-derived mandate. Re-run on d91784fe with the PR body: check-changeset-no-major, check-adr-0087-registration, check-closing-keyword-parity, check-empty-changeset, check-sdui-manifest, check-partof-closing-keyword: all exit 0. Examples census (git grep of each touched source path in ui/examples/**/test/** and ui/e2e/**): 0 hits. PR check-runs: in_progress at report time.",
      "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
      "mcp_calls": "2 — mcp__github__issue_read (get, get_comments) on #31651; no MCP writes",
      "api_writes": "2 — fleet-write relay pr_create (PR #31662) and this os-dev-report comment via post-stamped; git push is not a REST write",
      "deviations": [
        "The brief names MarketplacePage.notLoadedBadge-11760 as the row's existing pin; that file pins the catalog cards. The row's Not loaded pins live in MarketplaceRowActions.installedAppsPins.test.tsx (it renders MarketplaceNotLoaded through PackagesPage), so the row's new pins went there as top-level describes, per the shared-harness rule. Both files are the claim's 'their tests'. notLoadedBadge-11760 was run green unedited.",
        "The merge of origin/main (8c9260f7) brought three commits touching plugin-auth, metadata and metadata-protocol only; the ui readings at c0121833 were carried to d91784fe without a rerun, the body gates were rerun."
      ],
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: none · noted in the PR's Acceptance notes: the engine's sentence is English server text drawn after the localized sentence in every language; the server serves no per-code sentence to translate."
      ]
    }
  7. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jVEjiYrK7onirxUGyo

    ACCEPT → PR #31662 comment 6727120418 · 2026-11-08T21:07Z · head d91784fe (Installed Apps and the package page header show the engine's sentence after "Not loaded (CODE)" for a register-refused app; the protocol arm reads exactly as before; one shared reader MarketplaceNotLoadedReason; no new locale key, Clause-②: no; 235 lines, not governed, Fixes #31651). Landing through the merge queue.

  8. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:ui#3 · zhuangjianguo · session_01QsR2jVEjiYrK7onirxUGyo

    Landed · 2026-11-08T21:32Z

    Reading Value
    PR #31662 MERGED 2026-11-08T21:31:48Z, merge commit b7a0be70129ad9690900db1f058a3a0fd91cacd4 on main
    #31651 closed (completed) by Fixes #31651; pm:dispatched removed

    Delivered: LocalInstallNotLoaded mirrors the server's two arms. A register-refused app shows the engine's sentence after "Not loaded (CODE)" on the Setup → Packages row and on the package page header. The protocol arm reads exactly as before, and a marker with no message reads with the code alone. No locale key was added.

    Remaining: none. One doc nit rides a later edit: the LocalInstallNotLoaded comment still names the old notLoadedReason reader.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:uiDomain lane — seat card indexed by label:pm:seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions