From 41437ddf80cfa6ba2ecfe63511d770941cabeb1a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Sun, 21 Jun 2026 17:12:14 +0400 Subject: [PATCH] =?UTF-8?q?doc:=20=D0=B0=D0=BD=D0=B0=D0=BB=D0=B8=D0=B7=20?= =?UTF-8?q?=D1=83=D1=8F=D0=B7=D0=B2=D0=B8=D0=BC=D0=BE=D1=81=D1=82=D0=B5?= =?UTF-8?q?=D0=B9=20Event=20Sourcing=20=D0=BE=D1=82=20Gemini=20Web?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- History/gemini-event-sourcing-analysis.md | 43 +++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 History/gemini-event-sourcing-analysis.md diff --git a/History/gemini-event-sourcing-analysis.md b/History/gemini-event-sourcing-analysis.md new file mode 100644 index 0000000..0cb72ff --- /dev/null +++ b/History/gemini-event-sourcing-analysis.md @@ -0,0 +1,43 @@ +# Анализ уязвимостей Event Sourcing — Gemini Web + +**Дата:** 2026-06-21 + +## 🚨 Критические уязвимости + +### 1. Race Condition в `seq` +`apply_events.cfm` — `MAX(seq)` + `seq++` в цикле. При параллельных запросах — одинаковые seq. +**Фикс:** `INSERT ... SELECT COALESCE(MAX(seq),0)+1` атомарно. + +### 2. Опустошение контракта при full_replace +`apply_events.cfm` — DELETE из spec_current ДО проверки что ops не пуст. LLM упала → спецификация стёрта. +**Фикс:** валидация ops.length перед удалением. + +### 3. Падение типизации price/qty +`apply_events.cfm` — LLM может вернуть строку вместо числа. `cf_sql_float` падает. +**Фикс:** `isNumeric()` перед float. + +### 4. N+1 запросов в UPDATE +`apply_events.cfm` — для каждого UPDATE отдельный SELECT. 200 позиций = 200 запросов. +**Фикс:** один SELECT всех строк до цикла. + +### 5. Построчный INSERT full_replace +`apply_events.cfm` — цикл INSERT вместо массового. +**Фикс:** `INSERT INTO ... SELECT`. + +### 6. Хэш зависит от LLM-форматирования +`apply_events.cfm` — `md5(lower(trim(name)) || date_start)`. LLM написала «Услуги» vs «Услуга» → разный хэш → ADD/DELETE вместо UPDATE. +**Фикс:** LLM сама возвращает target_hash. + +### 7. Несовместимость типов last_event_id +`apply_events.cfm` — UUID пишется как `cf_sql_varchar`. +**Фикс:** правильный UUID-тип. + +## Файлы для анализа + +| Файл | Роль | +|------|------| +| `contractor/apply_events.cfm` | Транзакционное применение ops | +| `contractor/db.cfc` | Схема таблиц spec_events, spec_current | +| `contractor/deploy/llm_prompt.py` | Промпты LLM (ВМ) | +| `contractor/deploy/convert_server.py` | SSE + вызов LLM + apply_events (ВМ) | +| `contractor/index.cfm` | UI, EventSource, раздел сравнения |