mirror of
https://github.com/nesquena/hermes-webui.git
synced 2026-05-25 19:20:16 +00:00
8782fd2675
CRITICAL: #1951 PENDING_GOAL_CONTINUATION race Removes `PENDING_GOAL_CONTINUATION.discard(session_id)` from the streaming worker's `finally` cleanup block. The marker is set inside the SAME function call (line ~3328 on `goal_continue`) and the discard in the `finally` (line ~3553) almost always raced ahead of the frontend's SSE-receive → POST /api/chat/start round-trip, erasing the marker before the consumer in routes.py could read it. The consumer (`_start_chat_stream_for_session` in routes.py:6522) already discards atomically when consuming, so removing the streaming-side discard preserves single-use semantics and unblocks the goal-continuation chain. Adds tests/test_stage326_pending_goal_continuation_race.py with 5 regression guards: 1. streaming.py's finally must NOT discard PENDING_GOAL_CONTINUATION 2. routes.py consumer must check + set + discard atomically 3. PENDING_GOAL_CONTINUATION must be a set (GIL-safe single-op) 4. STREAM_GOAL_RELATED.pop must be keyed by stream_id, not session_id 5. PENDING_GOAL_CONTINUATION.add must precede the goal_continue SSE emission in source ordering HARDENING: #1956 composer-draft input validation Per Opus, the POST /api/session/draft handler accepted unbounded / arbitrary-typed text and files inputs. With the 400ms debounced auto-save firing on every keystroke, a misbehaving client could persist multi-MB strings into the session JSON. Adds: - text: coerced to str if not already; clamped to 50_000 chars - files: coerced to list if not already; clamped to 50 entries Validation runs BEFORE the session lock acquire / save. Adds tests/test_stage326_composer_draft_validation.py with 5 guards. Verdict from Opus advisor on stage-326: SHIP-WITH-FIXES. This commit applies the required + recommended fixes; #1957 hardening fixed in a prior stage commit.