# `projects/{slug}/project_policy.yaml` as a separate per-project file

**Captured:** 2026-05-07
**Driver:** Phase 7 — CP-A foundations rejection memory (Law 14)

## Decision
REJECTED

## Why rejected

Project policy on disk lives in `projects/{slug}/project_config.json` as flat top-level fields (`schema_version`, `project_type`, `aspect_ratio`, `default_models`, `mode`). The runtime SSOT is the `Project` class at `recoil/core/project.py`. ADR-0012 locks both the on-disk and runtime SSOTs.

A separate `projects/{slug}/project_policy.yaml` was referenced in a prior Console v2 SYNTHESIS lock #15 but was never created. Adding it now would split the source of truth: there would be a third per-project config file alongside `project_config.json` and `global_bible.json`, for a known-small policy surface (currently four fields). Splitting forces a sync layer, raises the question of which file wins on conflict, and adds a YAML parser to the read path for no operational benefit.

Revisit only when both (a) the policy schema grows beyond ~10 fields AND (b) policy has a meaningfully different write cadence than the rest of `project_config.json` (e.g. policy changes hourly while the rest is per-episode). Neither condition is close.

## Cited by
- ADR-0012: Project SSOT lives in the `Project` class
- BUILD_SPEC §3, §7 (Phase 7 — CP-A rejection memory)

## Status
- [x] Substantive rejection (Law 14 — anti-pattern memory)
