diff --git a/MEMORY.md b/MEMORY.md index d8c2cd0..870aaaf 100644 --- a/MEMORY.md +++ b/MEMORY.md @@ -81,7 +81,6 @@ ### Структура workspace - `tasks/{project}/` — каждый проект в своей папке, там же `PROJECT.md` с деталями -- `tasks/scripts/` и `tasks/reports/` — общие скрипты и отчёты - `skills/` — готовые AgentSkills с полной документацией - `data/` — выходные данные (`data/{skill-name}/`) - `memory/` — дневные записи (`YYYY-MM-DD.md`) diff --git a/memory/2026-04-19.md b/memory/2026-04-19.md index 07518d3..67db75c 100644 --- a/memory/2026-04-19.md +++ b/memory/2026-04-19.md @@ -31,6 +31,29 @@ - Debian на VM оказался 13 (trixie), а не 12. - В `.env` есть заглушка `DEV_BOT_TOKEN=`, которая мешает автоматическому `source` всего файла при запуске shell-скриптов. +## Запуск Dev-агента (фиксация 19.04.2026) +После отладки выяснила точные правила запуска Dev-агента: + +✅ Правильный рабочий вариант: +```json +{ + "runtime": "subagent", + "agentId": "dev", + "cwd": "/home/node/.openclaw/workspace-dev", + "mode": "run" +} +``` + +❌ НЕЛЬЗЯ: +- `runtime="acp"` → "Failed to spawn agent command: dev" (dev — это subagent, не ACP harness) +- `model="vibecode/claude-sonnet-4.6"` → "model not allowed" (dev берёт свой primary из конфига, явный model блокнуть) +- `streamTo="parent"` → "streamTo is only supported for runtime=acp" +- без `cwd` → агент молча завершается с 0 токенов + +📝 Правило: Dev-агент сам берёт свою модель из конфига (`vibecode/claude-sonnet-4.6`), НЕ передавать model явно. + +--- + ## 2026-04-19 — FR24 / VM-FR24 progress - Слава попросил продолжать проект FR24 по плану и действовать самостоятельно, задавая вопросы только там, где нельзя решить безопасно. - На VM-FR24 уже выполнены: проверка состояния, установка Docker, подготовка каталогов проекта, проброс RTL-SDR через Proxmox GUI, применение udev-правил, устройство определяется как RTL-SDR Blog V4. diff --git a/tasks/flightradar24/compose/.env.example b/tasks/flightradar24/compose/.env.example new file mode 100644 index 0000000..f892d61 --- /dev/null +++ b/tasks/flightradar24/compose/.env.example @@ -0,0 +1,16 @@ +# FR24 ingest compose environment +TZ=UTC +APP_ENV=dev + +POSTGRES_DB=fr24 +POSTGRES_USER=fr24 +POSTGRES_PASSWORD=change-me +POSTGRES_PUBLISHED_PORT=5432 +POSTGRES_HOST=postgres +POSTGRES_PORT=5432 + +# Ingest scaffold +INGEST_MODE=placeholder +RAW_RETENTION_DAYS=3 +OVERLAP_MINUTES=10 +CAPTURE_SOURCE=rtl-sdr diff --git a/tasks/flightradar24/compose/README.md b/tasks/flightradar24/compose/README.md new file mode 100644 index 0000000..dac1c65 --- /dev/null +++ b/tasks/flightradar24/compose/README.md @@ -0,0 +1,21 @@ +# Compose scaffold for FR24 ingest + +This directory contains the baseline Docker Compose skeleton for the RTL-SDR ingest contour. + +## Services +- `postgres` — PostgreSQL 16 + PostGIS +- `ingest` — placeholder for capture/preprocess wiring +- `status` — simple heartbeat/status scaffold + +## Layout +- `../db/postgres` — PostgreSQL data directory +- `../db/init` — init SQL scripts for schema/bootstrap +- `../ingest` — ingest service code placeholder +- `../logs/ingest` — ingest logs +- `../logs/status` — status heartbeat files +- `../backup` — backup artifacts + +## Notes +- No destructive migrations are included. +- The `ingest` service is a placeholder; wire real capture/preprocess logic later. +- The stack expects a `.env` file copied from `.env.example` in this directory. diff --git a/tasks/flightradar24/compose/docker-compose.yml b/tasks/flightradar24/compose/docker-compose.yml new file mode 100644 index 0000000..aeca42e --- /dev/null +++ b/tasks/flightradar24/compose/docker-compose.yml @@ -0,0 +1,88 @@ +version: "3.9" + +name: fr24-ingest + +x-common-env: &common-env + TZ: ${TZ:-UTC} + POSTGRES_HOST: ${POSTGRES_HOST:-postgres} + POSTGRES_PORT: ${POSTGRES_PORT:-5432} + POSTGRES_DB: ${POSTGRES_DB:-fr24} + POSTGRES_USER: ${POSTGRES_USER:-fr24} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-change-me} + APP_ENV: ${APP_ENV:-dev} + +services: + postgres: + image: postgis/postgis:16-3.4 + container_name: fr24-postgres + environment: + POSTGRES_DB: ${POSTGRES_DB:-fr24} + POSTGRES_USER: ${POSTGRES_USER:-fr24} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-change-me} + TZ: ${TZ:-UTC} + ports: + - "${POSTGRES_PUBLISHED_PORT:-5432}:5432" + volumes: + - ../db/postgres:/var/lib/postgresql/data + - ../db/init:/docker-entrypoint-initdb.d:ro + healthcheck: + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER:-fr24} -d ${POSTGRES_DB:-fr24}"] + interval: 10s + timeout: 5s + retries: 5 + start_period: 20s + restart: unless-stopped + networks: + - fr24-net + + ingest: + image: alpine:3.20 + container_name: fr24-ingest + command: ["sh", "-c", "echo 'ingest placeholder: wire capture/preprocess here'; tail -f /dev/null"] + environment: + <<: *common-env + INGEST_MODE: ${INGEST_MODE:-placeholder} + RAW_RETENTION_DAYS: ${RAW_RETENTION_DAYS:-3} + OVERLAP_MINUTES: ${OVERLAP_MINUTES:-10} + CAPTURE_SOURCE: ${CAPTURE_SOURCE:-rtl-sdr} + volumes: + - ../ingest:/app + - ../logs/ingest:/var/log/fr24 + - ../backup:/backup + depends_on: + postgres: + condition: service_healthy + healthcheck: + test: ["CMD-SHELL", "test -f /tmp/ingest-ready && echo ok || exit 1"] + interval: 30s + timeout: 5s + retries: 3 + start_period: 10s + restart: unless-stopped + networks: + - fr24-net + + status: + image: alpine:3.20 + container_name: fr24-status + command: ["sh", "-c", "while true; do date -u +'%Y-%m-%dT%H:%M:%SZ' > /status/heartbeat; sleep 30; done"] + volumes: + - ../logs/status:/status + healthcheck: + test: ["CMD-SHELL", "test -f /status/heartbeat"] + interval: 30s + timeout: 5s + retries: 3 + restart: unless-stopped + networks: + - fr24-net + +networks: + fr24-net: + name: fr24-net + driver: bridge + +volumes: + postgres-data: + ingest-logs: + backups: diff --git a/tasks/flightradar24/db/README.md b/tasks/flightradar24/db/README.md new file mode 100644 index 0000000..49cfab6 --- /dev/null +++ b/tasks/flightradar24/db/README.md @@ -0,0 +1,7 @@ +# Database layout + +- `postgres/` — PostgreSQL persistent data volume +- `init/` — bootstrap SQL for extensions and initial schema + +Current bootstrap only enables `postgis` and `pgcrypto`. +No irreversible migrations are included. diff --git a/tasks/flightradar24/db/init/001_extensions.sql b/tasks/flightradar24/db/init/001_extensions.sql new file mode 100644 index 0000000..7a8c14d --- /dev/null +++ b/tasks/flightradar24/db/init/001_extensions.sql @@ -0,0 +1,2 @@ +CREATE EXTENSION IF NOT EXISTS postgis; +CREATE EXTENSION IF NOT EXISTS pgcrypto; diff --git a/tasks/flightradar24/docs/COMPOSE_SKELETON.md b/tasks/flightradar24/docs/COMPOSE_SKELETON.md new file mode 100644 index 0000000..02ca7f2 --- /dev/null +++ b/tasks/flightradar24/docs/COMPOSE_SKELETON.md @@ -0,0 +1,36 @@ +# FR24 ingest compose skeleton + +## Goals +- PostgreSQL + PostGIS as the single database +- separate ingest placeholder service +- healthcheck/status scaffolding +- predictable volume layout +- environment-driven configuration + +## Proposed runtime layout +- `compose/` — Docker Compose manifests and env examples +- `db/postgres/` — persistent PostgreSQL data +- `db/init/` — bootstrap SQL for extensions and initial schema +- `ingest/` — capture/preprocess implementation lives here later +- `logs/ingest/` — service logs +- `logs/status/` — heartbeat/status artifacts +- `backup/` — pg_dump and restore artifacts + +## Environment variables +- `POSTGRES_DB` +- `POSTGRES_USER` +- `POSTGRES_PASSWORD` +- `POSTGRES_PUBLISHED_PORT` +- `RAW_RETENTION_DAYS` +- `OVERLAP_MINUTES` +- `CAPTURE_SOURCE` +- `TZ` +- `APP_ENV` + +## Status scaffolding +The current skeleton includes a minimal `status` container that writes a heartbeat file. This is only a placeholder and should be replaced or extended by a real monitoring endpoint later. + +## Open questions +- whether capture and preprocess should become separate services immediately +- whether API/viewer belongs in the first compose cut or later +- whether a dedicated monitoring container is needed before hardware verification