All done — the pgrep hits were my own shell. Final state verified: 672 docs / 8969 chunks in the DB, clean tree, commit `99c48cb`. --- **Phase 02 (import documents) — complete** - **Code**: fence-aware chunker (1200-char hard cap, atomic fences, overlap+anchor); `LLMClient` reusing the openai client's httpx transport — openai SDK 1.x/2.x both inject `encoding_format`, which aipi's LiteLLM `openai_like` rejects (flagged deviation from A5's plain-SDK intent); token-budget batching + halving retry for aipi's ~1024-token per-request cap; two-phase per-file upsert (sha256 delta, atomic commit, A9 walk, prune, per-file error tolerance, adaptive re-chunk at half target for URL-dense files); `scripts/import_docs` CLI; `GET /api/docs`; Sources page wired to real endpoint (XSS-safe DOM rows). - **Real run**: `files=672 added=672 unchanged=0 pruned=0 errors=0 chunks=8969 embed_batches=2188` in ~3m; idempotent re-run: 672 unchanged, 0 batches. One file (URL-dense README) re-chunked at 1000 chars via the adaptive path. - **Gates**: 63 unit/integration passed, story E2E 3/3, ruff + pyright clean, coverage 98% (>90%), `.agent/validate.sh` → "validation OK". - **UI**: 1280px + 375px screenshots at `/tmp/bor_screenshots/` (full-width a11y table, stat cards, mono paths, designed empty state; no CDN). - **Fixes**: phase-01 harness defect (validate.sh used system python3) → now uv-gated, committed with `-f`. - **Commit**: `99c48cb feat(rag): index markdown KB — chunker, embed client, delta importer, Sources page`.