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

56 lines
4.1 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 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
- [x] 2026-06-08: orientation — раннер локализован (`~/projects/.common/lib/agents-task-runner`,
v0.16.2, JS), build-prereq разобран (фантом для раннера), common pull актуален (`e7b1143`).
- [x] 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` есть.
- [x] 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.