Skip to content

TenantPlanSchema's doc block claims cloud-side readers fold unknown plan codes to free — that became true only on 2026-08-17, and the citation is wrong #9345

Description

@os-zhuang

Filed by the repo:cloud whole-repo PM seat (objectstack#6026, session session_0137TnZzVmkSjXxoSVgPFS6S) as item 3 of the maintainer ruling on cloud#1380 (2026-08-16), which assigns the filing to the cloud seat and the work to the spec seatpackages/spec is the spec seat's surface, so this card is filed unassigned rather than claimed here.

Spec correction (same round, cross-repo): objectstack's TenantPlanSchema doc block (#7513) is corrected so its "cloud-side readers fold unknown to free" sentence becomes measured truth with an accurate citation — the cloud seat files the objectstack card (spec text surface) with Blocked-by: this card's A landing.

Blocked-by

objectstack-ai/cloud#1380 — specifically its item 1 ("A"), landing as objectstack-ai/cloud PR #1417. ⛔ Do not correct the sentence before that PR merges: until it does, the claim is false on the tenant-runtime side and a "correction" would make the doc block wrong in the opposite direction.

What is wrong today

TenantPlanSchema's doc block asserts that cloud-side readers fold an unrecognized plan code onto free. As of the ruling, that was true of one of the two mirrors:

readerbefore 2026-08-17after cloud#1380 A
service-cloudplanKey (control plane)folds unknown → freeunchanged
objectos-runtimeisFreePlan (tenant runtime)granted PAID for unknownfolds unknown → free

So the sentence described the control plane and generalized it to "cloud-side readers". The disagreement between those two mirrors is the entire subject of cloud#1380 — a spec doc block asserting they agreed is what let it go unnoticed.

The citation attached to the sentence is also inaccurate; the correction should point at the ruling and at the code that actually implements the fold, not at the earlier reference.

What the corrected text has to say

  1. Unrecognized codes fold to free on both mirrors, as of the cloud#1380 ruling (2026-08-16) — with the accurate citation.
  2. The fold is at the entitlement layer, not in normalization. sys_environment.plan keeps the raw value modulo case, so "a tier I do not know" stays distinguishable from "the free tier" for any reader, log line, or operator. (Sinking it into normalization would have erased that distinction before anything could observe it — the reason cloud#1389 / PR chore: version packages #1393 states normalize the spelling, never the vocabulary.)
  3. The ruling's operational corollary, because it is the premise the fold rests on: new tiers are minted rarely, and images roll before a new tier is sold. If that discipline changes, this ruling's premise changes with it. It now lives in isFreePlan's docstring on the cloud side; the spec text should not contradict it.

⚠️ Do not write the sentence as if the two vocabularies are now one list. They are not — A landed over a copy, guarded by an element-for-element equality pin. Unifying them is objectstack-ai/cloud#1418 (ruled, not yet done), and a SHA-pinned image can predate a vocabulary entry even after that lands.

Scope

packages/spec text surface only — a doc block correction, no schema or behaviour change. ⛔ This card carries no authority to change what TenantPlanSchema validates.

Related

objectstack-ai/cloud#1380 (the ruling and A) · objectstack-ai/cloud PR #1417 (A as landed) · objectstack-ai/cloud#1418 (item 2, the shared vocabulary) · objectstack-ai/cloud#1389 (the spelling red line) · objectstack#7513.

Metadata

Metadata

Assignees

Type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions