# Service Snapshot Policy **Service Snapshot Architecture** — one compact, machine-readable snapshot per service representing current implementation state. Works with [runtime-read-policy.md](runtime-read-policy.md), [context-cache-policy.md](context-cache-policy.md), [`docs/project-status.yaml`](../project-status.yaml), and [project-index.yaml](project-index.yaml). Snapshot file paths are resolved from project-status / Project Index — never discovered by scanning `docs/service-snapshots/`. ## Goals 1. Eliminate repeated full-project analysis across long-running implementations (with Project Status as the platform dashboard). 2. Minimize token usage by replacing multi-document state reconstruction with one YAML file per service. 3. Keep snapshots regenerated automatically after every completed phase. 4. Keep Project Status regenerated automatically after every completed phase. ## Snapshot location Resolved from [project-index.yaml](project-index.yaml) field `snapshot_file` per service: ``` docs/service-snapshots/.yaml ``` Examples (index entries): `hospitality.yaml`, `delivery.yaml`, `experience.yaml`, `crm.yaml`, `accounting.yaml`, `loyalty.yaml`, `communication.yaml`, `sports-center.yaml`. Framework-only workstreams (no owning service) do not require a snapshot file. Template: [docs/service-snapshots/_template.yaml](../service-snapshots/_template.yaml). ## Required fields Each snapshot MUST be concise and machine-readable. Required top-level fields: | Field | Description | | --- | --- | | `service_name` | Canonical service ID (matches [service-manifest.yaml](service-manifest.yaml)) | | `commercial_product` | Product / bundle name exposed to tenants | | `current_version` | Semver or service version string | | `current_phase` | Active phase ID | | `last_completed_phase` | Most recent Complete phase ID | | `next_phase` | Recommended next phase ID from manifest / next-steps | | `completed_phases` | List of Complete phase IDs | | `remaining_phases` | List of planned but incomplete phase IDs | | `registered_modules` | Module IDs owned by this service | | `enabled_capabilities` | Capability keys / feature flags active | | `enabled_bundles` | Commercial bundles including this service | | `public_apis` | Summary list — method, path, permission (not full OpenAPI) | | `published_events` | Summary list — event_type, version | | `permission_prefix` | e.g. `accounting.*` | | `active_adrs` | ADR IDs governing this service | | `integration_contracts` | Cross-service API/event/provider refs | | `known_limitations` | Explicit non-goals and temporary constraints | | `open_todos` | Open TODOs for in-scope work (empty when phase Complete) | | `last_handover_reference` | Path to latest Complete handover | | `last_updated` | ISO-8601 date of last regeneration | Optional metadata: `schema_version`, `snapshot_version` (increment on each regeneration). ## Execution entry (every phase) Part of the global execution order in [runtime-read-policy.md](runtime-read-policy.md): 1. Load [Project Status](../project-status.yaml) (**first**). 2. Load [Project Index](project-index.yaml) for the active service only. 3. Load [Runtime Read Policy](runtime-read-policy.md). 4. Load [Context Cache Policy](context-cache-policy.md). 5. Load service snapshot — project-status / Project Index `snapshot` for the active service. 6. Read [phase-manifest.yaml](phase-manifest.yaml). 7. Read [service-manifest.yaml](service-manifest.yaml). 8. Read only latest handover — project-status / Project Index. 9. Additional documents per Runtime Read Policy only. Use project-status + snapshot + index for baseline inventory. Do not re-read completed phase documents when snapshot is valid. Do not inspect unrelated services when project-status exists. ## Fallback reconstruction Re-read completed phase documents, registries, or codebase-wide analysis **only** when: | Trigger | Action | | --- | --- | | Snapshot missing | Build initial snapshot from manifests, latest handover, codebase; then persist | | Snapshot invalid | YAML parse error, missing required fields, or manifest/service ID mismatch — rebuild | | Snapshot version changed | `snapshot_version` or `last_updated` differs from cache — reload snapshot (not historical phases) | | Handover requests additional context | Load only paths explicitly listed in handover | | Compatibility validation requires it | Quality gate or validation rule cites specific historical doc | Never bulk-read all completed phase docs when a valid snapshot exists. ## Regeneration (mandatory after every completed phase) When a phase marks **Complete** for a service: 1. Derive updated field values from handover, manifests, codebase delta, and registries. 2. Write snapshot to Project Index `snapshot_file` path with all required fields. 3. Increment `snapshot_version`. 4. Set `last_updated` to completion date. 5. Set `last_handover_reference` to the handover just completed. 6. Update [project-index.yaml](project-index.yaml): `current_version`, `current_phase`, `next_phase`, `latest_handover`, `snapshot_file`. 7. Update [`docs/project-status.yaml`](../project-status.yaml) and [`docs/project-status.md`](../project-status.md) per `automatic_update_rules` (completed/remaining phases, deployment_readiness, percentages, critical_path, execution_priority, service completion, timestamps). Never write deprecated `next_recommended_phase` as an active field. 8. Clear resolved items from `open_todos`; carry forward known limitations. 9. Pass the **Project Status**, **Service Snapshot**, and **Project Index** quality gates ([quality-gates.md](quality-gates.md)). Framework-only phases: update Project Status + policy docs; snapshot N/A unless they define snapshot schema/policy. ## Relationship to other policies | Policy | Role | | --- | --- | | [project-status.yaml](../project-status.yaml) | Platform execution dashboard — critical_path, execution_priority, deployment_readiness | | [project-index.yaml](project-index.yaml) | Path resolver — snapshots, roadmaps, handovers | | [runtime-read-policy.md](runtime-read-policy.md) | What may load beyond index + snapshot | | [context-cache-policy.md](context-cache-policy.md) | Whether to re-read unchanged docs | | [service-snapshot-policy.md](service-snapshot-policy.md) | Snapshot schema and regeneration | Discovery baseline inventory SHOULD come from the snapshot first, then latest handover for delta, then codebase for verification — not from re-reading every completed phase doc. ## Backward compatibility - Completed business phases and handovers are unchanged. - Services without a snapshot yet: first phase entry builds snapshot per fallback rules; no retrofit of historical phases required. - Path `docs/service-snapshots/` is additive; no business service code changes required by this policy alone. - New services: add Project Index entry on registration in same phase as [service-manifest.yaml](service-manifest.yaml). ## Related Documents - [Project Status](../project-status.yaml) - [Project Index](project-index.yaml) - [Runtime Read Policy](runtime-read-policy.md) - [Context Cache Policy](context-cache-policy.md) - [Enterprise Phase Discovery](enterprise-phase-discovery.md) - [Development Loop](development-loop.md) - [Mandatory Phase Artifacts](mandatory-phase-artifacts.md) - [Phase Handover](phase-handover.md) - [Quality Gates](quality-gates.md)