О проекте
Команда: CODEX MONSTERS
Кейс HackAlem.ai: Логистика — Электрокомплект · ekt.kz
Стадия: Доведённый продукт
Задача кейса: Автоматический расчёт заказов поставщикам для пополнения склада, с утверждением менеджером
Суть
Приложение для закупщика: прогнозирует спрос по истории продаж IEK/Systeme Electric, рассчитывает пополнение с учётом остатков, MOQ, кратности и сроков поставки. Закупщик проверяет, правит, сравнивает сценарии, утверждает план и выгружает CSV.
Как устроено
Данные собираются в неизменяемые снимки (SQLite + Parquet) с проверкой качества и видимыми причинами исключения товаров. Спрос классифицируется, строится 90-дневный прогноз с базовой, сезонной и ростовой составляющими. Движок планирования считает страховой запас и точку заказа при цели цикла без дефицита 95%/99% с учётом поступлений в пути, минимальной партии и кратности упаковки. В Streamlit-интерфейсе видны объяснения количества, правки с обязательной причиной и версиями, сравнение сценариев (задержка 0/7/14 дней, бюджет) и утверждение точной версии с экспортом в CSV. Бэкенд на FastAPI.
Ключевые решения
- классификация спроса
- прогноз с базой, сезонностью и ростом
- safety stock
- reorder point
- service level 95/99%
- MOQ и кратность упаковки
- scenario comparison
- temporal evaluation
Особенности
Полный цикл закупщика с человеком в контуре: правка с причиной создаёт новую версию и снимает прежнее утверждение, пустое значение трактуется как «неизвестно», а не ноль. Демо опубликовано на Railway. Работа разбита на три параллельных трека (платформа, данные/прогноз, UI) с контрактами.
Стек
Python · FastAPI · Streamlit · SQLite · Parquet · Docker Compose · uv · GitHub Actions · Railway
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-20ebc90b-codex-monsters.
README
README.mdЭлектрокомплект — помощник закупщика
От истории продаж до объяснимого и утверждённого плана закупки. Проект команды CODEX MONSTERS помогает закупщику оценить риск дефицита, рассчитать пополнение с учётом остатков и условий поставки, проверить рекомендацию и выгрузить решение в CSV.
Открыть опубликованное демо · Запустить локально · Инструкция закупщика
Данные → Прогноз спроса → План закупки → Проверка и правки → Утверждение → CSV
↓
Сравнение вариантов → Новый план
Решение о закупке принимает человек. Приложение сохраняет расчёты, причины правок и утверждения; отправка поставщикам и в ERP не выполняется.
Содержание
- О проекте и опубликованном демо
- Возможности
- Локальный запуск
- Как пользоваться
- Подключение данных компании
- Архитектура и API
- Проверки и решение проблем
- Ограничения
- Документация и работа команды
1. О проекте и опубликованном демо
Помощник объединяет подготовку данных, прогноз спроса и рабочий процесс закупщика. Вместо одного числа к заказу пользователь получает объяснение: какой спрос ожидается, сколько товара доступно, когда возможен дефицит и как упаковка, сроки и бюджет влияют на рекомендацию.
Приложение уже опубликовано на Railway и работает независимо от компьютера разработчика. Для просмотра установка не нужна. В облаке используется синтетический набор, общая демонстрационная учётная запись и общее состояние посетителей; корпоративные исходные файлы туда не загружены.
Публичное демо и текущий main могут различаться: последняя зафиксированная облачная сборка — 19596be, а новые возможности подготовки реальных данных и сохранённых планов появились позже. Инструкции ниже относятся к текущей локальной версии репозитория. Доступность публичного UI и ответ HTTP 200 от health повторно проверены 23.09.2026; версия облачной сборки этой проверкой не обновлялась.
2. Возможности
| Возможность | Что получает закупщик |
|---|---|
| Подготовка данных | Учебный набор или подключённая история IEK/Systeme Electric; проверка качества и видимые причины исключения товаров. |
| Остатки и условия закупки | Ввод свободного остатка, закупочных единиц, конверсии, минимальной партии, упаковки и сроков для выбранных товаров. |
| Прогноз спроса | Ежедневный прогноз с базовой, сезонной и ростовой составляющими; спорные разовые продажи доступны для проверки. |
| Расчёт пополнения | Страховой запас, порог пополнения, учёт датированных поступлений, раннего дефицита, минимальной партии и кратности упаковки. |
| Объяснение рекомендации | Состав количества до и после округления, запас и условия закупки, допущения и предупреждения. |
| Ручной контроль | Правка количества с причиной, новая версия после изменения, утверждение точной версии и выгрузка CSV. |
| Сравнение вариантов | Цель 95%/99%, задержка 0/7/14 дней и бюджет при наличии сопоставимых цен; выбранные условия можно применить к новому плану. |
| Проверка продаж | Подтверждение спорной продажи как регулярной или разовой проектной с обоснованием и отдельным пересчётом. |
| Сохранённая работа | Возврат к предыдущим планам, правкам, подготовленным условиям и утверждениям после перезапуска. |
3. Локальный запуск
3.1. Получить проект
Понадобится Git. Выполните в терминале:
git clone https://github.com/BAITC-Hacks/hack-20ebc90b-codex-monsters.git
cd hack-20ebc90b-codex-monsters
Далее выберите один способ: Docker Compose либо Python с uv. Команды выполняются из корня репозитория. Для первой установки зависимостей или сборки образа нужен интернет.
3.2. Вариант A — Docker Compose
Требования: Docker и Compose v2. На macOS/Windows запустите Docker Desktop.
docker compose up --build -d
docker compose ps
Дождитесь готовности контейнера и откройте http://localhost:8501. Образ содержит синтетический набор; корпоративные книги в него не копируются.
Проверка готовности и логи:
docker compose exec -T app python scripts/check_health.py
docker compose logs --tail=100 app
Остановка с сохранением данных:
docker compose down
Состояние хранится в именованном volume ekt-data. Не добавляйте -v к down, если хотите сохранить планы и утверждения. Наружу опубликован только интерфейс на порту 8501; API доступен внутри контейнера.
3.3. Вариант B — Python и uv
Требования: установленный uv. Проект поддерживает Python 3.11–3.12; для воспроизводимого запуска используйте 3.12. При необходимости uv установит эту версию Python.
uv sync --frozen --python 3.12
uv run python scripts/run_app.py
После сообщения Application ready откройте http://localhost:8501.
| Адрес | Назначение |
|---|---|
| localhost:8501 | Интерфейс закупщика |
| 127.0.0.1:8000/docs | Swagger: запросы API и схемы |
| 127.0.0.1:8000/openapi.json | OpenAPI JSON |
| 127.0.0.1:8000/v1/health | Проверка API |
Launcher запускает FastAPI и Streamlit вместе. Ctrl+C останавливает оба процесса. Секреты и корпоративные файлы для учебного сценария не нужны. Локальное состояние хранится в var/; повторный запуск использует сохранённые данные.
Если нужны другие порты или отдельное хранилище:
uv run python scripts/run_app.py --port 8502 --api-port 8001 --state-dir ./var-local
В этом случае интерфейс будет доступен на http://localhost:8502, API — на http://127.0.0.1:8001.
3.4. Настройки и сохранение данных
| Настройка | Назначение |
|---|---|
--state-dir / EKT_DATA_DIR | Каталог SQLite, снимков, планов и истории решений |
--port / UI_PORT | Порт интерфейса; по умолчанию 8501 |
--api-port / API_PORT | Порт API; по умолчанию 8000 |
--source-root / EKT_SOURCE_ROOT | Каталог локальных исходных книг |
EKT_UI_PORT | Опубликованный порт UI в Docker Compose |
Полный пример переменных — .env.example. Python launcher не читает .env автоматически: передайте переменные в окружение либо используйте аргументы запуска. Compose читает .env для подстановки опубликованного адреса и порта.
Локальная папка var/ и Docker volume — независимые хранилища. Для резервной копии сохраняйте SQLite вместе со связанными Parquet-артефактами.
4. Как пользоваться
Шаг 1. Подготовить первый план
В разделе «Данные» откройте «Подготовить новый план»:
- В поле «Источник для расчёта» выберите «Демонстрационный набор» для первого знакомства.
- Укажите «Цель: цикл без дефицита» — 95% или 99%.
- Нажмите «Подготовить план закупки» и дождитесь завершения подготовки и расчёта.
- Перейдите в «План закупки»: появятся предложения по поставщикам.
Учебный набор использует фиксированную дату 2026-09-23T00:00:00Z. Цель 95%/99% — вероятность пройти цикл поставки без дефицита в модели, а не гарантия наличия или измеренный результат компании.
Для подключённых реальных данных вместо учебного набора выберите IEK или Systeme Electric. Доступны первые 20, первые 100 или все поддерживаемые товары. Если обязательных сведений не хватает, заполните условия на следующем шаге.
Шаг 2. Заполнить остатки и условия для реальной истории
В «Данные» → «Остатки и условия закупки» выберите все товары либо отдельные позиции. Общие условия можно задать сразу для выбранных товаров: они заполняют только пустые ячейки, сохраняя индивидуальные значения.
| Поле | Что указать |
|---|---|
| Доступный остаток | Свободное количество на дату расчёта в базовой единице склада, уже за вычетом резервов и блокировок. |
| Ед. закупки и базовых единиц в закупочной | Закупочную единицу и явную конверсию: например, бухты при складском учёте в метрах. |
| Шаг базовой единицы | Допустимую точность складского количества. |
| Минимальная партия | MOQ в единицах закупки; 0 означает подтверждённое отсутствие минимума. |
| Кратность упаковки | Допустимый шаг закупочного количества. |
| Срок поставки и период проверки | Количество календарных дней до поступления и между проверками потребности. |
| Цена и валюта — необязательно | Цену за базовую единицу. Для суммы и бюджета нужны известные цены всех товаров в одной валюте. |
| Товар в пути — необязательно | Количество в базовых единицах и дату ожидаемого поступления. |
Укажите «Источник данных и обоснование», явно примите допущение об истории продаж и нажмите «Сохранить условия и рассчитать заказ». Создаётся отдельный снимок и план; исходные данные и прошлые решения сохраняются.
Пустое значение означает «неизвестно», а не ноль. Отсутствие цены не блокирует утверждение и CSV, но не позволяет рассчитать полноценную сумму и применить бюджет. Принятие допущений не восстанавливает неподдержанные движения и возвраты.
Шаг 3. Проверить рекомендацию и изменить количество
В «Плане закупки» выберите «Поставщик и склад». Используйте поиск товара и фильтр срочности, проверьте ожидаемый дефицит и исключённые позиции.
Для выбранного товара проверьте блок «Как рассчитано количество» и раскройте «Допущения расчёта» и «Запас и условия закупки». Если требуется правка, задайте количество в единицах закупки, укажите причину и нажмите «Сохранить количество».
Количество должно соблюдать минимальную партию и кратность. Ноль исключает позицию из CSV. Сохранение правки создаёт новую черновую версию и снимает предыдущее утверждение.
Шаг 4. Сравнить варианты
В «Сравнении вариантов» задайте цель 95%/99%, задержку поставки 0/7/14 дней и, если доступны цены, лимит закупки. Нажмите «Сравнить варианты» и проверьте изменения количества, стоимости и страхового запаса.
База сравнения — исходный успешный расчёт; ручные правки заказа в неё не входят. Сценарий не изменяет базовый заказ. Кнопка «Применить условия к новому плану» создаёт новый расчёт, который нужно проверить и утвердить отдельно.
Шаг 5. Утвердить и скачать CSV
Проверьте весь заказ выбранного поставщика и склада: фильтры меняют только отображение, а утверждается весь заказ. Для реальной истории подтвердите введённые условия и допущения.
Нажмите «Утвердить и подготовить CSV», затем «Скачать CSV». Выгрузка содержит товары, количества, единицы, доступные цены, объяснения и допущения. Экспорт разрешён только для утверждённой версии; после любой правки требуется новое утверждение.
Учебная выгрузка помечена «ДЕМОНСТРАЦИЯ — НЕ ЗАКАЗ ПОСТАВЩИКУ». Ни учебный, ни реальный CSV приложение не отправляет поставщику автоматически.
Дополнительно: проверить разовые продажи
В «Данные» → «Разовые продажи» доступны классификация, причины и статус проверки событий. Спорную положительную продажу можно подтвердить как «Регулярная продажа» или «Разовая проектная продажа».
Укажите «Обоснование решения» и нажмите «Подтвердить и пересчитать новый план». Старые планы и утверждения сохранятся. Разовая продажа в прошлом сама по себе не создаёт будущую проектную потребность.
Вернуться к предыдущей работе
Откройте «Сохранённые планы закупки», выберите план и нажмите «Открыть выбранный план». Решения загружаются с сервера; несохранённый ввод при смене плана очищается.
5. Подключение данных компании
Для работы с локальными книгами используйте запуск через Python. Интерфейс выбирает уже подключённые источники; загрузки произвольного Excel через браузер нет.
Подготовьте каталог с поддерживаемыми книгами в исходной структуре:
/path/to/sources/
├── IEK/
│ └── *.xlsx
└── Systeme electric/
└── *.xlsx
Сохраните исходные названия и структуру книг: распознавание использует конкретные префиксы и схемы. Для каждого поставщика нужен полный поддерживаемый комплект; неоднозначные файлы автоматически не выбираются. Охват исходных книг и причины исключений описаны в проверке готовности данных.
uv run python scripts/run_app.py --source-root /path/to/sources
Альтернативы: EKT_SOURCE_ROOT или каталог data/sources/ в корне проекта. Если оба исходных архива IEK.zip и Systeme electric.zip уже присутствуют в корне, launcher автоматически распакует книги в игнорируемую Git папку состояния. Для явной регистрации локальных путей предусмотрен EKT_SOURCE_CONFIG.
После подключения выберите поставщика в «Данных» и заполните остатки и условия. Реальная история с пользовательскими допущениями сохраняет режим real_preview: это не подтверждение текущего состояния ERP. Не добавляйте новые корпоративные выгрузки, локальные БД, экспорты и секреты в Git или публичное демо.
6. Архитектура и API
| Компонент | Технология и ответственность |
|---|---|
| Интерфейс | Streamlit; рабочий процесс закупщика через HTTP API |
| API и контракты | FastAPI, Pydantic; валидация, фоновые задания, версии и утверждения |
| Данные и прогноз | pandas, NumPy, DuckDB/Parquet; импорт, классификация, подготовка спроса и ежедневный прогноз |
| Планирование | Страховой запас, потребность, даты поступлений, закупочные ограничения, бюджет и объяснение |
| Хранение | SQLite для рабочего состояния и истории; Parquet для табличных артефактов |
apps/buyer_ui/ Интерфейс закупщика
src/ekt/
├── api/ HTTP API и координация заданий
├── contracts/ Общие модели и форматы артефактов
├── data/ Подготовка снимков и адаптеры источников
├── forecast/ Классификация спроса и прогноз
├── planning/ Расчёт предложений и объяснений
└── storage/ Состояние, версии и аудит
scripts/ Запуск и проверки
tests/ Проверки модулей, UI и интеграции
docs/ Контракты, инструкции и доказательства приёмки
Раздельный запуск для разработки
После uv sync --frozen --python 3.12 запустите в первом терминале:
uv run uvicorn ekt.api.app:app --host 127.0.0.1 --port 8000
Во втором терминале (пример для bash/zsh):
BUYER_UI_MODE=http BUYER_API_URL=http://127.0.0.1:8000 uv run streamlit run apps/buyer_ui/app.py --server.address 127.0.0.1 --server.port 8501
По умолчанию UI работает с настоящим API. Изолированный mock включается явно через BUYER_UI_MODE=mock, технические настройки — через BUYER_DEVELOPER_MODE=true.
Основные маршруты
| Задача | HTTP API |
|---|---|
| Готовность, источники, сохранённая работа | GET /v1/health, GET /v1/sources, GET /v1/workspace |
| Подготовка данных | POST /v1/snapshots, GET /v1/jobs/{job_id} |
| Остатки и закупочные условия | GET / POST /v1/snapshots/{snapshot_id}/buyer-inputs |
| Расчёт плана | POST /v1/planning-runs, GET /v1/planning-runs/{run_id} |
| Просмотр и правка заказа | GET /v1/proposals, GET / PATCH /v1/proposals/{proposal_id} |
| Утверждение | POST /v1/proposals/{proposal_id}/approve |
| Выгрузка CSV | POST /v1/proposals/{proposal_id}/export |
| Сценарии | POST /v1/scenarios, GET /v1/scenarios/{scenario_id} |
| Проверка продаж | GET /v1/planning-runs/{run_id}/demand-events, POST /v1/planning-runs/{run_id}/review-events |
Подготовка и расчёты возвращают 202 и status_url; результат нужно дождаться до succeeded или failed. Правка использует expected_version, утверждение — точную версию и content_hash. Количества и деньги типа Decimal передаются JSON-строками; null означает неизвестное значение.
Актуальные схемы доступны в локальном Swagger. Дополнительно: контракты и сквозной API-пример.
7. Проверки и решение проблем
Сквозная проверка локального приложения
При работающем приложении выполните во втором терминале:
uv run python scripts/check_health.py
uv run python scripts/smoke_api.py
Smoke создаёт собственный синтетический план, проверяет запрет выгрузки черновика, правит количество, утверждает версию 2, сохраняет var/demo-approved.csv и сравнивает 95%/99% без изменения базового заказа. Успех отмечен "status": "passed". Команда добавляет демонстрационные записи в состояние выбранного экземпляра и не отправляет заказ.
Для Docker:
docker compose exec -T app python scripts/smoke_api.py
При нестандартных портах передайте API_PORT и UI_PORT health-скрипту; smoke принимает --url http://127.0.0.1:8001 и --output /path/to/demo.csv.
Проверки кода
uv run pytest -q
uv run ruff check src apps tests scripts
Протокол интегрированной приёмки: product-acceptance.md. Он отделяет проверенные функции, синтетические примеры и реальные данные с тестовыми допущениями. Локальные результаты не подтверждают успешный запуск облачного CI.
Частые проблемы
| Симптом | Что сделать |
|---|---|
uv не найден | Установить uv по ссылке выше; при установке через pip можно использовать python3 -m uv вместо uv. |
| Порт занят | Остановить свой предыдущий запуск или выбрать другие --port и --api-port. Для Compose изменить EKT_UI_PORT. |
| UI не соединяется с API | При едином запуске проверить терминал и health; при раздельном — процесс API и BUYER_API_URL. |
| IEK/Systeme нет в выборе | Проверить --source-root, названия папок, исходные имена книг и полный поддерживаемый комплект. |
| Расчёт или утверждение недоступны | Прочитать причины в качестве данных и исключённых позициях; заполнить обязательные условия и подтвердить допущения. |
| Бюджет недоступен | Проверить цены всех участвующих товаров и единую валюту. |
| CSV недоступен после правки | Проверить и заново утвердить текущую версию. |
| После обновления кода остался старый интерфейс | Перезапустить оба процесса приложения, сохранив каталог состояния. |
8. Ограничения
- Данные. Поддерживаются определённые форматы IEK/Systeme. Непонятные движения и возвраты остаются исключёнными; дни без записей принимаются за нулевые продажи только с явным согласием закупщика.
- Прогноз. Восстановление потерянного спроса требует подтверждённых интервалов отсутствия товара. Без них потерянный спрос неизвестен. Обнаруженный всплеск — повод для проверки, а не доказанный проектный заказ.
- Результаты. Точность на будущем периоде, достигнутый уровень сервиса, экономия и сокращение времени работы компании здесь не заявляются. Синтетические расчёты подтверждают работу сценария, а не бизнес-эффект.
- Расчёт. Используются календарные дни UTC. Бюджет распределяется допустимым жадным алгоритмом без гарантии математического оптимума; многоскладовой оптимизации нет.
- Эксплуатация. Один worker и одна реплика; нет корпоративного SSO, разделения организаций и производственного SLA. Демонстрационная серверная роль не заменяет аутентификацию.
- Интеграции. Нет автоматической отправки поставщику, в 1С или другую ERP. Следующий пилот требует проверенных остатков, условий закупки и согласованного способа измерять результат.
9. Документация и работа команды
| Документ | Когда читать |
|---|---|
| Приёмка продукта | Что проверено и в каких условиях |
| Готовность исходных данных | Поддержка книг, охват и ограничения истории |
| Сценарий демонстрации | Подготовка и проведение показа |
| API-контракты | Интеграция модулей и форматы запросов |
| Статус интеграции A | Текущий handoff и история checkpoints |
| Планы команды | Области ответственности A/B/C |
| Критерии хакатона | Польза, качество и доказательства для презентации |
| Git workflow | Синхронизация и публикация изменений |
Разработка ведётся непосредственно в main, без новых веток, worktree и PR. A отвечает за платформу, контракты и интеграцию; B — за данные и прогноз; C — за интерфейс и демо. Перед работой прочитайте AGENTS.md и план своей роли; сохраняйте изменения коллег и публикуйте только проверенные файлы своей области.
Авторы коммитов
История коммитов
- 2026-09-23 17:51docs: restructure README around local setup and buyer workflowakazbeku
- 2026-09-23 17:40docs: record integrated buyer MVP acceptanceakazbeku
- 2026-09-23 17:38merge: preserve verified deployment workflow with completed buyer MVPakazbeku
- 2026-09-23 17:38feat: complete buyer procurement workflow with real-data preparationakazbeku
- 2026-09-23 17:36docs: publish verified Railway demo and safe redeploy workflowarssuleimenov
- 2026-09-23 17:09feat: add one-command local launch and live demo deploymentarssuleimenov
- 2026-09-23 16:52fix(ui): remove developer diagnostics from buyer screensbassan
- 2026-09-23 16:43fix(ui): make procurement workflow and job status readablebassan
Все коммиты (38)
- 2026-09-23 16:17feat(ui): redesign buyer workspace around guided order reviewbassan
- 2026-09-23 15:31fix(ui): preserve caption contrast against native opacitybassan
- 2026-09-23 15:30feat(ui): apply restrained design and clearer operation feedbackbassan
- 2026-09-23 15:23docs(data): record published clone verificationarssuleimenov
- 2026-09-23 15:21feat(data): publish reproducible B evidence and criteria auditarssuleimenov
- 2026-09-23 15:21fix(forecast): scope assumptions and classify complete documentsarssuleimenov
- 2026-09-23 15:12feat(ui): simplify buyer workflow and combine approval with CSV preparationbassan
- 2026-09-23 15:04fix: unify team test imports and verify integrated forecast UI workflowakazbeku
- 2026-09-23 14:59docs: align all team agents with hackathon criteria and change reportsqprivh
- 2026-09-23 14:56docs(data): record reproducible B integration and numerical evidencearssuleimenov
- 2026-09-23 14:52Merge remote-tracking branch 'origin/main' into codex/data-forecastarssuleimenov
- 2026-09-23 14:52feat(forecast): integrate shared platform contracts and document team handoffarssuleimenov
- 2026-09-23 14:50docs(ui): verify integration against latest mainbassan
- 2026-09-23 14:50Merge remote-tracking branch 'origin/main'bassan
- 2026-09-23 14:49docs(ui): record live acceptance and backend launch stepsbassan
- 2026-09-23 14:47fix(ui): align live backend and verify persisted buyer workflowbassan
- 2026-09-23 14:46docs: record verified API demo and GitHub runner billing blockerakazbeku
- 2026-09-23 14:45chore: add API handoff HTTP smoke checks and main-only workflowakazbeku
- 2026-09-23 14:45Merge remote-tracking branch 'origin/main' into codex/data-forecastarssuleimenov
- 2026-09-23 14:44feat(data): build immutable snapshots and Systeme preview adaptersarssuleimenov
- 2026-09-23 14:44feat(forecast): classify demand and publish robust 90-day forecastsarssuleimenov
- 2026-09-23 14:44test(forecast): add temporal and independent recovery evaluationarssuleimenov
- 2026-09-23 14:42Merge branch 'codex/ui-mvp'bassan
- 2026-09-23 14:41feat: ship replenishment backend contracts planning and buyer workflowakazbeku
- 2026-09-23 14:40docs(ui): add verified demo runbook and integration handoffbassan
- 2026-09-23 14:40feat(ui): implement buyer review, scenarios and contract clientsbassan
- 2026-09-23 14:34data: share supplied IEK and Systeme source archivesarssuleimenov
- 2026-09-23 14:27docs: plan strong MVP and three implementation tracks (#1)5enynmaman
- 2026-09-23 14:22docs: plan strong MVP and three implementation tracksakazbeku
- 2026-09-23 13:58initial docsakazbeku
Структура репозитория (143 файлов)
.DS_Store .dockerignore .env.example .github/workflows/checks.yml .gitignore .impeccable/design.json .impeccable/review/clean-comparison.png .impeccable/review/clean-sources.png .impeccable/review/data.png .impeccable/review/desktop.png .impeccable/review/human-1024.png .impeccable/review/human-data.png .impeccable/review/human-mobile.png .impeccable/review/human-orders.png .impeccable/review/human-status.png .impeccable/review/mobile-review.png .impeccable/review/mobile.png .impeccable/review/scenario.png .impeccable/review/user-619.png .streamlit/config.toml AGENTS.md DESIGN.md Dockerfile IEK.zip PRODUCT.md README.md Systeme electric.zip apps/buyer_ui/.gitignore apps/buyer_ui/__init__.py apps/buyer_ui/app.py apps/buyer_ui/client.py apps/buyer_ui/formatting.py apps/buyer_ui/presentation.py apps/buyer_ui/procurement_inputs.py apps/buyer_ui/secondary_views.py apps/buyer_ui/styles.css apps/buyer_ui/views.py apps/buyer_ui/workflow.py apps/buyer_ui/workspace.py assets/demo/ui-fixtures/README.md assets/demo/ui-fixtures/bundle.json compose.yaml docs/architecture-blueprint.md docs/demo/acceptance-report.md docs/demo/design-skills.md docs/demo/five-minute-demo.md docs/demo/full-test-results.txt docs/demo/integration-handoff.md docs/demo/runbook.md docs/demo/ui-redesign.md docs/demo/ui-simplification.md docs/demo/ui-test-results.txt docs/deployment.md docs/mvp/README.md docs/mvp/acceptance-demo.md docs/mvp/contracts.md docs/mvp/evidence/b-criteria-audit-2026-09-23.md docs/mvp/evidence/b-real-assessment.json docs/mvp/evidence/b-real-assessment.md docs/mvp/evidence/b-synthetic-evidence.json docs/mvp/evidence/b-synthetic-evidence.md docs/mvp/evidence/product-acceptance.md docs/mvp/evidence/product-data-readiness.md docs/mvp/git-workflow.md docs/mvp/hackathon-criteria.md docs/mvp/master-plan.md docs/mvp/participant-a-platform-integration.md docs/mvp/participant-b-data-forecast.md docs/mvp/participant-c-ui-demo.md docs/mvp/status-a.md docs/samples/contracts.schema.json docs/samples/foundation.json docs/samples/openapi.json docs/source-data-assessment.md pyproject.toml scripts/build_snapshot.py scripts/check_health.py scripts/prepare_deploy.py scripts/profile_sources.py scripts/run_app.py scripts/smoke_api.py src/ekt/__init__.py src/ekt/api/__init__.py src/ekt/api/app.py src/ekt/api/catalog.py src/ekt/api/procurement.py src/ekt/api/service.py src/ekt/contracts/__init__.py src/ekt/contracts/io.py src/ekt/contracts/models.py src/ekt/data/__init__.py src/ekt/data/artifacts.py src/ekt/data/assessment.py src/ekt/data/boundary.py src/ekt/data/errors.py src/ekt/data/presets.py src/ekt/data/snapshot.py src/ekt/data/sources.py src/ekt/demo.py src/ekt/forecast/__init__.py src/ekt/forecast/__main__.py src/ekt/forecast/baseline.py src/ekt/forecast/classification.py src/ekt/forecast/evaluation.py src/ekt/forecast/evidence.py src/ekt/forecast/recovery.py src/ekt/forecast/service.py src/ekt/planning/__init__.py src/ekt/planning/engine.py src/ekt/storage/__init__.py src/ekt/storage/store.py tests/api/test_buyer_preparation.py tests/api/test_buyer_workflow.py tests/api/test_catalog.py tests/api/test_product_readiness.py tests/contracts/test_contracts.py tests/data/test_assessment.py tests/data/test_presets.py tests/data/test_runtime_contracts.py tests/data/test_snapshot.py tests/fixtures/test_demo_snapshot.py tests/forecast/test_baseline.py tests/forecast/test_classification.py tests/forecast/test_evaluation.py tests/forecast/test_evidence.py tests/forecast/test_platform_integration.py tests/forecast/test_recovery.py tests/forecast/test_service.py tests/forecast/test_service_audit.py tests/integration/test_launcher.py tests/integration/test_prepare_deploy.py tests/planning/test_engine.py tests/storage/test_store.py tests/ui/.gitignore tests/ui/test_buyer_workspace.py tests/ui/test_hosted_config.py tests/ui/test_http_client.py tests/ui/test_live_backend.py tests/ui/test_mock_workflow.py tests/ui/test_orders_app.py tests/ui/test_procurement_inputs.py tests/ui/test_secondary_views.py uv.lock
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.