О проекте
Команда: CtrlX
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Доведённый продукт
Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным
Суть
Агент почасово прогнозирует выработку ВЭС «Нурлы» (2 турбины Goldwind) на 48 часов с полосой неопределённости p10–p90, пересчитывает прогноз на свежих прогонах погоды и выдаёт диспетчеру сводку и черновик суточной заявки.
Как устроено
История турбин с шагом 10 минут приводится к часам (SCADA UTC+5 переводится в UTC, отмечаются дыры и простои). Агент берёт архивные прогнозы Open-Meteo Previous Runs (best_match, gfs_seamless) и против утечки выбирает только разрешённое поле previous_dayN. Модели: кривая мощности (MOS), HistGradientBoostingRegressor с квантильной потерей и конформной калибровкой (CQR), климатология как последний fallback. Детерминированный цикл plan → fetch_weather → validate → prepare → run_model → analyze → recompute_if_updated → write_report пишет каждый шаг в agent_log.jsonl и через 12 ч перевыпускает ревизию; LLM только переписывает сводку, и каждое число в ней сверяется с фактами. Бэктест: 28 выпусков по 48 ч, FastAPI и Next.js UI.
Ключевые решения
- HistGradientBoostingRegressor
- quantile regression p10/p90
- conformalized quantile regression (CQR)
- power curve MOS
- climatology fallback
- leak-safe previous-runs selection
- fallback ladder
- drift detection
- backtest
Метрики
holdout-метрики за январь 2026 и февраль 2025 в сравнении с наивным прогнозом (числовые значения в видимой части README не приведены)
Особенности
Строгая защита от утечки данных: для каждого часа выбирается прогноз погоды, реально доступный на момент выпуска, с учётом задержки публикации ECMWF. Выпуски привязаны к правилам оптового рынка РК (заявка до 08:00, корректировка за 2 ч). Вклад агентского слоя измерен отдельно, есть второй погодный источник для переключения при сбое. 261 коммит команды из трёх человек, координация через «chat»-коммиты и skills для AI-агентов.
Стек
Python · uv · FastAPI · pydantic · pandas · pyarrow · scikit-learn · Open-Meteo API · Next.js · Docker · Vercel · Railway · pytest · ruff
Модели
OpenAI-compatible LLM (OpenAI / NVIDIA)
Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-17c230f8-ctrlx.
README
README.mdWindCast — agentic-прогноз выработки ВЭС на 24–48 часов
Диспетчер ветропарка получает почасовой прогноз выработки на двое суток вперёд — с полосой неопределённости, обоснованием каждого шага агента и проверкой допустимости погодных данных по принятому правилу исторической доступности. Трек «Энергетика», кейс: «Agentic AI для прогнозирования выработки ВЭС», кейсодатель АО «Самрук-Казына» (docs/TASK.md).
- Демо: платформа — https://ctrlx-hackalem.vercel.app; лёгкая страница и API — https://windcast-api-production.up.railway.app (та же страница, что на localhost:8000; Swagger —
/docs; без логина). Локальный запуск — раздел «Установка и запуск», ключи не нужны.
Краткое описание
В Казахстане на ВЭС приходится около 82% всех дисбалансов возобновляемой генерации, а почасовое отклонение факта от заявленного графика достигает ~50% (QazaqGreen, 2025). График на сутки вперёд подаётся до 08:00, скорректировать его можно лишь за два часа — значит цена ошибки прогноза платится деньгами за дисбаланс.
WindCast закрывает этот разрыв: по координатам парка агент сам забирает архивные прогнозы погоды, приводит историю турбин к часам, считает выработку, оценивает результат и пересчитывает прогноз, когда приходит свежий прогон погоды.
Объект кейса — вся ВЭС «Нурлы» 5 МВт (2 × Goldwind GW109/2500, ТОО «Samruk-Green Energy», дочка «Самрук-Энерго»): координаты из ТЗ совпадают с турбинами в OpenStreetMap с точностью до 10 м. Выпуск делается в полночь по итогам дня D; его вторые сутки (D+2) — готовый черновик суточной заявки, которую ВИЭ подаёт до 08:00 D+1, а пересчёт в 12:00 — внутрисуточная корректировка не позже чем за 2 часа до часа (Правила оптового рынка, п. 51, 97–99). Сравнение с наивным прогнозом — в таблице метрик ниже. Полное описание решения, архитектуры и источников — docs/SOLUTION.md.
При воспроизведении прошлого выбираются архивные прогнозные поля по правилу config.safe_previous_day, а не фактическая погода за целевой час. Время публикации оценивается с принятой задержкой: это допущение, а не полный исторический журнал источника. Тесты проверяют соблюдение правила; график и таблица происхождения показывают выбранные поля, но сами по себе отсутствие утечки не доказывают.
Что реализовано
- R1 — история двух турбин с шагом 10 минут приведена к часам: время SCADA (фиксированный UTC+5) → UTC, флаги дыр и простоев.
- R2 — агент сам получает архивные прогнозы Open-Meteo Previous Runs по координатам парка; кэш-first, по умолчанию без сети; правило day1/day2/day3 против утечки, проверенное тестом.
- R3 — три модели: кривая мощности (MOS), градиентный бустинг с квантилями p10/p90 и конформной калибровкой, климатология как последний рубеж.
- R4 — ретроспектива: 28 выпусков за тестовый период, по 48 часов каждый.
- R5 — agentic-цикл замкнут, и вклад агентского слоя измерен — раздел «Как проверить агентность».
- R6 — воспроизводимость: расчёт без ключей и без сети после установки, тесты, линтер, smoke со свежего клона.
- R7 — метрики на валидационных периодах: январь 2026 и февраль 2025; значения и ограничения — в таблице ниже.
- R8 — API по контракту и одностраничный интерфейс: выбор выпуска, график 48 ч с полосой p10–p90, лента шагов агента, сводка диспетчеру, таблица метрик.
- R10 — второй источник погоды
gfs_seamless: переключение при провале валидации доказано вoutputs/evidence/faults.json.
Частично: R9 — сводку диспетчеру может переписывать LLM (OpenAI или NVIDIA, второй провайдер — запасной); каждое число в тексте LLM сверяется с фактами выпуска, иначе остаётся шаблон. Без ключа работает шаблон. Статусы по каждому требованию — в таблице «Трассировка требований».
Как работает решение
- Выпуск. «Прогноз на день D» делается в D+1 00:00 по Алматы: наблюдения доступны до D 23:50, горизонт — следующие 48 часов (0–23 ч — текущие сутки D+1, 24–47 ч — сутки D+2, черновик заявки до 08:00).
- Погода. Агент берёт из кэша (или, с
--refresh, из Open-Meteo) архивные прогоны для координат парка и на каждый целевой час выбирает разрешённое полеprevious_dayN. - Подготовка. История двух турбин с шагом 10 минут приводится к часам: время SCADA (UTC+5) → UTC, флаги дыр и простоев; признаки из прогноза погоды на 48 часов.
- Модель. По прогнозному ветру считается выработка каждой турбины и парка, плюс квантили p10/p90 как мера неопределённости.
- Анализ. Агент проверяет результат (диапазон, скачки, покрытие часов) и при провале спускается по лестнице фолбэков: другой источник погоды → кривая мощности → климатология, записывая решение и причину.
- Пересчёт. Через 12 часов после выпуска появляются более свежие прогоны — агент перевыпускает прогноз (ревизия 1) на часы, которые ещё разрешено корректировать (не раньше чем через 2 ч). На графике видно и новую кривую, и то, что она заменила.
- Самопроверка. Агент сравнивает свои опубликованные выпуски с фактом, когда он появляется, и поднимает флаг дрейфа с рекомендацией переобучения; модель молча не меняется. В тестовом феврале факта нет — агент честно пишет, что память заморожена на 31.01.
Технологии
| Слой | Решение |
|---|---|
| Язык | Python 3.12, менеджер зависимостей uv (версии зафиксированы в uv.lock) |
| API и страница | FastAPI 0.141, pydantic 2.13, статика без сборки — инлайновый SVG, ноль внешних запросов |
| Данные | pandas 3.0, pyarrow (parquet) |
| Модели | scikit-learn (HistGradientBoostingRegressor, квантильная потеря + CQR) — намеренно без нативных зависимостей: LightGBM требует системный OpenMP, которого нет в lock-файле |
| Погода | Open-Meteo Previous Runs API, модели best_match и gfs_seamless |
| LLM (опционально) | OpenAI-совместимый клиент openai — только для сводки диспетчеру; без ключа работает шаблон |
| Проверки | pytest, ruff, scripts/smoke.sh |
Архитектура проекта
flowchart LR
CLI[CLI: forecast / backtest] --> AG[Агент-оркестратор]
UI[Страница] --> API[FastAPI /api]
API --> AG
AG --> WX[app.weather<br/>Open-Meteo Previous Runs]
WX -. кэш-first .-> CACHE[(data/weather_cache)]
AG --> DATA[app.data<br/>часовые ряды турбин]
AG --> MODEL[app.models<br/>power_curve / GBM]
MODEL -. провал валидации .-> PC[фолбэк: кривая мощности]
AG --> OUT[(outputs/forecasts<br/>runs/agent_log.jsonl)]
API --> OUT
Агент — детерминированный цикл plan → fetch_weather → validate_weather → prepare → run_model → analyze → recompute_if_updated → write_report. Каждый шаг пишет строку в runs/<run_id>/agent_log.jsonl со статусом, решением и причиной, поэтому любой вывод можно проследить до данных. API только читает результаты с диска и потому не зависит от того, чем именно был получен прогноз; страница целиком строится на этих же публичных эндпоинтах.
Установка и запуск
Быстрый старт (без ключей)
uv sync --frozen
uv run python -m app.cli backtest # 28 выпусков 31.01–27.02 заново
uv run uvicorn app.main:app --port 8000 # http://localhost:8000
Откроются 28 выпусков февраля 2026, посчитанные агентом: график, лента шагов агента, сводка диспетчеру, точность и доказательства агентности. Готовые результаты уже лежат в репозитории (outputs/, runs/), вторая команда пересчитывает их с сохранённой моделью. Первая установка требует интернет или заполненный кэш зависимостей; дальнейший расчёт работает из погодного кэша без сети. Проверка полного обучения с нуля описана ниже. Без LLM_API_KEY проект работает в DEMO-режиме — прогноз считается кодом, сводка собирается шаблоном; LLM-сводка не меняет числовой прогноз. Отдельный диагностический супервизор описан в docs/AGENTIC.md.
Платформа для диспетчера (по желанию)
Веб-интерфейс на Next.js поверх того же API: февраль по часам, прогноз на 48 часов с уточнением в 12:00, заявка на завтра в МВт·ч с выгрузкой CSV, шаги агента, точность, вопрос агенту и раздел для ИТ-службы. Без него решение работает полностью.
uv run uvicorn app.main:app --port 8000 # терминал 1: API
cd web && pnpm install && pnpm build && pnpm start # терминал 2: http://localhost:3000
Нужны Node.js 22+ и pnpm 11 (corepack enable). Адрес API задаёт WINDCAST_API_URL, по умолчанию http://localhost:8000; запросы /api/* проксируются, CORS не нужен.
Установка
- Требования: Python 3.12 и uv — или pip, или Docker
uv sync(версии зафиксированы вuv.lock); без uv:pip install -r requirements.txt- Docker:
docker build -t ctrlx . && docker run -p 8000:8000 ctrlx - Ключи — по желанию:
cp .env.example .env.local
Запуск
- API и страница:
uv run uvicorn app.main:app --port 8000→ http://localhost:8000 - Один выпуск:
uv run python -m app.cli forecast --issue 2026-01-31 - Ретроспектива за февраль:
uv run python -m app.cli backtest --from 2026-01-31 --to 2026-02-27 - Обучение моделей:
uv run python -m app.cli train - Метрики на отложенном месяце:
uv run python -m app.cli evaluate --holdout 2026-01 - Тесты и линтер:
uv run pytest -q && uv run ruff check . - Живая сверка архивного окна с источником (нужна сеть): добавить
--refresh; это не режим прогнозирования на сегодняшнюю дату.
Зависимости
Список — pyproject.toml / requirements.txt: fastapi, uvicorn, pydantic, pandas, pyarrow, scikit-learn, openai, python-dotenv; разработка — pytest, httpx, ruff.
Переменные окружения
| Переменная | Обязательна | По умолчанию | Назначение |
|---|---|---|---|
DEMO_MODE | нет | auto | auto — LLM, если заданы ключ и модель; 1 — всегда без LLM |
LLM_API_KEY | нет | — | ключ OpenAI или NVIDIA; без него включается DEMO-режим |
LLM_BASE_URL | нет | https://api.openai.com/v1 | для NVIDIA: https://integrate.api.nvidia.com/v1 |
LLM_MODEL | с ключом | — | имя модели |
LLM_FALLBACK_API_KEY, LLM_FALLBACK_BASE_URL, LLM_FALLBACK_MODEL | нет | — | второй провайдер: вызывается, если первый не ответил |
Как проверить решение
- На развёрнутой версии (без установки, 2 минуты): https://ctrlx-hackalem.vercel.app → «Прогноз на 48 ч». Любой февральский день — готовый выпуск с графиком и лентой шагов агента; «Пересчитать» повторяет прогон на сервере. Новые данные: в поле «Новая дата» выбрать любой прошедший день после февраля (например, вчера) → «Прогноз на новую дату»: агент сам запросит у Open-Meteo архивные прогоны, доступные на момент выпуска, и через 3–5 с покажет прогноз на 48 ч и журнал, где в шаге «fetch_weather» видно «архив не покрывает этот выпуск — окно погоды докачано». Завтрашняя дата честно отклоняется: выпуск делается по итогам дня. То же через API:
curl -X POST https://windcast-api-production.up.railway.app/api/run -H 'content-type: application/json' -d '{"issue_date":"2026-09-20"}'. Новые фактические данные ВЭС (SCADA) проверяются локально — раздел «Прогноз на новую дату». - Локально: ключи и личные аккаунты не нужны. Для первой установки зависимостей требуется сеть или готовый кэш пакетов.
uv sync && uv run uvicorn app.main:app --port 8000- Открыть http://localhost:8000 — страница показывает выпуск, график с полосой p10–p90 и ленту шагов агента.
- Проверить API напрямую:
curl -s http://localhost:8000/api/health
# → {"ok":true,"mode":"demo","commit":"dev"}
curl -s http://localhost:8000/api/issues
# → [{"issue_date":"2026-01-31","run_id":"20260201T0000-…","model_name":"gbm","revisions":2,…}]
curl -s http://localhost:8000/api/forecast/2026-01-31 | head -c 400
# → ForecastIssue: rows (почасовые строки), summary, warnings
# run_id берём из ответа выше, а не из этой инструкции: он меняется при перегенерации
run=$(curl -s http://localhost:8000/api/issues | python3 -c 'import json,sys; print(json.load(sys.stdin)[0]["run_id"])')
curl -s "http://localhost:8000/api/runs/$run/log"
# → шаги агента: tool, status, decision, reason, duration_ms
- Проверить выбранное архивное поле
wx_fieldи журналvalidate_weather. Расчётный запас доступности основан на правиле задержки, точное историческое время публикации не утверждается. Тесты погоды проверяют временные границы; «отравленный» тест проверяет, что замена недопустимых будущих значений не меняет прогноз. - На лёгкой странице открыть «Происхождение погоды по часам», сравнить пунктир первоначального прогноза с новой ревизией и скачать CSV всех ревизий. Мощности в CSV — доли номинала 0…1; времена содержат UTC-смещение. Экспорт не является торговой заявкой.
- Статус «Готов к рассмотрению» означает отсутствие замечаний в загруженном журнале. При резервном пути или недоступном журнале показано предупреждение; окончательное решение остаётся за диспетчером.
Результат за февраль 2026
Главный файл для сравнения с фактом — outputs/forecasts/february_2026.csv: 672 строки, по одной на каждый час 01–28.02.2026.
| Колонка | Смысл |
|---|---|
target_time_utc, target_time_local | час прогноза (UTC и Алматы, UTC+5) |
power_farm_plan, power_t1_plan, power_t2_plan | последний прогноз на этот час: опережение 0–23 ч из выпуска, сделанного в начале этих суток, с ревизией 1 после пересчёта в 12:00 |
p10_plan, p90_plan | коридор неопределённости p10–p90 |
plan_revision, plan_run_id | какая ревизия и какой прогон агента дали значение (журнал — runs/<run_id>/) |
power_farm_bid, bid_mw | суточная заявка: опережение 24–47 ч из выпуска предыдущей ночи, готова до 08:00; для 01.02 пусто — её делал бы выпуск за 30.01, который не входит в тестовый период |
plan_mw | план в МВт (номинал ВЭС «Нурлы» 5 МВт) |
Мощность — доля номинала 0…1, как в данных кейса. Полная история каждого выпуска и ревизии — outputs/forecasts/issue_YYYY-MM-DD.csv; черновик заявки на D+2 в МВт·ч по часам — runs/<run_id>/bid_YYYY-MM-DD.csv.
Живая сверка. uv run python -m app.cli forecast --issue 2026-02-10 --refresh — агент сам запрашивает у Open-Meteo окно выпуска по координатам обеих турбин и сверяет с архивом из репозитория; пример в runs/live_check/: ответ API совпал с архивом на всех 48 часах (live_match).
Прогноз на новую дату
Агент не ограничен февралём. Для любой даты после периода обучения он сам запрашивает у Open-Meteo архивные прогоны для окна выпуска по координатам обеих турбин и считает выработку на 48 часов; закоммиченный архив погоды при этом не меняется:
uv run python -m app.cli forecast --issue 2026-09-22 # нужна сеть: погода докачивается сама
Флаг --refresh не обязателен: докачка включается сама, когда архив не покрывает дату; для февраля прогноз всегда строится по закоммиченному архиву. Для новых дат идентификатор прогона не фиксирует содержимое живого ответа Open-Meteo: два запуска в разное время могут дать разные прогоны. То же делает кнопка «Прогноз на новую дату» на экране «Прогноз на 48 ч» платформы. Даты внутри периода обучения модели агент отклоняет: для проверки прошлого по факту служит replay. Новые фактические данные кладутся в data/raw/turbine1.csv и turbine2.csv в том же формате; часовые ряды пересобираются автоматически, uv run python -m app.cli train переобучает модель, evaluate --holdout YYYY-MM считает точность за новый месяц.
Правило против утечки данных
ТЗ требует использовать «архивные прогнозы погоды, доступные на соответствующий момент времени, а не фактические погодные значения, ставшие известными позднее». Open-Meteo отдаёт поле previous_dayN — значение, предсказанное за 24·N часов до целевого часа (по документации, по исходному коду Open-Meteo и по сверке с Single Runs API). Прогон появляется в Open-Meteo с задержкой: для ECMWF IFS мы измерили 7,0 ч, для GFS 5,5–6,5 ч, для ICON 3,8 ч. Принята задержка 7 часов (PUBLISH_DELAY_H): прогон допустим, если init + 7 ч ≤ t0.
| Горизонт от t0 | Разрешённое поле |
|---|---|
| 0–16 ч | previous_day1 |
| 17–40 ч | previous_day2 |
| 41–47 ч | previous_day3 |
При пересчёте в t0 + 12 ч (ревизия 1) граница сдвигается на 12 часов: 0–28 ч → previous_day1, 29–47 ч → previous_day2. Поэтому строка ревизии 1 с опережением 28 ч и полем day1 — не утечка: к 12:00 этот прогон уже опубликован.
Правило реализовано в config.safe_previous_day(lead_h, hours_since_issue) — одной функцией, которую используют обучение, агент и тесты. Если нужного поля нет, берётся только более старый прогон, никогда не более свежий. При внутрисуточном пересчёте (hours_since_issue = 12) граница сдвигается, потому что к этому моменту опубликованы более свежие прогоны. Реанализ (ERA5), Historical Forecast API и поле без суффикса не используются нигде.
Как проверить агентность
«Агент» легко заявить и трудно доказать. Поэтому вклад агентского слоя измерен: мы прогоняем один и тот же месяц четырьмя вариантами, от простейшего к полному, и сравниваем с фактом.
uv run python -m app.cli replay --month 2026-01 # → outputs/evidence/replay_2026-01.json
uv run python -m app.cli faults # → outputs/evidence/faults.json
Абляция — январь 2026, 31 выпуск, 1 464 пары «выпуск × час», обучение закончено до начала месяца:
| Вариант | MAE |
|---|---|
| A — персистентность | 0,3066 |
| B — кривая мощности без пересчёта | 0,1953 |
| C — GBM без пересчёта | 0,1536 |
| D — опубликованный план: D+1 обновлён, D+2 из t0 | 0,1519 |
Видно, где сколько выигрыша: главный вклад даёт модель (B → C), а агентский слой добавляет сверху ещё немного (C → D). Мы не выдаём второе за первое.
Журнал решений — каждое решение агента с доверительным интервалом, а не «стало лучше»:
| Решение | Сработало | Δ MAE | 95% ДИ | Выигрышей |
|---|---|---|---|---|
| Проектный выбор GBM против кривой мощности | 31 | -0,0427 | [-0,0582; -0,0272] | 25 |
| Пересчёт по свежей погоде | 31 | -0,0060 | [-0,0143; 0,0016] | 18 |
Отрицательная Δ означает, что решение уменьшило ошибку. Честно отмечаем: доверительный интервал пересчёта пересекает ноль — на спокойном январе выигрыш не доказан, а два защитных решения в нормальном режиме не срабатывали ни разу. Их ценность проверяется отдельно.
Устойчивость к сбоям — app.cli faults ломает входные данные и сравнивает агента с фиксированным пайплайном на выпуске 09.02.2026:
| Сбой | Агент | Фиксированный пайплайн |
|---|---|---|
| в основном источнике нет 6 часов ветра | 48 ч, переключился на gfs_seamless | 42 ч |
| выброс 100 м/с во всех прогонах основного источника | 48 ч, переключился на gfs_seamless | 48 ч, но 6 часов посчитаны по битому входу |
| выброс 100 м/с только в самом свежем прогоне | 48 ч, взял более старый прогон того же источника (older_run), модель осталась основной | 48 ч, но 6 часов посчитаны по битому входу |
| основной источник недоступен | 48 ч, переключился на gfs_seamless | 0 ч |
| оба источника сломаны | 48 ч, перешёл на климатологию | 42 ч |
Агент выдал полный горизонт в 5 случаях из 5 и в каждом записал решение и причину в runs/<run_id>/agent_log.jsonl. Фиксированный пайплайн либо теряет часы, либо — что хуже — молча считает прогноз по испорченному входу.
Тесты и метрики
uv run pytest -q # API, CLI, погода и правило утечки
uv run ruff check . # линтер
scripts/smoke.sh # свежий clone → install → тесты → запуск → основной сценарий
scripts/smoke.sh проверяет опубликованную версию в отдельном клоне: установка → проверка SHA-256 входов → удаление готовых модели и прогнозов в клоне → обучение → полный backtest → 28 выпусков, 672 часа → тесты, линтер и HTTP всех выпусков. При ошибке останавливается. scripts/smoke.sh --local проверяет локальный коммит, без незакоммиченных правок. Bash-сценарий рассчитан на macOS/Linux; на Windows основные Python-команды выполняются отдельно. Node необязателен для Python: без него пропускается только дополнительный тест JavaScript.
Журнал, ограничения и сценарий демонстрации на 3–4 минуты — docs/TESTING.md. Тестовый клон и логи сохраняются по напечатанному пути; рабочая модель не перезаписывается.
Качество на валидационных месяцах. Обучение заканчивается до каждого месяца, но эти периоды ранее использовались при выборе подхода и не являются полностью независимым тестом. MAE ниже — доля номинала; nMAE = MAE × 100 %, не процент верно угаданных часов. Точные границы и ограничения — docs/METRICS.md.
| Модель | Январь 2026 MAE | Февраль 2025 MAE |
|---|---|---|
| Персистентность | 0,3066 | 0,3386 |
| Климатология | 0,3039 | 0,3205 |
| Кривая мощности | 0,1953 | 0,2070 |
| GBM | 0,1536 | 0,1778 |
Покрытие p10–p90: 80,5 % / 82,0 %; средняя ширина: 49,1 / 58,2 п.п. номинала. Это измеренные значения на этих периодах, не гарантия покрытия на новых данных.
Сценарная стоимость отклонений. Используются допущения расчёта: мощность 5 МВт, цена 22,68 ₸/кВт·ч и коэффициент 0,3 на каждое абсолютное отклонение заявки D+2; считается только по часам заявки (горизонт 24–47 ч). Освобождение в пределах ±5 % и взаимозачёт не моделируются. Это не фактический счёт станции и не измеренная экономия.
| Модель | Январь, млн ₸ | Февраль, млн ₸ |
|---|---|---|
| Персистентность | 7,44 | 7,81 |
| Кривая мощности | 5,10 | 4,48 |
| GBM | 3,88 | 3,84 |
Источник таблиц — outputs/metrics/holdout_2026-01.json и holdout_2025-02.json. Факта февраля 2026 нет, точность на тестовом феврале не заявляется.
Трассировка требований
| R-ID | Требование | Где реализовано | Как проверить | Статус |
|---|---|---|---|---|
| R1 | История турбин → часовые ряды, флаги дыр и простоев | app/data.py | data/processed/hourly.parquet создан (964 КБ) | ✅ |
| R2 | Агент сам получает архивные прогнозы, правило против утечки | app/weather.py, data/weather_cache/ | uv run pytest tests/test_weather.py -q | ✅ |
| R3 | Модели выработки с квантилями p10/p90 | app/models.py, app/train.py | models/windcast.pkl (4,5 МБ); кривая мощности, бустинг + CQR, климатология | ✅ |
| R4 | Ретроспектива: выпуск на каждый день февраля | app/service.py | 28 файлов outputs/forecasts/issue_*.csv + february_2026.csv | ✅ |
| R5 | Agentic-цикл с анализом и пересчётом, работает без ключей | app/agent/ | 28 прогонов в runs/; вклад слоя измерен — раздел «Как проверить агентность» | ✅ |
| R6 | README и воспроизводимость в 3 команды без ключей | README.md, scripts/smoke.sh, docs/TESTING.md | scripts/smoke.sh → SMOKE PASS | ✅ |
| R7 | Метрики на отложенных периодах против базовых моделей | app/evaluate.py | outputs/metrics/holdout_2026-01.json (nMAE 15,4 %) и holdout_2025-02.json (17,8 %) | ✅ |
| R8 | API по контракту и страница с графиком и лентой агента | app/api/routes.py, static/index.html | curl /api/forecast/2026-01-31; открыть http://localhost:8000 | ✅ |
| R9 | Сводка диспетчеру от LLM с проверкой чисел | app/llm.py, app/agent/orchestrator.py | forecast --issue 2026-02-01 --llm --demo-dir runs/llm_demo при LLM_API_KEY | 🚧 |
| R10 | Второй источник погоды: разброс и фолбэк | app/weather.py | gfs_seamless в кэше; переключение доказано в outputs/evidence/faults.json (GFS в 3 из 5 сценариев, полный горизонт в 5 из 5) | ✅ |
Данные и интеграции
Из ТЗ. Две турбины в Алматинской области, ~300 м друг от друга (одна ячейка погодной сетки): турбина 1 — 43.645150, 78.535604; турбина 2 — 43.643198, 78.538828. Это вся ВЭС «Нурлы» 5 МВт (OpenStreetMap relation 14072944). Период 11.03.2023 00:00 – 31.01.2026 23:50, шаг 10 минут; февраля 2026 в данных нет. Колонки: время (часы SCADA, фиксированный UTC+5: 01.03.2024 они не переводились — фаза суточного хода температуры сдвинулась на 6 минут, а не на 60), средняя скорость ветра м/с, нормализованная активная мощность 0…1, средняя температура °C.
SHA-256 файлов в репозитории (переводы строк LF, как их отдаёт git clone); у оригиналов с Google Drive (CRLF) суммы c4c341582fb2dd348b7187f0128cff265fe055f469413871ebb5db50eef58b5b и 820578cd18bb557cd30c2e102f3ae5a386dfc6c489a5a15743339c2b017305e5, данные те же.
| Файл | Размер | SHA-256 |
|---|---|---|
data/raw/turbine1.csv | 5,9 МБ | d82def7e56c0a1eed3f2f68eb29fd66e4299999921c9703720a880a5cf7d6703 |
data/raw/turbine2.csv | 6,2 МБ | 16a844db949562290c96a86efa20178a71540ff6252275c003db4715edb9434a |
Открытые источники. Прогнозы погоды — Open-Meteo Previous Runs API, бесплатно для некоммерческого использования, атрибуция CC BY 4.0. Архив загружен в data/weather_cache/ вместе с meta.json (URL запроса, время загрузки, SHA-256), поэтому результат воспроизводится без сети и без ключей.
Персональные данные. В задаче их нет: данные телеметрии турбин не содержат сведений о людях. В LLM уходит только агрегированная сводка по выработке, без исходных рядов.
Ограничения
- Прогноз ветра — главный источник ошибки. Модель выработки работает на прогнозном ветре, поэтому её точность ограничена точностью NWP, особенно на горизонте 41–47 часов, где по правилу утечки доступен только трёхсуточный прогон.
- Станция из двух турбин. Это вся ВЭС «Нурлы»; кривой мощности производителя и данных об ограничениях сети нет, поэтому «выработка станции» — среднее по двум турбинам, нормализованное к 1 (× 5 МВт в сводке).
- Простои неотличимы от штиля по причине. Мы помечаем часы с нулевой мощностью при ветре выше 5 м/с как простой, но причину (ремонт, ограничение сети) данные не содержат.
- Задержка публикации прогонов принята равной 7 часам — измерена для ECMWF IFS по
meta.jsonOpen-Meteo (7,0 ч); у других моделей она меньше, значит правило консервативное. Точные времена инициализации дал бы Single Runs API — это следующий шаг. - Источник
best_matchсменился 01.10.2025 (ICON → ECMWF IFS, у IFS ветер в среднем на 1,35 м/с ниже). Модель видит это через признак эпохи, агент пишет источник в журнал. - Февраль 2026 проверяется только по прогнозу. Фактической выработки за тестовый период в данных нет, поэтому качество измеряется на отложенных периодах (январь 2026, февраль 2025).
- Куда развивать: добавить ансамбль из нескольких моделей NWP и сетку точек вокруг парка (замер на наших данных дал MAE 0.229 → 0.180), учитывать направление ветра и стратификацию, подключить факт по SCADA для дообучения и калибровки квантилей.
Масштабирование
Замеры на этой машине (Apple M-series, один процесс, без GPU), на том же клоне, что проверяет scripts/smoke.sh:
| Операция | Замер |
|---|---|
| Обучение модели с нуля | 11 с |
| Ретроспектива за весь тестовый период — 28 выпусков × 48 ч | 9 с |
Один выпуск в API (POST /api/run), модель уже в памяти | 0,24 с |
| Первый выпуск после старта (загрузка модели) | 2,8 с |
| SCADA на входе | 142 360 строк × 2 турбины = 989 суток по 10 минут |
Почти всё время выпуска — фиксированный старт: пять выпусков считаются столько же, сколько два. Значит узкое место не в математике, а в том, сколько раз мы платим за старт и чтение файлов.
Как это переносится на объёмы больше нашего:
| Объём | Оценка по замерам | Что меняется в архитектуре |
|---|---|---|
| Одна ВЭС, месяц | 9 с | ничего, текущий код |
| Одна ВЭС, год | ~2 мин | ничего |
| 50 ВЭС, год | ~1,5–2 ч в один процесс | обучение и ретроспектива — по парку параллельно; это независимые задачи, распараллеливаются линейно |
| Оперативный режим: 50 ВЭС, выпуск каждый час | ~12 с расчёта в час | прогон вынести из HTTP в очередь, API только читает готовое |
Где ломается текущая реализация и что делать:
- Чтение файлов на каждый запрос.
GET /api/issuesперебирает все файлы выпусков: на 28 это 11 мс, на годе по 50 паркам — это 18 тысяч файлов. Нужен индекс выпусков в SQLite или Postgres; API уже отдаёт только чтение, поэтому замена хранилища не затрагивает ни агента, ни страницу. - Прогон внутри HTTP-запроса.
POST /api/runсчитает синхронно. При очереди с воркерами запрос возвращаетrun_id, а страница опрашивает статус. - Один воркер uvicorn. Путь чтения не зависит от стека моделей — он специально отвязан, — поэтому API и страницу можно масштабировать репликами отдельно от расчётного контура.
- Погодный кэш один на парк. Турбины одного парка попадают в одну ячейку сетки, но 50 парков — это 50 запросов к Open-Meteo; нужен общий кэш с ключом по ячейке, иначе упрёмся в лимиты провайдера.
- Чего не хватает для эксплуатации: аутентификация (диспетчер видит свой парк), приём факта по SCADA для дообучения и калибровки квантилей, журнал решений в неизменяемом виде — это требование ст. 19-1 ПДн и Цифрового кодекса к авторешениям.
Ссылка на развёрнутую версию
- Платформа для диспетчера: https://ctrlx-hackalem.vercel.app (Next.js на Vercel;
/api/*проксируется на бэкенд). - Лёгкая страница и API агента: https://windcast-api-production.up.railway.app — на корне та же страница, что на localhost:8000; Swagger на
/docs, напримерGET /api/issues,POST /api/run(Docker-образ изDockerfileна Railway). - Экран «Для ИТ» показывает режим сервиса (LLM или сводки по шаблону) и версию API: переменная
COMMITконтейнера, без неё —dev. Локальный запуск без аккаунтов — раздел «Установка и запуск».
Команда
| Участник | Роль | Вклад |
|---|---|---|
| Мустафа | лид-интегратор | контракт и зоны, данные и часовые ряды, модели, agentic-оркестратор, ретроспектива, метрики |
| Амирхан | данные погоды и идеи | Open-Meteo Previous Runs, кэш и правило против утечки, ресерч по ансамблю NWP |
| Ансар | платформа | API по контракту, страница, README, тесты API/CLI, smoke |
Как мы работали с AI-агентами
- Направляющие:
AGENTS.mdиCLAUDE.md— правила, контракт, зоны ответственности; скиллы в.agents/skills/— разбор ТЗ, checkpoint, критики, сдача, UI. - Сенсоры: автотесты, линтер, smoke-тест со свежего клона (
scripts/smoke.sh), проверка секретов и зон в pre-commit, критики со свежим контекстом, независимый прогон по README (scripts/judge.sh). Журнал —docs/TESTING.md. - Трое разработчиков, у каждого свой агент (Claude Code или Codex), один
main, результат каждый час —docs/PROGRESS.md. Сообщения между агентами — отдельная веткаteam-chat(scripts/msg.sh).
Заранее подготовленное, заимствования и AI-инструменты
- Подготовлено до старта (п. 5.4.4.2): см.
docs/PREPARED.md— инструменты разработки и пустой каркас без логики задачи. - Заимствования: данные турбин — из ТЗ кейсодателя; прогнозы погоды — Open-Meteo Previous Runs API (CC BY 4.0). Сторонний код: компоненты shadcn/ui (MIT) в
web/components/ui/и скиллы агентов с лицензиями — перечислены вdocs/PREPARED.md. - AI-инструменты разработки: Claude Code, OpenAI Codex.
Проверенные возможности LLM
В runs/llm_demo/ сохранён пример реальной LLM-сводки старой версии модели. Это исторический пример работы со сводкой, не текущий эталон точности и не доказательство вызовов инструментов супервизором. Native-tool супервизор проверен локальными тестами; успешный внешний цикл не заявляется. Для запуска основного сценария ключи не нужны.
Финальная проверка опубликованного среза 4bfb7ed на macOS: полный scripts/smoke.sh прошёл, включая обучение с нуля и 205 тестов. По отчёту Амирхана, тот же сценарий на Windows для 51be5d5 также прошёл (205 тестов). Подробности — docs/TESTING.md.
Авторы коммитов
История коммитов
- 2026-09-23 17:58[mustafa] checkpoint 17:58: README: light page URL on the backend root (R6, R8)Мустафа
- 2026-09-23 17:58[mustafa] chat → allМустафа
- 2026-09-23 17:58[mustafa] checkpoint 17:58: README: name the borrowed UI components and skills instead of denying borrowings (R6)Мустафа
- 2026-09-23 17:53[mustafa] chat → allМустафа
- 2026-09-23 17:52[mustafa] checkpoint 17:52: README: describe the version shown on the IT screen as it really is (R6)Мустафа
- 2026-09-23 17:51[mustafa] checkpoint 17:50: README: Google Drive originals (CRLF) get their own sha256, repo files stay LF (R6)Мустафа
- 2026-09-23 17:50[mustafa] checkpoint 17:50: README: how the jury checks new dates on the deployed platform and via API (R6, R8)Мустафа
- 2026-09-23 17:50[mustafa] chat → ansarМустафа
Все коммиты (244)
- 2026-09-23 17:49[mustafa] chat → allМустафа
- 2026-09-23 17:49[mustafa] checkpoint 17:48: README: production links — platform on Vercel, API on Railway (R6, R8)Мустафа
- 2026-09-23 17:48[mustafa] chat → allМустафа
- 2026-09-23 17:47[mustafa] chat → ansarМустафа
- 2026-09-23 17:47[ansar] chat → allАнсар
- 2026-09-23 17:47[ansar] checkpoint 17:46: docs: measured scaling section — timings, limits of the current design, what changes at scale (R6)Ансар
- 2026-09-23 17:46[mustafa] chat → allМустафа
- 2026-09-23 17:45[amirkhan] chat → mustafaАмирхан
- 2026-09-23 17:44[mustafa] chat → ansarМустафа
- 2026-09-23 17:44[ansar] chat → mustafaАнсар
- 2026-09-23 17:43[mustafa] chat → allМустафа
- 2026-09-23 17:43[mustafa] checkpoint 17:42: ask screen: date parser skips decimals and times, resolves the last test day via the previous issue (R9)Мустафа
- 2026-09-23 17:42[mustafa] chat → allМустафа
- 2026-09-23 17:42[mustafa] checkpoint 17:41: Fix live provenance and SCADA refresh; add jury brief (R1,R5,R6)Мустафа
- 2026-09-23 17:39[amirkhan] chat → mustafaАмирхан
- 2026-09-23 17:38[amirkhan] chat → mustafaАмирхан
- 2026-09-23 17:38[mustafa] checkpoint 17:38: ask screen: a date in the question selects the matching issue, the covered days are always shown, example questions in the placeholder (R9)Мустафа
- 2026-09-23 17:38[mustafa] chat → allМустафа
- 2026-09-23 17:37[amirkhan] chat → mustafaАмирхан
- 2026-09-23 17:37[mustafa] chat → allМустафа
- 2026-09-23 17:36[amirkhan] chat → mustafaАмирхан
- 2026-09-23 17:36[mustafa] chat → allМустафа
- 2026-09-23 17:35[mustafa] chat → allМустафа
- 2026-09-23 17:33[mustafa] checkpoint 17:33: honesty guard: refuse issues whose forecast moment is in the future; no 12:00 recompute before it happens; docstring and README cleanup for live weather (R5)Мустафа
- 2026-09-23 17:32[mustafa] checkpoint 17:31: forecast on any new date: the agent fetches the weather window live by both turbines' coordinates when the archive does not cover the issue (archive untouched, offline fallМустафа
- 2026-09-23 17:32[mustafa] chat → allМустафа
- 2026-09-23 17:31[amirkhan] chat → mustafaАмирхан
- 2026-09-23 17:31[amirkhan] chat → allАмирхан
- 2026-09-23 17:31[mustafa] chat → allМустафа
- 2026-09-23 17:30[mustafa] chat → allМустафа
- 2026-09-23 17:30[ansar] chat → allАнсар
- 2026-09-23 17:30[ansar] checkpoint 17:30: Document final clean-clone verification and align replay evidence (R6,R8)Ансар
- 2026-09-23 17:30[amirkhan] chat → allАмирхан
- 2026-09-23 17:29[mustafa] chat → allМустафа
- 2026-09-23 17:28[amirkhan] chat → ansarАмирхан
- 2026-09-23 17:28[amirkhan] chat → allАмирхан
- 2026-09-23 17:28[mustafa] chat → allМустафа
- 2026-09-23 17:28[mustafa] chat → ansarМустафа
- 2026-09-23 17:27[amirkhan] chat → ansarАмирхан
- 2026-09-23 17:27[mustafa] chat → ansarМустафа
- 2026-09-23 17:27[ansar] checkpoint 17:27: docs: README numbers match the 17:21 metrics and replay JSON (R6, R7)Ансар
- 2026-09-23 17:27[ansar] chat → allАнсар
- 2026-09-23 17:27[mustafa] chat → allМустафа
- 2026-09-23 17:26[mustafa] chat → allМустафа
- 2026-09-23 17:26[amirkhan] chat → mustafaАмирхан
- 2026-09-23 17:26[mustafa] checkpoint 17:26: Finalize release evidence and accurate integration guidance (R6,R8,R9)Мустафа
- 2026-09-23 17:26[amirkhan] chat → ansarАмирхан
- 2026-09-23 17:26[ansar] checkpoint 17:26: Fix dispatcher race and provenance export; verify fresh training and full backtest (R6,R8)Ансар
- 2026-09-23 17:25[mustafa] chat → allМустафа
- 2026-09-23 17:25[amirkhan] checkpoint 17:24: docs(tasks): amirkhan — Windows verified on e3e7fb8 (29/29 CSV byte-identical, 203 tests), portability defect localized, audit hardening summary (R2, R6, R9)Амирхан
- 2026-09-23 17:24[ansar] chat → amirkhanАнсар
- 2026-09-23 17:24[mustafa] chat → allМустафа
- 2026-09-23 17:23[mustafa] chat → allМустафа
- 2026-09-23 17:23[amirkhan] chat → mustafaАмирхан
- 2026-09-23 17:22[mustafa] chat → allМустафа
- 2026-09-23 17:21[mustafa] checkpoint 17:21: Publish portable model and fail checkpoint on staging errors (R3,R6,R7)Мустафа
- 2026-09-23 17:21[ansar] chat → mustafaАнсар
- 2026-09-23 17:20[mustafa] checkpoint 17:20: Fix cross-platform feature precision and refresh evidence (R3,R7)Мустафа
- 2026-09-23 17:20[mustafa] chat → allМустафа
- 2026-09-23 17:19[ansar] chat → mustafaАнсар
- 2026-09-23 17:18[mustafa] chat → allМустафа
- 2026-09-23 17:18[mustafa] checkpoint 17:17: LLM demo run (OpenAI gpt-4.1-mini): dispatcher summary passed the number check, committed in runs/llm_demo for experts without a key (R9)Мустафа
- 2026-09-23 17:17[mustafa] chat → allМустафа
- 2026-09-23 17:16[mustafa] chat → allМустафа
- 2026-09-23 17:15[mustafa] checkpoint 17:15: platform redesign: plain words, one hero per screen, far less text, generous spacing, explanations behind «Как читать»; README section on the platform (R6, R8)Мустафа
- 2026-09-23 17:14[mustafa] chat → ansarМустафа
- 2026-09-23 17:14[mustafa] chat → amirkhanМустафа
- 2026-09-23 17:11[mustafa] chat → allМустафа
- 2026-09-23 17:10[mustafa] chat → allМустафа
- 2026-09-23 17:10[ansar] chat → mustafaАнсар
- 2026-09-23 17:09[amirkhan] chat → mustafaАмирхан
- 2026-09-23 17:09[mustafa] chat → allМустафа
- 2026-09-23 17:09[amirkhan] checkpoint 17:08: fix: reject malformed weather and unsupported forecast explanations (R2,R9)Амирхан
- 2026-09-23 17:08[mustafa] chat → ansarМустафа
- 2026-09-23 17:08[amirkhan] chat → ansarАмирхан
- 2026-09-23 17:08[mustafa] chat → allМустафа
- 2026-09-23 17:07[mustafa] chat → ansarМустафа
- 2026-09-23 17:06[ansar] chat → allАнсар
- 2026-09-23 17:06[mustafa] chat → ansarМустафа
- 2026-09-23 17:06[mustafa] chat → amirkhanМустафа
- 2026-09-23 17:06[ansar] chat → amirkhanАнсар
- 2026-09-23 17:06[mustafa] checkpoint 17:06: platform: honest wording — admissible by the 7 h rule (not a proven publication time), bid-hour costs, D+2 bid is the pre-recompute version (R8)Мустафа
- 2026-09-23 17:06[mustafa] chat → allМустафа
- 2026-09-23 17:06[amirkhan] chat → ansarАмирхан
- 2026-09-23 17:05[amirkhan] chat → mustafaАмирхан
- 2026-09-23 17:05[ansar] chat → mustafaАнсар
- 2026-09-23 17:05[mustafa] chat → allМустафа
- 2026-09-23 17:04[mustafa] checkpoint 17:04: platform: integration screen for the customer's IT (architecture, API, formats, on-prem deployment, pilot roadmap); per-turbine MW in chart; honest pair counts and quantileМустафа
- 2026-09-23 17:04[mustafa] chat → allМустафа
- 2026-09-23 17:03[mustafa] checkpoint 17:03: Protect monthly export and document release audit (R4,R6)Мустафа
- 2026-09-23 17:02[mustafa] chat → allМустафа
- 2026-09-23 17:02[mustafa] checkpoint 17:02: docs: PREPARED discloses the prepared Next.js starter used for web/ and its licenses (R6)Мустафа
- 2026-09-23 17:01[mustafa] checkpoint 17:01: platform: WindCast web app (Next.js, web/) — February overview heatmap, issues with 48 h chart and recompute, day-ahead bid in MWh with CSV, agent journal, accuracy and eviМустафа
- 2026-09-23 17:00[mustafa] chat → ansarМустафа
- 2026-09-23 16:59[mustafa] chat → amirkhanМустафа
- 2026-09-23 16:59[mustafa] chat → ansarМустафа
- 2026-09-23 16:58[mustafa] chat → allМустафа
- 2026-09-23 16:57[mustafa] chat → allМустафа
- 2026-09-23 16:53[mustafa] chat → ansarМустафа
- 2026-09-23 16:52[amirkhan] chat → ansarАмирхан
- 2026-09-23 16:52[amirkhan] chat → mustafaАмирхан
- 2026-09-23 16:52[amirkhan] checkpoint 16:51: fix(ask,weather): honest grounded flag for template answers, log-only runs reported, run_id/model-name validation, LLM sources checked against facts, markup stripped, digiАмирхан
- 2026-09-23 16:52[mustafa] chat → ansarМустафа
- 2026-09-23 16:49[ansar] chat → mustafaАнсар
- 2026-09-23 16:49[mustafa] chat → allМустафа
- 2026-09-23 16:48[mustafa] checkpoint 16:48: Fix resilient publication and regenerate validated forecasts (R1-R7,R9)Мустафа
- 2026-09-23 16:47[mustafa] chat → allМустафа
- 2026-09-23 16:45[mustafa] chat → allМустафа
- 2026-09-23 16:44[mustafa] chat → amirkhanМустафа
- 2026-09-23 16:40[mustafa] chat → allМустафа
- 2026-09-23 16:37[mustafa] chat → ansarМустафа
- 2026-09-23 16:37[mustafa] chat → amirkhanМустафа
- 2026-09-23 16:36[mustafa] chat → allМустафа
- 2026-09-23 16:35[amirkhan] chat → mustafaАмирхан
- 2026-09-23 16:35[mustafa] chat → allМустафа
- 2026-09-23 16:34[ansar] chat → allАнсар
- 2026-09-23 16:34[ansar] checkpoint 16:34: fix: a failed issue load clears the screen instead of showing the previous one; one unreadable file no longer kills the issue list (R8)Ансар
- 2026-09-23 16:34[mustafa] checkpoint 16:33: Harden LLM failures and supervisor evidence checks (R9)Мустафа
- 2026-09-23 16:32[mustafa] chat → allМустафа
- 2026-09-23 16:32[mustafa] checkpoint 16:32: fix: readable recompute wording in the agent log; README leak rule for revision 1 (h=12); ask-the-agent status in SOLUTION; regenerated logs (R5, R6)Мустафа
- 2026-09-23 16:32[mustafa] chat → ansarМустафа
- 2026-09-23 16:30[mustafa] chat → allМустафа
- 2026-09-23 16:30[mustafa] checkpoint 16:29: Add bounded tool supervisor and isolate CQR calibration (R1,R3,R7,R9)Мустафа
- 2026-09-23 16:29[mustafa] chat → allМустафа
- 2026-09-23 16:29[amirkhan] chat → mustafaАмирхан
- 2026-09-23 16:29[mustafa] checkpoint 16:29: fix: ablation scores the plan the agent actually publishes (D+2 bid stays at rev0); imbalance cost and corridors on bid hours; honest validation wording; README/SOLUTION nuМустафа
- 2026-09-23 16:27[mustafa] chat → amirkhanМустафа
- 2026-09-23 16:24[mustafa] chat → ansarМустафа
- 2026-09-23 16:24[mustafa] chat → allМустафа
- 2026-09-23 16:22[mustafa] chat → ansarМустафа
- 2026-09-23 16:22[mustafa] checkpoint 16:21: agent refuses issues inside the model's training period (leak guard) + test; API answers 422 with the reason (R5, R8)Мустафа
- 2026-09-23 16:20[mustafa] chat → allМустафа
- 2026-09-23 16:19[mustafa] checkpoint 16:19: live-check example regenerated on the current model: live_match on 48 h (R2)Мустафа
- 2026-09-23 16:19[mustafa] checkpoint 16:19: model retrained on the current two-point weather archive; content-based run ids (same after retrain); LF output on every OS; all outputs, metrics, replay and faults regenerМустафа
- 2026-09-23 16:16[amirkhan] checkpoint 16:15: docs(tasks): amirkhan — R9 and clean-clone check done, freeze mode; merge team progress lines (R2, R9)Амирхан
- 2026-09-23 16:15[amirkhan] checkpoint 16:14: docs(tasks): amirkhan — R9 and clean-clone check done, freeze mode (R2, R9)Амирхан
- 2026-09-23 16:14[amirkhan] chat → allАмирхан
- 2026-09-23 16:13[mustafa] chat → ansarМустафа
- 2026-09-23 16:13[mustafa] checkpoint 16:13: README: February result file explained, live check, 5 fault cases, honest ledger wording (R4, R6)Мустафа
- 2026-09-23 16:12[mustafa] checkpoint 16:12: docs: SOLUTION and REQUIREMENTS match the implementation after audit (live check, older run, gated rev1, ledger wording, metrics actually computed, 5 fault cases) (R5, R7)Мустафа
- 2026-09-23 16:11[mustafa] checkpoint 16:11: agent: weather step uses the real source (archive vs live), live check of the issue window by both turbines' coordinates (live_match on 10.02), grid cells in the log; commiМустафа
- 2026-09-23 16:11[amirkhan] chat → ansarАмирхан
- 2026-09-23 16:11[amirkhan] chat → mustafaАмирхан
- 2026-09-23 16:11[ansar] chat → allАнсар
- 2026-09-23 16:11[amirkhan] checkpoint 16:10: feat(ask): ask-the-agent over run facts — template answers, LLM path with number grounding against the facts, tests (R9)Амирхан
- 2026-09-23 16:11[ansar] checkpoint 16:11: docs+ui: imbalance cost in tenge next to accuracy, TESTING log up to date (R6, R7, R8)Ансар
- 2026-09-23 16:08[mustafa] checkpoint 16:08: docker image carries model and results; self-check says no_facts when there is nothing to check; unrounded recompute deltas; regenerated outputs (R5, R6)Мустафа
- 2026-09-23 16:06[amirkhan] chat → mustafaАмирхан
- 2026-09-23 16:05[amirkhan] checkpoint 16:05: feat(weather): request by both turbine coordinates (grid cells + same_cell in meta), fetch_issue_window live check of the issue window against the cache, cache re-downloadАмирхан
- 2026-09-23 16:05[ansar] checkpoint 16:05: fix(critics): contain run_id everywhere, no file contents in 500s, corrupt log cannot hide a valid issue, all hold-out periods shown, honest label for climatology hours (R8)Ансар
- 2026-09-23 16:04[mustafa] checkpoint 16:04: agent: older-run fallback before switching source, rev1 only after the same checks, honest climatology labels, source-shift threshold, LLM-rejected label, bid MW column; 5tМустафа
- 2026-09-23 16:03[amirkhan] chat → mustafaАмирхан
- 2026-09-23 16:00[amirkhan] checkpoint 15:59: test(weather): value-level leak tests over 28 issues x {0,12} h (run-encoded synthetic values kill fresher-run/ws10/bfill mutants); clear FileNotFoundError/ValueError instАмирхан
- 2026-09-23 15:59[mustafa] checkpoint 15:59: agent: hourly day-ahead bid draft for D+2 in MWh (Astana time) next to each report + test; regenerated runs (R5, R10)Мустафа
- 2026-09-23 15:58[ansar] chat → mustafaАнсар
- 2026-09-23 15:57[ansar] checkpoint 15:57: fix(security): contain run_id to a child of runs/, escape agent text before innerHTML (R8)Ансар
- 2026-09-23 15:56[amirkhan] chat → mustafaАмирхан
- 2026-09-23 15:55[mustafa] chat → amirkhanМустафа
- 2026-09-23 15:54[mustafa] chat → ansarМустафа
- 2026-09-23 15:54[mustafa] checkpoint 15:54: README: facts match the code — leak rule 7 h (16/40), UTC+5 clock, VES Nurly 5 MW, bid alignment, quick start with backtest, metrics table, LLM fallback vars, sha256 LF vs Мустафа
- 2026-09-23 15:53[mustafa] chat → ansarМустафа
- 2026-09-23 15:52[mustafa] chat → ansarМустафа
- 2026-09-23 15:51[ansar] chat → allАнсар
- 2026-09-23 15:51[mustafa] checkpoint 15:50: docs: REQUIREMENTS statuses and contract match the implementation (tz, delay 7 h, models, rev1 >= 2 h) (R1-R10)Мустафа
- 2026-09-23 15:51[ansar] checkpoint 15:51: feat: agentic evidence in README and on the page; fix nMAE shown 100x too high (R5, R6, R8)Ансар
- 2026-09-23 15:50[mustafa] checkpoint 15:50: tz rules pinned to the tzdata package (no dependence on OS tz database); per-hour run provenance in weather validation + test; regenerated logs (R2, R5, R6)Мустафа
- 2026-09-23 15:45[mustafa] chat → ansarМустафа
- 2026-09-23 15:45[mustafa] checkpoint 15:45: models: docstring says HistGradientBoosting, not LightGBM (R3)Мустафа
- 2026-09-23 15:44[ansar] chat → mustafaАнсар
- 2026-09-23 15:38[amirkhan] chat → mustafaАмирхан
- 2026-09-23 15:37[mustafa] checkpoint 15:37: cli: forecast --llm --demo-dir for a committed LLM demo run without touching test outputs (R9)Мустафа
- 2026-09-23 15:37[mustafa] chat → amirkhanМустафа
- 2026-09-23 15:37[mustafa] checkpoint 15:36: docs: SOLUTION.md section 9 with replay ablation, decision ledger and fault-injection results (R5)Мустафа
- 2026-09-23 15:36[mustafa] chat → allМустафа
- 2026-09-23 15:36[mustafa] checkpoint 15:36: agent evidence: January 2026 replay (ablation + decision ledger with bootstrap CI), fault injection (agent survives 4/4 broken inputs); fix empty-source and no-weather crasМустафа
- 2026-09-23 15:33[amirkhan] chat → mustafaАмирхан
- 2026-09-23 15:33[ansar] chat → mustafaАнсар
- 2026-09-23 15:33[ansar] checkpoint 15:33: fix(api): read path no longer imports the model stack, so API and page survive a missing OpenMP runtime (R6, R8)Ансар
- 2026-09-23 15:33[mustafa] chat → amirkhanМустафа
- 2026-09-23 15:32[mustafa] chat → ansarМустафа
- 2026-09-23 15:32[mustafa] checkpoint 15:32: contract: ask-the-agent (AskRequest/AskAnswer), second LLM provider as fallback, JSON extraction for NIM endpoints; zone app/ask.py -> amirkhan (R9)Мустафа
- 2026-09-23 15:32[amirkhan] checkpoint 15:32: docs: add evidence-backed forecast research and audit notes (R2,R7,R10)Амирхан
- 2026-09-23 15:32[mustafa] checkpoint 15:31: docs: SOLUTION.md numbers from repository metrics, HistGradientBoosting, status and cut order (R3, R7)Мустафа
- 2026-09-23 15:30[mustafa] chat → ansarМустафа
- 2026-09-23 15:30[mustafa] checkpoint 15:29: models: switch GBM to scikit-learn HistGradientBoosting (no system libomp on macOS), drop lightgbm dependency; retrain and regenerate 28 issues (R3, R6)Мустафа
- 2026-09-23 15:29[ansar] chat → mustafaАнсар
- 2026-09-23 15:28[ansar] chat → mustafaАнсар
- 2026-09-23 15:26[mustafa] chat → allМустафа
- 2026-09-23 15:26[mustafa] checkpoint 15:26: agent: real orchestrator (validate, fallback ladder, recompute at t0+12h for hours >=2 h ahead, out-of-sample reflection, dispatcher report), 28-issue backtest + february_2Мустафа
- 2026-09-23 15:25[amirkhan] checkpoint 15:25: docs(ideas): idea 1 aligned with SOLUTION 7.5 — Nurly 5 MW, BR corridor ±5 %, contract regimes (IDEA-1)Амирхан
- 2026-09-23 15:22[amirkhan] chat → mustafaАмирхан
- 2026-09-23 15:22[amirkhan] checkpoint 15:22: docs(ideas): 8 ideas with measured numbers and sources for README (R10, IDEA-1..8)Амирхан
- 2026-09-23 15:21[amirkhan] chat → mustafaАмирхан
- 2026-09-23 15:21[mustafa] checkpoint 15:21: models: leak-safe issue simulation, power curve per field, LightGBM median + CQR quantiles; train and hold-out evaluate (Jan-2026 nMAE 15.4%, Feb-2025 17.7%) (R3, R7)Мустафа
- 2026-09-23 15:17[mustafa] chat → amirkhanМустафа
- 2026-09-23 15:17[mustafa] checkpoint 15:17: docs: SOLUTION.md — bid alignment (D+2 = day-ahead bid before 08:00), poison leak test, decision ledger, regulator KPIs (R5, R7)Мустафа
- 2026-09-23 15:16[ansar] chat → allАнсар
- 2026-09-23 15:16[mustafa] chat → allМустафа
- 2026-09-23 15:16[ansar] checkpoint 15:16: docs: README, TESTING and smoke for the wind-farm case (R6)Ансар
- 2026-09-23 15:16[mustafa] checkpoint 15:15: docs: SOLUTION.md architecture and logic; data loader (fixed UTC+5 clock); publish delay 7 h per measured ECMWF availability (R1, R2, R5)Мустафа
- 2026-09-23 15:12[ansar] checkpoint 15:12: fix(ui): newest revision wins per hour; show what the t0+12h recompute changed (R8)Ансар
- 2026-09-23 15:07[mustafa] chat → amirkhanМустафа
- 2026-09-23 15:07[mustafa] chat → ansarМустафа
- 2026-09-23 15:06[mustafa] checkpoint 15:06: sample issue on the new cache: revision 1 recompute at t0+12h, readable dispatcher report; API tests follow the two-revision contract (R5, R8)Мустафа
- 2026-09-23 15:01[ansar] chat → allАнсар
- 2026-09-23 15:01[ansar] checkpoint 15:01: feat(ui): forecast page — p10-p90 band tinted by weather-run staleness, agent trace (R8)Ансар
- 2026-09-23 14:57[mustafa] chat → allМустафа
- 2026-09-23 14:40[ansar] chat → allАнсар
- 2026-09-23 14:40[ansar] checkpoint 14:40: feat(api): forecast endpoints on the sample issue (R8)Ансар
- 2026-09-23 14:39[amirkhan] chat → ansarАмирхан
- 2026-09-23 14:38[amirkhan] chat → mustafaАмирхан
- 2026-09-23 14:38[amirkhan] checkpoint 14:38: feat: weather module with leak-safe previous-run selection and cache for both models (R2)Амирхан
- 2026-09-23 14:34[ansar] chat → amirkhanАнсар
- 2026-09-23 14:32[mustafa] chat → allМустафа
- 2026-09-23 14:32[mustafa] chat → amirkhanМустафа
- 2026-09-23 14:32[mustafa] chat → ansarМустафа
- 2026-09-23 14:31[mustafa] checkpoint 14:31: roles: platform=ansar, data+models+agent=mustafa, weather+ideas=amirkhan; sample issue for the platform (R4, R8)Мустафа
- 2026-09-23 14:24[mustafa] chat → amirkhanМустафа
- 2026-09-23 14:24[mustafa] chat → ansarМустафа
- 2026-09-23 14:20[mustafa] chat → ansarМустафа
- 2026-09-23 14:20[mustafa] chat → amirkhanМустафа
- 2026-09-23 14:20[mustafa] chat → allМустафа
- 2026-09-23 14:19[mustafa] checkpoint 14:19: kickoff: wind farm case (Samruk-Kazyna), contract, zones, tasks, data and weather cache (R1-R10)Мустафа
- 2026-09-23 14:14[mustafa] chore: add py starter skeleton (prepared before start, no task logic)Мустафа
- 2026-09-23 14:01[amirkhan] chat → mustafaАмирхан
- 2026-09-23 14:00[amirkhan] chat → allАмирхан
- 2026-09-23 14:00[mustafa] chat → allМустафа
- 2026-09-23 13:37[ansar] chat → mustafaАнсар
- 2026-09-23 13:35[amirkhan] chat → allАмирхан
- 2026-09-23 13:27[ansar] chat → mustafaАнсар
- 2026-09-23 13:27[ansar] chat → allАнсар
- 2026-09-23 13:26[mustafa] chat → allМустафа
- 2026-09-23 13:25[mustafa] checkpoint 13:25: chore: team channel back in the team repoМустафа
- 2026-09-23 13:24[mustafa] checkpoint 13:24: docs: task text for both candidate casesМустафа
- 2026-09-23 13:21[mustafa] checkpoint 13:21: chore: team channel remote is configurableMustafa Kassym
- 2026-09-23 13:17[mustafa] chore: bootstrap agent tooling and docs templates (prepared before start, see docs/PREPARED.md)Mustafa Kassym
Структура репозитория (417 файлов)
.agents/skills/checkpoint/SKILL.md .agents/skills/critics/SKILL.md .agents/skills/grilling/LICENSE .agents/skills/grilling/SKILL.md .agents/skills/grilling/agents/openai.yaml .agents/skills/kickoff/SKILL.md .agents/skills/ship/SKILL.md .agents/skills/ui-craft/LICENSE-emil-design-eng.txt .agents/skills/ui-craft/LICENSE-frontend-design.txt .agents/skills/ui-craft/MOTION.md .agents/skills/ui-craft/SKILL.md .agents/skills/ui-craft/VISUAL.md .claude/settings.json .claude/skills/checkpoint .claude/skills/critics .claude/skills/grilling .claude/skills/kickoff .claude/skills/ship .claude/skills/ui-craft .codex/config.toml .dockerignore .env.example .gitattributes .githooks/commit-msg .githooks/pre-commit .gitignore .python-version AGENTS.md CLAUDE.md Dockerfile README.md app/__init__.py app/agent/__init__.py app/agent/log.py app/agent/orchestrator.py app/agent/planner.py app/agent/replay.py app/agent/storage.py app/agent/tools.py app/api/__init__.py app/api/routes.py app/ask.py app/cli.py app/config.py app/console.py app/data.py app/evaluate.py app/features.py app/llm.py app/main.py app/models.py app/schemas.py app/service.py app/train.py app/weather.py data/processed/.gitkeep data/processed/hourly.meta.json data/processed/hourly.parquet data/raw/turbine1.csv data/raw/turbine2.csv data/weather_cache/meta.json data/weather_cache/prev_runs_best_match.json data/weather_cache/prev_runs_gfs_seamless.json docs/AGENTIC.md docs/DOMAIN-FINANCE.md docs/IDEAS.md docs/JURY_BRIEF.md docs/METRICS.md docs/PREPARED.md docs/PROGRESS.md docs/RELEASE_REVIEW.md docs/REQUIREMENTS.md docs/SOLUTION.md docs/TASK.md docs/TEAM.md docs/TESTING.md docs/ZONES.md docs/tasks/amirkhan.md docs/tasks/ansar.md docs/tasks/mustafa.md models/.gitkeep models/windcast.pkl outputs/evidence/faults.json outputs/evidence/replay_2026-01.json outputs/forecasts/.gitkeep outputs/forecasts/february_2026.csv outputs/forecasts/issue_2026-01-31.csv outputs/forecasts/issue_2026-02-01.csv outputs/forecasts/issue_2026-02-02.csv outputs/forecasts/issue_2026-02-03.csv outputs/forecasts/issue_2026-02-04.csv outputs/forecasts/issue_2026-02-05.csv outputs/forecasts/issue_2026-02-06.csv outputs/forecasts/issue_2026-02-07.csv outputs/forecasts/issue_2026-02-08.csv outputs/forecasts/issue_2026-02-09.csv outputs/forecasts/issue_2026-02-10.csv outputs/forecasts/issue_2026-02-11.csv outputs/forecasts/issue_2026-02-12.csv outputs/forecasts/issue_2026-02-13.csv outputs/forecasts/issue_2026-02-14.csv outputs/forecasts/issue_2026-02-15.csv outputs/forecasts/issue_2026-02-16.csv outputs/forecasts/issue_2026-02-17.csv outputs/forecasts/issue_2026-02-18.csv outputs/forecasts/issue_2026-02-19.csv outputs/forecasts/issue_2026-02-20.csv outputs/forecasts/issue_2026-02-21.csv outputs/forecasts/issue_2026-02-22.csv outputs/forecasts/issue_2026-02-23.csv outputs/forecasts/issue_2026-02-24.csv outputs/forecasts/issue_2026-02-25.csv outputs/forecasts/issue_2026-02-26.csv outputs/forecasts/issue_2026-02-27.csv outputs/metrics/.gitkeep outputs/metrics/holdout_2025-02.json outputs/metrics/holdout_2026-01.json outputs/replay/2026-01/forecasts/issue_2025-12-31.csv outputs/replay/2026-01/forecasts/issue_2026-01-01.csv outputs/replay/2026-01/forecasts/issue_2026-01-02.csv outputs/replay/2026-01/forecasts/issue_2026-01-03.csv outputs/replay/2026-01/forecasts/issue_2026-01-04.csv outputs/replay/2026-01/forecasts/issue_2026-01-05.csv outputs/replay/2026-01/forecasts/issue_2026-01-06.csv outputs/replay/2026-01/forecasts/issue_2026-01-07.csv outputs/replay/2026-01/forecasts/issue_2026-01-08.csv outputs/replay/2026-01/forecasts/issue_2026-01-09.csv outputs/replay/2026-01/forecasts/issue_2026-01-10.csv outputs/replay/2026-01/forecasts/issue_2026-01-11.csv outputs/replay/2026-01/forecasts/issue_2026-01-12.csv outputs/replay/2026-01/forecasts/issue_2026-01-13.csv outputs/replay/2026-01/forecasts/issue_2026-01-14.csv outputs/replay/2026-01/forecasts/issue_2026-01-15.csv outputs/replay/2026-01/forecasts/issue_2026-01-16.csv outputs/replay/2026-01/forecasts/issue_2026-01-17.csv outputs/replay/2026-01/forecasts/issue_2026-01-18.csv outputs/replay/2026-01/forecasts/issue_2026-01-19.csv outputs/replay/2026-01/forecasts/issue_2026-01-20.csv outputs/replay/2026-01/forecasts/issue_2026-01-21.csv outputs/replay/2026-01/forecasts/issue_2026-01-22.csv outputs/replay/2026-01/forecasts/issue_2026-01-23.csv outputs/replay/2026-01/forecasts/issue_2026-01-24.csv outputs/replay/2026-01/forecasts/issue_2026-01-25.csv outputs/replay/2026-01/forecasts/issue_2026-01-26.csv outputs/replay/2026-01/forecasts/issue_2026-01-27.csv outputs/replay/2026-01/forecasts/issue_2026-01-28.csv outputs/replay/2026-01/forecasts/issue_2026-01-29.csv outputs/replay/2026-01/forecasts/issue_2026-01-30.csv outputs/replay/2026-01/runs/20260101T0000-240627/agent_log.jsonl outputs/replay/2026-01/runs/20260101T0000-240627/bid_2026-01-02.csv outputs/replay/2026-01/runs/20260101T0000-240627/report.md outputs/replay/2026-01/runs/20260102T0000-fba482/agent_log.jsonl outputs/replay/2026-01/runs/20260102T0000-fba482/bid_2026-01-03.csv outputs/replay/2026-01/runs/20260102T0000-fba482/report.md outputs/replay/2026-01/runs/20260103T0000-60bf7a/agent_log.jsonl outputs/replay/2026-01/runs/20260103T0000-60bf7a/bid_2026-01-04.csv outputs/replay/2026-01/runs/20260103T0000-60bf7a/report.md outputs/replay/2026-01/runs/20260104T0000-52b5f4/agent_log.jsonl outputs/replay/2026-01/runs/20260104T0000-52b5f4/bid_2026-01-05.csv outputs/replay/2026-01/runs/20260104T0000-52b5f4/report.md outputs/replay/2026-01/runs/20260105T0000-6b0d4b/agent_log.jsonl outputs/replay/2026-01/runs/20260105T0000-6b0d4b/bid_2026-01-06.csv outputs/replay/2026-01/runs/20260105T0000-6b0d4b/report.md outputs/replay/2026-01/runs/20260106T0000-3e9fbd/agent_log.jsonl outputs/replay/2026-01/runs/20260106T0000-3e9fbd/bid_2026-01-07.csv outputs/replay/2026-01/runs/20260106T0000-3e9fbd/report.md outputs/replay/2026-01/runs/20260107T0000-99c04b/agent_log.jsonl outputs/replay/2026-01/runs/20260107T0000-99c04b/bid_2026-01-08.csv outputs/replay/2026-01/runs/20260107T0000-99c04b/report.md outputs/replay/2026-01/runs/20260108T0000-85e42d/agent_log.jsonl outputs/replay/2026-01/runs/20260108T0000-85e42d/bid_2026-01-09.csv outputs/replay/2026-01/runs/20260108T0000-85e42d/report.md outputs/replay/2026-01/runs/20260109T0000-767750/agent_log.jsonl outputs/replay/2026-01/runs/20260109T0000-767750/bid_2026-01-10.csv outputs/replay/2026-01/runs/20260109T0000-767750/report.md outputs/replay/2026-01/runs/20260110T0000-c4d59c/agent_log.jsonl outputs/replay/2026-01/runs/20260110T0000-c4d59c/bid_2026-01-11.csv outputs/replay/2026-01/runs/20260110T0000-c4d59c/report.md outputs/replay/2026-01/runs/20260111T0000-761018/agent_log.jsonl outputs/replay/2026-01/runs/20260111T0000-761018/bid_2026-01-12.csv outputs/replay/2026-01/runs/20260111T0000-761018/report.md outputs/replay/2026-01/runs/20260112T0000-8e57f9/agent_log.jsonl outputs/replay/2026-01/runs/20260112T0000-8e57f9/bid_2026-01-13.csv outputs/replay/2026-01/runs/20260112T0000-8e57f9/report.md outputs/replay/2026-01/runs/20260113T0000-0fdc5a/agent_log.jsonl outputs/replay/2026-01/runs/20260113T0000-0fdc5a/bid_2026-01-14.csv outputs/replay/2026-01/runs/20260113T0000-0fdc5a/report.md outputs/replay/2026-01/runs/20260114T0000-65fc9a/agent_log.jsonl outputs/replay/2026-01/runs/20260114T0000-65fc9a/bid_2026-01-15.csv outputs/replay/2026-01/runs/20260114T0000-65fc9a/report.md outputs/replay/2026-01/runs/20260115T0000-61fe19/agent_log.jsonl outputs/replay/2026-01/runs/20260115T0000-61fe19/bid_2026-01-16.csv outputs/replay/2026-01/runs/20260115T0000-61fe19/report.md outputs/replay/2026-01/runs/20260116T0000-c3cc46/agent_log.jsonl outputs/replay/2026-01/runs/20260116T0000-c3cc46/bid_2026-01-17.csv outputs/replay/2026-01/runs/20260116T0000-c3cc46/report.md outputs/replay/2026-01/runs/20260117T0000-1fad75/agent_log.jsonl outputs/replay/2026-01/runs/20260117T0000-1fad75/bid_2026-01-18.csv outputs/replay/2026-01/runs/20260117T0000-1fad75/report.md outputs/replay/2026-01/runs/20260118T0000-5c51b7/agent_log.jsonl outputs/replay/2026-01/runs/20260118T0000-5c51b7/bid_2026-01-19.csv outputs/replay/2026-01/runs/20260118T0000-5c51b7/report.md outputs/replay/2026-01/runs/20260119T0000-7542c2/agent_log.jsonl outputs/replay/2026-01/runs/20260119T0000-7542c2/bid_2026-01-20.csv outputs/replay/2026-01/runs/20260119T0000-7542c2/report.md outputs/replay/2026-01/runs/20260120T0000-767a7f/agent_log.jsonl outputs/replay/2026-01/runs/20260120T0000-767a7f/bid_2026-01-21.csv outputs/replay/2026-01/runs/20260120T0000-767a7f/report.md outputs/replay/2026-01/runs/20260121T0000-5c3c8a/agent_log.jsonl outputs/replay/2026-01/runs/20260121T0000-5c3c8a/bid_2026-01-22.csv outputs/replay/2026-01/runs/20260121T0000-5c3c8a/report.md outputs/replay/2026-01/runs/20260122T0000-f44fe4/agent_log.jsonl outputs/replay/2026-01/runs/20260122T0000-f44fe4/bid_2026-01-23.csv outputs/replay/2026-01/runs/20260122T0000-f44fe4/report.md outputs/replay/2026-01/runs/20260123T0000-a521f9/agent_log.jsonl outputs/replay/2026-01/runs/20260123T0000-a521f9/bid_2026-01-24.csv outputs/replay/2026-01/runs/20260123T0000-a521f9/report.md outputs/replay/2026-01/runs/20260124T0000-81d6f1/agent_log.jsonl outputs/replay/2026-01/runs/20260124T0000-81d6f1/bid_2026-01-25.csv outputs/replay/2026-01/runs/20260124T0000-81d6f1/report.md outputs/replay/2026-01/runs/20260125T0000-089689/agent_log.jsonl outputs/replay/2026-01/runs/20260125T0000-089689/bid_2026-01-26.csv outputs/replay/2026-01/runs/20260125T0000-089689/report.md outputs/replay/2026-01/runs/20260126T0000-ad9f23/agent_log.jsonl outputs/replay/2026-01/runs/20260126T0000-ad9f23/bid_2026-01-27.csv outputs/replay/2026-01/runs/20260126T0000-ad9f23/report.md outputs/replay/2026-01/runs/20260127T0000-5dc6c5/agent_log.jsonl outputs/replay/2026-01/runs/20260127T0000-5dc6c5/bid_2026-01-28.csv outputs/replay/2026-01/runs/20260127T0000-5dc6c5/report.md outputs/replay/2026-01/runs/20260128T0000-899101/agent_log.jsonl outputs/replay/2026-01/runs/20260128T0000-899101/bid_2026-01-29.csv outputs/replay/2026-01/runs/20260128T0000-899101/report.md outputs/replay/2026-01/runs/20260129T0000-6d9bab/agent_log.jsonl outputs/replay/2026-01/runs/20260129T0000-6d9bab/bid_2026-01-30.csv outputs/replay/2026-01/runs/20260129T0000-6d9bab/report.md outputs/replay/2026-01/runs/20260130T0000-8ea3b5/agent_log.jsonl outputs/replay/2026-01/runs/20260130T0000-8ea3b5/bid_2026-01-31.csv outputs/replay/2026-01/runs/20260130T0000-8ea3b5/report.md outputs/replay/2026-01/runs/20260131T0000-7cfc20/agent_log.jsonl outputs/replay/2026-01/runs/20260131T0000-7cfc20/bid_2026-02-01.csv outputs/replay/2026-01/runs/20260131T0000-7cfc20/report.md pyproject.toml requirements.txt runs/.gitkeep runs/20260201T0000-1bc6db/agent_log.jsonl runs/20260201T0000-1bc6db/bid_2026-02-02.csv runs/20260201T0000-1bc6db/report.md runs/20260202T0000-bb5b9f/agent_log.jsonl runs/20260202T0000-bb5b9f/bid_2026-02-03.csv runs/20260202T0000-bb5b9f/report.md runs/20260203T0000-542a0c/agent_log.jsonl runs/20260203T0000-542a0c/bid_2026-02-04.csv runs/20260203T0000-542a0c/report.md runs/20260204T0000-5b732e/agent_log.jsonl runs/20260204T0000-5b732e/bid_2026-02-05.csv runs/20260204T0000-5b732e/report.md runs/20260205T0000-bdbc45/agent_log.jsonl runs/20260205T0000-bdbc45/bid_2026-02-06.csv runs/20260205T0000-bdbc45/report.md runs/20260206T0000-709f0d/agent_log.jsonl runs/20260206T0000-709f0d/bid_2026-02-07.csv runs/20260206T0000-709f0d/report.md runs/20260207T0000-05f42b/agent_log.jsonl runs/20260207T0000-05f42b/bid_2026-02-08.csv runs/20260207T0000-05f42b/report.md runs/20260208T0000-3d5e4b/agent_log.jsonl runs/20260208T0000-3d5e4b/bid_2026-02-09.csv runs/20260208T0000-3d5e4b/report.md runs/20260209T0000-8bd90d/agent_log.jsonl runs/20260209T0000-8bd90d/bid_2026-02-10.csv runs/20260209T0000-8bd90d/report.md runs/20260210T0000-969480/agent_log.jsonl runs/20260210T0000-969480/bid_2026-02-11.csv runs/20260210T0000-969480/report.md runs/20260211T0000-a031f5/agent_log.jsonl runs/20260211T0000-a031f5/bid_2026-02-12.csv runs/20260211T0000-a031f5/report.md runs/20260212T0000-669b12/agent_log.jsonl runs/20260212T0000-669b12/bid_2026-02-13.csv runs/20260212T0000-669b12/report.md runs/20260213T0000-715c6f/agent_log.jsonl runs/20260213T0000-715c6f/bid_2026-02-14.csv runs/20260213T0000-715c6f/report.md runs/20260214T0000-5250f4/agent_log.jsonl runs/20260214T0000-5250f4/bid_2026-02-15.csv runs/20260214T0000-5250f4/report.md runs/20260215T0000-6e6aac/agent_log.jsonl runs/20260215T0000-6e6aac/bid_2026-02-16.csv runs/20260215T0000-6e6aac/report.md runs/20260216T0000-92d84b/agent_log.jsonl runs/20260216T0000-92d84b/bid_2026-02-17.csv runs/20260216T0000-92d84b/report.md runs/20260217T0000-1fd154/agent_log.jsonl runs/20260217T0000-1fd154/bid_2026-02-18.csv runs/20260217T0000-1fd154/report.md runs/20260218T0000-edb7b1/agent_log.jsonl runs/20260218T0000-edb7b1/bid_2026-02-19.csv runs/20260218T0000-edb7b1/report.md runs/20260219T0000-eca4e8/agent_log.jsonl runs/20260219T0000-eca4e8/bid_2026-02-20.csv runs/20260219T0000-eca4e8/report.md runs/20260220T0000-3a8869/agent_log.jsonl runs/20260220T0000-3a8869/bid_2026-02-21.csv runs/20260220T0000-3a8869/report.md runs/20260221T0000-707b8d/agent_log.jsonl runs/20260221T0000-707b8d/bid_2026-02-22.csv runs/20260221T0000-707b8d/report.md runs/20260222T0000-7a4125/agent_log.jsonl runs/20260222T0000-7a4125/bid_2026-02-23.csv runs/20260222T0000-7a4125/report.md runs/20260223T0000-db7cad/agent_log.jsonl runs/20260223T0000-db7cad/bid_2026-02-24.csv runs/20260223T0000-db7cad/report.md runs/20260224T0000-abda2b/agent_log.jsonl runs/20260224T0000-abda2b/bid_2026-02-25.csv runs/20260224T0000-abda2b/report.md runs/20260225T0000-ec678b/agent_log.jsonl runs/20260225T0000-ec678b/bid_2026-02-26.csv runs/20260225T0000-ec678b/report.md runs/20260226T0000-005e97/agent_log.jsonl runs/20260226T0000-005e97/bid_2026-02-27.csv runs/20260226T0000-005e97/report.md runs/20260227T0000-19fb11/agent_log.jsonl runs/20260227T0000-19fb11/bid_2026-02-28.csv runs/20260227T0000-19fb11/report.md runs/20260228T0000-302b7a/agent_log.jsonl runs/20260228T0000-302b7a/bid_2026-03-01.csv runs/20260228T0000-302b7a/report.md runs/live_check/20260211T0000-3b1679/agent_log.jsonl runs/live_check/20260211T0000-3b1679/bid_2026-02-12.csv runs/live_check/20260211T0000-3b1679/report.md runs/llm_demo/forecasts/issue_2026-02-01.csv runs/llm_demo/runs/20260202T0000-a5258c/agent_log.jsonl runs/llm_demo/runs/20260202T0000-a5258c/bid_2026-02-03.csv runs/llm_demo/runs/20260202T0000-a5258c/report.md runs/supervisor_demo/forecasts/issue_2026-01-31.csv runs/supervisor_demo/runs/20260201T0000-1bc6db/agent_log.jsonl runs/supervisor_demo/runs/20260201T0000-1bc6db/bid_2026-02-02.csv runs/supervisor_demo/runs/20260201T0000-1bc6db/report.md runs/supervisor_demo/runs/20260201T0000-1bc6db/supervisor.json runs/supervisor_demo/runs/20260201T0000-f598e3/agent_log.jsonl runs/supervisor_demo/runs/20260201T0000-f598e3/bid_2026-02-02.csv runs/supervisor_demo/runs/20260201T0000-f598e3/report.md runs/supervisor_demo/runs/20260201T0000-f598e3/supervisor.json scripts/autopush.sh scripts/checkpoint.sh scripts/clock.sh scripts/db-check.sh scripts/deploy.sh scripts/judge.sh scripts/msg.sh scripts/new-skill.sh scripts/secret-scan.sh scripts/setup.sh scripts/smoke.sh scripts/statusline.sh scripts/sync.sh scripts/team.sh scripts/zones.sh static/index.html tests/test_agent.py tests/test_agent_resilience.py tests/test_api.py tests/test_ask.py tests/test_cli.py tests/test_data.py tests/test_features.py tests/test_live_weather.py tests/test_llm.py tests/test_models.py tests/test_planner.py tests/test_scada_freshness.py tests/test_service_aggregation.py tests/test_weather.py uv.lock web/.gitignore web/app/agent/page.tsx web/app/ask/page.tsx web/app/bid/page.tsx web/app/favicon.ico web/app/globals.css web/app/integration/page.tsx web/app/issues/page.tsx web/app/layout.tsx web/app/page.tsx web/app/quality/page.tsx web/components.json web/components/charts.tsx web/components/kit.tsx web/components/shell.tsx web/components/ui/alert.tsx web/components/ui/badge.tsx web/components/ui/button.tsx web/components/ui/card.tsx web/components/ui/input.tsx web/components/ui/label.tsx web/components/ui/select.tsx web/components/ui/separator.tsx web/components/ui/skeleton.tsx web/components/ui/sonner.tsx web/components/ui/table.tsx web/components/ui/tabs.tsx web/components/ui/textarea.tsx web/eslint.config.mjs web/lib/api.ts web/lib/utils.ts web/next.config.ts web/package.json web/pnpm-lock.yaml web/pnpm-workspace.yaml web/postcss.config.mjs web/public/file.svg web/public/globe.svg web/public/next.svg web/public/vercel.svg web/public/window.svg web/tsconfig.json
Обсуждение 0 комментариев
Войдите, чтобы комментироватьПока нет комментариев — будьте первым.