Files
contracts/History/llm-analysis/opus-decoupling-review.md
T

3.3 KiB
Raw Blame History

Ответ 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)?