Files
brain-of-reese/.agents/phases/complete/192_verbatim_inline_midturn/04_e2e.md
T
ducoterra fb17d15fbe
Build and Push Containers / build-and-push-app (push) Successful in 1m56s
Build and Push Containers / build-and-push-db (push) Successful in 14s
phase: 192_verbatim_inline_midturn
Phase 192 — final verification pass complete.

- **Verified (all 4 tasks already complete):** additive `verbatim_block` SSE frame (`VerbatimBlockPiece` → `ChatVerbatimBlockEvent` → chat dispatch, after the round's `tool`/`tool_result`, before the next round); `hydrateVerbatimNow` matched-only mid-turn pass + app.js branch; `dropPlacedTwin` per-locator done/restore dedupe; the dedicated E2E suite.
- **Root cause of the rejected attempt:** my own concurrent background `pytest` run deadlocked the harness validation run on the shared Postgres (`psycopg.errors.DeadlockDetected`). No code defect — re-ran every gate **exclusively**.
- `uv run pytest -q --cov=app --cov-report=term-missing` → **exit 0**, `TOTAL 7181 16 99%` (>90%)
- `uv run pytest tests/e2e/test_verbatim_inline_midturn.py --no-cov` → **6 passed** (isolated)
- `uv run pytest tests/e2e/test_verbatim_show_text.py tests/e2e/test_chat_history.py --no-cov` → **18 passed** (`test_chat_history.py` byte-unedited; the phase-182 suite's "no eighth type" pin was tightened, not loosened, to seven + `verbatim_block` with frame-order asserts)
- `uv run ruff check .` → All checks passed (exit 0) · `uv run pyright` → **0 errors**
- **Completion criteria:** single frame per success + zero per refusal ✅ · `BOR_ANSWER_TEXT=0` wire byte-identical (integration spelled baseline + E2E App B) ✅ · fence hydrates in place / unfenced lands at the call moment, before `done` ✅ · append+fence → 1 panel, two ranges → 2 panels ✅ · restore 1 panel/locator, `done.answer_text` + record key + `verbatim_blocks=N` unchanged ✅ · suite green, coverage 99%, lint/types clean ✅ · no-show_text turn byte-identical ✅ · commit → left to the harness (no git index/history commands run).
- **Docs:** README reviewed line-by-line (2399 lines) + AGENTS.md in full; mechanically verified all 86 `BOR_*` settings, every `.env.example` var, table defaults, internal anchors (0 broken), ports 8123/8901, tree depth 1–8, pagination 25/1–100, 17 palette colors, `0029`/`0030` migrations, and every cited test file. Fixed 1 inconsistency: the verbatim "Parity" bullet claimed the live turn/reload/shared page share "the same three globals" — now names the settle-path trio and states that `hydrateVerbatimNow` is the ONE chat-only addition (a shared page has no stream).
- **Notable:** `run_agent`'s four repeated piece unions were collapsed into the ONE exported `AgentPiece` alias, so a future piece type is spelled in one place; `test_frontend_edit_message.py`'s `runTurn` byte-pin was regenerated, not weakened.
- **Next pending phase:** `193_sync_remaining_count`.
2026-10-19 12:19:51 -04:00

5.7 KiB
Raw Blame History

Task 04 — The phase E2E suite, the full gates, the docs pass, the commit

Phase: 192_verbatim_inline_midturn · Source: TODO.md:6 Story: n/a

Objective

The dedicated Playwright suite proves the owner-visible contract — the panel is on screen WHILE the answer is still streaming, the fence lands in place, nothing doubles, the kill switch is a byte-identical wire — run in isolation per AGENTS rule 4; the full gates pass; the docs are consistent; one atomic commit.

Work

  1. tests/e2e/test_verbatim_inline_midturn.py (NEW — the module docstring names the TODO item and the A4 unchanged-contract clause) — the module-app fixture pattern (the phase-182 E2E convention — verify in tests/e2e/conftest.py / the sibling verbatim suites; the mock LLM from tests/e2e/mock_llm.py — verify the phase-182 mock's show_text arm; if the mock drives show_text via a fence-only turn, extend the mock with a direct show_text tool call arm in tests/e2e/mock_llm.py — the mock is a test fixture, the extension is additive and the phase-182 pins must stay green):
    • the fixture: a small KB with one document whose content the mock's show_text call targets (the phase-182 fixture convention).
    • (a) the mid-turn arm (the TODO regression): a mock turn: an intro delta ("…here is the exact text:") → the show_text call (the mock arm) → the continuation deltas → done. Assert: the panel (.verbatim[data-bor-locator] with the call's locator — caption + gutter + body) is in the DOM BEFORE the done frame is consumed (the Playwright shape: page.wait_for_selector on the panel resolves while the stream is still running — a sentinel delta after the call proves the stream is live; the panel's DOM position is BELOW the intro text and ABOVE the final sentinel delta — the inline position assertion, the answer_image-position contract of appendUnlocatedVerbatim); the done pass adds nothing (the final panel count == 1).
    • (b) the fence-in-place arm: a mock turn: an intro delta → the show_text call for source/path#12-20 → the final answer containing the ```bor fence for the SAME locator → done. Assert: the fence placeholder is hydrated IN PLACE (the panel is at the fence position — between the intro and the final sentinel delta, NOT at the answer tail) before done (the mid-turn hydrateVerbatimNow pass); after done, the total panel count for that locator == 1 (the dedupe — the task-03 arm).
    • (c) the two-ranges arm: a mock turn with TWO show_text calls — range 1–10 and range 11–20 of the same document (the shown_texts per-locator dedupe admits both) — no fences. Assert: exactly TWO panels after done, both at the answer position in call order, both with their own captions (the per-locator-not-per-identity pin, owner-visible).
    • (d) the kill-switch wire arm: the BOR_ANSWER_TEXT=0 module app — the same mock turn (the mock's show_text attempt hits the phase-182 refusal) → the captured SSE frame sequence (types + payloads via the house SSE-capture pattern) equals the pre-phase baseline (documented in the test); NO verbatim_block frame, NO panel, NO placeholder in the DOM.
    • (e) the restore arm: run arm (a) to completion (a saved conversation — the phase-158 auto-save), reload the page, restore → exactly ONE panel for the locator (the record's answer_text through the same dedupe functions — the A4 parity pin, owner-visible).
  2. Regression, run in isolation: the phase-182 E2E suites (verify the exact names in tests/e2e/ — the verbatim display suite, the fence suite), tests/e2e/test_chat_history.py (the restore contract) — green unedited.
  3. The full gates, in order:
    • uv run pytest (unit + integration) — 100% passing;
    • uv run pytest --cov=app --cov-report=term-missing — >90% on app/;
    • uv run pytest tests/e2e/test_verbatim_inline_midturn.py -v --no-cov — green in isolation;
    • uv run ruff check . && uv run pyright — clean.
  4. Documentation pass (the phase file's Documentation section): README.md + AGENTS.md reviewed in their entirety against the post-phase app; the verbatim section notes the mid-turn landing (a show_text panel appears the moment the call succeeds — in place when fenced, at the answer position when not; the done/restore/shared contract is unchanged, the kill switch byte-identical); AGENTS.md corrected only where it names the done-frame resolution as the ONLY landing point.
  5. Commit: one atomic, professional commit (Conventional Commits, --no-gpg-sign), e.g. feat(verbatim): show_text panels land mid-turn, at the moment the call succeeds (phase 192) — the body names the additive verbatim_block frame, the hydrateVerbatimNow matched-only pass, the per-locator dedupe, and the A4 unchanged contract. .agents/phases/todo/192_verbatim_inline_midturn/ moves to .agents/phases/complete/ in the SAME commit (AGENTS rule 8).

Testing & Quality

  • E2E: the suite above, isolated; the regression suites green.
  • Coverage: >90% on app/.
  • Lint/types: clean.

Completion Criteria

  • tests/e2e/test_verbatim_inline_midturn.py green in isolation — (a) the panel is on screen before done, at the inline position; (b) the same-locator fence hydrates in place mid-turn and never doubles; (c) two ranges of one file → two panels; (d) the answer_text=False wire is byte-identical with no panel/placeholder; (e) the restore shows one panel per locator.
  • uv run pytest 100% passing; uv run pytest --cov=app --cov-report=term-missing >90%; uv run ruff check . && uv run pyright clean.
  • README.md / AGENTS.md consistent (the mid-turn landing clause).
  • the phase directory is in .agents/phases/complete/; one atomic commit with --no-gpg-sign.