Skip to content

[finding] CloudOperations is a phantom surface: the installed @objectstack/client has no cloud namespace, so deploy() fabricates a deploymentId for work that never happened #4152

Description

@yinlianghui

Found while implementing #3720 (measuring what the deploy API's accepted vocabulary actually is). Filed unassigned, recording only — PD #10.

Fact

packages/data-objectstack/src/cloud.ts exports a CloudOperations class whose four methods all call into client.cloud?.*. The installed @objectstack/client@17.0.0-rc.5 exports no cloud namespace at all — its export list is ObjectStackClient, ScopedProjectClient, RealtimeAPI, QueryBuilder, FilterBuilder and their types. There is no deploy, no getDeployment, no marketplace.

The constructor's getClient is typed to return any, so every one of these optional chains resolves undefined at runtime and falls through to its literal fallback:

method what it returns when the client has no cloud surface (i.e. always)
deploy(appId, config) { deploymentId: 'deploy-' + Date.now(), status: 'pending' }
getDeploymentStatus(id) { status: 'unknown' }
searchMarketplace(...) []
installPlugin(id) { success: false }

CloudOperations and the three Cloud*Config / CloudMarketplaceEntry types are re-exported from packages/data-objectstack/src/index.ts (lines 3783-3784), so this is published public surface of @object-ui/data-objectstack. Nothing in this repo constructs it except src/v3-compat.test.ts, whose two cloud cases assert only that the fallback has the right keys — which is why the emptiness has never shown up as a failure.

Why this is graded observation-class (and why that grade may be wrong)

By the stated criterion it is dormant: no in-repo consumer wires CloudOperations, so nobody is bitten today.

The reason I would not be surprised to see this promoted: deploy() does not degrade to an error, it manufactures a plausible-looking success. A caller gets a well-formed deploymentId and status: 'pending' for an operation that never left the process, then polls getDeploymentStatus(thatId) and receives { status: 'unknown' } forever. That is the consumer-side-tolerance shape AGENTS.md #12 exists to forbid, sitting in shipped public API rather than in a private helper — a latent defect rather than merely an observation. Severity judged at filing time being unreliable, I am recording both readings and leaving the grade to triage.

Adjacent, same file, same theme

The module header still reads Cloud namespace integration for @objectstack/spec v3.0.0 / Replaces the legacy Hub namespace. The resolved spec is 17.0.0-rc.5, and the "cloud deployment, hosting, and marketplace schemas" it claims to integrate are not what the package consumes. Noted here rather than as its own card, since any disposition of the surface above settles it too.

Possible directions (left for triage)

Whichever way it goes, #3720's pin test and comment on environment stay correct — they document a deploy-target vocabulary and explicitly name the missing producer as the reason nothing is imported.

Refs #3720, PR #4151.


Generated by Claude Code

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions