phase: 156_table_ux_polish
Everything is verified. All gates green on the current working tree. Final report: **Phase 156 — final verification pass (all 4 task files present in `complete/` — no outstanding work)** - **Verified (not re-implemented):** bounded-panel `.table-wrap` (`max-height: min(70vh, 64rem)`, `overflow: auto`, opaque sticky `th` via `var(--brand-soft)`), `.cell-clip` ellipsis rule + the five label families in the three renderers, the added aria-labels, unit pins (incl. `.md-table-wrap` byte-unchanged scope guard, `#git-sources-table-wrap` harmony — no divergent rule), dedicated E2E suite (sticky ×3 tables, horizontal contract, computed-style ellipsis + reachable full text, mobile hamburger + scroll + pin) - **Tests/lint/coverage:** `uv run pytest --cov=app --cov-report=term-missing` → **3570 passed, 99% on `app/`** (gate >90%); `uv run pytest tests/e2e/test_table_ux_polish.py -v --no-cov` (DB up) → **6/6 passed in isolation**; `uv run ruff check . && uv run pyright` → **clean** (0 errors) - **Completion criteria:** sticky header all 3 tables (exact-0 offset while `scrollTop > 0`) ✅ · horizontal scroll unchanged ✅ · ellipsis computed style + actual clip + title/aria reachable ✅ · mobile ≤640px contract ✅ · full suite/E2E/lint/coverage ✅ · atomic commit: **harness commits this phase after the pass** (per pipeline protocol — no git history commands run by me) - **Documentation:** AGENTS.md phase-156 wording (bounded panels, sticky headers, `.cell-clip` + aria-label idiom) matches the implementation exactly — verified consistent; README.md reviewed in full (pages/URLs vs registered routes, all `.env.example` vars documented, Quick Start, eval/llm scripts, compose prod profile, E2E examples) — verified consistent, no changes needed (README describes no table layout/scroll, so no phase-156 mention required) - **Deviations:** none — all work was already in the working tree; this pass re-verified every gate and the docs - **Next pending phase:** `157_chat_chip_cap`
This commit is contained in:
@@ -173,10 +173,17 @@ def test_row_checkbox_is_built_in_the_stored_row_branch() -> None:
|
||||
assert 'hiddenBox.setAttribute(' in make, "the label is set via setAttribute"
|
||||
assert "hiddenBox.innerHTML" not in _js(), "XSS contract: no innerHTML on the box"
|
||||
assert "hiddenLabel.innerHTML" not in _js(), "XSS contract: no innerHTML on the label"
|
||||
assert 'document.createTextNode("Hidden")' in make, (
|
||||
# Phase 156 (task 02, A3): the visible text is the .cell-clip
|
||||
# span — a squeezed cell shows "…" instead of a hard cut; the
|
||||
# checkbox's aria-label names the full source, so the full text
|
||||
# stays reachable.
|
||||
assert "hiddenClip.className = \"cell-clip\"" in make, (
|
||||
"the clip label span (phase 156, A3)"
|
||||
)
|
||||
assert 'hiddenClip.textContent = "Hidden"' in make, (
|
||||
"the visible text label — never aria-label-only (WCAG)"
|
||||
)
|
||||
assert "hiddenLabel.append(hiddenBox, document.createTextNode(\"Hidden\"))" in make
|
||||
assert "hiddenLabel.append(hiddenBox, hiddenClip)" in make
|
||||
assert 'hiddenBox.addEventListener("change", () => toggleHidden(s, hiddenBox))' in make
|
||||
# The env-fallback branch (else) has no checkbox.
|
||||
else_slice = make[else_i : make.find("tr.appendChild(actTd)", else_i)]
|
||||
|
||||
Reference in New Issue
Block a user