# Feature Specification: Terms & Conditions (Enrollment Experience) (024) **Feature Branch**: `feat/024-terms-and-conditions` **Created**: 2026-01-04 **Status**: Draft **Priority**: P1 ## Context Terms & Conditions (T&C) are part of the **Enrollment Experience**. During tenant rebuilds / recovery they are frequently missed, but can be required for compliant onboarding. ## User Scenarios & Testing ### User Story 1 — Inventory + readable view (Priority: P1) As an admin, I can see Terms & Conditions policies in the Policies inventory and view their configuration in a readable way. **Acceptance Scenarios** 1. Given a tenant with T&C configured, when I sync policies, then T&C items appear with type `termsAndConditions`. 2. Given a T&C policy, when I open its detail page, then I see a normalized settings view (not only raw JSON). ### User Story 2 — Snapshot capture + versioning (Priority: P1) As an admin, I can capture versions and backups of Terms & Conditions so I can diff and roll back safely. **Acceptance Scenarios** 1. Given a T&C policy, when I capture a snapshot, then the full Graph payload is stored immutably (JSONB). 2. Given two versions, when I view a diff, then changes are human-readable and structured. ### User Story 3 — Restore preview + execution (Priority: P2) As an admin, I can restore Terms & Conditions (with assignments) from a snapshot with a safe preview, audit logging, and defensive checks. **Acceptance Scenarios** 1. Given a backup item of type `termsAndConditions`, when I run restore preview, then it shows create/update + restore mode and warnings. 2. Given restore execution, when Graph rejects non-patchable fields, then TenantPilot strips them (contract-driven) and retries safely. ## Requirements ### Functional Requirements - **FR-001**: Add policy type `termsAndConditions` backed by Graph `deviceManagement/termsAndConditions`. - **FR-002**: Capture full payload snapshots and include assignments. - **FR-003**: Restore supports create/update (contract-driven sanitization) and assignment apply. - **FR-004**: Normalized settings view exists for key fields (displayName, description, title, body, acceptance statement, etc.). - **FR-005**: Add Pest tests for sync + snapshot + restore preview + restore execution. ### Non-Functional Requirements - **NFR-001**: All writes require explicit confirmation and create audit logs. - **NFR-002**: Tenant isolation applies end-to-end (no cross-tenant leakage). ## Success Criteria - **SC-001**: T&C appears in inventory and backups. - **SC-002**: Restore preview is actionable and safe. - **SC-003**: Restore execution works with assignments (where Graph allows).