7f12c7fc37
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>
300 lines
15 KiB
Markdown
300 lines
15 KiB
Markdown
# 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.md` absent,
|
|
> the worker binary 1,131 lines, `clients/` gitignored and untracked,
|
|
> `node_modules/flatted` still in `go list ./...`, `orchestra-worker` tracked
|
|
> at 100755, the `!=` token compare at `main.go:581`, and the
|
|
> `Observed`/`SessionHealth` fix 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
|
|
|
|
```text
|
|
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.md` and `AUDIT.md` both state Design B ("workers pull
|
|
tasks") is "fully built server-side but has zero clients — no worker binary
|
|
exists."
|
|
- **evidence:** `cmd/orchestra-worker/main.go` is 1,131 lines, has passing
|
|
tests, and is the deployed worker per `AUDIT.md`'s own deployment note. The
|
|
Design A guardrail also landed — `internal/orchestrator/orchestrator.go:309`
|
|
refuses non-local herdrs. Meanwhile Design A's client,
|
|
`clients/herdr-bridge.go`, is **gitignored** (`.gitignore` line `clients/`)
|
|
and untracked, so the code `CLAUDE.md` calls "currently deployed" is not in
|
|
version control.
|
|
- **impact:** `CLAUDE.md` loads 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.md` decision (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.md` instructs every session to cross-check claims
|
|
against `progress.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.md`
|
|
already serves this role.
|
|
- **risk:** none.
|
|
- **second-pass note:** `AGENTS.md` also references `progress.md` and was
|
|
missed by the original sweep — add it to the cleanup list alongside
|
|
`CLAUDE.md` and `internal/orchestrator/rotation_test.go`.
|
|
|
|
### 3. Silent `continue` regrew in `refreshSessionHealth` — repaired
|
|
|
|
- **problem:** `refreshSessionHealth` discarded adapter-resolution errors with
|
|
a bare `continue`, contradicting the comment on `SessionHealth` directly
|
|
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 bare `404` for
|
|
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:** `.gitignore` documents that `node_modules` "ships vendored Go
|
|
packages ... so leaving it merely untracked is not enough."
|
|
- **evidence:** `go list ./...` still returns
|
|
`orchestra/web/node_modules/flatted/golang/pkg/flatted`, and `go 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 a `web/go.mod` stub — a build-tag barrier will not help, since
|
|
the package is already in the module's package list.
|
|
- **verification:** `go list ./... | grep node_modules` must return nothing.
|
|
|
|
### 5. A tracked 8.9MB binary
|
|
|
|
- **evidence:** `git ls-files -s orchestra-worker` -> tracked, mode 100755.
|
|
`orchestra` is gitignored. Inconsistent.
|
|
- **impact:** repo bloat; a stale committed binary is a deployment-confusion
|
|
hazard in a project whose `CLAUDE.md` already 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 `server` package 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:581` uses `!=` on the Authorization header, while
|
|
`internal/authz/authz.go:111,241` correctly uses `subtle.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.
|
|
|
|
```text
|
|
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
|
|
in `SessionHealth.LastError` instead of dropping them; add `Observed bool` so
|
|
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/complete` as 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
|
|
|
|
1. `go list ./... | grep node_modules` returns nothing (finding 4).
|
|
2. `git ls-files | xargs file | grep ELF` returns nothing (finding 5).
|
|
3. `grep -rn 'progress.md' .` returns nothing outside this file (finding 2).
|
|
4. `go build ./...` passes after `clients/` deletion (finding 1).
|
|
5. Then, and only then, the single OpenCode controlled continuity run described
|
|
in `AUDIT.md`'s QA handoff — since without it every "Closed" row in
|
|
`AUDIT.md` rests only on unit tests.
|
|
|
|
## Uncertainties
|
|
|
|
- **Unknown:** whether the deployed image contains these fixes. Per
|
|
`CLAUDE.md` this needs `docker compose up -d --build`; nothing was deployed,
|
|
and `sudo` is unavailable in this sandbox.
|
|
- **Unknown (unresolvable from here):** live behavior. All six herdrs were
|
|
unreachable as of 2026-07-29; `AUDIT.md` reports one OpenCode worker back up
|
|
on 2026-07-30. No probe was performed.
|
|
- **Assumption:** `clients/herdr-bridge.go` is 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.
|