О проекте
Команда: Singularity
Кейс HackAlem.ai: Спецтрек — Казахтелеком
Стадия: Доведённый продукт
Задача кейса: Агент, сравнивающий документы оргструктуры до и после реорганизации
Суть
ИИ-агент сравнивает документы оргструктуры «до» и «после» реорганизации: находит созданные, упразднённые и реорганизованные подразделения, потерю и дублирование функций, конфликт интересов, проверяет соответствие IIA и законодательству и к каждому выводу даёт дословную цитату с пунктом, итог выгружается в DOCX.
Как устроено
Пайплайн из 14 шагов на Next.js API. Документы (docx/pdf/xlsx/сканы) разбираются на пункты, сканы распознаёт OCR PaddleOCR PP-OCRv5 в ONNX. Состав подразделений и носители функций определяются правилами, дословно совпавшие пункты (~85%) выравниваются без LLM. Изменённые функции сопоставляются через кандидатов по эмбеддингам text-embedding-3-large и LLM gpt-6-sol со строгими JSON-схемами. Каждую «потерю» второй проход evaluator перепроверяет по всему документу, конфликт интересов ищется по каталогу правил, агент предлагает получателей утраченных функций и сверяет документ с 15 требованиями IIA, Закона РК «Об АО» и 208-ФЗ. Цитаты проверяются на вхождение в текст, вывод без подтверждённой цитаты не показывается. Ответы LLM кэшируются на диске.
Ключевые решения
- clause segmentation
- embedding candidate retrieval
- LLM structured outputs (strict JSON schema)
- evaluator second pass
- citation verification
- rule catalog for conflict of interest
- PaddleOCR PP-OCRv5 ONNX
- gold-set eval (recall)
- LLM response disk cache
Метрики
eval 16/16 по эталону; в LLM уходят только 57 из 377 функций; OCR CER 0,41% (PP-OCRv5) против 0,47% (tesseract.js), ~2 с/стр.
Особенности
Принцип «детерминированный код везде, где можно, LLM только для смысла» и обязательная проверка каждой цитаты по тексту. Закоммиченный кэш LLM даёт воспроизводимое демо без сети и без ключа. Отдельно находятся «битые» перекрёстные ссылки после перенумерации пунктов.
Стек
Next.js 16 · React 19 · TypeScript · Bun · Tailwind 4 · shadcn/ui · TanStack Query/Table · React Flow · onnxruntime-node · mammoth · unpdf · mupdf
Модели
gpt-6-sol (OpenAI Responses API) · text-embedding-3-large
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-d68591cd-singularity.
README
README.mdOrgDiff — ИИ-агент анализа оргструктуры и функционала

Загружаете документы «до» и «после» реорганизации — агент показывает, какие подразделения созданы, упразднены и реорганизованы, какие функции потеряны или продублированы, где возник конфликт интересов, и у каждого вывода даёт документ, пункт и дословную цитату. Итог — аналитическое заключение (на экране и файлом Word).
Быстрый старт
git clone https://github.com/BAITC-Hacks/hack-d68591cd-singularity.git && cd hack-d68591cd-singularity
bun install
bun run dev # http://localhost:3000 → «Загрузить тестовый комплект» → «Анализировать»
Ключ API уже в репозитории (.env), тестовый комплект отвечает из закоммиченного кэша — за секунды и даже без сети. Проверка из чистого клона одной командой: bun run verify.
| Находки с источниками | Панель источника: пункт «до» ↔ «после», цитаты проверены |
|---|---|
![]() | ![]() |
Описание решения и его назначение
Трек 11, задача «ИИ-агент „Анализ организационной структуры и функционала“».
При реорганизации сотрудник вручную сверяет положения о подразделениях, оргструктуры и приложения к приказам «до» и «после». OrgDiff делает это автоматически. Пользователь загружает оба комплекта документов, а агент:
- определяет, какие подразделения созданы, сохранены, реорганизованы или упразднены, и куда ушли функции упразднённых;
- сопоставляет функции «до» и «после» и находит потерю и сужение функций;
- находит дублирование функций, пересечение зон ответственности и признаки конфликта интересов (по каталогу правил IIA / разделения обязанностей);
- у каждого вывода показывает источник: документ, номер пункта и дословную цитату, автоматически проверенную по тексту;
- формирует итоговое заключение с рекомендациями — на экране и файлом Word/Markdown;
- предлагает, кому передать утраченные функции (опция 3 ТЗ): получатель выбирается по собственным функциям подразделений новой структуры, с обоснованием и ссылкой на пункт; для сужений — какой фрагмент вернуть;
- сверяет новую редакцию с внешними требованиями (опция 1 ТЗ): 15 требований к функции внутреннего аудита из стандартов IIA GIAS 2024, Закона РК «Об АО» и 208-ФЗ (
data/requirements.json, у каждого — номер нормы и ссылка на официальный источник; на тестовой паре применимы 11: 10 IIA + 1 из 208-ФЗ). Применимое законодательство определяется по ссылкам в самих документах (с цитатой-основанием): требования страны применяются, только если документы ссылаются на её законодательство (на тестовой паре — РФ, 35 ссылок; без ссылок — РК как контекст использования), стандарты IIA — всегда. По каждому требованию агент ставит статус «выполнено / частично / не выполнено / противоречит / не найдено в комплекте» и приводит пункты с дословными цитатами. Цитаты проверяются по тексту, статус без подтверждённой цитаты понижается до «не найдено». Результат — отдельный раздел заключения (Word/Markdown); - дополнительно находит дефекты документа: ссылки на пункты, которые после перенумерации стали вести на другое содержание.
Выводы носят рекомендательный характер: формулировки даны как гипотезы («признаки дублирования»), а вывод без подтверждённой цитаты не показывается (ограничение 9 ТЗ).
Архитектура
flowchart LR
U[Браузер: комплекты до/после] -->|POST /api/analyze| API[Next.js API]
API --> P1[1. Разбор docx/pdf/xlsx/сканов на пункты<br/>OCR PP-OCRv5 для сканов]
P1 --> P2[2. Состав подразделений и должностей<br/>правила; LLM — запасной путь]
P2 --> P3[3. Функции и их носители]
P3 --> P4[4. Выравнивание дословно совпавших пунктов]
P4 --> P5[5. Эмбеддинги → кандидаты]
P5 --> P5b{6. Комплекты сопоставимы?}
P5b -->|нет| STOP[Объяснение пользователю, анализ не проводится]
P5b -->|да| P6[7. LLM-сопоставление изменённых функций]
P6 --> P7[8. Самопроверка потерь по всему документу]
P7 --> P8[9. Дублирование и пересечения]
P8 --> P9[10. Конфликт интересов: каталог правил]
P9 --> P9b[11. Кому передать утраченные функции]
P9b --> P10[12. Сборка выводов: проверка каждой цитаты,<br/>новое / было ранее, дефекты ссылок]
P10 --> P11[13. Итоговое заключение]
P11 --> P12[14. Сверка с IIA и законодательством<br/>по юрисдикции документов]
P12 -->|GET /api/analyze/:id| U
Принцип: детерминированный код везде, где можно, LLM только там, где нужен смысл.
- Пункты, состав подразделений и носители функций определяются правилами. Они воспроизводимы и не зависят от температуры модели.
- Около 85% функций (пунктов с обязанностями) совпадают дословно и сопоставляются без LLM. Модель получает только изменённые (57 из 377 функций) вместе с кандидатами, отобранными по эмбеддингам.
- Каждую «потерю» агент перепроверяет вторым проходом по всему документу «после» (паттерн evaluator). Частичное покрытие общими нормами не снимает вывод, но попадает в пояснение.
- Каждая цитата проверяется на вхождение в текст пункта (с нормализацией регистра, ё/е, латинских двойников кириллицы). Неподтверждённые цитаты удаляются, вывод без подтверждённых цитат не показывается.
- Шаги агента видны в интерфейсе как лента прогресса (
trace).
| Путь | Что там |
|---|---|
src/features/orgdiff/types.ts | контракт между пайплайном и интерфейсом |
src/features/orgdiff/lib/parse-clauses.ts | сегментация на пункты: склеенные пункты, заголовки из оглавления |
src/features/orgdiff/lib/units.ts | подразделения, должности, подчинённость, носители функций |
src/features/orgdiff/lib/analyze.ts | оркестратор агента, сборка выводов и проверка цитат |
src/features/orgdiff/lib/judge.ts | промпты LLM со строгими JSON-схемами, каталог правил КИ |
src/features/orgdiff/lib/compliance.ts, data/requirements.json | сверка с внешними требованиями (IIA, Закон РК «Об АО», 208-ФЗ) |
src/features/orgdiff/lib/llm.ts | клиент OpenAI и дисковый кэш ответов |
src/app/api/analyze/ | API: запуск анализа, статус задачи, выгрузка заключения (report) |
src/features/orgdiff/lib/report.ts | итоговое заключение в DOCX и Markdown |
src/features/orgdiff/components/, src/app/dashboard/orgdiff/ | интерфейс |
scripts/eval.ts | проверка качества по эталону и контрольному комплекту |
data/ | тестовые документы, контрольный комплект, эталон, кэш ответов LLM |
Используемые технологии
Next.js 16 (App Router), React 19, TypeScript, Bun, Tailwind 4, shadcn/ui, TanStack Query + Table, React Flow (@xyflow/react).
ИИ: OpenAI Responses API, модель gpt-6-sol со structured outputs (строгие JSON-схемы); эмбеддинги text-embedding-3-large.
Документы: mammoth (.docx), unpdf (.pdf), read-excel-file (.xlsx). OCR сканов: PaddleOCR PP-OCRv5 (детектор PP-OCRv5_mobile_det + распознаватель русского eslav_PP-OCRv5_mobile_rec, ONNX, Apache-2.0) в onnxruntime-node, растеризация PDF — mupdf (WASM).
Системные требования и зависимости
- Bun 1.4+ (обязательно: все команды и скрипты запускаются через bun)
- Node.js 20.9+ в PATH (рекомендуется 22, см.
.nvmrc): Next.js при сборке и запуске использует node - Интернет при
bun run build— для загрузки шрифтов Google (next/font). - Доступ к
api.openai.comнужен только для новых документов. Тестовый комплект и контрольный набор отвечают из кэшаdata/cache/без сети и без ключа.
Установка
git clone https://github.com/BAITC-Hacks/hack-d68591cd-singularity.git
cd hack-d68591cd-singularity
bun install
Параметры окружения
Настраивать ничего не нужно: демонстрационный доступ к OpenAI API (п. 5.6.6 Положения) — тестовый ключ хакатона в закоммиченном .env. Основной сценарий проверяется и без ключа: тестовый и контрольный комплекты отвечают из закоммиченного кэша data/cache/ (так же работает bun run verify).
| Переменная | Назначение | Обязательна | Значение по умолчанию |
|---|---|---|---|
OPENAI_API_KEY | ключ OpenAI API | да (уже в .env) | тестовый ключ хакатона |
OPENAI_MODEL | модель анализа | нет | gpt-6-sol |
OPENAI_EMBEDDING_MODEL | модель эмбеддингов | нет | text-embedding-3-large |
Чтобы подставить свой ключ, создайте .env.local: он имеет приоритет над .env (см. env.example.txt).
Запуск
bun run dev # режим разработки, http://localhost:3000
bun run build && bun run start # продакшен-сборка
Без интерфейса:
bun run analyze:demo # анализ тестового комплекта, сводка в консоль
bun run eval # проверка качества по эталону и контрольному комплекту
# свой комплект: несколько файлов на сторону, форматы .docx / .pdf (в т.ч. сканы) / .png / .jpg / .xlsx / .txt
bun scripts/analyze-files.ts --before old.pdf --after new.docx --after prikaz.docx [--json result.json]
Что поддерживается на входе, кроме тестовой пары:
- PDF с текстовым слоем — строки вёрстки склеиваются обратно в абзацы, номера страниц и колонтитулы отбрасываются; PDF-версия тестовой пары даёт те же 441/442 пункта и те же выводы, что и Word.
- Сканы: PDF без текстового слоя и картинки .png/.jpg — распознаются OCR офлайн: PaddleOCR PP-OCRv5 (open-source SOTA, модели 12,7 МБ лежат в
models/ocr/) в ONNX Runtime, без Python и системных пакетов — всё ставитbun install. Строки восстанавливаются сверху вниз с учётом наклона скана, дальше тот же разбор на пункты. На скане тестовой пары (200 DPI, наклон, шум): CER 0,4%, ~2 с на страницу (Mac M, 8 ядер), 440 из 441/442 пунктов с теми же номерами, что у Word-версии; анализ скана через прод-сервер находит те же подразделения и потери функций, что и по Word. Движок выбран сравнением на тех же сканах: tesseract.js 7 (rus) — CER 0,47%, быстрее (~0,6 с/стр.), PP-OCRv5 — точнее (CER 0,41%) и устойчивее на сложных сканах. - Несколько документов на сторону (Положение + приказ о реорганизации) — ссылки на пункты указывают конкретный документ; плоская нумерация «1. Создать …», «2. Упразднить …» разбирается как пункты.
- Excel (оргструктура / штатное расписание) — строка заголовка ищется по столбцу «Подразделение»; подразделения, сокращения, руководители и должности берутся по столбцам, ссылка — «стр. N».
- Другой формат положения — состав ищется правилами: перечень под «состоит из следующих подразделений», «В состав … входят:» подпунктами или через запятую; иначе — LLM. Разделы с римскими номерами («I. Общие положения», «Раздел III», «Глава 2»).
- Положения об отдельных подразделениях («Положение о Департаменте …», «Должностная инструкция …») — функции документа относятся к подразделению из его шапки.
- Изменения против «было ранее» — дубли и конфликты интересов, которые существовали и в прежней редакции, помечаются
origin: preexistingи идут после изменений.
Порядок проверки основного сценария
bun run dev→ открытьhttp://localhost:3000(откроется «Анализ оргструктуры»).- Нажать «Загрузить тестовый комплект (ред. 8 → ред. 9)» — или перетащить свои файлы в зоны «Комплект ДО» и «Комплект ПОСЛЕ» (например,
data/before_polozhenie_red8.docxиdata/after_polozhenie_red9.docx), — затем «Анализировать». Лента «Ход анализа» показывает шаги агента. - Просмотреть вкладки: Схема (подразделения до/после и потоки функций), Функции (таблица сопоставления), Находки (выводы: сначала изменения, затем «было ранее»; у каждого — чипы источников, клик открывает пункт и цитату), Требования (сверка с IIA и законодательством), Заключение (служебная записка, «Скачать .docx / .md»).
- Ожидаемый результат (из кэша — за секунды, на новых документах около минуты):
- создано: ДИТААД, ДОА; упразднена должность «Директор направления внутреннего аудита», её функции переданы ДИТААД и ДОА (по 17); реорганизованы ДНМ, ДККМ и блок Главного аудитора (изменён состав должностей);
- потери функций: ДККМ — п. 5.6.2 (группы контроля качества), п. 5.6.3 (предложения по внешней оценке), ДНМ — п. 5.7.2;
- дублирование: анализ результатов непрерывного аудита у ДИТААД/ДОА и ДНМ (пп. 5.3.8 и 5.4.5 новой редакции);
- конфликт интересов: участие Главного аудитора в органах управления подконтрольных обществ и совмещение функций ВА в ДЗО (п. 4.4); замечания, существовавшие и в прежней редакции, помечены «было ранее»;
- дефект документа: п. 5.10.2 после перенумерации ссылается на п. 5.8.1 (теперь запрет), прежнее содержание — в п. 5.7.1;
- сверка: юрисдикция определена по документам — РФ (пп. 1.6, 1.8), требования IIA и 208-ФЗ;
- у каждого вывода — документ, пункт и цитата; итоговое заключение с рекомендациями — на экране и файлом Word/Markdown (
/api/analyze/<jobId>/report).
- Контрольный комплект с заранее известными изменениями: «до» =
data/before_polozhenie_red8.docx, «после» =data/control/after_red9_control.txt. Ожидаемо: ДККМ преобразован в ДМК (функции перешли в ДМК); потеря функции «обучение работников БВА» (до п. 5.5.9); дублирование «оценки качества» у ДНМ (п. 5.4.11) и ДМК (п. 5.5.2).
Через API:
curl -X POST 'http://localhost:3000/api/analyze?demo=1' # → {"jobId":"…"}
curl http://localhost:3000/api/analyze/<jobId> # статус, шаги агента, результат
curl -OJ http://localhost:3000/api/analyze/<jobId>/report # итоговое заключение .docx (?format=md — Markdown)
# без состояния сервера, с решениями сотрудника: тело { result, reviews: { "F7": "confirmed", "F25": "rejected" } }
curl -s http://localhost:3000/api/analyze/<jobId> | bun -e 'const j=await Bun.stdin.json();console.log(JSON.stringify({result:j.result,reviews:{F7:"confirmed",F25:"rejected"}}))' > request.json
curl -OJ -X POST 'http://localhost:3000/api/report?format=docx' -H 'Content-Type: application/json' -d @request.json
curl -X POST http://localhost:3000/api/analyze -F before=@data/before_polozhenie_red8.docx -F after=@data/after_polozhenie_red9.docx
Все экраны
![]() | ![]() |
![]() | ![]() |
![]() | ![]() |
Соответствие ТЗ
| Требование ТЗ | Где реализовано | Где видно |
|---|---|---|
| Must have 1: реорганизованные, сохранённые, созданные подразделения | lib/units.ts (правила по разделу «Структура», шапке «Положение о …», таблицам Excel; LLM — запасной путь), потоки функций между подразделениями | вкладка «Схема», раздел 2 заключения |
| Must have 2: потеря функций | lib/analyze.ts: дословное выравнивание → эмбеддинги → LLM-сопоставление → самопроверка потерь | вкладки «Функции» и «Находки» |
| Must have 3: дублирование и конфликт интересов | lib/judge.ts: судья пар дублей, каталог правил КИ (IIA GIAS 2024, три линии, SoD) | «Находки» |
| Must have 4: источник — документ и пункт | у каждого вывода Evidence с дословной цитатой, проверенной по тексту пункта; пары «до ↔ после» | панель источника у каждого вывода |
| Must have 5: итоговое заключение | шаг «Итоговое заключение», lib/report.ts | вкладка «Заключение», выгрузка .docx / .md |
| Опция 1: сверка с законодательством и стандартами | lib/compliance.ts, data/requirements.json (IIA, Закон РК «Об АО», 208-ФЗ) | вкладка «Требования», раздел заключения и выгрузки |
| Опция 2: сравнение со структурами других операторов | не реализовано: открытые данные операторов организатором не предоставлены. Путь развития — офлайн-каталог структур аналогов по образцу data/requirements.json и тот же шаг сверки | — |
| Опция 3: перераспределение функций | шаг «Рекомендации по перераспределению»: получатель по собственным функциям подразделений, с пунктом-основанием | рекомендации у выводов о потере, заключение |
| Ограничения: рекомендательный характер, нет неподтверждённых утверждений, прослеживаемость | формулировки-гипотезы, дисклеймер; неподтверждённые цитаты удаляются, вывод без них не показывается; проверка сопоставимости комплектов | во всех экранах и в выгрузке |
| Вход: комплект Word / PDF / Excel | несколько файлов на сторону; .docx, .pdf (в т.ч. сканы — OCR), .xlsx, .png/.jpg, .txt | зона загрузки |
| Простая проверка на контрольном комплекте | data/control/after_red9_control.txt и bun run eval (16/16) | загрузка через интерфейс или API |
Качество
bun run eval сверяет результат с эталоном разметки data/control/GOLD.md (58 размеченных изменений; eval автоматически проверяет 11 ключевых), цитаты проверены по тексту. Затем прогоняет контрольный комплект. Текущий результат: 16/16 проверок (11 ключевых выводов эталона + 3 контрольных изменения + 2 проверки цитат), 100% цитат найдены в текстах пунктов.
Дополнительно eval считает полноту по всему эталону (data/control/gold.json, раздел 3 вывода). Вывод эталона считается найденным, если у агента есть вывод совместимого вида (например, потеря функции → function_lost, передача функций → поток между подразделениями) и этот вывод ссылается хотя бы на один из тех же пунктов. Текущий результат: 14 из 17 вероятных контрольных случаев (82%) и 16 из 23 выводов с высокой уверенностью (70%). Не найдены в основном дефекты документа (ошибки вычитки, ссылки на законодательство РФ) и двойное закрепление контроля устранения недостатков (G27). Одну типовую ошибку, устаревшую ссылку после перенумерации, агент находит. Типы, для которых в агенте нет отдельного вида вывода («функция расширена», «подразделение сохранено», «прочее»), в расчёт не входят. Метрика информационная и на результат проверок не влияет.
Ограничения прототипа
-
Несопоставимые комплекты не анализируются. Если «до» и «после» относятся к разным подразделениям или сферам (ошибка загрузки, посторонний документ), агент останавливается на шаге «Проверка сопоставимости» и объясняет причину (доля дословно и по смыслу совпавших функций, общие подразделения; в спорных случаях решает ИИ-судья, при сомнении — анализ проводится). API:
status: "error",errorCode: "incomparable". -
Лучше всего разбираются нормативные документы с нумерованными пунктами (положения, регламенты). Excel читается построчно (экспериментально);
.docне поддерживается. OCR рассчитан на печатный текст: рукописные пометки, печати и таблицы со сложной вёрсткой распознаются хуже. -
Задачи анализа хранятся в памяти процесса: после перезапуска сервера их нужно запустить заново.
-
Анализ новых документов занимает около минуты (пара положений по ~30 страниц); ответы кэшируются в
data/cache/. -
Выводы — гипотезы для проверки ответственным сотрудником, а не юридическое заключение.
-
На тестовой паре документы прямо ссылаются на законодательство РФ (35 упоминаний, в т.ч. ТК РФ в п. 1.6), поэтому применены IIA и 208-ФЗ, а требования РК — нет. Эталон считает эти ссылки возможным дефектом для АО «Компания» (G52); отдельным выводом агент его пока не выделяет.
-
Сверка с внешними требованиями — ориентир для проверки, не юридическое заключение. Статус «не найдено в комплекте» не означает нарушения: требование может закрываться уставом или другим документом, которого нет в комплекте. Национальные требования применяются только той страны, на законодательство которой ссылаются документы (без ссылок — РК), стандарты IIA — профессиональный ориентир.
-
Каталог требований — 15 кратких парафразов норм, а не их полный текст. Номера норм перепроверены по официальным текстам (GIAS 2024 — PDF IIA, Закон РК — adilet.zan.kz, 208-ФЗ — КонсультантПлюс); перечень не исчерпывающий и касается только функции внутреннего аудита.
Раскрытие использованных материалов
Стартовый шаблон. Проект стартовал с открытого boilerplate Kiranism/next-shadcn-dashboard-starter (MIT): каркас админ-дашборда (layout, sidebar, таблицы, темы, UI-компоненты). До начала соревновательной части из него удалили авторизацию; демо-страницы шаблона удалены в ходе работы. Предметной функциональности шаблон не содержал.
Разработано в ходе соревновательной части (с 13:00 23.09.2026): весь пайплайн анализа (src/features/orgdiff/lib, первые наброски парсера — 13:53), API, интерфейс анализа, эталон и контрольный комплект, скрипт оценки.
Модели и данные. OpenAI gpt-6-sol и text-embedding-3-large через API. Тестовые документы предоставлены организатором. Эталон data/control/GOLD.md размечен ИИ-агентами (три независимые разметки со сведением) с автоматической проверкой каждой цитаты по тексту документа.
AI-инструменты. Использовались при разработке (п. 5.4.12 разрешает любые AI-инструменты и агенты).
Модели OCR: PaddleOCR PP-OCRv5 (PP-OCRv5_mobile_det, eslav_PP-OCRv5_mobile_rec), Apache-2.0 — models/ocr/. Растеризация PDF — mupdf (AGPL-3.0).
Библиотеки: см. package.json.
Лицензия
MIT
Авторы коммитов
История коммитов
- 2026-09-23 17:54fix: flow counts without duplicates (unique before-holders and match ids); server-side 20 MB upload limitDex
- 2026-09-23 17:42README hero: React Flow reorganization map; mixed-case abbreviations; no double-counted flowsDex
- 2026-09-23 17:39chore: final cleanup — internal team notes and assistant skills out of the repo, fresh screenshotsDex
- 2026-09-23 17:38fix: no-change sets get a deterministic conclusion; unreadable files give a clear messageDex
- 2026-09-23 17:26fix: renamed unit's old duplicates stay 'было ранее'; parent of a renamed unit not 'reorganized'Dex
- 2026-09-23 17:21Merge remote-tracking branch 'origin/feat/orgdiff-ui-polish' into HEADDex
- 2026-09-23 17:20fix(ui): no horizontal scroll on phones, drop template Account menuDex
- 2026-09-23 17:19progress(17:19): renames, generic units, zero-change conclusion, PDF header, SoD rule, final README fixesDex
Все коммиты (66)
- 2026-09-23 17:15feat: orgdiff UI — заметный итог анализа, статусы схемы как в «Находках», крупные вкладкиbexon
- 2026-09-23 17:11progress(17:11): README finalization — quick start, screenshots, current architecture, UI check stepsDex
- 2026-09-23 17:06fix(parse): documents with roman-numeral sections (I., II., Раздел III, Глава 2)Dex
- 2026-09-23 17:05fix(ui): long file names no longer widen the page and hide the Analyze buttonDex
- 2026-09-23 16:56progress(16:56): compliance applies only the jurisdiction the documents refer toDex
- 2026-09-23 16:37docs: option 1 is visible in the UI (Требования tab)Dex
- 2026-09-23 16:37Merge pull request #7 from BAITC-Hacks/feat/orgdiff-ui-complianceSingularity Lab
- 2026-09-23 16:34progress(16:34): fix B's test_red8_min issues — no false reorganizations, new vs pre-existing findings, clear sidesDex
- 2026-09-23 16:33fix: orgdiff UI — пункт функции ищется в своём документе комплекта (UnitFunction.docName), .txt в списке файловbexon
- 2026-09-23 16:32feat: orgdiff UI — вкладка «Требования» (сверка с внешними требованиями)bexon
- 2026-09-23 16:32fix: orgdiff UI — сканы .png/.jpg в списке файлов и в подсказке об ошибкеbexon
- 2026-09-23 16:25progress(16:25): control set usable from UI (.txt), ТЗ traceability table, rename shown as transformationDex
- 2026-09-23 16:23chore: mock.json after multi-document mergeDex
- 2026-09-23 16:23Merge branch 'multidoc'Dex
- 2026-09-23 16:22Комплект из нескольких документов: носитель по шапке «Положение о …», приказ — не функцииDex
- 2026-09-23 16:19progress(16:19): comparability gate — incomparable before/after sets are not analysedDex
- 2026-09-23 16:12docs: env section references п. 5.6.6 (demo API access, key-less check via cache)Dex
- 2026-09-23 16:09progress(16:09): OCR for scans (PP-OCRv5 ONNX) end-to-end; drop no-op proxy that capped uploads at 10 MBDex
- 2026-09-23 16:05Merge branch 'ocr-paddle'Dex
- 2026-09-23 16:03OCR сканов: PaddleOCR PP-OCRv5 (ONNX) для PDF без текста и картинокDex
- 2026-09-23 16:01chore: mock.json with compliance after merging option 1 and recall evalDex
- 2026-09-23 16:01Merge branch 'opt-compliance'Dex
- 2026-09-23 16:01Merge branch 'eval-recall'Dex
- 2026-09-23 16:00feat(orgdiff): сверка новой редакции с внешними требованиями (опция 1 ТЗ)Dex
- 2026-09-23 15:59Merge pull request #6 from BAITC-Hacks/feat/orgdiff-ui-report-errorsSingularity Lab
- 2026-09-23 15:57feat: orgdiff UI — отчёт с решениями сотрудника, ошибки и пустые состояния (B8)bexon
- 2026-09-23 15:56eval: полнота по эталону (recall) по data/control/gold.jsonDex
- 2026-09-23 15:54docs: redistribution step in README and architectureDex
- 2026-09-23 15:54progress(15:54): option 3 of ТЗ — who should take over each lost functionDex
- 2026-09-23 15:46progress(15:46): stateless POST /api/report with employee reviews; stable meta.resultIdDex
- 2026-09-23 15:44Merge pull request #5 from BAITC-Hacks/feat/orgdiff-ui-conclusionSingularity Lab
- 2026-09-23 15:44Merge pull request #4 from BAITC-Hacks/feat/orgdiff-ui-findingsSingularity Lab
- 2026-09-23 15:42feat: orgdiff UI — экран «Заключение» (B6)bexon
- 2026-09-23 15:41progress(15:41): switch LLM to gpt-6-sol; generic norms don't cover specific dutiesDex
- 2026-09-23 15:34feat: orgdiff UI — экран «Находки» (B5) и подсветка вывода на схемеbexon
- 2026-09-23 15:30Merge pull request #3 from BAITC-Hacks/feat/orgdiff-ui-evidenceSingularity Lab
- 2026-09-23 15:27feat: orgdiff UI — панель источника (B4)bexon
- 2026-09-23 15:26Merge robustness: PDF, multi-file sets, Excel org charts, other regulation formatsDex
- 2026-09-23 15:25fix(pipeline): устойчивость к PDF, нескольким файлам, Excel и другим форматам положенийDex
- 2026-09-23 15:25progress(15:25): UI round-2 requests: readable clause refs, distinct dup titles, generic duties lowDex
- 2026-09-23 15:22Merge pull request #2 from BAITC-Hacks/feat/orgdiff-ui-functionsSingularity Lab
- 2026-09-23 15:20progress(15:20): verify.sh checks the real scenario: page, demo analysis, report, eval w/o keyDex
- 2026-09-23 15:19progress(15:19): detect stale cross-references after renumbering (doc_defect)Dex
- 2026-09-23 15:14progress(15:14): export final conclusion as DOCX/Markdown with cited sourcesDex
- 2026-09-23 15:14feat: orgdiff UI — таблица функций (B3), прогресс по плану шаговbexon
- 2026-09-23 15:08progress(15:08): pin Discord theme, drop GitHub link, search and theme pickerDex
- 2026-09-23 15:02progress(15:02): UI requests + research P0: duplication, evidence pairs, plan, README fixesDex
- 2026-09-23 14:57progress(14:57): remove template leftovers so the repo reads as OrgDiffDex
- 2026-09-23 14:54Merge pull request #1 from BAITC-Hacks/feat/orgdiff-ui-upload-chartSingularity Lab
- 2026-09-23 14:52progress(14:52): eval 16/16, prune stale LLM cache (bun run eval --prune)Dex
- 2026-09-23 14:51feat: orgdiff UI — загрузка комплектов (B1) и схема React Flow «до / после» (B2)bexon
- 2026-09-23 14:45progress(14:45): README per п. 5.4.15 — architecture, run, env, check scenario, evalDex
- 2026-09-23 14:45progress(14:45): eval against gold + synthetic control set, transformation findingsDex
- 2026-09-23 14:38progress(14:38): sharper function matching, partial-loss rule, cleaner findingsDex
- 2026-09-23 14:34progress(14:34): orgdiff pipeline end-to-end + mock.json from real runDex
- 2026-09-23 14:20progress(14:20): orgdiff contract types.ts, hackathon OpenAI key in .envDex
- 2026-09-23 13:59Add task split for two peopleDex
- 2026-09-23 13:58Scaffold: admin dashboard base, test documents, React FlowDex
Структура репозитория (314 файлов)
.env .gitignore .nvmrc .oxfmtrc.json .oxlintrc.json AGENTS.md CLAUDE.md LICENSE README.md bun.lock bunfig.toml components.json data/after_polozhenie_red9.docx data/after_polozhenie_red9.txt data/before_polozhenie_red8.docx data/before_polozhenie_red8.txt data/cache/emb/632adfbe138bd5a65b6f08eb.json data/cache/emb/a71b5d8af8292a576a036246.json data/cache/llm/0177bd337cefbf0dec64ed01.json data/cache/llm/03a4fcbac5d2a5a14cebab01.json data/cache/llm/0be13f20ec55a1d601b5a2b8.json data/cache/llm/142cc99fe4f5cf0b4bbb293c.json data/cache/llm/18e4f4a47f110f22ae99853e.json data/cache/llm/29b367f65e10accd1b598342.json data/cache/llm/2d2c712cd3b194dc4b7c0b48.json data/cache/llm/315a1e274c7265d6503b3b04.json data/cache/llm/31c75b107d9a711c904b8878.json data/cache/llm/3b4c00d840d4c0924808bb5b.json data/cache/llm/4469db4a5f0a033f06a5f312.json data/cache/llm/4d668c5f67a3ca4537937933.json data/cache/llm/5a7ddc7d2e8fb574b1aa0e15.json data/cache/llm/6875acaf702cb525884521dd.json data/cache/llm/6f14588eb71f7df837564494.json data/cache/llm/7c6ab3dd681c4f5d9ebf3e40.json data/cache/llm/7d9581c83a2665b7e8feed1e.json data/cache/llm/8055b0622e187aa8a2202178.json data/cache/llm/8360c103cb182c9e29b5d8df.json data/cache/llm/838b77020e8fb4bed1de9e46.json data/cache/llm/8a0d16acbd86e1e9661dcc83.json data/cache/llm/8ffd0625253a90af95497651.json data/cache/llm/91b13613474402c2dbda8efc.json data/cache/llm/935a17725ec2be6526147957.json data/cache/llm/98cd0faee2be95583f11d9ff.json data/cache/llm/a2d96f9bc17929b681b1ec74.json data/cache/llm/b0349e1165dd9477e96287c2.json data/cache/llm/c16d9a55f8d201bed7dc45f3.json data/cache/llm/c56c00cb6a114457f0af0ddf.json data/cache/llm/c5fb7609a93bc393db066425.json data/cache/llm/c9b5740cb2342f88a244bca4.json data/cache/llm/cac4e28fb88b1684fa4bcdea.json data/cache/llm/cc491d5c7f4eb939445dd3a9.json data/cache/llm/de1f60cccd5a4c052b6d3e2d.json data/cache/llm/e0e5e873f9ebafcbc946e9de.json data/cache/llm/e3da7f83756b1dd03e0718dd.json data/cache/llm/e6f6907f55bf7564d9563406.json data/cache/llm/eecc289b04c8427861ef8812.json data/cache/llm/f07cc7c392184116070ec5f3.json data/cache/llm/f1361960174235c5d0d179ce.json data/cache/llm/f7b581549fb795e4de462d8f.json data/cache/llm/fbd2aab8f88fd3e2b2c0d3ab.json data/control/GOLD.md data/control/after_red9_control.txt data/control/gold.json data/requirements.json docs/screenshots/0-hero-scheme.png docs/screenshots/1-upload.png docs/screenshots/2-progress.png docs/screenshots/3-scheme.png docs/screenshots/4-findings.png docs/screenshots/5-functions.png docs/screenshots/6-requirements.png docs/screenshots/7-conclusion.png docs/screenshots/8-source.png env.example.txt models/ocr/README.md models/ocr/det.onnx models/ocr/rec.onnx models/ocr/rec_dict.txt next.config.ts package.json postcss.config.js public/robots.txt public/samples/after_polozhenie_red9.docx public/samples/before_polozhenie_red8.docx scripts/analyze-demo.ts scripts/analyze-files.ts scripts/eval.ts scripts/verify.sh src/app/api/analyze/[jobId]/report/route.ts src/app/api/analyze/[jobId]/route.ts src/app/api/analyze/route.ts src/app/api/report/route.ts src/app/dashboard/layout.tsx src/app/dashboard/orgdiff/error.tsx src/app/dashboard/orgdiff/page.tsx src/app/dashboard/page.tsx src/app/favicon.ico src/app/global-error.tsx src/app/layout.tsx src/app/not-found.tsx src/app/page.tsx src/components/breadcrumbs.tsx src/components/file-uploader.tsx src/components/forms/fields/checkbox-field.tsx src/components/forms/fields/checkbox-group-field.tsx src/components/forms/fields/color-field.tsx src/components/forms/fields/combobox-field.tsx src/components/forms/fields/date-picker-field.tsx src/components/forms/fields/file-upload-field.tsx src/components/forms/fields/otp-field.tsx src/components/forms/fields/radio-group-field.tsx src/components/forms/fields/select-field.tsx src/components/forms/fields/slider-field.tsx src/components/forms/fields/switch-field.tsx src/components/forms/fields/tags-field.tsx src/components/forms/fields/text-field.tsx src/components/forms/fields/textarea-field.tsx src/components/forms/fields/toggle-group-field.tsx src/components/forms/submit-button.tsx src/components/icons.tsx src/components/layout/app-sidebar.tsx src/components/layout/header.tsx src/components/layout/info-sidebar.tsx src/components/layout/page-container.tsx src/components/layout/providers.tsx src/components/layout/query-provider.tsx src/components/modal/alert-modal.tsx src/components/themes/active-theme.tsx src/components/themes/font.config.ts src/components/themes/theme-mode-toggle.tsx src/components/themes/theme-provider.tsx src/components/themes/theme.config.ts src/components/ui/accordion.tsx src/components/ui/alert-dialog.tsx src/components/ui/alert.tsx src/components/ui/aspect-ratio.tsx src/components/ui/attachment.tsx src/components/ui/avatar.tsx src/components/ui/badge.tsx src/components/ui/breadcrumb.tsx src/components/ui/bubble.tsx src/components/ui/button-group.tsx src/components/ui/button.tsx src/components/ui/calendar.tsx src/components/ui/card.tsx src/components/ui/carousel.tsx src/components/ui/chart.tsx src/components/ui/checkbox.tsx src/components/ui/collapsible.tsx src/components/ui/combobox.tsx src/components/ui/command.tsx src/components/ui/context-menu.tsx src/components/ui/dialog.tsx src/components/ui/direction.tsx src/components/ui/drawer.tsx src/components/ui/dropdown-menu.tsx src/components/ui/empty.tsx src/components/ui/field.tsx src/components/ui/frame.tsx src/components/ui/heading.tsx src/components/ui/hover-card.tsx src/components/ui/info-button.tsx src/components/ui/infobar.tsx src/components/ui/input-group.tsx src/components/ui/input-otp.tsx src/components/ui/input.tsx src/components/ui/item.tsx src/components/ui/kbd.tsx src/components/ui/label.tsx src/components/ui/loading-button.tsx src/components/ui/marker.tsx src/components/ui/menubar.tsx src/components/ui/message-scroller.tsx src/components/ui/message.tsx src/components/ui/modal.tsx src/components/ui/native-select.tsx src/components/ui/navigation-menu.tsx src/components/ui/pagination.tsx src/components/ui/popover.tsx src/components/ui/progress.tsx src/components/ui/radio-group.tsx src/components/ui/resizable.tsx src/components/ui/scroll-area.tsx src/components/ui/select.tsx src/components/ui/separator.tsx src/components/ui/sheet.tsx src/components/ui/sidebar.tsx src/components/ui/skeleton.tsx src/components/ui/slider.tsx src/components/ui/sonner.tsx src/components/ui/spinner.tsx src/components/ui/switch.tsx src/components/ui/table.tsx src/components/ui/table/data-table-column-header.tsx src/components/ui/table/data-table-date-filter.tsx src/components/ui/table/data-table-faceted-filter.tsx src/components/ui/table/data-table-filter-clear.tsx src/components/ui/table/data-table-pagination.tsx src/components/ui/table/data-table-skeleton.tsx src/components/ui/table/data-table-slider-filter.tsx src/components/ui/table/data-table-toolbar.tsx src/components/ui/table/data-table-view-options.tsx src/components/ui/table/data-table.tsx src/components/ui/tabs.tsx src/components/ui/textarea.tsx src/components/ui/toast.tsx src/components/ui/toggle-group.tsx src/components/ui/toggle.tsx src/components/ui/tooltip.tsx src/config/data-table.ts src/config/nav-config.ts src/features/orgdiff/api/mutations.ts src/features/orgdiff/api/queries.ts src/features/orgdiff/api/service.ts src/features/orgdiff/components/analysis-done-banner.tsx src/features/orgdiff/components/compliance/compliance-card.tsx src/features/orgdiff/components/compliance/compliance-view.tsx src/features/orgdiff/components/conclusion/conclusion-actions.tsx src/features/orgdiff/components/conclusion/conclusion-view.tsx src/features/orgdiff/components/conclusion/finding-refs.tsx src/features/orgdiff/components/evidence-chip.tsx src/features/orgdiff/components/evidence-sheet/evidence-sheet.tsx src/features/orgdiff/components/evidence-sheet/pair-view.tsx src/features/orgdiff/components/evidence-sheet/quote-block.tsx src/features/orgdiff/components/findings/finding-card.tsx src/features/orgdiff/components/findings/findings-list.tsx src/features/orgdiff/components/findings/stats-cards.tsx src/features/orgdiff/components/function-table/clause-ref.tsx src/features/orgdiff/components/function-table/columns.tsx src/features/orgdiff/components/function-table/function-filters.tsx src/features/orgdiff/components/function-table/function-table.tsx src/features/orgdiff/components/org-chart/chart-legend.tsx src/features/orgdiff/components/org-chart/column-node.tsx src/features/orgdiff/components/org-chart/org-chart.tsx src/features/orgdiff/components/org-chart/unit-details.tsx src/features/orgdiff/components/org-chart/unit-node.tsx src/features/orgdiff/components/orgdiff-view.tsx src/features/orgdiff/components/pipeline-progress.tsx src/features/orgdiff/components/result-placeholder.tsx src/features/orgdiff/components/tab-error-boundary.tsx src/features/orgdiff/components/unit-status-chip.tsx src/features/orgdiff/components/upload-dropzone.tsx src/features/orgdiff/components/upload-panel.tsx src/features/orgdiff/components/uploaded-file-list.tsx src/features/orgdiff/constants.ts src/features/orgdiff/hooks/use-analysis-run.ts src/features/orgdiff/hooks/use-compliance-filters.ts src/features/orgdiff/hooks/use-doc-label.ts src/features/orgdiff/hooks/use-finding-filters.ts src/features/orgdiff/hooks/use-finding-reviews.ts src/features/orgdiff/hooks/use-function-filters.ts src/features/orgdiff/hooks/use-orgdiff-params.ts src/features/orgdiff/lib/analyze.ts src/features/orgdiff/lib/compliance.ts src/features/orgdiff/lib/defects.ts src/features/orgdiff/lib/functions.ts src/features/orgdiff/lib/jobs.ts src/features/orgdiff/lib/judge.ts src/features/orgdiff/lib/jurisdiction.ts src/features/orgdiff/lib/llm.ts src/features/orgdiff/lib/load-doc.ts src/features/orgdiff/lib/ocr.ts src/features/orgdiff/lib/parse-clauses.ts src/features/orgdiff/lib/report.ts src/features/orgdiff/lib/text.ts src/features/orgdiff/lib/units.ts src/features/orgdiff/mock.json src/features/orgdiff/types.ts src/features/orgdiff/utils/build-org-graph.ts src/features/orgdiff/utils/compliance-meta.ts src/features/orgdiff/utils/conclusion-markdown.ts src/features/orgdiff/utils/evidence-source.ts src/features/orgdiff/utils/file-kind.ts src/features/orgdiff/utils/finding-meta.ts src/features/orgdiff/utils/function-rows.ts src/features/orgdiff/utils/match-status.ts src/features/orgdiff/utils/unit-status.ts src/features/orgdiff/utils/word-diff.ts src/hooks/use-breadcrumbs.tsx src/hooks/use-callback-ref.tsx src/hooks/use-controllable-state.tsx src/hooks/use-data-table.ts src/hooks/use-debounce.tsx src/hooks/use-debounced-callback.ts src/hooks/use-media-query.ts src/hooks/use-mobile.ts src/hooks/use-mobile.tsx src/hooks/use-nav.ts src/lib/api-client.ts src/lib/compose-refs.ts src/lib/data-table.ts src/lib/form-context.ts src/lib/form.ts src/lib/format.ts src/lib/parsers.ts src/lib/query-client.ts src/lib/searchparams.ts src/lib/theme-transition.ts src/lib/utils.ts src/styles/globals.css src/styles/theme.css src/styles/themes/astro-vista.css src/styles/themes/claude.css src/styles/themes/discord.css src/styles/themes/light-green.css src/styles/themes/mono.css src/styles/themes/notebook.css src/styles/themes/supabase.css src/styles/themes/vercel.css src/styles/themes/whatsapp.css src/styles/themes/zen.css src/types/data-table.ts src/types/index.ts tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.







