From 00451571737b360a3c75c59a86d6faccc21b10eb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9CNaeel=E2=80=9D?= Date: Thu, 25 Jun 2026 08:14:16 +0400 Subject: [PATCH] =?UTF-8?q?v1.0.177:=20=D0=B7=D0=B0=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D1=81=20Opus=20=E2=80=94=20=D1=80=D0=B5=D1=84=D0=B0=D0=BA?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B8=D0=BD=D0=B3=20=D1=84=D1=80=D0=BE=D0=BD?= =?UTF-8?q?=D1=82=D0=B5=D0=BD=D0=B4=D0=B0,=20functional=20pipeline?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../llm-analysis/opus-decoupling-request.md | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 History/llm-analysis/opus-decoupling-request.md diff --git a/History/llm-analysis/opus-decoupling-request.md b/History/llm-analysis/opus-decoupling-request.md new file mode 100644 index 0000000..7d6ba6b --- /dev/null +++ b/History/llm-analysis/opus-decoupling-request.md @@ -0,0 +1,79 @@ +# Запрос для Opus — Рефакторинг фронтенда Contracts + +## Контекст + +Проект: сверка договоров через LLM (colocation, ЦОД). Фронтенд — ванильный JS (app.js ~51KB + app_utils.js ~4KB). Бэкенд — Python http.server на ВМ. Фронт управляет пайплайном: + +``` +Загрузка → Парсинг → Классификация → Группировка → Сравнение +``` + +## Текущая проблема + +Код эволюционировал organically. Глобальные переменные (`fileQueue`, `contractId`, `batchId`), манипуляции с DOM через `innerHTML`, состояние размазано по DOM и JS-переменным. Последствия: +- Сложно тестировать (нет изолированных юнитов) +- Сложно отлаживать (состояние не в одном месте) +- Баги с гонками, затиранием данных, повторными срабатываниями кнопок +- Любое изменение ломает что-то в другом месте + +## Идея заказчика (НЕ догма — оцени и предложи лучшее) + +Разбить на независимые функции-пайплайн: + +``` +upload(files) → [{ id, name, parsed }] +classify(docs) → [{ id, name, parsed, type, number, date, counterparty }] +group(classified) → [{ contract, documents[] }] +compare(group) → { contract, documents[], results[], expandable } +render(state) → DOM +``` + +Каждая функция: чистые входные данные → новые выходные, не мутирует, не трогает DOM. Рендеринг — отдельно. Состояние хранится в одном месте. + +## Что нужно от тебя + +1. **Оценить идею.** Это правильный подход для ванильного JS? Или есть более подходящий паттерн (state machine, pub/sub, flux-like store)? Не изобретай велосипед — бери best practices для проектов такого масштаба (~50KB JS). + +2. **Предложить архитектуру.** Как организовать код чтобы: + - Каждый этап пайплайна тестируем изолированно + - Состояние предсказуемо и отлаживаемо (console.log одного объекта показывает всё) + - DOM-рендеринг отделён от логики + - Минимальные изменения в текущем коде (не переписывать с нуля) + +3. **План миграции.** Как перейти от текущего состояния к новому постепенно, не ломая работающий функционал. + +## Релевантные файлы (читать) + +- `contractor/deploy/app.js` — весь фронтенд (~51KB): renderTable, runClassify, loadGroups, runCompareForGroup, buildGroupCard, markGroupDone, syncDB, stepper, toggleClassifyDetail, showText, SSE handlers +- `contractor/deploy/app_utils.js` — утилиты: removeFile, escHtml, formatSize, formatDate, openAbout +- `contractor/index.cfm` — HTML-оболочка, DOM-структура + +## Игнорировать + +- `contractor/deploy/convert_server.py` и все Python-файлы — бэкенд, не рефакторим +- `contractor/deploy/db/`, `contractor/deploy/services/` — бэкенд +- `contractor/*.cfm` кроме index.cfm — старый Lucee-код +- `contracts-app/`, `contracts-vm/`, `History/`, `DOC/`, `FILES/` — не относится + +## Ключевые функции для анализа + +| Функция | Строки (app.js) | Что делает | +|---------|-----------------|------------| +| renderTable | 57-75 | Рендер таблицы файлов | +| fileInput change | 76-290 | Загрузка + парсинг | +| runClassify | 308-360 | Классификация | +| loadGroups | 362-430 | Группировка + рендер карточек | +| buildGroupCard | 433-442 | Карточка необработанной группы | +| markGroupDone | 444-478 | Карточка обработанной группы | +| runCompareForGroup | 483-590 | Сравнение группы (apply → SSE) | +| toggleClassifyDetail | 91-130 | Раскрытие промежуточных результатов | +| syncDB | 26-34 | Синхронизация БД с таблицей | +| stepper | 38-56 | StepDone/StepActive/ResetStepper | + +## Ограничения + +- Без фреймворков (ванильный JS) +- Без классов и наследования (не ООП) +- Минимум зависимостей между модулями +- Фокус на тестируемость и отлаживаемость +- Не переписывать с нуля — мигрировать постепенно