Skip to content

Pinned topf compatibility experiments

Research for #164; the assessment owns recommendations and limits. These are selected upstream unit tests and original Go-overlay probes. They do not run topf's CLI, integration suite, a cluster or real credentials.

Reproduce

Requires Git, Python 3.10+, GNU timeout, native Go 1.27.1 and a C compiler. The runner requires cc and enables CGO for every group; masking also uses the race detector. Public Go module downloads require network access. Use disposable disk-backed paths outside both repositories:

research_root=/path/on/disk/topf-research
mkdir -p "$research_root/gotmp" "$research_root/gocache" "$research_root/gomodcache"
git clone https://github.com/postfinance/topf.git "$research_root/source"
git -C "$research_root/source" checkout --detach 7aeead7545d6a715e719e2e6241027792f7e1a89
export TMPDIR="$research_root/gotmp" GOTMPDIR="$research_root/gotmp"
export GOCACHE="$research_root/gocache" GOMODCACHE="$research_root/gomodcache"
python3 experiments/topf-patterns/run.py --go /path/to/go1.27.1/bin/go \
  --source "$research_root/source" --output "$research_root/run1"

Output must not exist; the source must match the pin and contain no untracked or ignored files. Pass a native Go binary, not a version-manager shim. The child environment contains only the documented scratch paths, Go controls and a small executable path. It does not inherit credentials, GOROOT, user Go settings or a Go workspace. GOENV=off, GOTOOLCHAIN=local and -mod=readonly prevent those sources of drift; public module downloads and the local OS/compiler remain inputs. Go's build overlay adds the original probes without editing upstream files.

Each command has a maximum 600-second wall timeout and a 90-second Go test timeout; the overall test-command budget is 1180 seconds, plus a ten-second forced-termination reserve. Two build/test workers limit resource use. No upstream Taskfile, installation command or workflow is executed.

Checks and interpretation

Group Expected outcome and scope
composition Pass: upstream patch parsing, rejection and template cases; original prefix checks for file/all/role/node order and changed environment input.
masking Pass with -race: registered-value masking across write boundaries and concurrent registration/writing.
secrets-and-version Pass: upstream old-secret discovery, PEM variants and nil handling; original running-contract versus desired-image selection.
dispatch Pass: bounded worker execution and an original deterministic single-worker failure stopping further admission.
write-branch Pass: a successful local subprocess's synthetic output is stored. This is not encryption.
version-controls Pass: plain tag parsing, malformed input rejection and known-version API selection.
encryption-failure Expected failure with BW_PLAINTEXT_PERSISTED: a stub exits 42, but the provider returns success and stores original synthetic bytes.
digest-version Expected failure with BW_DIGEST_IN_VERSION: a digest suffix is included in the parsed version.
unknown-version Expected failure with BW_UNPROVEN_API_SELECTION: empty/malformed running versions select the Lifecycle API.

The runner requires every named test's terminal result, exact process status and negative marker. Missing/skipped tests, extra failing/skipped subtests, compiler errors and timeouts cannot count as confirmation. A successful harness exit means that the expected positive and negative results matched, not that integration is safe. The final upstream status must remain pristine.

The digest marker accepts any parsed version other than 1.14.1; the unknown-version marker accepts selection for either empty or malformed input. Read the marker lines in the raw logs for the exact observations: run 1 included the digest suffix and selected the API for both inputs. The harness does not assert those stronger details.

The filesystem test writes only an arbitrary synthetic string under a test temp directory. Its sops executable is a local stub; no real encryption key, SOPS installation, secret provider or service is used. Synthetic version strings do not establish support for those server versions. Serial failure admission does not establish cancellation of concurrent or already accepted remote work.

Retained evidence

The first run on 20 October 2026 took about 56 seconds: 14 named positive tests passed (eight upstream and six original), with 51 test/subtest pass events, three expected-negative failures and zero skips. The runner exited 0; source and fixture checks matched before and after the run. results.json records versions, commands, source/fixture hashes and every named outcome. Its command strings are argument displays; use the runner above to reproduce the exact argument vectors. retention.json binds the tested uncommitted fixture bytes to Bronzeward base c0a54f8 and records hashes of every retained raw log.

Per-group JSON lines retain the test output. The composition, secrets-and-version and version-controls stderr files retain module-download messages; the other six stderr files were empty and are omitted. The runner substitutes $GO, $SOURCE, $OUTPUT, $FIXTURE and scratch-path placeholders. overlay.json is local path plumbing and is not published. Pre-run PATH/GOROOT diagnostics in the retention metadata ran no tests; no failed fixture launch is omitted. leak-scan.txt records the retained files' scan and limits.

Upstream attempt metadata and the successful-run excerpt are separate QEMU evidence: attempts 1 and 2 failed before tests on Image Factory reachability; attempt 3 passed its five integration subtests. None was run locally. The pinned workflow exercises Talos 1.14.0 to 1.14.1, not a cross-minor upgrade.

The normal mise run verify does not execute this optional networked research fixture. Preserve failed runs and dispose of only this experiment's disposable source/cache/output after its evidence is accepted and preserved. No real upgrade, encryption, credential custody, remote accounting or integration feasibility is established by these synthetic results.