AAYMA
RU
Войти

TERRA

Платформа прогноза нормализованной мощности ВЭС на 24/48 ч с импортом CSV, архивными прогнозами Open-Meteo, ML-моделью и устойчивым агентным…

Прототип
Команда «Terra» 4💬 0 комментариевс 23 сентября 2026 г.

О проекте

Команда: Terra
Кейс HackAlem.ai: Энергетика — Самрук-Казына
Стадия: Прототип

Задача кейса: AI-агент, прогнозирующий выработку ветровой электростанции по погодным данным

Суть

Платформа прогноза нормализованной мощности ВЭС на 24/48 ч с импортом CSV, архивными прогнозами Open-Meteo, ML-моделью и устойчивым агентным процессом с журналом решений и replay.

Как устроено

Администратор импортирует CSV (mapping, дедупликация, SHA-256) → канонические наблюдения в PostgreSQL → weather CLI сохраняет архивные прогнозы Open-Meteo Single Runs → агент фиксирует снимок входов с проверкой available_at <= issued_at → детерминированная модель (persistence baseline, Ridge, power curve) выдаёт 24/48 точек → версия прогноза и журнал. Очередь задач в PostgreSQL с checkpoint, lease/fencing, retry; replay февраля (116 выпусков). LLM только поясняет, числа не меняет.

Ключевые решения

  • Ridge
  • power curve
  • persistence baseline
  • временная валидация
  • durable job queue
  • replay с виртуальным временем
  • as-of выбор погоды

Особенности

Очень честный README с таблицей соответствия ТЗ и явным статусом «не подтверждено»; production-подобная инфраструктура агента (lease/fencing, idempotency, restart recovery) и заготовки коннекторов Oracle / Siemens WinCC.

Стек

Next.js · TypeScript · React · PostgreSQL · Docker Compose · Open-Meteo


Проект создан за 5 часов на финале хакатона HackAlem.ai (23 сентября 2026, Астана). Код — BAITC-Hacks/hack-8e4ccf84-terra.

README

README.md

TERRA — Agentic AI для прогнозирования выработки ВЭС

TERRA — прототип платформы, которая формирует почасовой прогноз нормализованной активной мощности ветроэлектростанции на горизонте 24 или 48 часов. Система объединяет исторические измерения, архивные прогнозы погоды, ML-модель и устойчивый агентный процесс с журналом решений, повторным запуском и защитой от утечки будущих данных.

Проект создан для кейса HackAlem AI. Краткое ТЗ находится в docs/hackalem-ai-agentic-wind-forecasting.md, оригинальный PDF и два набора данных — в resources/.

Статус на 23 сентября 2026: по статическому анализу кода реализованы основные компоненты, но полный исторический сценарий ТЗ не подтверждён. В исходных CSV нет фактической выработки за февраль 2026 года, а у загружаемых погодных прогонов нет доказанного исторического времени публикации. Официальный февральский результат и превосходство модели над baseline не установлены. При этом ревью тесты, сборка и приложение не запускались; наличие кода не означает проверенную работоспособность.

Содержание

Задача и подход

По условиям кейса требуется:

  1. обучить модель на истории работы ВЭС с марта 2023 года по 31 января 2026 года;
  2. получать для координат ВЭС прогноз погоды, который был доступен в момент выпуска;
  3. формировать прогноз мощности на следующие 24–48 часов с почасовой детализацией;
  4. повторять цикл при появлении нового погодного прогона;
  5. последовательно воспроизвести выпуски с 31 января по 28 февраля 2026 года без использования будущей информации;
  6. сохранить происхождение данных, параметры, версии модели и журнал решений агента.

Ключевой принцип TERRA: числовой прогноз вычисляется детерминированным кодом, LLM используется только для анализа и пояснения. Отключение LLM не меняет прогнозные значения и не останавливает основной процесс.

Что реализовано

ВозможностьСостояниеЧто можно проверить
Защищённый dashboardРеализованоВход администратора, «Обзор», «Прогноз», «Источники», «Журнал агента»
Демонстрационный UIРеализованоСценарии: готово, частично, устарело, загрузка, пусто, ошибка
PostgreSQL и миграцииРеализованоnpm run db:migrate, автоматическая миграция в Docker
Импорт CSVРеализованоПредпросмотр, подтверждение mapping/времени/единиц, дедупликация, отчёт ошибок, SHA-256 raw-файла
Канонические наблюденияРеализованоTraining-строки попадают в observations, evaluation-only данные изолированы
Снимок входов и прогнозРеализованоПроверка доступности данных, 24/48 точек, версии и CSV export
BaselineРеализованоProduction persistence-модель использует последнее допустимое наблюдение
ML training и inferenceРеализованы в коде, историческая модель не подтвержденаRidge, power curve, временная валидация, сравнение с persistence; approved artifact подключён к синхронному и агентному пути
Agent jobsРеализованоPostgreSQL queue, checkpoint, journal, lease/fencing, retry, cancel и restart recovery
ReplayRuntime и пакетный CLIPreflight, resume, manifests, 29 дней × 2 объекта × 2 горизонта = 116 выпусков при полном наборе входов
Open-Meteo Single RunsКоннектор и запись в PostgreSQLRaw/hash, weather_runs/weather_values; исторические published_at/available_at остаются NULL и блокируют официальный расчёт
Пересчёт при новых входахЧастичноDurable input events и закреплённые snapshots; trigger сохраняет только ветер, чего недостаточно для trained inference с температурой
Оценка опубликованных прогнозовWorker и PostgreSQL реализованыИзолированные revisions факта, версии MAE/RMSE/N/coverage; HTTP endpoint пока читает legacy backtest registry
Deployment workersОписаны в ComposeБазовый dispatcher; input-trigger и evaluation включаются дополнительным Compose-файлом
Oracle / Siemens WinCCРеализованы gateway-контрактыTest/discover/enable; промышленные секреты не попадают в браузер
Официальный февральский backtestЗаблокирован даннымиНет факта за февраль и доказанного published_at архивной погоды

Предыдущий аудит: docs/backend-spec-audit.md. Более поздние изменения описаны в handoff P1–P6; актуальная статическая оценка приведена ниже.

Соответствие требованиям кейса

Оценка относится к исходникам локального main на базе 18b8a28 с учётом интеграции P7 (e2071cc), а не к запущенной системе. Отчёты прежних проверок в handoff-документах не считаются повторно выполненными проверками этого ревью.

Требование ТЗЧто сделано и гдеЧто ещё не подтверждено или не завершено
Обучение на истории до февраля 2026CSV import, training, CLI: cutoff, временная валидация, сравнение с persistenceНе предоставлены канонические архивные training snapshots и реальный approved artifact; synthetic evidence не даёт approval
Самостоятельное получение доступного на момент выпуска прогноза погодыOpen-Meteo, ingestion, CLI: координаты, raw/hash, транзакционная записьНаличие архивного run не доказывает время его публикации. Текущий ingestion сохраняет NULL для исторической доступности; официальный режим блокируется
Почасовой прогноз на 24–48 часовForecast service, approved inference: persistence либо approved model, версии и экспортПрогноз обученной модели на реальных входах не продемонстрирован; ошибка artifact не заменяется baseline
Агентный цикл: подготовка → модель → анализ → повторный расчётWorkflow, adapters, triggers: durable jobs, checkpoint, журнал, опциональный LLMWeather ingestion — отдельный CLI; единый цикл его автономного запуска агентом не подтверждён. Trigger snapshot не включает температуру, необходимую trained inference
Последовательное воспроизведение 31 января — 28 февраляBatch replay, CLI: явный календарь, preflight, resume, manifestsРеальные 116 выпусков и общий E2E не подтверждены; допустимые weather runs и модель обязательны до запуска
Использование архивных прогнозов, а не позднего фактаAs-of selection, features, evaluation: границы времени и изоляция evaluation-onlyЗащитные проверки есть в коде, но не создают отсутствующих доказательств происхождения данных

Вывод по требованиям: реализована значительная часть инфраструктуры и вычислительного пути; полное соответствие основному сценарию пока частичное. Отсутствие февральского факта блокирует оценку качества, но само по себе не мешает выпуску прогнозов. Выпуск сейчас ограничивают прежде всего доступность архивной погоды, approved model и неполный trigger snapshot.

По критериям жюри: соответствие и работоспособность (25) требуют демонстрации полного цикла; техническая реализация (25) представлена кодом, но имеет указанные разрывы; README и воспроизводимость (25) обеспечены инструкциями и контрактами, однако реальный результат не воспроизведён; применимость (15) ограничена неподтверждённой семантикой и отсутствием оценки точности; потенциал развития (10) поддерживают replay, происхождение данных и версионирование. Числовой итог из 100 без запуска и результатов не присваивается.

Как работает система

  1. Администратор регистрирует станцию, турбину или линию.
  2. Загружает CSV и подтверждает столбцы, часовой пояс, смысл метки времени, задержку доступности и единицы.
  3. Импорт сохраняет raw-файл и хеш, проверяет строки и создаёт канонические наблюдения.
  4. Отдельный weather CLI сохраняет архивный прогноз и происхождение. Для допуска в runtime нужны доказанные published_at/available_at; исследовательское допущение их не заменяет.
  5. Агент фиксирует неизменяемый снимок входов и проверяет available_at <= issued_at.
  6. Детерминированная модель формирует ровно 24 или 48 часовых точек либо возвращает явный неполный результат.
  7. Прогноз сохраняется как новая версия, решения и ошибки — в журнале агента.
  8. При включённом input-trigger worker новый допустимый набор входов ставит задачу повторного расчёта. Идемпотентность защищает от повторной публикации; ограничение trained snapshot указано выше.
  9. Replay последовательно воспроизводит исторические события с виртуальным временем.

Режимы работы:

РежимНазначение
liveТекущий оперативный прогноз
backtestИсторическая оценка последовательности прошлых выпусков
replayУправляемая симуляция потока событий

Интерфейс также разделяет два источника данных:

  • «Демонстрационные» — синтетические fixtures для полного показа UX, но не доказательство качества модели;
  • «Настоящий API» — /api/v1 с защищённой сессией. Ошибка API не заменяется fixture-данными.

Архитектура

flowchart LR
    CSV[CSV / Oracle / WinCC] --> INGEST[Импорт и качество]
    INGEST --> DB[(PostgreSQL)]
    WEATHER[Архивные прогнозы погоды] --> DB
    API[Next.js API] --> JOBS[Очередь задач]
    DISPATCHER[Job dispatcher] --> JOBS
    JOBS --> AGENT[Agent workflow]
    DB --> SNAPSHOT[Снимок available_at <= issued_at]
    SNAPSHOT --> AGENT
    AGENT --> MODEL[Persistence / approved artifact]
    MODEL --> FORECAST[(Версии прогнозов)]
    AGENT --> JOURNAL[(Checkpoint и журнал)]
    FORECAST --> UI[Dashboard / CSV]
    JOURNAL --> UI
    LLM[OpenAI, опционально] -. пояснение .-> AGENT

Стек:

  • Next.js 16, React 19, TypeScript;
  • PostgreSQL 16;
  • Drizzle ORM и SQL-репозитории;
  • Zod для входных контрактов;
  • @openai/agents для опционального reasoning-слоя;
  • Docker Compose;
  • Node test runner, tsx, ESLint и TypeScript.

Агент управляет процессом: выбирает допустимый weather run, проверяет входы, запускает расчёт, сохраняет checkpoint и объяснение. Временные границы, вычисления, авторизация, идемпотентность и публикация остаются в детерминированном коде.

Быстрый запуск в Docker

Требования

  • Docker с Compose v2;
  • свободный порт 3000 либо другой APP_PORT;
  • ресурсы, достаточные для локальной сборки Next.js и PostgreSQL.

1. Настройте .env

Скопируйте .env.example в .env и замените все replace-with-*. Не коммитьте .env.

POSTGRES_PASSWORD=local-terra-db-password
ADMIN_PASSWORD=local-terra-admin-password
ADMIN_API_TOKEN=local-terra-api-token
SESSION_SECRET=[скрыто]
JOB_TICK_SECRET=local-job-tick-secret
APP_PORT=3000
AGENT_LLM_ENABLED=false

ADMIN_PASSWORD в production должен содержать не менее 12 символов, SESSION_SECRET — не менее 32. Для production-подобной среды используйте случайные значения.

2. Соберите и запустите

docker compose up --build

Отдельный сервис migrate применяет миграции; приложение ждёт его успешного завершения. Проверьте здоровье:

curl http://localhost:3000/api/health

Ожидается:

{"status":"ok","database":"ready"}

Откройте http://localhost:3000 и войдите как admin с ADMIN_PASSWORD. Имя можно изменить через ADMIN_USERNAME.

3. Фоновые процессы

compose.yaml уже включает dispatcher для /api/v1/agent-runs; он ждёт готовности приложения. Дополнительные input-trigger и evaluation workers описаны в compose.workers.yaml:

docker compose -f compose.yaml -f compose.workers.yaml up --build -d

Перед этим задайте INPUT_TRIGGER_CONFIG и EVALUATION_CONFIG — пути к существующим JSON-конфигурациям с явными объектами, моделью, календарём и параметрами оценки. Они монтируются только для чтения. Форматы: P3, P5, P6. Эти workers не запускают загрузку погоды автоматически. Команды приведены для самостоятельного воспроизведения и в рамках этого ревью не выполнялись.

Остановка без удаления данных:

docker compose down

Команда docker compose down --volumes дополнительно и необратимо удалит локальные тома PostgreSQL и артефактов.

Deploy на сервер и обновление

Поддерживаемый репозиторием способ — Docker Compose на сервере с постоянным диском. Нужны Git-доступ к репозиторию и Docker Compose v2. Сначала разворачивается приложение с PostgreSQL и dispatcher; исторические данные, модель и дополнительные workers настраиваются отдельно. Deploy сам по себе не создаёт февральские прогнозы.

Первый deploy

В чистом checkout ветки main:

git clone https://github.com/BAITC-Hacks/hack-8e4ccf84-terra.git terra
cd terra
git switch main
git pull --ff-only origin main
cp .env.example .env

На Windows вместо cp можно использовать Copy-Item .env.example .env. Замените placeholders в .env: POSTGRES_PASSWORD, ADMIN_PASSWORD, ADMIN_API_TOKEN, SESSION_SECRET, JOB_TICK_SECRET. Используйте разные случайные значения; пароль БД — буквенно-цифровой, поскольку Compose подставляет его непосредственно в URL. ADMIN_PASSWORD должен иметь минимум 12 символов, SESSION_SECRET — 32. Для первого запуска оставьте AGENT_LLM_ENABLED=false. .env не входит в Git и Docker build context.

Установите постоянный COMPOSE_PROJECT_NAME=terra в .env: от него зависят имена образа и томов. Для публичного сервера поставьте HTTPS reverse proxy перед приложением. В текущем Compose порт публикуется как ${APP_PORT:-3000}:3000; если proxy работает на том же хосте, APP_PORT=127.0.0.1:3000 ограничивает доступ localhost. TLS/proxy конфигурация в репозитории отсутствует. Proxy должен сохранять внешний Host и передавать схему HTTPS; после настройки проверьте вход через домен и атрибут Secure у cookie. Не считайте готовность health endpoint проверкой входа.

docker compose config --quiet
docker compose build app
docker compose up -d db
docker compose run --rm migrate
docker compose up -d app dispatcher
docker compose ps -a
docker compose logs --tail=100 migrate app dispatcher
curl --fail http://127.0.0.1:3000/api/health

Сначала собирается общий образ, затем применяются миграции, затем поднимается приложение. up может повторно запустить сервис migrate как зависимость; migration runner пропускает имена из schema_migrations. При ошибке миграции остановитесь и исправьте её причину до запуска приложения. Ожидаемый health: {"status":"ok","database":"ready"}; migrate завершается с кодом 0, app и db становятся healthy, dispatcher остаётся запущенным. Войдите как admin, выберите «Настоящий API», создайте объект и импортируйте историю. Пустая БД не содержит готовой ML-модели и архивной погоды.

Compose передаёт контейнерам только переменные из соответствующих environment секций. Например, ADMIN_USERNAME, дополнительные LLM limits и industrial gateway variables из .env автоматически внутрь app не попадут: для них нужен явный локальный Compose override. Значение ARTIFACT_ROOT в контейнере уже задано как /app/artifacts.

Данные, модель и дополнительные workers

CSV из resources/ исключены из Docker image: загружайте их через «Источники» или API импорта. Weather/training/replay CLI и их ограничения описаны в разделе Agentic AI, replay и модель. Файлы конфигураций CLI должны быть доступны внутри контейнера через явно добавленный bind mount либо скопированы туда; пути хоста не становятся путями контейнера автоматически.

Approved artifact храните в томе artifacts внутри /app/artifacts; соответствующий raw_artifacts.path должен указывать на контейнерный абсолютный путь. Зарегистрируйте согласованные SHA-256, approval, версию и cutoff в реестре модели по P6. Нельзя просто назвать произвольный JSON approved-моделью.

Для input-trigger и evaluation создайте JSON по P3 и P5, затем добавьте в .env абсолютные пути на сервере deploy:

INPUT_TRIGGER_CONFIG=/srv/terra-config/input-trigger.json
EVALUATION_CONFIG=/srv/terra-config/evaluation.json
EVALUATION_POLL_MS=30000
docker compose -f compose.yaml -f compose.workers.yaml config --quiet
docker compose -f compose.yaml -f compose.workers.yaml up -d
docker compose -f compose.yaml -f compose.workers.yaml logs --tail=100 input-trigger evaluation

Оба файла обязательны для этого overlay. Workers не получают погоду сами и не устраняют пробел температуры в trigger snapshot или отсутствие февральского факта. Evaluation требует конкретные опубликованные forecastRunIds и подтверждённый semantic manifest. Не включайте его с выдуманными UUID или неподтверждённой семантикой.

Обновление существующего deploy

Сохраните предыдущий commit SHA, резервную копию PostgreSQL и тома artifacts. Остановите writers на время согласованной копии и миграции (если overlay включён, используйте оба -f во всех соответствующих командах):

git rev-parse HEAD
docker compose stop dispatcher app
git pull --ff-only origin main
docker compose build app
docker compose run --rm migrate
docker compose up -d app dispatcher
docker compose ps -a
docker compose logs --tail=100 app dispatcher
curl --fail http://127.0.0.1:3000/api/health

При включённом overlay также остановите input-trigger evaluation перед копированием/миграцией и поднимите их после успешной миграции с обоими Compose-файлами. При любой ошибке команды обновления не переходите к следующему шагу. Данные сохраняются в postgres_data и artifacts; не используйте down --volumes при обновлении. Изменение POSTGRES_PASSWORD в .env не меняет пароль уже созданного пользователя в существующей БД.

Автоматического rollback миграций нет. Откат приложения к предыдущему commit допустим только при совместимости схемы; иначе нужен согласованный план восстановления БД и artifacts из резервной копии. Проверяйте deploy отдельно от качества прогноза: health и работа dispatcher не подтверждают успешный исторический replay.

Приведённые команды — инструкция оператору. При подготовке этого README deploy, сборка, тесты и запуск сервисов не выполнялись.

Локальный запуск

Рекомендуются Node.js 22 (та же версия используется в Docker), npm 10+ и PostgreSQL 16.

npm ci

Создайте пустую БД и задайте окружение. Пример PowerShell:

$env:DATABASE_URL = "postgres://terra:password@localhost:5432/terra"
$env:ARTIFACT_ROOT = ".data/artifacts"
$env:ADMIN_PASSWORD = "local-terra-admin-password"
$env:ADMIN_API_TOKEN = "local-terra-api-token"
$env:SESSION_SECRET = "[скрыто]"
$env:JOB_TICK_SECRET = "local-job-tick-secret"
$env:AGENT_LLM_ENABLED = "false"
npm run db:migrate
npm run dev

В отдельном терминале с теми же DATABASE_URL и JOB_TICK_SECRET:

node scripts/job-dispatcher.mjs

Production-сборка:

npm run build
npm run start

Интерфейс

После входа доступны:

  • Исторический прогон (/history, стартовый экран) — выбор турбины, периода выпусков с 31 января по 28 февраля 2026 и горизонта 24/48 часов; переходы по дням, график и почасовая таблица. В деморежиме показаны синтетические выпуски двух турбин. В режиме API читаются сохранённые backtest/replay-прогнозы; новый расчёт при выборе дня не запускается. Автоматический запуск всего периода пока не подключён.
  • Обзор — состояние объекта, текущий прогноз и качество данных;
  • Прогноз — почасовой график, версии, горизонт, actuals в backtest и экспорт;
  • Источники — CSV, weather и industrial connections, импорт и отчёты;
  • Журнал агента — шаги workflow, аргументация, длительность и ошибки.

В верхней панели выбираются источник данных, live/backtest/replay, часовой пояс, язык и тема. В fixture-режиме можно отдельно проверить loading/empty/error-состояния. Все синтетические данные явно помечены.

Основной сценарий через API

Все /api/v1/* защищены cookie-сессией. Сначала выполните вход и сохраните cookie:

curl -c terra.cookies \
  -H "Content-Type: application/json" \
  -d '{"username":"admin","password":"local-terra-admin-password"}' \
  http://localhost:3000/api/auth/session

Далее передавайте -b terra.cookies.

1. Создать объект

curl -b terra.cookies \
  -H "Content-Type: application/json" \
  -d '{
    "kind":"turbine",
    "name":"Турбина 1",
    "latitude":43.645150,
    "longitude":78.535604,
    "time_zone":"Asia/Almaty",
    "power_unit":"normalized"
  }' \
  http://localhost:3000/api/v1/assets

Координаты взяты из ссылок ТЗ, однако их mapping и часовой пояс должен подтвердить владелец данных.

2. Импортировать CSV

POST /api/v1/imports принимает multipart-поля file, config (JSON) и необязательный connectionId. Сначала используйте confirmed: false, проверьте preview, затем повторите с confirmed: true.

{
  "assetId": "<UUID объекта>",
  "dialect": {"encoding":"utf-8","delimiter":",","decimalSeparator":"."},
  "mapping": {
    "timestamp": "Статистическое время",
    "windSpeed": "Средняя скорость ветра(m/s)",
    "normalizedPower": "Нормализованная активная мощность",
    "ambientTemperature": "Средняя температура окружающей среды(°C)"
  },
  "time": {
    "format": "yyyy-MM-dd HH:mm:ss",
    "timeZone": "Asia/Almaty",
    "timestampMeaning": "interval_start",
    "sourceIntervalMinutes": 10,
    "availabilityLagMinutes": 10,
    "availabilityAssumption": "available after the source interval"
  },
  "units": {
    "windSpeed": "m/s",
    "normalizedPower": "normalized",
    "ambientTemperature": "degC"
  },
  "hourlyCoverageThreshold": 1,
  "confirmed": false
}

Отчёт: GET /api/v1/imports/{id}; CSV ошибок: GET /api/v1/imports/{id}/errors. Повторный импорт не должен удваивать наблюдения.

3. Запустить прогноз

curl -b terra.cookies \
  -H "Content-Type: application/json" \
  -d '{
    "asset_ids":["<UUID объекта>"],
    "issued_at":"2026-01-31T12:00:00Z",
    "horizon_hours":24,
    "mode":"backtest",
    "model_version":"baseline",
    "data_policy":"history_only"
  }' \
  http://localhost:3000/api/v1/forecast-jobs

issued_at должен быть ровно на границе часа. Production-путь публикует только normalized. При неполных входах API возвращает явный неполный результат, а не подмену.

Для durable workflow отправьте контракт в POST /api/v1/agent-runs с уникальным Idempotency-Key. Ответ 202 содержит job_id; статус доступен по GET /api/v1/jobs/{id}, журнал — GET /api/v1/agent-runs/{id}, отмена — POST /api/v1/agent-runs/{id}/cancel.

Карта API

Метод и путьНазначение
GET /api/healthГотовность приложения и БД
POST, DELETE /api/auth/sessionВход и выход
GET, POST /api/v1/assetsСписок и регистрация объектов
GET, POST /api/v1/connectionsCSV connections и подтверждённые mappings
POST /api/v1/connections/{id}/testПроверка sample-файла
POST /api/v1/importsPreview или подтверждённый CSV import
GET /api/v1/imports/{id}Статус и отчёт импорта
POST /api/v1/training-jobsСоздание training-задачи
POST /api/v1/forecast-jobsСинхронный 24/48-часовой прогноз
GET /api/v1/forecastsПоиск сохранённых прогнозов
GET /api/v1/forecasts/{id}/exportВоспроизводимый CSV export
POST /api/v1/backtest-jobsПоследовательный backtest
GET /api/v1/evaluations/{id}Legacy backtest report; persisted evaluation worker reports пока не подключены
POST /api/v1/agent-runsDurable agent job
GET /api/v1/jobs/{id}Статус и текущий шаг
POST /api/v1/replay-sessionsСоздание replay session
POST /api/v1/replay-sessions/{id}/advanceПродвижение virtual time
POST /api/v1/industrial-connectors/{oracle|wincc}Test/discover/enable gateway

Входные данные

В resources/ находятся два CSV. Несмотря на их имена, фактический диапазон обоих файлов:

  • начало: 2023-03-11 00:00:00;
  • конец: 2026-01-31 23:50:00;
  • шаг: 10 минут;
  • строк за февраль 2026: 0.
Исходный столбецСмысл
IDID строки внутри файла
Статистическое времяЛокальная метка без указанной зоны
Средняя скорость ветра(m/s)Скорость ветра, м/с
Нормализованная активная мощностьЦель в исходной нормализованной шкале
Средняя температура окружающей среды(°C)Температура, °C

Владелец данных должен подтвердить часовой пояс, начало/конец 10-минутного интервала, задержку доступности, смысл двух рядов, формулу нормализации, номинал, mapping координат и высоту ветра.

TERRA не называет нормализованные значения МВт/МВт·ч и не объединяет два ряда без подтверждения. Подробнее: docs/data-contract.md и docs/data-audit.md.

Agentic AI, replay и модель

Agent job выполняется возобновляемыми шагами. Runtime:

  • атомарно сохраняет checkpoint и событие журнала;
  • использует lease и fencing token против устаревшей публикации;
  • ограничивает turns, tool calls и время;
  • поддерживает retry, cancel и heartbeat;
  • маскирует секреты и не сохраняет OPENAI_API_KEY в payload;
  • использует Idempotency-Key против повторной публикации.

Replay хранит виртуальное время и события погоды. advance разрешает только движение вперёд и транзакционно обновляет cursor вместе с постановкой jobs.

По умолчанию AGENT_LLM_ENABLED=false. Для пояснений:

AGENT_LLM_ENABLED=true
OPENAI_API_KEY=<ключ>
OPENAI_MODEL=<проверенная модель>
OPENAI_REASONING_EFFORT=medium

При выключенном LLM или временной ошибке детерминированные gates продолжают работать, журнал фиксирует fallback.

Репозиторий содержит persistence baseline, признаки, ridge, power curve, временную валидацию, artifacts и backtest с MAE/RMSE. Обязательные gates:

  • только available_at <= issued_at;
  • target_time = issued_at + lead_hour;
  • февральские targets — только evaluation_only;
  • мартовский хвост не входит в февральскую метрику;
  • при N = 0 метрика отсутствует, а не равна нулю;
  • фактическая погода не заменяет архивный forecast;
  • выбор модели по февральской метрике запрещён.

Production inference поддерживает явно выбранный persistence и approved trained artifact. Загрузчик сверяет approval в реестре, версию, cutoff, SHA-256 файла и checksum artifact; файл должен находиться внутри ARTIFACT_ROOT. Ошибка trained inference не приводит к скрытому переходу на baseline. Создание artifact через CLI само по себе не регистрирует его в production: нужны запись model_versions, связанный raw_artifacts и доступный runtime файл.

Исторический сценарий через CLI

Ниже указаны существующие entry points, а не свидетельство выполненного прогона. Нужны мигрированная БД, зарегистрированные UUID объектов, подтверждённая семантика и конфигурации. Сначала загружаются история и погода, затем обучается и регистрируется допустимая модель; для replay должны работать приложение и dispatcher.

node --import tsx scripts/weather-ingest.ts weather-config.json
node --import tsx scripts/train-approved.ts --input training-manifest.json --out .data/ml/approved
node --import tsx scripts/replay-february.ts --assets <uuid1>,<uuid2> --model <approved-model-uuid> --timezone Asia/Almaty --issue-hour 0 --mode replay --from 2026-01-31 --to 2026-02-28 --output .data/replay
node --import tsx scripts/evaluate-forecasts.ts evaluation-request.json actuals.json

Asia/Almaty здесь пример явного календаря, а не подтверждение timezone исходных CSV. Форматы входов и порядок регистрации описаны в P1, P2, P4, P5, P6.

  • Weather CLI сохраняет архивные данные, но возвращает код 2 при недоказанной исторической доступности; их нельзя автоматически считать пригодными для следующего шага.
  • Training без исторических snapshots не даёт подтверждённую модель. Синтетические входы остаются candidate.
  • Batch replay сохраняет manifests и почасовой JSON с происхождением; повтор той же команды возобновляет пакет. Его officialResult всегда false: успешное исполнение ещё не подтверждает официальный результат.
  • Evaluation использует отдельные revisions факта и сохраняет версии отчёта в PostgreSQL. Требуется подтверждённый semantic manifest; шаблон semantic-manifest.json содержит UNKNOWN. Нет пар — нет числовой метрики.

Проверки

Во время обновления README выполнено только чтение исходников и ревью diff. Тесты, lint, typecheck, сборка, Docker и проект не запускались по просьбе пользователя. Следующие команды — инструкция для будущей проверки, не список PASS.

Основной набор:

npm test
npm run test:foundation
npm run test:agent
npm run test:agent:replay
node --test tests/weather/weather.test.mjs
node --test tests/acceptance/harness.test.mjs
npm run lint
npm run typecheck
npm run build
docker compose config --quiet
docker compose build app

PostgreSQL integration требует отдельную одноразовую БД. Agent test намеренно отказывается от URL, имя БД которого не содержит test.

$env:TEST_DATABASE_URL = "postgres://terra:password@localhost:5432/terra_test"
npm run test:postgres
npm run test:agent:integration

OpenAI smoke по умолчанию пропускается:

$env:RUN_OPENAI_SMOKE = "1"
$env:OPENAI_API_KEY = "..."
$env:OPENAI_MODEL = "..."
npm run test:agent:openai

Acceptance harness:

node --test tests/acceptance/harness.test.mjs
node tests/acceptance/run.mjs verify

Harness подключён к demo:import/train/backtest/export/verify. Команды выполняют synthetic component integration suites на disposable PostgreSQL, сохраняют журналы и отдельный historical BLOCKED отчёт. Это ещё не единая сквозная цепочка; demo:verify не возвращает общий PASS. Настройка и повторный запуск: docs/demo.md.

Структура репозитория

app/                         Next.js App Router и HTTP routes
src/components/dashboard/    Dashboard, API client и fixtures
src/server/agent/             Production agent workflow и adapters
src/server/connectors/        CSV, Open-Meteo и industrial contracts
src/server/data/              Импорт, качество и snapshots
src/server/db/migrations/     SQL migrations
src/server/forecast/          Расчёт, публикация и хранилище прогнозов
src/server/jobs/              Durable jobs, lease, checkpoint и runner
src/server/ml/                Baseline, features, ridge и training
src/server/replay/            Виртуальные часы и replay sessions
src/server/backtest/          Backtest и leakage gates
src/server/triggers/          Обнаружение новых входов и durable input events
src/server/evaluation/        Изолированный факт и persisted evaluation reports
tests/                        Unit, integration, UI и acceptance tests
scripts/                      Миграции, dispatcher, weather/training/replay/evaluation CLI
resources/                    ТЗ и исходные CSV
docs/                         Контракты, аудиты и demo-инструкции
samples/                      Synthetic CC0 smoke fixture

В проекте временно есть app/ и src/app/: корневой app/ — фактический App Router, часть handlers делегирует реализацию модулям из src/app/.

Переменные окружения

ПеременнаяОбязательностьНазначение
DATABASE_URLДа вне ComposePostgreSQL URL
POSTGRES_PASSWORDДля ComposeПароль PostgreSQL
ADMIN_USERNAMEНетLogin, по умолчанию admin
ADMIN_PASSWORDДаПароль веб-сессии
ADMIN_API_TOKENДаВнутренний token backtest/evaluation/export
SESSION_SECRETДаHMAC cookie secret, минимум 32 символа
JOB_TICK_SECRETДля agent jobsЗащита internal tick
ARTIFACT_ROOTНетRaw/artifacts, по умолчанию .data/artifacts
IMPORT_BATCH_SIZEНетBatch импорта, по умолчанию 500
FORECAST_CONFIG_VERSIONНетForecast config, по умолчанию baseline-v1
AGENT_LLM_ENABLEDНетВключение LLM, по умолчанию false
OPENAI_API_KEYПри LLMКлюч OpenAI, не сохраняется в jobs
OPENAI_MODELПри LLMЯвно проверенная модель
AGENT_MAX_TURNSНетЛимит turns, по умолчанию 8
AGENT_MAX_TOOL_EXECUTIONSНетЛимит tools, по умолчанию 16
AGENT_LLM_TIMEOUT_MSНетLLM timeout, по умолчанию 30000
AGENT_TOOL_TIMEOUT_MSНетTool timeout, по умолчанию 45000
AGENT_TICK_BUDGET_MSНетTick budget, по умолчанию 60000
AGENT_LEASE_MSНетLease, по умолчанию 90000
AGENT_HEARTBEAT_MSНетHeartbeat, по умолчанию 15000
JOB_DISPATCHER_BASE_URLНетApp URL, по умолчанию http://localhost:3000
JOB_DISPATCHER_INTERVAL_MSНетПауза ticks, по умолчанию 1000
INPUT_TRIGGER_CONFIGДля worker ComposeПуть к JSON с объектами, моделью и календарём input-trigger
EVALUATION_CONFIGДля worker ComposeПуть к JSON с forecastRunIds, calendarTimezone и manifest
EVALUATION_POLL_MSНетПауза evaluation worker, по умолчанию 30000
ORACLE_CONNECTOR_GATEWAY_URL/TOKENДля OracleURL и token server gateway
WINCC_CONNECTOR_GATEWAY_URL/TOKENДля WinCCURL и token server gateway

Базовый безопасный шаблон: .env.example.

Ограничения

  1. В CSV нет февральского факта, поэтому официальный MAE/RMSE за 1–28 февраля не вычисляется.
  2. Open-Meteo evidence не доказывает исторический момент публикации weather run.
  3. Weather ingestion пишет в canonical tables, но оставляет исторические published_at/available_at NULL; production runtime такие runs не допускает.
  4. Trained inference подключён, но реальный approved artifact и его качество не подтверждены. Input-trigger snapshot содержит только ветер, без требуемой температуры.
  5. Legacy training/backtest stores остаются локальными/in-memory. Новый evaluation worker сохраняет отчёты в PostgreSQL, но /api/v1/evaluations/{id} всё ещё читает legacy registry.
  6. Dashboard adapters согласованы с canonical envelopes в коде; HTTP/browser E2E в этом ревью не проверялся. Синтетический UI не доказывает работу на реальных данных.
  7. Dispatcher включён в Compose; автоматический input-trigger и evaluation требуют отдельного worker-конфига, а weather ingestion остаётся отдельным шагом.
  8. Без подтверждения семантики нельзя переводить мощность в MW/MWh или суммировать два ряда.

Проект не маскирует эти ограничения синтетическими результатами и не подменяет архивный прогноз фактической погодой.

Дополнительная документация

Дальнейшее развитие

Следующие шаги для соответствия ТЗ: сохранять полный набор trained features в input-trigger snapshot; подключить persisted evaluations к API; связать получение погоды с автономным циклом; подтвердить семантику источника и историческую доступность weather runs; обучить и зарегистрировать реальный artifact; воспроизвести последовательность февральских выпусков и отдельно оценить их по закрытому факту. Изменения этих компонентов в рамках обновления README не выполнялись.

Звёзды
⭐ 0
Форки
0
Язык
TypeScript
Последний push
в прошлом месяце
Коммиты
198
Авторы
4
Файлы
328
Ветки
21

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

barrstorm6 89Elnar Saparov 57Kassymzhan Nuraliyev 42Kassco1212 10

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

  • 2026-09-23 17:49Merge remote-tracking branch 'origin/main'barrstorm6
  • 2026-09-23 17:49docs: reconcile deployment guide with latest P7 mainbarrstorm6
  • 2026-09-23 17:49chore: normalize acceptance runner end of filebarrstorm6
  • 2026-09-23 17:49docs: integrate deployment instructionsbarrstorm6
  • 2026-09-23 17:48docs: document Docker deployment and safe update procedurebarrstorm6
  • 2026-09-23 17:48test: wire P7 acceptance gates and record integration blockersbarrstorm6
  • 2026-09-23 17:47docs: integrate requirements assessment into local main baselinebarrstorm6
  • 2026-09-23 17:46docs: assess case requirements and refresh implementation statusbarrstorm6
Все коммиты (198)
  • 2026-09-23 17:41merge: preserve latest production wiring and handoff removalKassymzhan Nuraliyev
  • 2026-09-23 17:40merge: integrate concise UI into local mainKassymzhan Nuraliyev
  • 2026-09-23 17:38chore: integrate state handoff removalbarrstorm6
  • 2026-09-23 17:38chore: remove state handoff filebarrstorm6
  • 2026-09-23 17:36feat: integrate P6 production wiring and canonical dashboardbarrstorm6
  • 2026-09-23 17:35chore: reconcile P6 with latest main and parallel handoffsbarrstorm6
  • 2026-09-23 17:35feat: connect approved inference and input evaluation workersbarrstorm6
  • 2026-09-23 17:33Merge branch 'main' into refactor/ui-content-cleanupKassco1212
  • 2026-09-23 17:32Merge remote-tracking branch 'origin/main'barrstorm6
  • 2026-09-23 17:31Merge remote-tracking branch 'origin/main'barrstorm6
  • 2026-09-23 17:30docs: record forecast KPI integrationElnar Saparov
  • 2026-09-23 17:30docs: record verified UI cleanup branchKassymzhan Nuraliyev
  • 2026-09-23 17:29Merge remote-tracking branch 'origin/main' into chore/integrate-forecast-kpi-cardsElnar Saparov
  • 2026-09-23 17:29feat: integrate P3 durable input triggers into local mainbarrstorm6
  • 2026-09-23 17:29merge: preserve latest theme readability workElnar Saparov
  • 2026-09-23 17:29merge: preserve current login and job feedback during UI cleanupKassymzhan Nuraliyev
  • 2026-09-23 17:29docs: record theme readability integrationElnar Saparov
  • 2026-09-23 17:29feat: integrate P5 versioned evaluation into local mainbarrstorm6
  • 2026-09-23 17:29chore: integrate validated P5 dependency preserving branch handoffsbarrstorm6
  • 2026-09-23 17:28merge: integrate forecast KPI cardsElnar Saparov
  • 2026-09-23 17:28refactor: simplify dashboard content and localized wordingKassymzhan Nuraliyev
  • 2026-09-23 17:28feat: integrate P2 trained inference into local mainbarrstorm6
  • 2026-09-23 17:28merge: integrate theme readability fixesElnar Saparov
  • 2026-09-23 17:28chore: integrate validated P3 dependency for runtime wiringbarrstorm6
  • 2026-09-23 17:28chore: integrate validated P2 dependency for runtime wiringbarrstorm6
  • 2026-09-23 17:28feat: integrate canonical weather ingestion with local mainbarrstorm6
  • 2026-09-23 17:27feat: simplify forecast KPI cardsElnar Saparov
  • 2026-09-23 17:27feat: add injectable runtime inference and canonical dashboard adaptersbarrstorm6
  • 2026-09-23 17:27fix: improve theme and localization readabilityElnar Saparov
  • 2026-09-23 17:25docs: record job feedback integrationElnar Saparov
  • 2026-09-23 17:25feat: version published forecast evaluations and isolated actualsbarrstorm6
  • 2026-09-23 17:24feat: integrate validated P4 historical replay batchbarrstorm6
  • 2026-09-23 17:24fix: show job refresh feedbackElnar Saparov
  • 2026-09-23 17:24feat: add durable input discovery and trigger workerbarrstorm6
  • 2026-09-23 17:22docs: record login hero integrationElnar Saparov
  • 2026-09-23 17:21merge: incorporate latest main before login heroElnar Saparov
  • 2026-09-23 17:19feat: add validated trained model inference and reproducible approval CLIbarrstorm6
  • 2026-09-23 17:19fix: allow local loopback login originElnar Saparov
  • 2026-09-23 17:18fix: require explicit UTC ingestion calendarbarrstorm6
  • 2026-09-23 17:16docs: record verified reference chart integrationKassymzhan Nuraliyev
  • 2026-09-23 17:16merge: integrate reference chart and validated UX fixesKassymzhan Nuraliyev
  • 2026-09-23 17:16merge: integrate minimal localized login heroElnar Saparov
  • 2026-09-23 17:14fix: retain touch tooltip through mobile layout changesKassymzhan Nuraliyev
  • 2026-09-23 17:13feat: add resumable February replay batch and canonical exportbarrstorm6
  • 2026-09-23 17:13feat: match reference forecast chart and fix UX regressionsKassymzhan Nuraliyev
  • 2026-09-23 17:13feat: persist validated archived weather atomicallybarrstorm6
  • 2026-09-23 17:11feat: simplify localized login heroElnar Saparov
  • 2026-09-23 17:02docs: reconcile parallel specification handoff for local mainbarrstorm6
  • 2026-09-23 17:02docs: specify parallel agent completion tasks and local integrationbarrstorm6
  • 2026-09-23 17:00feat: make historical forecast exploration the primary UI flowbarrstorm6
  • 2026-09-23 16:52Merge remote-tracking branch 'origin/main'barrstorm6
  • 2026-09-23 16:51docs: record README on local mainbarrstorm6
  • 2026-09-23 16:49docs: record README integration statusbarrstorm6
  • 2026-09-23 16:49docs: record verified connector integration on mainKassymzhan Nuraliyev
  • 2026-09-23 16:49merge: integrate connector workspace with latest overviewKassymzhan Nuraliyev
  • 2026-09-23 16:48merge: incorporate latest local mainbarrstorm6
  • 2026-09-23 16:45merge: integrate Russian project READMEbarrstorm6
  • 2026-09-23 16:45feat: complete five-source connector workspaceKassymzhan Nuraliyev
  • 2026-09-23 16:44docs: record overview on local mainbarrstorm6
  • 2026-09-23 16:43docs: record overview integration statusbarrstorm6
  • 2026-09-23 16:43merge: integrate terra overview redesignbarrstorm6
  • 2026-09-23 16:42feat: implement terra overview redesignbarrstorm6
  • 2026-09-23 16:41docs: add detailed Russian project READMEbarrstorm6
  • 2026-09-23 16:31docs: record final integration checksElnar Saparov
  • 2026-09-23 16:24Merge remote-tracking branch 'origin/main' into chore/integrate-backend-spec-auditElnar Saparov
  • 2026-09-23 16:24docs: verify backend audit on mainElnar Saparov
  • 2026-09-23 16:23Merge remote-tracking branch 'origin/main'Kassymzhan Nuraliyev
  • 2026-09-23 16:23docs: add TERRA dashboard UI prototypeKassymzhan Nuraliyev
  • 2026-09-23 16:22docs: finalize backend audit handoffElnar Saparov
  • 2026-09-23 16:21Merge remote-tracking branch 'origin/main' into chore/integrate-backend-spec-auditElnar Saparov
  • 2026-09-23 16:20docs: record backend audit integrationElnar Saparov
  • 2026-09-23 16:16docs: record local remediation spec integrationElnar Saparov
  • 2026-09-23 16:16merge: integrate backend specification auditElnar Saparov
  • 2026-09-23 16:16merge: integrate agent remediation specificationElnar Saparov
  • 2026-09-23 16:15fix: harden backend forecast integrityElnar Saparov
  • 2026-09-23 16:10merge: include latest main in remediation specElnar Saparov
  • 2026-09-23 16:07merge: reconcile agent remediation specificationElnar Saparov
  • 2026-09-23 16:07docs: record local test login integrationbarrstorm6
  • 2026-09-23 16:04merge: include latest main agent rulesbarrstorm6
  • 2026-09-23 16:03merge: reconcile latest local main with test loginbarrstorm6
  • 2026-09-23 15:59upd AGENTS.mdbarrstorm6
  • 2026-09-23 15:58Merge remote-tracking branch 'origin/main'barrstorm6
  • 2026-09-23 15:58docs: record local main agent integrationbarrstorm6
  • 2026-09-23 15:57docs: record test login integrationbarrstorm6
  • 2026-09-23 15:56docs: record local agent integrationbarrstorm6
  • 2026-09-23 15:56merge: integrate wind forecast agent runtimebarrstorm6
  • 2026-09-23 15:52docs: record agent runtime validationbarrstorm6
  • 2026-09-23 15:52merge: integrate local test loginbarrstorm6
  • 2026-09-23 15:51feat: add wind forecast agent runtimebarrstorm6
  • 2026-09-23 15:51docs: record connector integration on mainElnar Saparov
  • 2026-09-23 15:50fix: add local test login credentialsbarrstorm6
  • 2026-09-23 15:50docs: record refreshed integration validationElnar Saparov
  • 2026-09-23 15:49merge: refresh latest main before connector pushElnar Saparov
  • 2026-09-23 15:48docs: record connector integration validationElnar Saparov
  • 2026-09-23 15:48merge: integrate Oracle and WinCC connectorsElnar Saparov
  • 2026-09-23 15:41Merge pull request #4 from BAITC-Hacks/docs/s09-reproducibilityKassco1212
  • 2026-09-23 15:40docs: record connector validation after rebaseElnar Saparov
  • 2026-09-23 15:36docs: record final local S03 reconciliationKassymzhan Nuraliyev
  • 2026-09-23 15:36Merge branch 'main' into docs/s09-reproducibilityKassco1212
  • 2026-09-23 15:36merge: reconcile local main S09 with S03 weather runsKassymzhan Nuraliyev
  • 2026-09-23 15:35docs: record reconciled S03 integrationKassymzhan Nuraliyev
  • 2026-09-23 15:35docs: finalize local main S09 handoffKassymzhan Nuraliyev
  • 2026-09-23 15:34docs: reconcile S09 integration stateKassymzhan Nuraliyev
  • 2026-09-23 15:34merge: reconcile latest main with S03 weather runsKassymzhan Nuraliyev
  • 2026-09-23 15:34docs: record S03 local integration validationKassymzhan Nuraliyev
  • 2026-09-23 15:33merge: incorporate latest local mainKassymzhan Nuraliyev
  • 2026-09-23 15:33docs: record local S09 integration stateKassymzhan Nuraliyev
  • 2026-09-23 15:33merge: integrate S09 reproducibility handoffKassymzhan Nuraliyev
  • 2026-09-23 15:32feat: add Oracle and WinCC connector workflowsElnar Saparov
  • 2026-09-23 15:32merge: integrate S03 weather runsKassymzhan Nuraliyev
  • 2026-09-23 15:31Merge pull request #3 from BAITC-Hacks/feat/s05-dashboardKassco1212
  • 2026-09-23 15:25upd AGENTS.mdbarrstorm6
  • 2026-09-23 15:24Merge branch 'main' into feat/s05-dashboardKassco1212
  • 2026-09-23 15:20docs: specify agent subsystem remediationElnar Saparov
  • 2026-09-23 15:15docs: record verified industrial portal integrationKassymzhan Nuraliyev
  • 2026-09-23 15:15merge: integrate industrial portal with multilingual protected accessKassymzhan Nuraliyev
  • 2026-09-23 15:13docs: record portal validation against current API slicesKassymzhan Nuraliyev
  • 2026-09-23 15:12Merge remote-tracking branch 'origin/main'barrstorm6
  • 2026-09-23 15:12add instruction for SLICESbarrstorm6
  • 2026-09-23 15:10feat: add industrial multilingual portal with protected sign-inKassymzhan Nuraliyev
  • 2026-09-23 15:10docs: record agent audit on mainElnar Saparov
  • 2026-09-23 15:09docs: record agent audit integrationElnar Saparov
  • 2026-09-23 15:09merge: integrate agent subsystem auditElnar Saparov
  • 2026-09-23 15:08docs: document agent subsystem gapsElnar Saparov
  • 2026-09-23 15:05clean upbarrstorm6
  • 2026-09-23 15:02docs: record local specification integrationbarrstorm6
  • 2026-09-23 15:02docs: integrate HackAlem AI specificationbarrstorm6
  • 2026-09-23 15:00docs: record specification conversion statusbarrstorm6
  • 2026-09-23 15:00docs: add HackAlem AI case specificationbarrstorm6
  • 2026-09-23 14:49docs: record CSV integration on mainElnar Saparov
  • 2026-09-23 14:48merge: update CSV integration with latest mainElnar Saparov
  • 2026-09-23 14:48merge: integrate CSV import quality workflowElnar Saparov
  • 2026-09-23 14:40merge: record build validationbarrstorm6
  • 2026-09-23 14:40docs: record build validationbarrstorm6
  • 2026-09-23 14:39ignore worktreesbarrstorm6
  • 2026-09-23 14:35merge: integrate S01 auth bridge into local mainbarrstorm6
  • 2026-09-23 14:34Merge branch 'main' into feat/s03-weather-runsKassco1212
  • 2026-09-23 14:33merge: preserve S04 main updates alongside S01barrstorm6
  • 2026-09-23 14:33docs: record local S04 main integrationbarrstorm6
  • 2026-09-23 14:31merge: preserve S07 main updates alongside S01barrstorm6
  • 2026-09-23 14:31Merge branch 'main' into chore/integrate-s04-localbarrstorm6
  • 2026-09-23 14:31Merge branch 'main' into docs/s09-reproducibilityKassco1212
  • 2026-09-23 14:30Merge branch 'feat/s04-forecast-baseline' into chore/integrate-s04-localbarrstorm6
  • 2026-09-23 14:30merge: preserve S05 main updates alongside S01barrstorm6
  • 2026-09-23 14:29merge: integrate S01 and S07 into local mainbarrstorm6
  • 2026-09-23 14:28docs: record CSV branch remote resultElnar Saparov
  • 2026-09-23 14:28merge: integrate S01 foundation into local mainbarrstorm6
  • 2026-09-23 14:28Merge branch 'main' into docs/s09-reproducibilityKassco1212
  • 2026-09-23 14:28feat: publish versioned as-of baseline forecastsbarrstorm6
  • 2026-09-23 14:28docs: record merged CSV validationElnar Saparov
  • 2026-09-23 14:26fix: bridge admin sessions to backtest routesbarrstorm6
  • 2026-09-23 14:26Merge remote-tracking branch 'origin/main' into feat/csv-import-qualityElnar Saparov
  • 2026-09-23 14:25docs: record verified S05 main integrationKassymzhan Nuraliyev
  • 2026-09-23 14:24docs: record validated CSV ingestion handoffElnar Saparov
  • 2026-09-23 14:24merge: preserve concurrent S08 integration alongside dashboardKassymzhan Nuraliyev
  • 2026-09-23 14:24merge: bring S01 foundation into S07 integrationbarrstorm6
  • 2026-09-23 14:24Merge branch 'main' into feat/s05-dashboardKassco1212
  • 2026-09-23 14:23feat: add S07 resumable agent workflowbarrstorm6
  • 2026-09-23 14:23feat: add idempotent CSV ingestionElnar Saparov
  • 2026-09-23 14:22merge: integrate Russian forecasting dashboardKassymzhan Nuraliyev
  • 2026-09-23 14:22fix: reject published placeholder auth secretsbarrstorm6
  • 2026-09-23 14:21docs: record S08 main integrationElnar Saparov
  • 2026-09-23 14:20Merge remote-tracking branch 'origin/main' into chore/integrate-s08-backtestElnar Saparov
  • 2026-09-23 14:19docs: record verified S05 branch handoffKassymzhan Nuraliyev
  • 2026-09-23 14:19fix: preserve API adapters while exposing dashboard routesKassymzhan Nuraliyev
  • 2026-09-23 14:16feat: add S01 database and authenticated API foundationbarrstorm6
  • 2026-09-23 14:16feat: add Russian wind forecasting dashboardKassymzhan Nuraliyev
  • 2026-09-23 14:15feat: add S01 database and authenticated API foundationbarrstorm6
  • 2026-09-23 14:15Merge remote-tracking branch 'origin/main' into chore/integrate-s08-backtestElnar Saparov
  • 2026-09-23 14:14docs: record E5 main integrationElnar Saparov
  • 2026-09-23 14:13docs: reconcile S08 integration stateElnar Saparov
  • 2026-09-23 14:13merge: integrate TypeScript model validationElnar Saparov
  • 2026-09-23 14:09docs: record validated E5 handoffElnar Saparov
  • 2026-09-23 14:08docs: record validated S08 handoffElnar Saparov
  • 2026-09-23 14:07feat: add TypeScript model training and validationElnar Saparov
  • 2026-09-23 14:04feat: add backtest evaluation and exportElnar Saparov
  • 2026-09-23 14:02docs: record verified S09 branch push and remaining blockersKassymzhan Nuraliyev
  • 2026-09-23 14:01docs: add S09 reproducibility handoff and blocked acceptance gateKassymzhan Nuraliyev
  • 2026-09-23 14:01Merge pull request #1 from BAITC-Hacks/docs/s00-data-auditKassco1212
  • 2026-09-23 14:01feat: define S01 server contracts gatebarrstorm6
  • 2026-09-23 14:00docs: record verified weather handoff publicationKassymzhan Nuraliyev
  • 2026-09-23 13:59docs: record weather verification push and S01 integration handoffKassymzhan Nuraliyev
  • 2026-09-23 13:58feat: validate archived weather runs and admissible fallbackKassymzhan Nuraliyev
  • 2026-09-23 13:57update AGENTS.mdbarrstorm6
  • 2026-09-23 13:56update SLICES.mdbarrstorm6
  • 2026-09-23 13:51docs: record verified S00 remote handoffKassymzhan Nuraliyev
  • 2026-09-23 13:51docs: audit S00 source data and define input contractKassymzhan Nuraliyev
  • 2026-09-23 13:48feat: define S01 server contracts gatebarrstorm6
  • 2026-09-23 13:41add planesbarrstorm6
  • 2026-09-23 13:31init commitbarrstorm6
Структура репозитория (328 файлов)
.dockerignore
.env.example
.gitignore
AGENTS.md
CLAUDE.md
Dockerfile
Makefile
PLAN.md
README.md
SLICE_RULE.md
app/(dashboard)/agent-log/page.tsx
app/(dashboard)/forecast/page.tsx
app/(dashboard)/history/page.tsx
app/(dashboard)/layout.tsx
app/(dashboard)/overview/page.tsx
app/(dashboard)/sources/page.tsx
app/api/auth/session/route.ts
app/api/health/route.ts
app/api/internal/jobs/tick/route.ts
app/api/v1/agent-runs/[id]/cancel/route.ts
app/api/v1/agent-runs/[id]/route.ts
app/api/v1/agent-runs/route.ts
app/api/v1/assets/route.ts
app/api/v1/backtest-jobs/route.ts
app/api/v1/connections/[id]/test/route.ts
app/api/v1/connections/route.ts
app/api/v1/connectors/weather/route.ts
app/api/v1/evaluations/[id]/route.ts
app/api/v1/forecast-jobs/route.ts
app/api/v1/forecasts/[id]/export/route.ts
app/api/v1/forecasts/route.ts
app/api/v1/imports/[id]/errors/route.ts
app/api/v1/imports/[id]/route.ts
app/api/v1/imports/route.ts
app/api/v1/industrial-connectors/[kind]/route.ts
app/api/v1/jobs/[id]/route.ts
app/api/v1/replay-sessions/[id]/advance/route.ts
app/api/v1/replay-sessions/[id]/route.ts
app/api/v1/replay-sessions/route.ts
app/api/v1/training-jobs/route.ts
app/favicon.ico
app/health/route.ts
app/layout.tsx
app/login/page.tsx
app/page.tsx
compose.workers.yaml
compose.yaml
docs/acceptance.md
docs/agent-runtime-verification.md
docs/agent-subsystem-remediation-spec.md
docs/agent-system-problems.md
docs/backend-spec-audit.md
docs/data-audit.md
docs/data-contract.md
docs/demo.md
docs/design/terra-redesign.html
docs/hackalem-ai-agentic-wind-forecasting.md
docs/handoffs/kassym-s05.md
docs/handoffs/kassymzhan-s03.md
docs/handoffs/parallel-P1.md
docs/handoffs/parallel-P2.md
docs/handoffs/parallel-P3.md
docs/handoffs/parallel-P4.md
docs/handoffs/parallel-P5.md
docs/handoffs/parallel-P6.md
docs/handoffs/parallel-P7.md
docs/industrial-connectors.md
docs/parallel-agent-completion-spec.md
docs/progress/bibarys.md
docs/weather-verification.md
eslint.config.mjs
next.config.ts
package-lock.json
package.json
postcss.config.mjs
proxy.ts
public/file.svg
public/globe.svg
public/next.svg
public/vercel.svg
public/window.svg
resources/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 1.csv
resources/Dataset HackAlemAI для участников 11.03.2023-28.02.2026 - turbine 2.csv
resources/HackAlem AI_ Agentic AI для прогнозирования выработки ВЭС.pdf
samples/.gitattributes
samples/README.md
samples/history.csv
samples/manifest.json
scripts/demo-acceptance.mjs
scripts/evaluate-forecasts.ts
scripts/input-trigger-worker.ts
scripts/job-dispatcher.mjs
scripts/migrate.mjs
scripts/replay-february.ts
scripts/train-approved.ts
scripts/weather-ingest.ts
src/agent/agent-factory.ts
src/agent/errors.ts
src/agent/evaluation.ts
src/agent/events.ts
src/agent/limits.ts
src/agent/redact.ts
src/agent/retry.ts
src/agent/runner.ts
src/agent/runtime.ts
src/agent/state.ts
src/agent/tool.ts
src/agent/types.ts
src/app/(dashboard)/agent-log/page.tsx
src/app/(dashboard)/forecast/page.tsx
src/app/(dashboard)/history/page.tsx
src/app/(dashboard)/layout.tsx
src/app/(dashboard)/overview/page.tsx
src/app/(dashboard)/sources/page.tsx
src/app/api/v1/backtest-jobs/route.ts
src/app/api/v1/evaluations/[id]/route.ts
src/app/api/v1/forecasts/[id]/export/route.ts
src/app/api/v1/training-jobs/route.ts
src/app/globals.css
src/app/layout.tsx
src/app/login/page.tsx
src/app/page.tsx
src/components/dashboard/agent-log.tsx
src/components/dashboard/chart.tsx
src/components/dashboard/client.ts
src/components/dashboard/contracts.ts
src/components/dashboard/csv.ts
src/components/dashboard/fixtures.ts
src/components/dashboard/forecast.tsx
src/components/dashboard/history-data.ts
src/components/dashboard/history.tsx
src/components/dashboard/industrial-connectors.tsx
src/components/dashboard/job.tsx
src/components/dashboard/overview-metrics.ts
src/components/dashboard/overview.tsx
src/components/dashboard/resource.tsx
src/components/dashboard/shell.tsx
src/components/dashboard/source-contracts.ts
src/components/dashboard/sources.tsx
src/components/dashboard/weather-connector.tsx
src/components/platform/icon.tsx
src/components/platform/login.tsx
src/components/platform/preferences.tsx
src/components/platform/wind-scene.tsx
src/db/client.ts
src/db/repositories/approvals.ts
src/db/repositories/events.ts
src/db/repositories/runs.ts
src/db/schema.ts
src/domain/config.ts
src/domain/demo/config.ts
src/domain/demo/fixtures.ts
src/domain/demo/prompt.ts
src/domain/demo/schemas.ts
src/domain/demo/tools/apply-case-action.ts
src/domain/demo/tools/get-case.ts
src/domain/demo/tools/search-guidance.ts
src/lib/api.ts
src/lib/env.ts
src/lib/i18n/history-messages.ts
src/lib/i18n/index.ts
src/lib/i18n/messages.ts
src/lib/json.ts
src/lib/navigation.ts
src/server/agent/adapters.ts
src/server/agent/evaluation-worker.ts
src/server/agent/openai.ts
src/server/agent/pinned-inputs.ts
src/server/agent/ports.ts
src/server/agent/request.ts
src/server/agent/runtime.ts
src/server/agent/schemas.ts
src/server/agent/workflow.ts
src/server/auth/response.ts
src/server/auth/session.ts
src/server/backtest/execute.ts
src/server/backtest/http.ts
src/server/backtest/leakage.ts
src/server/backtest/registry.ts
src/server/backtest/reproducibility.ts
src/server/backtest/runner.ts
src/server/backtest/types.ts
src/server/connectors/contracts/index.ts
src/server/connectors/csv/connector.ts
src/server/connectors/csv/parser.ts
src/server/connectors/csv/repository.ts
src/server/connectors/industrial/contracts.ts
src/server/connectors/industrial/gateway.ts
src/server/connectors/weather/ingestion.ts
src/server/connectors/weather/open-meteo.ts
src/server/connectors/weather/probe.ts
src/server/connectors/weather/types.ts
src/server/contracts/index.ts
src/server/data/import/artifact-store.ts
src/server/data/import/memory-repository.ts
src/server/data/import/postgres-repository.ts
src/server/data/import/runtime.ts
src/server/data/import/service.ts
src/server/data/import/time.ts
src/server/data/import/types.ts
src/server/data/quality/data-use.ts
src/server/data/quality/hourly.ts
src/server/data/snapshot/build.ts
src/server/data/snapshot/postgres-readers.ts
src/server/data/weather/selection.ts
src/server/db/client.ts
src/server/db/migrations/0001_csv_imports.sql
src/server/db/migrations/0001_foundation.sql
src/server/db/migrations/0002_agent_replay.sql
src/server/db/migrations/0002_bridge_import_observations.sql
src/server/db/migrations/0103_p3_input_events.sql
src/server/db/migrations/0105_p5_evaluation.sql
src/server/evaluation/actuals.ts
src/server/evaluation/evaluate.ts
src/server/evaluation/published.ts
src/server/evaluation/semantic-manifest.json
src/server/evaluation/semantics.ts
src/server/evaluation/types.ts
src/server/evaluation/worker.ts
src/server/export/forecast-csv.ts
src/server/forecast/approved-inference.ts
src/server/forecast/inference.ts
src/server/forecast/memory-store.ts
src/server/forecast/postgres-store.ts
src/server/forecast/request.ts
src/server/forecast/runtime.ts
src/server/forecast/service.ts
src/server/forecast/snapshot.ts
src/server/jobs/memory-store.ts
src/server/jobs/postgres-store.ts
src/server/jobs/runner.ts
src/server/jobs/triggers.ts
src/server/jobs/types.ts
src/server/ml/baseline/persistence.ts
src/server/ml/features/index.ts
src/server/ml/inference/artifact.ts
src/server/ml/inference/features.ts
src/server/ml/inference/index.ts
src/server/ml/power-curve/index.ts
src/server/ml/ridge/index.ts
src/server/ml/training/approved.ts
src/server/ml/training/artifacts.ts
src/server/ml/training/index.ts
src/server/ml/training/job.ts
src/server/ml/training/schema.ts
src/server/ml/validation/index.ts
src/server/replay/batch/index.ts
src/server/replay/batch/postgres.ts
src/server/replay/clock.ts
src/server/replay/request.ts
src/server/replay/store.ts
src/server/triggers/config.ts
src/server/triggers/discovery.ts
src/server/triggers/index.ts
src/ui/agent-workspace.tsx
src/ui/approval-card.tsx
src/ui/error-panel.tsx
src/ui/evidence-panel.tsx
src/ui/objective-panel.tsx
src/ui/result-panel.tsx
src/ui/run-header.tsx
src/ui/timeline-event.tsx
src/ui/timeline.tsx
src/ui/types.ts
tests/acceptance/demo.test.mjs
tests/acceptance/harness.test.mjs
tests/acceptance/run.mjs
tests/agent/openai-smoke.test.cjs
tests/agent/postgres.test.cjs
tests/agent/reliability.test.cjs
tests/agent/replay.test.cjs
tests/agent/workflow.test.cjs
tests/backtest/api.test.ts
tests/backtest/evaluation.test.ts
tests/backtest/export-reproducibility.test.ts
tests/backtest/runner.test.ts
tests/connectors/industrial.test.ts
tests/connectors/weather-probe.test.ts
tests/evaluation/evaluation.test.ts
tests/evaluation/fixtures.ts
tests/evaluation/postgres.test.ts
tests/forecast/fixtures.ts
tests/forecast/postgres.test.cjs
tests/forecast/register-ts.cjs
tests/forecast/service.test.cjs
tests/foundation/session.test.mjs
tests/import/connection-contract.test.ts
tests/import/csv-import.test.ts
tests/import/hourly-quality.test.ts
tests/import/postgres-smoke.ts
tests/ml/approved-cli.test.ts
tests/ml/approved-fixtures.ts
tests/ml/approved-inference.test.ts
tests/ml/features-ridge.test.ts
tests/ml/power-curve-validation.test.ts
tests/ml/training-job.test.ts
tests/replay-batch/batch.test.ts
tests/replay-batch/preflight.test.ts
tests/runtime-wiring/client.test.ts
tests/runtime-wiring/inference.test.ts
tests/runtime-wiring/pinned-inputs.test.ts
tests/runtime-wiring/postgres.test.ts
tests/triggers/config.test.ts
tests/triggers/postgres.test.ts
tests/ui/README.md
tests/ui/browser-helpers.cjs
tests/ui/chart.cjs
tests/ui/client.test.cjs
tests/ui/connectors.cjs
tests/ui/csv.test.mjs
tests/ui/dashboard.cjs
tests/ui/history.cjs
tests/ui/history.test.ts
tests/ui/overview-metrics.test.ts
tests/ui/platform.cjs
tests/ui/platform.test.cjs
tests/ui/readability.cjs
tests/ui/ux.cjs
tests/weather/evidence/before-archive.raw.json
tests/weather/evidence/feb-end.raw.json
tests/weather/evidence/feb-start.raw.json
tests/weather/evidence/heights.raw.json
tests/weather/evidence/jan-evening.raw.json
tests/weather/evidence/summary.json
tests/weather/ingestion.test.ts
tests/weather/probe.mjs
tests/weather/weather.test.mjs
tsconfig.json
Ветки (21)

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

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

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