phase: 179_git_clone_server_freeze
All gates green; working tree holds exactly the phase's changes for the harness to commit. ## Phase 179 — Final verification report - **Verified (all 3 tasks already complete in `complete/`)**: repro + CONFIRMED verdict, `asyncio.to_thread` fix, dedicated E2E suite. - `app/api/sync.py::_run_sync`: both git ops (`clone_or_pull`, `file_commit_dates`) now `await asyncio.to_thread(...)`; phase-134 boundary note + module docstring document worker-thread-runs-to-completion and the A3 DB-calls-stay-on-loop note. - **Tests / lint / coverage** (full suite 100% green): - `uv run pytest tests/integration/test_sync_git_freeze.py -v` → **4 passed** (post-fix probe <1.5 s during 3 s stub) - `uv run pytest tests/e2e/test_sync_git_freeze.py -v --no-cov` → **2 passed in 25.65 s in isolation** (wall guard 120 s holds) - `uv run pytest --cov=app --cov-report=term-missing` → **4173 passed**, `app/` coverage **99%** (`app/api/sync.py` 100%) - `uv run ruff check .` → All checks passed; `uv run pyright` → **0 errors** - **Completion criteria**: ① integration probe green + verdict (CONFIRMED, mechanism, measured 3.04 s→0.003 s) in docstring — **met**; ② off-loop git ops + boundary/A3 notes — **met**; ③ full suite green, coverage 99% >90%, ruff+pyright clean — **met**; ④ E2E green in isolation (responsive-poll + cancel-during-clone contracts) — **met**; ⑤ atomic commit + move to `complete/` — **harness-owned** (pipeline rule overrides per-phase self-commit; all changes staged-ready in the working tree). - **Documentation**: full README (1526 l) + AGENTS.md review — phase-179 bullets present and accurate (verified against fixture constants, `.env.example` fully covered by the config reference, pages table matches `app/main.py` shell routes, quick-reference commands/artifacts exist); **consistent — no further changes needed**. - **Notable**: task-03 pipeline sessions died on context overflow but their harness validation passed; this pass independently re-ran every gate to confirm. No live infra touched; no git index commands run. - **Next pending phase**: `180_markdown_inline_links_images`.
This commit is contained in:
@@ -63,6 +63,19 @@
|
||||
with `grep ' :: api '`, audit it with
|
||||
`uv run python -m scripts.api_payload_audit`, phase 167); UI-side,
|
||||
honor the "never stale" feedback contract (PLAN §7.4).
|
||||
11. **Never block the event loop:** anything blocking (a `subprocess`,
|
||||
synchronous file/network I/O, a heavy walk) reached from an `async`
|
||||
handler or a spawned background coroutine goes through
|
||||
`asyncio.to_thread` (or `create_subprocess_exec`). The sync's git
|
||||
calls do (phase 179: a long `git clone` used to park the single
|
||||
uvicorn loop and freeze the whole HTTP surface, the 2 s
|
||||
`GET /api/sync/status` poll included — pinned by
|
||||
`tests/integration/test_sync_git_freeze.py` with a 3 s stub and by
|
||||
`tests/e2e/test_sync_git_freeze.py` with a real ~9 s `file://`
|
||||
clone). A cooperative cancel unblocks the *run* at the `to_thread`
|
||||
await; the worker thread itself runs to completion (threads are not
|
||||
interruptible) while the loop keeps serving — pinned by the same E2E
|
||||
module's cancel-during-clone test.
|
||||
|
||||
## Quick reference
|
||||
```bash
|
||||
|
||||
Reference in New Issue
Block a user