phase: 186_git_log_streaming_dates
## Final report — phase 186 `git_log_streaming_dates`
**State found:** all three task files were already implemented and in `.agents/phases/complete/186_git_log_streaming_dates/`, so this run was the final verification + documentation pass.
### Verification (all green)
| Gate | Result |
|---|---|
| `pytest --cov=app --cov-report=term-missing` | **4531 passed, exit 0** · coverage `TOTAL 6872 stmts → 99%` (gate >90%) |
| `tests/e2e/test_git_log_stream_dates.py -v --no-cov` (isolation) | **5 passed** |
| `ruff check .` | All checks passed |
| `pyright` | 0 errors |
Implementation shape confirmed against the phase contracts: `_parse_commit_dates(str | Iterable[str])` (existing string pins untouched — only 3 non-test lines removed from `test_git_sync.py`), `stream_git_lines` (`Popen` + daemon stderr drain + per-line stdout + terminate-on-abandon, `run_git`-shaped `GitSyncError`), `file_commit_dates` on the stream with byte-identical dates and the fail-soft funnel unchanged, `async_sync` propagating the `to_thread` errors to the existing `except`. A11 holds: two `subprocess.` sites, both in `scripts/git_sync.py`, both off-loop.
### Documentation-consistency pass
Verified (clean): all ~100 `BOR_*` README defaults against a bare `Settings()` (the local `.env` produced false positives — none real), `.env.example` completeness, every module/route/page/test path referenced, `compose.yaml`/`Containerfile`/`entrypoint.sh` claims, E2E port conventions (8901 / 8123), palette count (17), chip cap (90), token format, payload limits, retrieval battery + audit commands.
Fixed (both files, prose only):
- **Page-naming drift** — README/AGENTS called the sync/catalog page "the Sources page" in 5 places, contradicting the README's own convention (and `frontend/index.html`): the **Sync sources** button and the document catalogue are the **RAG** page (`/sources.html`); "Sources" is `/git-sources.html`. Now `RAG page (/sources.html)` in README:186, 376, 418, 682, 713, 745, 1006, 1057 and AGENTS:19, 38, 183.
- **Phase-186 AST-pin wording** — "fails if a third spawn appears anywhere in `app/` or `scripts/`" overstated it (the pin *enumerates* the spawns, including the non-git Valkey probe in `app/core/caching.py`); rewritten to describe the enumeration.
- Moved `00_phase.md` into `complete/186_git_log_streaming_dates/` (AGENTS rule 2 moves the whole directory); `todo/` now starts at 187.
⚠️ **One mistake to disclose:** while tidying line wraps I ran `git checkout README.md`, which discarded task 03's uncommitted phase-186 README bullet. I restored it verbatim from the full `git diff` captured earlier in this session (plus the two corrections above) and re-verified the section renders as intended — no other README content was uncommitted, and AGENTS.md was untouched by the checkout. A blanket line-length rewrap also reflowed 4 unrelated lines; all four were restored to their exact original text (`git diff` now shows only intended changes).
Nothing was committed or staged — the working tree is left for the harness: modified `scripts/git_sync.py`, `app/api/sync.py`, `app/rag/git_sources.py`, `tests/unit/test_git_sync.py`, `tests/integration/test_git_file_dates.py`, `README.md`, `AGENTS.md`; new `tests/e2e/test_git_log_stream_dates.py`, `.agents/phases/complete/186_git_log_streaming_dates/`, `.agents/reports/186_git_log_streaming_dates/`.
This commit is contained in:
@@ -16,7 +16,8 @@
|
||||
it follows the layout principles in `.agents/PLAN.md` §7 (proper container
|
||||
usage, the 72rem centered reading column — every page rides the 72rem
|
||||
container at every viewport; phase 100 supersedes §7.1's 46rem chat
|
||||
column, full-width tables on Sources — no skinny wasted-space lists;
|
||||
column, full-width tables on the catalogue pages — no skinny
|
||||
wasted-space lists;
|
||||
the catalogue tables (RAG, Sources, History) are bounded scroll
|
||||
panels — `max-height: min(70vh, 64rem)` — with a sticky header row;
|
||||
a clipped action label shows an ellipsis hint (`.cell-clip`) with
|
||||
@@ -35,7 +36,7 @@
|
||||
`.doc-image-img--vector` (`width: 100%`, `object-fit: contain`)
|
||||
when `format` is `svg` so a `viewBox`-only drawing spans the
|
||||
`.doc-image` card instead of the 300×150 default box, while the
|
||||
chat figure and Sources thumbnail keep their fixed caps and the
|
||||
chat figure and RAG-table thumbnail keep their fixed caps and the
|
||||
bytes stay an `<img>` src (never inlined) (phase 181); the
|
||||
document viewer's page strip is
|
||||
CLASS-scoped —
|
||||
@@ -115,7 +116,17 @@
|
||||
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.
|
||||
module's cancel-during-clone test. Since phase 186
|
||||
`scripts/git_sync.py` has **two** git spawn sites — the buffered
|
||||
`run_git` and the streaming `stream_git_lines` (the commit-date walk
|
||||
yields `git log` line by line instead of holding the whole history in
|
||||
RAM) — and **both** are off-loop via `asyncio.to_thread`; the
|
||||
`subprocess.` single-site intent survives as "one per shape, both
|
||||
owned there", enforced by
|
||||
`tests/unit/test_git_sync.py::test_only_two_git_spawn_sites`, and
|
||||
the owner-visible date contract through the stream (last-commit
|
||||
dates, the mtime fallback, the D1 manual lock) by
|
||||
`tests/e2e/test_git_log_stream_dates.py`.
|
||||
12. **Never hydrate what you delete:** `Document.chunks` is
|
||||
`passive_deletes=True` (phase 183), so deleting a document removes its
|
||||
chunk rows **in the database** (`chunks_document_id_fkey` is
|
||||
@@ -170,8 +181,8 @@
|
||||
(a second one is a per-row lazy load), the commit counts at `10` and
|
||||
`0`, both guards on light rows) and
|
||||
`tests/e2e/test_sync_session_reset.py` (the five-document prune at batch
|
||||
`2` through the Sources page: both folders cleared, the survivors' chunks
|
||||
intact, zero orphan chunk rows).
|
||||
`2` through the RAG page (`/sources.html`): both folders cleared, the
|
||||
survivors' chunks intact, zero orphan chunk rows).
|
||||
15. **The unchanged fast path reads metadata, never markdown:** the four
|
||||
row lookups that share it (`_index_file`, `_index_pdf_file`,
|
||||
`_index_one_embedded_image`, `_index_image_file`) all go through the ONE
|
||||
|
||||
Reference in New Issue
Block a user