The v3 stack, previously an uncommitted working tree, plus this session's two units and the burn-in instrument. This commit is the burn-in build identity: coordinator and worker must both report this revision before a task is created. Workflow (earlier sessions, uncommitted until now): human decision events and reduction, source cursors and reconcile-before-launch, turn-boundary reconciliation, internal/agentctx as the single renderer, ace-fca phases with sealed artifacts, the trajectory gate, bounded grilling, independent review, task pr enforcement, and human review reflection. Capability restrictions at the agent boundary: an authz.Agent surface at GatedWrite may ask and may not act. It also fixes two bugs the unit exposed -- gated surfaces could not reach the two endpoints written for them, and RequestHumanDecision would block an unowned task while rejecting a question from the session that did own it. Turn-boundary reconcile-failure escalation: a streak of consecutive failures asks the session to hand off, fenced on the lease epoch, with reconcile_failure as a real handoff reason. The worker was dropping the coordinator's verdict on the floor; it now acts on it. Burn-in: herdr.WriteLaunchContext dumps the exact agentctx.Build result to <worktree>/.orchestra/launch.md at every launch, local and federated. BURNIN.md is the runbook. deploy/build.sh stamps both binaries from one commit. go build, go vet and go test ./... pass, 20 packages. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
15 KiB
Orchestra — senior engineering review, 2026-07-30
Second-pass verification (2026-07-30, later session): the factual claims below were independently spot-checked and all held up —
progress.mdabsent, the worker binary 1,131 lines,clients/gitignored and untracked,node_modules/flattedstill ingo list ./...,orchestra-workertracked at 100755, the!=token compare atmain.go:581, and theObserved/SessionHealthfix plus its test present with build/vet/tests passing. The verdict and priority order are endorsed as written, with the annotated caveats inline below.
Reviewed against the working tree, orchestra-spec (1).md, AUDIT.md,
CLAUDE.md, the git history, and the build/test/race suites. No live herdr or
pane was touched (CLAUDE.md forbids destructive calls from an audit session
without asking first).
Verdict
The code is in better shape than CLAUDE.md warns, and worse shape than
AUDIT.md claims. Build, vet, test, and -race all pass. The boldest audit
claims were spot-checked and hold up: /v1/harness/complete really is 410,
the invented herdr methods (pane.release, pane.kill, rotation_signal,
pane.status) are genuinely gone from all call paths, and lease-epoch fencing
has real tests. The historical "looks wired but isn't" pattern has largely been
paid down.
What has not been paid down is the documentation layer, which has now drifted in the opposite direction — it understates the code. And the project's real blocker is not code at all: it is that nothing has ever been verified live.
First assessment
purpose: unattended multi-agent task orchestrator; leases coding
tasks to CLI harnesses in herdr-managed panes, rotates
them across context limits, hands off via git anchors
intended users: a single operator (the repo author)
actual users: none yet — no end-to-end path has run live
critical workflows: lease -> launch -> turn decision -> rotate/release ->
handoff -> pickup -> complete
current state: code-complete per AUDIT.md; zero live verification
known failures: no verified live capacity (only workpc OpenCode is
reachable); release gate correctly still closed
maintenance burden: 16.8k loc Go, 4 binaries, a web UI, 647-line spec, for
one operator
technical constraints:herdr JSON-RPC over raw TCP/unix socket, protocol 17;
no sudo in this sandbox; Docker Compose deployment
personal constraints: solo project, unattended operation is the whole point
what still works well:the event store (fsync-before-projection, replay from
events.jsonl only), lease epoch fencing, the live-
captured herdr protocol record
what has become obsolete: Design A federation (clients/herdr-bridge.go), the
legacy /v1/harness/complete handler, progress.md
references, the tracked binaries
Classification: overbuilt (feature surface far ahead of verified capability) and misaligned (documentation describes a system state that no longer exists, in both directions). Not fragile at the code level, and not abandoned — recoverable with modest, targeted work.
What the project is now
A 16.8k-line Go event-sourced orchestrator for one operator, with a 647-line
spec, four binaries, a web UI, and a federation layer — of which zero
end-to-end paths have ever run successfully against live capacity.
AUDIT.md marks every P0/P1/P2 item "Closed 2026-07-30" on the strength of
unit tests, then correctly refuses to clear the release gate because only one
harness (OpenCode on workpc) has reachable capacity at all.
What it should become
Narrower, and verified rather than more complete. The next durable improvement is one controlled live run on the one harness that works — not more features, and not more audit rows. Everything below is subordinate to that.
Main findings
1. The documented architectural fork no longer exists, but both docs still describe it
- problem:
CLAUDE.mdandAUDIT.mdboth state Design B ("workers pull tasks") is "fully built server-side but has zero clients — no worker binary exists." - evidence:
cmd/orchestra-worker/main.gois 1,131 lines, has passing tests, and is the deployed worker perAUDIT.md's own deployment note. The Design A guardrail also landed —internal/orchestrator/orchestrator.go:309refuses non-local herdrs. Meanwhile Design A's client,clients/herdr-bridge.go, is gitignored (.gitignorelineclients/) and untracked, so the codeCLAUDE.mdcalls "currently deployed" is not in version control. - impact:
CLAUDE.mdloads into every session. It actively steers future work toward a fork that is already resolved, and toward preserving untracked code. This is the single highest-leverage inaccuracy in the repo. - classification: cleanup / deletion
- recommended action: update both docs to state Design B is the live
design; delete Design A and
clients/outright, or track it if it is still deployed. Do not leave deployed code untracked. - risk: low. Deleting
clients/is only safe once it is confirmed undeployed — see Uncertainties. - second-pass note: outright deletion also conflicts with the standing
AUDIT.mddecision (2026-07-27) to keep Design A through Phase 5. The safer immediate action is the review's other option: track the bridge now (deployed code must be in version control) and defer deletion to the Phase 6 cutover already decided. - verification:
go build ./...after deletion; confirm nothing references the bridge.
2. progress.md — cited as authoritative by both CLAUDE.md and a test — does not exist
- problem:
CLAUDE.mdinstructs every session to cross-check claims againstprogress.md; a test comment cites "the highest-priority spec defect noted in progress.md". - evidence: file absent; last touched in commit
636ed8a, deleted since. - impact: an instruction every session is told to follow cannot be followed.
- classification: cleanup
- recommended action: remove the references, or restore the log.
AUDIT.mdalready serves this role. - risk: none.
- second-pass note:
AGENTS.mdalso referencesprogress.mdand was missed by the original sweep — add it to the cleanup list alongsideCLAUDE.mdandinternal/orchestrator/rotation_test.go.
3. Silent continue regrew in refreshSessionHealth — repaired
- problem:
refreshSessionHealthdiscarded adapter-resolution errors with a barecontinue, contradicting the comment onSessionHealthdirectly above it, which promises "a resolution/read failure is recorded here rather than silently treated ... by a bare continue." - evidence:
orchestrator.go:357-359(pre-fix). Occupancy read failures were recorded; resolution failures were dropped.GET /v1/tasks/<id>/health(main.go:721) consequently returned a bare404for any session whose herdr this coordinator cannot resolve — indistinguishable from "no such task", with the reason thrown away. That is the normal case for a remote worker-owned session, i.e. the primary federated path. - impact: operator-facing invisibility on exactly the code path the deployment now depends on. This is the B1/B2 failure mode the repo has a documented history of.
- classification: repair — done in this pass
- why this level of change: the contract was already documented and already had a consumer; only the implementation was missing. No abstraction needed.
- alternatives considered: having the worker report per-task health up
through
/v1/federation/*instead. Better long-term, but larger, and it does not remove the need for the coordinator to be honest about what it cannot see. - verification: new test confirmed to fail against the old behavior before passing against the fix.
4. 98MB of node_modules sits inside the Go module, and the mitigation didn't work
- problem:
.gitignoredocuments thatnode_modules"ships vendored Go packages ... so leaving it merely untracked is not enough." - evidence:
go list ./...still returnsorchestra/web/node_modules/flatted/golang/pkg/flatted, andgo test ./...reports it. Untracking did not remove it from the build list. - impact:
go build ./...compiles arbitrary third-party Go vendored inside npm packages. Any npm dependency shipping non-compiling Go breaks the entire build for reasons unrelated to this project. - classification: repair
- recommended action: move
web/out of the module root, or exclude the subtree with aweb/go.modstub — a build-tag barrier will not help, since the package is already in the module's package list. - verification:
go list ./... | grep node_modulesmust return nothing.
5. A tracked 8.9MB binary
- evidence:
git ls-files -s orchestra-worker-> tracked, mode 100755.orchestrais gitignored. Inconsistent. - impact: repo bloat; a stale committed binary is a deployment-confusion
hazard in a project whose
CLAUDE.mdalready warns that running images silently predate commits. - classification: cleanup
- recommended action: untrack both, gitignore both.
6. main.go is 1,418 lines of 30 inline route closures
- impact: the largest comprehension cost in the repo, and where auth checks are easiest to omit by accident — each closure re-implements its own method check and token check.
- classification: refactor (later)
- recommended action: extract handlers into a
serverpackage with shared middleware for method + auth. Do it the next time a route is added, not as a standalone sweep. - risk: moderate if done as one large sweep; low if done incrementally.
7. Non-constant-time harness token comparison (low)
- evidence:
main.go:581uses!=on the Authorization header, whileinternal/authz/authz.go:111,241correctly usessubtle.ConstantTimeCompare. - impact: theoretical only — the port is ufw-restricted to one LAN host. Worth fixing for consistency, not urgency.
- classification: security (low)
- recommended action: use
subtle.ConstantTimeCompare.
Keep
Event-sourced store with fsync-before-projection and replay solely from
events.jsonl; lease epoch fencing; the deploy/herdr-schema.json
live-captured protocol record and the CLAUDE.md herdr protocol notes (these
are hard-won and correct); the thin dependency surface (two golang.org/x
deps — genuinely disciplined).
Remove
clients/ and Design A cross-machine calls; the tracked binaries;
progress.md references; web/node_modules from the Go module graph; the
retained /v1/harness/complete compatibility handler once nothing calls it.
Repair now
Findings 1, 2, 4 — all cheap, all currently misleading a future session or breaking a build.
Refactor later
Finding 6. Also consider whether internal/{delivery,operations,admin,ui,webui}
(~1,400 loc across five packages) earn separate package boundaries for a
single-operator tool.
Rewrite only if
Nothing here justifies a rewrite.
incremental repair cost: low — findings 1,2,4,5,7 are hours, not days
rewrite cost: very high — 16.8k loc plus a 647-line spec
migration cost: high — a live event log exists and must replay
behavior at risk: the event store and lease fencing, i.e. the
parts that are actually sound
tests available: full unit + race suite, passing
hidden knowledge: substantial — the live-verified herdr protocol
quirks (number-vs-string protocol version,
params:{} requirement, no handoff from release)
compatibility requirements: must replay the existing events.jsonl
expected maintenance gain: negligible; the complexity is in the domain
The event log is the hard part and it is sound. Revisit only if live QA shows the rotation state machine is wrong at the protocol level rather than the implementation level.
Changes made in this pass
internal/orchestrator/orchestrator.go— record adapter-resolution failures inSessionHealth.LastErrorinstead of dropping them; addObserved boolso lease-time-seeded health cannot be mistaken for a live reading.internal/orchestrator/rotation_test.go—TestUnresolvableAdapterRecordsObservableSessionHealth, verified to fail without the fix.cmd/orchestra/main.go— corrected a comment that still described the retired/v1/harness/completeas handling completion.
Behavior changed: GET /v1/tasks/<id>/health now returns a record with
last_error for a session this coordinator cannot resolve, instead of 404.
One new JSON field, observed.
Behavior preserved: no change to rotation, leasing, or release decisions.
Observed is purely additive.
Verification performed
go build ./..., go vet ./..., go test ./..., and go test -race ./...
all pass with these changes. The new test was confirmed to fail against the
old bare-continue behavior (unresolvable session recorded no health at all; the resolution failure was swallowed) before passing against the fix — the
green run was not taken at face value.
Second-pass note: the "verified to fail without the fix" claim cannot be re-verified from the current tree (the fix is already in), so it rests on the original reviewer's word. Every independently checkable claim in this document was accurate, which lends it credibility.
Verification plan for the outstanding work
go list ./... | grep node_modulesreturns nothing (finding 4).git ls-files | xargs file | grep ELFreturns nothing (finding 5).grep -rn 'progress.md' .returns nothing outside this file (finding 2).go build ./...passes afterclients/deletion (finding 1).- Then, and only then, the single OpenCode controlled continuity run described
in
AUDIT.md's QA handoff — since without it every "Closed" row inAUDIT.mdrests only on unit tests.
Uncertainties
- Unknown: whether the deployed image contains these fixes. Per
CLAUDE.mdthis needsdocker compose up -d --build; nothing was deployed, andsudois unavailable in this sandbox. - Unknown (unresolvable from here): live behavior. All six herdrs were
unreachable as of 2026-07-29;
AUDIT.mdreports one OpenCode worker back up on 2026-07-30. No probe was performed. - Assumption:
clients/herdr-bridge.gois genuinely still deployed. If it is not, finding 1 becomes pure deletion.
Next highest-value change
Fix the CLAUDE.md / AUDIT.md federation drift (finding 1) before any
further code work — it is what will misdirect the next session.