# 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`.

