Files
orchestra/HANDOFF-2026-08-28-burnin-5.md
T
kami d9a5a61965 Hand off with run 5 completed and the plan change designed
Ledger current through F42. Handoff records the two defects found in the
completion tail, the deployed revisions, and the two links the tail still
cannot reach because test-e2e has no gate and no delivery configuration.

PLAN-SPEC-DESIGN.md is the operator-approved design for the ACE-FCA plan gap,
committed as a note. No implementation yet, by instruction.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVbaKucEYBjMqVeUgJUsc1
2026-08-28 06:58:48 +04:00

177 lines
7.9 KiB
Markdown

# Handoff: run 5 reached TaskCompleted, plan machinery is designed and frozen
Written 2026-08-28, 06:55 local (02:55 UTC). Read with `BURNIN.md` (the ledger,
now current through F42), `PLAN-SPEC-DESIGN.md` (the locked design for the next
change), `HANDOFF-2026-08-28-burnin-4.md` (the session before this one),
`AUDIT.md` and `CLAUDE.md`.
Everything below was observed live unless it says otherwise.
## The headline
Run 5 finished. Task `06G4A4F0TFXKZHJE48N05XN1HG`, issue `kami/test-e2e#5`,
reached `TaskCompleted` at 06:48 after two defects were found and fixed in the
completion tail.
```text
frame -> research -> plan -> implement -> review -> done -> finalise -> pushed -> completed
```
Two defects, both live-proven fixed:
- **F41**: harness chrome counted as agent progress, so a stalled lease renewed
without bound.
- **F42**: the result commit refused the completion marker, so completion could
never happen.
## Deployed state
| Half | Revision | Evidence |
|---|---|---|
| Worker, workpc systemd | `dcd9af4` | PID 3634937, started 06:47:50, sha256 `25b41562…`, journal prints the revision at startup |
| Coordinator, homesrv container | `bcaf0cc` | **stale**, see below |
Branch `webui-and-audit-reconciliation`, HEAD `dcd9af4`.
```text
revision dcd9af4806376caf091e18f669ab52f1ba0dc9df
sha256 25b415629d4a02dca7abe202245ac13f5bdb43b501bc17e371dba75b44f6cebb
```
**Confirm the running worker, not the installed file.** Two restarts silently
did not happen tonight. `sudo install` landed the new binary while the old
process kept serving from the unlinked inode. `/proc/<pid>/exe` showed
`(deleted)` and the old hash both times. Check
`sha256sum /proc/$(systemctl show -p MainPID --value orchestra-worker)/exe`,
never just the path.
The second missed restart cost run 5 its retry budget: the pre-F42 worker kept
failing until the router marked the task `failed`.
## The coordinator is behind, deliberately
`2417a39` moved lease TTL to 5 minutes via `domain.LeaseTTL`, and the
coordinator issues the initial lease at `internal/router/router.go:318`. That
half still runs `bcaf0cc`, so new leases arrive with a 30-minute TTL. Worker
renewals send `ttl=300` explicitly, which is why run 5 recovered anyway.
Rebuild when convenient, from a detached worktree, never with
`docker compose build`:
```text
git worktree add --detach /tmp/orchestra-build-dcd9af4 dcd9af4
docker build --build-arg BUILD_REVISION=dcd9af4… -f $T/Dockerfile.api -t orchestra-web-ui-orchestra-api $T
docker compose up -d --no-deps orchestra-api
```
## What this session found
### F41, harness chrome counted as progress
The 02:46 renewal was granted against a pane idle since 02:12. Reproduced the
worker's stored `progress_sha` byte for byte from the live pane, so the branch
taken was `progress != l.ProgressSHA`, not `IsBusy` and not an empty baseline.
`PaneProgress` hashed Claude Code's status footer, whose usage percentage,
context counter and version notice all move on their own schedule.
Fixed in `2417a39`. Live-proven in both directions on the first window after
deployment: renewal at 03:13:48, refusal at 03:16:13, expiry at 03:18:43,
relaunch at 03:20:14.
### F42, the result commit refused the completion marker
`.orchestra/.gitignore` contains `*`, so `.orchestra/done` is ignored, and git
refuses an add whose pathspec names an ignored path. The staging step named the
marker. Every completion attempt failed, once every five seconds, for 22
minutes.
Fixed in `dcd9af4` by excluding the directory rather than the file. Reproduced
both forms in a scratch repo on git 2.55.0 before changing anything.
### F18 is now the clear top item
Both defects tonight were five-second retry loops whose only trace was the
journal, because each identical error overwrote the single `last_error` slot.
`health` in the worker state file was `{}` throughout. The bounded
recent-observation ring described in the previous handoff is the fix. This
session adds a second concrete instance of the cost.
## Where the completion tail stops
Proven: review, done recognised, agent confirmed idle, finalise, result branch
pushed, `TaskCompleted`.
Not proven, and not defects:
- **No quality gate ran.** The deployed `test-e2e` project declares only `id`,
`machine_affinity`, `repo` and `worktree_root`.
- **No PR was opened.** The deployed `config.jsonc` has no `sources` and no
`delivery` keys. `internal/provider/gitea_pr.go` implements PR creation, but
nothing points this project at a Gitea remote.
Submission, human PR review and merge need registry configuration, not code.
That is the cheapest remaining burn-in, and it is a config edit plus one task.
## The next change is designed and frozen
`PLAN-SPEC-DESIGN.md` holds the operator-approved design for the ACE-FCA plan
gap. No implementation exists yet, by explicit instruction: the design must not
land while the completion tail is still being observed.
Shape, in one paragraph each:
- **`plan.md`**, sealed through the existing path and referenced by the existing
`t.PlanRef`. 128 KiB total bound, structural validation by required headings
and phase blocks, no per-line cap. `DecodePlan` keeps the JSON path for refs
already in the CAS.
- **Research ids.** `Finding{ID, Claim, Evidence, Confidence}`, unique ids,
confidence limited to `fact|inference|assumption`. The schema at
`agentctx.go:167` already promises these and the struct drops them today.
- **Progress that Orchestra establishes.** The implementer may write only
`status: "ready_for_verification"`. The worker reads that phase's automated
verification from the accepted plan, runs it, and records
`PlanPhaseVerified`. An agent cannot write `verified`.
- **Verification allowlist.** Plan commands are argv, executed without a shell,
matched against a per-project policy. Absent policy refuses everything.
- **Mismatch as a typed request.** `PlanMismatchRequest` supersedes or reopens
research and planning. No new agent-askable backward transition.
The live proof ladder is in the note. Steps 1 and 3 are the rungs that matter
for smaller local models. The implement launch contains the plan verbatim, and
a rotated successor still receives it whole with phase state intact.
## Things that will bite
- **Verify the running worker binary, not the installed one.** Twice tonight.
- **The worker state file is a cache, not truth.** It read `state failed` for
run 5 while the coordinator still held the task as leasable. I reported the
cache as fact. The coordinator disagreed and was right.
- **`rm` and `cp` are interactive in this shell.** A plain `rm` prompts, appears
to succeed, and leaves the file. Use `/bin/rm -f` and `install`.
- **Another session owns 20-plus uncommitted paths**, including `AUDIT.md`,
`deploy/build.sh`, `web/` and `internal/authn/`. Commit by path. Never
`git add -A`.
- **No network from this sandbox.** `curl` to raw.githubusercontent.com times
out. `WebFetch` against a `github.com/blob/...` URL works.
- **Secrets are guarded.** Reading `.env` or `printenv` of a token through the
shell is blocked. The working recipe is expanding the token inside the
container in a single remote command, as `HANDOFF-2026-08-28-burnin-4.md`
records.
- **`/tmp` is tmpfs with a 10-day sweep.** Check `/tmp/test-e2e` and
`/tmp/test-e2e-worktrees` exist before every run.
- **Two stale monitors** may still be armed from this session, tailing the
worker journal. They are session-local and die with it.
## What I would do next, in order
1. Rebuild `orchestra-api` at `dcd9af4` so the 5-minute TTL applies at issuance.
2. Fix F18 as a bounded observation ring, since two more instances landed
tonight.
3. Configure `test-e2e` with a Gitea remote and a quality gate, then run one
task to prove submission, human review and merge.
4. Implement `PLAN-SPEC-DESIGN.md` exactly as written, including the allowlist.
Steps 1 through 3 are burn-in and observability. Step 4 is the only new
behaviour, and its design no longer needs an architecture pass.