# Phase Handover — Experience 11.4 Template System ## Metadata | Field | Value | | --- | --- | | Phase ID | `experience-11.4` | | Title | Template System | | Status | Complete | | Service(s) | `experience` (`experience_db`) | | Version | `0.11.4.0` | | Date | 2026-07-26 | | ADR(s) | [ADR-016](../architecture/adr/ADR-016.md), [ADR-008](../architecture/adr/ADR-008.md) | ## Discovery Summary Prior phase delivered replaceable themes and dynamic layouts. The Phase 11.4 template scaffolding (models, services, schemas, repositories, commands/queries, policies/validators/specifications, and APIs) already existed on disk from earlier work but was intentionally unwired — models excluded from `app/models/__init__.py`, routers unmounted, and the Alembic revision suffixed `.py.future` — as part of the Phase 11.3 repair so the Alembic head stayed pinned to `0004`. This phase re-wired that scaffolding: restored the migration, imported the models, mounted the routers, aligned events/permissions/capabilities, and added the phase 11.4 test suite. ## Reusable Components | Component | Location | Reuse notes | | --- | --- | --- | | Template catalog + versions | `app/models/templates.py` (`ExperienceTemplate`, `ExperienceTemplateVersion`), `app/services/templates.py` | `blueprint_json` immutable once published; mirrors the Phase 11.2/11.3 catalog+immutable-version pattern | | Instantiation | `TemplateInstantiation`, `ExperienceTemplateService.instantiate` | Creates an `ExperiencePage` from a published version's blueprint; records theme/layout readiness without owning those engines | | Policies / specs | `app/policies/templates.py`, `app/specifications/templates.py` | Lifecycle + version-immutability + instantiation-eligibility rules, list UX | | Validators | `app/validators/templates.py` | `page_type` validation, status-transition tables, `blueprint_json` shape checks | ## Public APIs | Method | Path | Permission | | --- | --- | --- | | CRUD + activate/deprecate/archive/delete | `/api/v1/templates` | `experience.templates.*` | | CRUD + publish/retire | `/api/v1/template-versions` | `experience.templates.*` | | Instantiate / list / get | `/api/v1/template-instantiations` | `experience.templates.*` | ## Events | Event type | Notes | | --- | --- | | `experience.template.*` | Template catalog lifecycle (created/updated/activated/deprecated/archived) | | `experience.template_version.*` | Template version created/updated/published/retired | | `experience.template.instantiated` | Emitted after a page is successfully created from a published version | ## Extension Points | Extension point | How to extend | Forbidden uses | | --- | --- | --- | | `ExperienceTemplateVersion.blueprint_json` | `page_type`, `content_shell`, `seo_shell`, `theme_id`, `layout_id`, `placement_shells` — consumed at instantiation time | Store full CMS blobs / binary media | | `TemplateInstantiation.result_json` | Records whether the referenced theme/layout were ready and applied | Do not use as a source of truth for theme/layout state — always re-read the theme/layout catalogs | | `TemplateInstantiationPolicy` / `TemplateVersionPolicy` | Gate instantiation to published, non-deleted templates/versions | Do not bypass via direct repository writes | ## Known Limitations - No forms/surveys/appointment engine (11.6) - No localization/media-ref pipeline for template content yet (11.5) - Instantiation only *references* theme/layout by id; it does not validate deep compatibility beyond active/published status - Metrics remain discovery-oriented ## Migration Notes | Item | Detail | | --- | --- | | Alembic revision(s) | `0005_phase_114_templates` (head) | | Upgrade steps | `alembic upgrade head` | | Downgrade support | Drops `experience_template_instantiations`, `experience_template_versions`, `experience_templates` | | Breaking changes | None (additive) | ## Dependencies | Dependency | Type | | --- | --- | | experience-11.3 themes/layouts | Required prior (referenced by id from template blueprints) | | experience-11.1 sites/pages | Required prior (instantiation creates an `ExperiencePage`) | | ADR-016 / ADR-008 | Boundaries / branding | ## Quality Gates - [x] Discovery complete - [x] Architecture / boundaries preserved - [x] Tests green - [x] Documentation + manifests + registries updated - [x] Self audit: no forms/surveys/CMS leakage; template versions immutable once published ## Next Phase Entry | Field | Value | | --- | --- | | Recommended next phase | `experience-11.5` Localization, RTL/LTR & Media | | Entry checklist | Read this handover + phase doc; implement locale profiles content/media refs only — no forms/surveys/appointments yet | ## Completion Sign-Off - [x] Quality gates passed - [x] Tests green - [x] Documentation updated - [x] Progress / next-steps / registries updated - [x] Self audit completed ## Related Documents - [Experience Phase 11.4](../experience-phase-11-4.md) - [Experience Roadmap](../experience-roadmap.md) - [ADR-016](../architecture/adr/ADR-016.md) - [ADR-008](../architecture/adr/ADR-008.md)