phase: 114_embed_question_length
All verification passes complete — the phase was already fully implemented in the working tree, and every gate is green. No defects found; no code changes were needed.
**Final verification pass — Phase 114 (embed question length):**
- Verified truncation: `chat.py:459` embeds `request.message[:settings.embed_question_max_chars]` (default 1200, `BOR_EMBED_QUESTION_MAX_CHARS`, `>0` validator); full question still reaches the LLM prompt/log.
- Verified error mapping: `EmbeddingInputTooLargeError(EmbeddingError)` (byte-identical message) caught **before** `EmbeddingError` → no retry, terminal frame `detail="Question too long — trim it and re-ask."` + reachability-fine hint; `ChatErrorEvent.hint` additive.
- Verified frontend chain: frame `hint` → `err.hint` → `setUiState(error, …, {hint})` → `showErrorBanner(…, {retryable: true})` — hint replaces default `ERROR_HINT`, phase-111 `#banner-retry` button revealed. 4,000-char clamp untouched (A2).
- `uv run pytest tests/unit/test_embed_question_length.py -v --no-cov` → 21 passed
- `uv run pytest tests/e2e/test_embed_question_length.py -v --no-cov` (isolation, DB up) → 1 passed (4,000-char question → done, no banner)
- Regression: `test_llm_retry.py` 4 passed · `test_oneshot_llm_retry.py` 2 passed · `test_chip_sizing_question_cap.py` 6 passed
- `uv run pytest --cov=app --cov-report=term-missing` → 2444 passed, TOTAL **99%** (>90% gate)
- `uv run ruff check .` → All checks passed; `uv run pyright` → 0 errors, 0 warnings
**Completion criteria:** (1) 4,000-char question embeds prefix + full prompt ✅ · (2) too-large → accurate frame + hint + Retry button ✅ · (3) reachability failure byte-identical (retries + old copy) ✅ · (4) all gates green ✅ · (5) commit/phase-move → left to the harness per instructions (no `git add`/`commit` run).
**Deviations:** none. **Next pending phase:** `115_doc_draft_discard`.
This commit is contained in:
@@ -206,10 +206,18 @@ class ChatErrorEvent(BaseModel):
|
||||
The client's loading-feedback state machine (phase 06) keys off this
|
||||
exact shape — ``{type: "error", detail: str}`` — to flip to the error
|
||||
state and re-enable the send button.
|
||||
|
||||
``hint`` (phase 114, TODO L6): an optional one-line clarification the
|
||||
client shows IN PLACE of its default reachability hint when present
|
||||
(the "question too long" frame: the embedding model WAS reached —
|
||||
only the question's length is the problem). Additive: frames without
|
||||
it serialize ``"hint": null``, and old clients ignore the field
|
||||
(PLAN §4 house contract — the ``ChatDoneEvent.related`` pattern).
|
||||
"""
|
||||
|
||||
type: str = "error"
|
||||
detail: str
|
||||
hint: str | None = None
|
||||
|
||||
|
||||
class ChatRetryEvent(BaseModel):
|
||||
|
||||
Reference in New Issue
Block a user