That's La Peace (ContractorPicker)
Локальное веб-приложение подбора до 3 подрядчиков по городу, дате, формату, категории и бюджету, с фактическими объяснениями и проверенными советами…
О проекте
Команда: That's La Peace
Кейс HackAlem.ai: Креативные индустрии — Firebird
Стадия: Доведённый продукт
Задача кейса: «#79-lite»: подобрать до 3 подрядчиков для мероприятия и объяснить выбор
Суть
Локальное веб-приложение подбора до 3 подрядчиков по городу, дате, формату, категории и бюджету, с фактическими объяснениями и проверенными советами сменить дату или бюджет при пустой выдаче. Поставляется как портативный Windows exe.
Как устроено
CSV нормализуется и загружается в память при старте FastAPI. Обязательные фильтры исключают занятых и не подходящих по условиям подрядчиков. Ранжирование лексическое: основы слов формата и категории ищутся в описании, при равенстве решают цена и ID. Если выдача пустая, система перебирает ближайшую подходящую дату и минимальный достаточный бюджет через те же фильтры. Объяснения собираются детерминированно из фактов профиля, LLM во время работы не вызывается.
Ключевые решения
- детерминированные фильтры
- лексическое ранжирование по основам слов
- поиск альтернативной даты и бюджета
- PyInstaller portable exe
- i18n RU/KK/EN
Особенности
Жюри запускает всё одним двойным щелчком по START.cmd: в portable/ContractorPicker.exe (около 15 МБ) уже лежат Python, зависимости и данные. Интеграционные релизы шли каждые 45 минут, на каждый сохранён JSON с результатами проверок (browser, UX, security, secret-scan). Объяснения дополнительно прошли ручную проверку людьми.
Стек
Python 3.12 · FastAPI · Pydantic · Uvicorn · HTML/CSS/JS (ES modules) · PyInstaller
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-95a1b8c8-that-s-la-peace.
README
README.mdThat's La Peace
Версия для жюри и сдачи — только ветка main. В ней собран итоговый проект обоих участников: приложение, готовый запуск, данные и документация. Дополнительные ветки
dev-dinmukhammed,dev-ilyas,dev-zoroиintegrationсохранены как история совместной разработки; они не являются отдельными версиями для оценки. Скачивайте и запускайте именноmain.
HackAlem AI · кейс #79-lite · трек 06 «Креативные индустрии»
Организатору мероприятия нужно быстро найти подрядчиков, которые подходят по условиям и свободны на выбранную дату. Просматривать весь каталог и вручную сравнивать описания неудобно.
Приложение принимает город, дату, формат, категорию и бюджет, затем показывает до трёх вариантов с конкретными объяснениями. Если вариантов мало или нет, сообщает причину; при пустой выдаче может предложить проверенное изменение даты или бюджета. Полное задание.
| Участник | Ответственность |
|---|---|
| Dinmukhammed | Backend, данные, подбор и объяснения, интеграция и публикация общей версии |
| Ilyas | Frontend, дизайн, демо, капитан команды и подача решения |
Запуск для жюри — один двойной щелчок
Windows 10/11, 64-разрядная x64. Получите полную папку этой версии проекта из официального репозитория (Code → Download ZIP и распаковать, либо Git clone). Откройте START.cmd двойным щелчком. Или выполните одну команду в PowerShell из папки проекта:
.\START.cmd
Браузер откроется сам после готовности сервера. Python, Git, Node.js, установка библиотек, аккаунт приложения и API-ключи для этого запуска не нужны: интерпретатор, зависимости, интерфейс и все 66 профилей включены в portable/ContractorPicker.exe. После получения папки основной интерфейс и подбор работают без интернета. Первое получение проекта требует доступа к репозиторию; его права не заменяются запуском приложения. Не запускайте файл прямо внутри ZIP — сначала распакуйте папку.
- Адрес появится в окне запуска: обычно http://127.0.0.1:8000/. Если порт занят, приложение само выберет свободный и откроет свой адрес.
- Если браузер не открылся, скопируйте напечатанный адрес. Например, на
http://127.0.0.1:8000/api/health(подставьте фактический порт) должны бытьstatus: okиdataset_count: 66. - Остановка: Ctrl+C в окне запуска или закрыть это окно. Повтор: снова открыть
START.cmd; никаких миграций, паролей или настройки нет. Окно сервера должно оставаться открытым, пока вы смотрите демо. - Логи видны в этом же окне. При ошибке запуска оно останется открытым с сообщением. Если файл отсутствует — получите полную папку проекта вместе с
portable/. - Пакет не подписан цифровой подписью. Если политика рабочего компьютера запрещает его запуск, используйте установку из исходников ниже; отключать защиту не требуется.
- На macOS/Linux готовый Windows-файл не работает: нужен запуск исходников с Python 3.12 (создание окружения
python3.12 -m venv .venv, далее.venv/bin/pythonвместо Windows-пути). Эти ОС в текущей приёмке не проверялись.
Приложение доступно только на компьютере проверяющего, без публичного сервера команды. Обязательных переменных окружения, .env, внешней базы, скачивания моделей и личных секретов нет. Лицензии и сведения о сборке — в portable. Проверенная среда: Windows 11 Pro 64-bit 10.0.26200, AMD Ryzen 7 4800H, около 16 ГБ RAM; это среда проверки, не измеренный минимум.
Запуск из исходников — запасной вариант
Нужен Python 3.12; Git нужен только для команды clone. Можно вместо неё распаковать архив проекта и открыть PowerShell в его папке. Команды для новой копии опубликованной main, Windows PowerShell:
git clone --branch main --single-branch https://github.com/BAITC-Hacks/hack-95a1b8c8-that-s-la-peace.git
Set-Location hack-95a1b8c8-that-s-la-peace
py -3.12 -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r requirements.txt
.\.venv\Scripts\python.exe run.py
Откройте http://127.0.0.1:8000/ после сообщения Uvicorn о запуске. Активация окружения и изменение ExecutionPolicy не нужны. Если py отсутствует, создайте окружение установленным Python 3.12 по полному пути: & 'C:\путь\к\Python312\python.exe' -m venv .venv — замените шаблон реальным путём.
Для первого скачивания проекта и зависимостей нужен интернет. Затем основной интерфейс и подбор работают локально: один Python-сервер, без Node.js, сборки frontend, ключей и платных аккаунтов. Доступ к официальному GitHub-репозиторию определяется его настройками.
- Проверка готовности:
http://127.0.0.1:8000/api/health→status: ok,dataset_count: 66. - Остановка: Ctrl+C. Повторный запуск — той же командой, миграций нет.
- Если порт занят:
.\.venv\Scripts\python.exe run.py --port 8002, затем откройтеhttp://127.0.0.1:8002/. По умолчанию сервер доступен только на этом компьютере. - Для фиксации проверяемой версии выполните
git rev-parse HEAD; результаты отчётов относятся к конкретному SHA.
Проверенный пакет: около 15 МБ; запуск из чистой папки занял 3,1 с, повторный — 1,8 с на указанной машине. На другом компьютере время может отличаться. Последняя проверка пакета.
Демо за несколько минут
Язык подрядчика и длительность оставьте пустыми. Выбирайте значения из списков; дату можно ввести как 15.10.2026 или выбрать в календаре.
| Сценарий | Город / категория / формат | Дата / бюджет | Ожидаемый результат по каталогу |
|---|---|---|---|
| Плотная категория | Алматы / Ведущий / корпоратив | 15.10.2026 / 1 000 000 ₸ | 3 карточки из 6 подходящих, конкретные отличия в объяснениях |
| Изменение только даты | Те же условия | 16.10.2026 / 1 000 000 ₸ | 3 карточки из 4, состав выдачи изменяется из-за занятости |
| Редкая категория | Алматы / Флорист / свадьба | 15.10.2026 / 1 000 000 ₸ | 2 карточки и объяснение, почему их меньше трёх |
| Все заняты | Астана / Флорист / свадьба | 15.10.2026 / 1 000 000 ₸ | Пустой результат с причиной; предложение перейти на 14 октября |
| Недостаточный бюджет | Алматы / Ведущий / корпоратив | 15.10.2026 / 1 ₸ | Пустой результат и проверенное предложение увеличить бюджет |
| В городе нет категории | Зарубежье / Ведущий / корпоратив | 15.10.2026 / 1 000 000 ₸ | Отдельное сообщение об отсутствии категории |
Для последнего примера в «Настройки подбора» снимите «Скрывать несовместимые категории и форматы». Там же можно отключить автоподбор и отправлять запросы кнопкой. Повторите первый запрос: порядок карточек должен сохраниться. Совет даты или бюджета применяется отдельным нажатием. Расширенный сценарий демо.
Число под днём календаря — справка о свободных профилях выбранной группы до проверки бюджета, языка и часов. Поэтому оно может быть больше числа подходящих в результате: для первого примера календарь показывает 7 свободных, сервер оставляет 6 и выводит 3.
Что реализовано
- Обязательные фильтры города, категории, даты, формата и начальной цены; необязательные язык и длительность. Занятые подрядчики исключаются, включая площадки.
- До трёх карточек в стабильном порядке: имя, категория, город, цена «от», 1–2 предложения объяснения, исходный фрагмент описания и признаки происхождения данных.
- Различимые состояния: подобрали; в городе нет категории; кандидаты есть, но не подходят. При выдаче менее трёх карточек показана причина. Сетевая ошибка отображается отдельно.
- Ближайшая подходящая дата и минимальный достаточный начальный бюджет проверяются теми же фильтрами. Каждый совет меняет только одно условие; неподтверждённые советы не показываются.
- Компактная адаптивная форма: поиск и выбор в одном поле списка (combobox), ввод бюджета с разделителями, единое поле даты с календарём, дополнительные параметры и настройки в раскрываемых блоках.
- Переключение интерфейса RU / KK / EN, управление списками с клавиатуры, необязательный автоподбор, справка о ценах и доступности. Исходные описания и объяснения остаются русскими с явной подписью; сообщения подбора и советы также пока на русском.
Архитектура и роль AI
CSV → нормализованный каталог → проверка запроса → обязательные фильтры
→ детерминированное ранжирование → до 3 карточек с объяснениями
→ при пустой выдаче: проверка альтернатив даты и бюджета
Backend: Python 3.12, FastAPI, Pydantic, Uvicorn. Каталог проверяется и загружается в память при старте. Сначала применяются ограничения, затем учитываются тематические основы слов формата и категории в описании; при равенстве — начальная цена и стабильный ID. Это прозрачное лексическое соответствие, а не рейтинг качества подрядчика. Одинаковый запрос к тому же каталогу даёт одинаковый порядок.
Frontend: HTML/CSS/JavaScript без сборки, раздаётся тем же сервером и вызывает относительные /api/…. Справочные агрегаты catalog-guide.json используются только при совпадении SHA каталога; они не добавляют профили и не заменяют серверный подбор.
Codex участвовал в разработке кода, документации, автоматических проверок и интеграции под управлением команды. Во время подбора приложение не вызывает LLM, не обучает модель и не отправляет запрос во внешний AI-сервис. Объяснения формируются детерминированно из условий и фактов профиля. Автоматические проверки и человеческая оценка отмечаются отдельно.
Подробнее: архитектура, API v1, вклад и ход работы, зависимости.
Данные и честные ограничения
Источник — неизменённый выданный CSV: 66 анонимизированных профилей, включая 13 исходных синтетических; у 8 заполнен город, у 18 — начальная цена. Эти признаки передаются в карточках. Команда дополнительных профилей не добавляла. Происхождение и SHA-256.
- Календарь покрывает 23.09.2026–31.12.2026 включительно. Даты вне этого окна отклоняются: занятость неизвестна. Изменение CSV требует перезапуска и меняет
dataset_version. - Цена «от» — нижняя граница из каталога, не итоговая стоимость заказа. Стоимость расширенного состава или пакета нужно уточнять; отсутствие занятой даты не подтверждает реальную бронь.
- Пустой
max_hoursозначает неприменимое ограничение присутствия. Незаданные язык и часы не считаются пожеланиями пользователя. Рекламное описание не подтверждает качество, опыт или рейтинг. - Небольшой каталог и лексические словари ограничивают полноту рекомендаций. Для описаний без конкретики используются известные структурированные факты; недостающие сведения не придумываются.
- Переведён интерфейс; исходные описания, объяснения, сообщения подбора и советы пока русские. Бюджет в браузере — целое от 1 до 9 007 199 254 740 991; это граница точного числа JavaScript, не серверный предел цены.
- Публичный интернет-деплой пока не выполнен. Бронирование, заявки, оплата, аккаунты и уведомления подрядчика не входят в текущий кейс.
Обязательных переменных окружения нет. Основной сервер ограничивает тело запроса 16 КиБ, возвращает понятный 413 при превышении и раздаёт только разрешённые публичные ресурсы. Защитные заголовки и CSP описаны в контракте. Служебная документация http://127.0.0.1:8000/docs использует Swagger из внешнего CDN; основному UI/API он не нужен.
Автоматические проверки из исходников
Для обычной проверки готового Windows-пакета достаточно таблицы демо и адреса готовности выше. Следующие команды — дополнительные проверки разработчика: сначала выполните установку из исходников, затем откройте второй PowerShell из корня проекта, пока сервер работает:
.\.venv\Scripts\python.exe scripts/smoke.py
Это настоящие HTTP-запросы: плотная категория на двух датах, повторяемость, редкая категория, оба пустых исхода и повторное применение советов даты/бюджета. Скрипт выводит результат и измеренное время. Для другого порта добавьте --base-url http://127.0.0.1:8002.
Автоматические проверки backend, контракта, данных, объяснений и HTTP-ограничений:
.\.venv\Scripts\python.exe -m pip install -r requirements-dev.txt
.\.venv\Scripts\python.exe -m pytest -q
Для проверки frontend дополнительно нужны Node.js; для браузерных сценариев — Playwright 1.62.1 и Edge либо путь BROWSER_EXECUTABLE. Обычный запуск приложения их не требует.
node tests/ui/api.test.mjs
node tests/ui/server.test.mjs
Для браузерных проверок установите Playwright в отдельную папку инструментов, задайте PLAYWRIGHT_MODULE полным путём к её node_modules/playwright и UI_CHECK_OUTPUT путём для снимков вне Git. При работающем сервере:
node tests/ui/browser-check.cjs http://127.0.0.1:8000
node tests/integration/browser-live.cjs http://127.0.0.1:8000
node tests/ui/ux-check.cjs http://127.0.0.1:8000
Первый браузерный сценарий использует явно обозначенные синтетические ответы; два следующих проверяют реальный UI/API и каталог. Условия, результаты и конкретные версии смотрите в TEST_REPORT, интеграционных отчётах и FINAL_COMPLIANCE_REPORT. Каждый отчёт относится к указанной в нём версии.
Как создавался продукт
Проект собран 23 сентября 2026 года для одного кейса организаторов. Ниже — краткая история решений; точные коммиты, исполнители проверок и результаты сохранены в PROGRESS. Записи прежних этапов относятся к своим версиям.
| Этап | Что появилось и зачем |
|---|---|
| Требования и основа | Разобрали кейс и 66 профилей, сохранили исходный CSV, разделили backend и frontend, зафиксировали API для параллельной работы. |
| Первый рабочий подбор | Добавили загрузку и проверку данных, жёсткие фильтры, стабильный top-3, причины пустой выдачи и проверенные советы; затем объединили API с интерфейсом. |
| Качество объяснений | Уточнили выбор цельных фактов вместо рекламы, сохраняли исходные выдержки и оговорки о цене состава; реализовали конкретные замечания Dinmukhammed после просмотра примеров. |
| Удобство и устойчивость | Ilyas подготовил компактный интерфейс, поиск в списках, календарь, RU/KK/EN и автоподбор; добавлены обработка ошибок, защита HTTP, проверки настоящего UI/API и чистого запуска. |
| Подготовка для жюри | Подготовлены сценарии демо, документация, START.cmd и автономная Windows-сборка, чтобы основной запуск не требовал установки среды разработки. Приёмка каждой сборки фиксируется отдельно. |
Код, документы и автоматические прогоны создавались с помощью Codex по поручениям участников. Человеческий просмотр объяснений, техническая проверка агентом и подача капитаном — разные действия; одно не считается доказательством другого. Распределение ответственности указано в начале README, подробности передачи — в handoff Dinmukhammed и handoff Ilyas.
Технологии и инструменты
| Часть | Использовано |
|---|---|
| Подбор и API | Python 3.12, FastAPI, Pydantic, Uvicorn; точные версии — requirements.txt. |
| Интерфейс | HTML, CSS, JavaScript ES modules; собственные списки с поиском, календарь и переводы интерфейса, без обязательной сборки Node.js. |
| Данные | CSV в репозитории, нормализованный каталог в памяти и SHA-256 версии; внешняя БД сейчас не используется. |
| Автоматические проверки | pytest/httpx, HTTP smoke, Node.js, Playwright и Edge; тестовые зависимости, результаты привязаны к проверенной версии. |
| Автономный Windows-запуск | START.cmd, Python launcher и PyInstaller; интерпретатор, зависимости и ресурсы упакованы в EXE. Состав, сборка и лицензии. |
| Совместная разработка | Git/GitHub, отдельные рабочие ветки, согласованный API, передача готовых изменений и общая интеграция; Codex — инструмент разработки. |
Происхождение сторонних компонентов и предварительных материалов раскрыто в THIRD_PARTY. Наличие инструмента в этой таблице не означает, что его нужно устанавливать для запуска готового EXE.
Как планируем масштабировать
Это план развития, не описание уже реализованных возможностей. Для 66 записей достаточно одного процесса и каталога в памяти.
- Сначала измерения. Проверить больший разрешённый каталог, параллельные запросы, время ответа и потребление памяти; определить, где возникает ограничение, сохраняя качество объяснений и повторяемость.
- Хранение и обновление данных. При необходимости перейти к БД с проверяемыми импортами, версиями каталога и историей изменений цен/занятости. Ответ должен относиться к одному согласованному снимку данных; происхождение и неизвестные значения сохраняются.
- Индексы и кеш по результатам замеров. Индексировать фактические условия поиска; кешировать по нормализованному запросу и версии каталога. При обновлении данных старый кеш перестаёт использоваться. Эти меры пока не реализованы.
- Рост сервиса. Только при подтверждённой нагрузке добавлять несколько процессов, общий источник данных, наблюдение за ошибками и резервное восстановление; измерять улучшение на тех же сценариях.
- Языковая модель — отдельный эксперимент. Возможный разбор свободного запроса или помощь с формулировками оцениваются по точности, задержке и стоимости. Жёсткие фильтры, проверяемые факты и рабочий путь без модели должны сохраняться; текущий runtime LLM не использует.
Пользовательские улучшения и приоритеты перечислены ниже; масштабирование не должно задерживать исправление понятности результата.
Дальнейшие улучшения
Идеи для следующих версий, ещё не реализованные:
- Улучшать выбор конкретных фактов в объяснениях, особенно у фотографов и видеографов; проверять тексты по источнику и читать карточки с людьми без имён.
- Перевести содержание карточек, сообщения подбора и советы на казахский и английский с сохранением оригинала и проверкой фактов.
- Добавить сохранение и сравнение вариантов на устройстве, историю запросов и ссылку с параметрами поиска.
- Дорабатывать форму, мобильное чтение, клавиатурное управление и поддержку экранных дикторов по проверке с пользователями.
- Обновлять цены и занятость с проверкой данных, датой обновления и сохранением допустимых параметров запроса; явно отделять неизвестную доступность от свободной даты.
- Добавить подтверждённые пакеты и состав цены, реальные портфолио и контакты с разрешением на публикацию; отзывы — только с проверяемым происхождением.
- Разместить демо по общей ссылке с HTTPS, наблюдением за ошибками и восстановлением; проверить с другого устройства.
- Исследовать ввод запроса обычными словами с подтверждением распознанных условий. Возможную LLM оценивать отдельно по пользе, точности, времени и стоимости, сохраняя строгие фильтры и работу без неё.
- Измерить качество и скорость на большем реальном каталоге; добавить удобную диагностику версии приложения. Версия данных уже доступна через API.
- Исследовать почасовую доступность только после получения реальных интервалов занятости и согласования нового контракта: нынешний каталог содержит только занятые даты. Не считать занятый день свободным на основании выдуманных часов.
Бронирование, платежи и личные кабинеты — возможный отдельный этап после проверки спроса и получения реальных данных. Приоритеты определяются пользой и результатами проверок.
Совместная работа и сдача
Опубликованная общая версия — main; backend-ветка — dev-dinmukhammed. Ветка dev-ilyas создана от принятого этапа d48a378. Последнее обновление Ilyas 04d92f2 получено из dev-zoro и включено в общую версию. Его переход с dev-zoro на другом компьютере пока не подтверждён, поэтому старая ветка временно сохранена. Общую сборку публикует Dinmukhammed, форму сдаёт капитан Ilyas. Git push сам по себе не является подачей решения.
Правила и владение файлами — AGENTS, общий план — 00_SHARED_PLAN, персональные задачи — Dinmukhammed и Ilyas. Одноразовая проверка перед личным коммитом описана в CHECKPOINT; актуальный статус и требования — STATE и COMPLIANCE.
Навигация по документации
| Что нужно найти | Документ |
|---|---|
| Исходное задание и критерии результата | CASE_REQUIREMENTS |
| Пайплайн, фильтры, ранжирование и границы решения | ARCHITECTURE |
| Запросы, ответы, ошибки и совместимость клиента | API_CONTRACT |
| Источник каталога, поля и контрольная сумма | Данные, CSV |
| История создания и вклад | PROGRESS, сторонние компоненты |
| Автоматические проверки и точные версии | TEST_REPORT, интеграционные отчёты |
| Предметная оценка объяснений и независимый запуск | EXPLANATION_REVIEW, EXPERT_CHECK |
| Сценарий показа | DEMO |
| Передача частей команды | Dinmukhammed, Ilyas |
| Версии зависимостей | Runtime requirements, тестовые requirements |
| Требования, готовность и оставшиеся действия | COMPLIANCE, FINAL_COMPLIANCE_REPORT, STATE |
| Правила, план и рабочие промпты | AGENTS, общий план, backend, frontend |
| Windows-пакет и воспроизводимая сборка | portable/README, лицензии |
Исторические документы сохраняют состояние на дату записи. Финальную проверяемую версию и статус подачи смотрите в итоговом отчёте; новая запись в README не заменяет фактическую проверку.
Авторы коммитов
История коммитов
- 2026-09-23 17:55docs: identify main as the sole jury submission and verify branch inclusiontem1rgalind
- 2026-09-23 17:54docs: confirm published jury package passed final independent launchtem1rgalind
- 2026-09-23 17:50docs: explain product history scaling plans and final jury handofftem1rgalind
- 2026-09-23 17:49release: verify latest Ilyas update and rebuild offline jury packagetem1rgalind
- 2026-09-23 17:47merge: include latest Ilyas price guidance and result cardstem1rgalind
- 2026-09-23 17:47build: package verified offline Windows demo for jurytem1rgalind
- 2026-09-23 17:44Polish price guidance and result cards for Thats La PeaceKvindeknedu
- 2026-09-23 17:42feat: add jury launcher and restore That's La Peace nametem1rgalind
Все коммиты (66)
- 2026-09-23 17:31docs: confirm final publication and safe branch cleanuptem1rgalind
- 2026-09-23 17:25docs: record final verified delivery and clean installationtem1rgalind
- 2026-09-23 17:17merge: include final Ilyas calendar clarification and clean-run evidencetem1rgalind
- 2026-09-23 17:16feat: finalize project name and reviewer README without changing matchingtem1rgalind
- 2026-09-23 17:16Record clean UX acceptance and researched design handoffKvindeknedu
- 2026-09-23 17:12Clarify that calendar availability is per service, not a blocked dayKvindeknedu
- 2026-09-23 17:11merge: integrate published Ilyas compact UI for final verificationtem1rgalind
- 2026-09-23 17:03Clarify catalog prices and result navigation, fix Kazakh calendar labelsKvindeknedu
- 2026-09-23 16:58Verify compact UI with current shared backend and update compliance evidenceKvindeknedu
- 2026-09-23 16:51Merge remote-tracking branch 'origin/integration' into dev-zoroKvindeknedu
- 2026-09-23 16:46feat(ui): simplify service selection and unify date entryKvindeknedu
- 2026-09-23 16:45docs: record fresh browser check for 17:00 publicationtem1rgalind
- 2026-09-23 16:44merge: future roadmap and final team handoff for 17:00tem1rgalind
- 2026-09-23 16:43docs: add future roadmap and final coordination handofftem1rgalind
- 2026-09-23 16:30docs: close backend audit with clean launch and final compliance evidencetem1rgalind
- 2026-09-23 16:30merge: finalize verified backend and UX delivery documentationtem1rgalind
- 2026-09-23 16:21merge: include verified personal checkpoint gatetem1rgalind
- 2026-09-23 16:21feat: add safe personal checkpoint gate with guarded publicationtem1rgalind
- 2026-09-23 16:12merge: prepare final backend security candidatetem1rgalind
- 2026-09-23 16:12merge: integrate Ilyas verified multilingual UX packagetem1rgalind
- 2026-09-23 16:12fix: bound HTTP bodies and verify security and explanation categoriestem1rgalind
- 2026-09-23 16:05docs: record clean UX acceptance and current integration handoffKvindeknedu
- 2026-09-23 15:59fix: serve approved UI resources with verified current backendKvindeknedu
- 2026-09-23 15:57docs: record human B03 review and verified 16:15 candidatetem1rgalind
- 2026-09-23 15:57merge: include B03 human review and integration evidencetem1rgalind
- 2026-09-23 15:53Merge remote-tracking branch 'origin/integration' into dev-zoroKvindeknedu
- 2026-09-23 15:53feat(ui): add searchable multilingual form and honest catalog guidanceKvindeknedu
- 2026-09-23 15:51merge: prepare reviewed B03 candidate for 16:15tem1rgalind
- 2026-09-23 15:51fix: apply human B03 explanation review with focused regressionstem1rgalind
- 2026-09-23 15:27docs: record verified 15:30 integration and named workstreamstem1rgalind
- 2026-09-23 15:24merge: align live UI regression with factual fallbacktem1rgalind
- 2026-09-23 15:24test: verify grounded fallback and complete packages in live UItem1rgalind
- 2026-09-23 15:22merge: include explicit composition price clarificationtem1rgalind
- 2026-09-23 15:22fix: clarify that quoted package pricing needs confirmationtem1rgalind
- 2026-09-23 15:19merge: prepare backend improvements for 15:30tem1rgalind
- 2026-09-23 15:19merge: include Ilyas UI clarity and network recoverytem1rgalind
- 2026-09-23 15:19fix: ground explanations, restrict static assets and align named workstreamstem1rgalind
- 2026-09-23 15:15docs: prepare Ilyas rehearsal and next integration handoffKvindeknedu
- 2026-09-23 15:15Merge remote-tracking branch 'origin/integration' into dev-zoroKvindeknedu
- 2026-09-23 14:59feat(ui): clarify catalog and selection with recovery checksKvindeknedu
- 2026-09-23 14:56docs: record task audit integration and independent runtime evidencetem1rgalind
- 2026-09-23 14:55merge: combine backend task plan and teammate clean-launch evidencetem1rgalind
- 2026-09-23 14:55docs: prioritize backend improvements and align team integrationtem1rgalind
- 2026-09-23 14:46docs: reconcile source plans and verify integrated clean launchKvindeknedu
- 2026-09-23 14:34test: record verified 14:45 release candidatetem1rgalind
- 2026-09-23 14:29merge: include clearer explanations and release scheduletem1rgalind
- 2026-09-23 14:29merge: include teammate live UI checks and evidencetem1rgalind
- 2026-09-23 14:29refactor: shorten grounded explanations and clarify setuptem1rgalind
- 2026-09-23 14:19fix: prefer factual explanations and establish 45-minute releasestem1rgalind
- 2026-09-23 14:12test(ui): verify real backend flow and integration handoffKvindeknedu
- 2026-09-23 14:07test: verify live backend and frontend integrationtem1rgalind
- 2026-09-23 14:00docs: record clean frontend checkout verificationKvindeknedu
- 2026-09-23 13:58merge: include tested backend from dev-dimalarptem1rgalind
- 2026-09-23 13:58merge: include frontend from dev-zorotem1rgalind
- 2026-09-23 13:53docs: record clean backend installation and handofftem1rgalind
- 2026-09-23 13:53feat(frontend): add contractor picker and verified UI handoffKvindeknedu
- 2026-09-23 13:49feat: implement deterministic contractor matching APItem1rgalind
- 2026-09-23 13:33docs: establish shared plan and participant workstreamstem1rgalind
Структура репозитория (225 файлов)
.gitattributes .gitignore AGENTS.md README.md START.cmd backend/__init__.py backend/app.py backend/catalog.py backend/matching.py backend/schemas.py backend/security.py data/README.md data/contractors.csv docs/API_CONTRACT.md docs/ARCHITECTURE.md docs/BACKEND_TASKS.md docs/CASE_REQUIREMENTS.md docs/CHECKPOINT.md docs/COMPLIANCE.md docs/DEMO.md docs/EXPERT_CHECK.md docs/EXPLANATION_REVIEW.md docs/FINAL_COMPLIANCE_REPORT.md docs/PROGRESS.md docs/RELEASE_SCHEDULE.md docs/STATE.md docs/TASK_SPLIT.md docs/TEST_REPORT.md docs/THIRD_PARTY.md docs/handoffs/DESIGN_PROMPT_FOR_FRIEND.md docs/handoffs/dinmukhammed.md docs/handoffs/ilyas.md docs/integration/20260923-1358.md docs/integration/20260923-1435.md docs/integration/20260923-1458-plan.md docs/integration/20260923-1520.md docs/integration/20260923-1605.md docs/integration/20260923-1620.md docs/integration/20260923-1650.md docs/integration/20260923-1654-ilyas.md docs/integration/20260923-final.md docs/integration/20260923-portable.md docs/integration/evidence/20260923-1520-ilyas.json docs/integration/evidence/20260923-1520-network-recovery.json docs/integration/evidence/20260923-1520-ours.json docs/integration/evidence/20260923-1605-ilyas.json docs/integration/evidence/20260923-1605-network-recovery.json docs/integration/evidence/20260923-1605-ours.json docs/integration/evidence/20260923-1620-checkpoint.json docs/integration/evidence/20260923-1620-clean-ilyas.json docs/integration/evidence/20260923-1620-clean-install.json docs/integration/evidence/20260923-1620-clean-network.json docs/integration/evidence/20260923-1620-clean-ours.json docs/integration/evidence/20260923-1620-clean-ux.json docs/integration/evidence/20260923-1620-http-security.json docs/integration/evidence/20260923-1620-ilyas.json docs/integration/evidence/20260923-1620-network.json docs/integration/evidence/20260923-1620-ours.json docs/integration/evidence/20260923-1620-secret-scan.json docs/integration/evidence/20260923-1620-ux.json docs/integration/evidence/20260923-1620-visual-csp.json docs/integration/evidence/20260923-1650-browser.json docs/integration/evidence/20260923-1650-checks.json docs/integration/evidence/20260923-1654-ilyas-browser.json docs/integration/evidence/20260923-1654-ilyas-ux.json docs/integration/evidence/20260923-1702-ilyas-accessibility.json docs/integration/evidence/20260923-1702-ilyas-ux.json docs/integration/evidence/20260923-1705-ilyas-clean-browser.json docs/integration/evidence/20260923-1705-ilyas-clean-ux.json docs/integration/evidence/20260923-1710-ilyas-availability.json docs/integration/evidence/20260923-1713-ilyas-clean-ux.json docs/integration/evidence/20260923-1736-visual-browser.json docs/integration/evidence/20260923-1736-visual-ux.json docs/integration/evidence/20260923-all-branches-in-main.json docs/integration/evidence/20260923-final-559f7b7-browser.json docs/integration/evidence/20260923-final-559f7b7-launch.json docs/integration/evidence/20260923-final-559f7b7-pytest.xml docs/integration/evidence/20260923-final-559f7b7-ux.json docs/integration/evidence/20260923-final-branding.json docs/integration/evidence/20260923-final-checks.json docs/integration/evidence/20260923-final-clean-browser.json docs/integration/evidence/20260923-final-clean-install.json docs/integration/evidence/20260923-final-clean-network.json docs/integration/evidence/20260923-final-clean-ux.json docs/integration/evidence/20260923-final-ilyas.json docs/integration/evidence/20260923-final-network.json docs/integration/evidence/20260923-final-ours.json docs/integration/evidence/20260923-final-publication-cleanup.json docs/integration/evidence/20260923-final-published-browser.json docs/integration/evidence/20260923-final-security.json docs/integration/evidence/20260923-final-source.json docs/integration/evidence/20260923-final-ux.json docs/integration/evidence/20260923-portable-branding.json docs/integration/evidence/20260923-portable-browser.json docs/integration/evidence/20260923-portable-busy-port.json docs/integration/evidence/20260923-portable-exe-smoke.json docs/integration/evidence/20260923-portable-launch.json docs/integration/evidence/20260923-portable-network.json docs/integration/evidence/20260923-portable-pytest.xml docs/integration/evidence/20260923-portable-restart.json docs/integration/evidence/20260923-portable-ux.json docs/integration/evidence/20260923-published-jury-browser.json docs/integration/evidence/20260923-published-jury-receipt.json docs/prompts/00_SHARED_PLAN.md docs/prompts/01_DINMUKHAMMED.md docs/prompts/02_FRIEND.md frontend/.env.example frontend/.gitattributes frontend/.gitignore frontend/AGENTS.md frontend/README.md frontend/api.mjs frontend/app.mjs frontend/catalog-guide.json frontend/generate-guide.py frontend/i18n.mjs frontend/index.html frontend/integration-test.patch frontend/public-assets.patch frontend/search-select.mjs frontend/serve.mjs frontend/styles.css frontend/view.mjs portable/ContractorPicker.exe portable/README.md portable/build-environment.lock.txt portable/build-info.json portable/licenses/Python-3.12.10/LICENSE.txt portable/licenses/README.txt portable/licenses/altgraph-0.17.5/PACKAGE-METADATA.txt portable/licenses/altgraph-0.17.5/altgraph-0.17.5.dist-info/LICENSE portable/licenses/annotated-doc-0.0.5/PACKAGE-METADATA.txt portable/licenses/annotated-doc-0.0.5/annotated_doc-0.0.5.dist-info/licenses/LICENSE portable/licenses/annotated-types-0.8.0/PACKAGE-METADATA.txt portable/licenses/annotated-types-0.8.0/annotated_types-0.8.0.dist-info/licenses/LICENSE portable/licenses/anyio-4.15.1/PACKAGE-METADATA.txt portable/licenses/anyio-4.15.1/anyio-4.15.1.dist-info/licenses/LICENSE portable/licenses/click-8.5.0/PACKAGE-METADATA.txt portable/licenses/click-8.5.0/click-8.5.0.dist-info/licenses/LICENSE.txt portable/licenses/colorama-0.4.6/PACKAGE-METADATA.txt portable/licenses/colorama-0.4.6/colorama-0.4.6.dist-info/licenses/LICENSE.txt portable/licenses/fastapi-0.141.1/PACKAGE-METADATA.txt portable/licenses/fastapi-0.141.1/fastapi-0.141.1.dist-info/licenses/LICENSE portable/licenses/h11-0.16.0/PACKAGE-METADATA.txt portable/licenses/h11-0.16.0/h11-0.16.0.dist-info/licenses/LICENSE.txt portable/licenses/idna-3.20/PACKAGE-METADATA.txt portable/licenses/idna-3.20/idna-3.20.dist-info/licenses/LICENSE.md portable/licenses/manifest.json portable/licenses/packaging-26.3/PACKAGE-METADATA.txt portable/licenses/packaging-26.3/packaging-26.3.dist-info/licenses/LICENSE portable/licenses/packaging-26.3/packaging-26.3.dist-info/licenses/LICENSE.APACHE portable/licenses/packaging-26.3/packaging-26.3.dist-info/licenses/LICENSE.BSD portable/licenses/pefile-2024.8.26/PACKAGE-METADATA.txt portable/licenses/pefile-2024.8.26/pefile-2024.8.26.dist-info/LICENSE portable/licenses/pip-25.0.1/PACKAGE-METADATA.txt portable/licenses/pip-25.0.1/pip-25.0.1.dist-info/AUTHORS.txt portable/licenses/pip-25.0.1/pip-25.0.1.dist-info/LICENSE.txt portable/licenses/pydantic-2.13.5/PACKAGE-METADATA.txt portable/licenses/pydantic-2.13.5/pydantic-2.13.5.dist-info/licenses/LICENSE portable/licenses/pydantic_core-2.46.5/PACKAGE-METADATA.txt portable/licenses/pydantic_core-2.46.5/pydantic_core-2.46.5.dist-info/licenses/LICENSE portable/licenses/pyinstaller-6.22.3/PACKAGE-METADATA.txt portable/licenses/pyinstaller-6.22.3/pyinstaller-6.22.3.dist-info/licenses/COPYING.txt portable/licenses/pyinstaller-hooks-contrib-2026.7/PACKAGE-METADATA.txt portable/licenses/pyinstaller-hooks-contrib-2026.7/pyinstaller_hooks_contrib-2026.7.dist-info/licenses/LICENSE portable/licenses/pywin32-ctypes-0.2.3/PACKAGE-METADATA.txt portable/licenses/pywin32-ctypes-0.2.3/pywin32_ctypes-0.2.3.dist-info/LICENSE.txt portable/licenses/setuptools-84.0.0/PACKAGE-METADATA.txt portable/licenses/setuptools-84.0.0/setuptools-84.0.0.dist-info/licenses/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/autocommand-2.2.2.dist-info/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/backports.tarfile-1.2.0.dist-info/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/importlib_metadata-8.7.1.dist-info/licenses/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/jaraco.text-4.0.0.dist-info/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/jaraco_context-6.1.0.dist-info/licenses/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/jaraco_functools-4.4.0.dist-info/licenses/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/more_itertools-10.8.0.dist-info/licenses/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/packaging-26.0.dist-info/licenses/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/packaging-26.0.dist-info/licenses/LICENSE.APACHE portable/licenses/setuptools-84.0.0/setuptools/_vendor/packaging-26.0.dist-info/licenses/LICENSE.BSD portable/licenses/setuptools-84.0.0/setuptools/_vendor/platformdirs-4.4.0.dist-info/licenses/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/tomli-2.4.0.dist-info/licenses/LICENSE portable/licenses/setuptools-84.0.0/setuptools/_vendor/wheel-0.46.3.dist-info/licenses/LICENSE.txt portable/licenses/setuptools-84.0.0/setuptools/_vendor/zipp-3.23.0.dist-info/licenses/LICENSE portable/licenses/setuptools-84.0.0/setuptools/config/NOTICE portable/licenses/setuptools-84.0.0/setuptools/config/_validate_pyproject/NOTICE portable/licenses/starlette-1.7.0/PACKAGE-METADATA.txt portable/licenses/starlette-1.7.0/starlette-1.7.0.dist-info/licenses/LICENSE.md portable/licenses/typing-inspection-0.4.4/PACKAGE-METADATA.txt portable/licenses/typing-inspection-0.4.4/typing_inspection-0.4.4.dist-info/licenses/LICENSE portable/licenses/typing_extensions-4.16.0/PACKAGE-METADATA.txt portable/licenses/typing_extensions-4.16.0/typing_extensions-4.16.0.dist-info/licenses/LICENSE portable/licenses/uvicorn-0.53.0/PACKAGE-METADATA.txt portable/licenses/uvicorn-0.53.0/uvicorn-0.53.0.dist-info/licenses/LICENSE.md portable/requirements-runtime.snapshot.txt pytest.ini requirements-dev.txt requirements.txt run.py scripts/checkpoint.py scripts/jury_launcher.py scripts/smoke.py tests/backend/conftest.py tests/backend/test_api.py tests/backend/test_catalog_matching.py tests/backend/test_checkpoint.py tests/backend/test_explanation_review_categories.py tests/backend/test_http_security.py tests/backend/test_jury_launcher.py tests/backend/test_smoke.py tests/integration/browser-live.cjs tests/ui/api.test.mjs tests/ui/browser-check.cjs tests/ui/evidence/live-clean-6039476.json tests/ui/evidence/live-fb54b42-a0918.json tests/ui/evidence/live-integrated-1162d45.json tests/ui/evidence/network-recovery-6f38144.json tests/ui/evidence/ux-clean-6039476.json tests/ui/evidence/ux-compact-working-20260923.json tests/ui/evidence/ux-merged-20260923-1555.json tests/ui/evidence/ux-working-20260923-1548.json tests/ui/live-check.cjs tests/ui/network-recovery.cjs tests/ui/search-select.test.cjs tests/ui/server.test.mjs tests/ui/ux-check.cjs
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.