Run larger LRTS histories without merging their stages¶
Use four-build ActiveMQ and Log4j source profiles to turn verified public Jenkins reports into analytical Parquet and checkpointed TCPCI runs. ActiveMQ supplies a larger single-stage history; Log4j keeps its reported Ubuntu and Windows contexts separate. Each view runs Random and UCB through the existing native API.
The published 4.13 wheel includes this stage-view workflow and retains Karaf and RTPTorrent. It contains the typed contracts and frozen public source recipes; large archives remain separate operator downloads.
Install outside checkout and acquire exact bytes¶
With Python 3.14+ and uv, install the published wheel into a fresh external environment. Its SHA-256 is verified before installation. Keep sources, cache and outputs outside any Git repository; no checkout is needed:
uv venv /tmp/coleman-stage-env --python 3.14
uv pip install --python /tmp/coleman-stage-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-stage-sources
# Explicit operator downloads can resume; the ETL separately verifies full hashes.
curl --fail --location --continue-at - \
https://zenodo.org/records/15603448/files/activemq.zip \
--output /tmp/coleman-stage-sources/activemq.zip
curl --fail --location --continue-at - \
https://zenodo.org/records/15603448/files/log4j.zip \
--output /tmp/coleman-stage-sources/log4j.zip
The authors' raw-report record, v3 declares CC BY 4.0 for the dataset. The new recipes pin the specific record, reviewed CC BY 4.0 terms, complete archive bytes, selected nested ZIPs and decoded reports. Data terms do not establish rights to execute subject code. No subject repository is executed. Downloaded and converted data stay external; COLEMAN bundles recipes, not rows.
| Complete source | Bytes | SHA-256 |
|---|---|---|
activemq.zip |
161,568,227 | 5fe63b10167fb0e9995484bbc4131e4ab6ece462acc76faf6db7813c9484ab1f |
log4j.zip |
41,551,352 | dc6639607b5378451a4a1a558289d4fdf899a3f176e0c9d81a813a18dcdc635c |
Metadata is the same pinned 57,437-row, 21,255-build paper snapshot used by the
existing reader: repository revision
2c1b68e9b1d4ec6c4f304869e36af2e3168da889, 13,698,468 bytes, SHA-256
49570f8dca753c385f25346f8aaaded3a841b0e67dabf36fbb67260a79b02987.
It is distinct from the later collection described by the authors' README.
Credit: Runxiang Cheng, Shuai Wang, Reyhaneh Jabbarvand and Darko Marinov,
Revisiting Test-Case Prioritization on Long-Running Test Suites, ISSTA 2024.
Convert, run and resume¶
/tmp/coleman-stage-env/bin/python -m coleman.transports.lrts_stage_etl \
--preset activemq --archive /tmp/coleman-stage-sources/activemq.zip \
--fetch-metadata --cache /tmp/coleman-stage-cache \
--output /tmp/coleman-stage-activemq --run
/tmp/coleman-stage-env/bin/python -m coleman.transports.lrts_stage_etl \
--preset log4j-ubuntu --archive /tmp/coleman-stage-sources/log4j.zip \
--cache /tmp/coleman-stage-cache --output /tmp/coleman-stage-log4j-ubuntu --run
/tmp/coleman-stage-env/bin/python -m coleman.transports.lrts_stage_etl \
--preset log4j-windows --cache /tmp/coleman-stage-cache \
--output /tmp/coleman-stage-log4j-windows --run
# Reverify and resume the identical ActiveMQ run, with no network or archive path.
/tmp/coleman-stage-env/bin/python -m coleman.transports.lrts_stage_etl \
--preset activemq --cache /tmp/coleman-stage-cache \
--output /tmp/coleman-stage-activemq --run
Only --fetch-metadata enables network access, for the pinned CSV through the
existing bounded public HTTPS adapter. Its inactivity/elapsed limits are
unchanged. Alternatively supply the exact local CSV with --metadata PATH.
--archive always checks the explicitly supplied complete archive, even when
verified cache blobs already exist. Download failures or partial files do not
become complete source artifacts. Both archives use the existing ordinary ZIP
selection profile, not a widened legacy ZIP policy or the ZIP64 reader.
Omit --run to prepare data only. The final JSON identifies the analytical files,
completion receipt, native run, conserved exclusions and temporal blockers.
Runner logs go to stderr; JSON goes to stdout. Invalid source, unknown versions,
ambiguous mapping or unsafe destinations fail nonzero. Repeating the same
arguments reuses the same immutable export and native checkpoint.
Actual source/installed-package checks produced:
| Native view | Analytical methods | Native cases | Outside stage | Not run in selected stage | Native result rows |
|---|---|---|---|---|---|
| ActiveMQ | 18,901 | 18,668 | 0 | 233 | 8 |
| Log4j Ubuntu | 30,066 | 14,957 | 15,014 | 95 | 8 |
| Log4j Windows | 30,066 | 14,906 | 15,052 | 108 | 8 |
Each view has four modeled rounds and two policies. Unknown-outcome and unavailable-duration exclusions are zero in these particular slices, not globally assumed absent. The two Log4j analytical row sets overlap completely; do not add their row counts as if they were independent source observations.
Frozen source selection and stage correspondence¶
Candidates are selected by reported scheduled label, PR and source build ID, without conditioning on failures. Labels order modeled rounds; they are not verified outcome chronology. The four-build slice keeps each project under 50,000 methods and each decoded report under 16 MiB.
| Project | Selected PR/build keys | Processed stages per build |
|---|---|---|
| ActiveMQ | PR-644/1, PR-656/1, PR-669/3, PR-679/1 | 1 |
| Log4j | PR-441/2, PR-442/1, PR-392/9, PR-443/1 | 2 |
The three recipes are lrts-activemq-first-four-stage-v1.json,
lrts-log4j-ubuntu-first-four-stage-v1.json and
lrts-log4j-windows-first-four-stage-v1.json, inside coleman.corpus.resources.
The last two select different native views of the same full source reports.
Every binding explicitly pins source PR/build, processed stage_id, the exact
ordered enclosingBlockNames array and complete raw node-ID set. ActiveMQ's
single maps to [Tests] / node 92 in the selected reports. Log4j bindings are:
| PR/build | Ubuntu_Test → [Ubuntu, Test] node |
Windows_Test → [Windows, Test] node |
|---|---|---|
| PR-441/2 | 79 | 67 |
| PR-442/1 | 78 | 66 |
| PR-392/9 | 67 | 73 |
| PR-443/1 | 78 | 66 |
All selected metadata stages and all raw suites, including empty suites, must
match the relation exactly. Extra, missing, conflicting or ambiguous bindings
reject. There is no underscore concatenation, substring matching or automatic
slug inference. [a_b, c] and [a, b_c] are distinct contexts. Raw
enclosingBlocks remains a separate array; it need not have the same length as
the name array. Node IDs are local to a build and do not establish test continuity.
Reported Ubuntu/Windows labels do not certify runner OS or machine topology.
Files, identities and explicit semantics¶
flowchart TD
P[Pinned metadata and complete public source archive] --> C[Existing verified external cache]
C --> R[Existing typed complete-report reader]
R --> B[Exact processed stage / raw context / node binding]
B --> A[All methods and all processed stages in analytical Parquet]
B --> V[One explicitly declared native stage view]
A --> F[Immutable files then versioned completion receipt]
V --> F
F --> N[Existing native RunSpec API and checkpoint]
F --> E[Temporal evidence blockers remain explicit]
Each content-addressed export contains exactly three Parquet roles followed by
complete.json:
corpus-etl/<recipe-producer-writer-identity>/
observations.parquet
builds.parquet
datasets/<explicit-dataset-id>/features-engineered.parquet
complete.json
observations.parquet retains every original project/PR/build/suite/case identity,
raw status, outcome, node/context arrays, raw timestamp spelling and duration.
Seconds carry their source meaning and availability status. Observed zero is
zero; unavailable duration remains null; skipped and unknown outcomes never
become passes. Negative, NaN and infinite durations reject under the existing
nonnegative source-seconds contract. Distinct processed class/method counts and
raw outcomes are never substituted for one another.
A primary replay_exclusion conserves each row: outside_stage first, then
not_run, unknown_outcome, unavailable_duration, or null for native eligibility.
Outside-stage rows retain their original outcome and duration, even if skipped.
builds.parquet retains all processed stage DTOs in canonical metadata_json,
stage counts and original source keys. Repeated build-level metadata must agree
across stages. Stage-specific filtered class/method counts and cost sums remain
separate. outcome_available_at is null. source_build_group is stable over the
same project/PR/build labels; both Log4j views share it and source dataset digests.
Those views are correlated observations, not two independent projects or faults.
Native Name includes the explicit stage and suite/class/method occurrence;
occurrences are assigned before eligibility. SourceExecutionId joins the exact
raw execution; it is stable across views and is distinct from assumed cross-round
identity. Native Duration is additive reported method seconds. Native BuildId
is a local modeled round. No native quantity means observed parallel CI savings.
Native RNFail feedback is budget-censored: prioritized cases without detected failure receive zero nondetection reward, including unscheduled cases. Zero reward does not mean a reported pass, calibrated probability or full-label update. The profile does not reproduce the paper's All, DeConf or FirstFail class filters.
Typed API and compatibility¶
from pathlib import Path
from coleman.application.corpus import run_lrts_stage_replay
from coleman.artifacts import ArtifactWriter
from coleman.corpus.lrts_stage_contracts import LRTSStageRecipe, LRTSStageReceipt
from coleman.corpus.lrts_stage_etl import export_lrts_stage_parquet, validate_lrts_stage_etl
from coleman.corpus.materialization import SourceCache
from importlib.resources import files
recipe = LRTSStageRecipe.from_json(
files("coleman.corpus.resources").joinpath("lrts-log4j-ubuntu-first-four-stage-v1.json").read_bytes()
)
cache = SourceCache("/tmp/coleman-stage-cache") # Acquired with the command above.
completion = export_lrts_stage_parquet(recipe, cache, ArtifactWriter("/tmp/coleman-stage-api"))
receipt = LRTSStageReceipt.from_json(completion.read_bytes())
validate_lrts_stage_etl(receipt, cache, completion.parent)
result = run_lrts_stage_replay(completion, cache, Path("/tmp/coleman-stage-api-native"))
print(result.run_id, receipt.admission, receipt.temporal.model_dump())
The new lrts-stage-parquet-replay-v1 family requires integer schema_version=1.
Missing, coerced, unknown or future versions reject. Canonical recipe metadata is
at most 1 MiB; transport recipe/receipt reads are capped at 2 MiB. Native aliases
also reject Windows device names, including case variants and dotted extensions,
on every host before acquisition. Fixed Parquet settings and the recorded Polars
version bind physical bytes; canonical rows
separately bind logical meaning. Validation regenerates source-derived expected
bytes and rejects forged/self-signed Parquet without decoding it.
The actual producer digest binds conversion/contract/storage code. Unknown
producer or writer versions require their recorded implementation; regeneration
under changed code produces a different namespace. Old single-stage recipes,
receipts, producer semantics and RunSpec identities remain unchanged. They use
export_lrts_parquet, validate_lrts_etl and run_lrts_replay; the old exporter
continues to reject multistage reports. No automatic artifact migration occurs.
To opt in, create a new explicit stage recipe and export into its own namespace;
retain old artifacts and their pinned environment when reproducing old results.
The immutable writer publishes all three bounded files before the completion receipt. Interrupted writes may leave individual files; they never certify a new completed export. Identical concurrent retries converge, byte disagreements reject, and existing checkpoints resume without duplicate committed results. Cache/output/native destinations are preflighted before acquisition, including symlinks and nested Git repositories. These are trusted-local cooperative filesystem guarantees, not an OS sandbox or a distributed transaction.
Source-specific admission decision¶
All new profiles remain blocked_source_evidence /
posthoc-serial-simulation / insufficient_evidence. Exact stage correspondence
is resolved for these reports. Other necessary evidence is still unavailable:
| Required evidence | Source finding and decision |
|---|---|
| Executor start | Metadata provides a truncated scheduling label; no certified executor-start event. |
| Outcome availability | Raw suite timestamps are null in these selected reports; schedule plus duration cannot identify outcome availability. |
| Feature availability | Processed/retrospective metadata has no certified decision-time feature publication log. |
| Expected test universe | Reported methods do not establish tests expected but absent from a build. |
| Cross-round correspondence | Stage/suite/class/method occurrence is an explicit matching assumption, not verified stable source test identity. |
| Concurrency topology | Raw node/context links and duration sums do not supply executor overlap, queueing or physical runner occupancy. |
receipt.temporal.require_temporal_evaluation() rejects with these blockers.
The selected archives contain raw test reports, not independent build/executor
logs. The pinned extraction code
normalizes contexts, filters methods, drops duplicate labels and constructs
class outcomes; that behavior does not make its results available before a
historical decision. See the original source assessment for snapshot,
filtering and clock boundaries. No author baseline, algorithm win, independent
fault count or prospective production improvement is claimed.