Log in
docs/benchmark-workstation.md 123 lines · 5.4 KB

Benchmark workstation

Use a fresh isolated worker checkout. The harness requires Python 3.9+ and the subjects under test; its core has no required third-party Python packages. Tests with local HTTP fixtures require permission to bind loopback sockets. They do not require production remotes.

Create an isolated checkout

Read the workspace and repository AGENTS.md instructions first. In the standard Oak workspace, use its required worker naming convention:

: "${WORKSPACE_ROOT:?Set WORKSPACE_ROOT to the registry allowed by your AGENTS.md}"
WORKER="$WORKSPACE_ROOT/worker-mrmrs-$(date -u +%Y%m%dT%H%M%S)-benchmark-workstation"
mkdir -p "$WORKER"
oak clone oak/benchmarks "$WORKER/bench"
cd "$WORKER/bench"
pwd
oak status --json

Set WORKSPACE_ROOT before running this example. Before edits or generated runs, confirm the exact worker path, selected branch, head and clean/dirty state. Canonical repository checkouts are not disposable workers.

Configure subjects and serialization

The default subject configuration finds Git and installed Oak on PATH. Copy it outside the repository and set the selected subjects' bin entries to the absolute executable paths you intend to test:

export BENCH_SUBJECTS="$WORKER/subjects.toml"
cp config/subjects.toml "$BENCH_SUBJECTS"
command -v git
command -v oak

For repeated measurements, place candidate/released Oak binaries in stable worker-owned paths. Record executable hashes, versions, source revisions and host state. Copying an executable does not pin its libraries, system helpers or services; recheck provenance after host updates.

The harness forces OAK_NO_UPDATE_CHECK=1 so Oak's first command in a fresh benchmark HOME does not charge an update-server request to whichever subject runs first. Measure that cold-home user experience separately if it is a study objective.

Set the same explicit lock path in every process measuring on this machine. Keep it outside individual workers so deleting a worker does not replace the shared lock. The location is configurable:

export OAK_BENCH_LOCK_PATH="$WORKSPACE_ROOT/oak-bench-measurement.lock"

The default lock lives under the process temporary directory, which can differ between environments. It does not establish a machine-wide shared lock by itself. Keep locking enabled and run measurements after builds and tests have stopped. Do not stop another worker's campaign. Campaign plans pin the canonical lock path and refuse a different path on resume.

Local validation

From the new worker checkout:

python3 -m unittest discover -s tests

# Diagnostic smoke; one repetition cannot establish a public speedup.
python3 scripts/bench.py --profile smoke --runs 1 \
  --config "$BENCH_SUBJECTS" --subjects git,oak_installed \
  --skip-remote --randomize-subject-order \
  --workdir "$WORKER/workdirs/core-smoke" --results "$WORKER/results/core-smoke"

Retain logs, raw rows and generated artifacts outside source control. A smoke failure is a development signal, not evidence to discard or relabel as a skip. A successful setup is not certification of a dedicated performance runner. Historical review findings and validation counts belong to the dated review documents, not assumptions about the current machine.

Agent campaigns

Follow the agent campaign plan to copy and configure the smoke manifest, freeze a schedule, and use the plan/run/status/report CLI. Point its subjects_config at the same intended subject configuration and select the mock agent for initial validation. Real agents require explicit enablement and worker attestation; that attestation does not provide an OS sandbox for unrestricted agent CLIs.

Preserve the campaign directory for status, reports and resume. Do not edit its frozen plan or delete failed trials to improve a result. A changed model, executable, instruction condition, configuration, lock path or harness requires a new plan. A finished mock campaign verifies harness execution and accounting; it does not estimate an agent's success rate or a VCS speedup.

Expand to a performance campaign

Clone Oak source into another isolated worker before building a candidate. scripts/prepare-subjects.sh invokes Cargo and writes its target directory; its OAK_REPO must therefore identify an isolated source checkout, never a canonical repository. Set OUT to a stable path owned by the task.

Use pinned baseline/candidate binaries and source provenance, equal semantic tracks, matched transport, seeded randomized/interleaved repetitions, recorded cache evidence and runner state, and a separate A/A noise campaign. Choose sample size for the effect and uncertainty needed; a minimum count alone is not sufficient precision. See runner discipline, statistical methodology, and the dated reviews for current limitations.

Source config/bench-env.sh only for deliberately configured remote-backed lanes. It supplies existing named disposable remotes, not per-run isolation. Allocate and track run-owned repositories before lifecycle or contention campaigns. Missing credentials, FUSE, Linux network privileges, LFS, real-agent binaries/models and hosted CI are capability gaps, not zero cost or successful measurements.

For human usability, pilot the separate human study protocol. Neither a scripted workflow nor a mock-agent row substitutes for a participant observation.