**Phase 12 — One Header, Same Size Everywhere: complete** - `.doc-header` fixed to `var(--header-h)` (64px desktop / 58px mobile), inner centered, meta row `nowrap` + clips (no wrap growth); `flex-wrap: nowrap` on the mobile inner rule. - Fixed a **pre-existing flex-shrink defect** (affects all pages): `body` is a definite-height flex column, so `.app-header`/`.doc-header` shrank to content-min (44px) on any page whose content overflows the viewport — this was a second cause of the owner's "header changes size" report (Sources at ≤640px). Added `flex-shrink: 0` to both headers. - `.doc-path` given `min-width: 6rem` so it stays the visible ellipsis target on narrow screens (flex would otherwise shrink it to 0px and clip the badges instead). - E2E: `tests/e2e/test_header_consistency.py` (3 tests: desktop 1280 / mobile 375 three-page box comparison + phase-10 content regression). - Results: `uv run pytest --cov=app --cov-report=term-missing` → 203 passed, **99%** coverage; `uv run ruff check .` → clean; `uv run pyright` → 0 errors; `uv run pytest tests/e2e/test_header_consistency.py -v --no-cov` → **3 passed** (isolation); `test_document_viewer.py` → 5 passed (isolation); remaining 10 E2E files → 40 passed. - Deviation: phase step 3 (PLAN §7.1 note) skipped — harness rules forbid editing `.agents/PLAN.md`; no other lock decisions touched. - Committed `8ca564c` (`--no-gpg-sign`), tree clean. **Next pending phase:** `.agents/phases/todo/13_document_back_navigation.md`