Skip to content

console: StorageUsageBanner probes the cloud-only GET /api/v1/usage/storage on every shell mount, so every page load logs a 404 on a non-cloud deployment #11002

Description

@objectstack-fleet

Ruled: 5890841811 · letter A — cloud declares features.storageUsage derived from mounting the endpoint plugin; objectui reads it default-off, one boolean for both banners · 2026-09-29T13:04Z
Unblocked: the cloud half, objectstack-ai/cloud#2481, closed completed 2026-10-01T04:12Z through PR objectstack-ai/cloud#2517. Cloud main 2205b53 serves features.storageUsage exactly when the composition mounts StorageUsageEndpointPlugin (packages/objectos-runtime/src/cloud-runtime-config-plugin.ts:97). Re-derived 2026-10-04 by domain:ui seat 1: no new blocker.

Symptom

On a self-hosted or open-source objectstack runtime, every console page load issues GET /api/v1/usage/storage and gets 404. The browser console shows Failed to load resource: the server responded with a status of 404 on every navigation that remounts the shell.

Mechanism

  • StorageUsageBanner (objectui#10439, landed as feat(app-shell): the environment admin's storage-capacity banner, from the served verdict (objectui#10439) #10910) is rendered unconditionally in packages/app-shell/src/console/ConsoleShell.tsx.
  • Its hook useStorageUsageReading defaults to enabled = true and calls readStorageUsage(), which fetches ${apiBase}/usage/storage.
  • The endpoint is served only by cloud's StorageUsageEndpointPlugin, as objectui#10439 itself records.
  • objectstack's own runtime mounts no such route, and /api/v1/discovery advertises none. The hook's .catch swallows the failure, so the banner correctly renders nothing, but the request is made and fails on every mount.

Reproduction

  1. Boot objectstack's showcase at objectui pin dd3f7e1be356 (objectstack dev).
  2. Sign in and open any console page.
  3. The network log shows GET /api/v1/usage/storage → 404, repeated on each shell mount.

Expected

The banner only asks when the runtime serves the reading: gate the hook on something the server advertises (discovery or runtime config), the way a capability-gated surface does. A deployment without the endpoint then issues no request. Machine-readable surfaces here should neither lie nor be guessed at.

Activity

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:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions