Catalog and enablement (future)
The shipped catalog and enablement model — seed-driven catalog, per-org enablement tables, vendor-credential strategy pattern — is described in Current state → Catalog and enablement. This page covers planned evolutions.
Runtime catalog (CatalogAdmin CRUD)
Today: ProductDefinition and IntegrationDefinition are populated via seed migrations. Adding a product means writing and shipping a migration.
Target: Admin endpoints that mutate the catalog at runtime, with cluster-wide cache invalidation.
Open:
- CRUD endpoints gated on PLATFORM identity authority
- Cache invalidation via
RedisBroadcastChannelService(acatalog-invalidatechannel, parallel toancestry-invalidate) - Strategy-pattern hooks for new product/integration types
Tracking: OpenSpec deferral D1 in openspec/current-decisions-for-future-tracking.md. Triggered when a second product is added or an admin UI for catalog management is built.
Integration availability validation
Today: Activating an OrgProduct to ACTIVE does not block on required-integration presence — the platform warns but proceeds.
Target: Hard gating at activation: an org cannot activate a product unless its required integrations (per industry, per product-industry-config) are connected and active.
Open:
- DTO-level validation calling
isAvailable()on the integration definition - Per-vendor
isAvailable()semantics via the strategy interface (each vendor knows what "available for this scope" means)
Tracking: OpenSpec deferral D2.
Orphan cleanup cron
Today: Integration instances are created atomically on connect. There is no PENDING state in steady-state usage, so there are no orphans to clean.
Target: With OAuth2 two-step connect (PENDING → CONNECTED transition), abandoned consent flows leave orphaned PENDING instances. A periodic cron sweeps stale instances older than the TTL.
Open: Coupled to D3 (OAuth2 two-step connect) — ship them together when the first OAuth2 vendor lands.
Tracking: OpenSpec deferral D4.
Suspended product lifecycle
Today: OrgProductStatus.SUSPENDED exists in the enum but is rejected by the activation DTO whitelist. The state is a placeholder for billing-driven suspension.
Target: Billing integration writes SUSPENDED when an account fails to pay or downgrades; routing surfaces a "Service suspended" affordance.
Open: A billing/subscription layer is the unblocker — none exists today.
Tracking: OpenSpec deferral D8.
Catalog cache invalidation
Today: The catalog is read-only at runtime, so cache invalidation is not needed.
Target: Once the catalog admin CRUD lands (D1), cache invalidation becomes a hard requirement. The mechanism is already in place — RedisBroadcastChannelService — but no current consumer needs it.
Open: Couples to D1; ship together.
Tracking: OpenSpec deferral D10.
Related
- Current state → Catalog and enablement — shipped model
- Current state → Cluster coordination pattern →
BroadcastChannel— the invalidation primitive - OpenSpec deferred decisions D1, D2, D3, D4, D8, D10 in
openspec/current-decisions-for-future-tracking.md