Files
admin/.tasks/agents-task-runner-vds-deploy.md
vitya 949724729d task(agents-task-runner-vds-deploy): take + DRY_RUN validated + .admin claim-guard
- Take task to 🔴, create per-task file (was on board w/o file).
- DRY_RUN smoke passed end-to-end on this workstation (host task-runner :3000,
  one tick via POST/GET). Real shared-board read; preview candidate
  OpeItcLoc03/MoreThenCms/cms-maljarka-https-mode-bug-fix; no claim/spawn.
- Finding: .admin had NO policy.toml; claim gate ignores consult_policy, so the
  HARD ".admin excluded from autonomous claim" guard was UNENFORCED. Add
  .tasks/policy.toml default_weight="needs-human" → every .admin task fails the
  L3 needs-human claim gate. Gates autonomous poller only; INERT until pushed
  (claim reads policy.toml via Gitea backend, not local disk).
- Build-prereq in task Next-action was a phantom: runner is plain JS (no tsc);
  only projects-meta-mcp needs build and its dist/ already exists.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-06-08 15:32:35 +03:00

4.1 KiB
Raw Blame History

agents-task-runner-vds-deploy

Slug legacy-named -vds-deploy; scope corrected 2026-06-08 — VDS-as-worker DROPPED. Per-machine federation: each WORKER runs its own agents-task-runner, claims from the SHARED Gitea board, runs the agent LOCALLY, commits/pushes. VDS hosts the Gitea board ONLY (already up) — not a worker, nothing deploys on it.

Goal

Поднять agents-task-runner (the poller) на первой worker-машине, нацелив на shared Gitea-board. Машина клеймит только то, что умеет (capability-filter), .admin исключён из автономного клейма до governance L2/L3. Сначала DRY_RUN на prod-board, затем один живой цикл на реальной non-.admin таске: spawn → commit → push, verified.

Key files

  • ~/projects/.common/lib/agents-task-runner/ — runtime (plain JS, type:module, v0.16.2)
    • server.js — reconcile loop entry (npm start)
    • task-runner/server.js — task-runner entry (npm run task-runner)
    • lib/cross-project-poller.js — claim loop, requirements-filter, confirm-gate
    • lib/consult-backend/ — execution-policy governance (consult_policy + needs-human gate)
    • docker-compose.yml / docker-compose.host.yml / Dockerfile
    • secrets.env.example — секреты-шаблон (ANTHROPIC_API_KEY / Gitea token / projects-meta)
    • config/ — node-config overlays
  • ~/projects/.common/lib/projects-meta-mcp/dist/ — уже собран (build-prereq для НЕГО, не для раннера)

Decisions log

  • 2026-06-08: Взята в работу из ready. Build-prereq в Next action неточен — раннер это чистый JS (нет tsconfig / npm run build, запускается node server.js), собирать нечего; npm run build релевантен только projects-meta-mcp, а его dist/ уже есть. Источник заблуждения — общий BUILD-prereq из consult-execution-policy-governance review, где TS-only касался projects-meta-mcp.
  • 2026-06-08: Re-scoped (из STATUS-блока): VDS = board-host only, VDS-as-worker dropped. Poller живёт на worker-машинах (workstation / factory Linux).

Open questions

  • Первая worker-машина — эта workstation (Windows) или factory Linux? (user-решение)
  • Headless-auth: ANTHROPIC_API_KEY или claude login? Cheap-модель (sonnet/haiku) для impl-polling.
  • Capability-filter: что именно эта машина объявляет в requirements/runtime_allowed.

Completed steps

  • 2026-06-08: orientation — раннер локализован (~/projects/.common/lib/agents-task-runner, v0.16.2, JS), build-prereq разобран (фантом для раннера), common pull актуален (e7b1143).
  • 2026-06-08: prereq-чек на workstation зелёный — node v22.22, docker 29.3.1 up, projects-meta-mcp/dist/tasks-cli.js собран, runner node_modules есть, auth.toml есть.
  • 2026-06-08: DRY_RUN-смок прошёл end-to-end. Хост-процесс task-runner (PORT 3000, DRY_RUN=1 AGENT_RUNTIME=claude-opus AGENT_CAPABILITIES=needs-internet SPAWN_MODE=local), один тик через POST /tasks/crossProjectAgentPoller + GET /runs/:id (curl --noproxy "*"). Результат: {dryRun:true, claimed:false, candidate:{project:"OpeItcLoc03/MoreThenCms", slug:"cms-maljarka-https-mode-bug-fix"}}. Полный cross-boundary путь (reconciler→runner→CLI→реальный shared-board read) работает; claim-token НЕ записан, spawn НЕ вызван. Capability-фильтр (needs-internet) отработал — кандидат non-.admin. Процесс заглушён.

Notes

  • HARD: .admin исключён из автономного клейма до governance L2/L3 (см. STATUS-блок § blocker).
  • anti-self-review: distinct machine-id на каждый worker.
  • Секреты per-machine: 600 root, не в git.