# JOURNAL — phase porepo (Builder)

## 2026-06-13T19:05Z — Bootstrap / orientation

Read the phase plan, `plan-agent-orchestrator.md`, and the harness README at
`/home/loops/aoeng/agent-orchestrator/README.md`. Key facts established:

- Harness `agent-orchestrator` is built + tagged `v0.1.0` (tag object `a89d30f` → commit `289ef07`).
  Working clone: `/home/loops/aoeng/agent-orchestrator`. Repo is **public** on Gitea
  (`private:false`), so a fresh `git clone --recurse-submodules` fetches `engine/` without creds.
- `engine/agents.py status` only needs a valid `agents.toml` (it reads config, prints a table;
  does not require running sessions or live backends). So a PO config with one persistent
  `project-orchestrator` agent will pass `status`.
- Config schema (README): `[watchdog]`, `[backend.<name>]`, `[defaults]` (session_prefix + log_dir
  REQUIRED), `[[agent]]`/`[[service]]`, `[loop]`. `project_dir` resolves relative paths.
- One-directional knowledge: the PO repo holds the fleet registry (`fleet.toml`); a project repo
  holds NO PO/fleet metadata — engine submodule pin + PO's fleet.toml are the only record of
  project↔harness↔ref.

Decision: pin `engine/` at the **commit** the `v0.1.0` tag points to (`289ef07`), per DoD wording
"pinned to agent-orchestrator v0.1.0". The tests commit `cdcece9` is *after* the tag and is not
required.

Gitea API reachable with bot creds (200); `recipe-maintainers/project-orchestrator` does not yet
exist (404); org `recipe-maintainers` exists (id 65).

## 2026-06-13T19:20Z — Built + cold-verified, claiming gate

Built the whole PO repo in `/home/loops/porepo/project-orchestrator`, pushed `main` at `346ed31`.

Design choices (the WHY behind STATUS facts):
- **PO agent is a single `persistent` fleet-management agent**, not a `[loop]` pair — the plan says
  "a persistent project-orchestrator agent is enough to start; add a loop only if useful." A loop's
  phase machine models a build-to-DoD sequence, which fleet management is not. So no `[loop]` block;
  `status` simply prints the agents table (no phase line). Hourly `wake` → `prompts/supervise.md`
  gives it a periodic read-only fleet sweep.
- **`fleet.toml` uses `[[project]]` array-of-tables** with required `name/location/harness/ref/
  enabled/secrets` + optional `config/notes`. `scripts/fleet.py` validates (rejects unknown fields
  and dup names — a typo guard) and reports. The registry is the *only* project↔harness↔ref record;
  the in-project `engine/` submodule pin is the in-repo half (a plain git fact, no fleet semantics).
- **create-project.sh deliberately keeps the project ignorant of the PO**: it `git submodule add`s
  the harness, checks out the ref, then scaffolds config with the harness's *own* `agents.py init`
  (harness-only config), stamps a unique `session_prefix`, and commits. Registering in `fleet.toml`
  is a *separate*, opt-in `--register` step that writes only to the PO side. The scratch project's
  tracked files are exactly `.gitignore .gitmodules agents.toml` — zero PO/fleet metadata.
- **Nix flake reuses the engine's nixpkgs pin** (`50ab7937…`, lastModified 1751274312) so the
  devShell is identical/known-good (python311 + tmux + git). flake.lock written by hand to match.
- **Pinned engine at the v0.1.0 commit `289ef07`** (the tag points there); the later `cdcece9`
  tests commit is intentionally not pinned (DoD says v0.1.0).

Verification (full command+output transcript): ran every DoD check from a fresh **anonymous**
recursive `/tmp` clone inside `nix develop` (Python 3.11.11, tmux 3.5a, git 2.47.2). All passed:
recursive submodule fetch worked with no creds; `agents.py status` listed the PO agent; `fleet.py
validate` → `OK — 1 project(s), schema v1`; `import tomllib` rc=0; `create-project.sh` produced a
valid standalone scratch project (`engine` @ v0.1.0, status rc=0, grep → `clean: no PO/fleet
metadata`). Cleaned up all /tmp scratch artifacts. Exact commands + expected outputs mirrored into
STATUS-porepo.md for the Adversary.

### File-ownership coordination note
The Adversary had pre-created STATUS-porepo.md / JOURNAL-porepo.md as placeholders before I started.
Per protocol §6.1 these are Builder-owned (STATUS is the authoritative `## DONE` handshake file the
Adversary verifies against; JOURNAL is my reasoning). I took them over and left REVIEW-porepo.md +
the `## Adversary findings` section of BACKLOG-porepo.md to the Adversary. Sent an ADVERSARY-INBOX.md
heads-up so it keeps its tracking in REVIEW.
