Record run 6, the four missing links, and the baseline conformance run

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01CVbaKucEYBjMqVeUgJUsc1
This commit is contained in:
2026-08-28 11:07:41 +04:00
parent 063a3ab9ad
commit 4e244d8104
+110
View File
@@ -1790,3 +1790,113 @@ has no `sources` and no `delivery` keys, so no PR could be opened.
Proven chain: review, done recognised, finalise, result branch pushed,
`TaskCompleted`. Submission, human PR review and merge remain unproven, and they
need registry configuration rather than code.
## Run 6, 2026-08-28: the PR tail, and the baseline conformance run
The last handoff said submission, human review and merge needed configuration
rather than code. That was wrong. The whole event log held zero `ReviewRecorded`
and zero `TaskSubmitted`: nothing in the running system ever called either
endpoint, so the publisher, the merge reflection and the human trust boundary
had no entry point at all. Four links were missing, and three more defects
surfaced while proving them.
### F43, the reviewed change had no path to the human
The worker's completion tail called `federation.Client.Complete` directly and
emitted `TaskCompleted`. `POST /v1/tasks/{id}/review` and
`POST /v1/tasks/{id}/submission` existed and had no live caller; `task pr` is
named in six documents and implemented nowhere. `GiteaPublisher.Push` also ran
`git push` from `projectRoots[project]/<task>` on the coordinator, a directory
that does not exist for a worker-owned project whose worktree is on workpc.
Fixed in `e8d04d7`:
- `finalize` commits first and runs the gate against the committed tree, so
`GateResult.SHA` is the commit being submitted. `CheckSubmission` requires
gate sha, review sha and head sha to be one commit, which a gate run on the
pre-commit tree can never satisfy.
- `POST /v1/federation/workers/<id>/submit` seals the review and submits. A
blocking review returns the task to implementation; a project with no forge
still completes directly.
- The reviewer's brief names `.orchestra/review.json` and no longer claims a
diff is supplied. Nothing populates `agentctx.Evidence` on the federated
path, so the brief described material the session never received.
- `Push` asks the forge what the branch holds before reaching for a checkout.
### F44, the Gitea source ingested Orchestra's own pull requests
The first submission this deployment ever made, `kami/test-e2e#8`, came back one
minute later as task `06G4E83E4KRXM8DS90M2648MGM` with the submission packet as
its description. That task would have implemented, reviewed and submitted again,
opening a pull request per cycle. The issues endpoint returns pull requests and
nothing filtered them. The webhook had the same hole from the other side: a
`pull_request` delivery leaves the `issue` key empty and would have appended a
task numbered 0 with no title.
Contained by blocking the spawned task, fixed in `6ccc755`.
### F45, the submission reflection loop was dead code
`if len(pullRequests) > 0` guarded the loop 600 lines before the Gitea wiring
that writes to that map. The length was always zero, the goroutine never
started, and a merged pull request could never complete its task. Live: a
trusted comment on PR #8 moved nothing until `4af9880` moved the block below
the wiring.
### F46, stale review findings survive a changes-requested round trip
The worktree is not recreated, so `.orchestra/review.json` from the first review
is still present when the second one starts. A reviewer that writes
`.orchestra/done` without rewriting it would have the earlier findings sealed
against the new commit, and a stale pass is indistinguishable from a fresh one.
Observed at 10:57:48 with a file from 10:55:45. That reviewer did rewrite it, so
the run stands. Fixed in `063a3ab`.
### Baseline conformance run
Task `06G4E6F69AKP2PA00S28D7ASBC`, issue `kami/test-e2e#7`, `workpc-claude`,
tmux backend. Coordinator `4af9880`, worker `e8d04d7`. No manual lifecycle
intervention: every event below was emitted by the plane.
```text
06:41:14 TaskCreated issue #7 polled
06:41:37 WorkPhaseChanged frame -> research
06:42:57 WorkPhaseChanged research -> plan
06:45:12 WorkPhaseChanged plan -> implement
06:46:27 WorkPhaseChanged implement -> review
06:47:48 ReviewRecorded blocking 0, sha 41dee802
06:47:49 TaskSubmitted PR 8 opened, sha 41dee802
06:55:11 TaskChangesRequested trusted comment by kami
06:55:11 WorkPhaseChanged review -> implement
06:57:47 WorkPhaseChanged implement -> review
07:00:09 ReviewRecorded blocking 0, sha 0d1585df
07:00:09 TaskSubmitted PR 8 reused, sha 0d1585df
07:02:07 merge by kami
07:02:11 TaskCompleted receipt binds merge f48e363d
```
Acceptance, each checked against the artifact rather than the log line:
- The gate ran against the exact submitted commit. Gate artifact
`bd3549d6`: `{"command":"bash -n scripts/*.sh && bash
scripts/orchestra_e2e_healthcheck.sh","exit_code":0,"sha":"0d1585df"}`.
- `TaskSubmitted` binds all five: gate sha, review sha, result sha, remote ref
`origin/orchestra/06G4E6F69AKP2PA00S28D7ASBC`, and PR 8. The PR head reads
`0d1585df` at the forge.
- Resubmission reused PR 8 with a new gate ref and a new review ref.
- A trusted human reopened the task and the change reached merged `master`:
`--quiet` is documented in `--help`, which is what the comment asked for.
- Merge produced the completion receipt: `merge_sha f48e363d`,
`submitted_sha 0d1585df`, `submission_ref 06G4EASR63SZ1WWRYHR62WJQS4`.
- Final state `completed`.
Freeze this as the baseline. One caveat on the reopen: Gitea returns 422 for a
review on your own pull request, and Orchestra opens the PR as the same forge
user the operator reviews as. `REQUEST_CHANGES` is therefore unreachable in this
deployment and the comment path is what was exercised. A separate bot account
for `ORCHESTRA_GITEA_TOKEN` would restore it.
Configuration this needed, for the record: `quality_gate` on `test-e2e` in both
`config.jsonc` (coordinator) and `/etc/orchestra/worker-projects.json` (worker,
which is the copy `finalize` actually reads), plus `ORCHESTRA_REVIEW_ACTORS=kami`
in the compose `.env`.