ducoterra
f4150421bb
phase: 84_docs_push_error_sanitization
**Phase 84 — final verification pass: all green, no defects found**
- Verified implementation: `app/core/errors.py` (verbatim lift of sync masker), `app/api/sync.py` alias import, docs-push 502 `detail=sanitize_error(str(exc))`, all five `llm.py` error sites sanitized; new/extended test pins in place
- Tests: `uv run pytest` → **1714 passed, 0 failed**; targeted pins (new unit ×2 + integration ×1, existing 502 pin) → 13 passed; sync/git-sources regression → 67 passed
- Coverage: `uv run pytest --cov=app --cov-report=term-missing` → **99%** (`app/core/errors.py` 100%, `app/rag/llm.py` 100%) — >90% met
- E2E isolation: `uv run pytest tests/e2e/test_smoke.py -v --no-cov` → **3 passed**
- Lint/types: `uv run ruff check .` → clean; `uv run pyright` → **0 errors**
- Criteria: 502 masks `*****@`/never token + row untouched ✅; LLM base-URL masked, credential-free strings byte-identical ✅; `_CREDS_RE` only in `app/core/errors.py` (working-tree grep) ✅; full gate green ✅; `git diff --stat` limited to the 4 app files + 2 modified test files + 3 phase task files (untracked: new module, new unit test, complete/ dir, reports, audit plan) ✅
- Commit/phase move left to the harness per instructions (task files already in `complete/`)
- No deviations; nothing to fix
- Next pending phase: **85_mobile_menu_gate_overlap**
2026-09-08 01:11:45 -04:00
..
2026-09-07 23:54:41 -04:00
2026-09-05 16:04:40 -04:00
2026-09-07 12:39:01 -04:00
2026-08-28 15:57:59 -04:00
2026-09-07 12:39:01 -04:00
2026-09-07 12:39:01 -04:00
2026-09-07 12:39:01 -04:00
2026-09-07 12:39:01 -04:00
2026-09-07 12:39:01 -04:00
2026-09-07 12:39:01 -04:00
2026-08-28 07:02:24 -04:00
2026-09-05 16:04:40 -04:00
2026-08-21 13:42:21 -04:00
2026-08-21 13:42:21 -04:00
2026-09-01 03:52:03 -04:00
2026-09-01 03:52:03 -04:00
2026-09-07 12:39:01 -04:00
2026-09-08 01:11:45 -04:00
2026-09-06 06:31:31 -04:00
2026-09-02 10:52:38 -04:00
2026-09-05 14:34:33 -04:00
2026-09-07 14:16:41 -04:00
2026-08-29 18:32:15 -04:00
2026-09-07 14:16:41 -04:00
2026-09-03 11:17:47 -04:00
2026-08-27 01:04:16 -04:00
2026-09-01 03:52:03 -04:00
2026-09-07 14:18:45 -04:00
2026-09-06 06:31:31 -04:00
2026-09-06 06:31:31 -04:00
2026-09-05 16:04:40 -04:00
2026-09-01 23:51:43 -04:00
2026-09-08 01:11:45 -04:00
2026-08-26 22:39:14 -04:00
2026-09-03 11:17:47 -04:00
2026-08-25 22:42:10 -04:00
2026-08-28 03:35:50 -04:00
2026-09-03 11:17:47 -04:00
2026-09-01 03:52:03 -04:00
2026-08-25 20:22:51 -04:00
2026-09-02 01:08:18 -04:00
2026-09-04 13:11:07 -04:00
2026-09-07 23:08:46 -04:00
2026-09-06 06:31:31 -04:00
2026-09-05 10:26:39 -04:00
2026-09-05 16:59:31 -04:00
2026-09-07 12:39:01 -04:00
2026-09-03 13:39:15 -04:00
2026-09-08 00:33:21 -04:00
2026-09-07 23:54:41 -04:00
2026-09-07 12:39:01 -04:00
2026-09-01 00:39:19 -04:00
2026-09-02 15:55:33 -04:00
2026-08-30 23:39:15 -04:00
2026-08-29 18:32:15 -04:00
2026-09-03 11:17:47 -04:00
2026-09-06 06:31:31 -04:00
2026-08-22 16:44:42 -04:00
2026-09-06 06:31:31 -04:00
2026-08-25 13:46:32 -04:00
2026-09-01 04:20:26 -04:00
2026-08-25 17:48:37 -04:00
2026-08-31 23:52:22 -04:00
2026-09-06 06:31:31 -04:00
2026-08-27 23:44:35 -04:00
2026-09-01 12:04:06 -04:00
2026-08-28 17:10:02 -04:00
2026-09-07 12:39:01 -04:00
2026-09-07 12:39:01 -04:00
2026-09-01 03:52:03 -04:00