33 lines
3.3 KiB
Markdown
33 lines
3.3 KiB
Markdown
# Ответ Opus на decoupling — моё мнение
|
||
|
||
## По трём открытым вопросам
|
||
|
||
### 1. Перерисовывать целиком vs точечно?
|
||
**Целиком.** Для ~50KB JS и десятка DOM-элементов перерисовка всей карточки/таблицы — доли миллисекунды. Точечные патчи создают ровно те баги, которые мы сегодня чинили (затирание, рассинхрон). `render(state)` должен тупо пересобрать всё заново.
|
||
|
||
### 2. Промпты/чат/showText в scope?
|
||
**Нет**, отдельная итерация. Они изолированы (модалки), не участвуют в пайплайне. Не добавлять сложности.
|
||
|
||
### 3. Node-тесты на чистые билдеры?
|
||
**Да.** После Фазы 2, когда появятся `buildFileRowHTML(state)` и `buildGroupCardHTML(group)`. Прогнать на фикстурах — уберёт регрессии на рендеринг.
|
||
|
||
## По плану в целом
|
||
|
||
**Согласен с порядком фаз.** Фаза 0 (каркас) → Фаза 1 (files) → Фаза 2 (groups) → Фаза 3 (SSE). Это правильный порядок от простого к сложному.
|
||
|
||
**Согласен с удалением `markGroupDone`.** Чтение `bodyEl.innerHTML` из DOM — это то самое «состояние размазано по DOM», которое мы лечим. `state.groups[gi].compare.status === 'done'` — правильный источник истины.
|
||
|
||
**Дополнение по SSE.** Opus правильно отметил что SSE-события мутируют state + render(). Но есть нюанс: `EventSource` и таймеры нужно привязывать к `state._activeCompare`. При старте нового сравнения проверять `if (state._activeCompare) { state._activeCompare.es.close(); }` — это уберёт гонки на уровне state, а не DOM.
|
||
|
||
**Дополнение по рендерингу.** `render(state)` должна быть идемпотентной: повторный вызов с тем же state даёт тот же DOM. Это гарантирует что «лишний render()» не сломает ничего.
|
||
|
||
## Есть ли ещё вопросы к Опусу?
|
||
|
||
Три уточнения:
|
||
|
||
1. **`fileInput change` handler** — ~200 строк, самая сложная функция. Как разбить на под-actions: `selectFiles`, `removeOrphans`, `uploadOne`, `parseOne`? Или оставить монолитом но внутри state?
|
||
|
||
2. **SSE-дублирование.** `runCompareForGroup` и `llmBtn` имеют ~80% одинакового кода (extract_start, llm_done, applied). Унифицировать в `runCompare(state, contractId)` с флагом `scope: 'group' | 'all'`?
|
||
|
||
3. **`status` в state.files.** Сейчас это HTML-строка (`'<span class="status-ok">✓ 25 эл. (0.0с)</span>'`). Заменить на структуру `{ ok: true, elements: 25, time: 0.0 }` и рендерить через `renderFileStatus(file)`?
|