Status: preparation tooling only; no X6/X7 verifier outcome
Issue: #1080
Program: S3 / Paper A external validity
Protocol: v1 preregistration, v1.1 validity amendment, and v1.2 power-method amendment
The S3 verifier program now has a deterministic tool for the two things that must happen before confirmatory verifier execution:
The implementation is in experiments/s3_verifier_freeze.py.
It does not execute SWE-bench patches, call an LLM, generate verifier verdicts, validate #804, or update the paper with a result.
The power-plan command accepts JSONL with exactly one record per (repository_id, task_id, class_label) task/class statistic. Example:
{"stage":"calibration","repository_id":"django","task_id":"django__django-123","class_label":"official-pass","delta_logscore":0.041}
{"stage":"calibration","repository_id":"django","task_id":"django__django-123","class_label":"official-fail","delta_logscore":-0.018}
Required fields are exact:
The power tool does not accept patch-level multiplicity as independent task evidence. Duplicate/task/provenance handling happens upstream under the v1.1 amendment before these task-level calibration statistics are written.
The canonical design constants are code-level defaults:
| parameter | frozen value |
|---|---|
| smallest effect of interest | log(1.10) nats/item |
| target power | 0.90 |
| simulated cohorts | 10,000 |
| final confirmatory bootstrap replicates per clustering level | 10,000 (recorded, not nested inside power simulation) |
| seed | 20261011 |
| task-count ladder | 50, 75, 100, 150, 200, 300, 500, then full eligible universe |
Example command:
python experiments/s3_verifier_freeze.py power-plan \
.cache/s3/calibration-task-logscore.jsonl \
--eligible-task-count 500 \
--eligible-repository-count 12 \
--eligible-pass-items 210 \
--eligible-fail-items 430 \
--out .cache/s3/power_plan.json
The tool:
This cluster-t calculation is a power-planning approximation registered in the v1.2 amendment. The final confirmatory result still uses the stricter 10,000-resample percentile bootstrap at both clustering levels.
Smaller simulation counts are allowed for code development, but their output is marked canonical=false and cannot satisfy the S3 freeze gate. The final confirmatory bootstrap count is not a development knob in this tool.
Expected scientific outcomes are explicit:
No threshold is relaxed to obtain a favorable status.
After a canonical power_plan.json exists, prepare a strict input object using schema idkmesh.s3-freeze-input.v1. The manifest builder parses the bound power plan again and refuses it unless canonical=true, its self digest is valid, and its frozen seed, effect size, simulation count, cluster-t planning method, final confirmatory bootstrap count, and target power still match the current pre-outcome amendments.
The manifest builder accepts only named pre-confirmatory artifact roles:
An X7 freeze requires prompt_bundle plus metadata for at least three base-model lineages. A model marked as benchmark-specifically fine-tuned is rejected from the primary independent-family freeze.
The bound calibration_statistics file must hash to the calibration_sha256 recorded inside the canonical power plan; a mismatch fails closed. The freeze input also records the pinned repository commit, upstream benchmark commit and artifact digests, bootstrap/permutation/stage-assignment seeds, execution boundary, model/checkpoint metadata, contamination status, and an optional container image digest.
Build and validate:
python experiments/s3_verifier_freeze.py freeze-manifest \
.cache/s3/freeze-input.json \
--root . \
--out .cache/s3/freeze-manifest.json
python experiments/s3_verifier_freeze.py validate \
.cache/s3/freeze-manifest.json
Output files are never overwritten. Every bound file records its byte size and SHA-256 digest. The manifest itself has a self_sha256 over canonical JSON with that field omitted, so the freeze can be checked without timestamps or network access.
This tool is deliberately incapable of satisfying #804.
X6 remains blocked on the hostile-code sandbox. X7 can freeze text-only judge inputs without executing patches, but local recomputation of official labels inherits the same #804 boundary.
This closes the mechanical pre-outcome freeze gap identified in #1023:
It does not close Paper A’s external-validity gap. That requires the retained X6 and independent-family X7/X10 evidence defined by the preregistration.