Skip to main content

Catalog and enablement (future)

Status: target, not shipped

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 (a catalog-invalidate channel, parallel to ancestry-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 (PENDINGCONNECTED 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.