Creating a workspace for an organization without a default pool creates one with no plan #240
Open
opened 2026-10-18 19:36:17 +00:00 by cgalo5758
·
0 comments
Labels
Clear labels
accessibility
area/billing
area/catalog
area/discourse
area/domains
area/entitlements
area/fedwiki
area/identity
area/integrations
area/licensing
area/member-ui
area/meta
area/operator-ui
area/ops
area/testing
duplicate
good-first-issue
invalid
privacy
security
upstream
wontfix
A barrier for people using assistive technology or a keyboard alone.
The Stripe mirror, checkout, subscriptions, invoices, fulfillment.
Products, prices, plan ladders, purchasability.
The Discourse integration.
The domains registry, claims, placements, the certificate ask.
Entitlement sets, rules, grants, pools, provisioning.
The Federated Wiki integration and farm sync.
Sign-in, sessions, persons, organizations, workspaces, roles.
The provider registry, outbox and webhooks in general.
Licenses, the contributor agreement, SPDX headers.
Member pages.
The repository itself, its contributing guide, CI, the tracker and the workflow.
Operator pages, forms, lists, the design system.
Deployment, configuration, migrations, workflows, instance settings.
The test stack, screens, lint, walkthroughs.
Closed because another issue already covers it.
Small, self-contained, and explained enough to be a first contribution.
Closed because it is not a ticket for this repository.
Touches what a person's data reveals.
Touches authentication, authorization, secrets or data exposure.
Waits on another repository or project before it can move.
Closed because it will not be done, with the reason in the last comment.
kind
bug
The software does something other than what it promises; closed when it again does what it promises.
kind
debt
Code, tests or tooling to clean up with nothing visible changing; closed when they are cleaner.
kind
design
A question to settle before work can be defined; closed when the decision is written down.
kind
docs
Documentation that is wrong or missing; closed when it says the right thing.
kind
enhancement
Something the software does not do yet; closed when it does.
priority
critical
Blocks the active milestone or harms members now.
priority
high
Next in line inside the active milestone.
priority
low
Inside the active milestone, when nothing else is left.
priority
medium
Inside the active milestone, after the high ones.
Milestone
No items
No Milestone
Projects
Clear projects
No projects
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: wiki-cafe/member-console#240
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
What happens
An organization's default pool is the pool its plan and entitlements are delivered to. Signup and the member's "Create workspace" form share one function,
CreateWorkspaceWithPrimaryAssignment, and when the organization has no default pool, that function creates one.At signup this is the normal path:
AutoProvisionopens its transaction withBeginMaterializing, which takes the plan lock, and gives the new pool its default plan right after. The "Create workspace" handler calls the same function in a plain transaction, with neither. If an organization has no default pool when a member creates a workspace, the handler creates one with no plan, and the pool stays plan-less until something else restores its default.What should happen
Only signup creates an organization's default pool, under the plan lock and followed by its default plan. The shared function takes the pool as signup created it, and the "Create workspace" path refuses with an error and logs it at Error level when the pool is missing.
Where
internal/provisioning/workspace.go:72-86,internal/server/workspace_partials.go:121,internal/provisioning/provisioning.go:47and:125Steps
An organization has no default pool only through damaged data: signup creates it, and nothing deletes one. The "Create workspace" control is shown only when the organization already has more than one workspace (#139), but the route answers a direct request from any signed-in member.
Why it matters
A pool with no plan delivers no entitlements, and creating it silently covers up the damaged data that left the organization without one instead of reporting it.
Related: #221 and #186 list this handler's transaction among those opened by hand; neither covers which code may create a default pool.