Epic: spaces membership v2 — app-owned model (default) + IdP-write as optional power mode #211
Labels
No labels
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference: Cordy/Cairn#211
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Umbrella for the spaces/membership rework decided after the openbao dogfood surfaced #209/#210.
Decision (full analysis in the ADR sub-issue): today spaces management requires Cairn to hold write access to the IdP (
spaces.Manager, gated on thestorage.encryption.keycloak*admin client). That doesn't generalise — it needs a realm-admin-grade credential (manage-users), is an enterprise non-starter for AD (the very reasonopenbaocustody exists), conflates config with key custody, and cuts against Cairn's minimal-blast-radius line.Target model (Option C):
groupsclaim /memberOf. No credential..cairn-state/backend, exactly like shares/holds/peering trust. No IdP write, works onlocal/oidc/ldap/AD uniformly.Sub-issues: ADR/docs · app-owned membership store · scope integration · config decouple + optional power mode · frontend feature-detect + error surfacing · member picker · handbook docs.
Resolves as it lands: #209 (create-space 404 / empty error) and #210 (add-member no feedback + picker).
Greenlit end-to-end; worked through in order.
Complete. All sub-issues merged green to
main:/mecapability + frontend feature-detect + robust errorsspaces.md) + ADR cross-linkApp-owned spaces are now the default: create-space and member management work with no IdP client, under every auth mode and key custody. #209 and #210 are fixed in code. Remaining follow-up: #226 (candidate autocomplete, low priority).
Next: cut
v0.6.17, redeploy the dogfood, verify live.Epic landed and verified end-to-end on both deployment types.
Shipped (all sub-issues closed):
docs/adr/0001-spaces-membership.md(two-model decision, blast-radius/AD/SoD reasoning, industry grounding, security/trust table), linked from ARCHITECTURE.md./spaceslist unions both, deduped.storage.encryption.keycloak*→auth.groups(read client for live groups #96;managepower mode for IdP-write), legacy back-compat preserved; default = app-owned, no IdP calls.me.spaces {create, manageMembers}) + real error surfacing (no more emptyCreate failed:).spaces.mdrewrite (two kinds of space, config, power-mode blast-radius, back-compat), encryption.md coupling fixed, ADR cross-linked.Released v0.6.17, plus v0.6.18 hotfix for the members-dialog reading the raw
Responsewithout.json()(empty/"not iterable" list).Live verification (v0.6.18):
IdP-managed spaces enabled (power mode)... requires manage-users): members dialog renders the directory-group members, already-member validation fires. Confirms the #216 gating selects the right store per instance and the v0.6.18 fix works on both paths.Resolves #209. The only remaining thread is the candidate autocomplete polish (#226), which also carries the picker portion of #210 — in progress now; #210 will close together with #226. Closing the epic.