ploeg

module
v0.2.0-rc.5 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Jul 28, 2026 License: Apache-2.0

README

Ploeg

Assign a ticket on your own board and Ploeg spins up an ephemeral team of AI agents on your Kubernetes cluster that works it, opens a pull request, reports the outcome, and disappears — every run leased, audited, and crash-safe, with no lock-in on tracker, forge, or agent harness.

An open-source, self-hostable dispatch plane. Bring your own board, forge, and agent harness.

Ploeg is Dutch for a work crew or shift. Teams of specialist agents pick up a ticket, work it, report an outcome, and disappear.

Status: pre-alpha. Ploeg is being extracted from a running autonomous-agent setup (a "dark factory": agents working a ticket board unattended on a homelab Kubernetes cluster). The dispatch core runs as a local prototype (see below); the Kubernetes executor, provider write-backs, and team manifests are still to come. Watch, don't install.

What Ploeg is

  • A dispatch plane, not a board. Your tracker (Vikunja, Jira, GitHub Issues, …) stays the source of truth for what to do. Ploeg owns how work gets executed: assignment events in, ephemeral agent runs out.
  • Event-driven, never polling. Assigning a ticket fires a webhook; Ploeg spawns a Kubernetes Job for it. No heartbeat crons burning tokens to discover there is no work.
  • Ephemeral by design. Every run is a Job that starts, produces a structured outcome, and dies. Durable state lives in Postgres (work items, leases, checkpoints, outcomes, audit) and in git (branches, PRs) — never in a long-lived agent process.
  • Leased, not labeled. Claims are rows with a TTL renewed by the running Job. A crashed pod releases its ticket mechanically; nothing depends on an agent behaving well at death.
  • Teams of specialists. A work item is claimed by a team — a declarative manifest of specialist roles (implementer, reviewer on a different model family, tester) — not by a single agent identity.
  • Audited end to end. Every mutation, lease, run, and outcome is a Postgres row. Grafana dashboards ship as code.

What Ploeg is not

  • Not another kanban UI. The market has plenty; Ploeg has none.
  • Not a persistent-agent platform (see kagent) or model serving.
  • Not a promise of every integration. Ploeg ships a small, stable provider SPI and two reference providers (Vikunja tracker, Forgejo forge). Further providers are community-owned.

Architecture (v0 sketch)

tracker webhook ─┐                        ┌─> KEDA ScaledJob (per team) ─> agent Job (ephemeral)
forge webhook  ──┼─> ploegd ─> Postgres ──┤        │ lease renewal · checkpoints
                 │   (ingest,  (work items,        └─> outcome report ─> ploegd ─> tracker/forge writeback
                 │    SPI)      leases, runs,
                 └─────────────  audit)  ──────> Grafana (dashboards as code)
  • ploegd — single Go binary: webhook ingest, provider SPI, lease manager, outcome ingestion.
  • Executor — KEDA ScaledJob with the Postgres scaler is the flagship default; executors are pluggable behind the run-API contract (docs/contracts/executor.md) — a KEDA-free CronJob executor ships in the same chart (executor.type).
  • Harness contract — an agent container receives a TaskSpec, must emit an OutcomeReport (schemas). Harness adapters live behind pkg/harness.Adapter: openhands (default), exec (any binary), claude-code — selected per team, along with the agent image, via the team's harness block.

Try the prototype

docker compose -f ops/local/docker-compose.yml up -d --build
ops/local/demo.sh

The demo plays both tracker and agent: a signed Vikunja webhook queues a work item, a claim leases it (FOR UPDATE SKIP LOCKED + TTL lease), checkpoint and outcome complete it, and the audit trail records every step as a Postgres row. Crash-safety is real: claim an item, report nothing, and the sweeper releases the lease and re-queues the item when the TTL expires.

Roadmap

  1. Extraction — core service, Vikunja + Forgejo providers, one harness adapter, audit + dashboards. Exit criterion: the originating dark factory runs on Ploeg in production.
  2. Teams & follow-ups — team manifests, checkpoint/resume, PR-feedback ingestion routed to the owning team, a dry-run grooming worker.
  3. On demonstrated pull — GitHub provider, CRD/operator graduation, agent-sandbox runtimes, further providers by contribution.

License

Apache-2.0

Directories

Path Synopsis
cmd
ploeg-worker command
ploeg-worker runs as the main container of an executor-spawned Job (docs/contracts/executor.md): it claims one work item from ploegd, drives a headless harness run via the adapter selected by PLOEG_HARNESS (design §5), and reports an OutcomeReport before exit.
ploeg-worker runs as the main container of an executor-spawned Job (docs/contracts/executor.md): it claims one work item from ploegd, drives a headless harness run via the adapter selected by PLOEG_HARNESS (design §5), and reports an OutcomeReport before exit.
ploegd command
ploegd is Ploeg's single daemon: webhook ingest, provider SPI host, lease manager, outcome ingestion.
ploegd is Ploeg's single daemon: webhook ingest, provider SPI host, lease manager, outcome ingestion.
pkg
harness
Package harness defines the contract between Ploeg and an agent harness: TaskSpec in, OutcomeReport out.
Package harness defines the contract between Ploeg and an agent harness: TaskSpec in, OutcomeReport out.
harness/adapters/claudecode
Package claudecode adapts the Claude Code CLI (backlog #62): a headless `claude -p` run with a JSON result envelope mapped into OutcomeReport usage (cost, tokens, session id).
Package claudecode adapts the Claude Code CLI (backlog #62): a headless `claude -p` run with a JSON result envelope mapped into OutcomeReport usage (cost, tokens, session id).
harness/adapters/execbin
Package execbin is the generic escape-hatch adapter: run any binary against the published task contract.
Package execbin is the generic escape-hatch adapter: run any binary against the published task contract.
harness/adapters/openhands
Package openhands adapts the OpenHands agent-runner image: the prompt is written to a task file and the image's baked entrypoint runs it headless.
Package openhands adapts the OpenHands agent-runner image: the prompt is written to a task file and the image's baked entrypoint runs it headless.
harness/harnesstest
Package harnesstest is the adapter conformance kernel (backlog #69): every CommandAdapter must satisfy these properties regardless of which harness it wraps.
Package harnesstest is the adapter conformance kernel (backlog #69): every CommandAdapter must satisfy these properties regardless of which harness it wraps.
httpapi
Package httpapi exposes ploegd's two surfaces: webhook ingest (tracker → queued work) and the run API an agent container uses (claim, renew, checkpoint, outcome) per the worker-claims-at-startup convention (backlog #48).
Package httpapi exposes ploegd's two surfaces: webhook ingest (tracker → queued work) and the run API an agent container uses (claim, renew, checkpoint, outcome) per the worker-claims-at-startup convention (backlog #48).
litellm
Package litellm wraps the LiteLLM proxy admin API for per-run key lifecycle (mint + revoke, list + batch delete).
Package litellm wraps the LiteLLM proxy admin API for per-run key lifecycle (mint + revoke, list + batch delete).
llmbroker
Package llmbroker is the credential seam between Ploeg and an LLM gateway: mint a budgeted per-run credential before the harness starts, revoke it on every return path, and reconcile leaks from ploegd's sweeps.
Package llmbroker is the credential seam between Ploeg and an LLM gateway: mint a budgeted per-run credential before the harness starts, revoke it on every return path, and reconcile leaks from ploegd's sweeps.
provider
Package provider defines Ploeg's SPI.
Package provider defines Ploeg's SPI.
provider/vikunja
Package vikunja is the reference TrackerProvider (design §4).
Package vikunja is the reference TrackerProvider (design §4).
store
Package store is Ploeg's Postgres data layer: work items, leases, checkpoints, runs, and the audit log.
Package store is Ploeg's Postgres data layer: work items, leases, checkpoints, runs, and the audit log.
work
Package work defines Ploeg's core semantics: work items, leases, checkpoints, and outcomes.
Package work defines Ploeg's core semantics: work items, leases, checkpoints, and outcomes.
worker
Package worker is the run orchestrator that executes one claimed work item: claim → clone → compose prompt → mint credential → harness adapter run → forge-poll outcome resolution → outcome report.
Package worker is the run orchestrator that executes one claimed work item: claim → clone → compose prompt → mint credential → harness adapter run → forge-poll outcome resolution → outcome report.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL