Group 3 was unimplemented, so there was no way to turn the draft into a frozen pool. Add: - bisect_guard.py: stages the cache draft and bisects it against the reserved-repository guard, run as a black box (pytest -k referenced, stdout/stderr discarded, exit code only; an exit other than 0/1 aborts as an instrument failure). Drops guard-tripping candidates and reports the dropped COUNT only -- never a name or URL. Guard runner is injectable for offline tests. - freeze.py: writes canonical pool-p1.toml (+ private counterpart, reusing draft's public/private split and private_digest) and freeze-p1.json (used-set digest, per-source counts, guard result, dropped count, label-check counts, freeze digest = sha256 of the canonical public manifest). A matching retry is a no-op; any changed frozen artifact requires a new pool id (never an overwrite). - protocol-p1.md: the frozen scoring/statistics protocol from design sections 3 and 4. Offline only; the guard subprocess is the sole subprocess and is mocked in tests. 42 new tests pass (incl the group-1.3 guard digest check on a fixture pool); neighbouring unseen suites green; ruff clean. New files only -- does not touch the journal-pinned draft/extract modules, so a running draw is unaffected. Co-Authored-By: Claude Opus 4.8 <[email protected]>
28 KiB
Implementation Plan
One task group per increment of design.md section 8, in that order. A group starts only after the previous
group's exit is recorded. Maintainer decisions of 2026-10-04 are folded in: a registered long-deadline arm
(--deadline 300) beside the hook's default 30 s (design 4.0, group 8); adoption needs no significant regression
on the unseen slice (Req 5.4 as amended, design 7.3, tasks 6.4 and 8.2); only permissively licensed repositories
are published by name, everything else goes to the gitignored private manifest under a digest (Req 1.4, design
1.4); concurrency stays at two AX lanes plus the VM lane (design 5.3).
Execution rules:
-
Who does what. Codex implements every coding task offline: no network, no model, no store, no cluster. The coordinator runs every networked step (GitHub and OSV API calls, git fetches and clones, the S3 store, image pushes, kind and kube-ax). Those tasks are marked (coordinator, network). Steps that need the coordinator but no network (agent label reads, adjudication, the v3 guard bisection, commits) are marked (coordinator). Steps that spend model money are marked paid: needs a budget go-ahead. Each starts only after the maintainer confirms a ceiling against the provider balance read just before it.
-
Done means. A coding task is done when its tests pass in the host suite,
ruff check,ruff format --checkandmypyare clean, and the reserved-repository guard is green. No test makes a network, model or cluster call. -
Names stay in the pool directory. Pool repository names and URLs appear only under
benchmarks/unseen/(copyleft and other non-permissive ones only under the gitignoredbenchmarks/unseen/private/). Raw per-change records live in~/ousast-results/unseen/and the store, never in the repository. -
Population v3 is never opened. It is checked only through the guard test, run as a black box with its output discarded.
-
Every group ends with a measured exit and a record at
benchmarks/measurements/<date>-unseen-NN-<slug>/record.json: commit, image digests where used, the instrument checks (bytes read, JVM time, exit codes), counts and digests. No repository names. The guard sweeps these records. -
Instrument first (AGENTS.md). A zero, an empty draft or a fast run is treated as an instrument failure until bytes read and wall time prove otherwise.
-
1. Used set and guard (design 1.2, 6; increment 1)
-
1.1 Used-set builder
benchmarks/unseen/eligibility.py: normalises names (lower case, no.git, no trailing slash) and builds the used set from every source of design table 1.2: pair catalogs, recipes and datasets underbenchmarks/pairs/plus the local pointer-pair manifests asbenchmarks/pairs/catalog_gen.pyreads them;population-v1.tomlandpopulation-v2.toml; the advisory-fix batch catalogs; memoryexamplerows (repofield) through an injectedMemoryStore(FileStorelocally, the S3 store when the coordinator passes one); experiment units underplane/experiments/;benchmarks/measurements/andbenchmarks/experiments/; a text sweep forgithub.com/<owner>/<name>overbenchmarks/,src/,tests/,plane/and.kiro/. It never reads population v3 and never prints a name. Output: counts per source and the sha256 of the sorted set.tests/test_unseen_eligibility.py: a synthetic tree with one repository per source, each found; case,.gitand trailing-slash variants collapse; stdout and the output JSON contain no name; a v3-shaped file planted in the synthetic tree is not opened (open is patched to fail on it).- Requirements: 1.1
-
1.2 Canonical resolution, renames and forks
eligibility.py:resolve(candidate, api)with an injected GitHub client returns the canonicalfull_name, former names (redirects) and the fork network (parent,source). A candidate is ineligible when any of them is in the used set; one candidate per fork network is kept.- Tests with a fake client: a planted used repository, a renamed one and a fork of a used one are each rejected; two forks of one network keep one; the rejection reason is a source label, not a name.
- Requirements: 1.1
-
1.3 Guard extended to pools
tests/test_independent_population.py: the sweep becomes a list of (reservation directory, names):benchmarks/independent/for populations,benchmarks/unseen/for pools (public manifests, plusbenchmarks/unseen/private/*.tomlwhen present). The sweep also coversplane/. New tests: pool and population names are disjoint (failure prints a count only); a frozen pool's manifest digest equals itsfreeze-pN.json(skipped while no pool is frozen). The existing v3 handling is unchanged.- Each reservation is exempt only inside its own directory: population names (v3 included) are still swept in
benchmarks/unseen/, the gitignoredprivate/files included. Task 3.1 depends on this. .gitignore:benchmarks/unseen/private/.- Evidence: the guard is green with an empty
benchmarks/unseen/, and red when a test fixture names a pool repository inbenchmarks/measurements/(shown once in the record). - Requirements: 1.2, 1.3, 1.4
-
1.4 Usage ledger
benchmarks/unseen/ledger.py: append-onlyusage-pN.jsonl, one row per use (slice, decision or experiment id, purposebaseline | exploratory | informed | qualifies, date, result digest, freeze digest). It refuses aqualifiesrow for a change whose slice already has aninformedrow for it, and refuses to rewrite rows.tests/test_unseen_ledger.py: append, the refusal, a rewritten row detected by a digest chain.- Requirements: 5.2
-
1.5 Used-set measurement and record 01 (coordinator, network)
- Run
eligibility.pyagainst the real sources, the S3 memory store included (read only). - Instrument: each source reports files read and bytes; a source with zero rows fails the run unless it is known empty.
benchmarks/measurements/<date>-unseen-01-used-set/record.json: counts per source, used-set digest, guard result (green on the empty pool), test counts of 1.1-1.4.- Requirements: 1.1, 1.3
- Run
-
2. Sourcing and extraction (design 1.1, 1.3, 1.4, 2, 3; increment 2)
-
2.1 Advisory candidates and repository filters
benchmarks/unseen/source.py: from GHSA advisory JSON (pip, npm, maven, composer; published 2019 or later) keep those whose CWE maps to a family throughsrc/openultrasast/model/taxonomy.pyand that link one fix commit with one parent in one repository; attach the OSV first affected version; flagpost_cutoffwhen published after 2026-06-01. Repository filters: anonymous HTTPS, at most 500 MB, licence at the pinned head (LICENSE file, then the API's SPDX id) classedpermissive(the design 1.4 list) orprivate.tests/test_unseen_source.pyon recorded fixture JSON (no network): CWE mapping, multi-parent and multi-repository fixes dropped, cutoff flag, licence classing (GPL, AGPL, LGPL, none and source-available go private).- Requirements: 1.4, 2.1
-
2.2 Vulnerability-introducing range
benchmarks/unseen/extract.py: theintroducingmethod of design 2.1 (blame of the sink line, or the declaration for an absence bug; absence at V's first parent; no merge or root; at most 50 files and 2,000 lines; OSV version bracket when present; walk-back of at most five steps) and thelast_touchfallback. Each change records method, family, vulnerable function resolved in head, head-side lines,post_cutoff, advisory id. Git only; no scanner or engine.tests/test_unseen_extract.pyon a synthetic repository built in a temp dir: accepted V; a reformat walked back; a merge rejected; size cap; bracket rejection; fallback chosen when no V passes.- Requirements: 2.1
-
2.3 Ordinary-commit draw
extract.py: first-parent, non-merge commits touching an analysed language; the exclusions of design 2.2 (security words of the narrow pattern, reverts, bot and bump commits, manifest- or lock-only, generated or vendored, advisory fix commits, commits touching a known vulnerable function, more than 1,000 source lines, counted). Seeded draw of 12 per repository over three time thirds by four size buckets, proportional, at least one per third; a repository with fewer than 40 eligible commits is dropped.- Tests: each exclusion; the narrow pattern keeps "query", "token", "session"; allocation and the seed reproduce the same draw; the 40-commit floor.
- Requirements: 2.2, 2.3
-
2.4 Draft manifest and slices
benchmarks/unseen/draft.py: writesbenchmarks/unseen/draft-p1.toml(permissive entries by name) andbenchmarks/unseen/private/draft-p1.toml(the rest); the public file holds an opaque id and sha256(URL, commits) per private entry. Seeded shuffle into three slices of 100 repositories, stratified by ecosystem andpost_cutoff; each repository has one introducing change and 12 ordinary changes.- Tests: the digest covers private entries; no private URL in the public file; the same seed gives the same slices; per-slice strata within one repository of proportional.
- Requirements: 1.2, 1.4, 2.3, 5.2
-
2.5 Sourcing run (coordinator, network)
gh api /advisoriesenumeration, OSV lookups, canonical resolution against the used set (1.2), blobless clones into a scratch cache, extraction (2.2, 2.3), draft (2.4).- Instrument: clones counted with bytes on disk; a repository whose clone reads zero source files is an instrument failure, not a drop. Fewer than 300 eligible repositories stops the run with counts; the eligibility bars are not relaxed to fill it.
- Observable: a draft of 300 repositories (3,900 changes) on disk.
- Requirements: 1.1, 1.4, 2.1, 2.2, 2.3
-
2.6 Label check and record 02 (coordinator)
- Every third
introducingchange read by an agent, no model call, markedconfirmed | refactor | unclearin the draft. benchmarks/measurements/<date>-unseen-02-draft/record.json: candidates per ecosystem, rejections per used source, licence split (public, private), method counts, post-cutoff counts, confirmed share, ordinary-commit exclusion counts. No names.- Requirements: 2.1, 2.2
- Every third
-
3. Freeze p1 (design 1.2, 6; increment 3)
-
3.1 Guard bisection tool
benchmarks/unseen/bisect_guard.py: rewrites the draft with a candidate subset, runs.venv/bin/pytest -q -p no:cacheprovider tests/test_independent_population.py -k referencedwith stdout and stderr discarded, reads only the exit code, and bisects until green. Reports the dropped count only.tests/test_unseen_bisect.pywith an injected fake guard (a hidden set): finds and drops exactly the hidden members; never logs a candidate; an exit code other than 0 or 1 aborts (instrument failure).- Requirements: 1.1
-
3.2 Freeze writer
benchmarks/unseen/freeze.py: canonicalpool-p1.toml(and the private counterpart) from the bisected draft;freeze-p1.jsonwith used-set digest and per-source counts, guard result, dropped count, label-check counts and the freeze digest (sha256 of the canonical manifest). Refuses to write over a frozen pool; a correction isp2.- Tests: digest stable under key order; overwrite refused; the guard's digest test (1.3) passes on a fixture pool.
- Requirements: 1.2
-
3.3 Protocol p1
benchmarks/unseen/protocol-p1.md: the scoring rules of design section 4 (default flags, decision 4.0's long-deadline arm, catch and location rules, false alarm, coverage states), the statistics of section 3 and 7, and the adoption gate of 7.3, stated before any replay.- Observable: the file exists and its sha256 is listed in
freeze-p1.json. - Requirements: 3.1, 3.2, 3.3, 3.4, 5.4
-
3.4 Freeze run and record 03 (coordinator)
- Run the bisection (3.1), then the freeze (3.2). Guard green, digest test active.
benchmarks/measurements/<date>-unseen-03-freeze/record.json: freeze digest, protocol digest, dropped count, final counts per slice and kind.- Requirements: 1.1, 1.2, 1.3
-
4. Dispatcher (design 5.3; increment 4)
-
4.1 Items, workloads and the AX lane
benchmarks/ax/batch.py:Item(id, input objects, result object name, command, extra env, input digest),Workload(image digest, allowed URL env names, deadline, result validator) and theaxlane, moved frombenchmarks/learn/engine_trace_ax.py: manifest render, egress readiness, presigned GET and PUT as.dat, apply, poll result object and AX phase, delete, object cleanup. Thekindlane is the same lane with the kind context.tests/test_ax_batch.pywith a fakeaxCLI and a fake store: manifest holds only the allowed URL env names and no credential; names carry theousast-engine-prefix; cleanup on success and failure.- Requirements: 4.1, 4.2, 4.5
-
4.2 Scheduler, fallback and resume
batch.py: two AX lanes and one VMdockerlane by default (one container at a time); sandbox death retried once under a new name, a second death or a JVM OOM goes to the VM fallback queue ahead of overflow;progress.jsonwritten by the scheduler only; aSTOPfile halts launches; resume skips items whose stored record has the same input digest; a cleanup failure stops dispatching.- Tests with fake lanes: retry then fallback; OOM straight to fallback; resume skips;
STOP; cleanup failure halts; never more than two AX tasks in flight. - Requirements: 4.3
-
4.3 Engine pass on the dispatcher
benchmarks/learn/engine_trace_ax.pyandengine_trace.run_planbecome an engineWorkloadoverbatch.py; no behaviour change.- Observable:
tests/test_ax_executor.pyandtests/test_engine_trace.pypass with their assertions unchanged (moved imports only). - Requirements: 4.3
-
4.4 Engine smoke on kube-ax and record 04 (coordinator, network)
- Two pins through the new dispatcher on kube-ax, compared with their stored records.
benchmarks/measurements/<date>-unseen-04-dispatcher/record.json: image digest, per-pin wall time and JVM time, record digests equal to the stored ones (or the diff counted), cleanup result.- Requirements: 4.3
-
5. Replay task (design 5.1, 5.2; increment 5)
-
5.1 Image stage
plane/Dockerfile.engine-task: second stageFROM engine AS replayaddinggit, the package with its runtime dependencies andbenchmarks/unseen/replay_entry.py; smokeousast pre-push --help. The root image staysghcr.io/norandom/ax-task-runner:v0.3.1; the engine stage is unchanged.tests/test_unseen_image.py: parses the Dockerfile; thereplaystage builds fromengine; the root image pin; the engine stage's text is byte-identical to before.- Requirements: 4.1
-
5.2 Task entry
benchmarks/unseen/replay_entry.py, standard library only, reusingengine_task_entry.transfer: GET the spec;git initand depth-1 fetches of head and base over HTTPS (180 s bound), verified withgit cat-file -e; runousast pre-pushwith the spec's hook flags (defaults, or--deadline 300for the long-deadline arm), heap 1700 MB and the cluster JVM flags; packpush.json,push.txt,engine.json,instrument.json(files and bytes in the checkout, bytes of each changed file, JVM wall time, hook exit code, step timings, image digest); PUT as.dat. Any error PUTs a failure record naming the step and status, never URL text.tests/test_unseen_replay_entry.py: a local bare repository and a localhost presign stub; success record fields; a missing commit, a failed fetch and a hook crash each give a failure record; zero bytes read and a replay faster than JVM start are flaggedsuspect_fast.- Requirements: 3.1, 4.1, 4.2
-
5.3 Replay workload
benchmarks/unseen/replay.py: buildsItems from a frozen slice and an arm (defaultorlong_deadline); the spec object carries the repository URL so names stay out of AX status and telemetry; task namesousast-engine-replay-<slug>-<digest>with an opaque slug; the validator rejects a record withoutinstrument.json; records go to~/ousast-results/unseen/<pool>/<slice>/<arm>/and the store.- Tests: no repository name in any task name or manifest; only the two presigned URLs in the env; input
digest changes with the arm's flags;
instrument_failureitems queued for one re-run. - Requirements: 3.1, 4.1, 4.2, 4.3
-
5.4 Proof on kind, then kube-ax, and record 05 (coordinator, network)
- Build and push the
replaytarget, pinned by digest. Five changes from this repository's own history (never pool changes) on kind, then the same five on kube-ax, then on the VM lane. - Exit: instrument fields show bytes read and realistic JVM time on every lane; quick-tier findings equal across lanes.
benchmarks/measurements/<date>-unseen-05-replay-task/record.json: image digest, per-lane timings, bytes, exit codes, the quick-tier comparison.- Requirements: 4.1, 4.2, 4.5
- Build and push the
-
6. Scorer (design 3, 4, 7.1, 7.3; increment 6)
-
6.1 Coverage states
benchmarks/unseen/score.py: each record gets one state (instrument_failure,unanalysable,quick_only,engine_covered) frominstrument.jsonand the artifact;suspect_fastgoes to failure; a slice above 5%instrument_failureafter re-runs is refused.tests/test_unseen_score.pyon synthetic records: every state; the refusal; a failure never counts as quiet or missed.- Requirements: 3.3
-
6.2 Catch and false-alarm rules
score.py: family match (engine family, quick-rule CWE throughtaxonomy.py), the location table of design 4.1, all three streams with the stream named per catch; false alarm on any finding of any stream; the alerts-only rate.- Tests: right family wrong place misses;
access_controlon the handler;config_secretsfile scope; a quick-rule-only catch; one advisory finding on an ordinary change is a false alarm. - Requirements: 3.2
-
6.3 Rates, intervals and breakdowns
score.py: Wilson 95% intervals; repository-cluster bootstrap for false alarms; ICC; breakdowns per family, method,post_cutoff, stream, coverage state and the confirmed subset.- Tests: the n values of design section 3 (315, 483, 756, 62, 88, 97) reproduced; bootstrap seeded; ICC on a synthetic clustered set.
- Requirements: 2.3, 3.3
-
6.4 Budgets, paired tests, the gate and record 06
score.py: per-budget thresholds (1%, 5%, 10%), labelledexploratoryin-slice andfixedwhen supplied; a binary arm's single operating point with the budgets it meets; exact two-sided McNemar for catch and for false alarm;gate(A, B)returningpass | regression | not_runper design 7.3.- Tests: thresholds on a synthetic score set; McNemar exact values; a binary arm with a significant
false-alarm increase gives
regression; missing slice or excess failures givenot_run. benchmarks/measurements/<date>-unseen-06-scorer/record.json: test counts and the digest of the scorer's output on the committed synthetic fixture.- Requirements: 3.4, 5.4
-
7. Baseline (design 4, 6; increment 7; G0 exit)
-
7.1 Frozen source and dry run (coordinator, network)
- Export HEAD to a frozen tree; build and push the
replayimage from it, pinned by digest. benchmarks/push/python_overhead.pyrun with the stub engine to size per-replay Python cost; dispatcher dry run on slice 1 lists 1,300 items without launching.- Requirements: 5.1, 4.1
- Export HEAD to a frozen tree; build and push the
-
7.2 Baseline replay of slice 1 (coordinator, network)
- Default arm, 1,300 replays over two AX lanes and the VM lane (about 9 hours);
instrument_failureitems re-run once; the run stops for a cause above 5% failures. - Observable: 1,300 records in
~/ousast-results/unseen/p1/1/default/and the store, each withinstrument.json. - Requirements: 3.1, 4.3, 5.1
- Default arm, 1,300 replays over two AX lanes and the VM lane (about 9 hours);
-
7.3 Adjudication (coordinator)
- Flagged ordinary changes adjudicated against protocol-v2's standard (all if 30 or fewer, else every third); the adjudicated share kept beside the false-alarm rate. ICC measured; above 0.05 noted as "next pool sizes up".
- Requirements: 3.2, 2.3
-
7.4 Record 07 and the ledger (coordinator)
benchmarks/measurements/<date>-unseen-07-baseline/record.json:score.pyoutput (counts, rates, Wilson and bootstrap intervals, coverage per state, per family, method, stream), freeze digest, image digest, commit.usage-p1.jsonlrowbaseline.- Observable: guard green over the record; G0's exit met.
- Requirements: 5.1, 5.2, 3.3
-
8. Arms on slice 1 (design 4.0, 5.4, 7.1-7.3; increment 8; G1)
-
8.1 Registered long-deadline arm
plane/experiments/manifest for the long-deadline arm: hook flags with--deadline 300, budget 0,unseen: {pool: p1, slice: 1}, committed before its first replay.src/openultrasast/learn/experiments.pyacceptsunseenand a hook-flag arm.tests/test_learn_experiments.py: the manifest loads; anunseenblock without pool or slice is refused.- Requirements: 3.4, 5.3
-
8.2
unseenblock and adoption gate inanalyseexperiments.pyanalyse: writesunseenintoresult.json(catch at each budget per arm, paired B - A, McNemar,gate) fromscore.py; checks the usage ledger; adoption requires the fold rule andgate == pass.- Tests:
regressionandnot_runeach block adoption; aninformedslice cannot qualify; result JSON shape. - Requirements: 5.2, 5.3, 5.4
-
8.3 Engine-evidence arm
benchmarks/unseen/arms.py: a score per change fromengine.json(witness rows on head-side changed functions), no model; plugs into the budget thresholds of 6.4.- Tests on synthetic records: score monotone in witness strength; a change without engine coverage gets no score and is reported, not counted quiet.
- Requirements: 3.4
-
8.4 Model-arm adapter
arms.py: candidates from head-side changed functions of stored records, scored by the current decision engine program (and the combiner when its program exists; else its row readsnot_built); change score is the maximum; metered client, dry run first, response cache, the manifest'sbudget_usdas the hard ceiling.- Tests with a scripted client: dry-run estimate, ceiling stop, cache replay; no model call.
- Requirements: 4.4, 3.4
-
8.5 Long-deadline replay of slice 1 (coordinator, network)
- 1,300 replays of the
long_deadlinearm, bounded at about 345 s each (up to about 42 hours over three lanes), withSTOPand resume across sessions; failures re-run once. - Observable: 1,300 records under
~/ousast-results/unseen/p1/1/long_deadline/, JVM time in each. - Requirements: 3.1, 3.4, 4.3
- 1,300 replays of the
-
8.6 Model arms on slice 1 (coordinator, network; paid: needs a budget go-ahead)
- Dry run gives the candidate count; estimate at the injection slice's measured cost (about $0.008 per candidate at k = 5); the maintainer sets the ceiling against the balance read just before. Then the decision engine arm (and the combiner if built) on the VM.
- Requirements: 4.4, 3.4
-
8.7 Record 08: the arms table (coordinator)
benchmarks/measurements/<date>-unseen-08-arms/record.json: per arm (hook 30 s, hook 300 s, engine evidence, decision engine, combiner ornot_built) catch at 1/5/10% budgets with Wilson intervals and realised false-alarm rates, coverage per state, spend;exploratoryrows inusage-p1.jsonl.- Observable: one committed table of arms on slice 1; G1's table exists.
- Requirements: 3.4, 5.2, 5.3
Implementation Notes
- 2026-10-04: Tasks 1.1–1.4 implemented offline and independently reviewed. Task 1.5 remains for the
coordinator; no networked measurement or commit was performed. Command and API contracts:
benchmarks/unseen/README.md. Offline evidence:benchmarks/measurements/2026-10-04-unseen-01-offline/record.json. - Population guard scope is preserved under the maintainer's hard rule: benchmarks/src/tests for populations, plus plane for pools. Each directory exemption is reservation-specific, including private pool manifests. Extending population scope to plane exposed 30 existing references; no historical records were changed or exempted inside the existing population scope.
- S3 inventory opens through
open_store(read_only=True)because ordinary store construction writes a Select capability probe. Default store behavior is unchanged; inventory uses LIST/GET only. - The freeze writer must match the canonical TOML digest encoding documented in the pool README and
exercised by
test_independent_population.py; final pool discovery does not trust mutable status.
Group 2 implementation evidence (2026-10-04)
Tasks 2.1–2.4 are implemented offline and independently reviewed. Task 2.5 is
python -m benchmarks.unseen.draft --root "$PWD" --s3-store s3:// --seed 20260601
with the documented PATH/PYTHONPATH and GH_TOKEN environment. No networked draw,
label check, group-2 measurement record, guard bisection, or commit was performed.
The group header remains pending its coordinator exits 2.5/2.6.
The command rebuilds the group-1 used set, resolves renamed/fork repositories, uses disposable external blobless clones, re-reads licences at extracted heads, and emits counts/digests only. The README documents injected clients, method bias, the hard 300-repository floor, and an explicitly unmeasured resource estimate. Independent review caught and fixed ambiguous parent-function absence and stale candidate-404 handling; regression tests cover both.
Validation: requested pytest selection 103 passed, 1 skipped, exit 0 (population-test
output discarded); ruff check . exit 0; ruff format --check . exit 0 (411 files);
mypy src/openultrasast exit 0 (160 source files). The CLI --help smoke exited 0.
Source-read instrumentation printed 20,101 bytes for the extraction implementation.
Groups 4–6 offline implementation (2026-10-04)
Tasks 4.1–4.3, 5.1–5.3 and 6.1–6.4 are implemented and independently reviewed. Tasks 4.4 and 5.4 remain coordinator-owned network proofs; group headers 4 and 5 stay pending those exits. No commit, network request, Docker, AX or kubectl command was run. The sourcing job's draft.py, source.py, extract.py and journal.py are unchanged.
The shared dispatcher retains the engine adapter's historical questions.json object name to preserve its unchanged assertions; replay uses spec.dat and result.dat. The engine Dockerfile body is unchanged except its required AS engine alias; CI builds engine and replay separately. S3Store's read_only class default preserves existing constructor-bypassing transport fixtures; initialized read-only stores still refuse writes.
Exact coordinator commands and input contracts are in benchmarks/unseen/README.md, including frozen TOML/private pointer verification, scoring joins, own-history proof preparation and anonymous measurement-record generation. JVM wall time is the hook's aggregate scan build/query timing and is labelled as such. Unsupported-only partitions with explicit language_not_covered evidence do not pretend to have launched a JVM.
Record 06 contains the committed synthetic fixture and scorer-output digests. The reserved-repository guard was run as a black box with both output streams discarded. Independent review: APPROVED; all reported integration and coverage defects resolved.
Final verification: requested pytest command 279 passed, 8 skipped, exit 0; separate
tests/test_ax_batch.py 5 passed, exit 0; ruff check ., ruff format --check .,
mypy src/openultrasast, and the output-discarded reserved-repository guard all exit 0.
The own-history proof preparer and replay dry run read five items and exit 0.