Phase 15 complete. Final report: **Implemented** - `steering_notes` table (migration 0003, applied) + `SteeringNote` model + `BOR_STEERING_MAX_CHARS` setting - Stateless CRUD: `GET/POST /api/steering` (trimmed, 1–2000 chars, 201/422), `DELETE /api/steering/{id}` (204/404), newest-first list - `` prompt section (numbered, budget-capped with `[…truncated…]`) in **both** HIGH and DEFLECT prompts, between `` and the mode body; zero-note prompts byte-identical to before; per-turn log gains `tuning=N` - E2E mock echoes first tuning note as ` (tuning: …)` suffix - UI: Tune button in every completed brain bubble's meta row (≥44px), inline labeled form (maxlength 2000, keep-on-failure error `role=alert`, `.tune-saved` `role=status`), header "Tuning" toggle + count badge + panel (region, newest-first, labeled per-note delete, polite live-region announcer), text-only note rendering (XSS-safe), Phase-08 tokens - README "Tuning your answers" + config rows; owner's persona edits applied (no "you've got this", no mandated deflection opening) with verbatim test aligned **Gates** - `uv run pytest --cov=app --cov-report=term-missing` → 241 passed, **99%** (was 98.9% pre-phase) - `uv run ruff check .` → clean; `uv run pyright` → 0 errors - `uv run pytest tests/e2e/test_steering.py -v --no-cov` → 4 passed; regressions `test_chat_rag`/`test_honest_deflection`/`test_retrieval_quality` + all 13 other E2E suites green in isolation - Committed: `fc0d9a2 feat(rag): steering notes — tune how Brain answers…` (`--no-gpg-sign`) **Decisions/deviations** - `.agent/PLAN.md` untouched (harness rule overrides phase step 7) — the PLAN §6 persona revision is recorded in `app/rag/prompts.py` + test docstrings instead; §4/§5/§7.5/§9/roadmap rows still need the harness/owner update - Owner's persona edits weren't present in the (clean) working tree; I applied exactly the two documented edits - Unit file named `test_steering_prompts.py` (basename collision with integration `test_steering.py`); killed a stale pre-change uvicorn squatting on port 8123 that initially masked E2E results **Next pending phase:** none — `todo/` is empty.