Merge-train control investigation, 2026-09-08¶
The local train promoted stacked PR #1420 and merged it into #1396 after a rebase push was rejected. The draft selector checked holds; the ready, explicit rebase, and agent-operator paths did not. PR inventory omitted baseRefName, and the rebase helper reused a registered agent checkout. Its error status did not stop the subsequent gh pr ready / gh pr merge --squash --auto sequence.
The observed merge commit was 834f84063a4640e72b0916a9a5b3a566b6810fec, recorded at 2026-09-08T16:16:50Z on PR #1420. Local script snapshots and process suspension receipts are retained in the RC1 initiative evidence (2026-09-08-rc1-hygiene/train-race), separate from source.
Installed GitHub CLI help verifies --match-head-commit, --required, required check buckets, and the distinct exit 8 for pending checks. Installed Git help verifies detached worktrees and explicit force-with-lease expectations. GNU Make 4.4.1 supports environment recipe/dry-run controls; clearing only MAKEFLAGS does not clear MAKEFILES. An ignored GNUmakefile also shadows Makefile, so a clean Git status alone is insufficient to identify the actual gate entry point.
The regression suite runs real Git rebases/pushes against a disposable local bare remote and actual make lint / make test fixture recipes. GitHub responses are fixtures. Conflict and push-rejection cases assert that no ready/merge call occurs; hold/base/owner checks run across all mutation entry points. Receipt tests execute both recipes, reject altered logs/receipts and ignored Makefile shadowing, and preserve a revoked earlier receipt when a repeat test fails.
The chosen boundary is a shared tracked gateway plus explicit runtime migration, as recorded in ADR-1244. Duplicated draft-only filters cannot protect ready/rebase/operator paths. GitHub branch protection cannot protect a local worktree and may not exist on a stacked branch. Full VMAFx local gates remain required before merge; this control test suite neither substitutes for those gates nor establishes RC1 readiness.
Runtime migration verification, 2026-09-25¶
The local merge-train runtime migration was independently verified and closed on 2026-09-25:
- Installed runtime adapters in
/home/kilian/dev/vmafx/vmafx/.claude/mergetrain(train.sh,rebase-clean.sh,watchdog.sh,merge_train_operator.py) are hash-bound to committed gatewaya7a58dd8f39576dc2b0a86fb5af518003496b147261dc5294706cbce976f39c7(commit9bae48c2c214d189a8df5602ac38c94f3997f234, blob4ca44da40edfc03fc500174a193b293ca8cfdc3e), matchingreleases/a7a58dd8.../merge_train_guard.py. - The live installation is backed by
migration-xghk30zh(plan.json,receipt.json, hash94720ca125fc500e3d844ae927ed25e06532ee6c36608895d7172a40f121ac5b) and the initialmigration-6wtg48lv. - Legacy unrestricted VMAFx actors are absent. Any active process with a matching name (
PID 3790561 /usr/bin/bash ./train.sh) belongs to its actual external working directory (/home/kilian/dev/scratch/k8s-worktrees/.mergetrain). - Held PRs, non-master bases, and worktree ownership fail closed across all actions; release PR #1213 is excluded; and required checks and exact-head validation receipts fail closed.
- The 26-test disposable regression suite (
python3 -m unittest discover -s scripts/dev/tests -p 'test_*merge_train_guard.py') passes completely.