From bab8e431b0b42b66be09a7364c80f8f3de84f6e6 Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 9 Nov 2026 18:25:35 -0500 Subject: [PATCH 1/3] Prototype Console/core crate split and benchmark rebuilds (#1889) --- docs/research/console-core-split.md | 194 ++ prototypes/console-split/README.md | 72 + prototypes/console-split/benchmark.py | 157 ++ prototypes/console-split/prepare.py | 160 ++ prototypes/console-split/results.json | 2156 ++++++++++++++++++++++ prototypes/console-split/test_prepare.py | 62 + 6 files changed, 2801 insertions(+) create mode 100644 docs/research/console-core-split.md create mode 100644 prototypes/console-split/README.md create mode 100644 prototypes/console-split/benchmark.py create mode 100644 prototypes/console-split/prepare.py create mode 100644 prototypes/console-split/results.json create mode 100644 prototypes/console-split/test_prepare.py diff --git a/docs/research/console-core-split.md b/docs/research/console-core-split.md new file mode 100644 index 000000000..28be17f60 --- /dev/null +++ b/docs/research/console-core-split.md @@ -0,0 +1,194 @@ +# Console/core crate split: edit-rebuild experiment + +This is the isolated experiment requested by #1889. The production layout and +[ADR-0001](../adr/0001-rust-binary-with-embedded-skills.md) are unchanged. +Adopting a workspace remains a Day shift decision. + +## Reproduction and scope + +The Base commit is `9283d0b8379aa9cf5b645bfe95699813846cb3a0`. From a checkout +containing that commit and this prototype, on Linux with Python 3.12+, Git and +the pinned Rust toolchain/native build dependencies: + +```sh +python3 prototypes/console-split/benchmark.py --samples 3 --jobs 4 --output /tmp/console-split-results +``` + +The new output directory receives host metadata, every command's log, +`progress.json` and, after complete success, `results.json`. +[The prototype README](../../prototypes/console-split/README.md) documents +independent split generation and validation. The script exports the pinned +commit, rather than measuring whatever is currently checked out. + +The root package remains the `thirdshift` binary. `core/` is a library package, +`thirdshift-core`, whose `src/core.rs` module tree holds everything except +Console and CLI parsing/entry-point code. To minimize unrelated relocation, +sources stay under their original `src/` paths. Core's manifest points at +`../src/core.rs`; there is no dependency from core back to the binary. + +Shared command values and retry rendering move out of `args.rs` into +`core_args.rs`, imported by both sides. `Scope` and Fleet pairing address +validation move into `console_contract.rs`. The original parser/child-run +roundtrip tests move to the binary, where both sides are available. Their +assertions and every integration-test file are preserved. The `test-support` +feature exposes shared unit-test helpers to the binary's dev dependency. +Core preserves the original package version and repository metadata, which +the updater, traces and Eval replay importer consume at compile time. + +The mechanical pass widens 645 existing `pub(crate)` occurrences in 148 core +source files, as well as the moved command/Console contracts. It also exposes +`Given::to_args` and `start_from` for the relocated tests. Narrower internal +visibility stays narrow. The new library permits `clippy::new_without_default`: +publishing existing constructors triggers that lint, and adding new defaults +would go beyond a mechanical split. A production interface would need a much +more selective visibility pass. + +## Host and method + +Measured on 2026-11-09 on `stephens`, a DigitalOcean KVM x86_64 VM running +Ubuntu 24.04 (Linux 6.8.0-147), with four DO-Premium-AMD vCPUs and 16 GiB RAM. +Rust is `rustc 1.99.1 (58cf8f9c3 2026-10-13)`, LLVM 23.1.1; Cargo is 1.99.1. +The linker probe records `cc` (Ubuntu GCC 13.3.0) with Rust's default +`-fuse-ld=lld`. No linker, dependency version or profile changes are part of +the experiment. These numbers are from a different host than the aarch64 +[build profile](rust-build-profile.md); absolute times are not comparable. + +There are three samples for each layout and metric. Commands run sequentially +with four build jobs and incremental compilation enabled. Inherited Cargo/Rust +flags, wrappers and profile overrides are cleared. Each layout/sample starts +with a fresh source export and empty target. Cold test compilation uses a +separate empty target, including dependencies, after the binary target is +removed. Validation uses its own target, removed before measurements. +Dependency fetching precedes timing; the OS page cache is retained. Layout +order alternates Base/split, split/Base, Base/split. This is a shared host, +without external-load control; three samples describe this run rather than +establishing a precise population speedup. + +After a cold dev binary build, each edit appends a comment to one file: + +| Location | File | +| --- | --- | +| Console handler | `src/console/commands.rs` | +| Ticket run | `src/run.rs` | +| logs | `src/logs.rs` | + +The runner restores the original bytes after every edit and runs an unmeasured +warm command before each subsequent location. `cargo check` gets its own +unmeasured warm command too. Thus each measurement invalidates only its named +location; restoration and the first compilation after any configuration +difference are excluded. The measured commands are: + +```sh +cargo build --locked --bin thirdshift +cargo test --locked --no-run +# Each of the three edited files, with its baseline warmed first: +cargo build --locked --bin thirdshift +cargo check --locked --bin thirdshift +``` + +## Measurements + +All values are wall-clock seconds. Each list contains samples 1, 2 and 3; +changes compare the medians, calculated before rounding. Negative change means +the split took less time. The complete host record, commands, results and +unrounded per-sample data are in +[`results.json`](../../prototypes/console-split/results.json). Full logs are +produced in the runner's chosen output directory. + +| Measurement | Base samples | Split samples | Base median | Split median | Change | +| --- | --- | --- | ---: | ---: | ---: | +| Cold dev binary build | 129.342, 124.428, 124.090 | 123.152, 127.736, 124.123 | 124.428 | 124.123 | −0.25% | +| Cold test compile | 211.850, 195.380, 206.142 | 205.255, 218.628, 205.917 | 206.142 | 205.917 | −0.11% | +| Console edit, build | 10.444, 9.899, 11.142 | 3.800, 4.058, 3.930 | 10.444 | 3.930 | −62.37% | +| Ticket run edit, build | 10.264, 10.159, 10.508 | 10.269, 10.176, 10.771 | 10.264 | 10.269 | +0.06% | +| logs edit, build | 10.359, 9.927, 10.384 | 10.424, 9.960, 10.306 | 10.359 | 10.306 | −0.51% | +| Console edit, check | 5.158, 5.481, 5.307 | 1.641, 1.510, 1.496 | 5.307 | 1.510 | −71.55% | +| Ticket run edit, check | 5.398, 5.190, 5.634 | 6.093, 5.462, 5.440 | 5.398 | 5.462 | +1.19% | +| logs edit, check | 5.102, 5.222, 5.410 | 5.732, 5.195, 5.466 | 5.222 | 5.466 | +4.67% | + +**Console edits got faster:** the median rebuild saved 6.514 s (62.37%), and +the median check saved 3.797 s (71.55%). **Core rebuilds did not meaningfully +slow down:** Ticket run edits cost another 0.006 s (0.06%), while logs edits +saved 0.053 s (0.51%). **Core checks were slower in the observed medians:** +another 0.064 s (1.19%) for Ticket run and 0.244 s (4.67%) for logs. Cold +build/test-compile medians were effectively unchanged. These small core/cold +differences overlap the observed sample variation; this run establishes the +large Console benefit more clearly than a stable small core penalty. + +The command logs show where the split saves work: a Console edit compiles only +`thirdshift`, reusing `thirdshift-core`; a Ticket run or logs edit compiles core +and then the binary. This removes the core compiler work from the Console edit +loop while retaining the final executable link. Core edits still invalidate +the library and its consumer, which is consistent with the small check cost. +The nearly unchanged cold times are consistent with keeping the same external +dependencies and nearly all the same compilation work. These are inferences +from Cargo's package rebuilds and wall times, not a measured allocation among +macro expansion, type checking, monomorphization and linking; no nightly +`-Ztime-passes` profile was collected. + +These measurements concern the named Rust handler edit. They do not establish +the same benefit for every Console asset: core's `config/console/themes.rs` +still includes Console CSS for Theme validation, so a CSS edit can invalidate +core too. The prototype keeps those existing resource paths. + +## Faithfulness + +The runner validated the split before measuring, with a private target removed +after validation. All commands exited 0: + +| Command | Wall seconds | Result | +| --- | ---: | --- | +| `cargo build --locked` | 128.986 | Pass | +| `cargo clippy --all-targets -- -D warnings` | 77.708 | Pass | +| `cargo test --test evals replay_import_completes_trial_inputs_and_preserves_local_edits -- --exact` | 68.399 | 1 passed | +| `cargo test --test packaging non_linux_compilation_reports_only_the_platform_error -- --exact` | 0.871 | 1 passed | +| `cargo test --no-fail-fast` | 2352.408 | 3930 passed, 0 failed, 91 ignored | + +The full-suite time includes remaining compilation. It covers both packages, +all integration tests, Pickup's model checks and the library's doctest target +(zero doctests). Ignored tests retain their original annotations. +`--no-fail-fast` changes failure reporting, not test selection. +It allowed a complete view of all test targets in one run. + +Two initial exports failed existing tests: omitting the core package's +`repository` produced `/issues/16` instead of its full GitHub URL, and moving +parser/child-run tests without their inherited Linux guard produced extra +non-Linux diagnostics. The generator preserves both contexts now. The exact +regressions above pass, and the prototype's independent export check verifies +package metadata and unsupported-platform diagnostics for both crate roots. +The integration tests themselves were not edited. + +## Cost of adoption and next seams + +- **Visibility:** replace the broad prototype export with a deliberate library + surface. Shared command values and Console scopes/address validation need + stable owners; parser and core must remain acyclic. Decide whether the + existing constructors should gain defaults or keep the narrow lint allowance. +- **Tests:** decide ownership of parser/child-run tests and a supported helper + feature. Keep unit tests in both packages and preserve integration tests' + `CARGO_BIN_EXE_thirdshift` behavior. Source-inventory tests, embedded fixtures + and `CARGO_MANIFEST_DIR` paths must follow the chosen physical layout. + Preserve compile-time package metadata and inherited platform guards too; + both affected behavior in the initial exports. +- **CI and local selection:** `cargo test --bin thirdshift` would no longer run + core unit tests. `scripts/affected-tests` and CI must cover both packages, + including direct core changes, helpers, both lockfile entries and features. + Workspace defaults here include both packages so bare `cargo test` includes + the complete suite. This PR changes neither CI nor the production selector. +- **Release builds and packaging:** keep the executable named `thirdshift` and + explicitly select its package in install/dist jobs as necessary. Measure + release/LTO behavior separately; dev timings say nothing about release time + or binary size. Embedded skills/processes/assets must remain self-contained. + The prototype's manifest-relative paths and path-only dependency are unsuitable + for crates.io packaging: the `cargo publish --locked` workflow would need + proper library packaging, versioning and publication order. The version-bump + script currently updates one package/lock entry and would need workspace + support. Release adoption has not been attempted here. + +The next candidate to try is the Evals, Scoring and Experiments cluster, +including its verdict calculation. Its external callers concentrate in CLI, +Console, GitHub's scoring adapter and logs. It has fewer incoming module +connections than the Ticket run/dispatch cluster, but logs stores Experiment +descriptions and reads confirmed Bug origins, so those shared values would +need explicit owners. This experiment does not split that cluster or choose +its final interface. diff --git a/prototypes/console-split/README.md b/prototypes/console-split/README.md new file mode 100644 index 000000000..ed1306171 --- /dev/null +++ b/prototypes/console-split/README.md @@ -0,0 +1,72 @@ +# Console/core crate split experiment + +This prototype applies only to Base commit +`9283d0b8379aa9cf5b645bfe95699813846cb3a0` (the `main` commit used for #1889). +Production sources, Cargo configuration, CI and ADR-0001 are unchanged. + +On Linux with Git, Python 3.12+, the repository's pinned Rust toolchain and +native build dependencies installed, run from this checkout: + +```sh +python3 prototypes/console-split/benchmark.py --samples 3 --jobs 4 --output /tmp/console-split-results +``` + +The output directory must be new or empty. The runner first validates the split +with `cargo build --locked`, `cargo clippy --all-targets -- -D warnings` and +`cargo test --no-fail-fast` (first checking the Eval replay import and platform +diagnostic regressions), then measures +both layouts sequentially. It records the host, +CPU count, compiler, actual default linker command, environment, commands, +wall times and per-command logs. `results.json` is written only after every +command passes; `progress.json` and logs remain if a command fails. Temporary +source trees and target directories are removed even on failure. No GitHub +or Harness credentials are required. Allow several GB of free temporary disk +and enough time for twelve cold dependency/test compilations. + +Each of three samples uses fresh targets for the binary's cold dev build and, +separately, cold `cargo test --no-run`. After the binary build, edits append a +comment to `src/console/commands.rs`, `src/run.rs` and `src/logs.rs`; both +`cargo build --locked --bin thirdshift` and `cargo check --locked --bin +thirdshift` are measured. The original bytes are restored after each edit, +and an unmeasured warm command establishes that baseline before the next +location. No flags change between warm and measured commands. Targets are +never shared between layouts or samples; dependency downloads happen before +timing. The OS page cache is retained. Layout order alternates across samples. +The runner clears inherited Cargo/Rust build flags, wrappers and profile +overrides, uses incremental compilation, and records its build job count. + +To inspect or validate the split independently: + +```sh +python3 prototypes/console-split/prepare.py /tmp/thirdshift-split +cd /tmp/thirdshift-split +cargo build --locked +cargo clippy --all-targets -- -D warnings +cargo test --no-fail-fast +``` + +`prepare.py` exports committed sources with `git archive`, then applies uniquely +anchored transformations to that pinned version. It refuses a nonempty +destination. The output is a two-package workspace: the root `thirdshift` +binary and `core/`'s `thirdshift-core` library. Sources retain their original +relative paths under `src/` to avoid unrelated include/template relocation. +`src/core.rs` declares core's modules; `src/main.rs` imports those modules and +retains Console and argument parsing. Shared command values/retry formatting +are extracted into `src/core_args.rs`, and `Scope`/Fleet address validation into +`src/console_contract.rs`. The core manifest has no dependency on the binary. +Only existing crate visibility is mechanically widened, plus two helpers +used by the relocated parser/child-run unit tests. Core permits +`clippy::new_without_default` because its existing constructors become public; +the prototype adds no new constructor behavior. The binary's dev dependency +enables core's `test-support` feature. Integration tests remain byte for byte +unchanged. Core preserves the package version and repository metadata used by +runtime behavior. Dependency versions, linker and build profiles are unchanged. + +The script's output contract has a small independent check: + +```sh +python3 -m unittest discover -s prototypes/console-split -p 'test_*.py' +``` + +The measurements and adoption costs are in +[`docs/research/console-core-split.md`](../../docs/research/console-core-split.md). diff --git a/prototypes/console-split/benchmark.py b/prototypes/console-split/benchmark.py new file mode 100644 index 000000000..e13ac2501 --- /dev/null +++ b/prototypes/console-split/benchmark.py @@ -0,0 +1,157 @@ +#!/usr/bin/env python3 +"""Validate and time the pinned Base commit versus the Console/core split.""" +import argparse +from datetime import datetime, timezone +import hashlib +import json +import os +from pathlib import Path +import platform +import shutil +import subprocess +import tempfile +import time + +from prepare import BASE, REPO, prepare + + +EDITS = {"console": "src/console/commands.rs", "ticket": "src/run.rs", "logs": "src/logs.rs"} + + +def capture(command, cwd=REPO, env=None): + return subprocess.check_output(command, cwd=cwd, env=env, text=True, stderr=subprocess.STDOUT).strip() + + +class Runner: + def __init__(self, output, jobs): + self.output = output + self.env = os.environ.copy() + # A wrapper, inherited flags or profile overrides would change the experiment. + for key in list(self.env): + if key.startswith(("CARGO_", "RUST")): + self.env.pop(key) + self.env.update(CARGO_BUILD_JOBS=str(jobs), CARGO_INCREMENTAL="1") + self.rows = [] + + def command(self, tree, target, label, argv, measured=False): + env = self.env | {"CARGO_TARGET_DIR": str(target)} + log_path = self.output / (label + ".log") + print(f"{label}: {' '.join(argv)} -> {log_path}", flush=True) + started = time.perf_counter() + with log_path.open("w") as log: + result = subprocess.run(argv, cwd=tree, env=env, stdout=log, stderr=subprocess.STDOUT) + seconds = time.perf_counter() - started + output = log_path.read_text() + row = {"label": label, "command": argv, "seconds": seconds, + "exit_code": result.returncode, "measured": measured, + "log": log_path.name, "sha256": hashlib.sha256(log_path.read_bytes()).hexdigest(), + "results": [line for line in output.splitlines() if line.startswith("test result:")], + "tail": output.splitlines()[-8:]} + self.rows.append(row) + (self.output / "progress.json").write_text(json.dumps(self.rows, indent=2) + "\n") + print(f"{label}: exit {result.returncode}, {seconds:.3f}s", flush=True) + if result.returncode: + raise RuntimeError(f"{label} failed; see {log_path}\n{output[-4000:]}") + + def validate(self, tree, target): + for label, argv in [ + ("build", ["cargo", "build", "--locked"]), + ("clippy", ["cargo", "clippy", "--all-targets", "--", "-D", "warnings"]), + ("eval-metadata", ["cargo", "test", "--test", "evals", + "replay_import_completes_trial_inputs_and_preserves_local_edits", "--", "--exact"]), + ("platform", ["cargo", "test", "--test", "packaging", + "non_linux_compilation_reports_only_the_platform_error", "--", "--exact"]), + ("test", ["cargo", "test", "--no-fail-fast"]), + ]: + self.command(tree, target, "validation-" + label, argv) + + def edits(self, tree, target, prefix, argv): + # Restore and rebuild before each location so a measurement invalidates only + # that location, rather than also invalidating the preceding restored file. + for location, relative in EDITS.items(): + self.command(tree, target, f"{prefix}-{location}-warm", argv) + path = tree / relative + original = path.read_bytes() + try: + path.write_bytes(original + b"\n// Console split edit-rebuild measurement.\n") + self.command(tree, target, f"{prefix}-{location}", argv, measured=True) + finally: + path.write_bytes(original) + + def sample(self, tree, scratch, sample, layout): + prefix = f"{sample}-{layout}" + target = scratch / "build-target" + build = ["cargo", "build", "--locked", "--bin", "thirdshift"] + self.command(tree, target, prefix + "-cold-build", build, measured=True) + self.edits(tree, target, prefix + "-build", build) + self.edits(tree, target, prefix + "-check", ["cargo", "check", "--locked", "--bin", "thirdshift"]) + shutil.rmtree(target) + # Test compilation really is cold, including dependencies; it never reuses + # the target from the cold binary build, checks, validation or other samples. + self.command(tree, scratch / "test-target", prefix + "-cold-test", + ["cargo", "test", "--locked", "--no-run"], measured=True) + + +def main(): + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("--output", type=Path, required=True, help="new or empty results directory") + parser.add_argument("--samples", type=int, default=3) + parser.add_argument("--jobs", type=int, default=os.cpu_count()) + args = parser.parse_args() + if args.samples < 3 or args.jobs < 1: + parser.error("at least 3 samples and 1 build job are required") + output = args.output.resolve() + if output.exists() and any(output.iterdir()): + parser.error("output must be empty") + output.mkdir(parents=True, exist_ok=True) + runner = Runner(output, args.jobs) + # Record the actual default linker selection, without changing flags. + with tempfile.TemporaryDirectory(prefix="console-split-linker-") as probe: + source = Path(probe) / "probe.rs" + source.write_text("fn main() {}\n") + linker = capture(["rustc", str(source), "-o", str(Path(probe) / "probe"), + "--print", "link-args"], env=runner.env) + host = {"platform": platform.platform(), "uname": list(platform.uname()), + "cpu_count": os.cpu_count(), "cpu": capture(["lscpu"]), + "rustc": capture(["rustc", "-Vv"], env=runner.env), + "cargo": capture(["cargo", "-V"], env=runner.env), + "linker_command": linker, "cc": capture(["cc", "--version"]), + "environment": {k: v for k, v in runner.env.items() if k.startswith(("CARGO_", "RUST"))}} + metadata = {"base": BASE, "started": datetime.now(timezone.utc).isoformat(), + "host": host, "samples": args.samples, "jobs": args.jobs, + "edits": EDITS, "method": "sequential fresh targets; warm commands excluded; OS page cache retained"} + (output / "metadata.json").write_text(json.dumps(metadata, indent=2) + "\n") + # Validate once before measuring. This private target is removed before timing. + with tempfile.TemporaryDirectory(prefix="console-split-validate-") as tmp: + scratch = Path(tmp) + prepare(scratch / "tree") + runner.validate(scratch / "tree", scratch / "target") + for sample in range(1, args.samples + 1): + # Alternate which layout goes first; compilation never runs concurrently. + for layout in (["base", "split"] if sample % 2 else ["split", "base"]): + with tempfile.TemporaryDirectory(prefix="console-split-sample-") as tmp: + scratch = Path(tmp) + tree = scratch / "tree" + if layout == "split": + prepare(tree) + else: + # prepare's archive extraction without applying its split. + tree.mkdir() + archive = scratch / "base.tar" + with archive.open("wb") as stream: + subprocess.run(["git", "archive", "--format=tar", BASE], cwd=REPO, stdout=stream, check=True) + import tarfile + with tarfile.open(archive) as contents: + contents.extractall(tree, filter="data") + archive.unlink() + # Download and registry setup are excluded from the timed regions. + runner.command(tree, scratch / "fetch-target", f"{sample}-{layout}-fetch", ["cargo", "fetch", "--locked"]) + runner.sample(tree, scratch, sample, layout) + metadata["finished"] = datetime.now(timezone.utc).isoformat() + metadata["runs"] = runner.rows + (output / "results.json").write_text(json.dumps(metadata, indent=2) + "\n") + print(output / "results.json", flush=True) + + +if __name__ == "__main__": + main() diff --git a/prototypes/console-split/prepare.py b/prototypes/console-split/prepare.py new file mode 100644 index 000000000..9ac288762 --- /dev/null +++ b/prototypes/console-split/prepare.py @@ -0,0 +1,160 @@ +#!/usr/bin/env python3 +"""Materialize a mechanical Console/core split of one pinned production commit.""" +import argparse +from pathlib import Path +import re +import subprocess +import tarfile +import tempfile + + +BASE = "9283d0b8379aa9cf5b645bfe95699813846cb3a0" +REPO = Path(__file__).resolve().parents[2] + + +def between(text, start, end): + """Select an exact, uniquely anchored region of the pinned source.""" + assert text.count(start) == 1, start + assert text.count(end) == 1, end + return text[text.index(start):text.index(end)] + + +def split(tree): + src = tree / "src" + main = (src / "main.rs").read_text() + declarations = main[:main.index('#[cfg(target_os = "linux")]\nuse std::process::ExitCode;')] + core = declarations + for name in ["args", "console"]: + core = core.replace(f'#[cfg(target_os = "linux")]\nmod {name};\n', "") + core = core.replace('#[cfg(not(target_os = "linux"))]\nfn main() {}\n', "") + core = re.sub(r"^mod (\w+);", r"pub mod \1;", core, flags=re.M) + core = core.replace('#[cfg(test)]\n#[cfg(target_os = "linux")]\npub mod test_support;', + '#[cfg(any(test, feature = "test-support"))]\n#[cfg(target_os = "linux")]\npub mod test_support;') + core += ('\n#[cfg(target_os = "linux")]\n#[path = "core_args.rs"]\npub mod args;\n' + '#[cfg(target_os = "linux")]\npub mod console_contract;\n') + core = ('// The prototype exposes existing constructors mechanically; adding Default\n' + '// implementations would redesign the production interface.\n' + '#![allow(clippy::new_without_default)]\n' + core) + (src / "core.rs").write_text(core) + # The binary imports core modules at its root, preserving Console's crate:: paths. + binary = declarations + for name in re.findall(r"^mod (\w+);", declarations, re.M): + if name not in {"args", "console"}: + binary = binary.replace(f"mod {name};", f"pub use thirdshift_core::{name};") + binary = binary.replace('#[cfg(test)]\n#[cfg(target_os = "linux")]\npub use thirdshift_core::prompts_page;\n', "") + binary += main[len(declarations):] + + args = (src / "args.rs").read_text() + regions = [ + between(args, "/// What `thirdshift process` was asked to do.", "/// What thirdshift was asked to do."), + between(args, "#[derive(Default)]\npub struct MetricsArgs", "/// The flag that stops an Architect run"), + between(args, "/// Retry the original Issue URL", "/// Parse the arguments after the program name."), + between(args, "pub(crate) fn fix_retry", "fn parse_process"), + between(args, "/// One path component:", "/// Parse the arguments after `architect`"), + between(args, "/// Is `arg`, after `email`", "#[cfg(test)]\nmod tests"), + ] + header = """//! Shared command values and retry rendering; parsing stays in the binary. +use crate::asks::Flags; +use crate::base_fix::BaseFixAsk; +use crate::harness; +use crate::issue::{IssueInput, IssueUrl}; +use crate::notification::NotificationAsk; +use crate::run::Goal; +const BASE_FIX: &str = "base-fix"; +""" + (src / "core_args.rs").write_text(header + "\n".join(regions)) + for region in regions: + args = args.replace(region, "") + args = args.replace("use crate::issue::{IssueInput, IssueUrl};", "use crate::issue::IssueInput;\n#[cfg(test)]\nuse crate::issue::IssueUrl;") + args = args.replace("use crate::child_run::{self, Given};", "use crate::child_run::{self, Given};\npub use thirdshift_core::args::*;") + # The parity inventory reads the moved ProcessAction definition too. + parity = src / "console/parity.rs" + parity.write_text(parity.read_text().replace('include_str!("../args.rs"), "ProcessAction"', + 'include_str!("../core_args.rs"), "ProcessAction"')) + (src / "args.rs").write_text(args) + + console = (src / "console.rs").read_text() + scope = between(console, "#[derive(Clone, Copy, Debug, PartialEq, Eq, serde::Deserialize, serde::Serialize)]", + "#[derive(Clone, Copy)]\nenum View") + fleet_path = src / "console/fleet.rs" + fleet = fleet_path.read_text() + pairing = between(fleet, "pub(crate) fn pairing_address", "#[derive(Deserialize)]\npub(super) struct Whoami") + (src / "console_contract.rs").write_text( + "//! Values and address checks shared with the Console.\n" + "use anyhow::{Context, Result, ensure};\nuse crate::config::console::fleet;\n" + scope + pairing) + (src / "console.rs").write_text(console.replace(scope, "pub(crate) use thirdshift_core::console_contract::Scope;\n\n")) + fleet_path.write_text(fleet.replace(pairing, "use thirdshift_core::console_contract::pairing_address;\n\n")) + + # These tests cross the parser/child-run seam; keep them on the binary side. + child = (src / "child_run.rs").read_text() + tests = child[child.index("#[cfg(test)]\nmod tests {"):] + tests = tests.replace('#[cfg(test)]', '#[cfg(all(test, target_os = "linux"))]', 1) + child = child[:child.index("#[cfg(test)]\nmod tests {")] + child = child.replace("fn start_from(", "pub fn start_from(") + child = child.replace(" fn to_args(", " pub fn to_args(") + (src / "child_run.rs").write_text(child) + tests = tests.replace(" use super::*;", """ use thirdshift_core::child_run::*; + use crate::base_fix::BaseFixAsk; + use crate::harness::{Choice, ChosenBy, Harness}; + use crate::issue::IssueUrl; + use crate::logs; + use std::path::Path; + use anyhow::Result;""", 1) + binary += "\n" + tests + (src / "main.rs").write_text(binary) + + core_files = [p for p in src.rglob("*.rs") + if p not in {src / "main.rs", src / "args.rs", src / "console.rs"} + and p.relative_to(src).parts[0] != "console"] + # config/console belongs to core, while src/console belongs to the binary. + for path in core_files: + text = path.read_text() + text = text.replace("pub(crate)", "pub") + text = text.replace("crate::console::Scope", "crate::console_contract::Scope") + text = text.replace("crate::console::fleet::pairing_address", "crate::console_contract::pairing_address") + # Sources stay in src/, so include_str! relative paths need no changes. + text = text.replace('env!("CARGO_MANIFEST_DIR")', 'concat!(env!("CARGO_MANIFEST_DIR"), "/..")') + text = text.replace('$CARGO_MANIFEST_DIR/', '$CARGO_MANIFEST_DIR/../') + path.write_text(text) + + manifest = (tree / "Cargo.toml").read_text() + dependencies = between(manifest, "[dependencies]", "[lints.clippy]") + (tree / "core").mkdir() + lints = between(manifest, "[lints.clippy]", "# Line tables") + repository = re.search(r"^repository = .+$", manifest, re.M).group() + (tree / "core/Cargo.toml").write_text( + '[package]\nname = "thirdshift-core"\nversion = "0.24.1"\nedition = "2024"\n' + repository + '\n' + '[lib]\npath = "../src/core.rs"\n[features]\ntest-support = []\n' + dependencies + lints) + manifest = manifest.replace("[dependencies]", '[dependencies]\nthirdshift-core = { path = "core" }', 1) + manifest = manifest.replace("[dev-dependencies]", '[dev-dependencies]\nthirdshift-core = { path = "core", features = ["test-support"] }', 1) + manifest += '\n[workspace]\nmembers = ["core"]\ndefault-members = [".", "core"]\nresolver = "3"\n' + (tree / "Cargo.toml").write_text(manifest) + # No dependency versions change: add just the local package and edge to the lockfile. + lock_path = tree / "Cargo.lock" + lock = lock_path.read_text() + package = re.search(r'\[\[package\]\]\nname = "thirdshift"\n.*?(?=\[\[package\]\])', lock, re.S).group() + core_package = package.replace('name = "thirdshift"', 'name = "thirdshift-core"', 1) + binary_package = package.replace('dependencies = [\n', 'dependencies = [\n "thirdshift-core",\n', 1) + lock_path.write_text(lock.replace(package, binary_package + core_package)) + subprocess.run(["cargo", "fmt", "--all"], cwd=tree, check=True) + + +def prepare(destination): + destination = Path(destination).resolve() + if destination.exists() and (not destination.is_dir() or any(destination.iterdir())): + raise ValueError("destination must be empty") + destination.mkdir(parents=True, exist_ok=True) + # git archive includes committed sources only, never this worktree's edits. + with tempfile.TemporaryFile() as archive: + subprocess.run(["git", "archive", "--format=tar", BASE], cwd=REPO, stdout=archive, check=True) + archive.seek(0) + with tarfile.open(fileobj=archive) as contents: + contents.extractall(destination, filter="data") + split(destination) + print(destination) + + +if __name__ == "__main__": + parser = argparse.ArgumentParser(description=__doc__) + parser.add_argument("destination", type=Path) + prepare(parser.parse_args().destination) diff --git a/prototypes/console-split/results.json b/prototypes/console-split/results.json new file mode 100644 index 000000000..b19d74a26 --- /dev/null +++ b/prototypes/console-split/results.json @@ -0,0 +1,2156 @@ +{ + "base": "9283d0b8379aa9cf5b645bfe95699813846cb3a0", + "started": "2026-11-09T21:54:42.520820+00:00", + "host": { + "platform": "Linux-6.8.0-147-generic-x86_64-with-glibc2.39", + "uname": [ + "Linux", + "stephens", + "6.8.0-147-generic", + "#147-Ubuntu SMP PREEMPT_DYNAMIC Thu Sep 24 11:33:16 UTC 2026", + "x86_64", + "x86_64" + ], + "cpu_count": 4, + "cpu": "Architecture: x86_64\nCPU op-mode(s): 32-bit, 64-bit\nAddress sizes: 40 bits physical, 48 bits virtual\nByte Order: Little Endian\nCPU(s): 4\nOn-line CPU(s) list: 0-3\nVendor ID: AuthenticAMD\nModel name: DO-Premium-AMD\nCPU family: 23\nModel: 49\nThread(s) per core: 1\nCore(s) per socket: 4\nSocket(s): 1\nStepping: 0\nBogoMIPS: 3992.49\nFlags: fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm rep_good nopl cpuid extd_apicid tsc_known_freq pni pclmulqdq ssse3 fma cx16 sse4_1 sse4_2 x2apic movbe popcnt aes xsave avx f16c rdrand hypervisor lahf_lm cmp_legacy svm cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw topoext perfctr_core ssbd ibrs ibpb stibp vmmcall fsgsbase bmi1 avx2 smep bmi2 rdseed adx smap clflushopt clwb sha_ni xsaveopt xsavec xgetbv1 clzero xsaveerptr wbnoinvd arat npt nrip_save umip rdpid\nVirtualization: AMD-V\nHypervisor vendor: KVM\nVirtualization type: full\nL1d cache: 128 KiB (4 instances)\nL1i cache: 128 KiB (4 instances)\nL2 cache: 2 MiB (4 instances)\nL3 cache: 16 MiB (1 instance)\nNUMA node(s): 1\nNUMA node0 CPU(s): 0-3\nVulnerability Gather data sampling: Not affected\nVulnerability Indirect target selection: Not affected\nVulnerability Itlb multihit: Not affected\nVulnerability L1tf: Not affected\nVulnerability Mds: Not affected\nVulnerability Meltdown: Not affected\nVulnerability Mmio stale data: Not affected\nVulnerability Reg file data sampling: Not affected\nVulnerability Retbleed: Mitigation; untrained return thunk; SMT disabled\nVulnerability Spec rstack overflow: Vulnerable: Safe RET, no microcode\nVulnerability Spec store bypass: Mitigation; Speculative Store Bypass disabled via prctl\nVulnerability Spectre v1: Mitigation; usercopy/swapgs barriers and __user pointer sanitization\nVulnerability Spectre v2: Mitigation; Retpolines; IBPB conditional; STIBP disabled; RSB filling; PBRSB-eIBRS Not affected; BHI Not affected\nVulnerability Srbds: Not affected\nVulnerability Tsa: Not affected\nVulnerability Tsx async abort: Not affected\nVulnerability Vmscape: Not affected", + "rustc": "rustc 1.99.1 (58cf8f9c3 2026-10-13)\nbinary: rustc\ncommit-hash: 58cf8f9c35b355199727627d07ae34a4e2846d67\ncommit-date: 2026-10-13\nhost: x86_64-unknown-linux-gnu\nrelease: 1.99.1\nLLVM version: 23.1.1", + "cargo": "cargo 1.99.1 (5f94df478 2026-08-27)", + "linker_command": "LC_ALL=\"C\" PATH=\"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin:/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin/self-contained:/home/jacob/.codex/packages/standalone/releases/0.164.0-x86_64-unknown-linux-musl/codex-path:/home/jacob/.local/bin:/home/jacob/.elan/bin:/home/jacob/.local/bin:/home/jacob/bin:/home/jacob/.codex/tmp/arg0-linux/codex-arg0xcKre5:/home/jacob/.codex/packages/standalone/releases/0.164.0-x86_64-unknown-linux-musl/codex-path:/home/jacob/.local/bin:/home/jacob/.cargo/bin:/usr/local/bin:/usr/bin:/bin:/snap/bin:/home/jacob/.dotnet/tools\" VSLANG=\"1033\" \"cc\" \"-m64\" \"/tmp/console-split-linker-9gv4_1ua/rustcXAILV4/symbols.o\" \"/tmp/console-split-linker-9gv4_1ua/probe.probe.7cc48b8033570ecf-cgu.0.rcgu.o\" \"/tmp/console-split-linker-9gv4_1ua/probe.5yp177nwbcyib6bl0ucjicqzm.rcgu.o\" \"-Wl,--as-needed\" \"-Wl,-Bstatic\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd-7e719de9c4abc98f.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libpanic_unwind-4c962e8757b7fd52.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libobject-9ab214bf508f4fb2.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libmemchr-e57d23b4cf2c7093.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libaddr2line-b2546485fb156a81.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libgimli-a024a39c5ca178d0.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcfg_if-77a19c181a6f6522.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_demangle-23edf219dcb73297.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libstd_detect-ce90372c8b94015d.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libhashbrown-bd00bf133bcf4229.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_alloc-e4d7e1d94de777fa.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libminiz_oxide-4ee1421476c1c513.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libadler2-e749a99f48dba5bc.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libunwind-87f8da15080ba246.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liblibc-6cf0fcd942b0e793.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/librustc_std_workspace_core-fb3f24e4abf4be88.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/liballoc-3988244237fec6ee.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcore-1d288395a3394ed3.rlib\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib/libcompiler_builtins-2d9557d6e902a200.rlib\" \"-Wl,-Bdynamic\" \"-lgcc_s\" \"-lutil\" \"-lrt\" \"-lpthread\" \"-lm\" \"-ldl\" \"-lc\" \"-L\" \"/tmp/console-split-linker-9gv4_1ua/rustcXAILV4/raw-dylibs\" \"-B/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/bin/gcc-ld\" \"-fuse-ld=lld\" \"-Wl,--eh-frame-hdr\" \"-Wl,-z,noexecstack\" \"-L\" \"/home/jacob/.rustup/toolchains/1.99.1-x86_64-unknown-linux-gnu/lib/rustlib/x86_64-unknown-linux-gnu/lib\" \"-o\" \"/tmp/console-split-linker-9gv4_1ua/probe\" \"-Wl,--gc-sections\" \"-pie\" \"-Wl,-z,relro,-z,now\" \"-nodefaultlibs\"", + "cc": "cc (Ubuntu 13.3.0-6ubuntu2~24.04.1) 13.3.0\nCopyright (C) 2023 Free Software Foundation, Inc.\nThis is free software; see the source for copying conditions. There is NO\nwarranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.", + "environment": { + "CARGO_BUILD_JOBS": "4", + "CARGO_INCREMENTAL": "1" + } + }, + "samples": 3, + "jobs": 4, + "edits": { + "console": "src/console/commands.rs", + "ticket": "src/run.rs", + "logs": "src/logs.rs" + }, + "method": "sequential fresh targets; warm commands excluded; OS page cache retained", + "finished": "2026-11-09T23:23:58.075966+00:00", + "runs": [ + { + "label": "validation-build", + "command": [ + "cargo", + "build", + "--locked" + ], + "seconds": 128.98644373985007, + "exit_code": 0, + "measured": false, + "log": "validation-build.log", + "sha256": "07b3cd5ea43b2835d5395f2485e8bf62b7dff0e59411e83cbe36fd4464be7e2e", + "results": [], + "tail": [ + " Compiling rustls-platform-verifier v0.7.1", + " Compiling hyper-rustls v0.27.10", + " Compiling reqwest v0.13.5", + " Compiling axoasset v2.0.1", + " Compiling axoupdater v0.10.2", + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-validate-8ffum2go/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-validate-8ffum2go/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 08s" + ] + }, + { + "label": "validation-clippy", + "command": [ + "cargo", + "clippy", + "--all-targets", + "--", + "-D", + "warnings" + ], + "seconds": 77.70804320601746, + "exit_code": 0, + "measured": false, + "log": "validation-clippy.log", + "sha256": "1402e540922dc4e322e5646fe5b9add7413cf1bc2a95f8d0058d8bcf0321b94b", + "results": [], + "tail": [ + " Checking base64 v0.22.1", + " Checking choice v0.0.2", + " Checking syn v2.0.119", + " Checking stateright v0.31.0", + " Checking opentelemetry-proto v0.33.1", + " Checking thirdshift-core v0.24.1 (/tmp/console-split-validate-8ffum2go/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-validate-8ffum2go/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 1m 17s" + ] + }, + { + "label": "validation-eval-metadata", + "command": [ + "cargo", + "test", + "--test", + "evals", + "replay_import_completes_trial_inputs_and_preserves_local_edits", + "--", + "--exact" + ], + "seconds": 68.39904335001484, + "exit_code": 0, + "measured": false, + "log": "validation-eval-metadata.log", + "sha256": "3a8f95dc9fb7e316380667a3ce9cfb17aea34a9271c1d0a1432b2fa04681bb0a", + "results": [ + "test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 15 filtered out; finished in 0.16s" + ], + "tail": [ + " Finished `test` profile [unoptimized + debuginfo] target(s) in 1m 08s", + " Running tests/evals.rs (/tmp/console-split-validate-8ffum2go/target/debug/deps/evals-9dc50191a1bd17e3)", + "", + "running 1 test", + "test replay_import_completes_trial_inputs_and_preserves_local_edits ... ok", + "", + "test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 15 filtered out; finished in 0.16s", + "" + ] + }, + { + "label": "validation-platform", + "command": [ + "cargo", + "test", + "--test", + "packaging", + "non_linux_compilation_reports_only_the_platform_error", + "--", + "--exact" + ], + "seconds": 0.8710216251201928, + "exit_code": 0, + "measured": false, + "log": "validation-platform.log", + "sha256": "fa102d5de823ef81ae93ff515d75068c9f7f2ea3dc2223af92debf08eb866e48", + "results": [ + "test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 0.11s" + ], + "tail": [ + " Finished `test` profile [unoptimized + debuginfo] target(s) in 0.65s", + " Running tests/packaging.rs (/tmp/console-split-validate-8ffum2go/target/debug/deps/packaging-4865792907e08eed)", + "", + "running 1 test", + "test non_linux_compilation_reports_only_the_platform_error ... ok", + "", + "test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 6 filtered out; finished in 0.11s", + "" + ] + }, + { + "label": "validation-test", + "command": [ + "cargo", + "test", + "--no-fail-fast" + ], + "seconds": 2352.408169175964, + "exit_code": 0, + "measured": false, + "log": "validation-test.log", + "sha256": "631d4c32cdb1bbf45c2d40505354ebabbdf2a9991d0c18b7d53ef6575a84d431", + "results": [ + "test result: ok. 85 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 13.16s", + "test result: ok. 8 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 5.96s", + "test result: ok. 16 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 14.16s", + "test result: ok. 9 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 10.78s", + "test result: ok. 94 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 72.94s", + "test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.63s", + "test result: ok. 16 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 28.35s", + "test result: ok. 18 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 5.51s", + "test result: ok. 14 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 15.66s", + "test result: ok. 30 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 37.26s", + "test result: ok. 16 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 22.52s", + "test result: ok. 12 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 13.78s", + "test result: ok. 20 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.87s", + "test result: ok. 264 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 107.47s", + "test result: ok. 19 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.85s", + "test result: ok. 9 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 5.47s", + "test result: ok. 25 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 10.19s", + "test result: ok. 18 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.51s", + "test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.61s", + "test result: ok. 16 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.07s", + "test result: ok. 126 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 225.58s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 8.07s", + "test result: ok. 15 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 9.20s", + "test result: ok. 5 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 10 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 11.96s", + "test result: ok. 10 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 17.17s", + "test result: ok. 11 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 11.49s", + "test result: ok. 26 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 19.77s", + "test result: ok. 6 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 5.45s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.15s", + "test result: ok. 10 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.89s", + "test result: ok. 2 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.98s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.94s", + "test result: ok. 8 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 15.95s", + "test result: ok. 8 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 9.15s", + "test result: ok. 40 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 51.63s", + "test result: ok. 9 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 8.87s", + "test result: ok. 33 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.26s", + "test result: ok. 10 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 5.13s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.07s", + "test result: ok. 16 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 8.52s", + "test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 6.85s", + "test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.33s", + "test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.89s", + "test result: ok. 143 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 110.58s", + "test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 6.55s", + "test result: ok. 16 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 8.10s", + "test result: ok. 235 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 202.05s", + "test result: ok. 7 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 7.22s", + "test result: ok. 20 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 21.04s", + "test result: ok. 11 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 7.80s", + "test result: ok. 106 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 59.05s", + "test result: ok. 7 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 2.35s", + "test result: ok. 2 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.36s", + "test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.34s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 2.97s", + "test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 0.66s", + "test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 6.57s", + "test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.13s", + "test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.22s", + "test result: ok. 14 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 10.12s", + "test result: ok. 31 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 18.55s", + "test result: ok. 7 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 9.46s", + "test result: ok. 2 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.42s", + "test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.05s", + "test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 2.10s", + "test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.24s", + "test result: ok. 5 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.32s", + "test result: ok. 5 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.07s", + "test result: ok. 10 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 15.57s", + "test result: ok. 47 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 46.25s", + "test result: ok. 40 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 41.75s", + "test result: ok. 39 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 73.40s", + "test result: ok. 125 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 178.22s", + "test result: ok. 10 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 21.49s", + "test result: ok. 37 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 5.78s", + "test result: ok. 5 passed; 0 failed; 2 ignored; 0 measured; 0 filtered out; finished in 2.14s", + "test result: ok. 8 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.18s", + "test result: ok. 4 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 16 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 13.94s", + "test result: ok. 7 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.51s", + "test result: ok. 16 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 2.84s", + "test result: ok. 1 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 2.11s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 4.43s", + "test result: ok. 4 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 1.49s", + "test result: ok. 92 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 255.77s", + "test result: ok. 3 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 3.89s", + "test result: ok. 78 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 21.88s", + "test result: ok. 10 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 13.76s", + "test result: ok. 3 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "test result: ok. 28 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 10.86s", + "test result: ok. 27 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 30.45s", + "test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 1.90s", + "test result: ok. 10 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 2.18s", + "test result: ok. 26 passed; 0 failed; 1 ignored; 0 measured; 0 filtered out; finished in 10.91s", + "test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1578 filtered out; finished in 0.00s", + "test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1578 filtered out; finished in 0.00s", + "test result: ok. 1 passed; 0 failed; 0 ignored; 0 measured; 1578 filtered out; finished in 0.00s", + "test result: ok. 1576 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 167.08s", + "test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s" + ], + "tail": [ + "test result: ok. 1576 passed; 0 failed; 3 ignored; 0 measured; 0 filtered out; finished in 167.08s", + "", + " Doc-tests thirdshift_core", + "", + "running 0 tests", + "", + "test result: ok. 0 passed; 0 failed; 0 ignored; 0 measured; 0 filtered out; finished in 0.00s", + "" + ] + }, + { + "label": "1-base-fetch", + "command": [ + "cargo", + "fetch", + "--locked" + ], + "seconds": 0.5509405180346221, + "exit_code": 0, + "measured": false, + "log": "1-base-fetch.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "results": [], + "tail": [] + }, + { + "label": "1-base-cold-build", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 129.34221504302695, + "exit_code": 0, + "measured": true, + "log": "1-base-cold-build.log", + "sha256": "5ebf7f27fe0b40f260de9373a683ea582c45c72d022d648c2cf2d1f0df9074ed", + "results": [], + "tail": [ + " Compiling tokio-rustls v0.26.5", + " Compiling rustls-platform-verifier v0.7.1", + " Compiling hyper-rustls v0.27.10", + " Compiling reqwest v0.13.5", + " Compiling axoasset v2.0.1", + " Compiling axoupdater v0.10.2", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 09s" + ] + }, + { + "label": "1-base-build-console-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 0.25691396393813193, + "exit_code": 0, + "measured": false, + "log": "1-base-build-console-warm.log", + "sha256": "299f16a2c523be18fef769975d2df00e0505521db047540feea3a74b94666887", + "results": [], + "tail": [ + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.18s" + ] + }, + { + "label": "1-base-build-console", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.443721822928637, + "exit_code": 0, + "measured": true, + "log": "1-base-build-console.log", + "sha256": "97c62fd27e81330c12efc87e65331d5b4dce543a77a3e3fbdcf4197fcdd72ab3", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.35s" + ] + }, + { + "label": "1-base-build-ticket-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.550436107907444, + "exit_code": 0, + "measured": false, + "log": "1-base-build-ticket-warm.log", + "sha256": "396e394a91ee9d082af64d0180234347c94c7f74515196ce4406412a49c7d735", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.46s" + ] + }, + { + "label": "1-base-build-ticket", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.263653710018843, + "exit_code": 0, + "measured": true, + "log": "1-base-build-ticket.log", + "sha256": "19893da5f37ff424e8f6891e83964acc41f0c7ce2ebebbbcda96d5e21d930c0f", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.17s" + ] + }, + { + "label": "1-base-build-logs-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.04655715986155, + "exit_code": 0, + "measured": false, + "log": "1-base-build-logs-warm.log", + "sha256": "3bb2b42061a7435777e5da7036e5b1a013231acf646bac568661e456cf8f4352", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 9.96s" + ] + }, + { + "label": "1-base-build-logs", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.358692736830562, + "exit_code": 0, + "measured": true, + "log": "1-base-build-logs.log", + "sha256": "5c754946db2e4a4e7d5767d086ef6c329f4ec1bf69b19c28d0faf358f1d8022d", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.26s" + ] + }, + { + "label": "1-base-check-console-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 42.85614948510192, + "exit_code": 0, + "measured": false, + "log": "1-base-check-console-warm.log", + "sha256": "14018a257fd5952a84569078df24c80ad4a7fd4a0121cf44713653d7f488484d", + "results": [], + "tail": [ + " Checking sha2 v0.10.9", + " Checking rand_pcg v0.10.2", + " Checking sysinfo v0.38.4", + " Checking axoasset v2.0.1", + " Checking shlex v2.0.1", + " Checking axoupdater v0.10.2", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 42.77s" + ] + }, + { + "label": "1-base-check-console", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.158094743033871, + "exit_code": 0, + "measured": true, + "log": "1-base-check-console.log", + "sha256": "d4b41ffdadf71e98bf97eae394569085da68735f17836d2fa1100d3a2936f8b0", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.06s" + ] + }, + { + "label": "1-base-check-ticket-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.592291609849781, + "exit_code": 0, + "measured": false, + "log": "1-base-check-ticket-warm.log", + "sha256": "029637621aa10c706baaa0db5a11c921fa1b8f4983f79010dd07aac5a661196d", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.49s" + ] + }, + { + "label": "1-base-check-ticket", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.397836423013359, + "exit_code": 0, + "measured": true, + "log": "1-base-check-ticket.log", + "sha256": "8241b9e5b19a810afd50dcb811a9dad016626d2513b655806b1ab32c18e27b01", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.29s" + ] + }, + { + "label": "1-base-check-logs-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.318260596133769, + "exit_code": 0, + "measured": false, + "log": "1-base-check-logs-warm.log", + "sha256": "37335ae94f4f0930e8ea499c83ca07ae6101ab6134a732281f5ae0ed5c107ef5", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.22s" + ] + }, + { + "label": "1-base-check-logs", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.1024072950240225, + "exit_code": 0, + "measured": true, + "log": "1-base-check-logs.log", + "sha256": "b099c22328b69ff15253e529eb160b2825872383f9a7b429e234737ec12ec374", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-eus7oh1h/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.01s" + ] + }, + { + "label": "1-base-cold-test", + "command": [ + "cargo", + "test", + "--locked", + "--no-run" + ], + "seconds": 211.84992742305622, + "exit_code": 0, + "measured": true, + "log": "1-base-cold-test.log", + "sha256": "e74f087067984acba849398fc813608221dc6d24ac1d78711a3d2025a7d28f1d", + "results": [], + "tail": [ + " Executable tests/status.rs (/tmp/console-split-sample-eus7oh1h/test-target/debug/deps/status-23706d37f75b4cee)", + " Executable tests/stop.rs (/tmp/console-split-sample-eus7oh1h/test-target/debug/deps/stop-228bbed547257c95)", + " Executable tests/toolchain.rs (/tmp/console-split-sample-eus7oh1h/test-target/debug/deps/toolchain-2cadfea69558b418)", + " Executable tests/triage_run.rs (/tmp/console-split-sample-eus7oh1h/test-target/debug/deps/triage_run-3274fadaef7ae3ad)", + " Executable tests/trial.rs (/tmp/console-split-sample-eus7oh1h/test-target/debug/deps/trial-eb5275d7521e4351)", + " Executable tests/trial_scope.rs (/tmp/console-split-sample-eus7oh1h/test-target/debug/deps/trial_scope-44f4f7cb5a677446)", + " Executable tests/update.rs (/tmp/console-split-sample-eus7oh1h/test-target/debug/deps/update-db62f51fa23d64a4)", + " Executable tests/user_config.rs (/tmp/console-split-sample-eus7oh1h/test-target/debug/deps/user_config-39af28a3799f0115)" + ] + }, + { + "label": "1-split-fetch", + "command": [ + "cargo", + "fetch", + "--locked" + ], + "seconds": 0.3905407260172069, + "exit_code": 0, + "measured": false, + "log": "1-split-fetch.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "results": [], + "tail": [] + }, + { + "label": "1-split-cold-build", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 123.15242632594891, + "exit_code": 0, + "measured": true, + "log": "1-split-cold-build.log", + "sha256": "d16557fd84f6a318e17abc02d8be360d663c1ea3eeced1b1a8e64b558a8009a5", + "results": [], + "tail": [ + " Compiling rustls-platform-verifier v0.7.1", + " Compiling hyper-rustls v0.27.10", + " Compiling reqwest v0.13.5", + " Compiling axoasset v2.0.1", + " Compiling axoupdater v0.10.2", + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 03s" + ] + }, + { + "label": "1-split-build-console-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 0.32595442119054496, + "exit_code": 0, + "measured": false, + "log": "1-split-build-console-warm.log", + "sha256": "f2066ca264b9a8598ecd436c70919e1efe1acea4098ad2a13b5d82d67bc049ec", + "results": [], + "tail": [ + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.23s" + ] + }, + { + "label": "1-split-build-console", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 3.799856162862852, + "exit_code": 0, + "measured": true, + "log": "1-split-build-console.log", + "sha256": "a383c277eea8449c3c4ddab58555a29946374593858eb82ddb210dd8def2ae18", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.70s" + ] + }, + { + "label": "1-split-build-ticket-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 3.749783136881888, + "exit_code": 0, + "measured": false, + "log": "1-split-build-ticket-warm.log", + "sha256": "63fccc8517a084c264a16befaf39e92d9970aaf7fe0b80f45dbe03bf9c64930d", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.67s" + ] + }, + { + "label": "1-split-build-ticket", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.269467893987894, + "exit_code": 0, + "measured": true, + "log": "1-split-build-ticket.log", + "sha256": "72b53daea7787355c33f7f4a023f753b87ab1f5bb9f9a741ad23109e9c1a4af8", + "results": [], + "tail": [ + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.18s" + ] + }, + { + "label": "1-split-build-logs-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.800994063029066, + "exit_code": 0, + "measured": false, + "log": "1-split-build-logs-warm.log", + "sha256": "46099889532d33a2e8f2a5b2e3b9da48e9df1fc4c28213b9243eb3bcf9b4a7c4", + "results": [], + "tail": [ + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.71s" + ] + }, + { + "label": "1-split-build-logs", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.423510415945202, + "exit_code": 0, + "measured": true, + "log": "1-split-build-logs.log", + "sha256": "eb87a3ed0e9f24e45133d2ce4cd3c8ae2b589749a0ad98570751291819d4c9b7", + "results": [], + "tail": [ + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.33s" + ] + }, + { + "label": "1-split-check-console-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 40.81224228302017, + "exit_code": 0, + "measured": false, + "log": "1-split-check-console-warm.log", + "sha256": "b2ccb93b578a8063a13455d94673a31d71d1a28af54ed05ee63bc1c847c15cc6", + "results": [], + "tail": [ + " Checking rand_pcg v0.10.2", + " Checking sysinfo v0.38.4", + " Checking shlex v2.0.1", + " Checking axoasset v2.0.1", + " Checking axoupdater v0.10.2", + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 40.71s" + ] + }, + { + "label": "1-split-check-console", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 1.6412611759733409, + "exit_code": 0, + "measured": true, + "log": "1-split-check-console.log", + "sha256": "ace8d67eaaf3fa84544cab4c136bdd57aae6388b7deff6af1aa33a29a086e357", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.53s" + ] + }, + { + "label": "1-split-check-ticket-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 1.8816323280334473, + "exit_code": 0, + "measured": false, + "log": "1-split-check-ticket-warm.log", + "sha256": "42404411eda75d9ccb427182142caee1b0f1483a265676be3d478940017ed666", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.77s" + ] + }, + { + "label": "1-split-check-ticket", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 6.093268685974181, + "exit_code": 0, + "measured": true, + "log": "1-split-check-ticket.log", + "sha256": "a853bae317816f470ca7e980d2a8bfb694f52dbbdce95ceac99a0799e3229d8a", + "results": [], + "tail": [ + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.99s" + ] + }, + { + "label": "1-split-check-logs-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.365481252083555, + "exit_code": 0, + "measured": false, + "log": "1-split-check-logs-warm.log", + "sha256": "46a98879262d3c74f770443cafb0ea046d82120b6c97867c64e88e810ceedb98", + "results": [], + "tail": [ + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.26s" + ] + }, + { + "label": "1-split-check-logs", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.731756592169404, + "exit_code": 0, + "measured": true, + "log": "1-split-check-logs.log", + "sha256": "14552c0eae4ff8dde7ce90f8f877d1ae50f594df7084dc7ce066fc3e2a066b2c", + "results": [], + "tail": [ + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-n2zxbb9k/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.64s" + ] + }, + { + "label": "1-split-cold-test", + "command": [ + "cargo", + "test", + "--locked", + "--no-run" + ], + "seconds": 205.25460388092324, + "exit_code": 0, + "measured": true, + "log": "1-split-cold-test.log", + "sha256": "2e4d3035f224af87666f49cdb348a93cc06fd093edb69484d0aab822ba718cb0", + "results": [], + "tail": [ + " Executable tests/stop.rs (/tmp/console-split-sample-n2zxbb9k/test-target/debug/deps/stop-e70a72eacc7405d2)", + " Executable tests/toolchain.rs (/tmp/console-split-sample-n2zxbb9k/test-target/debug/deps/toolchain-3329b8d181d1475b)", + " Executable tests/triage_run.rs (/tmp/console-split-sample-n2zxbb9k/test-target/debug/deps/triage_run-f9ed968fcdfe0a76)", + " Executable tests/trial.rs (/tmp/console-split-sample-n2zxbb9k/test-target/debug/deps/trial-ebc4ca2f079c6030)", + " Executable tests/trial_scope.rs (/tmp/console-split-sample-n2zxbb9k/test-target/debug/deps/trial_scope-6761b04221703039)", + " Executable tests/update.rs (/tmp/console-split-sample-n2zxbb9k/test-target/debug/deps/update-37a52e06a1bbc56e)", + " Executable tests/user_config.rs (/tmp/console-split-sample-n2zxbb9k/test-target/debug/deps/user_config-174951824e751d2e)", + " Executable unittests ../src/core.rs (/tmp/console-split-sample-n2zxbb9k/test-target/debug/deps/thirdshift_core-f7308e67e3771bf6)" + ] + }, + { + "label": "2-split-fetch", + "command": [ + "cargo", + "fetch", + "--locked" + ], + "seconds": 0.3772190338931978, + "exit_code": 0, + "measured": false, + "log": "2-split-fetch.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "results": [], + "tail": [] + }, + { + "label": "2-split-cold-build", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 127.73571657994762, + "exit_code": 0, + "measured": true, + "log": "2-split-cold-build.log", + "sha256": "40cae3fc23d918db195ef008bbb739e1f26cf222b838bed269e1d85bfd2981ae", + "results": [], + "tail": [ + " Compiling rustls-platform-verifier v0.7.1", + " Compiling hyper-rustls v0.27.10", + " Compiling reqwest v0.13.5", + " Compiling axoasset v2.0.1", + " Compiling axoupdater v0.10.2", + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 07s" + ] + }, + { + "label": "2-split-build-console-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 0.28002017503604293, + "exit_code": 0, + "measured": false, + "log": "2-split-build-console-warm.log", + "sha256": "732186322402325172940531d8d6d7cfac85dc902585b2bef6715ad6839dacfd", + "results": [], + "tail": [ + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.20s" + ] + }, + { + "label": "2-split-build-console", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 4.058138331165537, + "exit_code": 0, + "measured": true, + "log": "2-split-build-console.log", + "sha256": "2cbce96e7973f9ea339f306d8343c05656dd1a0ce251bf8618edb955e14f0f14", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.97s" + ] + }, + { + "label": "2-split-build-ticket-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 3.81863581109792, + "exit_code": 0, + "measured": false, + "log": "2-split-build-ticket-warm.log", + "sha256": "d9b8df785a1a577c9ee1eaa175f60b686bb7351000b3546c7c7b9ca9548ced94", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.73s" + ] + }, + { + "label": "2-split-build-ticket", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.17585522402078, + "exit_code": 0, + "measured": true, + "log": "2-split-build-ticket.log", + "sha256": "a02f75e73623a07c5264a2964f96aaa1fe15ad0639eaacc3a4d24fff3a2a2f05", + "results": [], + "tail": [ + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.07s" + ] + }, + { + "label": "2-split-build-logs-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.533106398070231, + "exit_code": 0, + "measured": false, + "log": "2-split-build-logs-warm.log", + "sha256": "f9821c8c930abeb1f64c1fae7636fdcb27cbe9ddcbc12158259a577ef4a6cc60", + "results": [], + "tail": [ + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.44s" + ] + }, + { + "label": "2-split-build-logs", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 9.959745635045692, + "exit_code": 0, + "measured": true, + "log": "2-split-build-logs.log", + "sha256": "f60f5606b7ffb1977ea15d72dec66de6ac66d86da50b8e912c12d194785ce63b", + "results": [], + "tail": [ + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 9.86s" + ] + }, + { + "label": "2-split-check-console-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 40.995403982000425, + "exit_code": 0, + "measured": false, + "log": "2-split-check-console-warm.log", + "sha256": "462bfe3f9d87280c017ec756bbc4f3e51661f8a1a0087aefdca3a8504901bb7c", + "results": [], + "tail": [ + " Checking rand_pcg v0.10.2", + " Checking sysinfo v0.38.4", + " Checking shlex v2.0.1", + " Checking axoasset v2.0.1", + " Checking axoupdater v0.10.2", + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 40.91s" + ] + }, + { + "label": "2-split-check-console", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 1.5101710630115122, + "exit_code": 0, + "measured": true, + "log": "2-split-check-console.log", + "sha256": "48e29d7ef7f1e630ca2cd5708bb7141170f26eac99a708bbf4323251f135657a", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.40s" + ] + }, + { + "label": "2-split-check-ticket-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 1.532916228985414, + "exit_code": 0, + "measured": false, + "log": "2-split-check-ticket-warm.log", + "sha256": "613a8d95679c38b8933baa104388561daad4f6229034d1c95ab664bfb76b99a5", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.44s" + ] + }, + { + "label": "2-split-check-ticket", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.461886713048443, + "exit_code": 0, + "measured": true, + "log": "2-split-check-ticket.log", + "sha256": "59c4010395f67fd22b4420b2fc575e9db8117535acb7321095092d485c7e2619", + "results": [], + "tail": [ + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.38s" + ] + }, + { + "label": "2-split-check-logs-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.185969172976911, + "exit_code": 0, + "measured": false, + "log": "2-split-check-logs-warm.log", + "sha256": "2ca52b851e20b603733da9f6f34f34926ee19d40c30461ae1b65f3842f355f59", + "results": [], + "tail": [ + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.09s" + ] + }, + { + "label": "2-split-check-logs", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.195299902930856, + "exit_code": 0, + "measured": true, + "log": "2-split-check-logs.log", + "sha256": "cc317390f42df10b92b539c5b3b32fa9ebed1a7a9f9f7c92e0914f1d9e9485c3", + "results": [], + "tail": [ + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-8w6yxrf4/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.10s" + ] + }, + { + "label": "2-split-cold-test", + "command": [ + "cargo", + "test", + "--locked", + "--no-run" + ], + "seconds": 218.62805011705495, + "exit_code": 0, + "measured": true, + "log": "2-split-cold-test.log", + "sha256": "0e7d828c733844b0b697241cc3efacdf765d7989760d72ab7f9c30f42e5b9675", + "results": [], + "tail": [ + " Executable tests/stop.rs (/tmp/console-split-sample-8w6yxrf4/test-target/debug/deps/stop-e70a72eacc7405d2)", + " Executable tests/toolchain.rs (/tmp/console-split-sample-8w6yxrf4/test-target/debug/deps/toolchain-3329b8d181d1475b)", + " Executable tests/triage_run.rs (/tmp/console-split-sample-8w6yxrf4/test-target/debug/deps/triage_run-f9ed968fcdfe0a76)", + " Executable tests/trial.rs (/tmp/console-split-sample-8w6yxrf4/test-target/debug/deps/trial-ebc4ca2f079c6030)", + " Executable tests/trial_scope.rs (/tmp/console-split-sample-8w6yxrf4/test-target/debug/deps/trial_scope-6761b04221703039)", + " Executable tests/update.rs (/tmp/console-split-sample-8w6yxrf4/test-target/debug/deps/update-37a52e06a1bbc56e)", + " Executable tests/user_config.rs (/tmp/console-split-sample-8w6yxrf4/test-target/debug/deps/user_config-174951824e751d2e)", + " Executable unittests ../src/core.rs (/tmp/console-split-sample-8w6yxrf4/test-target/debug/deps/thirdshift_core-f7308e67e3771bf6)" + ] + }, + { + "label": "2-base-fetch", + "command": [ + "cargo", + "fetch", + "--locked" + ], + "seconds": 0.3706412159372121, + "exit_code": 0, + "measured": false, + "log": "2-base-fetch.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "results": [], + "tail": [] + }, + { + "label": "2-base-cold-build", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 124.4284968660213, + "exit_code": 0, + "measured": true, + "log": "2-base-cold-build.log", + "sha256": "8fec0a0782cd9b996e11b36eff492acf8c5c7eb68cab15b1346169244d8bc497", + "results": [], + "tail": [ + " Compiling tokio-rustls v0.26.5", + " Compiling rustls-platform-verifier v0.7.1", + " Compiling hyper-rustls v0.27.10", + " Compiling reqwest v0.13.5", + " Compiling axoasset v2.0.1", + " Compiling axoupdater v0.10.2", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 04s" + ] + }, + { + "label": "2-base-build-console-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 0.2593805349897593, + "exit_code": 0, + "measured": false, + "log": "2-base-build-console-warm.log", + "sha256": "299f16a2c523be18fef769975d2df00e0505521db047540feea3a74b94666887", + "results": [], + "tail": [ + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.18s" + ] + }, + { + "label": "2-base-build-console", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 9.898688009008765, + "exit_code": 0, + "measured": true, + "log": "2-base-build-console.log", + "sha256": "cfdeed828c28375fb52181f4bab9058fa34c8f6f965dbf0516bd9929a9484ad6", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 9.81s" + ] + }, + { + "label": "2-base-build-ticket-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 9.86579496297054, + "exit_code": 0, + "measured": false, + "log": "2-base-build-ticket-warm.log", + "sha256": "486aa87bad295df05fbccee9554dd1e3d1d4e14466ae5b1f5954f507ebd8ef7a", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 9.77s" + ] + }, + { + "label": "2-base-build-ticket", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.158662266097963, + "exit_code": 0, + "measured": true, + "log": "2-base-build-ticket.log", + "sha256": "ded1533a14ee3d290077f13fb0ccca5c20f92bf3189c48698d7f20fe6dcc41e7", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.05s" + ] + }, + { + "label": "2-base-build-logs-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.747198024997488, + "exit_code": 0, + "measured": false, + "log": "2-base-build-logs-warm.log", + "sha256": "cdf317f0ee1c2a6fbb6f549349225c81869d7e261113eeb6dc0a95a4c8f8c557", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.63s" + ] + }, + { + "label": "2-base-build-logs", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 9.926744937896729, + "exit_code": 0, + "measured": true, + "log": "2-base-build-logs.log", + "sha256": "fb54606d873805df82e50a7bb76047b0eb29d56220af10b06b3f8d1ca62e7ecc", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 9.82s" + ] + }, + { + "label": "2-base-check-console-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 43.53863262897357, + "exit_code": 0, + "measured": false, + "log": "2-base-check-console-warm.log", + "sha256": "8c7914f8fcb52760c4b829b862cb2a6acde957166bc1d098727d7dd13a7e04b8", + "results": [], + "tail": [ + " Checking sha2 v0.10.9", + " Checking rand_pcg v0.10.2", + " Checking sysinfo v0.38.4", + " Checking shlex v2.0.1", + " Checking axoasset v2.0.1", + " Checking axoupdater v0.10.2", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 43.45s" + ] + }, + { + "label": "2-base-check-console", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.480898613110185, + "exit_code": 0, + "measured": true, + "log": "2-base-check-console.log", + "sha256": "12fd14407505d346e3b6211ac3cb83632db63fa02ac010201004269b228d98a3", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.39s" + ] + }, + { + "label": "2-base-check-ticket-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.414096074877307, + "exit_code": 0, + "measured": false, + "log": "2-base-check-ticket-warm.log", + "sha256": "2e3c2ab1e0f3336a3f0664bea9191efb7070c388744dddc9ae97f3704a55490c", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.32s" + ] + }, + { + "label": "2-base-check-ticket", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.189596003852785, + "exit_code": 0, + "measured": true, + "log": "2-base-check-ticket.log", + "sha256": "74d99f289cc98fe8d498580a625200b269feebc558d7f5ecca329fc2783efd9d", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.09s" + ] + }, + { + "label": "2-base-check-logs-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.610406883060932, + "exit_code": 0, + "measured": false, + "log": "2-base-check-logs-warm.log", + "sha256": "72a3550feb68df6abf1d620574844975840725b1efc68b348fb70d0ba67eb05f", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.52s" + ] + }, + { + "label": "2-base-check-logs", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.222279976122081, + "exit_code": 0, + "measured": true, + "log": "2-base-check-logs.log", + "sha256": "b94453ee72f469435e28b94d9646bb5bbf24a8a0178de40e02b1e566778093f0", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-ajx277ds/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.13s" + ] + }, + { + "label": "2-base-cold-test", + "command": [ + "cargo", + "test", + "--locked", + "--no-run" + ], + "seconds": 195.3795442241244, + "exit_code": 0, + "measured": true, + "log": "2-base-cold-test.log", + "sha256": "547dd079c483e68432ea10abc6e14a32727fb1b99dd590697adb10ef6b81f663", + "results": [], + "tail": [ + " Executable tests/status.rs (/tmp/console-split-sample-ajx277ds/test-target/debug/deps/status-23706d37f75b4cee)", + " Executable tests/stop.rs (/tmp/console-split-sample-ajx277ds/test-target/debug/deps/stop-228bbed547257c95)", + " Executable tests/toolchain.rs (/tmp/console-split-sample-ajx277ds/test-target/debug/deps/toolchain-2cadfea69558b418)", + " Executable tests/triage_run.rs (/tmp/console-split-sample-ajx277ds/test-target/debug/deps/triage_run-3274fadaef7ae3ad)", + " Executable tests/trial.rs (/tmp/console-split-sample-ajx277ds/test-target/debug/deps/trial-eb5275d7521e4351)", + " Executable tests/trial_scope.rs (/tmp/console-split-sample-ajx277ds/test-target/debug/deps/trial_scope-44f4f7cb5a677446)", + " Executable tests/update.rs (/tmp/console-split-sample-ajx277ds/test-target/debug/deps/update-db62f51fa23d64a4)", + " Executable tests/user_config.rs (/tmp/console-split-sample-ajx277ds/test-target/debug/deps/user_config-39af28a3799f0115)" + ] + }, + { + "label": "3-base-fetch", + "command": [ + "cargo", + "fetch", + "--locked" + ], + "seconds": 0.42500041984021664, + "exit_code": 0, + "measured": false, + "log": "3-base-fetch.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "results": [], + "tail": [] + }, + { + "label": "3-base-cold-build", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 124.08966106409207, + "exit_code": 0, + "measured": true, + "log": "3-base-cold-build.log", + "sha256": "628c7498a08eb967c4941eefc58623123a361aaecdae34149f77df0ce191c518", + "results": [], + "tail": [ + " Compiling tokio-rustls v0.26.5", + " Compiling rustls-platform-verifier v0.7.1", + " Compiling hyper-rustls v0.27.10", + " Compiling reqwest v0.13.5", + " Compiling axoasset v2.0.1", + " Compiling axoupdater v0.10.2", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 03s" + ] + }, + { + "label": "3-base-build-console-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 0.3392593050375581, + "exit_code": 0, + "measured": false, + "log": "3-base-build-console-warm.log", + "sha256": "5604fc8f0c276397a55db4bd7008236712075c0ad37d3b3a0f1fe362b1b85a36", + "results": [], + "tail": [ + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.24s" + ] + }, + { + "label": "3-base-build-console", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 11.141940830973908, + "exit_code": 0, + "measured": true, + "log": "3-base-build-console.log", + "sha256": "4158fb19dd1d4185dd9dced4a4c260c2677819190f71295c611cbc71cc427ac7", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 11.03s" + ] + }, + { + "label": "3-base-build-ticket-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.094758844003081, + "exit_code": 0, + "measured": false, + "log": "3-base-build-ticket-warm.log", + "sha256": "afc17ef497e1e44e1f42c6a87d0ccf0fe7ee7e34b9b70e495f9a858dcbc6f4c0", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.00s" + ] + }, + { + "label": "3-base-build-ticket", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.507518727099523, + "exit_code": 0, + "measured": true, + "log": "3-base-build-ticket.log", + "sha256": "af05a7cf42e20b5fe2e9b79726b706487dd35724c9155ba955bba24ce0e84983", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.41s" + ] + }, + { + "label": "3-base-build-logs-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.53999689500779, + "exit_code": 0, + "measured": false, + "log": "3-base-build-logs-warm.log", + "sha256": "a61320a34f1a9f5ad87ee5cd0d991d4d0d57a061a70bc93af7b2e9d6299589aa", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.45s" + ] + }, + { + "label": "3-base-build-logs", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.384086800972, + "exit_code": 0, + "measured": true, + "log": "3-base-build-logs.log", + "sha256": "c0310eeffa43d05289955f7d9ed1208bb4a8b83351f19c5e3ada8510a4b25154", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.29s" + ] + }, + { + "label": "3-base-check-console-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 45.550987208029255, + "exit_code": 0, + "measured": false, + "log": "3-base-check-console-warm.log", + "sha256": "aafc4691a7ee40631ff0df147530d7b819779ab23a596b97baf269ba3e500361", + "results": [], + "tail": [ + " Checking sha2 v0.10.9", + " Checking rand_pcg v0.10.2", + " Checking axoasset v2.0.1", + " Checking sysinfo v0.38.4", + " Checking shlex v2.0.1", + " Checking axoupdater v0.10.2", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 45.46s" + ] + }, + { + "label": "3-base-check-console", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.3072463921271265, + "exit_code": 0, + "measured": true, + "log": "3-base-check-console.log", + "sha256": "90486cb88d49e273ea0db594b6fe1c146aff160a52671eac250db30d466a0900", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.21s" + ] + }, + { + "label": "3-base-check-ticket-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.665175127098337, + "exit_code": 0, + "measured": false, + "log": "3-base-check-ticket-warm.log", + "sha256": "38cc7f9a38f9c85f78848bb3a4280c9afa2df28b28dedbb5abc99d8b5f2aea64", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.56s" + ] + }, + { + "label": "3-base-check-ticket", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.63439327199012, + "exit_code": 0, + "measured": true, + "log": "3-base-check-ticket.log", + "sha256": "053b0c195c497cf411126e1ff3d3a9cc3158312ad5b186d6618311eb7f5fe2c0", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.53s" + ] + }, + { + "label": "3-base-check-logs-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.395151315955445, + "exit_code": 0, + "measured": false, + "log": "3-base-check-logs-warm.log", + "sha256": "e15a902913a1693635a2796b1d9f8574865d3ed8a7aa65512bd6d073c5cd4aba", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.30s" + ] + }, + { + "label": "3-base-check-logs", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.410382946021855, + "exit_code": 0, + "measured": true, + "log": "3-base-check-logs.log", + "sha256": "e6d4767329b823e49ba8d66a7b5c182bc308ef7d1297345127496e7475212480", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-3gz64p72/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.31s" + ] + }, + { + "label": "3-base-cold-test", + "command": [ + "cargo", + "test", + "--locked", + "--no-run" + ], + "seconds": 206.14164773910306, + "exit_code": 0, + "measured": true, + "log": "3-base-cold-test.log", + "sha256": "e3943f7a23eb6f444da900bad55a985cf72190e22b9259ff483ba42595539246", + "results": [], + "tail": [ + " Executable tests/status.rs (/tmp/console-split-sample-3gz64p72/test-target/debug/deps/status-23706d37f75b4cee)", + " Executable tests/stop.rs (/tmp/console-split-sample-3gz64p72/test-target/debug/deps/stop-228bbed547257c95)", + " Executable tests/toolchain.rs (/tmp/console-split-sample-3gz64p72/test-target/debug/deps/toolchain-2cadfea69558b418)", + " Executable tests/triage_run.rs (/tmp/console-split-sample-3gz64p72/test-target/debug/deps/triage_run-3274fadaef7ae3ad)", + " Executable tests/trial.rs (/tmp/console-split-sample-3gz64p72/test-target/debug/deps/trial-eb5275d7521e4351)", + " Executable tests/trial_scope.rs (/tmp/console-split-sample-3gz64p72/test-target/debug/deps/trial_scope-44f4f7cb5a677446)", + " Executable tests/update.rs (/tmp/console-split-sample-3gz64p72/test-target/debug/deps/update-db62f51fa23d64a4)", + " Executable tests/user_config.rs (/tmp/console-split-sample-3gz64p72/test-target/debug/deps/user_config-39af28a3799f0115)" + ] + }, + { + "label": "3-split-fetch", + "command": [ + "cargo", + "fetch", + "--locked" + ], + "seconds": 0.38189411209896207, + "exit_code": 0, + "measured": false, + "log": "3-split-fetch.log", + "sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "results": [], + "tail": [] + }, + { + "label": "3-split-cold-build", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 124.12322617112659, + "exit_code": 0, + "measured": true, + "log": "3-split-cold-build.log", + "sha256": "af5f86fa66a327d86fd4b3861b8a75f56f77b5b467d7bf11d1c66b6bfd056ca0", + "results": [], + "tail": [ + " Compiling rustls-platform-verifier v0.7.1", + " Compiling hyper-rustls v0.27.10", + " Compiling reqwest v0.13.5", + " Compiling axoasset v2.0.1", + " Compiling axoupdater v0.10.2", + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-44if8gz1/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 2m 04s" + ] + }, + { + "label": "3-split-build-console-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 0.2746930359862745, + "exit_code": 0, + "measured": false, + "log": "3-split-build-console-warm.log", + "sha256": "732186322402325172940531d8d6d7cfac85dc902585b2bef6715ad6839dacfd", + "results": [], + "tail": [ + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 0.20s" + ] + }, + { + "label": "3-split-build-console", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 3.930190716171637, + "exit_code": 0, + "measured": true, + "log": "3-split-build-console.log", + "sha256": "b120cc332767a1c7542ebbb233fca9589eb491470024f90761cb03fbafec9314", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.83s" + ] + }, + { + "label": "3-split-build-ticket-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 3.85106619191356, + "exit_code": 0, + "measured": false, + "log": "3-split-build-ticket-warm.log", + "sha256": "c01e6bc308f33a53c89df9ec81d474d23b25efa87257d8ffd0db50ee986835d7", + "results": [], + "tail": [ + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 3.76s" + ] + }, + { + "label": "3-split-build-ticket", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.770621348870918, + "exit_code": 0, + "measured": true, + "log": "3-split-build-ticket.log", + "sha256": "19c8f870ae639bf87d55ba4ac22dfb8b6f46cb3b96b6ffa34287e907ce44001f", + "results": [], + "tail": [ + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-44if8gz1/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.68s" + ] + }, + { + "label": "3-split-build-logs-warm", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.701784441946074, + "exit_code": 0, + "measured": false, + "log": "3-split-build-logs-warm.log", + "sha256": "0d9ffdd713dfdf2f56e87a96b7991fca2a45b9173934bf53510dd0e4ea7150f1", + "results": [], + "tail": [ + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-44if8gz1/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.60s" + ] + }, + { + "label": "3-split-build-logs", + "command": [ + "cargo", + "build", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 10.305859681917354, + "exit_code": 0, + "measured": true, + "log": "3-split-build-logs.log", + "sha256": "39b1d388984c6eb798f4d4f62dbe9721a097fc02da7f3207a142dd8951ee4214", + "results": [], + "tail": [ + " Compiling thirdshift-core v0.24.1 (/tmp/console-split-sample-44if8gz1/tree/core)", + " Compiling thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 10.22s" + ] + }, + { + "label": "3-split-check-console-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 44.01966904103756, + "exit_code": 0, + "measured": false, + "log": "3-split-check-console-warm.log", + "sha256": "c994d5b86955837884094b648912a79d4f9dbee33a4cce48f14be7972b940a7e", + "results": [], + "tail": [ + " Checking rand_pcg v0.10.2", + " Checking sysinfo v0.38.4", + " Checking shlex v2.0.1", + " Checking axoasset v2.0.1", + " Checking axoupdater v0.10.2", + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-44if8gz1/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 43.93s" + ] + }, + { + "label": "3-split-check-console", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 1.4957590780686587, + "exit_code": 0, + "measured": true, + "log": "3-split-check-console.log", + "sha256": "4c2b6bfc461dcfeeee76f1f7f8133e8b51978f32cb4a4cf8dfaec7fe0cb3d28e", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.40s" + ] + }, + { + "label": "3-split-check-ticket-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 1.5938748819753528, + "exit_code": 0, + "measured": false, + "log": "3-split-check-ticket-warm.log", + "sha256": "020c013ececb0c42cbdb4241ef6b21d33e180bcd3dbab8cae3e51caca3c5d978", + "results": [], + "tail": [ + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 1.50s" + ] + }, + { + "label": "3-split-check-ticket", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.440238734008744, + "exit_code": 0, + "measured": true, + "log": "3-split-check-ticket.log", + "sha256": "30609de48c2768aec593089753d87aff3a8b87f97c637395f616fb5414fde241", + "results": [], + "tail": [ + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-44if8gz1/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.34s" + ] + }, + { + "label": "3-split-check-logs-warm", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.6666128758806735, + "exit_code": 0, + "measured": false, + "log": "3-split-check-logs-warm.log", + "sha256": "25d1829c361b934607fe5e54ef7335dbc23ce2cd688e4fb1ab5ba17a2820dbb9", + "results": [], + "tail": [ + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-44if8gz1/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.57s" + ] + }, + { + "label": "3-split-check-logs", + "command": [ + "cargo", + "check", + "--locked", + "--bin", + "thirdshift" + ], + "seconds": 5.466169682098553, + "exit_code": 0, + "measured": true, + "log": "3-split-check-logs.log", + "sha256": "e0325b7acfd08f0641ca4d574af2732baf45d5d50921e353e7b057d8b87fcd45", + "results": [], + "tail": [ + " Checking thirdshift-core v0.24.1 (/tmp/console-split-sample-44if8gz1/tree/core)", + " Checking thirdshift v0.24.1 (/tmp/console-split-sample-44if8gz1/tree)", + " Finished `dev` profile [unoptimized + debuginfo] target(s) in 5.37s" + ] + }, + { + "label": "3-split-cold-test", + "command": [ + "cargo", + "test", + "--locked", + "--no-run" + ], + "seconds": 205.9172803470865, + "exit_code": 0, + "measured": true, + "log": "3-split-cold-test.log", + "sha256": "15f5081933f9731f88daeac0f8e980d3ff8910f444fc1c95b16782c0252f4738", + "results": [], + "tail": [ + " Executable tests/stop.rs (/tmp/console-split-sample-44if8gz1/test-target/debug/deps/stop-e70a72eacc7405d2)", + " Executable tests/toolchain.rs (/tmp/console-split-sample-44if8gz1/test-target/debug/deps/toolchain-3329b8d181d1475b)", + " Executable tests/triage_run.rs (/tmp/console-split-sample-44if8gz1/test-target/debug/deps/triage_run-f9ed968fcdfe0a76)", + " Executable tests/trial.rs (/tmp/console-split-sample-44if8gz1/test-target/debug/deps/trial-ebc4ca2f079c6030)", + " Executable tests/trial_scope.rs (/tmp/console-split-sample-44if8gz1/test-target/debug/deps/trial_scope-6761b04221703039)", + " Executable tests/update.rs (/tmp/console-split-sample-44if8gz1/test-target/debug/deps/update-37a52e06a1bbc56e)", + " Executable tests/user_config.rs (/tmp/console-split-sample-44if8gz1/test-target/debug/deps/user_config-174951824e751d2e)", + " Executable unittests ../src/core.rs (/tmp/console-split-sample-44if8gz1/test-target/debug/deps/thirdshift_core-f7308e67e3771bf6)" + ] + } + ] +} diff --git a/prototypes/console-split/test_prepare.py b/prototypes/console-split/test_prepare.py new file mode 100644 index 000000000..cb1fec296 --- /dev/null +++ b/prototypes/console-split/test_prepare.py @@ -0,0 +1,62 @@ +"""Exercise the delivered split through its command-line interface.""" +import json +import io +from pathlib import Path +import subprocess +import tempfile +import tarfile +import unittest + +from prepare import BASE, REPO + + +HERE = Path(__file__).resolve().parent + + +class PrepareTests(unittest.TestCase): + def test_workspace_has_one_way_dependency_and_preserves_integration_tests(self): + with tempfile.TemporaryDirectory() as scratch: + tree = Path(scratch) / "split" + subprocess.run(["python3", str(HERE / "prepare.py"), str(tree)], check=True) + metadata = json.loads(subprocess.check_output( + ["cargo", "metadata", "--locked", "--no-deps", "--format-version", "1"], cwd=tree)) + packages = {p["name"]: p for p in metadata["packages"]} + self.assertEqual(set(packages), {"thirdshift", "thirdshift-core"}) + for package in packages.values(): + self.assertEqual(package["repository"], "https://github.com/JacobStephens2/thirdshift") + self.assertIn("thirdshift-core", {d["name"] for d in packages["thirdshift"]["dependencies"]}) + self.assertNotIn("thirdshift", {d["name"] for d in packages["thirdshift-core"]["dependencies"]}) + self.assertNotIn("mod console;", (tree / "src/core.rs").read_text()) + self.assertNotIn("pub fn parse(", (tree / "src/core_args.rs").read_text()) + self.assertIn("pub fn parse(", (tree / "src/args.rs").read_text()) + original = subprocess.check_output(["git", "archive", BASE, "tests"], cwd=REPO) + with tarfile.open(fileobj=io.BytesIO(original)) as archive: + for source in archive: + if source.isfile(): + self.assertEqual(archive.extractfile(source).read(), (tree / source.name).read_bytes()) + for root, kind in [("main.rs", "bin"), ("core.rs", "lib")]: + platform_root = Path(scratch) / root + platform_root.write_text((tree / "src" / root).read_text().replace('target_os = "linux"', "thirdshift_linux")) + for testing in [[], ["--test"]]: + command = ["rustc", "--edition=2024", "--crate-type", kind, + "--emit=metadata", "--error-format=json", *testing, + str(platform_root), "-o", str(Path(scratch) / "platform.rmeta")] + result = subprocess.run(command, capture_output=True, text=True) + self.assertNotEqual(result.returncode, 0) + messages = [json.loads(line) for line in result.stderr.splitlines()] + errors = [m["message"] for m in messages if m.get("level") in {"error", "warning"} + and not m["message"].startswith("aborting due to")] + self.assertEqual(errors, ["thirdshift supports Linux only. On macOS, run it inside an Ubuntu 24.04 Linux VM (such as Lima). On Windows, use WSL2."]) + + def test_refuses_nonempty_destination(self): + with tempfile.TemporaryDirectory() as scratch: + sentinel = Path(scratch) / "keep" + sentinel.write_text("keep") + result = subprocess.run(["python3", str(HERE / "prepare.py"), scratch], capture_output=True) + self.assertNotEqual(result.returncode, 0) + self.assertIn(b"destination must be empty", result.stderr) + self.assertEqual(sentinel.read_text(), "keep") + + +if __name__ == "__main__": + unittest.main() From 3e7d9ee675ad2cf3d4418ef93f65a661c5d48f28 Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 9 Nov 2026 18:34:41 -0500 Subject: [PATCH 2/3] Share pinned exports and correct reported suite total --- docs/research/console-core-split.md | 4 +++- prototypes/console-split/README.md | 2 +- prototypes/console-split/benchmark.py | 12 ++---------- prototypes/console-split/prepare.py | 8 +++++++- prototypes/console-split/test_report.py | 26 +++++++++++++++++++++++++ 5 files changed, 39 insertions(+), 13 deletions(-) create mode 100644 prototypes/console-split/test_report.py diff --git a/docs/research/console-core-split.md b/docs/research/console-core-split.md index 28be17f60..0243cb139 100644 --- a/docs/research/console-core-split.md +++ b/docs/research/console-core-split.md @@ -142,11 +142,13 @@ after validation. All commands exited 0: | `cargo clippy --all-targets -- -D warnings` | 77.708 | Pass | | `cargo test --test evals replay_import_completes_trial_inputs_and_preserves_local_edits -- --exact` | 68.399 | 1 passed | | `cargo test --test packaging non_linux_compilation_reports_only_the_platform_error -- --exact` | 0.871 | 1 passed | -| `cargo test --no-fail-fast` | 2352.408 | 3930 passed, 0 failed, 91 ignored | +| `cargo test --no-fail-fast` | 2352.408 | 3927 passed, 0 failed, 91 ignored | The full-suite time includes remaining compilation. It covers both packages, all integration tests, Pickup's model checks and the library's doctest target (zero doctests). Ignored tests retain their original annotations. +Counts use the 97 top-level suite summaries; three nested fixture re-execution +summaries are excluded rather than counted again. `--no-fail-fast` changes failure reporting, not test selection. It allowed a complete view of all test targets in one run. diff --git a/prototypes/console-split/README.md b/prototypes/console-split/README.md index ed1306171..8226339c7 100644 --- a/prototypes/console-split/README.md +++ b/prototypes/console-split/README.md @@ -62,7 +62,7 @@ enables core's `test-support` feature. Integration tests remain byte for byte unchanged. Core preserves the package version and repository metadata used by runtime behavior. Dependency versions, linker and build profiles are unchanged. -The script's output contract has a small independent check: +The export contract and the report's top-level suite count have independent checks: ```sh python3 -m unittest discover -s prototypes/console-split -p 'test_*.py' diff --git a/prototypes/console-split/benchmark.py b/prototypes/console-split/benchmark.py index e13ac2501..4bcc5a3be 100644 --- a/prototypes/console-split/benchmark.py +++ b/prototypes/console-split/benchmark.py @@ -12,7 +12,7 @@ import tempfile import time -from prepare import BASE, REPO, prepare +from prepare import BASE, REPO, export_base, prepare EDITS = {"console": "src/console/commands.rs", "ticket": "src/run.rs", "logs": "src/logs.rs"} @@ -135,15 +135,7 @@ def main(): if layout == "split": prepare(tree) else: - # prepare's archive extraction without applying its split. - tree.mkdir() - archive = scratch / "base.tar" - with archive.open("wb") as stream: - subprocess.run(["git", "archive", "--format=tar", BASE], cwd=REPO, stdout=stream, check=True) - import tarfile - with tarfile.open(archive) as contents: - contents.extractall(tree, filter="data") - archive.unlink() + export_base(tree) # Download and registry setup are excluded from the timed regions. runner.command(tree, scratch / "fetch-target", f"{sample}-{layout}-fetch", ["cargo", "fetch", "--locked"]) runner.sample(tree, scratch, sample, layout) diff --git a/prototypes/console-split/prepare.py b/prototypes/console-split/prepare.py index 9ac288762..a1d94ecf6 100644 --- a/prototypes/console-split/prepare.py +++ b/prototypes/console-split/prepare.py @@ -139,7 +139,8 @@ def split(tree): subprocess.run(["cargo", "fmt", "--all"], cwd=tree, check=True) -def prepare(destination): +def export_base(destination): + """Export only committed Base sources into a new or empty directory.""" destination = Path(destination).resolve() if destination.exists() and (not destination.is_dir() or any(destination.iterdir())): raise ValueError("destination must be empty") @@ -150,6 +151,11 @@ def prepare(destination): archive.seek(0) with tarfile.open(fileobj=archive) as contents: contents.extractall(destination, filter="data") + return destination + + +def prepare(destination): + destination = export_base(destination) split(destination) print(destination) diff --git a/prototypes/console-split/test_report.py b/prototypes/console-split/test_report.py new file mode 100644 index 000000000..3b21403f1 --- /dev/null +++ b/prototypes/console-split/test_report.py @@ -0,0 +1,26 @@ +"""Keep the published suite count consistent with the recorded Cargo results.""" +import json +from pathlib import Path +import re +import unittest + + +ROOT = Path(__file__).resolve().parents[2] + + +class ReportTests(unittest.TestCase): + def test_suite_count_excludes_nested_fixture_runs(self): + report = (ROOT / "docs/research/console-core-split.md").read_text() + reported = int(re.search( + r'\| `cargo test --no-fail-fast` \| [^|]+ \| (\d+) passed', report).group(1)) + data = json.loads((ROOT / "prototypes/console-split/results.json").read_text()) + run = next(row for row in data["runs"] if row["label"] == "validation-test") + counts = [tuple(map(int, re.search( + r'(\d+) passed; (\d+) failed; (\d+) ignored; (\d+) measured; (\d+) filtered out', + line).groups())) for line in run["results"]] + actual = sum(row[0] for row in counts if row[4] == 0) + self.assertEqual(reported, actual, "nested subprocess summaries must not be counted twice") + + +if __name__ == "__main__": + unittest.main() From 5a354afeeee2668f5d10ca3099cfc952493247b5 Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Mon, 9 Nov 2026 19:58:03 -0500 Subject: [PATCH 3/3] Register Console split report checks with affected-tests The branch added a report test that reads docs/research/console-core-split.md without registering that input, causing the repository documentation dependency guard to fail in CI. Select the prototype Python tests for report edits and retain the full Rust suite for prototype source edits. Add CLI regression coverage and document the selection. Validation: 55 Python tooling tests, 3 prototype tests, the release generator check, and scripts/affected-tests origin/main (3927 Rust tests passed). --- docs/testing.md | 7 +++++-- scripts/affected-tests | 7 ++++++- scripts/test_affected_tests.py | 17 +++++++++++++++++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/docs/testing.md b/docs/testing.md index ca41629f8..67c0884da 100644 --- a/docs/testing.md +++ b/docs/testing.md @@ -32,8 +32,10 @@ PASS cargo nextest run (42.15s; log: /checkout/.affected-tests/cargo-nextest-run | --- | --- | | `prototype/go/**` only | `go test ./...` from `prototype/go/`; no Rust suite | | `prototypes/typescript/**` | `bun run --cwd prototypes/typescript typecheck` (`tsc --noEmit`), then `bun test --cwd prototypes/typescript`; requires Python 3.11 and `bun install --frozen-lockfile` in that directory first; Chromium setup is in the prototype README | +| `prototypes/console-split/**` | `python3 -m unittest discover -s prototypes/console-split -p 'test_*.py'` and the full Rust suite | +| `docs/research/console-core-split.md` | The Console/core prototype's Python tests | | `site/**`, `docs/guide.md` | `npm test --prefix site`; `cargo test --test share_card --test site_deploy`; `cargo test --bin thirdshift prompts_page` | -| `docs/**/*.md`, `GLOSSARY.md`, `CODING_STANDARDS.md` | No checks; prints `No checks for docs-only ''.` Exceptions: `docs/guide.md` and `GLOSSARY.md` select the site checks; `docs/experiment-results.md`, `docs/adr/0026-each-console-serves-an-api-that-can-do-what-the-cli-can.md` and `docs/research/go-vs-rust-prototype.md` retain the full Rust suite. Non-Markdown files under `docs/` retain the full suite. | +| `docs/**/*.md`, `GLOSSARY.md`, `CODING_STANDARDS.md` | No checks; prints `No checks for docs-only ''.` Exceptions: `docs/guide.md` and `GLOSSARY.md` select the site checks; `docs/research/console-core-split.md` selects the prototype's Python tests; `docs/experiment-results.md`, `docs/adr/0026-each-console-serves-an-api-that-can-do-what-the-cli-can.md` and `docs/research/go-vs-rust-prototype.md` retain the full Rust suite. Non-Markdown files under `docs/` retain the full suite. | | `console/**`: the Console browser tests, their fixtures and packages | Console browser tests: `cargo build --locked`, then `npm test --prefix console` | | `src/console.rs`, `src/console/**` (including templates and served assets), `src/config/console.rs`, `src/config/console/**`, and the shared fixtures the Console browser tests read: `tests/console/scoring_fixture.py`, `tests/fixtures/waterfall-{logs,spans}.jsonl` | Console browser tests and the full Rust suite | | `scripts/release*`, `scripts/generate-release.py`, `scripts/test_generate_release.py` | `cargo test --test release`; `python3 -m unittest discover -s scripts -p test_generate_release.py` | @@ -50,7 +52,8 @@ independently, without broadening the existing areas' Rust selection. See the Docs without consumers add no checks when mixed with other areas. The selector's `DOC_CHECKS` exception list preserves checks for Markdown read by code: the manual and glossary by the site tests, the experiment result format and Console -API ADR by Rust tests, and the Go comparison by the prototype's benchmark test. +API ADR by Rust tests, the Go comparison by the prototype's benchmark test, and +the Console/core comparison by the prototype's report test. `scripts/test_affected_tests.py` scans repository code for literal references to existing Markdown inputs and fails with the referencing file and doc path when an exception is missing. Add new inputs to `DOC_CHECKS` with their checks. The diff --git a/scripts/affected-tests b/scripts/affected-tests index cf9b3015d..6052e6595 100755 --- a/scripts/affected-tests +++ b/scripts/affected-tests @@ -23,6 +23,7 @@ DOC_CHECKS = { b"docs/experiment-results.md": "full", b"docs/adr/0026-each-console-serves-an-api-that-can-do-what-the-cli-can.md": "full", b"docs/research/go-vs-rust-prototype.md": "full", + b"docs/research/console-core-split.md": "console-split", } @@ -91,6 +92,8 @@ def main(): areas.add("go") elif path.startswith(b"prototypes/typescript/"): typescript = True + elif path.startswith(b"prototypes/console-split/"): + areas.update({"console-split", "full"}) elif path.startswith((b"src/console/", b"src/config/console/")) or path in { b"src/console.rs", b"src/config/console.rs", b"tests/console/scoring_fixture.py", b"tests/fixtures/waterfall-logs.jsonl", b"tests/fixtures/waterfall-spans.jsonl", @@ -115,10 +118,12 @@ def main(): else: areas.add("full") print(f"Conservative full-suite selection for {os.fsdecode(path)!r}.", flush=True) - rust_areas = areas - {"go"} + rust_areas = areas - {"go", "console-split"} full = "full" in rust_areas or len(rust_areas) > 1 if "go" in areas: run("go", "test", "./...", cwd="prototype/go") + if "console-split" in areas: + run("python3", "-m", "unittest", "discover", "-s", "prototypes/console-split", "-p", "test_*.py") if typescript: run("bun", "run", "--cwd", "prototypes/typescript", "typecheck") run("bun", "test", "--cwd", "prototypes/typescript") diff --git a/scripts/test_affected_tests.py b/scripts/test_affected_tests.py index 1f73f7062..bab038e4c 100644 --- a/scripts/test_affected_tests.py +++ b/scripts/test_affected_tests.py @@ -364,6 +364,23 @@ def test_docs_consumers_and_non_markdown_keep_checks(self): _, calls = self.select_for_only(path) self.assertEqual(calls, [["cargo", "nextest", "run"]]) + def test_console_split_report_runs_its_consumers_checks(self): + _, calls = self.select_for_only("docs/research/console-core-split.md") + self.assertEqual(calls, [ + ["python3", "-m", "unittest", "discover", "-s", "prototypes/console-split", "-p", "test_*.py"], + ]) + + def test_console_split_sources_add_checks_and_keep_the_full_rust_suite(self): + for path in ["prototypes/console-split/prepare.py", + "prototypes/console-split/test_report.py", + "prototypes/console-split/results.json"]: + with self.subTest(path=path): + _, calls = self.select_for_only(path) + self.assertEqual(calls, [ + ["python3", "-m", "unittest", "discover", "-s", "prototypes/console-split", "-p", "test_*.py"], + ["cargo", "nextest", "run"], + ]) + def test_glossary_gets_its_site_consumers_checks(self): _, calls = self.select_for_only("GLOSSARY.md") self.assertEqual(calls, [