Skip to main content

Project Supervisor

Project Supervisor is the project-neutral control plane for autonomous multi-agent software development. Projects provide a strict YAML adapter; the supervisor provides atomic queueing, leases, worktree/evidence roots, shell-free verification, recovery decisions, and typed handoff contracts.

This 0.5.0 release is the reusable control-plane foundation. It now has atomic SQLite ownership transitions, lease heartbeat/expiry/release, bounded command execution, evidence manifests, and structured handoffs. OS-agent launching, independent-review orchestration, and project cutover remain deliberately separate provider work.

Install in any GitHub project

The package is designed to be installed into each consuming project rather than copied into it:

python -m pip install project-supervisor
project-supervisor init
# edit .project-supervisor.yaml and ensure its status_file exists
project-supervisor check

init creates .project-supervisor.yaml in the current project. Once present, the adapter is discovered automatically from the project root or a child directory. The explicit form remains available for scripts and CI:

project-supervisor --project C:\path\to\project\.project-supervisor.yaml check

For a GitHub checkout before a PyPI release exists:

python -m pip install "project-supervisor @ git+https://github.com/Smkzz/project-supervisor.git@main"

For stable automation, pin a release tag or PyPI version. The consumer templates in templates/project/ include a pinned requirements file, Dependabot config, and a scheduled compatibility workflow. Dependabot opens a reviewable upgrade PR whenever a new release is published; the workflow validates the installed version. This is the automatic-update path for existing projects while keeping their dependency state visible and reproducible.

The package repository includes GitHub Actions for test/build checks and PyPI trusted publishing on v* tags. Publishing still requires a real GitHub remote, the PyPI project name, and trusted-publisher configuration.

The complete repository/PyPI setup checklist is in docs/GITHUB_RELEASE_CHECKLIST.md.

Development gates

python -m pip install ".[dev]"
python -m ruff check project_supervisor tests
python -m ruff format --check project_supervisor tests
python -m mypy project_supervisor
python -m pytest --cov=project_supervisor --cov-report=term-missing --cov-fail-under=75
python -m build
python -m twine check dist/*
python -m pip check

The release is intentionally tag-driven: the vX.Y.Z tag must match the single-sourced package version before PyPI publishing is allowed.

Adapter contract

schemaVersion: 1
project:
  name: demo
  root: C:/path/to/project
  markers: [package.json]
  queue_file: .supervisor/queue.yaml
  status_file: STATUS.md
  state_db: .supervisor/state.sqlite3
  evidence_root: .supervisor/evidence
  worktree_root: .supervisor/worktrees
  job_id_pattern: 'JOB-[0-9]+'
  max_retries: 2
  capabilities:
    snapshot_read: true
    verification: true
    queue: true
    worker_launch: false
    independent_review: false
    hosted_gate: false
    publish: false
  verification_profiles:
    fast:
      commands:
        - argv: [python, -m, pytest, -q]
          cwd: .
          timeout_seconds: 300
          shell: false
          side_effects: read_only
  snapshot:
    sources:
      - path: orchestration/state.json
        format: json
        role: runtime
        optional: true
  worker_profiles: {}
  reviewer_profiles: {}
  protected_paths: [.git, .supervisor]
  agent_scopes:
    implementer: [src]
    verifier: []
    reviewer: [docs/reviews]

All configured paths are relative to the project root and are checked for containment. Commands use explicit argv, relative cwd, bounded timeout, optional non-secret environment values, shell: false, and an explicit side_effects declaration (read_only, control_plane, project, external, or unknown). The package does not assume backend, frontend, Flutter, Node, or any other repository layout. Capabilities are explicit so the supervisor can fail closed when a project has not yet supplied a worker, reviewer, hosted-gate, or publish integration.

Inspect and verify a project

python -m project_supervisor.cli --project C:\path\to\project-adapter.yaml paths
python -m project_supervisor.cli --project C:\path\to\project-adapter.yaml check
python -m project_supervisor.cli --project C:\path\to\project-adapter.yaml snapshot
python -m project_supervisor.cli --project C:\path\to\project-adapter.yaml verify --job-id JOB-1 --profile fast
python -m project_supervisor.cli --project C:\path\to\project-adapter.yaml shadow-verify --profile fast
python -m project_supervisor.cli --project C:\path\to\project-adapter.yaml coordinate --job-id JOB-1 --agent-id worker-1 --reviewer-id reviewer-1 --revision abcdef1

Verification writes a deterministic command manifest below the adapter's contained evidence root. A failed command returns a non-zero exit code and is never reported as a pass.

Shadow verification runs only commands explicitly declared side_effects: read_only. It reports accepted: false, does not mutate queue, state, worktrees, or evidence, and refuses delegated commands that may reconcile a control plane or touch the project. Use ordinary verify only after accepting the declared side effects. The snapshot command reads adapter-declared JSON and Markdown sources into one normalized, provenance-hashed view.

Queue lifecycle

python -m project_supervisor.cli --project adapter.yaml queue-init
python -m project_supervisor.cli --project adapter.yaml queue-add --job-id JOB-1 --payload-json '{"goal":"run tests"}'
python -m project_supervisor.cli --project adapter.yaml queue-claim --job-id JOB-1 --agent-id agent-1
python -m project_supervisor.cli --project adapter.yaml queue-heartbeat --job-id JOB-1 --agent-id agent-1 --lease-token TOKEN
python -m project_supervisor.cli --project adapter.yaml queue-complete --job-id JOB-1 --agent-id agent-1 --lease-token TOKEN --event-id evt-1 --status completed --result-json '{"ok":true}'

Claims, completion, heartbeat, release, and expiry use SQLite write transactions. A late or mismatched lease cannot complete another worker's job; repeated completion with the same event ID is idempotent.

The typed gate API consumes concrete command results, evidence validation, review handoffs, canary results, and approval records. The older boolean gate function remains only as a compatibility shim and is not sufficient for acceptance.

The provider interface supports Codex/local workers. The coordination API runs one worker and then one distinct reviewer only when the adapter declares both capabilities; it requires complete handoffs, safe changed paths, exact revision/tree identity, and validated evidence before returning APPROVED. Adapters provide those processes through worker_profiles and reviewer_profiles; profile argv values are explicit, shell-free templates with only job_id, agent_id, revision, tree, and handoff_path fields. Each coordinate run writes coordination.json beside its evidence. It does not claim a queue lease automatically; callers must claim a generic queue lease first. The command extends that lease for its declared budget, then completes or releases it according to the final coordination state. The example adapters under examples/ cover Flutter and Gomoku without machine-specific roots, but intentionally leave worker/reviewer launch capabilities disabled until each project has a reviewed integration provider.

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

project_supervisor-0.5.0.tar.gz (46.9 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

project_supervisor-0.5.0-py3-none-any.whl (42.9 kB view details)

Uploaded Python 3

File details

Details for the file project_supervisor-0.5.0.tar.gz.

File metadata

  • Download URL: project_supervisor-0.5.0.tar.gz
  • Upload date:
  • Size: 46.9 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/7.0.0 CPython/3.13.14

File hashes

Hashes for project_supervisor-0.5.0.tar.gz
Algorithm Hash digest
SHA256 9596269c068f96bb884053ada96df09d439063ed3e90a49bd09f4505c7eb8175
MD5 a78a389ec1846b51c839adc04d064b26
BLAKE2b-256 423f8a1424738e823eb34968aadca9233cb1f99880245dcc4696824421a8f465

See more details on using hashes here.

Provenance

The following attestation bundles were made for project_supervisor-0.5.0.tar.gz:

Publisher: publish.yml on Smkzz/project-supervisor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file project_supervisor-0.5.0-py3-none-any.whl.

File metadata

File hashes

Hashes for project_supervisor-0.5.0-py3-none-any.whl
Algorithm Hash digest
SHA256 2008d8ad22cdda7661fd155e4d3c7d14f4a2a12ddde53b151d2aeea1d3224cf1
MD5 d1445ecf2f3dc2c504e9a831465ddb2d
BLAKE2b-256 76122e169cec8b7d52d4b65886c2cf5603d4d02b9f906498950e59d0a408fa2e

See more details on using hashes here.

Provenance

The following attestation bundles were made for project_supervisor-0.5.0-py3-none-any.whl:

Publisher: publish.yml on Smkzz/project-supervisor

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page