Status:
accepted · ADR-36 · Filed 2026-04-30Title
Reserved-seams pattern: schema columns present in v1 with no consumer, sized to absorb future SPEC additions without re-plumbingDecision
Apply a “reserved-seams” pattern in SPEC-056 schema: include columns and naming conventions that have no consumer in the immediate scope but are sized to absorb specific named future work without schema migration. Specifically:agents.agent_service_id UUID NULL— reserved for the future Enterprise Agent Services catalogue. No FK target table created in v1; column sits NULL on every row.users.github_login TEXT NULL— reserved for the future GitHub-invite cross-network collaboration flow.signal_queue.from_user_id+from_agent_session— reserved for cross-tenant audit trail when project_memberships ship.- Channel naming includes
tenant_idqualifier even where same-tenant subscription is the only path today (prism:events:project:{tenant}:{org}:{project}) — reserves space for cross-tenant project access via memberships without channel rename. - Header
X-Prism-User-Idcarried in v1 even though Personal Install has one user; reserves space for multi-user-per-tenant onboarding (Joe joins Frank’s Personal Install).
Rationale
Schema migrations on a multi-tenant production system carry meaningful coordination cost: data backfill, downtime windows, follow-up cleanup. Each future feature (cross-tenant memberships, agent catalogue, GitHub invites) would otherwise require its own schema migration touching the same hot tables (agents, users, signal_queue). Doing them once with explicit reserved seams gives:
- One migration, multiple downstream specs. Future-spec implementers add behavior + tests, not schema.
- Explicit named coupling. Each seam is in the SPEC;
git grepfor the column name surfaces every place the future-spec author needs to touch. - Lower regression risk. Future migrations don’t have to recompute backfill across the same tables.
feedback_optimize_later rule applies to architecture too: don’t reserve seams for hypothetical futures, only for explicitly-listed future SPECs (catalogue, memberships, invites, deployment-modes).
Alternatives Considered
- No reserved seams; let each future SPEC do its own schema migration. Operationally simpler now, harder later. Each future spec touches the same hot tables independently — three migrations instead of one, with risk of conflicting column naming or backfill assumptions.
- Reserve broadly — every plausible future feature gets a column. Speculative; violates
feedback_optimize_later. The pattern only works if seams are tightly scoped to named-and-prioritized future SPECs. - Reserved seams as separate migration, run later. Same operational cost as separate spec migrations; loses the “do it once” benefit.
Status
acceptedReferences
- SPEC-056 §Reserved seams
- Memories:
project_future_enterprise_agent_services,project_future_github_invite_collab,project_future_cross_internet_deployment_modes,feedback_optimize_later

