Extension Architecture
Intent
Section titled “Intent”Provide strong extensibility without destabilizing the core data model.
The platform must support specialization for language learning and future domains while preserving a stable, interoperable core.
Extension Strategy
Section titled “Extension Strategy”Use a layered extension approach:
- Core entities remain minimal and durable
- Low-risk custom attributes can use controlled metadata fields
- High-value specialization uses typed extension tables and contracts
- Extension modules declare namespace, ownership, and compatibility rules
Extension Types
Section titled “Extension Types”Type A: Metadata Extensions
Section titled “Type A: Metadata Extensions”Use for low-criticality, optional display or UX hints.
Characteristics:
- Stored in constrained JSONB metadata fields
- Schema validated by module-specific Zod validators
- Not used for core authorization or grading decisions
Type B: Typed Relational Extensions
Section titled “Type B: Typed Relational Extensions”Use for domain-critical specialization.
Characteristics:
- Dedicated extension tables with foreign keys to core entities
- Explicit migration ownership
- Strong typing in domain contracts
- Version-aware compatibility rules
Type C: Event Projection Extensions
Section titled “Type C: Event Projection Extensions”Use for derived analytics/integration views.
Characteristics:
- Generated from core events and records
- Rebuildable and denormalized when needed
- Never source of truth for core transactional state
Extension Module Contract
Section titled “Extension Module Contract”Each extension module should define:
namespace(for examplelang.v1)owner(team/package)entity_targets(which core entities are extended)schema_versioncompatibility_policyvalidation_contractsmigration_policy
Governance Rules
Section titled “Governance Rules”- No extension may redefine core identity semantics
- No extension may bypass core audit requirements
- Critical business decisions must not rely only on untyped metadata
- Extension migrations require compatibility notes
- Deprecated extensions require data migration or archival plan
Anti-Patterns
Section titled “Anti-Patterns”Avoid:
- Single giant JSON blob for all specialization
- Copying core fields into extension tables without provenance
- Extension-only authorization logic that bypasses core membership model
- Versionless extension payloads
Recommended Repository Mapping
Section titled “Recommended Repository Mapping”- Extension domain types and validators:
packages/domain - Extension schema and migrations:
packages/db - Extension sync projections:
packages/offline-data - Extension APIs and orchestration:
apps/api
Rollout Pattern For New Extensions
Section titled “Rollout Pattern For New Extensions”- Define extension contract and namespace
- Add Zod schemas and type exports
- Add typed Drizzle tables and relations
- Add sync shape rules and conflict behavior
- Add integration mapping impact notes
- Add tests and migration notes
Open Decisions
Section titled “Open Decisions”- Namespace naming policy granularity (
domain.area.vNvs shorter forms) - Compatibility guarantees across extension major versions
- Whether extension registry should be static code-based or persisted in DB