feat(external-runtime): persist and reconcile execution evidence - #4
Conversation
Assessment before mergeMerging as-is into 1. This branch's CI does not compile the operator. The green That is a consequence of the branch topology, not a defect in this PR: 2.
Not a blocker. ERH-006 is the item that would give it a first caller, and the roadmap status should say so. What does hold up. Follow-up tracked separately: unify this orphan line into |
feat/external-runtime-w0-w1 -> feat/cncnet-private-allocator (including the evidence-reconciliation work merged as PR #4) shared no ancestry with main: `git merge-base` returned nothing, its root commit 0486d83 had no parent, and it carried its own go.mod, its own narrower CI, and charts/ instead of helm/. It was started on 2026-08-23, twelve minutes after PR #3 merged, which is the most likely explanation for the allocator that the RA2 gate report attributed to a commit nobody could find in this repository -- it was authored in a tree that shares no history with the one being searched. Merged with --allow-unrelated-histories. The two trees were near-disjoint, so this is a union rather than a replacement: api/, controllers/, main.go, e2e/, helm/, k8s/, modules/ and services/ are untouched, and internal/externalruntime, internal/relay, internal/harness, internal/capture, pkg/{evidencev1,gatev1, relayv1}, cmd/bindery-{external-runtime,udp-relay,redaction-scan}, charts/, contracts/externalruntime/ and verification/ arrive alongside them. Seven files collided and were resolved by union rather than by picking a side: - go.mod keeps main's (a strict superset; the external-runtime packages need no dependencies). Its `go 1.22.0` turned out to be sufficient -- the other tree's `go 1.23` was not load-bearing -- and `go mod tidy` reports no drift. - Makefile keeps main's targets and gains test-race, vet, lint-charts, redaction, and verify-external-runtime. - .github/workflows/ci.yml keeps main's go-test, sample-game-test and e2e-smoke jobs and gains an external-runtime job running race tests, vet, chart lint, and the secret scan. One job is deliberately NOT carried over: the image job that published ghcr.io/bayleafwalker/bindery-core on every push. That tag's meaning is now ambiguous -- the root Dockerfile builds only the external-runtime binaries, not the operator -- and enabling an external publish as a side effect of a merge is not a decision to make silently. - bindery-core.dispatch.json unions scope roots, risk surfaces, skills, and verification commands, and takes the gates and hooks blocks that only the external-runtime side defined. - .envrc, .gitignore and README.md are unions. This is the first time the external-runtime packages have been compiled or tested alongside the operator. Their previous green CI ran `go test -race ./...` over a tree that contained no api/, no controllers/ and no main.go, so it was structurally incapable of failing on operator breakage. Under one module: go build, go vet, go test ./..., go test -race ./..., make verify, and helm lint of both charts all pass. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Y7raRPAwARat3XE4JRHvMW
Purpose
Turn the RA2 two-client vertical-slice findings into generic Bindery Core boundaries: durable control-state identity, independent observation reconciliation, explicit gate applicability, and calibrated consequential gates.
Scope
exact-countandordered-hashreconciliation intopkg/evidencev1(the 6,651/6,651 RA2 result is the first exact-count regression fixture);pkg/gatev1;Recreatereplica over a PVC;The original research pack under
docs/researchremains unchanged.Important boundary
The successful 2026-08-25 RA2 run predates these stable IDs. The assessment records it as historical evidence and explicitly refuses to invent placement, execution, or evidence-set IDs retroactively. Acceptance requires repeating the run through the hardened control plane, then using a non-RA2 runtime to test abstraction.
Verification
Local checks passed:
git diff --check;ddee8b4fabb6f122f371e14c4d083b5df6492749.This workspace has no Go or Helm binaries, so
go test -race ./...,go vet ./..., and Helm lint are intentionally left to repository CI before the PR leaves draft.Review focus