# Plan: Terms & Conditions (Enrollment Experience) (024) **Branch**: `feat/024-terms-and-conditions` **Date**: 2026-01-04 **Input**: [spec.md](./spec.md) ## Approach 1. Confirm Graph contract details for Terms & Conditions: - resource path: `deviceManagement/termsAndConditions` - `@odata.type` values and patchable fields - assignments endpoints: `/deviceManagement/termsAndConditions/{id}/assignments` (CRUD) 2. Add `termsAndConditions` to `config/tenantpilot.php` (category “Enrollment Experience”, risk, restore mode). 3. Add contract entry to `config/graph_contracts.php`: - resource, type family, create/update methods - assignments list/create/update/delete paths (no `/assign` action here) 4. Ensure policy sync, snapshot capture, and restore use the config/contract-driven paths (minimal special casing). 5. Add a normalizer for readable UI output and ensure diff output is stable. 6. Add targeted Pest coverage (sync + snapshot + preview + execution). ## Decisions / Notes - **Restore mode**: default `enabled` (risk: medium-high) with strict preview/confirmation and audit logging. - **Assignments**: use assignment CRUD paths (POST to `/assignments`) rather than `/assign`.