Orchestration workflows: a rubric review round runs two worktree-isolated .NET reviewers at once and saturates swap; run the cross-family step after the lenses, and cap the doc at one .NET slot #916

Closed
opened 2026-09-05 12:03:33 +02:00 by timothy · 2 comments
Owner

Measured 2026-09-05 on the 16 GB Mac: with ONE .NET slot (#568) in its review round, load rose to 37 and swap from 6.8 GB to 10.8 GB in three minutes with up to eleven dotnet processes, then fell back to load 7 and 65% free RAM when the round ended. Earlier the same day, three slots in review reached load 82 and swap exhaustion (the openlando orchestrator on the same host measured it independently).

Cause: in .claude/workflows/ersatztv-issue-build.js and ersatztv-resume-branch.js, review() runs the correctness lens (Opus, isolation: worktree, builds .NET) in the same parallel() as the cross-family runner, and when Codex cannot run the runner substitutes ANOTHER worktree-isolated Opus reviewer that also builds .NET — two full dotnet build + test-host pipelines per round from one slot, on top of the implementer's lingering MSBuild node-reuse servers. docs/handoffs/orchestration.md says "three issues in flight" and counts reviewers only in prose.

Done-when

  • review() runs the two lenses in parallel; the worktree-isolated cross-family FALLBACK reviewer starts only after both lenses have returned (the Codex runner itself builds nothing and may run beside them); pinned by the harness (web/scripts/orchestration-workflow-loop.test.mjs) asserting the fallback agent starts after both lens agents returned and the runner beside them
  • docs/handoffs/orchestration.md and orchestrator-prompt.md state the measured cap: one .NET-building slot at a time on this host; docs/Python slots may run beside it
  • The finisher derives fix commits from the previous report's head_sha range, not a line-set difference of free text (the #563 run listed all eleven branch commits as fix commits)
  • Adversarial review passed
Measured 2026-09-05 on the 16 GB Mac: with ONE .NET slot (#568) in its review round, load rose to 37 and swap from 6.8 GB to 10.8 GB in three minutes with up to eleven `dotnet` processes, then fell back to load 7 and 65% free RAM when the round ended. Earlier the same day, three slots in review reached load 82 and swap exhaustion (the openlando orchestrator on the same host measured it independently). Cause: in `.claude/workflows/ersatztv-issue-build.js` and `ersatztv-resume-branch.js`, `review()` runs the correctness lens (Opus, `isolation: worktree`, builds .NET) in the same `parallel()` as the cross-family runner, and when Codex cannot run the runner substitutes ANOTHER worktree-isolated Opus reviewer that also builds .NET — two full `dotnet build` + test-host pipelines per round from one slot, on top of the implementer's lingering MSBuild node-reuse servers. `docs/handoffs/orchestration.md` says "three issues in flight" and counts reviewers only in prose. ## Done-when - [x] `review()` runs the two lenses in parallel; the worktree-isolated cross-family FALLBACK reviewer starts only after both lenses have returned (the Codex runner itself builds nothing and may run beside them); pinned by the harness (`web/scripts/orchestration-workflow-loop.test.mjs`) asserting the fallback agent starts after both lens agents returned and the runner beside them - [x] `docs/handoffs/orchestration.md` and `orchestrator-prompt.md` state the measured cap: one .NET-building slot at a time on this host; docs/Python slots may run beside it - [x] The finisher derives fix commits from the previous report's `head_sha` range, not a line-set difference of free text (the #563 run listed all eleven branch commits as fix commits) - [x] Adversarial review passed
timothy added the bugpriority: mediumin-progress labels 2026-09-05 12:03:34 +02:00
Author
Owner

Claiming: orchestrator session, branch 916-serialise-review-fallback, worktree /Users/timothy/orca/workspaces/ersatztv/wt-916. Four-way check: no PR, no branch, no prior comment, fetched origin/main.

Claiming: orchestrator session, branch `916-serialise-review-fallback`, worktree `/Users/timothy/orca/workspaces/ersatztv/wt-916`. Four-way check: no PR, no branch, no prior comment, fetched origin/main.
Author
Owner

Closing record

Outcome: PR #918review() in both orchestration workflows runs the lenses in parallel with the Codex runner beside them and starts the worktree-isolated fallback only after the lenses return; a round whose runner and fallback both fail is an error before the push; cross-family state is per round; fix attribution is a sha range from required head_sha reports; docs/handoffs/orchestration.md + orchestrator-prompt.md state the one-.NET-slot cap with its measurements and thresholds and tell the referee to read cross_family.
Root cause: the review round of one slot launched two worktree-isolated .NET reviewers at once (correctness lens + Codex fallback), each with its own build and test host; the docs counted slots, not reviewer builds. The fix-attribution defect was a line-set difference over free text.
Decisions/conventions changed: none new; process.orchestrated-session body says "several" (Decisions-Edit).
Reusable knowledge: measured 2026-09-05 on the 16 GB Mac — three .NET slots in review: load 82, swap exhausted; one slot's round: swap 6.8→10.8 GB in three minutes; after the fix a round peaks at ~4 dotnet processes and load ~20. A harness observer that resets shared state before reading it cannot fail — key per-round observations by the agent's own label. Read lint EXIT CODES, not the tail of its output.
Verification: vitest harness 28/28 with a five-mutant sweep (runner re-serialised, fallback beside/inside the batch, reset removed, guard removed — each reddens the right assertion in both scripts); pytest scripts/tests 1580 passed / 3 skipped on the final head (reviewer); lint exit 0; narrative 0; decisions validator OK. Five cold review rounds, last one clean.
Deferred: none.
Docs updated: docs/handoffs/orchestration.md, docs/handoffs/orchestrator-prompt.md, docs/decisions/records/process/orchestrated-session.md (one word).

Done-when evidence: box 1 — review() in both scripts + harness cases "…fallback reviewer starts only after both lenses have returned, and the runner beside them" (runner assertion reddens when the runner is re-serialised; fallback assertion reddens when it is moved beside the lenses); box 2 — orchestration.md Isolation bullet and orchestrator-prompt.md lines 10 and 13; box 3 — fix_range / FIX_RANGES in both scripts and the harness case asserting aaaaaaa..f1xxxxx; box 4 — Review-verdict: MERGEABLE @ a083c85 on PR #918.

## Closing record **Outcome:** PR #918 — `review()` in both orchestration workflows runs the lenses in parallel with the Codex runner beside them and starts the worktree-isolated fallback only after the lenses return; a round whose runner and fallback both fail is an error before the push; cross-family state is per round; fix attribution is a sha range from required `head_sha` reports; `docs/handoffs/orchestration.md` + `orchestrator-prompt.md` state the one-.NET-slot cap with its measurements and thresholds and tell the referee to read `cross_family`. **Root cause:** the review round of one slot launched two worktree-isolated .NET reviewers at once (correctness lens + Codex fallback), each with its own build and test host; the docs counted slots, not reviewer builds. The fix-attribution defect was a line-set difference over free text. **Decisions/conventions changed:** none new; `process.orchestrated-session` body says "several" (Decisions-Edit). **Reusable knowledge:** measured 2026-09-05 on the 16 GB Mac — three .NET slots in review: load 82, swap exhausted; one slot's round: swap 6.8→10.8 GB in three minutes; after the fix a round peaks at ~4 dotnet processes and load ~20. A harness observer that resets shared state before reading it cannot fail — key per-round observations by the agent's own label. Read lint EXIT CODES, not the tail of its output. **Verification:** vitest harness 28/28 with a five-mutant sweep (runner re-serialised, fallback beside/inside the batch, reset removed, guard removed — each reddens the right assertion in both scripts); pytest scripts/tests 1580 passed / 3 skipped on the final head (reviewer); lint exit 0; narrative 0; decisions validator OK. Five cold review rounds, last one clean. **Deferred:** none. **Docs updated:** docs/handoffs/orchestration.md, docs/handoffs/orchestrator-prompt.md, docs/decisions/records/process/orchestrated-session.md (one word). Done-when evidence: box 1 — `review()` in both scripts + harness cases "…fallback reviewer starts only after both lenses have returned, and the runner beside them" (runner assertion reddens when the runner is re-serialised; fallback assertion reddens when it is moved beside the lenses); box 2 — orchestration.md Isolation bullet and orchestrator-prompt.md lines 10 and 13; box 3 — `fix_range` / `FIX_RANGES` in both scripts and the harness case asserting `aaaaaaa..f1xxxxx`; box 4 — `Review-verdict: MERGEABLE @ a083c85` on PR #918.
timothy removed the in-progress label 2026-09-05 14:58:19 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: timothy/ersatztv#916