AAYMA
RU
Войти

WindCast

Агент почасово прогнозирует выработку ВЭС «Нурлы» (2 турбины Goldwind) на 48 часов с полосой неопределённости p10–p90, пересчитывает прогноз на…

Доведённый продукт
Команда «CtrlX» 27💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: 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.md

WindCast — agentic-прогноз выработки ВЭС на 24–48 часов

Диспетчер ветропарка получает почасовой прогноз выработки на двое суток вперёд — с полосой неопределённости, обоснованием каждого шага агента и проверкой допустимости погодных данных по принятому правилу исторической доступности. Трек «Энергетика», кейс: «Agentic AI для прогнозирования выработки ВЭС», кейсодатель АО «Самрук-Казына» (docs/TASK.md).

Краткое описание

В Казахстане на ВЭС приходится около 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 сверяется с фактами выпуска, иначе остаётся шаблон. Без ключа работает шаблон. Статусы по каждому требованию — в таблице «Трассировка требований».

Как работает решение

  1. Выпуск. «Прогноз на день D» делается в D+1 00:00 по Алматы: наблюдения доступны до D 23:50, горизонт — следующие 48 часов (0–23 ч — текущие сутки D+1, 24–47 ч — сутки D+2, черновик заявки до 08:00).
  2. Погода. Агент берёт из кэша (или, с --refresh, из Open-Meteo) архивные прогоны для координат парка и на каждый целевой час выбирает разрешённое поле previous_dayN.
  3. Подготовка. История двух турбин с шагом 10 минут приводится к часам: время SCADA (UTC+5) → UTC, флаги дыр и простоев; признаки из прогноза погоды на 48 часов.
  4. Модель. По прогнозному ветру считается выработка каждой турбины и парка, плюс квантили p10/p90 как мера неопределённости.
  5. Анализ. Агент проверяет результат (диапазон, скачки, покрытие часов) и при провале спускается по лестнице фолбэков: другой источник погоды → кривая мощности → климатология, записывая решение и причину.
  6. Пересчёт. Через 12 часов после выпуска появляются более свежие прогоны — агент перевыпускает прогноз (ревизия 1) на часы, которые ещё разрешено корректировать (не раньше чем через 2 ч). На графике видно и новую кривую, и то, что она заменила.
  7. Самопроверка. Агент сравнивает свои опубликованные выпуски с фактом, когда он появляется, и поднимает флаг дрейфа с рекомендацией переобучения; модель молча не меняется. В тестовом феврале факта нет — агент честно пишет, что память заморожена на 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нетautoauto — 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) проверяются локально — раздел «Прогноз на новую дату».
  • Локально: ключи и личные аккаунты не нужны. Для первой установки зависимостей требуется сеть или готовый кэш пакетов.
  1. uv sync && uv run uvicorn app.main:app --port 8000
  2. Открыть http://localhost:8000 — страница показывает выпуск, график с полосой p10–p90 и ленту шагов агента.
  3. Проверить 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
  1. Проверить выбранное архивное поле wx_field и журнал validate_weather. Расчётный запас доступности основан на правиле задержки, точное историческое время публикации не утверждается. Тесты погоды проверяют временные границы; «отравленный» тест проверяет, что замена недопустимых будущих значений не меняет прогноз.
  2. На лёгкой странице открыть «Происхождение погоды по часам», сравнить пунктир первоначального прогноза с новой ревизией и скачать CSV всех ревизий. Мощности в CSV — доли номинала 0…1; времена содержат UTC-смещение. Экспорт не является торговой заявкой.
  3. Статус «Готов к рассмотрению» означает отсутствие замечаний в загруженном журнале. При резервном пути или недоступном журнале показано предупреждение; окончательное решение остаётся за диспетчером.

Результат за февраль 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 из t00,1519

Видно, где сколько выигрыша: главный вклад даёт модель (B → C), а агентский слой добавляет сверху ещё немного (C → D). Мы не выдаём второе за первое.

Журнал решений — каждое решение агента с доверительным интервалом, а не «стало лучше»:

РешениеСработалоΔ MAE95% ДИВыигрышей
Проектный выбор 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_seamless42 ч
выброс 100 м/с во всех прогонах основного источника48 ч, переключился на gfs_seamless48 ч, но 6 часов посчитаны по битому входу
выброс 100 м/с только в самом свежем прогоне48 ч, взял более старый прогон того же источника (older_run), модель осталась основной48 ч, но 6 часов посчитаны по битому входу
основной источник недоступен48 ч, переключился на gfs_seamless0 ч
оба источника сломаны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,30660,3386
Климатология0,30390,3205
Кривая мощности0,19530,2070
GBM0,15360,1778

Покрытие p10–p90: 80,5 % / 82,0 %; средняя ширина: 49,1 / 58,2 п.п. номинала. Это измеренные значения на этих периодах, не гарантия покрытия на новых данных.

Сценарная стоимость отклонений. Используются допущения расчёта: мощность 5 МВт, цена 22,68 ₸/кВт·ч и коэффициент 0,3 на каждое абсолютное отклонение заявки D+2; считается только по часам заявки (горизонт 24–47 ч). Освобождение в пределах ±5 % и взаимозачёт не моделируются. Это не фактический счёт станции и не измеренная экономия.

МодельЯнварь, млн ₸Февраль, млн ₸
Персистентность7,447,81
Кривая мощности5,104,48
GBM3,883,84

Источник таблиц — outputs/metrics/holdout_2026-01.json и holdout_2025-02.json. Факта февраля 2026 нет, точность на тестовом феврале не заявляется.

Трассировка требований

R-IDТребованиеГде реализованоКак проверитьСтатус
R1История турбин → часовые ряды, флаги дыр и простоевapp/data.pydata/processed/hourly.parquet создан (964 КБ)✅
R2Агент сам получает архивные прогнозы, правило против утечкиapp/weather.py, data/weather_cache/uv run pytest tests/test_weather.py -q✅
R3Модели выработки с квантилями p10/p90app/models.py, app/train.pymodels/windcast.pkl (4,5 МБ); кривая мощности, бустинг + CQR, климатология✅
R4Ретроспектива: выпуск на каждый день февраляapp/service.py28 файлов outputs/forecasts/issue_*.csv + february_2026.csv✅
R5Agentic-цикл с анализом и пересчётом, работает без ключейapp/agent/28 прогонов в runs/; вклад слоя измерен — раздел «Как проверить агентность»✅
R6README и воспроизводимость в 3 команды без ключейREADME.md, scripts/smoke.sh, docs/TESTING.mdscripts/smoke.sh → SMOKE PASS✅
R7Метрики на отложенных периодах против базовых моделейapp/evaluate.pyoutputs/metrics/holdout_2026-01.json (nMAE 15,4 %) и holdout_2025-02.json (17,8 %)✅
R8API по контракту и страница с графиком и лентой агентаapp/api/routes.py, static/index.htmlcurl /api/forecast/2026-01-31; открыть http://localhost:8000✅
R9Сводка диспетчеру от LLM с проверкой чиселapp/llm.py, app/agent/orchestrator.pyforecast --issue 2026-02-01 --llm --demo-dir runs/llm_demo при LLM_API_KEY🚧
R10Второй источник погоды: разброс и фолбэкapp/weather.pygfs_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.csv5,9 МБd82def7e56c0a1eed3f2f68eb29fd66e4299999921c9703720a880a5cf7d6703
data/raw/turbine2.csv6,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.json Open-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.

Звёзды
⭐ 0
Форки
0
Язык
Python
Последний push
в прошлом месяце
Коммиты
244
Авторы
3
Файлы
417
Ветки
2

Авторы коммитов

Мустафа 168Амирхан 51Ансар 42

История коммитов

  • 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
Ветки (2)

Обсуждение 0 комментариев

Войдите, чтобы комментировать

Пока нет комментариев — будьте первым.