Skip to content

Pinned tuppr compatibility experiments

Research for #165. The report owns recommendations and limitations. This fixture runs selected fake-client upstream tests and two original negative probes. It installs no operator and contacts no cluster.

Reproduce

Requires Git, Python 3.10+, GNU timeout and Go 1.27.1 on PATH. Go module downloads need network access; tests use fake Kubernetes/Talos clients. Use a disposable, disk-backed directory outside either repository for source, evidence and caches. From the Bronzeward checkout:

research_root=/path/on/disk/tuppr-research
mkdir -p "$research_root/gotmp" "$research_root/gocache" "$research_root/gomodcache"
git clone https://github.com/home-operations/tuppr.git "$research_root/source"
git -C "$research_root/source" checkout --detach 377fbf03df05420ca833230233e67877e5f343d4
export TMPDIR="$research_root/gotmp" GOTMPDIR="$research_root/gotmp"
export GOCACHE="$research_root/gocache" GOMODCACHE="$research_root/gomodcache"
python3 experiments/tuppr-patterns/run.py \
  --source "$research_root/source" --output "$research_root/run1"

The output directory must not exist. The source must be clean at the exact pin. The script uses GOWORK=off, GOTOOLCHAIN=local, -mod=readonly, two build/test workers and bounded command/test timeouts. It clears inherited environment GOFLAGS and GOROOT, but does not disable Go's persisted per-user configuration. The recorded run is not fully hermetic. It does not run upstream mise tasks or installation hooks. Go's -overlay adds the two probe files to their upstream packages only for compilation; it does not modify the source checkout. See go help build for the overlay contract.

Go minimum 1.26.5 comes from the pinned go.mod. Upstream's .mise/config.toml pins Go 1.27.2; the recorded Go 1.27.1 run is not that CI toolchain. Talos/Kubernetes version strings inside fake tests are synthetic values, not exercised servers.

Interpreting the result

run.py lists every selected top-level test. Positive groups must exit 0 and report every named test passing. Negative groups must exit 1, report their named test failing and include the corresponding BW_ marker. Missing tests, skipped tests, unexpected failure/subtest skips, compiler errors and timeouts fail the experiment. The final source status must remain clean.

  • recovery: creation, health refusal, generation-change reset of Failed to Pending (not explicit retry authorization), failed synchronization, failed Job with target version, and persisted reboot tracking after Job GC.
  • coordination: tuppr-resource blocking only.
  • config: synthetic legacy and multi-document image reads/edits.
  • health: validation, missing object and empty/failing selection semantics.
  • foreign-cordon: expected negative, cleanup clears a pre-existing cordon.
  • suspend-job: expected negative, suspension leaves an existing Job enabled.

The negatives assert Bronzeward integration requirements, not tuppr's promises. Stopping a Kubernetes Job would still not account for an earlier remote request. No credentials, live admission/PDB controller, quorum, real upgrade, reboot, network-loss or cross-controller race are exercised. Scheduling/hooks and image-resolution paths are source-reviewed only. No lifecycle feasibility or production-readiness claim follows from the runner's exit 0.

Retained evidence

results.json records versions, hashes, commands, exit codes and the exact test inventory. Per-case JSON lines retain test output; paths for the fixture, source and output roots are replaced by $FIXTURE, $SOURCE and $OUTPUT. overlay.json is local execution plumbing, not published. The coordination, health, foreign-cordon and suspend-job stderr files were empty and are omitted; the other two stderr files are retained. launch-failure.txt preserves the first failed environment setup. leak-scan.txt states the scan's scope.

Recorded 20 October 2026: 19 selected upstream tests passed (46 test/subtest pass events), two compatibility probes failed with the expected markers, zero skips; runner exit 0 and source clean. Script and probe hashes identify the tested working-tree bytes based on Bronzeward 0439601. Full repository verification is separate; the normal mise run verify does not execute this optional networked research fixture. Retain failed runs. Dispose of only this experiment's source, cache and output paths after its evidence is accepted and preserved.