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`.
This commit is contained in:
@@ -1471,6 +1471,30 @@ PINNED_RUN_TURN = """function runTurn(text, { reask = false, image = null } = {}
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (ev.type === "verbatim_block") {
|
||||
// Phase 192 (task 02, A2): the show_text panel lands at the moment
|
||||
// the call succeeds — the fence it names hydrates IN PLACE; an
|
||||
// unfenced block lands at the answer position now, not at done.
|
||||
// The done pass re-runs the same functions and can never double this
|
||||
// panel: hydrateVerbatim is idempotent (only .verbatim-pending is
|
||||
// touched), it DROPS this appended twin when the answer fences the
|
||||
// same locator later (dropPlacedTwin, phase 192 A3), and
|
||||
// appendUnlocatedVerbatim skips an already-placed locator. NO
|
||||
// client-side answer_text gate: the server's gate is the only one
|
||||
// (a BOR_ANSWER_TEXT=0 turn sends no frame, so this branch never
|
||||
// fires — a second, client-side gate would only drift).
|
||||
// `wrap` always exists here (the round's `tool` frame created the
|
||||
// live bubble) but the optional chain keeps a frame that arrives
|
||||
// without one a silent no-op, like the `tool_result` branch.
|
||||
const n = hydrateVerbatimNow(
|
||||
wrap?.querySelector(".bubble"),
|
||||
ev,
|
||||
VERBATIM_LINK_OPTS
|
||||
);
|
||||
// The append is the ZERO-match path only: a fence already on screen
|
||||
// keeps its panel IN PLACE (the model's order), and only a block no
|
||||
// placeholder names lands at the answer position.
|
||||
if (n === 0) appendUnlocatedVerbatim(wrap, [ev], VERBATIM_LINK_OPTS);
|
||||
} else if (ev.type === "error") {
|
||||
// Phase 182 (task 07): an `error` frame is terminal — the `done`
|
||||
// hydrate will never run, so a placeholder that streamed in stays at
|
||||
@@ -1701,14 +1725,22 @@ def test_run_turn_is_pinned_at_phase_159_state() -> None:
|
||||
Copy buttons BEFORE ``appendSources``; the ``answer_text`` meta key rides
|
||||
``rememberBrainTurn`` with ``|| undefined``; and the terminal paths — the
|
||||
``error`` frame, the 300 s guard, its own abort surface, and the Stop
|
||||
branch — settle any leftover placeholder to the unresolved state):
|
||||
branch — settle any leftover placeholder to the unresolved state)
|
||||
and phase 192 (task 02)'s sanctioned addition (the ONE new SSE branch:
|
||||
``ev.type === "verbatim_block"`` settles the pending fence the shown
|
||||
block names IN PLACE through ``hydrateVerbatimNow`` and appends the block
|
||||
through ``appendUnlocatedVerbatim`` ONLY when that pass matched nothing —
|
||||
the mid-turn landing, so a panel appears the moment the ``show_text``
|
||||
call succeeds instead of at ``done``; no client-side gate, the server's
|
||||
``BOR_ANSWER_TEXT`` gate is the only one):
|
||||
the full source must match the pin — the ``reask`` path, the turn-local
|
||||
resets, the
|
||||
SSE contract, the save points, and the sanctioned additions (the
|
||||
task-01 ``lastUserWrap`` assignment + the idle-settle mark
|
||||
pass, the task-03 aborted-settle mark pair, the phase-160
|
||||
done-settle pair, the phase-161 live-container additions, the
|
||||
D5 refinement, and the phase-182 verbatim settle/hydrate pair) included."""
|
||||
D5 refinement, the phase-182 verbatim settle/hydrate pair and the
|
||||
phase-192 mid-turn branch) included."""
|
||||
assert _fn_source(_js(), "runTurn") == PINNED_RUN_TURN
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user