AAYMA
RU
Войти

OrgDiff

Агент сравнивает комплекты документов оргструктуры «до» и «после» (DOCX, PDF, XLSX).

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

О проекте

Команда: Ab.Ai
Кейс HackAlem.ai: Спецтрек — Казахтелеком
Стадия: Доведённый продукт

Задача кейса: Агент, сравнивающий документы оргструктуры до и после реорганизации

Суть

Агент сравнивает комплекты документов оргструктуры «до» и «после» (DOCX, PDF, XLSX). Он находит созданные и упразднённые подразделения, потерянные и переданные функции, дублирование и конфликт интересов. Каждый вывод подкреплён точной цитатой пункта. Есть интерактивная карта реорганизации и экспорт в Excel.

Как устроено

Парсер разбирает по 1–5 файлов на каждую редакцию в адресуемые пункты. Затем определяется состав подразделений, функции привязываются к владельцам через заголовки раздела «Права и обязанности». Функции сопоставляются по тексту, а не по номерам пунктов. Детекторы ищут дублирование, совмещение контроля и планирования и нормативные пробелы, контрпроверка ловит смену отрицания, модальности и сроков. Опциональная LLM проверяет найденные пары и ищет переформулировки, но валидатор отбрасывает ответы с несуществующими адресами или небуквальными цитатами. Весь сценарий работает и без ключа, на детерминированном ядре.

Ключевые решения

  • сопоставление функций по тексту
  • валидация ссылок и цитат
  • контрпроверка отрицаний и модальности
  • поиск переформулировок через LLM
  • адресация цитат через хеш файла
  • LLM-фикстуры для офлайн-воспроизведения

Метрики

Автопроверка по контрольному набору: 21 из 21; отдельная оценка semantic-review (semantic-evaluation.json)

Особенности

Функции сопоставляются по тексту, а не по номерам: в выданном комплекте нумерация раздела 5 сдвинулась, и сравнение по номерам дало бы около 15 ложных «потерянных функций». На это есть негативные тесты NEG-1…NEG-5. Ответы LLM принимаются только если адрес существует и цитата буквально совпадает с исходным пунктом. Контрпроверка ловит замену «вправе» на «не вправе» даже при 100% сходстве слов.

Стек

Node.js · React · TypeScript · Vite · DOCX/PDF/XLSX парсинг · Excel экспорт

Модели

OpenAI


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-96363301-ab-ai.

README

README.md

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

HackAlem AI 2026 · Трек 11, спец-трек Казактелеком · Команда Ab.Ai (1 участник)

Проверяющему: API-ключ не нужен. Весь сценарий проходится на детерминированном ядре — разбор документов, сопоставление пунктов и проверка ссылок выполняются по-настоящему. Запуск из каталога server: npm install, затем npm start. Проверку npm run verify выполните из того же каталога в другом терминале: сервер занимает первый.


1. Название проекта

OrgDiff — ИИ-агент анализа организационных изменений.

2. Краткое описание — какую проблему решает и для кого

При реорганизации подразделений сотрудник вручную сличает положения, оргструктуры и приложения к распорядительным документам. Документ — 470 пунктов на 40 страниц, редакций две, и нумерация между ними сквозным образом сдвинута. Ошибка стоит дорого: функция теряется при переносе, две службы получают одну зону ответственности, контролёр начинает проверять собственный план.

Пользователь — сотрудник подразделения, проводящий анализ организационных изменений.

OrgDiff сравнивает комплекты документов «до» и «после», показывает, какие подразделения созданы, сохранены и упразднены, какие функции потеряны, а какие лишь сменили владельца, где функционал дублируется и где возникает конфликт интересов. Каждый вывод сопровождается ссылкой на конкретный пункт исходного документа с точной цитатой.

3. Что реализовано — основные функции

Центральный сценарий — «План реорганизации». Интерактивная карта показывает, куда перешли функции; нажатие на связь раскрывает пункты «до» и «после». В очереди находок сотрудник выбирает решение, ответственного, обоснование и источники. Счётчики показывают рассмотренные и открытые вопросы. По назначениям формируется проект формулировки, а Excel содержит обзор, план решений, точные цитаты и сопоставление функций. Это рабочий проект для согласования, не изменение исходных документов и не подтверждение устранения рисков.

Маршрут демонстрации на 90 секунд: docs/demo-pitch.md.

Проверка обязательных требований и оставшихся ограничений: docs/task-audit.md. Паспорт «Что вошло в анализ» показывает распознанные пункты, связи с владельцами, неопределённые строки и допущения общих заголовков. Явно названная роль без отдельного подразделения участвует в сравнении как роль, не меняя состав подразделений. Все цитаты отчёта проверяются перед выдачей API.

Снимок паспорта неполного анализа. Результат финального прогона тестов, контрольных проверок и браузерного сценария — в docs/task-audit.md.

Комплекты из нескольких файлов. В каждую редакцию можно добавить от 1 до 5 файлов DOCX, текстового PDF или XLSX, в том числе разных форматов. Лимит одного файла — 20 MiB, общий лимит обеих редакций — 100 MiB (1 MiB = 1 048 576 байт; интерфейс обозначает эти величины как МБ). Новые выборы и перетаскивания дополняют список; файлы удаляются по отдельности. Невалидная подборка не заменяет уже выбранные файлы. Состав каждой редакции виден в отчёте и на листе Excel «Комплект документов», имя исходного файла — рядом с цитатой, в источниках решения и в контрпроверке.

Снимок анализа четырёх файлов.

Поиск переформулировок моделью. Для функций, которым основное сопоставление не нашло текстовую пару, выполняется дополнительный поиск среди пунктов новой редакции той же области функций. Он допускает нулевое сходство значимых слов. Модель предлагает возможную пару либо изменение смысла; точный адрес и буквальные фрагменты обеих редакций проверяются локально. Панель «Поиск переформулировок» показывает предложения, владельцев, охват и фактический источник ответа — API или сохранённую фикстуру. Это предложения эксперту: исходные статусы функций, находки плана и счётчики автоматически не меняются.

Кнопка «Найти переформулировки» запускает открытый синтетический комплект. XLSX можно скачать из интерфейса; данные и ожидаемые ответы находятся в fixtures/semantic-example.json. Ограничения и оценка: docs/semantic-review.md, машинный отчёт.

Контрпроверка формулировок. В сопоставленных пунктах отдельно проверяются отрицание, обязанность/право, явные сроки и охват. Даже при 100% сходстве значимых слов «вправе» → «не вправе» больше не получает метку «без изменений». Интерфейс показывает точные цитаты рядом, подсвечивает изменённый фрагмент и предлагает альтернативное объяснение. Находку можно передать на согласование или отклонить с обоснованием и источниками обеих редакций; при наличии таких находок Excel включает отдельный лист «Контрпроверка».

Нажмите «Найти скрытые изменения» для открытого синтетического примера: четыре изменения и два неизменных пункта с «не позднее» / «не реже». XLSX можно скачать и загрузить обратно — используется тот же пайплайн. Это ограниченные правила проверки формулировок, а не универсальное понимание смысла: неоднозначные повторяющиеся действия, неизвестные конструкции и пункты без пары требуют отдельной проверки.

Контрпроверка: одно отрицание при 100% сходстве значимых слов

Функция
1Разбор комплектов из 1–5 DOCX, текстовых PDF или XLSX на редакцию; источник включает файл и пункт либо лист и строку
2Статусы подразделений: создано / сохранено / реорганизовано / отсутствует в новой редакции; переименование, слияние и разделение по подтверждающим фрагментам
3Привязка каждой функции к владельцу через заголовки раздела «Права и обязанности»
4Сопоставление функций между редакциями по тексту: потеряна / передана / добавлена / переформулирована / без изменений
5Поиск дублирования функционала между подразделениями
6Потенциальный риск совмещения контроля и планирования; требование декларирования не считается конфликтом
7Проверка упоминания новых подразделений в разделе функций; результат требует содержательной проверки
8Итоговое аналитическое заключение с наблюдениями, рекомендациями и ограничением применения
9Валидация ссылок: вывод с несуществующей ссылкой отбрасывается, текст цитаты подставляет парсер
10Панель трассировки пайплайна в интерфейсе: шаги, модель, источник ответа, время, счётчик отклонённых ссылок
11Работа без API-ключа: детерминированное ядро закрывает весь сценарий
12Автопроверка по контрольному набору ожиданий (npm run verify)
13Контрпроверка небольших изменений формулировок с подсветкой цитат, рассмотрением и экспортом
14Модельный поиск переформулировок для функций без текстовой пары, с проверкой точных цитат и отдельным листом Excel

4. Как работает решение — основной сценарий

две редакции: 1–5 файлов DOCX / PDF / XLSX в каждой
   ↓  парсер            → отдельный разбор файлов, опись, адресуемые пункты и строки
   ↓  состав            → определения из файлов объединяются внутри редакции
   ↓  владельцы         → функция ← заголовок руководителя либо столбец подразделения
   ↓  сопоставление     → функции сравниваются по всем файлам двух редакций
   ↓  детекторы         → дублирование, конфликт интересов, нормативные пробелы
   ↓  LLM (опционально) → проверка найденных сопоставлений по цитатам
   ↓  LLM (опционально) → поиск переформулировок среди функций без текстовой пары
   ↓  валидатор         → проверка адресов и буквальных фрагментов; неподтверждённые ответы отклоняются
   ↓  заключение        → расчёт по находкам, источники для каждого наблюдения и рекомендации
отчёт: подразделения · функции · дублирование · конфликты · пробелы · заключение

Ключевое решение. Функции сопоставляются по тексту, а не по номерам пунктов. В выданном комплекте между редакциями исчез пункт 5.11, а блоки прав 5.6 и 5.7 объединены в один — вся нумерация раздела 5 поехала. Решение, сравнивающее пункты по номерам, выдало бы полтора десятка несуществующих «потерянных функций». На это есть отдельные отрицательные тесты (NEG-1…NEG-5).

Границы файлов сохранены. Состав подразделений сначала определяется отдельно в каждом файле, затем совместимые определения объединяются в состав редакции. Противоречащие определения названия и аббревиатуры отклоняются с пояснением. Явно названный владелец функции может ссылаться на подразделение из другого файла этой редакции. Общий заголовок «Директоры департаментов обязаны…» ограничен составом своего файла; его область действия не расширяется на остальные приложения. Сопоставление функций и поиск пересечений после этого работают по всему комплекту, без требования попарно соединять файлы «до» и «после».

Адрес цитаты включает файл. В редакции из нескольких файлов ссылка имеет вид red8#f<хеш>.5.4.4б: исходный номер пункта сохраняется, пространство файла определяется хешем содержимого. Перестановка неизменённых файлов не меняет их ссылки; изменение байтов файла меняет его идентификатор. Для редакции из одного файла сохранён прежний формат red8#5.4.4б. В обоих случаях цитата содержит имя исходного файла. Две побайтово одинаковые копии в одной редакции сервер отклоняет, даже если имена различаются; одинаковый файл в обеих редакциях допустим.

Проверка выводов. Ядро сопоставляет текст и владельцев. Первый модельный шаг проверяет уже найденные сопоставления: метку и источники конкретной находки, включая обе редакции при передаче. Второй ищет возможные переформулировки для функций без текстовой пары и возвращает их отдельно. Адрес должен принадлежать переданному набору, фрагменты — буквально входить в исходные пункты. Пропущенный или отклонённый ответ остаётся непроверенным; отсутствие предложенной пары не доказывает утрату функции. Свободные объяснения модели не публикуются. Существование ссылки и дословной цитаты не доказывает смысловую эквивалентность, поэтому решение остаётся за экспертом.

5. Технологии

СлойТехнологии
БэкендNode.js 22, ESM без шага сборки, Express 5, zod 4
Разбор документовmammoth (DOCX), PDF.js (PDF), ExcelJS (XLSX), multer (загрузка)
LLMOpenAI SDK 7; gpt-4.1-mini проверяет найденные сопоставления, gpt-4.1 ищет переформулировки; structured outputs (json_schema)
ФронтендReact 19, TypeScript, Vite 8, Tailwind CSS 4
Тестыnode:test: контрольный комплект и независимые сценарии — реорганизация, форматы, несколько файлов, HTTP-загрузка, источники, план и контрпроверка; результат финального прогона — в docs/task-audit.md

Базы данных нет. На сервере хранятся до 20 отчётов на два часа; решения сохраняются в браузере по отпечатку источников. После перезапуска сервера нужно повторить анализ, затем решения того же комплекта восстанавливаются. Авторизации нет: инструмент однопользовательский. План не является системой подписания или согласования.

6. Архитектура

server/
  src/
    index.js               Express: /api/health, /api/analyze/demo, /api/analyze
    pipeline.js            оркестрация анализа комплектов, сборка отчёта, валидация схемой
    planning.js            находки → решения пользователя → проект и Excel; проверка источников по серверному отчёту
    types.js               контракт отчёта (zod) — общий для бэкенда и фронтенда
    parse/docx.js          текст DOCX → пункты с идентификаторами
    parse/document.js      выбор DOCX/PDF/XLSX, декодирование имён файлов
    parse/collection.js    разбор комплектов, границы файлов, стабильные ссылки и проверка повторных копий
    parse/evidence.js      цитаты с именами и идентификаторами исходных файлов
    analysis/units.js      объединение состава редакции, локальные заголовки и явно названные владельцы
    analysis/diff.js       сопоставление по тексту, дублирование, конфликты, пробелы
    analysis/material.js   контрпроверка отрицания, обязательности, сроков и охвата
    analysis/quality.js    паспорт распознанной структуры каждого файла
    analysis/evidence-audit.js проверка адресов, цитат и принадлежности исходным файлам
    llm/client.js          вызов модели, запись и воспроизведение фикстур
    llm/enrich.js          проверка сопоставлений, заключение со связанными источниками
    llm/semantic.js        ограниченный поиск переформулировок и проверка предложенных цитат
  fixtures/llm/            сохранённые ответы модели; первый ответ для ключа запроса не перезаписывается
  scripts/verify.js        автопроверка по контрольному набору
  scripts/evaluate-semantic.js оценка поиска переформулировок; по умолчанию без сети
  test/                    тесты на документах кейса и независимых сценариях
web/src/                   React: таблицы, раскрывающиеся цитаты, панель трассировки
fixtures/
  ground-truth.json        контрольный набор: 16 положительных, 5 отрицательных
  independent-example.json синтетический учебный комплект с ожидаемыми результатами
  countercheck-example.json синтетический пример изменений формулировок
  semantic-example.json    синтетический пример поиска переформулировок с ожиданиями
  semantic-holdout.json    отдельный набор, после разбора ошибок используется для регрессий
  semantic-blind.json      отдельно подготовленный набор, затем использованный при сравнении моделей
data/                      выданный комплект и ТЗ; XLSX синтетических примеров
docs/screenshots/          снимки прохода по сценарию

Собранный фронтенд отдаётся тем же Node-процессом — один порт, одна команда запуска, никакого CORS и реверс-прокси.

7. Установка и запуск

Нужен Node.js 22.13+. Ни базы данных, ни Docker, ни API-ключа для локального анализа.

git clone https://github.com/BAITC-Hacks/hack-96363301-ab-ai.git
cd hack-96363301-ab-ai

# фронтенд уже собран и лежит в web/dist — пересобирать не требуется
cd server
npm ci
npm start

Открыть http://localhost:3000 и нажать «Проанализировать демо-комплект».

Запуск опубликованного коммита 5d00583 проверен из свежего клона без .env: 165 тестов прошли, собранный интерфейс и записанный смысловой пример доступны без ключа. Протокол воспроизводимости.

Дополнительно доступны записи контрольного комплекта с исходными именами файлов; их повторяет отдельный тест без API.

Для своих документов добавьте 1–5 файлов в «Комплект до» и 1–5 в «Комплект после», затем нажмите «Проанализировать загруженные документы». Поддерживаются смешанные комплекты DOCX/PDF/XLSX. Общий перечень файлов и замечания паспорта позволяют проверить, что было распознано из каждого приложения.

Пересобрать фронтенд (необязательно)
cd web && npm install && npm run build
Запуск с живыми вызовами модели (необязательно)
cd server              # из корня репозитория, после остановки прежнего сервера
cp .env.example .env    # вписать OPENAI_API_KEY
npm run check:openai    # один короткий запрос: проверить ключ и доступ к модели
npm start

С ключом доступны проверка найденных сопоставлений (OPENAI_MODEL, по умолчанию gpt-4.1-mini) и поиск переформулировок (OPENAI_SEMANTIC_MODEL, по умолчанию gpt-4.1). Ответы, прошедшие проверку схемы, записываются в server/fixtures/llm/: первый ответ для сочетания модели и запроса сохраняется без перезаписи повторными запусками. Для того же запроса и модели его можно воспроизвести без ключа. Если подходящего ответа нет, модельный шаг недоступен; детерминированный отчёт остаётся доступен. Первичная проверка подключения и двух сопоставлений описана в docs/live-api-check.md; оценка нового поиска — в docs/semantic-review.md.

check:openai использует короткий синтетический запрос, без загруженных документов и сохранённых ответов. Выполняется один вызов без повторов, с ограничением ответа 128 токенами и тайм-аутом 20 секунд. При успехе выводятся модель и фактические счётчики токенов; отсутствие ключа, отказ доступа, лимит или неверный ответ завершаются ошибкой. Проверка подтверждает доступ к API и структурированный ответ, но не качество анализа документов. Ключ берётся из server/.env или переменной окружения и не выводится в журнал. На Windows вместо cp можно использовать Copy-Item .env.example .env; существующий файл с ключом перезаписывать не нужно.

Начисление API-кредитов и доступ к приложению ChatGPT настраиваются отдельно. Для нашего сервера используется OPENAI_API_KEY проекта с нужными кредитами. Текущая модель поддерживает структурированные ответы: официальная документация OpenAI — GPT-4.1 mini. Ограничение выхода через max_completion_tokens описано в OpenAI Docs.

8. Как проверить решение

Первое и главное: приложение проходит весь сценарий без API-ключа. Разбор документов, сопоставление пунктов, поиск дублирования и конфликтов, проверка ссылок и итоговое заключение — всё это детерминированные шаги, они выполняются по-настоящему и ни от какого внешнего сервиса не зависят.

Модель выполняет две разные задачи: проверяет найденные сопоставления и ищет возможные переформулировки для пунктов без пары. Ответы сохранены в server/fixtures/llm/; воспроизведение требует совпадающего запроса и модели. Колонка «источник» в трассировке различает живой API, сохранённый ответ и отсутствие ответа. Успешное подключение и корректные ссылки не являются оценкой качества смысловых выводов: для нового поиска предусмотрены отдельные наборы с заранее заданными ожиданиями, покомпонентные результаты и список ошибок.

Принятые метки и ссылки не означают принятия свободного текста модели. В первом учебном прогоне модель написала «была удалена» о кандидате на утрату; исходная версия зафиксирована в коммите 13a8179, история проверки описана в docs/live-api-check.md. applyModelExplanations не публикует свободный rationale: пользователь получает локальное пояснение о ненайденном соответствии и необходимости проверки возможной утраты или переформулировки.

Автопроверка одной командой

Откройте отдельный терминал в корне репозитория. Проверка запускает пайплайн напрямую и не требует работающего HTTP-сервера.

cd server && npm run verify

Скрипт прогоняет пайплайн на выданном комплекте и сверяет результат с fixtures/ground-truth.json — это ровно то, что предлагает п. 11 ТЗ («контрольный комплект, где изменения известны заранее»), только автоматически. Код возврата ненулевой при любом расхождении.

ИТОГО: 21 из 21 проверок пройдено — все

Трассировка обязательных требований

Требование кейса (дословно)Где реализованоКак проверить
1) Определить по приложениям, какие структурные подразделения были реорганизованы, какие сохранились и какие созданыserver/src/analysis/units.js → extractUnits, diffUnitsnpm run verify → UNIT-1…UNIT-4. В интерфейсе — блок «Подразделения». Результат: ДИТААД и ДОА созданы, ДНМ и ДККМ сохранены
2) Сопоставить функционал преобразованных и существующих подразделений и выявить потенциальную потерю функцийserver/src/analysis/diff.js → diffFunctionsnpm run verify → FUNC-1…FUNC-4, NEG-1…NEG-4. В интерфейсе — блок «Сопоставление функций», фильтры «Утрачена» и «Передана»
3) Сопоставить функционал подразделений между собой и выявить возможное дублирование функций и конфликт интересовserver/src/analysis/diff.js → findDuplicates, findConflictsnpm run verify → DUP-1…DUP-3, COI-1…COI-2. В интерфейсе — блок «Дублирование и конфликты интересов»
4) Для каждого вывода показать подтверждающий источник: документ и соответствующий фрагмент/пунктserver/src/llm/enrich.js; server/src/types.js → Evidencenpm run verify → SRC-1, включая источники наблюдений и рекомендаций заключения
5) Сформировать итоговое аналитическое заключение в понятном для пользователя видеserver/src/llm/enrich.js → buildConclusion, deterministicConclusionnpm run verify → CONC-1. В интерфейсе — блок «Итоговое аналитическое заключение»
Ограничение п. 9: агент не должен формировать утверждения, не подтверждённые документамиserver/src/llm/enrich.js — закрытый список допустимых ссылокnpm test → тест «ограничение п. 9 ТЗ: каждый вывод имеет подтверждающий источник»
Ограничение п. 9: выводы носят рекомендательный характерserver/src/llm/enrich.js → DISCLAIMERБлок «Ограничение применения» в заключении и в подвале интерфейса

Тесты

cd server && npm test

Результат финального прогона — в docs/task-audit.md. Тесты комплектов проверяют отдельные пространства ссылок, перестановку файлов, повторные копии, лимиты и анализ через HTTP.

Оценка поиска переформулировок

Из каталога server:

npm run eval:semantic

По умолчанию команда воспроизводит сохранённые ответы без API-вызовов, даже если ключ задан в окружении. Для нового живого измерения нужен явный флаг --live: на каждый комплект приходится до двух модельных вызовов — проверка сопоставлений и поиск переформулировок (до шести для трёх текущих наборов). --output <путь> сохраняет JSON с метриками, хешами входных файлов, трассировкой и ожидаемым/фактическим результатом каждого случая. Несовпадение ожиданий или отсутствие нужного источника ответа завершает команду с ненулевым кодом.

Зафиксированный живой прогон смыслового поиска на gpt-4.1 совпал с ожидаемыми статусами и адресами в 23 из 24 случаев: демонстрационный набор — 8/8, регрессионный — 7/8, отдельно подготовленный — 8/8. Одна возможная пара о доставке материалов не найдена; исходное ожидание сохранено. Во всех трёх наборах нет ошибочных предложений эквивалентности по разметке, отклонённых ссылок — 0, проверены все 24 исходных пункта. Строгий порог 24/24 не достигнут, поэтому eval:semantic возвращает код 1; это отражённое расхождение с ожиданием.

Первоначальные ожидания для semantic-example.json и semantic-holdout.json записаны до первого живого вызова и не передаются модели. После разбора ошибок оба набора используются для регрессий. semantic-blind.json подготовлен отдельно, но затем также использован для сравнения и выбора моделей: его 8/8 нельзя выдавать за полностью независимую финальную оценку. Итог находится в docs/semantic-evaluation.json; первые измерения сохранены отдельно — 6/16 в версии 1 и 16/24 на mini в версии 2. Протокол — в docs/semantic-review.md. Эта небольшая синтетическая выборка не определяет точность на неизвестных корпоративных документах.

Что агент находит на выданном комплекте

КатегорияРезультат
Подразделениясоздано 2 (ДИТААД, ДОА), сохранено 2 (ДНМ, ДККМ)
Функции31 предварительное изменение владельцев (включая 17 соответствий прежней роли), 7 кандидатов на утрату, 13 добавленных закреплений, 3 переформулировки, 44 без изменений
Дублирование11 прямых пар пересекающегося функционала между подразделениями; транзитивные цепочки не объединяются в группы
Конфликт интересов1 потенциальный риск: совмещение контроля и планирования у ДККМ. Требования декларирования исключены из счётчика
Полнота описания функций2 вопроса для проверки: ДИТААД и ДОА не упомянуты в разделе функций; обязанности руководителей есть

Показательный пример — функция «выявление рисков с недостаточным или дублирующим покрытием субъектами СВК в рамках Карты гарантий». В редакции 8 это п. 5.4.4б, владелец — Директор ДНМ. В редакции 9 формулировка сохранена дословно, но стоит в п. 5.3.3б, у директоров ДИТААД и ДОА. Агент помечает это как передачу, а не потерю, и показывает оба пункта с цитатами.

Частичное изменение состава владельцев теперь тоже отображается как передача/перераспределение. Короткие вводные к перечислениям не считаются отдельными функциями. В расширенный анализ включены 20 обязанностей «Директора направления внутреннего аудита» из редакции 8: роль не превращается в вымышленный департамент. 17 пунктов получили предварительное текстовое соответствие, три требуют проверки наряду с четырьмя прежними кандидатами. Содержательный разбор всех семи — в docs/loss-review.md. Сходство формулировок не доказывает преемственность роли или передачу полномочий.

Независимый учебный комплект

Кнопка «Проверить учебный пример» запускает анализ синтетических XLSX из data/example_before.xlsx и data/example_after.xlsx. Оба файла можно скачать из интерфейса. Ожидания вручную заданы в fixtures/independent-example.json: одно переименование, одно сохранённое, одно созданное и одно отсутствующее подразделение; одна передача, одна утрата, две сохранённые и две добавленные функции, одно пересечение, ноль конфликтов. Их проверяет server/test/quality.test.js вместе с точными владельцами и адресами источников. Для пересоздания XLSX из JSON: cd server && node scripts/build-example.js.

Отчёт начинается с кратких итогов; таблица показывает изменения первыми, неизменённые функции доступны через фильтр. Похожие фрагменты для ручной проверки выделены отдельно и не считаются установленным соответствием. Техническая трассировка свёрнута; счётчик ответов модели не включает недоступные шаги.

Снимки прохода по сценарию

В docs/screenshots/ файлы 01–06 — исторические снимки до исправлений; 07-responsibility-map.png, 08-decision-workbench.png, 09-organizer-map.png показывают карту и план, 10-countercheck.png — контрпроверку синтетического примера, 11-analysis-coverage.png — паспорт неполного анализа, 12-document-collection.png — анализ четырёх файлов. Сквозная браузерная проверка: при запущенном сервере и отдельном Chrome с --remote-debugging-port=9333 выполнить в другом терминале из корня репозитория cd server && node scripts/browser-smoke.js. Флаг --screenshots обновляет снимки. Проверка использует отдельный профиль браузера; она очищает только ключи orgdiff.plan.* этого профиля.

API анализа: POST /api/analyze, multipart/form-data с повторяющимися полями before и after — по 1–5 файлов на сторону. Метаданные результата содержат состав редакций (meta.before.documents, meta.after.documents), а цитаты — fileId и fileName наряду с номером пункта и точным текстом. Ограничения размеров проверяются и на сервере.

Синтетический пример переформулировок: POST /api/analyze/semantic, исходные файлы — GET /api/examples/semantic/before.xlsx и GET /api/examples/semantic/after.xlsx. Предложения модели возвращаются в отдельном semanticReview; основной массив functions сохраняет результат детерминированного сопоставления.

API плана: POST /api/plan и POST /api/plan/export, тело { reportId, decisions }. reportId выдаёт сервер анализа. Клиент не присылает свой отчёт; сервер проверяет находку, допустимое действие, существующего владельца, непустое обоснование и принадлежность источников. Для подтверждения передачи и рассмотрения контрпроверки нужны обе редакции. Экспорт содержит листы «Обзор», «Комплект документов», «Источники», «План решений» и «Сопоставление функций», а также паспорт «Качество анализа»; «Контрпроверка» добавляется при соответствующих находках. Отдельный лист «Смысловая проверка» содержит состояние дополнительного поиска, его охват и предложения с источниками, когда в основном анализе есть функции без пары. Опись включает редакцию, исходное имя, идентификатор файла и число распознанных пунктов. Цитаты и ссылки из плана сохраняют принадлежность файлу. Сервер проверяет структуру и источники решения, но не подменяет содержательное согласование ответственным сотрудником.

9. Данные и интеграции

  • Выданный комплект — data/polozhenie_red8_before.docx и data/polozhenie_red9_after.docx: «Положение о внутреннем аудите АО „Компания“», редакции 8 и 9, обезличены организатором. Используются как есть, без изменений. ТЗ кейса — data/case-tz.pdf.
  • Внешние сервисы — OpenAI API: gpt-4.1-mini для проверки найденных сопоставлений и gpt-4.1 для поиска возможных переформулировок. Без ключа остаются локальный анализ и воспроизведение подходящих сохранённых ответов.
  • Синтетические данные проекта — учебные комплекты fixtures/independent-example.json, fixtures/countercheck-example.json, fixtures/semantic-example.json, оценочные наборы fixtures/semantic-holdout.json и fixtures/semantic-blind.json, а также соответствующие XLSX в data/. После обратной связи semantic-holdout используется как регрессионный; semantic-blind участвовал в сравнении моделей. Данные содержат вымышленные подразделения и функции с явно заданными ожиданиями; дообучение на них не выполнялось. Состав конкретной оценки перечислен в её JSON-отчёте.
  • Проверка API — первичное подключение и два сопоставления описаны в docs/live-api-check.md; новая смысловая проверка и её ошибки — в docs/semantic-review.md. При настройке ключа приложение отправляет выбранные фрагменты документов в API. Сохранённые ответы привязаны к модели и запросу; первый ответ для такого ключа не заменяется последующими прогонами.
  • Своих или дообученных моделей нет; внешних источников данных и интеграций, кроме опционального OpenAI API, приложение не использует.

10. Ограничения

Честно о том, чего нет.

  • Форматы и объём. Поддерживаются 1–5 файлов на редакцию, до 20 MiB на файл и 100 MiB на оба комплекта. DOCX и PDF с текстовым слоем: нумерованные пункты и заголовки руководителей/функций, без привязки к конкретным номерам разделов. XLSX: строка заголовков «Подразделение» и «Функция» (также «Функции», «Обязанности», «Задача»); источники указывают файл, лист и строку. Сканы требуют предварительного OCR; старые DOC/XLS нужно сохранить как DOCX/XLSX. Диаграммы без текстового описания не распознаются. Если в редакции не удалось распознать подразделения и функции, анализ возвращает ошибку. Отдельный файл с адресуемыми пунктами, но без распознанных функций и состава, может войти в комплект с предупреждением паспорта; его наличие не означает, что все обязанности учтены.
  • Реорганизация. Смена названия/аббревиатуры при сохранении идентичности и явные указания о переименовании, слиянии, разделении. Без подтверждающей связи разные названия остаются отдельными подразделениями; похожесть названия не считается доказательством реорганизации.
  • Два опциональных пункта ТЗ (раздел 8, пункты 1–2) не реализованы: сверка с законодательством и стандартами; сравнение оргструктур с другими операторами. В поставке нет нормативного или отраслевого комплекта для этих проверок.
  • Рекомендации (раздел 8 ТЗ, пункт 3) формируются по типу находки. В плане сотрудник может предложить перераспределение ответственности, обосновать его и получить проект формулировки. Автоматического оптимизатора оргструктуры нет.
  • Привязка функций к владельцу опирается на структуру «заголовок роли → список обязанностей». На документах с другой структурой разметки потребуется настройка правил.
  • Обобщённые заголовки. Формулировка «Директоры департаментов обязаны…» относится к распознанным департаментам своего файла и не распространяется автоматически на другие файлы комплекта. Внутри этой области заголовок всё ещё может подразумевать лишь часть подразделений — паспорт отмечает допущение для проверки.
  • Содержательные ограничения. Поиск нормативных пробелов проверяет ограниченные признаки упоминания подразделений и описания функций, а не соответствие законодательству. Сходство текста, явные изменения формулировок и конкретное правило конфликта интересов не заменяют экспертную проверку свободных переформулировок и всех вариантов распределения полномочий. Нераспознанные конструкции могут остаться вне диагностики.
  • Границы модельного поиска. До 12 функций без текстовой пары, до 80 пунктов новой редакции соответствующих областей функций, до 64 000 символов входного JSON и 4096 выходных токенов. Цитаты не обрезаются для заполнения запроса; не вошедшие в него пункты остаются вне проверки. При неполном охвате интерфейс сообщает об ограничении. Возможная переформулировка и изменение смысла — предложения для эксперта; отсутствие пары и неподтверждённый ответ не являются доказательством утраты. Предложения не меняют основные статусы, находки и счётчики. Оценочные синтетические наборы малы, их результат не переносится автоматически на документы компаний.
  • Доступность модели. Без ключа модельные шаги воспроизводятся только при наличии ответа для совпадающего запроса и модели. Иначе они показываются как недоступные. Детерминированный анализ остаётся доступен на документах поддерживаемой структуры. Успешный вызов API не гарантирует правильность каждого смыслового сопоставления.
  • Выводы рекомендательные и требуют проверки ответственным сотрудником. Это требование п. 9 ТЗ, а не оговорка.

11. Ссылка на развёрнутую версию

Публичного развёртывания нет: решение запускается локально одной командой (см. раздел 7). Данные кейса конфиденциальны, поэтому публичный стенд с ними не поднимался.


Раскрытие: AI-инструменты и заранее подготовленные материалы

Требование регламента. Раскрывается полностью.

AI-инструменты и агенты

В первоначальном раскрытии проекта указан Claude Code. Последующие проверка и доработка выполнялись с Codex, включая параллельную работу помощников над независимыми задачами. Точные модели прежних сессий разработки материалами репозитория не подтверждены и здесь не заявляются. Это инструменты разработки; опциональная модель внутри приложения указана отдельно в разделе 5.

Этап / рольРаскрытие участия
Первоначальная реализация, Claude CodeПо исходному раскрытию: координация архитектуры, парсера, анализа, LLM-слоя, API и автопроверки; помощники hack-planner, hack-builder, hack-pitch для плана, фронтенда и README
Доработка, Codex — координаторПроверка анализа и источников, поддержка PDF/XLSX, интеграция плана реорганизации и контрпроверки, тестирование, браузерная проверка, документация и коммиты
Доработка, помощники CodexНезависимые задачи: детектор изменений формулировок и его тесты, интерфейс контрпроверки, обзор кода сопоставления и плана, сверка документации с реализацией

Инструкции этих агентов лежат в репозитории: .claude/agents/, .claude/commands/, .codex/agents/, описание — в HACKATHON-ASSISTANTS.md. Они написаны до старта хакатона, реализации кейса не содержат и раскрыты первым коммитом соревновательной части (9f006d3).

Заранее подготовленные шаблоны

Проект начат не с нуля, а с копирования заготовленных до хакатона скелетов. Это boilerplate генераторов с установленными зависимостями, без какой-либо логики кейса:

КаталогИсточникЧто взято
server/npm init + Expresspackage.json с установленными express, zod, openai, cors, dotenv
web/npm create vite@latest -- --template react-ts + Tailwindстандартный шаблон Vite React TypeScript

Весь код в server/src/, server/test/, server/scripts/, web/src/ написан во время соревновательной части.

Модели, библиотеки, датасеты

  • Модели приложения: OpenAI gpt-4.1-mini для проверки сопоставлений (OPENAI_MODEL) и gpt-4.1 для смыслового поиска (OPENAI_SEMANTIC_MODEL). Короткая проверка подключения вернула gpt-4.1-mini-2025-04-14; результаты смыслового поиска и сравнения моделей раскрыты в разделе 8. Своих и дообученных моделей нет.
  • Библиотеки: перечислены в разделе 5, все — с открытой лицензией, из npm.
  • Датасеты: выданный организатором комплект документов, синтетические учебные и оценочные комплекты проекта из раздела 9. Сторонних датасетов нет; дообучение не выполнялось.

Вспомогательные файлы подготовки

.claude/runbook.md, .claude/stack-notes.md, .claude/verify-roles.md — рабочие заметки, написанные до старта: порядок действий, особенности окружения, проверка загрузки агентов. Кода кейса не содержат, оставлены в репозитории ради полноты раскрытия.

Звёзды
⭐ 0
Форки
0
Язык
JavaScript
Последний push
в прошлом месяце
Коммиты
21
Авторы
2
Файлы
165
Ветки
1

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

duman-sadu 20duman-sadu 1

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

  • 2026-09-23 17:40test: preserve and verify organizer upload recordingsduman-sadu
  • 2026-09-23 17:32docs: confirm clean-clone startup and offline reproducibilityduman-sadu
  • 2026-09-23 17:27feat: find paraphrased duties with cited semantic review and measured evalsduman-sadu
  • 2026-09-23 16:57test: verify live OpenAI integration and preserve offline replayduman-sadu
  • 2026-09-23 16:33chore: add bounded OpenAI connection check and setup guidanceduman-sadu
  • 2026-09-23 16:16feat: compare document collections with file-level source provenanceduman-sadu
  • 2026-09-23 15:57fix: preserve role duties and audit report coverage and sourcesduman-sadu
  • 2026-09-23 15:25feat: add evidence-backed wording countercheck and review workflowduman-sadu
Все коммиты (21)
  • 2026-09-23 15:10Add interactive reorganization workbench and evidence-linked Excel plansduman-sadu
  • 2026-09-23 15:10Improve function matching and add independent quality checksduman-sadu
  • 2026-09-23 14:39Fix analysis evidence and reorganization detection; support PDF and XLSXduman-sadu
  • 2026-09-23 14:25DOC: убрать из README обещание записанных ответов модели, которых нетduman-sadu
  • 2026-09-23 14:00fix: номер трека — 11, спец-трек Казактелекомduman-sadu
  • 2026-09-23 13:52DOC+CODE: README по структуре организаторов, трассировка требований, доказательстваduman-sadu
  • 2026-09-23 13:43TEST+FEATURE: автопроверка по контрольному набору, 21 из 21duman-sadu
  • 2026-09-23 13:40FEATURE: пайплайн целиком — LLM-слой с фикстурами, конфликты, HTTP-APIduman-sadu
  • 2026-09-23 13:36FEATURE+TEST: ядро анализа — подразделения, перенос и дублирование функцийduman-sadu
  • 2026-09-23 13:29CODE+TEST: парсер документов с прослеживаемостью до пунктаduman-sadu
  • 2026-09-23 13:14chore: раскрытие AI-помощников и подготовительных материаловduman-sadu
  • 2026-09-19 13:30chore: verify commit attributionduman-sadu
  • 2026-09-18 18:05chore: verify push accessduman-sadu
Структура репозитория (165 файлов)
.claude/agents/hack-builder.md
.claude/agents/hack-pitch.md
.claude/agents/hack-planner.md
.claude/agents/hack-reviewer.md
.claude/agents/hack-scout.md
.claude/commands/hack-check.md
.claude/commands/hack-preflight.md
.claude/commands/hack-ship.md
.claude/commands/hack-start.md
.claude/commands/hack-tick.md
.claude/runbook.md
.claude/settings.json
.claude/stack-notes.md
.claude/verify-roles.md
.codex/agents/hack_builder.toml
.codex/agents/hack_planner.toml
.codex/agents/hack_reviewer.toml
.gitignore
CASE.md
CLAUDE.md
HACKATHON-ASSISTANTS.md
README.md
data/case-tz.pdf
data/countercheck_after.xlsx
data/countercheck_before.xlsx
data/example_after.xlsx
data/example_before.xlsx
data/polozhenie_red8_before.docx
data/polozhenie_red9_after.docx
data/semantic_after.xlsx
data/semantic_before.xlsx
data/semantic_blind_after.xlsx
data/semantic_blind_before.xlsx
data/semantic_holdout_after.xlsx
data/semantic_holdout_before.xlsx
docs/clean-clone-check.md
docs/demo-pitch.md
docs/live-api-check.md
docs/loss-review.md
docs/organizer-replay.md
docs/screenshots/01-upload-screen.png
docs/screenshots/02-units-demo-mode.png
docs/screenshots/03-units-evidence.png
docs/screenshots/04-functions-table.png
docs/screenshots/05-functions-lost-moved.png
docs/screenshots/06-conclusion.png
docs/screenshots/07-responsibility-map.png
docs/screenshots/08-decision-workbench.png
docs/screenshots/09-organizer-map.png
docs/screenshots/10-countercheck.png
docs/screenshots/11-analysis-coverage.png
docs/screenshots/12-document-collection.png
docs/screenshots/13-semantic-review.png
docs/screenshots/14-semantic-mobile.png
docs/semantic-evaluation-mini-v2.json
docs/semantic-evaluation-v1.json
docs/semantic-evaluation.json
docs/semantic-replay.json
docs/semantic-review.md
docs/task-audit.md
fixtures/countercheck-example.json
fixtures/ground-truth.json
fixtures/independent-example.json
fixtures/semantic-blind.json
fixtures/semantic-example.json
fixtures/semantic-holdout.json
server/.env.example
server/fixtures/llm/semantic-lost-v1.d43032d1e3e16f19.json
server/fixtures/llm/semantic-lost-v1.fa444c2c1bbdc6f5.json
server/fixtures/llm/semantic-lost-v2.0f5a12d722dd0987.json
server/fixtures/llm/semantic-lost-v2.35f31d8a300d6fff.json
server/fixtures/llm/semantic-lost-v2.87c8ce022b9f1567.json
server/fixtures/llm/semantic-lost-v2.921aafce0867cc2b.json
server/fixtures/llm/semantic-lost-v2.9f88381bef2513c1.json
server/fixtures/llm/semantic-lost-v2.d0c3363f9a497722.json
server/fixtures/llm/semantic-lost-v2.db4d68f32d44a769.json
server/fixtures/llm/verify-changes-v2.010d7421f7670f01.json
server/fixtures/llm/verify-changes-v2.2c8efbf90308e76b.json
server/fixtures/llm/verify-changes-v2.5c0dbcc1e4ff7afd.json
server/fixtures/llm/verify-changes-v2.68ca7fdc3967e7ad.json
server/fixtures/llm/verify-changes-v2.aa08dbd78aeeb4ae.json
server/package-lock.json
server/package.json
server/scripts/browser-smoke.js
server/scripts/build-example.js
server/scripts/check-openai.js
server/scripts/evaluate-semantic.js
server/scripts/verify.js
server/src/analysis/diff.js
server/src/analysis/evidence-audit.js
server/src/analysis/material.js
server/src/analysis/quality.js
server/src/analysis/units.js
server/src/index.js
server/src/llm/client.js
server/src/llm/enrich.js
server/src/llm/semantic.js
server/src/parse/collection.js
server/src/parse/document.js
server/src/parse/docx.js
server/src/parse/evidence.js
server/src/pipeline.js
server/src/planning.js
server/src/types.js
server/test-support/http-server.js
server/test/analysis.test.js
server/test/check-openai.test.js
server/test/collection-analysis.test.js
server/test/collection-api.test.js
server/test/collection.test.js
server/test/countercheck.test.js
server/test/coverage.test.js
server/test/evidence-audit.test.js
server/test/extraction-regressions.test.js
server/test/live-fixture.test.js
server/test/llm-client.test.js
server/test/matching-regressions.test.js
server/test/material.test.js
server/test/organizer-replay.test.js
server/test/parse.test.js
server/test/planning.test.js
server/test/quality.test.js
server/test/regressions.test.js
server/test/semantic-integration.test.js
server/test/semantic.test.js
web/.gitignore
web/.oxlintrc.json
web/README.md
web/index.html
web/package-lock.json
web/package.json
web/public/favicon.svg
web/public/icons.svg
web/src/App.css
web/src/App.tsx
web/src/api.ts
web/src/assets/hero.png
web/src/assets/react.svg
web/src/assets/vite.svg
web/src/components/Badges.tsx
web/src/components/Banners.tsx
web/src/components/ConclusionSection.tsx
web/src/components/Countercheck.tsx
web/src/components/EvidenceDisclosure.tsx
web/src/components/FlowMap.tsx
web/src/components/FunctionsSection.tsx
web/src/components/GapsSection.tsx
web/src/components/OverlapSection.tsx
web/src/components/QualityPassport.tsx
web/src/components/ReorganizationLab.tsx
web/src/components/ReportSummary.tsx
web/src/components/Section.tsx
web/src/components/SemanticReview.tsx
web/src/components/TracePanel.tsx
web/src/components/UnitsSection.tsx
web/src/components/UploadPanel.tsx
web/src/index.css
web/src/main.tsx
web/src/mock-report.ts
web/src/planning.ts
web/src/types.ts
web/tsconfig.app.json
web/tsconfig.json
web/tsconfig.node.json
web/vite.config.ts

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

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

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