О проекте
Команда: 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.mdOrgDiff — ИИ-агент «Анализ организационной структуры и функционала»
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 можно скачать и загрузить обратно — используется тот же пайплайн. Это ограниченные правила проверки формулировок, а не универсальное понимание смысла: неоднозначные повторяющиеся действия, неизвестные конструкции и пункты без пары требуют отдельной проверки.

| Функция | |
|---|---|
| 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 (загрузка) |
| LLM | OpenAI 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, diffUnits | npm run verify → UNIT-1…UNIT-4. В интерфейсе — блок «Подразделения». Результат: ДИТААД и ДОА созданы, ДНМ и ДККМ сохранены |
| 2) Сопоставить функционал преобразованных и существующих подразделений и выявить потенциальную потерю функций | server/src/analysis/diff.js → diffFunctions | npm run verify → FUNC-1…FUNC-4, NEG-1…NEG-4. В интерфейсе — блок «Сопоставление функций», фильтры «Утрачена» и «Передана» |
| 3) Сопоставить функционал подразделений между собой и выявить возможное дублирование функций и конфликт интересов | server/src/analysis/diff.js → findDuplicates, findConflicts | npm run verify → DUP-1…DUP-3, COI-1…COI-2. В интерфейсе — блок «Дублирование и конфликты интересов» |
| 4) Для каждого вывода показать подтверждающий источник: документ и соответствующий фрагмент/пункт | server/src/llm/enrich.js; server/src/types.js → Evidence | npm run verify → SRC-1, включая источники наблюдений и рекомендаций заключения |
| 5) Сформировать итоговое аналитическое заключение в понятном для пользователя виде | server/src/llm/enrich.js → buildConclusion, deterministicConclusion | npm 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 + Express | package.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 — рабочие заметки, написанные до старта: порядок действий, особенности окружения, проверка загрузки агентов. Кода кейса не содержат, оставлены в репозитории ради полноты раскрытия.
Авторы коммитов
История коммитов
- 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 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.