Skip to content

LibSSH: original CI data to variant-aware Parquet and native replay

Use a pinned public historical LibSSH slice to exercise Whole Test Set (WTS) and Variant Test Set (VTS) evaluation. Preserve pipeline/job identity, inspect sparse configurations, compare their native result denominators and resume both strategies through COLEMAN's existing runner and checkpoints.

The published 4.13 wheel includes this workflow. Install it outside the repository and supply the two reviewed original files below. Source integrity and a successful replay do not establish scientific admission or a winning policy.

Install the published wheel outside the repository

With Python 3.14+ and uv available:

uv venv /tmp/coleman-hcs-env --python 3.14
uv pip install --python /tmp/coleman-hcs-env/bin/python "https://github.com/jacksonpradolima/coleman/releases/download/v4.13.0/coleman-4.13.0-py3-none-any.whl#sha256=bbe2f3cf8954fc27fc8f5a44e3713519aa30bcf2cfdd2aad140f4bcc1ae45abc"
mkdir -p /tmp/coleman-hcs-downloads
cd /tmp/coleman-hcs-downloads

Keep source files, cache and outputs outside Git. No Docker, compiler, MCP, benchmark subject execution or upstream extractor installation is required.

Download the two reviewed original files

The source is Prado Lima, Jackson (2021), LIBSSH Mirror – Testing Results (GitLab CI) – Version 2, Harvard Dataverse, version 2.0, doi:10.7910/DVN/I1XAVR. The released metadata explicitly dedicates these unrestricted data to CC0-1.0. The package records the metadata digest, review date, source/file version, exact byte counts and SHA-256 pins. No third-party data or implementation is bundled with COLEMAN. Data permission does not grant permission to copy or execute upstream code.

curl --fail --location --user-agent 'COLEMAN/corpus-integrity-v1' \
  'https://dataverse.harvard.edu/api/access/datafile/4378418?format=original' \
  --output executions.csv
curl --fail --location --user-agent 'COLEMAN/corpus-integrity-v1' \
  'https://dataverse.harvard.edu/api/access/datafile/4378387?format=original' \
  --output jobs.json
Role Original bytes SHA-256
Parsed execution CSV 32,898,759 ba50a92a4571fec2b520f1155f1f8a8377236d44d95f3d6c683726bd9a2968c6
Original job JSON 33,004,397 19b8652f902c20706fb32b7e9bcf3cb4859c701b6a900cd3954152c563454cd0

The CLI verifies both hashes and sizes before conversion. Dataverse's default ingested TAB is different from the original semicolon CSV: format=original is required. The publisher's TAB MD5 is not a checksum of the original CSV. The original JSON's published MD5 was independently verified. The CSV SHA-256 and byte count are explicit reproducibility pins, not a claimed publisher SHA.

Convert, execute both strategies and resume

/tmp/coleman-hcs-env/bin/python -m coleman.transports.hcs_etl \
  --executions executions.csv --jobs jobs.json \
  --cache /tmp/coleman-hcs-cache --output /tmp/coleman-hcs-output --run

# Identical offline retry: reuse verified sources and existing native checkpoints.
/tmp/coleman-hcs-env/bin/python -m coleman.transports.hcs_etl \
  --cache /tmp/coleman-hcs-cache --output /tmp/coleman-hcs-output --run

Use --strategy wts or --strategy vts to execute only that strategy. Without --run, the command exports and verifies Parquet only. --recipe path.json accepts a compatible bounded typed source recipe; no URL is opened implicitly. Native logs go to stderr and stdout contains one JSON summary with completion, accounting, variant aliases and native artifact/run paths. Raw data stay in the content-addressed source cache.

V1 accepts two raw files of at most 64 MiB each, 500,000 parsed CSV records, 16,000 selected records, 16,384 job records, sixteen pipelines, 64 observed variant names and 1,000 tests per native suite. CSV counters/positions refer to parsed records after the header. Recipe files have a 2 MiB wire read limit and a 1 MiB canonical metadata limit, reserving space for bounded completion receipts. Oversized metadata rejects before acquisition or cache/output creation.

The frozen first-sixteen-pipeline slice has these descriptive counts:

Evidence Count
Complete source CSV rows 278,950
Selected physical rows 885
Rows outside the slice, retained in original cached bytes 278,065
Other-attempt rows explicitly excluded 29
Retained native variant test executions 856
Surrogate union test rows 320
Labels with parsed CSV observations 7
All selected job labels, including metadata-only 13
Metadata-only labels without parsed observations 6
Declared pipeline × known-job-label cells 208
Cells with retained parsed tests 44
WTS result rows, including union and per-variant results 240
VTS result rows 176

The two policies are Random and UCB/RNFail, at ratio budgets 0.5 and 1.0 with seed 42. These are functional reproduction counts, not independent observations or evidence of policy superiority. The complete raw file has 44 observed variant names, including all-pass variants. The publisher summary's 34 variants that failed at least once are not the full universe; this bounded preset does not claim to exercise all 44.

The six metadata-only labels are CentOS7/libgcrypt, CentOS7/libgcrypt/x86-64, Fedora/openssl 1.0.x/x86, Fedora/openssl 1.1.x/x86, FreeBSD/x86-64 and static-analysis. They remain visible with metadata job counts and absent parsed evidence across all declared pipelines. A known job label is not automatically an observed test configuration: no test semantics are inferred for static-analysis. Their native VTS tables are empty and they create no native executions. Missing reported nonpass counts remain null. An independent raw-source reference checks all 208 cells, including these uncovered rows, rather than only the active subset.

Contract, identities and explicit costs

The execution reader joins each original (pipeline_id, job_id, test_name) to its job's pipeline, commit and untouched variant label. A pipeline cannot have contradictory commit bindings. Numeric pipeline order defines modeled rounds, not verified chronological outcome availability. Repeated commits remain different pipelines; shared variants, labels, trials and the earlier overlapping LibSSH dataset are not independent projects or faults.

Variant aliases are portable digests with an explicit reverse mapping in the receipt. linux.x and linux_x, case differences, slashes and original Unicode names are preserved as distinct identities. No configuration feature or true rename relationship is inferred from punctuation.

Identical repeated content at a source execution key gets an explicit duplicate disposition; conflicting content rejects. For multiple parsed completed jobs with one variant/pipeline, select the lowest job ID, independently of outcome or duration, and retain the other rows as exclusions. Unsupported job status, unavailable outcome and unavailable duration have separate primary dispositions. Every physical row is conserved; an excluded attempt is not silently max-merged.

The new recipe requires the cost model additive-binary32-rounded-reported-test-seconds-v1. Original decimal seconds and their spelling remain in observations.parquet; native projected seconds and their meaning are separate columns. The existing bandit stores float32 duration. Explicitly rounding all new native inputs to that precision before deriving budgets aligns the loader, bandit and variant evaluator; the projected values are carried exactly in binary64 Parquet columns. This changes neither legacy inputs nor the existing bandit schema. It models test costs; it does not measure CI occupancy or promise exact decimal arithmetic at arbitrary scales. V1 also requires each projected suite's total coefficient on its finest binary cost lattice to fit 53 bits. Then all nonnegative partial sums are representable in binary64 regardless of ranking order. Unsupported dynamic ranges reject before export completion; no tolerance silently omits or promotes a boundary test.

WTS learns on one declared surrogate per pipeline: maximum projected duration and any reported nonpass for each shared test label. Its ranking projects onto each actual variant suite. VTS uses separate policy state for each variant. Per-variant budgets and outcome denominators use that variant's own tests. Native result step counts processed scenarios. Resolve its source pipeline via the sorted active BuildId values of the corresponding union or variant input, then the receipt/cell mapping. Fully excluded rounds retain their original modeled IDs in analytical evidence; they do not consume a native processed step. The union is not another set of observed executions and its time is not the sum of all variant work. Native RNFail is budget-censored: zero nondetection reward for an unscheduled case is not an observed pass.

Observed zero duration remains zero. Empty source duration/outcome stays null and is excluded from native input; negative/nonfinite time and unsupported units reject. Upstream extraction interprets reported time as seconds, collapses all nonpass statuses into binary one and omits whole jobs with zero total test time. Its linked historical parser is methodology evidence, not a verified historical producer revision. The native legacy result columns detected and missed therefore count this source's reported nonpass test executions, including potentially timeout/skipped/not-run/exception states already collapsed upstream. They cannot be interpreted as unique faults or independently verified failures.

cells.parquet preserves absent and fully excluded cells. A missing parsed cell does not become a passing test, verified missing configuration, zero setup cost or completed run. Job start/finish labels remain source metadata; neither proves when the prioritizer received a label or feature. Setup seconds, shared runner occupancy, outcome/feature availability and upstream exclusion counts remain unavailable. Use the existing resource ledger/replay for separately supported observations; do not add dummy setup tests or equate summed test seconds with physical work saved. Protected temporal admission is blocked.

Files, compatibility and interrupted execution

flowchart LR
    CSV[Original execution CSV] --> Cache[Existing verified external cache]
    JSON[Original job JSON] --> Cache
    Cache --> Join[Typed pipeline/job/commit join]
    Join --> Evidence[Selected observations and conserved exclusions]
    Join --> Cells[Complete sparse cell matrix]
    Join --> Native[Explicit projected test seconds]
    Native --> WTS[Union and variant Parquet]
    Native --> VTS[Per-variant Parquet]
    WTS --> Runner[Existing RunSpec/API and native runner]
    VTS --> Runner
    Runner --> Pair[Verify persisted result/checkpoint pairing]
    Pair --> Recovery[Reconcile uncommitted Parquet tail on resume]
    Recovery --> Runner
    Runner --> Results[Per-policy/budget/variant results and checkpoints]

Export identity binds the full recipe, actual converter/storage code and Polars writer version. Fixed-profile Parquet and a canonical versioned receipt permit deterministic offline verification. Tables commit through the existing immutable writer; complete.json is written last. Interrupted export can retain verified individual tables, and identical concurrent retries converge. Validation rebuilds expected bytes from the source; editing a Parquet file and re-signing its receipt does not certify source truth.

The native API persists the exact receipt in its manifest. Multi-budget native checkpoints use checkpoints/budget-v1/<mode-value-digest>/<dataset>/; close ratio values that round to the same percent remain distinct. Single-budget checkpoint paths and payloads are unchanged. An old unscoped multi-budget progress marker is ambiguous and rejects before loading it, including nested run IDs such as team/project. Detection covers the entire configured checkpoint tree. New budget-v1/<digest> markers are distinguished by their original run ID in at most 1 MiB of progress JSON; a legacy name resembling that namespace cannot bypass detection. Malformed, oversized or mismatched scoped run-ID metadata blocks continuation. No checkpoint pickle is read during this preflight. Retain the original package and output; explicitly start a fresh output tree rather than guessing a migration.

For built-in native scenarios using local checkpoints and the Parquet sink, resume first verifies a persisted ownership binding between results and their checkpoint directory, then removes rows beyond the last committed processed step for that exact dataset, execution number and budget. This includes a crash after result flush but before the first checkpoint: all rows from that uncommitted attempt are replayed. Already committed observations and other coordinates are retained; unchanged shards remain byte-identical. A progress marker without loadable state rejects before deleting results. This does not repair corrupt or missing result files that predate the checkpoint, or deduplicate previously committed evidence.

Before the first native row, version-one private metadata pairs each result coordinate with a persistent checkpoint-directory token. A new or emptied checkpoint directory cannot reclaim another run's result rows, even when dataset, experiment number and budget match. Such reuse rejects before deletion; retain the old data and use fresh paired output paths. Future or corrupt stored ownership metadata rejects. Tokens are operational identities; they do not change mathematical source/observation digests or claim independent observations. Unbound completed legacy coordinates can be adopted only after loading their checkpoint and checking that no result exceeds its committed step. This adds ownership metadata while preserving original rows and checkpoint payloads. Unbound legacy tails remain ambiguous and reject; no migration guesses a run. New native shards also retain their owner token in versioned Parquet metadata. An unmanaged writer's tail is never reclaimed as another run's work; it rejects instead. One sink instance belongs to one checkpoint owner. Successful native runs commit their final processed round even when shorter than the configured checkpoint interval, so a completed run is not replayed as an uncommitted tail. Fully restored completed runs preserve their result bytes.

Each native Parquet shard is completed under a temporary name before atomic publication. A crash between shard publications leaves complete uncommitted shards for reconciliation and temporary files that readers/manifests ignore. Reconciliation itself uses atomic shard replacement and is safe to retry after interruption. Errors block execution and manifest publication. Discard an instance whose flush failed and resume with a fresh API call. Serialize attempts of the same run; independent executions use distinct shards. Other sinks/custom scenario providers keep their existing recovery semantics. Power-loss durability and untrusted checkpoint files are outside this local process-interruption contract.

Missing/future schema versions or a missing explicit native cost declaration reject. Old native Parquet, corpus profiles, source readers and their artifacts retain their original APIs/meaning. Unknown producer or writer versions require the recorded package/version; there is no silent conversion. In particular, the publisher's prepared commit-factorized CSVs remain unchanged: their duplicate identities are why this adapter uses raw pipeline/job records instead.

Library API and inspection

After downloading the originals, the same workflow uses the core contracts and existing application API without a CLI or network transport:

from functools import partial
from importlib.resources import files
from pathlib import Path

import polars as pl

from coleman.application.hcs import run_hcs_replay
from coleman.artifacts import ArtifactWriter
from coleman.corpus.hcs_contracts import HCSRecipe, HCSReceipt
from coleman.corpus.hcs_etl import export_hcs_parquet, validate_hcs_etl
from coleman.corpus.materialization import SourceCache, materialize_source

recipe = HCSRecipe.from_json(
    files("coleman.corpus.resources").joinpath("libssh-first16-pipelines-v1.json").read_bytes()
)
cache = SourceCache("/tmp/coleman-hcs-cache")
downloads = Path("/tmp/coleman-hcs-downloads")
for package, name in ((recipe.executions, "executions.csv"), (recipe.jobs, "jobs.json")):
    materialize_source(package, cache, partial((downloads / name).open, "rb"))
completion = export_hcs_parquet(recipe, cache, ArtifactWriter("/tmp/coleman-hcs-output"))
receipt = HCSReceipt.from_json(completion.read_bytes())
validate_hcs_etl(receipt, cache, completion.parent)
print(pl.read_parquet(completion.parent / "cells.parquet"))
for strategy in ("wts", "vts"):
    result = run_hcs_replay(
        completion, cache, Path("/tmp/coleman-hcs-output/native") / strategy, strategy=strategy
    )
    rows = pl.read_parquet(str(Path(result.artifacts_dir) / "results/**/*.parquet"), hive_partitioning=True)
    print(rows.select("scenario", "variant", "step", "policy", "budget_value", "detected", "missed"))

Independent raw-source reference checks validate the retained cohort, exclusions, surrogate union, projected budgets and per-cell denominators. The qualification also checks differences against original decimal quantities; it is not a new metric implementation or a protected policy comparison. From this checkout, after populating the cache with the commands above, reproduce the installed-wheel qualification and its independent reference:

COLEMAN_HCS_REAL_CACHE=/tmp/coleman-hcs-cache \
  uv run --extra dev python -m pytest tests/corpus/test_installed_hcs.py --no-cov

The committed tests/corpus/hcs_raw_reference.py streams the original CSV and job JSON without calling the converter, projection, metric or scheduler. It checks every expected policy/budget/variant cell and compares projected prefixes with exact rational original-decimal quantities. Authored mutation tests verify that incorrect counts, duplicate orders and nonfinite totals fail; a declared modeled cost boundary difference remains visible. No original benchmark bytes are bundled. Scientific source admission, repeated-measures inference and cross-corpus claims remain with the remaining public roadmap.