AAYMA
RU
Войти

OrgDiff

ИИ-агент сравнивает документы оргструктуры «до» и «после» реорганизации: находит созданные, упразднённые и реорганизованные подразделения, потерю и…

Доведённый продукт
Команда «Singularity» 41💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

OrgDiff — ИИ-агент анализа оргструктуры и функционала

Карта реорганизации: подразделения «до» и «после», потоки функций

Загружаете документы «до» и «после» реорганизации — агент показывает, какие подразделения созданы, упразднены и реорганизованы, какие функции потеряны или продублированы, где возник конфликт интересов, и у каждого вывода даёт документ, пункт и дословную цитату. Итог — аналитическое заключение (на экране и файлом 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 делает это автоматически. Пользователь загружает оба комплекта документов, а агент:

  1. определяет, какие подразделения созданы, сохранены, реорганизованы или упразднены, и куда ушли функции упразднённых;
  2. сопоставляет функции «до» и «после» и находит потерю и сужение функций;
  3. находит дублирование функций, пересечение зон ответственности и признаки конфликта интересов (по каталогу правил IIA / разделения обязанностей);
  4. у каждого вывода показывает источник: документ, номер пункта и дословную цитату, автоматически проверенную по тексту;
  5. формирует итоговое заключение с рекомендациями — на экране и файлом Word/Markdown;
  6. предлагает, кому передать утраченные функции (опция 3 ТЗ): получатель выбирается по собственным функциям подразделений новой структуры, с обоснованием и ссылкой на пункт; для сужений — какой фрагмент вернуть;
  7. сверяет новую редакцию с внешними требованиями (опция 1 ТЗ): 15 требований к функции внутреннего аудита из стандартов IIA GIAS 2024, Закона РК «Об АО» и 208-ФЗ (data/requirements.json, у каждого — номер нормы и ссылка на официальный источник; на тестовой паре применимы 11: 10 IIA + 1 из 208-ФЗ). Применимое законодательство определяется по ссылкам в самих документах (с цитатой-основанием): требования страны применяются, только если документы ссылаются на её законодательство (на тестовой паре — РФ, 35 ссылок; без ссылок — РК как контекст использования), стандарты IIA — всегда. По каждому требованию агент ставит статус «выполнено / частично / не выполнено / противоречит / не найдено в комплекте» и приводит пункты с дословными цитатами. Цитаты проверяются по тексту, статус без подтверждённой цитаты понижается до «не найдено». Результат — отдельный раздел заключения (Word/Markdown);
  8. дополнительно находит дефекты документа: ссылки на пункты, которые после перенумерации стали вести на другое содержание.

Выводы носят рекомендательный характер: формулировки даны как гипотезы («признаки дублирования»), а вывод без подтверждённой цитаты не показывается (ограничение 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 и идут после изменений.

Порядок проверки основного сценария

  1. bun run dev → открыть http://localhost:3000 (откроется «Анализ оргструктуры»).
  2. Нажать «Загрузить тестовый комплект (ред. 8 → ред. 9)» — или перетащить свои файлы в зоны «Комплект ДО» и «Комплект ПОСЛЕ» (например, data/before_polozhenie_red8.docx и data/after_polozhenie_red9.docx), — затем «Анализировать». Лента «Ход анализа» показывает шаги агента.
  3. Просмотреть вкладки: Схема (подразделения до/после и потоки функций), Функции (таблица сопоставления), Находки (выводы: сначала изменения, затем «было ранее»; у каждого — чипы источников, клик открывает пункт и цитату), Требования (сверка с IIA и законодательством), Заключение (служебная записка, «Скачать .docx / .md»).
  4. Ожидаемый результат (из кэша — за секунды, на новых документах около минуты):
    • создано: ДИТААД, ДОА; упразднена должность «Директор направления внутреннего аудита», её функции переданы ДИТААД и ДОА (по 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).
  5. Контрольный комплект с заранее известными изменениями: «до» = 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

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
66
Авторы
3
Файлы
314
Ветки
9

Авторы коммитов

Dex 49bexon 10Singularity Lab 7

История коммитов

  • 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
Ветки (9)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.