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
+24 -38
View File
@@ -2203,12 +2203,13 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
}
/* Phase 64: the live-file label ("Syncing… <file> (n/m)" / "Importing
<file> (n/m)") — a long source/relative/path ellipsizes inside the
pill; the full path lives in the button title + #sync-result (the
aria-live announcer). Phase 128 (task 02): the label is a FLEX ROW
pill; the full path lives in the button title + the #sync-progress
box (the aria-live announcer — phase 150: the SOLE sync text
surface). Phase 128 (task 02): the label is a FLEX ROW
of parts — .sync-label-main (the prefix + file/folder: min-width
0, the shrinkable item whose ellipsis engages) + .sync-label-count
(the pinned "(n/m)": flex 0 0 auto, NEVER clipped — the
.sync-result mono language, a position reads as data). Phase 129
.sync-progress-text mono language, a position reads as data). Phase 129
(task 04): a THIRD pinned part — .sync-label-chunk (the "· chunk
n/m" embed-batch position of the in-flight file, the same pinned
mono language; hidden in every state but the import phase after
@@ -2229,7 +2230,7 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
.sync-label-count {
flex: 0 0 auto; /* NEVER clipped — the (n/m) position is the point */
white-space: nowrap;
font-family: var(--mono); /* the .sync-result mono language (position reads as data) */
font-family: var(--mono); /* the .sync-progress-text mono language (position reads as data) */
}
.sync-label-chunk {
flex: 0 0 auto; /* NEVER clipped — the · chunk n/m position is the point (phase 129) */
@@ -2245,10 +2246,11 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
body 1.55 line-height, + the 0.75rem block padding + the 2px border,
border-box) so even a one-line label reads as a calm panel with
breathing room. The box is hidden-attr-driven (the global [hidden]
!important rule keeps it display:none at idle — it exists only while
a run is in flight). Mobile: a block in the same .container rides the
100%-width phone shell — full width with no override (task 03's E2E
asserts it at 360px). */
!important rule keeps it display:none while its text is empty —
phase 150: it shows while a run is in flight AND stays up after
settle to carry the result line). Mobile: a block in the same
.container rides the 100%-width phone shell — full width with no
override (task 03's E2E asserts it at 360px). */
.sync-progress {
background: var(--surface);
border: 1px solid var(--line);
@@ -2258,12 +2260,12 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
}
.sync-progress-text {
display: block;
font-family: var(--mono); /* the .sync-result mono language (position reads as data) */
font-size: 0.8rem; /* the .sync-result size */
font-family: var(--mono); /* the house mono language — position reads as data */
font-size: 0.8rem; /* the house small-data size */
line-height: 1.55; /* the house body line-height */
color: var(--ink-soft); /* the .sync-result ink — a PINNED identity pair on --surface
(8.2:1 on the built-in dark, AA in both built-ins; the
theme gate keeps any custom theme at >= 4.5:1) */
color: var(--ink-soft); /* PINNED identity pair on --surface (8.2:1 on the
built-in dark, AA in both built-ins; the theme gate
keeps any custom theme at >= 4.5:1) */
overflow-wrap: anywhere; /* THE POINT of the box — a long source/relative/path WRAPS
inside the panel; the pre-phase pill ellipsis is retired
for the live detail (never clipped) */
@@ -2280,15 +2282,6 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
neither. The idle "Sync sources" label (and the mobile ellipsis rules
for it) render exactly as pre-phase when the class is absent. */
.sync-btn.is-running .sync-label { display: none; }
/* Last-result announcer — soft ink, small mono */
.sync-result {
display: block;
color: var(--ink-soft);
font-family: var(--mono);
font-size: 0.8rem;
white-space: nowrap;
padding-block: 0.5rem;
}
/* Sync failure modal — lazily created by sources.js, appended to <body>.
Error surface: --err-bg with --err-line border, title in --ink,
error text in --err-ink (9.1:1 on --err-bg). Backdrop dims with
@@ -2935,10 +2928,11 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
}
#archive-upload-file::file-selector-button:hover { border-color: var(--brand); color: var(--brand-ink); }
/* The upload's success line (role=status): the sync-result shape
("2 added · 1 pruned") — ink-soft on surface (>=4.5:1), the dashed
hint-box border marks it as a result, not an error; it drops onto
its own row under the input like the error line. */
/* The upload's success line (role=status): the .sync-progress-text
soft-ink result-line language ("2 added · 1 pruned") — ink-soft on
surface (>=4.5:1), the dashed hint-box border marks it as a result,
not an error; it drops onto its own row under the input like the
error line. */
#archive-upload-result {
flex-basis: 100%;
margin: 0;
@@ -3656,9 +3650,10 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
gap: 1.25rem;
flex: 1;
}
/* Action feedback line (role=status): the sync-result shape —
ink-soft on surface (>=4.5:1), small mono; the min-height holds
the layout so a delete's line never reflows the table. */
/* Action feedback line (role=status): the .sync-progress-text mono /
soft-ink language — ink-soft on surface (>=4.5:1), small mono; the
min-height holds the layout so a delete's line never reflows the
table. */
.history-status {
display: block;
min-height: 1.2em;
@@ -5636,15 +5631,6 @@ a.answer-image:hover { text-decoration: underline; } /* flat — the caption und
.sync-label { max-width: none; flex: 1 1 auto; min-width: 0; }
.history-refresh { width: 100%; }
.history-refresh svg { display: block; }
.sync-result {
position: absolute !important;
width: 1px; height: 1px;
margin: -1px; padding: 0;
overflow: hidden;
clip: rect(0 0 0 0);
white-space: nowrap;
border: 0;
}
}
/* Phase 46: prefers-reduced-motion stills the mobile menu — no