Reviewing and landing

Review and land

A run at review_open has done its work on the last phase's branch; nothing has landed. You find there a review-handoff.md and the reconciliation of the whole run, against its plan.

phax review-code <run>          # an agent session in the final worktree, primed to review the change
phax enter <run>                # back into the last phase's agent session
phax shell <run>                # a shell in the final worktree
phax open <run>                 # the final worktree in your editor
phax path <run>                 # the final worktree's path
phax review-handoff <run>       # write review-handoff.md and the reconciliation again

review-code starts from the reconciliation and the compliance findings rather than a blank prompt; running it again resumes the session, and --new-session starts over. Its model is review.code in phax.json, claude-opus-5-5 at high effort by default, or --model and --effort.

Two steps run on their own when a run reaches review, if phax.json turns them on, and can be run by hand. Neither can fail the run.

phax review-compliance <run>    # an agent checks the work against the plan, phase by phase, and writes a verdict
phax publish-pr <run>           # push the final branch and open a pull request, or reuse the open one

The compliance review changes nothing; its verdict goes into the pull request's description. Its model is review.compliance, claude-sonnet-5 at medium by default. publish-pr needs a GitHub remote and an authenticated gh; the remote, base branch and title are set under publish.

After the merge

phax ls                         # your runs; --active, --failed, --review-open, --archived, --json
phax archive <run>              # put a finished run away, keeping everything
phax prune --all --dry-run      # see what deleting your archived runs would free
phax prune <run>                # delete an archived run for good

archive moves the run's folder and its worktrees under ~/.phax/archive/<namespace>.<name>/ and keeps the name taken. It accepts a finished run (review_open, completed) whose final worktree is clean; an unfinished run or a dirty worktree needs --force, and a running or locked run is refused.

prune deletes archived runs for real: the archive folder, the worktrees' records in Git, the run's local branches, and its entry, which frees its name and its disk space. It shows what it will do first, asks in a terminal (--yes otherwise, --dry-run to only look), works on this repository's runs only, and never touches the records branch, remote branches or pull requests. A run whose branches hold commits found nowhere else is kept, unless you pass --force; a branch checked out somewhere keeps its run even then.