Uh oh!
There was an error while loading. Please reload this page.
docs(spec): TenantPlanSchema doc block states the entitlement-layer fold, not normalization (#9345) - #9492
Merged
Merged
Conversation
…old, not normalization (#9345) TenantPlanSchema's doc block claimed unrecognized plan codes fold to free via "the cloud distribution's normalization." That was wrong on the mechanism and the citation as of the cloud#1380 ruling (2026-08-16), landed in cloud PR #1417 (merged 2026-08-17): - The fold happens at the entitlement layer (isFreePlan), not in normalization -- sys_environment.plan keeps the raw value (case- normalized only), so an unrecognized tier stays distinguishable from the free tier to any reader, log line, or operator (cloud#1389's red line: normalize the spelling, never the vocabulary). - Before the ruling, only the control-plane planKey reader folded unknown to free; the tenant-runtime isFreePlan reader granted paid access. As of cloud PR #1417 both mirrors fold. - The two mirrors' vocabularies are not merged into one list (cloud#1380 lands over a pinned copy; unifying them is cloud#1418, ruled but not landed, and a SHA-pinned image can predate a vocabulary entry even after that lands). - Carries the ruling's operational premise -- new tiers are minted rarely, images roll before a new tier goes on sale -- consistent with cloud's isFreePlan docstring. Doc-block prose only. No schema, validation, or behaviour change -- TenantPlanSchema still accepts any string; acceptance is byte-identical. Fixes#9345 Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Fs18A2DdXLVN2h8PaaFBcP
Contributor
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 1 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 113 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Aug 18, 2026
os-steve
marked this pull request as ready for review
August 18, 2026 09:28
Uh oh!
There was an error while loading. Please reload this page.
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 freeto 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#9345
What changed
TenantPlanSchema's doc block (packages/spec/src/cloud/tenant.zod.ts:47-50)claimed the free-tier fold for unrecognized plan codes was "the cloud
distribution's normalization." That was measured wrong on the citation and
on the mechanism, per cloud#1380's ruling (2026-08-16) and its landing in
cloud PR #1417 (merged 2026-08-17). Doc-block prose only — no schema or
behaviour change;
TenantPlanSchemastill accepts any string.Before (
packages/spec/src/cloud/tenant.zod.ts:47-50)After (
packages/spec/src/cloud/tenant.zod.ts:47-69)The three do-not-write traps (unlock comment, 2026-08-17T16:02Z) — each checked off
attributes the fold to
isFreePlan(entitlement evaluation), states thatsys_environment.plankeeps the raw value (case-normalization only), andcites cloud#1389's red line by name (normalize the spelling, never the
vocabulary). It never uses the word "normalized" to describe the
unknown-to-free fold.
explicitly that cloud#1380 lands over a pinned copy, that unifying them
is cloud#1418 (ruled, not yet landed), and that even after feat(connector-slack): Slack Web API connector + connector/channel reconciliation (ADR-0022) #1418 lands a
SHA-pinned image can predate a vocabulary entry.
isFreePlan's docstring.New tiers are minted rarely and images roll before a new tier goes on
sale; if that discipline changes, the premise changes with it — worded to
not contradict the cloud-side docstring per the unlock comment (re-verified
quote of the merged
isFreePlanis the measurement of record; this repocannot read the cloud repo directly).
Verification (all at head
102813d6b)pnpm --filter @objectstack/spec build— clean.pnpm --filter @objectstack/spec check:generated— all 13 generatedartifacts up to date (the JSDoc block is not read by
build-docs.ts; only.describe()strings are, and those are unchanged, so no regeneration wasneeded).
pnpm --filter @objectstack/spec typecheck— clean.pnpm --filter @objectstack/spec test— 409 test files / 10915 testspassed, 0 failed.
node scripts/pm/dispatch-gates.mjs packages/spec/src/cloud/tenant.zod.ts), all green:check:cross-package-test-inputs,check:doc-formula-expressions,check:spec-parsed-alias,check:type-source-resolution,check:merge-driver,check:empty-state,check:variant-docs,check:dev-prereqs --self-test(the CI-run form —CI never runs the full-workspace scan directly, see the script's own
header),
check-affected-docs.mjs --self-test(its only CI-run form).check:strictness-ledgerandcheck:livenessare covered insidecheck:generatedabove.grep -naP '[\x00-\x08\x0b\x0c\x0e-\x1f\x7f]'over the changed files — clean.Scope
packages/specdoc-block text only. No schema, validation, or behaviourchange — acceptance is byte-identical. Changeset:
@objectstack/specpatch.Generated-artifacts coupling
Wave-8 siblings: #9463, #9406, #9447 — landings serialize; a later lander
runs
scripts/pm/os-regen-merge.shper AGENTS.md §11 if a merge commit isneeded. This PR is left as draft; the PM lands it.
Generated by Claude Code