Harness-neutral phase-loop orchestration runtime and CLI
Project description
phase-loop-runtime
The harness-neutral phase-loop orchestration runtime and CLI. It drives the
roadmap → plan → execute workflow by dispatching each phase to whatever harness you
choose (Claude / Codex / Gemini / OpenCode); the runtime itself makes no model calls.
Part of the public agent-harness
monorepo (Apache-2.0).
Install
Most users should use the repo's installer (it also installs the workflow skills):
git clone https://github.com/ViperJuice/agent-harness
agent-harness/install-agent-harness.sh --harness claude
To install just this runtime package directly (e.g. as a pinned dependency):
# isolated tool install:
uv tool install "git+https://github.com/ViperJuice/agent-harness@v0.1.5#subdirectory=phase-loop-runtime"
# …or into the current environment:
pip install "git+https://github.com/ViperJuice/agent-harness@v0.1.5#subdirectory=phase-loop-runtime"
This exposes two console scripts — phase-loop and codex-phase-loop — both calling
phase_loop_runtime.cli:main. The canonical protocol document ships in the wheel as
package data and is also installed to share/phase-loop-runtime/protocol/protocol.md.
Roadmap validation
Lint a phase-plan roadmap spec (required headings, unique aliases, acyclic dependency DAG, IF-gate reconciliation, lane-count hints) via the always-installed runtime:
phase-loop validate-roadmap specs/phase-plans-v1.md
# module form — only when phase_loop_runtime is on the ACTIVE python's path (a pip
# install into your env); under `uv tool install` isolation use the console command:
python3 -m phase_loop_runtime.roadmap_lint specs/phase-plans-v1.md
Both wrap phase_loop_runtime.roadmap_lint (the single source of truth). Exit 0 =
clean; non-zero prints each issue on stderr.
Workflow skills bundle
The runtime also installs the harness-neutral workflow-skills bundle. The skill
sources live in the sibling phase-loop-skills/ directory,
with unprefixed base directories and optional _overrides/<harness>/ overlays.
phase-loop install --harness codex --source <path-to>/phase-loop-skills --symlink --dry-run
phase-loop install --harness codex --source <path-to>/phase-loop-skills --symlink --apply
Path resolution is provided by phase_loop_runtime.skill_paths, which keeps handoffs
repo-local, preserves harness-specific reflection roots, and documents the default
install roots for Claude, Codex, Gemini, and OpenCode.
Closeout ownership gate & operator break-glass
When a phase verifies green but the executor touched files outside the plan's declared
owned-files globs, the graduated closeout gate classifies the beyond-ownership
remainder (closeout_classifier.classify_unowned_path):
- SAFE classes (
docs,plans,handoffs,config_nonsource) auto-commit as a recordedsoftexception. - UNSAFE classes (
source,ci,secrets,lockfile) block withcloseout_scope_violation.
The operator escape is phase-loop run --phase <P> --closeout-allow-unowned "<reason>"
(also valid on resume/dry-run; reason required and non-empty; --phase required,
bounding the override to a single phase). It folds the source/ci/lockfile
remainder into the closeout commit as a recorded break_glass exception carrying the
reason. secrets are never break-glassable — a .env*/*.pem/secrets/** path
blocks regardless of the reason. See protocol.md → "Closeout Exceptions".
The closeout verdict is runner-authoritative: when the runner rejects a child's
closeout, the persisted terminal-summary.json reflects the runner's blocking verdict
(the child's self-reported complete/passed is not overlaid back), preventing a
stale "complete" summary from reconcile-skipping the work on the next run.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file phase_loop_runtime-0.3.0.tar.gz.
File metadata
- Download URL: phase_loop_runtime-0.3.0.tar.gz
- Upload date:
- Size: 1.6 MB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5e867c7e557d87a4bf04cbf58821c944d0ab65288b65888f1631aa05d5b320b8
|
|
| MD5 |
ca2e91ab3a134c545982fbadc82c739a
|
|
| BLAKE2b-256 |
8f2dab347740699d9cd34fac313cfa95e6ad975284287bbce59bcdb181199597
|
Provenance
The following attestation bundles were made for phase_loop_runtime-0.3.0.tar.gz:
Publisher:
publish-pypi.yml on ViperJuice/agent-harness
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
phase_loop_runtime-0.3.0.tar.gz -
Subject digest:
5e867c7e557d87a4bf04cbf58821c944d0ab65288b65888f1631aa05d5b320b8 - Sigstore transparency entry: 2104715879
- Sigstore integration time:
-
Permalink:
ViperJuice/agent-harness@8b0af56f4e11f4e82d060810a727492a327225c0 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/ViperJuice
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@8b0af56f4e11f4e82d060810a727492a327225c0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file phase_loop_runtime-0.3.0-py3-none-any.whl.
File metadata
- Download URL: phase_loop_runtime-0.3.0-py3-none-any.whl
- Upload date:
- Size: 1.2 MB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4995d5f0d36acad0c1e2214a2f00432b096b3cddafd432ad8c076833a33f6258
|
|
| MD5 |
b619c2eb76da16bb945b311bae7fb1e6
|
|
| BLAKE2b-256 |
c0750acae96084f6c51a7a248428e0a4dc58e04ebd329b6825ab7bb4a6d1314d
|
Provenance
The following attestation bundles were made for phase_loop_runtime-0.3.0-py3-none-any.whl:
Publisher:
publish-pypi.yml on ViperJuice/agent-harness
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
phase_loop_runtime-0.3.0-py3-none-any.whl -
Subject digest:
4995d5f0d36acad0c1e2214a2f00432b096b3cddafd432ad8c076833a33f6258 - Sigstore transparency entry: 2104716100
- Sigstore integration time:
-
Permalink:
ViperJuice/agent-harness@8b0af56f4e11f4e82d060810a727492a327225c0 -
Branch / Tag:
refs/tags/v0.3.0 - Owner: https://github.com/ViperJuice
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-pypi.yml@8b0af56f4e11f4e82d060810a727492a327225c0 -
Trigger Event:
push
-
Statement type: