Platform Product Catalog
Architecture / contracts only. Open-ended product model — never a closed enum.
ADR: ADR-023 (v1.1 amendment)
Contract version: platform-product.v1
Registry: product-registry.md
1. Purpose
Every commercial offering in the TorbatYar ecosystem is a PlatformProduct.
Products are installable registry entries. Adding a product MUST NOT require changing Core commercial architecture — only registry + documentation (+ optional bundle mapping).
Automation is not a PlatformProduct — see automation-catalog.md.
2. Aggregates
2.1 PlatformProduct
| Field |
Type |
Meaning |
product_code |
string |
Stable unique code (open registry) |
display_name |
string |
Human label |
category_code |
string |
Ref → PlatformProductCategory |
default_version |
string |
Current version_code |
commercial_status |
enum |
planned | preview | ga | deprecated | retired |
maturity |
enum |
concept | alpha | beta | stable | mature |
visibility |
PlatformProductVisibility |
|
lifecycle |
PlatformProductLifecycle |
|
metadata |
PlatformProductMetadata |
|
tags |
PlatformProductTags |
|
owner_service_identifier |
string? |
Owning runtime service when materialized |
documentation_ref |
string |
Path/URL to docs |
ext |
object |
Additive reserved |
2.2 PlatformProductCategory
| Field |
Type |
Meaning |
category_code |
string |
Open string (e.g. platform, vertical, channel, future) |
display_name |
string |
|
parent_category_code |
string? |
Optional hierarchy |
sort_order |
int |
|
Categories are open. Examples (non-exhaustive, not hardcoded limits): platform, commerce, operations, engagement, vertical, content, infrastructure, ai, future.
2.3 PlatformProductCapability
| Field |
Type |
Meaning |
product_code |
string |
|
capability_code |
string |
Ref → Capability Registry — never inline-define |
role |
enum |
provides | consumes | requires |
required |
bool |
|
2.4 PlatformProductDependency
| Field |
Type |
Meaning |
product_code |
string |
Subject |
depends_on_kind |
enum |
product | capability | service | extension | automation_pack |
depends_on_code |
string |
Target code |
relation |
enum |
See dependency-graph.md: requires | optional | conflicts | recommended | deprecated | replacement |
notes |
string? |
|
2.5 PlatformProductVisibility
| Field |
Type |
Meaning |
public_catalog |
bool |
|
admin_only |
bool |
|
partner_only |
bool |
|
hidden |
bool |
|
regions[] |
string[] |
Future |
tenant_tiers[] |
string[] |
Soft gate |
2.6 PlatformProductLifecycle
| Field |
Type |
Meaning |
sellable |
bool |
May appear in commercial offers |
installable |
bool |
May be activated for a tenant |
grandfathered |
bool |
|
replacement_product_code |
string? |
|
sunset_at |
datetime? |
|
2.7 PlatformProductMetadata
| Field |
Type |
Meaning |
locale_labels |
map |
i18n |
icon_key |
string? |
|
sort_order |
int |
|
marketing_blurb |
string? |
Non-normative |
ext |
object |
|
2.8 PlatformProductVersion
| Field |
Type |
Meaning |
product_code |
string |
|
version_code |
string |
Commercial/product version |
changelog |
string |
|
capability_bindings[] |
PlatformProductCapability |
|
dependencies[] |
PlatformProductDependency |
|
required_services[] |
string[] |
Service identifiers |
optional_services[] |
string[] |
|
reserved_features[] |
string[] |
Feature keys reserved / not yet implemented |
compatibility |
PlatformProductCompatibility |
|
marketplace |
MarketplaceCompatibilityDeclaration |
See marketplace section / product-registry.md |
extension_pubs[] |
string[] |
Extension codes published by this version |
automation_pack_refs[] |
string[] |
Automation pack refs (not products) |
effective_from / effective_to |
datetime? |
|
2.9 PlatformProductCompatibility
| Field |
Type |
Meaning |
min_platform_commercial_version |
string |
e.g. commercial.v1.1 |
compatible_product_codes[] |
string[] |
Soft list |
incompatible_product_codes[] |
string[] |
|
published_resource_compatible |
bool |
Aligns with ADR-022 when true |
payment_l1_required |
bool |
Needs Core payment entitlement |
notes |
string? |
|
2.10 PlatformProductTags
| Field |
Type |
Meaning |
tags[] |
string[] |
Open tag registry |
3. Illustrative product matrix (examples — NOT a closed set)
| product_code (example) |
Display name |
Category (example) |
Maturity |
product.crm |
Torbat CRM |
platform |
stable |
product.pay |
Torbat Pay |
commerce |
stable |
product.pages |
Torbat Pages |
content |
stable |
product.driver |
Torbat Driver |
operations |
stable |
product.restaurant |
Restaurant |
vertical |
stable |
product.healthcare |
Healthcare |
vertical |
beta |
product.beauty |
Beauty |
vertical |
beta |
product.accounting |
Accounting |
platform |
stable |
product.communication |
Communication |
engagement |
stable |
product.loyalty |
Loyalty |
engagement |
stable |
product.marketplace |
Marketplace |
commerce |
concept |
product.qr |
QR |
channel |
concept |
product.short_link |
Short Link |
channel |
concept |
product.business_card |
Business Card |
channel |
concept |
product.booking |
Booking |
operations |
concept |
product.ticketing |
Ticketing |
operations |
concept |
product.events |
Events |
engagement |
concept |
product.learning |
Learning |
content |
concept |
product.automation |
(forbidden as product — use Automation Catalog) |
— |
— |
product.storage |
Storage |
infrastructure |
concept |
product.ai.* |
Future AI Products |
ai |
concept |
Rule: Any future product.* code may be registered without amending this architecture document’s structure.
4. Invariants
- Product codes are an open string registry — architecture MUST NOT hardcode a closed product list.
- Products consume capabilities from the Capability Registry; they do not redefine them.
- Marketplace remains an independent product; others declare marketplace compatibility only.
- Automation packs are referenced, never classified as PlatformProducts.
- Implementation of a product requires a future registered phase — registration alone does not ship engines.