feat(sprint6b): блоки D+F — pending_guard, guard-индикаторы в UI, race-condition fix

- _eval_pending_guard() — вычисляет активный guard при незаполненных слотах
- pending_guard добавлен в ThreadStateInfo (ответы /chat и /threads/:id)
- ValidationEventInfo получил guard_name / missing_slots / guard_description
- Sandbox: amber-блок «guard активен», подсветка в validation-событиях
- openThread() защищён от race condition: if (activeThreadId !== id) return
  (исключает отрисовку устаревшего треда после переключения на новый)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
AR 15 M4
2026-04-26 19:36:15 +05:00
parent c3b874dc37
commit d7ded5c9f1
4 changed files with 61 additions and 2 deletions
+1
View File
@@ -65,6 +65,7 @@ async def get_thread(thread_id: int, session: AsyncSession = Depends(get_session
suspended_intent=state.get("suspended_intent"),
resumable_step_code=state.get("resumable_step_code"),
resumable_slots=state.get("resumable_slots", {}),
pending_guard=state.get("pending_guard"),
),
)