retire(data): remove the phantom CloudOperations surface - #4239
Merged
Conversation
`CloudOperations` and its `Cloud*Config` / `CloudMarketplaceEntry` types were published surface of `@object-ui/data-objectstack` whose four methods all optional-chained into `client.cloud?.…` — a namespace no released `@objectstack/client` has ever exported (re-measured at 17.0.0-rc.6). Every call therefore returned a fallback literal, and `deploy()` fabricated a well-formed `deploymentId` for work that never happened. Executes the maintainer ruling of 2026-08-11: the surface is removed rather than stubbed. No compile-compat stub was needed — measured repo-wide, the only importers were the package's own index, `v3-compat.test.ts` and objectui#3720's vocabulary pin. The false module header goes with the file. #3720's pin retires with its subject; a negative pin replaces the retired test cases and fails if any of the four names returns, reading both the runtime export list and index.ts's source text (the only instrument that can see a returning `export type`). Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017Qqyix2QcnpUC9XeYVDzx3
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
Contributor
✅ Console Performance Budget
📦 Bundle Size Report
Size Limits
|
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #4152
Executes the maintainer ruling of 2026-08-11 (four-lens review) recorded on the card: the
CloudOperationssurface is removed, not repaired; fabricated success is banned; the false module header goes with it.Premise re-measured on this tip, at rc.6
The card was filed against
@objectstack/client@17.0.0-rc.5. The dependency has since moved to^17.0.0-rc.6, so the premise was re-probed against the installed package before deleting anything — if rc.6 had added acloudnamespace, the ruling would have been made against a fact that expired.It has not. The module's runtime export list is exactly seven names:
and a constructed client's
.cloudisundefined. The instance carriesactions, ai, analytics, approvals, auth, automation, data, datasources, email, i18n, keys, meta, notifications, oauth, organizations, packages, projects, reports, search, security, shareLinks, shares, storage— note that the two nearest real surfaces,projects(which owns/api/v1/cloud/environments) andpackages(which owns marketplace installs), are not what these methods reached for.client.cloud?.deploy,client.cloud?.getDeploymentandclient.cloud?.marketplaceresolveundefinedexactly as the card measured, so every method returned its fallback literal —deploy()handing back a well-formeddeploymentIdfor work that never left the process.Consumer measurement, and the stub-vs-delete verdict
The ruling permits a compile-compatibility stub throwing loud NotImplemented, but only where a compile need is demonstrated. Measured repo-wide (all
.ts/.tsx/.md/.mdx/.json, excludingnode_modules), the importers ofCloudOperationsand the three types were:packages/data-objectstack/src/index.tspackages/data-objectstack/src/v3-compat.test.ts{}packages/data-objectstack/src/cloud-environment-vocabulary.pin.test.tsCloudDeploymentConfigas a type (objectui#3720's pin).changeset/cloud-deploy-environment-vocabulary-3720.mdNo app, no other package, no doc page, no README.
content/docs/and the package README were swept forCloudOperations/ cloud-namespace claims and returned zero hits, so there was no published documentation to correct.Verdict: delete outright. With no consumer that must keep compiling, a stub would be a second phantom surface guarding the first. This is confirmed downstream rather than assumed — see the consumer sweep below.
objectui#3720's pin retires with its subject
cloud-environment-vocabulary.pin.test.tspinned the doc comment onCloudDeploymentConfig.environment: the deliberate three-member deploy-target vocabulary, and the trap thatstagingis not aDiscoveryEnvironmentmember. Its subject is deleted here, so the pin retires with it rather than being re-pointed.Checked before deciding: every fact it held was a claim about that comment, and its two spec-side assertions (the
DiscoveryEnvironmentSchemaandEnvironmentTypeSchemamember lists) existed only to keep those claims honest. Grepped repo-wide, that pin was the only in-repo reader of either schema — with the comment gone they would pin an upstream library's enums on behalf of no local reader, which is the same phantom shape this card closes.#3720's own conclusion is unaffected and now moot: it found no producer-side deploy-target type to converge onto because the producer did not exist, and this PR removes the consumer that was waiting for one. Its pending changeset (
cloud-deploy-environment-vocabulary-3720.md) is removed too — it never released, and it announced a deliberate vocabulary on a type this same release deletes.What replaces the retired tests
v3-compat.test.ts's three cloud cases asserted only that the results had the right keys, which is how the emptiness stayed green for as long as it did. They are replaced by a negative pin,src/cloud-surface-retired-4152.pin.test.ts, which fails if any of the four names returns. It reads both surfaces, and the two halves are not redundant:export typeerases;index.tsfor the names and for a re-export of./cloud— the only instrument that can see a returning type.Reverse verification
Prediction stated before running: restoring
cloud.tsand the re-exports fromorigin/mainturns the pin red, and the three type names must stay green in the runtime half while being caught only by the source-text half.Confirmed —
git checkout origin/main -- cloud.ts index.ts, re-run, restore:The three erased types passing the runtime half and failing only the source-text half is the measured justification for keeping both halves — drop either one and half the retired surface can come back green. (Honest correction: the direction was predicted correctly, but the count stated up front was "7 red"; the enumeration it was drawn from adds to 8. Actual is 8 red / 4 green.)
Gates
vitest run --project unit packages/data-objectstack/— 27 files, 388 tests passed, both before the reverse verification and after restoring.turbo run build(43/43 successful) — needed because the consumer sweep type-checks against builtdist/*.d.ts, and a stale tree reports a removal as "cannot find module".dist/index.d.tsanddist/index.jscontain zero occurrences of the four retired names.pnpm --filter '...@object-ui/data-objectstack' type-check) — 34 of 46 workspace projects, all Done, including@object-ui/react,app-shell,apps/console, everyplugin-*,runner,cliand the examples. Nothing downstream was using the removed surface, which is what turns the delete-vs-stub verdict from a presumption into a measurement.pnpm --filter '@object-ui/data-objectstack' lint— 0 errors (355 pre-existinganywarnings inindex.ts/userState.ts, none in the changed files).check:control-bytesOK;check-changeset-no-majorOK;check-changeset-presenceOK (1 changeset for 4 changed source files of 1 released package).Changeset is
minorper the repo's version policy and the retirement precedent (#4145): objectui's own breaking changes never declaremajor. The removed names are spelled out FROM → TO in its body.Generated by Claude Code