phase: 150_drop_sync_result
Build and Push Containers / build-and-push-app (push) Successful in 2m24s
Build and Push Containers / build-and-push-db (push) Successful in 13s

**Phase 150 final verification pass — complete, 100% green.** All 6 task files were already in `complete/`, so this was verification + doc pass.

- Verified: `#sync-progress` is the sole sync text surface + sole `aria-live` region (`role="status"`, polite, no `aria-hidden`); `span#sync-result` gone from HTML/JS/CSS/tests (incl. runtime-built `RETIRED_ID` absence pins in the unit suites); `setSyncProgress` single writer with text-driven visibility; running-only box write in `setSyncLabel`; all 9 settle/cancel sites routed; `requestCancel` pre-fetch clear is a NO-OP.
- Tests: `uv run pytest` → **3463 passed**; `uv run pytest --cov=app` → **99% on app/** (>90%); `uv run ruff check .` + `uv run pyright` → clean (0 errors); `tests/e2e/test_sync_progress_box.py --no-cov` → **8 passed in isolation**; all 18 migrated sync/image-PDF E2E files green in isolation (77 tests).
- Completion criteria: 1) grep clean ✅ 2) sole live region, attrs correct ✅ 3) in-flight/settle/cancel/idle box states proven by E2E + unit pins ✅ 4) icon-only running button + restore ✅ 5) full gates green ✅ 6) no completed-phase behavior change (18 family suites + full suite green) ✅ 7) commit — left to harness per pass instructions (working tree untouched, no `git add`/`commit`).
- Documentation: README.md fixed 2 pre-existing inconsistencies (stale `~/Homelab`+`~/Deployments` source model in the intro — retired in phase 61 — now describes the git/local/archive Sources model; "Requires AIPI_KEY" in retrieval-quality now states `BOR_LLM_API_KEY` in `.env` or `$AIPI_KEY`, matching the scripts' real convention). Everything else (URL table, env defaults vs `app/config.py`, sync/phase-150 copy, prod claims) verified accurate. AGENTS.md: verified consistent — no changes needed.
- Notable: no code changes were required — the phase implementation was correct as left; no live infrastructure touched.
- Next pending phase: `151_pdf_image_extraction` in `.agents/phases/todo/`.
This commit is contained in:
2026-10-02 02:35:03 -04:00
parent 9d4c813cae
commit edf6048a0d
59 changed files with 2719 additions and 476 deletions
+13 -23
View File
@@ -484,31 +484,21 @@
</div>
<!-- Phase 149 (task 01): the sync detail box — the full UNTRUNCATED live
label ("Syncing… <source/rel/path> (n/m) · chunk n/m") in a bordered
panel under the button row, visible ONLY while a sync/upload run is
in flight (sources.js reveals/hides it through the single setSyncLabel
writer). Presentational (aria-hidden) — #sync-result stays the SOLE
aria-live announcer (one live region, no double announce). The button
itself is the spinner while running (task 02's .is-running CSS hides
the label parts). -->
<div class="sync-progress" id="sync-progress" hidden aria-hidden="true">
panel under the button row. Phase 150 (task 01) folded the
announcer in: the previous live-region span beside it is retired,
and THIS box is now the SOLE sync text surface AND the
SOLE aria-live region for the sync area
(role="status" aria-live="polite" — one live region, no double
announce). It carries the live label while a sync/upload run is in
flight and the settle result line after it ("N added · …",
"Sync cancelled", the cancel-failure copy), hiding only when its
text is empty (idle, upload settles, failures) — sources.js drives
it through one writer, the inner span stays the textContent target
(text only, never HTML). The button itself is the spinner while
running (the .is-running CSS hides the label parts). -->
<div class="sync-progress" id="sync-progress" role="status" aria-live="polite" hidden>
<span class="sync-progress-text" id="sync-progress-text"></span>
</div>
<!-- #sync-result is the aria-live announcer: the last sync
result ("N added · …") when a sync settles, and — phase 64 —
the LIVE file label while a sync runs ("Syncing… <file>
(n/m)"), UNTRUNCATED (the button's label spans ellipsize;
screen readers hear the full source/relative path, which
also rides the button title). Phase 129: during the import
phase the label gains the pinned chunk part ("· chunk n/m"
— the file's embed-batch position, batch granularity) and
the announcer/title carry it too ("Syncing… <file> (n/m)
· chunk n/m"). Phase 90: an in-flight upload
run adopts the button with the BARE "Importing…" label (the
run is unpack + register only — no scan, so its status
never carries a file or counts). After an upload settles it
stays empty — the upload's result line lives on the Sources
page (A3). -->
<span class="sync-result" id="sync-result" role="status" aria-live="polite"></span>
<!-- Sync failure banner — role="alert" so a failed sync is announced. -->
<div class="kb-banner is-error" id="sync-error-banner" role="alert" hidden>
<svg aria-hidden="true" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M12 3.6 22.2 20.4H1.8Z"/><path d="M12 9.5v4.6"/><path d="M12 17.4h.01"/></svg>