О проекте
Команда: UniFlow AI
Кейс HackAlem.ai: Телеком — Beeline
Стадия: Доведённый продукт
Задача кейса: Агент, который решает, каким абонентам какой тариф предложить (чистый прирост ARPU)
Суть
Приложение для маркетолога Beeline: агент выбирает аудиторию, тариф и канал кампаний с учётом бюджета, лимита контактов и пересечений, проводит пилоты и максимизирует чистый прирост ARPU; есть история запусков, what-if и калькулятор.
Как устроено
Точка входа Agent().act(env) в participant_package: аудит аудитории, генерация кандидатов, пробные кампании (пилоты) с шумными наблюдениями, оценки с неопределённостью, затем планировщик под бюджет и контакты с учётом пересечений аудиторий. Расчётное ядро работает без LLM и сети. Бэкенд на FastAPI с worker и SQLite хранит запуски с идемпотентностью; фронтенд на React/TanStack Query показывает обзор, аудиторию, план, сравнение запусков, what-if с исключением предложений и экспорт в CSV/JSON/PDF. Отдельно проведены эксперименты и ablation стратегий.
Ключевые решения
- пилотные кампании с байесовским обновлением оценок (explore-exploit)
- планирование под бюджет и контакты
- what-if анализ
- ablation стратегий
Особенности
Агент работает с учебной средой организаторов через пилоты и неопределённость. Идемпотентный API, восстановление после сбоя, сверка CSV из make_submission с экспортом API побайтно. Обширные e2e-тесты на Playwright.
Стек
Python · FastAPI · Pydantic · SQLite · React · TypeScript · Vite · TanStack Query · Nginx · Docker · Playwright
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-baec897e-uniflow-ai.
README
README.mdOrbitDuo Campaign Studio
Приложение для аналитика маркетинга в кейсе Beeline Tariff Marketing Campaigns: аудит аудитории → пробные кампании → выбор плана → объяснение результата → экспорт. В проекте реализованы React-интерфейс, FastAPI, локальный расчётный агент и история запусков в SQLite. Агент выбирает аудиторию, тариф и канал с учётом бюджета, контактов, пересечений и неопределённости наблюдений.
Все данные синтетические; реальные рассылки не выполняются. Денежные значения
указаны в у.е. (CU). net_arpu_gain — моделируемый прирост выручки за вычетом
расходов на коммуникации. Это не полная прибыль оператора и не доказанный эффект
для реальных абонентов.
Что можно показать
- Обзор: размер аудитории, исходная выручка и конкурсные ограничения.
- Аудитория: группы клиентов, поиск по тарифу, фильтры допуска, сортировка и страницы таблицы; выбранные условия сохраняются в URL.
- Подбор кампаний: сбалансированный или осторожный подход к риску,
номер сценария (
seed), прогресс, фактические пилоты и журнал решений. - Результат: выбранный план, расходы, контакты, уникальный охват, разбор слабых мест и карточка каждого предложения с основаниями выбора.
- История и сравнение: поиск и фильтры среди последних 100 записей, понятные названия, заметки и избранное; сравнение 2–3 запусков по эффекту, ресурсам и составу предложений с проверкой сопоставимости условий.
- Предварительный калькулятор: ползунки аудитории, бюджета и предположений об отклике, мгновенная оценка эффекта, порог окупаемости и сравнение каналов; сохранённые сценарии, ссылки с параметрами и три варианта чувствительности.
- Проверка исключений: убрать предложения из отдельного учебного варианта и пересчитать эффект, расходы и охват с учётом пересечений и порядка исполнения. Сохранённые пилоты учитываются, исходный план остаётся неизменным.
- Экспорт: CSV плана, JSON результата и оформленный отчёт с графиком, выводами и ограничениями; PDF сохраняется через системное окно печати браузера.
Справка с поиском и пояснения показателей доступны на всех экранах. Технические записи можно раскрыть отдельно; экспорт сохраняет исходные поля. Интерфейс предусматривает работу с клавиатурой и мобильный экран.
| Данные результата | Что означают |
|---|---|
forecast — прогноз агента | Оценка эффекта после обновления по пилотам, с неопределённостью |
pilots — наблюдения | Шумные результаты пробных кампаний в учебной среде |
local_evaluation — локальная симуляция | Оценка уже выбранного плана публичным оценщиком |
null означает отсутствие оценки; отрицательные значения сохраняют знак.
Контакты учитывают повторные обращения, уникальный охват — отдельных клиентов.
Разбор результата объясняет сохранённые данные. Отдельная проверка исключений
доступна для завершённого расчёта с подключённой учебной средой; она повторяет
локальную оценку оставшихся предложений и не заменяет прогноз агента.
Несовпадение исходных данных или результата воспроизведения блокирует эксперимент.
Названия, заметки, избранное и сценарии калькулятора хранятся только в текущем браузере. Ссылка на сценарий передаёт параметры без названия и заметки; получателю нужны доступ к приложению и совместимые исходные данные. При сравнении запусков интерфейс отдельно предупреждает, что совпадение версии алгоритма не подтверждено.
Сценарий выступления: показ за 3 минуты.
Структура проекта
| Каталог | Назначение |
|---|---|
| frontend/ | React, TypeScript, Vite, TanStack Query; интерфейс, API-клиент, unit- и Playwright-тесты |
| backend/ | FastAPI, Pydantic, worker расчёта, SQLite, сохранение результатов и экспорт |
| participant_package/agent.py | Конкурсная точка входа Agent().act(env) |
| participant_package/orbitduo/ | Аудит, кандидаты, оценки по пилотам, планировщик и адаптер локальной оценки |
| participant_package/experiments/ | Сравнения стратегий, ablation, проверка воспроизводимости поставки |
| participant_package/reports/ | Измерения и журнал решений; отдельно текущие результаты и архивы |
| docs/ | Архитектура, сценарий показа, API-контракт и матрица приёмки |
| scripts/ | Общий запуск PowerShell и сквозная проверка Docker |
Исходные данные, среда и оценщик организаторов находятся в participant_package/.
Расчётное ядро работает без сети, LLM, GPU, API-ключей и веб-сервера.
Запуск всего приложения через Docker
Из корня проекта, при запущенном Docker Desktop с Linux-контейнерами:
docker compose up -d --build --wait
- Приложение OrbitDuo: http://localhost:8080.
- Предварительный калькулятор: http://localhost:8080/calculator — ползунки аудитории, бюджета и отклика, мгновенная оценка эффекта и сравнение каналов.
- Документация API: http://localhost:8000/docs.
- Проверка состояния:
docker compose ps. - Журнал:
docker compose logs --tail=100 backend frontend. - Остановка с сохранением запусков:
docker compose down.
Frontend работает с настоящим API; демонстрационный режим выключен. Nginx
раздаёт сборку и передаёт /api/v1 backend. SQLite хранится в отдельном Docker
volume и переживает перезапуск/пересоздание контейнеров. docker compose down -v
удаляет этот volume и историю: для обычной остановки флаг -v не нужен.
Порты доступны только на локальной машине. При занятых портах задайте
ORBITDUO_WEB_PORT и ORBITDUO_API_PORT перед запуском, например 8081 и 8001.
Образы Python, Node и Nginx зафиксированы по digest. Оба сервиса выполняются без root с доступом к записи только во временные каталоги и volume базы. На первой сборке интернет нужен для загрузки образов и зависимостей; готовому агенту и приложению внешние сервисы или API-ключи не нужны.
Сквозная проверка Docker из подготовленного Python-окружения:
.\.venv\Scripts\python.exe -m scripts.verify_stack --restart
Она проверяет настоящий API через Nginx, исполнение плана, экспорт, повторный
POST, ETag, SPA-маршруты и сохранность результата после перезапуска backend.
Штатный make_submission.py отдельно запускается в чистом каталоге внутри
Linux-контейнера; его CSV сравнивается с экспортом API побайтно. С локальным
Windows-файлом сравниваются строки CSV: окончания строк платформ различаются.
Локальный запуск без Docker
Команды ниже — для PowerShell из корня репозитория. Docker использует Python 3.13;
в сохранённых локальных проверках использовался также Python 3.14.4.
Frontend требует Node 24.15.0+ в ветке 24 или 26+ и npm. Версии Python-пакетов
зафиксированы в backend/requirements.txt и
participant_package/requirements.txt,
frontend — в frontend/package-lock.json.
Подготовка окружения при первом запуске и после изменения зависимостей:
$env:PYTHONUTF8 = '1'
python -m venv .venv
.\.venv\Scripts\python.exe -m pip install -r participant_package/requirements.txt -r backend/requirements.txt
.\.venv\Scripts\python.exe -m pip check
Push-Location frontend
npm ci
Pop-Location
Для конкурсной части достаточно participant_package/requirements.txt.
Общий запуск frontend и API:
powershell -ExecutionPolicy Bypass -File .\scripts\start-demo.ps1
Скрипт проверяет Python, npm и свободные порты 8000/5173, устанавливает недостающие
зависимости, запускает один backend и Vite с VITE_DEMO_MODE=false.
Он использует корневую .venv, а при её отсутствии — существующую
participant_package/.venv либо создаёт окружение. После обновления зависимостей
выполните подготовку выше: наличие окружения само по себе не обновляет его пакеты.
- Frontend: http://127.0.0.1:5173.
- Swagger: http://127.0.0.1:8000/docs.
- Логи обоих процессов:
backend/data/*.log. - Остановка: Enter в окне скрипта.
- Отдельная БД: параметр
-DatabasePath 'C:\path\orbitduo.sqlite3'.
Для ручного запуска откройте два терминала. В первом, из корня:
.\.venv\Scripts\python.exe -m uvicorn backend.app:app --host 127.0.0.1 --port 8000
Во втором, также из корня:
Set-Location frontend
$env:VITE_DEMO_MODE = 'false'
npm run dev -- --host 127.0.0.1
Vite передаёт /api/v1 на 127.0.0.1:8000. Пример настроек —
frontend/.env.example; VITE_* читаются при старте Vite
или сборке Docker. При недоступном API автоматического перехода на demo нет.
Для разработки интерфейса без backend явно задайте VITE_DEMO_MODE=true перед
запуском Vite. Демо использует fixtures и localStorage; его числа не являются
измерением агента. Сценарии описаны в frontend/README.md.
API, сохранение и восстановление
Один процесс, без --workers. SQLite по умолчанию находится в
backend/data/runs.sqlite3; другой путь задаётся через ORBITDUO_DB_PATH.
ОС-блокировка не допускает второй сервер с той же БД. Миграция существующей базы
сохраняет результаты и ключи идемпотентности. После аварии незавершённые задания
получают failed / SERVER_RESTARTED; готовые результаты остаются доступны.
Расчёт выполняется в выделенном worker, HTTP продолжает отвечать.
Из другого окна PowerShell:
$runKey = [guid]::NewGuid().ToString()
$run = Invoke-RestMethod -Method Post -Uri 'http://127.0.0.1:8000/api/v1/runs' -ContentType 'application/json' -Headers @{ 'Idempotency-Key' = $runKey } -Body '{"seed":42,"risk_profile":"balanced"}'
Invoke-RestMethod "http://127.0.0.1:8000/api/v1/runs/$($run.id)"
Polling примерно раз в секунду до completed или failed. Повтор POST использует
тот же ключ; новый эксперимент — новый ключ. Второй активный расчёт возвращает
409 RUN_ALREADY_ACTIVE. Опциональный If-None-Match с предыдущим ETag
позволяет получить 304, когда результат не изменился.
После завершения доступны /runs/{id}/campaigns.csv и /runs/{id}/report.json.
Экспорт читает сохранённый план и не запускает агента заново.
При обновлении страницы интерфейс открывает тот же run_id. Во время сетевого
сбоя сохраняет последний полученный снимок, показывает приостановку обновления
и повторяет опрос. Повтор создания после потери ответа использует прежний
Idempotency-Key; двойная отправка блокируется. Ошибка RUN_ALREADY_ACTIVE
предлагает перейти к активному запуску.
Проверки
Ниже команды повторного запуска проверок. Сохранённые результаты предыдущих прогонов перечислены отдельно в конце README.
Ядро и backend, из корня после установки зависимостей:
.\.venv\Scripts\python.exe -m pytest participant_package/tests backend/tests -q
.\.venv\Scripts\python.exe -m backend.final_smoke
backend.final_smoke сам запускает сервер на временном порту с отдельной БД,
проверяет balanced/42, CSV, события, идемпотентность, ETag и перезапуск.
Он не изменяет пользовательские запуски. Дополнительный замер хранилища:
.\.venv\Scripts\python.exe -m backend.benchmark_storage.
Frontend, из корня перейти в frontend/:
Set-Location frontend
npm run build
npm run lint
npm run test
npx playwright install chromium
npm run test:e2e
npm run test:e2e:real
| Браузерный набор | Окружение и назначение |
|---|---|
npm run test:e2e | Собственный Vite, явное demo; сценарии UI, ошибки, справка, таблицы и ширины 1440/1280/768/390 px |
npm run test:e2e:real | Собственные FastAPI и Vite, demo выключен, временная SQLite; настоящий расчёт, reload, история, экспорты и сетевые сбои |
npm run test:e2e:live | Уже запущенное приложение; один сценарий с настоящим расчётом и регрессии на сохранённом API-снимке |
Перед test:e2e и test:e2e:real освободите порт 5173, перед вторым — также 8000:
наборы не переиспользуют серверы. Запускайте их последовательно.
Для real-набора нужен Python с зависимостями backend в корневой
.venv/Scripts/python.exe. Другой абсолютный путь задаётся через ORBITDUO_PYTHON
(в том числе .venv/bin/python на Linux).
Вместо установки Chromium можно использовать установленный браузер:
$env:ORBITDUO_BROWSER_CHANNEL = 'msedge' или 'chrome'.
Live-проверка работающего Docker-приложения, из frontend/:
$env:ORBITDUO_BASE_URL = 'http://127.0.0.1:8080'
npm run test:e2e:live
Этот набор добавляет запуск в историю работающего backend. Основной сценарий
не подменяет API и сравнивает оба скачанных файла с экспортом сохранённого запуска.
Дополнительные сценарии читают fixture tests/fixtures/real-run.json через подмену
GET и проверяют тексты, анализ, клавиатуру и мобильный вид.
Сквозная Docker-проверка scripts.verify_stack --restart, описанная выше,
также создаёт запуск и перезапускает backend.
Оценка и submission
Из корня перейти в пакет участника:
$env:PYTHONUTF8 = '1'
Set-Location participant_package
..\.venv\Scripts\python.exe local_eval.py
..\.venv\Scripts\python.exe local_eval.py --runs 10
..\.venv\Scripts\python.exe make_submission.py
$submissionHash = (Get-FileHash -LiteralPath submission.csv -Algorithm SHA256).Hash
..\.venv\Scripts\python.exe make_submission.py
if ((Get-FileHash -LiteralPath submission.csv -Algorithm SHA256).Hash -ne $submissionHash) { throw 'CSV не воспроизводится' }
..\.venv\Scripts\python.exe -m pytest -q
..\.venv\Scripts\python.exe -m orbitduo.evaluation
..\.venv\Scripts\python.exe -m experiments.verify_delivery
local_eval.py перехватывает ошибки агента, поэтому exit code недостаточен.
Строгий adapter дополнительно проверяет 1-10 непустых кампаний, успешные пилоты,
санитаризацию, поля, фактические аудитории и совпадение ресурсов с оценщиком.
verify_delivery проверяет неизменность организаторских файлов относительно
Git HEAD и совпадение submission в чистой копии без backend.
Сдавать agent.py, каталог orbitduo/, requirements.txt, submission.csv
и исторический data/change_tariff.csv, если его нет в поставке организатора.
Без истории предусмотрен нейтральный prior, но для повторения результатов нужны
те же входные CSV. Точка входа — Agent().act(env).
Balanced/42 через API использует ту же конфигурацию.
Конкурсные ограничения: 1–10 финальных кампаний, минимум один успешный пилот,
до 20 пилотов с запрашиваемым размером 10–200 клиентов, до 5 000 клиентов
на кампанию. Общий бюджет — 100 000 у.е., лимит — 15 000 контактов, включая
пилоты и повторы. Доступны push, sms, digital_ads, call.
Агент читает фактические остатки из публичной среды. Организаторские скрипты
и исходные CSV сохраняются неизменными.
Что улучшено во второй версии
Пилоты уточняют не только эффект предложения, но и степень доверия к истории и масштаб неопределённости. Разведка сравнивает размеры выборок, учитывает цену информации и обычно сохраняет 80% бюджета для финала. Fallback при отрицательных оценках выбирает минимальный ущерб по той же риск-цели.
Планировщик кэширует аудитории и суммы по префиксам, пересчитывая только затронутые
группы. На замороженном posterior тот же план получен за 0.076 с вместо 0.613 с
(около 8 раз быстрее; измерен именно шаг планирования). Дополнительный поиск
каналов/порядка включён после более широкого парного сравнения сценариев:
первые три seed не показали разницы, но на других семействах выигрыш обнаружен.
Вариант без расширения доступен как Agent(advanced_search=False).
Backend сохраняет неизменяемые завершённые результаты, стабильные события, версию snapshot и краткие сводки для списка. В отдельном измерении списка из 100 запусков чтение ускорилось с 62.05 до 7.86 мс. Это скорость хранилища, а не всей HTTP-операции.
Подробнее: математика и допущения, конкурсный контракт.
Измерения и ограничения
Аудит: 23 441 клиент, 21 тариф, baseline 150 641 084.25 CU. Для адресных кандидатов пригодна 23 341 строка; 100 исключены с учётом причин. Пересечение ID исторической и целевой аудитории равно нулю.
Сравнение v1/v2 содержит среднее, медиану, минимум, p10, стоимость, контакты, охват, пилоты и время. В нём явно сохранены ухудшения и границы независимости контрольных выборок. Каталог отчётов различает текущие измерения, архив v1 и промежуточную v2 с расширенным поиском.
После фиксации стратегии проверены mock-seed 40, 41, 43, 44, 45. При переименовании в OrbitDuo обе версии повторно запущены: результаты совпали, время измерено заново при параллельной проверке Docker. Повтор не считается новой независимой выборкой.
| Версия | Средний net, CU | Средние расходы, CU | Среднее act(), с |
|---|---|---|---|
| v1 | 756 162.67 | 99 912.80 | 10.30 |
| v2 | 1 255 793.25 | 36 965.60 | 4.58 |
В этой серии средний net вырос примерно на 66%; обе версии дали положительные результаты во всех пяти запусках. Это малая выборка шума той же mock-модели, не гарантия переноса на неизвестные эффекты. Другие серии содержат ухудшения.
Стандартный seed 42: net 431 321.12 CU, расходы 20 000, контакты 10 355, уникальный охват 8 620, 16 пилотов и 5 финальных кампаний. В v1 на этом seed было 928 158.79 CU при расходах 99 646: улучшение среднего не означает улучшения каждого запуска.
Смена seed проверяет шум одной mock-модели. Дополнительные семейства меняют истинные эффекты, однако гарантии на неизвестной модели нет. Возможны убытки при слабых эффектах и перестановке лидеров. Пересечения с пилотами приближённые, posterior-прогноз не откалиброван как гарантированный интервал. Conservative также не гарантирует положительного результата.
Сохранённые отчёты и документация
Отчёты относятся к указанным в них версиям и прогонам. Они не означают, что все проверки повторялись при каждом изменении README. Ранние сводки содержат меньше тестов, чем добавленные позднее наборы интерфейса.
| Документ | Содержание |
|---|---|
| Калькулятор, 23.09.2026 | Сборка и lint; 144 unit-теста, 24 demo-сценария и 5 live-сценариев, включая расчёт по актуальному API |
| Понятность интерфейса, 23.09.2026 | Сборка и lint; 91 различный unit-тест и 17 demo-сценариев с описанием исправлений и частичных повторов; 4/4 live-сценария |
| Проверка UI/UX, 23.09.2026 | Предыдущий этап интерфейса, адаптивность, навигация, справка и скриншоты |
| Проверка поставки ядра | Команды, среда, тесты и воспроизводимость конкурсного результата |
| Docker-приёмка | API через nginx, независимая генерация CSV в Linux, экспорт и сохранность после рестарта |
| HTTP smoke | Настоящий HTTP, идемпотентность, ETag и сохранённые результаты |
| Архитектура | Границы агента, адаптера, worker, хранилища и интерфейса |
| API-контракт | DTO, статусы, ошибки, ограничения и экспорт |
| Матрица приёмки | Соответствие требованиям и ссылки на свидетельства проверок |
| Сценарий показа | Демонстрация от задачи до экспорта за три минуты |
В Docker-отчёте CSV сравнивается побайтно с независимой генерацией внутри Linux; с Windows сравниваются разобранные строки из-за различий окончаний строк. Повтор POST после перезапуска должен возвращать прежний результат по сохранённому ключу идемпотентности. Для повторения проверок используйте команды выше.
Авторы коммитов
История коммитов
- 2026-09-23 17:58Add scenario library, run comparison, what-if analysis and PDF reportsYerasyl Aikenov
- 2026-09-23 17:40Add interactive campaign effect calculator with guided scenariosYerasyl Aikenov
- 2026-09-23 17:40Remove stored access credentials from page snapshotYerasyl Aikenov
- 2026-09-23 17:34docs: refresh OrbitDuo project overview and runbookSherloock077
- 2026-09-23 17:25Complete OrbitDuo UI, Docker setup, branding and validation reportsYerasyl Aikenov
- 2026-09-23 16:17Preserve and update remaining agent experimentsSherloock077
- 2026-09-23 16:13Integrate real Campaign Studio demo and browser coverageSherloock077
- 2026-09-23 15:54Publish final evaluation reports and update project documentationYerasyl Aikenov
Все коммиты (16)
- 2026-09-23 15:49Update completed experiment reportsYerasyl Aikenov
- 2026-09-23 15:48Implement campaign agent and backend with tests and reportsYerasyl Aikenov
- 2026-09-23 15:33Rename product branding to OrbitDuoSherloock077
- 2026-09-23 15:26Build UniFlow Campaign Studio frontendSherloock077
- 2026-09-23 14:53Add team API contract and frontend/backend implementation promptsYerasyl Aikenov
- 2026-09-23 14:51Add project-specific AI development skillYerasyl Aikenov
- 2026-09-23 14:38Add project scaffoldSherloock077
- 2026-09-23 13:48Add Beeline case materialsSherloock077
Структура репозитория (382 файлов)
.dockerignore .gitignore HackAlem AI_ Beeline Tariff Marketing Campaigns Case.docx README.md backend/.gitignore backend/Dockerfile backend/README.md backend/__init__.py backend/app.py backend/benchmark_storage.py backend/final_smoke.py backend/locking.py backend/models.py backend/reports/docker_acceptance.json backend/reports/http_final_smoke.json backend/reports/http_hardening_smoke.json backend/reports/http_smoke.json backend/reports/storage_benchmark.json backend/requirements.txt backend/smoke.py backend/storage.py backend/tests/test_api.py backend/tests/test_integration.py backend/tests/test_whatif.py backend/whatif.py backend/whatif_models.py backend/worker.py beeline_case_participants (1).zip beeline_solution_and_codex_prompt.md compose.yaml docs/ACCEPTANCE.md docs/ARCHITECTURE.md docs/DEMO.md docs/team/API_CONTRACT.md docs/team/BACKEND_PROMPT.md docs/team/FRONTEND_PROMPT.md docs/team/INTEGRATION_PROMPT.md docs/team/WHAT_IF_API.md frontend/.dockerignore frontend/.env.example frontend/.gitignore frontend/Dockerfile frontend/README.md frontend/eslint.config.js frontend/index.html frontend/nginx.conf frontend/package-lock.json frontend/package.json frontend/playwright.config.ts frontend/playwright.live.config.ts frontend/playwright.real.config.ts frontend/public/favicon.svg frontend/reports/acceptance.json frontend/reports/calculator-desktop.png frontend/reports/calculator-mobile.png frontend/reports/calculator-validation.md frontend/reports/plain-analysis.png frontend/reports/plain-language-validation.md frontend/reports/plain-mobile-analysis.png frontend/reports/plain-mobile.png frontend/reports/plain-research.png frontend/reports/plain-result-desktop.png frontend/reports/ui-ux-validation.md frontend/reports/ui/audience-1440.png frontend/reports/ui/help-1440.png frontend/reports/ui/help-390.png frontend/reports/ui/new-run-1440.png frontend/reports/ui/new-run-390.png frontend/reports/ui/overview-1440.png frontend/reports/ui/overview-390.png frontend/reports/ui/overview-live-1440.png frontend/reports/ui/result-1440.png frontend/reports/ui/result-390.png frontend/scripts/generate_demo_overview.py frontend/src/app/AppRoutes.tsx frontend/src/app/RouteStates.tsx frontend/src/app/Shell.tsx frontend/src/app/routeModules.ts frontend/src/components/ui/HelpCenter.tsx frontend/src/components/ui/TechnicalDetails.tsx frontend/src/components/ui/common.tsx frontend/src/features/audience/AudiencePage.tsx frontend/src/features/audience/exploration.css frontend/src/features/calculator/CalculatorPage.tsx frontend/src/features/calculator/CalculatorPromo.tsx frontend/src/features/calculator/ScenarioLibrary.tsx frontend/src/features/calculator/SensitivityScenarios.tsx frontend/src/features/calculator/calculator.css frontend/src/features/calculator/calculatorScenarioStore.ts frontend/src/features/overview/OverviewPage.tsx frontend/src/features/reports/RunReportPage.tsx frontend/src/features/reports/run-report.css frontend/src/features/runs/CampaignWhatIf.tsx frontend/src/features/runs/CompareRunsPage.tsx frontend/src/features/runs/NewRunPage.tsx frontend/src/features/runs/ResearchActivity.tsx frontend/src/features/runs/RunAnalysis.tsx frontend/src/features/runs/RunNotebook.tsx frontend/src/features/runs/RunPage.tsx frontend/src/features/runs/RunsPage.tsx frontend/src/features/runs/campaign-what-if.css frontend/src/features/runs/research-activity.css frontend/src/features/runs/run-analysis.css frontend/src/features/runs/run-experience.css frontend/src/features/runs/run-organization.css frontend/src/lib/api/client.ts frontend/src/lib/api/types.ts frontend/src/lib/api/whatIf.ts frontend/src/lib/explanations.ts frontend/src/lib/format.ts frontend/src/lib/runAnalysis.ts frontend/src/lib/runComparison.ts frontend/src/lib/runNotes.ts frontend/src/lib/scenarioCalculator.ts frontend/src/main.tsx frontend/src/mocks/fixtures.ts frontend/src/mocks/overview.json frontend/src/mocks/transport.ts frontend/src/studio.css frontend/src/styles.css frontend/src/vite-env.d.ts frontend/tests/client.test.ts frontend/tests/connection.test.tsx frontend/tests/demo-resilience.test.ts frontend/tests/demo.test.ts frontend/tests/e2e/calculator.spec.ts frontend/tests/e2e/exploration.spec.ts frontend/tests/e2e/flow.spec.ts frontend/tests/e2e/guidance.spec.ts frontend/tests/e2e/report.spec.ts frontend/tests/e2e/responsive.spec.ts frontend/tests/e2e/run-organization.spec.ts frontend/tests/e2e/scenario-library.spec.ts frontend/tests/explanations.test.ts frontend/tests/fixtures/real-run.json frontend/tests/format.test.ts frontend/tests/live/api-flow.spec.ts frontend/tests/live/calculator.spec.ts frontend/tests/live/plain-language.spec.ts frontend/tests/live/what-if.spec.ts frontend/tests/new-run.test.tsx frontend/tests/real/flow.spec.ts frontend/tests/real/teardown.ts frontend/tests/run-analysis.test.tsx frontend/tests/run-comparison.test.tsx frontend/tests/run-notes.test.tsx frontend/tests/run-page.test.tsx frontend/tests/scenario-calculator.test.ts frontend/tests/scenario-library.test.tsx frontend/tests/setup.ts frontend/tests/what-if.test.tsx frontend/tsconfig.app.json frontend/tsconfig.json frontend/tsconfig.node.json frontend/vite.config.ts participant_package/PARTICIPANT_GUIDE.md participant_package/PARTICIPANT_GUIDE.pdf participant_package/agent.py participant_package/agent_template.py participant_package/customer_profile.csv participant_package/data/arpu_monthly.csv participant_package/data/change_tariff.csv participant_package/data/dict_tariff.csv participant_package/data/traffic.csv participant_package/docs/approach.md participant_package/docs/contract.md participant_package/environment.py participant_package/experiments/README.md participant_package/experiments/__init__.py participant_package/experiments/archive/pre_branding.tar.gz participant_package/experiments/benchmark.py participant_package/experiments/capture_decision_trace.py participant_package/experiments/data_audit.py participant_package/experiments/diverse_fixed.py participant_package/experiments/improvement.py participant_package/experiments/overlap_sensitivity.py participant_package/experiments/planner_benchmark.py participant_package/experiments/portfolio_refinement.py participant_package/experiments/publish_reports.py participant_package/experiments/reference_v1/__init__.py participant_package/experiments/reference_v1/agent_core.py participant_package/experiments/reference_v1/candidates.py participant_package/experiments/reference_v1/manifest.json participant_package/experiments/reference_v1/portfolio.py participant_package/experiments/reference_v1/posterior.py participant_package/experiments/run_ablations.py participant_package/experiments/run_benchmarks.py participant_package/experiments/scenario_harness.py participant_package/experiments/search_objective_check.py participant_package/experiments/sensitivity.py participant_package/experiments/summarize.py participant_package/experiments/v2_ablation.py participant_package/experiments/verify_delivery.py participant_package/feature_dictionary.csv participant_package/local_eval.py participant_package/make_submission.py participant_package/mock_environment.py participant_package/orbitduo/__init__.py participant_package/orbitduo/agent_core.py participant_package/orbitduo/audit.py participant_package/orbitduo/candidates.py participant_package/orbitduo/evaluation.py participant_package/orbitduo/portfolio.py participant_package/orbitduo/posterior.py participant_package/orbitduo/service_data.py participant_package/reports/README.md participant_package/reports/ablation.csv participant_package/reports/ablation_summary.json participant_package/reports/advanced_vs_simple.csv participant_package/reports/advanced_vs_simple_summary.json participant_package/reports/baseline.csv participant_package/reports/baseline_summary.json participant_package/reports/benchmark.csv participant_package/reports/benchmark_report.md participant_package/reports/benchmark_summary.json participant_package/reports/branding_migration.json participant_package/reports/branding_revalidation.json participant_package/reports/conservative_check.json participant_package/reports/data_audit.json participant_package/reports/decision_trace.json participant_package/reports/delivery_verification.json participant_package/reports/diverse_fixed.csv participant_package/reports/diverse_fixed_decision.md participant_package/reports/diverse_fixed_summary.json participant_package/reports/environment.json participant_package/reports/experiment_environment.json participant_package/reports/historical_cache/improvement_final_holdout_reference.csv participant_package/reports/historical_cache/improvement_final_holdout_reference_manifest.json participant_package/reports/historical_cache/improvement_model_holdout_reference.csv participant_package/reports/historical_cache/improvement_model_holdout_reference_manifest.json participant_package/reports/historical_cache/improvement_reference.csv participant_package/reports/historical_cache/improvement_reference_manifest.json participant_package/reports/improvement.csv participant_package/reports/improvement_baseline_full.csv participant_package/reports/improvement_baseline_full_summary.json participant_package/reports/improvement_final_holdout.csv participant_package/reports/improvement_final_holdout_reference.csv participant_package/reports/improvement_final_holdout_reference_manifest.json participant_package/reports/improvement_final_holdout_summary.json participant_package/reports/improvement_model_holdout.csv participant_package/reports/improvement_model_holdout_reference.csv participant_package/reports/improvement_model_holdout_reference_manifest.json participant_package/reports/improvement_model_holdout_summary.json participant_package/reports/improvement_quick.csv participant_package/reports/improvement_quick_checkpoint1.csv participant_package/reports/improvement_quick_checkpoint1_summary.json participant_package/reports/improvement_quick_risk055.csv participant_package/reports/improvement_quick_risk055_summary.json participant_package/reports/improvement_quick_summary.json participant_package/reports/improvement_reference.csv participant_package/reports/improvement_reference_manifest.json participant_package/reports/improvement_report.md participant_package/reports/improvement_search_comparison.csv participant_package/reports/improvement_search_comparison.json participant_package/reports/improvement_summary.json participant_package/reports/overlap_sensitivity.csv participant_package/reports/overlap_sensitivity.json participant_package/reports/planner_benchmark.json participant_package/reports/portfolio_refinement.json participant_package/reports/prior_sensitivity.csv participant_package/reports/prior_sensitivity_summary.json participant_package/reports/publication_manifest.json participant_package/reports/scenarios.csv participant_package/reports/scenarios_summary.json participant_package/reports/search_objective_check.json participant_package/reports/sensitivity_notes.json participant_package/reports/v1/ablation.csv participant_package/reports/v1/ablation_summary.json participant_package/reports/v1/baseline.csv participant_package/reports/v1/baseline_summary.json participant_package/reports/v1/benchmark.csv participant_package/reports/v1/benchmark_report.md participant_package/reports/v1/benchmark_summary.json participant_package/reports/v1/conservative_check.json participant_package/reports/v1/data_audit.json participant_package/reports/v1/decision_trace.json participant_package/reports/v1/delivery_verification.json participant_package/reports/v1/diverse_fixed.csv participant_package/reports/v1/diverse_fixed_decision.md participant_package/reports/v1/diverse_fixed_summary.json participant_package/reports/v1/environment.json participant_package/reports/v1/experiment_environment.json participant_package/reports/v1/overlap_sensitivity.csv participant_package/reports/v1/overlap_sensitivity.json participant_package/reports/v1/portfolio_refinement.json participant_package/reports/v1/prior_sensitivity.csv participant_package/reports/v1/prior_sensitivity_summary.json participant_package/reports/v1/scenarios.csv participant_package/reports/v1/scenarios_summary.json participant_package/reports/v1/sensitivity_notes.json participant_package/reports/v1/validation.json participant_package/reports/v2_ablation.csv participant_package/reports/v2_ablation_notes.json participant_package/reports/v2_ablation_summary.json participant_package/reports/v2_advanced/improvement.csv participant_package/reports/v2_advanced/improvement_baseline_full.csv participant_package/reports/v2_advanced/improvement_baseline_full_summary.json participant_package/reports/v2_advanced/improvement_model_holdout.csv participant_package/reports/v2_advanced/improvement_model_holdout_reference.csv participant_package/reports/v2_advanced/improvement_model_holdout_reference_manifest.json participant_package/reports/v2_advanced/improvement_model_holdout_summary.json participant_package/reports/v2_advanced/improvement_quick.csv participant_package/reports/v2_advanced/improvement_quick_checkpoint1.csv participant_package/reports/v2_advanced/improvement_quick_checkpoint1_summary.json participant_package/reports/v2_advanced/improvement_quick_risk055.csv participant_package/reports/v2_advanced/improvement_quick_risk055_summary.json participant_package/reports/v2_advanced/improvement_quick_summary.json participant_package/reports/v2_advanced/improvement_reference.csv participant_package/reports/v2_advanced/improvement_reference_manifest.json participant_package/reports/v2_advanced/improvement_report.md participant_package/reports/v2_advanced/improvement_summary.json participant_package/reports/v2_advanced/v2_ablation.csv participant_package/reports/v2_advanced/v2_ablation_notes.json participant_package/reports/v2_advanced/v2_ablation_summary.json participant_package/reports/v2_simple/improvement.csv participant_package/reports/v2_simple/improvement_archive_note.md participant_package/reports/v2_simple/improvement_baseline_full.csv participant_package/reports/v2_simple/improvement_baseline_full_summary.json participant_package/reports/v2_simple/improvement_final_holdout.csv participant_package/reports/v2_simple/improvement_final_holdout_reference.csv participant_package/reports/v2_simple/improvement_final_holdout_reference_manifest.json participant_package/reports/v2_simple/improvement_final_holdout_summary.json participant_package/reports/v2_simple/improvement_model_holdout.csv participant_package/reports/v2_simple/improvement_model_holdout_reference.csv participant_package/reports/v2_simple/improvement_model_holdout_reference_manifest.json participant_package/reports/v2_simple/improvement_model_holdout_summary.json participant_package/reports/v2_simple/improvement_quick.csv participant_package/reports/v2_simple/improvement_quick_checkpoint1.csv participant_package/reports/v2_simple/improvement_quick_checkpoint1_summary.json participant_package/reports/v2_simple/improvement_quick_risk055.csv participant_package/reports/v2_simple/improvement_quick_risk055_summary.json participant_package/reports/v2_simple/improvement_quick_summary.json participant_package/reports/v2_simple/improvement_reference.csv participant_package/reports/v2_simple/improvement_reference_manifest.json participant_package/reports/v2_simple/improvement_report.md participant_package/reports/v2_simple/improvement_summary.json participant_package/reports/validation.json participant_package/requirements.txt participant_package/scoring_core.py participant_package/submission.csv participant_package/tariff_dictionary.csv participant_package/tests/conftest.py participant_package/tests/test_agent.py participant_package/tests/test_agent_contract.py participant_package/tests/test_audit_adapter.py participant_package/tests/test_calibrated_posterior.py participant_package/tests/test_inference_candidates.py participant_package/tests/test_portfolio.py participant_package/tests/test_public_mechanics.py participant_package/tests/test_v2.py scripts/start-demo.ps1 scripts/verify_stack.py skill.md Промпт для Codex решения.html Промпт для Codex решения_files/FormattedText-j6xa3r87.css Промпт для Codex решения_files/ansi-1f6vhsjh.css Промпт для Codex решения_files/app-block-trigger-actions-hxl87txx.css Промпт для Codex решения_files/client-defined-widget-gdqdmhro.css Промпт для Codex решения_files/code-block-dop2czwo.css Промпт для Codex решения_files/conversation-small-h5tbcwbw(1).css Промпт для Codex решения_files/conversation-small-h5tbcwbw.css Промпт для Codex решения_files/cot-message-chunk-b8hse3v2.css Промпт для Codex решения_files/cot-v5-cwqe3unp.css Промпт для Codex решения_files/favicons Промпт для Codex решения_files/frame.html Промпт для Codex решения_files/global-modals-ml4if1tf.css Промпт для Codex решения_files/library-new-menu-nob9j3zc.css Промпт для Codex решения_files/lightbox-b1e7tsj7.css Промпт для Codex решения_files/ma.png Промпт для Codex решения_files/model-reasoning-effort-slider-gjxuripq.css Промпт для Codex решения_files/react-elopj9y2.css Промпт для Codex решения_files/root-ikky18n3(1).css Промпт для Codex решения_files/root-ikky18n3.css Промпт для Codex решения_files/root-izi12y3s.css Промпт для Codex решения_files/sdk(1).js.Без названия Промпт для Codex решения_files/sdk.js.Без названия Промпт для Codex решения_files/table-components-b39fqymt.css Промпт для Codex решения_files/user-markdown-formatted-text-nfjbrik7.css Промпт для Codex решения_files/wham-terminal-citation-renderer-nf9y3qm4.css Промпт для Codex решения_files/writing-block-gwgymy54.css Промпт для Codex решения_files/writing-block-provider-lbnz1gc0.css Текстовый документ.txt
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.