PR Flow
Two PR paths:
oat-project-pr-progress: progress PR for one phase or partial scopeoat-project-pr-final: final project PR intomain
Inputs
Expected artifacts:
- Required (all modes):
plan.md - Required (spec-driven mode):
spec.md,design.md - Optional (quick/import):
spec.md,design.md - Not expected (lite):
discovery.md,spec.md, ordesign.md - Recommended (quick mode):
discovery.md - Recommended (import mode):
references/imported-plan.md - Recommended:
implementation.mdfinal summary - Recommended:
summary.md— pr-final treats it as the primary source for the PR Summary section and automatically refreshes it first when missing or stale - Lite source row:
oat-project-pr-finaluses the plan's Summary, Decisions, and Validation Criteria plus theimplementation.mdFinal Summary; it does not createsummary.mdunless lite closeout explicitly opts in - Required gate for final PR: review table final row should be
passed
Output
Local artifact path:
.oat/projects/<scope>/<project>/pr/*.md
GitHub PR body policy:
- Keep YAML frontmatter in local artifact
- Strip frontmatter from submitted PR body
Synced project links
For a synced project, PR creation follows a six-step order:
- write and format the local PR artifact;
- run
oat project pushso the project ref contains the latest artifacts; - run
oat project links --format markdownto generate the delimited links block from that exact ref commit; - include the block in the submitted PR body;
- persist
oat_pr_statusandoat_pr_urlinstate.md; and - push again so subsequent artifact writes can refresh the open PR body.
The generated block links only discovery.md, design.md, and summary.md
when present. The URLs are pinned to the project ref's exact commit SHA rather
than a moving branch name. plan.md, state.md, implementation.md, and
reviews/ are intentionally excluded because they contain agent-facing
execution detail rather than the reviewer-oriented project narrative. See
Reviewing OAT PRs.
Post-PR state
After oat-project-pr-final creates the PR, state.md transitions to oat_phase_status: pr_open. This signals "awaiting human review" rather than "done."
pr_open is the routing/review posture. Actual PR existence is tracked separately in:
oat_pr_status— lifecycle state for the PR itself (ready,open, etc.)oat_pr_url— the tracked PR URL when a PR exists
From pr_open:
- Feedback received: run
oat-project-reviseto create revision tasks and re-enter implementation - Ready for completion: run
oat-project-completeto finalize and archive the project. Ifoat_pr_status: openis already tracked, completion skips asking whether to open a PR again and can show the trackedoat_pr_urlin its summary.
Both completion orderings are supported:
- Complete before merge: run
oat-project-completewhile the PR is open, then merge. - Merge before completion: merge the PR first, then run
oat-project-complete.
An open PR is not a completion blocker. When completion archives project
artifacts, the archive-aware flow regenerates and synchronizes the open PR body
so its artifact links remain valid. Synced completion makes
refs/oat/completed/<project> authoritative at the verified source SHA. A
same-SHA refs/oat/projects/<project> ref may remain only as an inert alias;
the completed ref keeps the SHA-pinned links resolvable after the nested
checkout and tracked record are removed.
Reference artifacts
.agents/skills/oat-project-pr-progress/SKILL.md.agents/skills/oat-project-pr-final/SKILL.md.oat/projects/<scope>/<project>/pr/
Picking Up Projects
Continue a synced OAT project on another machine or from another user through its dedicated Git ref.
Programmatic Execution
How OAT launches agents through provider CLI/headless surfaces — per-harness execution shapes, cross-runtime gate exec targets, credential isolation, and the launcher-owned evidence they share.