# Architecture decision records — v100.0.30

## ADR-010 — Immutable persona boundary records

**Status:** accepted.

Normalized generation requests enter the extracted domain through `PersonaDraft`; canonical profiles cross the projection boundary through `PersonaProfile`. Arrays remain at the legacy facade and serialization edges. This makes mutation and ownership visible without forcing a schema rewrite.

## ADR-011 — Exact seam parity before broader extraction

**Status:** accepted.

The identity seam cannot move unless exact byte hashes, normalized canonical hashes, and semantic projections match the immutable package baseline across independent fixture families. A single happy-path unit test is insufficient for a 4,890-line procedural module.

## ADR-012 — Explicit legacy dependency adapters

**Status:** accepted.

`PersonaIdentityBuilder` receives catalog/projection adapters through `PersonaIdentityDependencies` rather than loading files or calling HTTP/runtime services. This allows gradual extraction while keeping un-migrated helpers stable.

## ADR-013 — Record, do not conceal, inherited nondeterminism

**Status:** accepted.

The current-clock realism-audit field changes the full profile fingerprint. v100.0.30 records observed raw hashes and gates normalized output. It does not claim exact full-profile parity and does not change timestamp behavior in the same release as the identity extraction.

## ADR-014 — No-new response ownership ratchet

**Status:** accepted.

New `src/` code and endpoint files may not directly own `header()`, `exit`, or `die`. Existing owners are a baseline debt set; the set may shrink but cannot grow.

## ADR-015 — Static-analysis readiness is not static-analysis acceptance

**Status:** accepted.

The repository ships a bounded level-6 PHPStan configuration and an empty suppression baseline. Without an executable run, evidence must say `phpstanRunPerformed: false` and `phpstanAcceptanceClaimed: false`.
