flightopsDocumentation
Guides

Portable reproduction packages

4 min readdocs/REPRODUCTION-PACKAGES.md (source repository)

flightops-tui reproduction creates and verifies bounded local evidence directories. Opening a package starts no process and makes no network request. Source artifacts keep their original bytes and relative layout.

Create a review package

Create a JSON specification beside the selected evidence. For example:

json
{
  "schema": "flightops.reproduction-spec/0",
  "artifacts": [
    {"id": "task", "path": "task.json"},
    {"id": "attempts", "path": "checks"},
    {"id": "mesh", "state": "external", "reason": "Licensed resource not included"}
  ],
  "context": {"purpose": "Review the retained original failure and candidate attempts"},
  "unresolved_dependencies": ["Full simulator asset closure has not been established"]
}

Paths resolve relative to the specification. Directory artifacts are explicit allowlists of their bounded contents; references inside task/proof JSON are not automatically followed. Include referenced recordings and check directories explicitly.

sh
flightops-tui reproduction preview package-spec.json
flightops-tui reproduction create package-spec.json --output review-package
flightops-tui reproduction verify review-package
flightops-tui reproduction preflight review-package

review-package/index.html opens offline and links the selected artifacts. manifest.json contains hashes, sizes, original source paths, omissions and runtime requirements. Source JSON is never rewritten to change its artifact paths: the transport manifest maps paths while preserved child bundles retain their own layout. New packages retain executable intent for scripts, using normalized 0755 modes for executable files and 0644 for data. Verification detects changed executable permissions; special permission bits are not transported. Older manifests remain readable with their original bytes-only verification contract. Move the directory to another machine and run verify there. A verification report can also be saved as JSON and opened with flightops-results.

The preview is read-only. Creation uses a staged destination and refuses replacement. Symlink sources, traversal, special files, changing inputs and oversized inventories are refused. Limits are 128 selected artifacts, 2,048 files and 4 MiB of manifest JSON, plus LCC_MAX_ARTIFACT_BYTES, LCC_MAX_BUNDLE_BYTES and LCC_MIN_FREE_BYTES. Space checks include the estimated copied bytes and the retained free-space reserve. An interrupted copy does not replace an existing package or delete source evidence.

An explicit simulation rerun

An optional invocation describes a supported call to the existing paired simulation runner. It contains no arbitrary shell command. Its fields are:

FieldMeaning
kindExactly simulation.
baseline, candidateFull 40-character committed source revisions.
scenarioIncluded package-relative scenario path, such as files/judge/scenario.yaml.
readinessOptional included package-relative readiness JSON.
seedsTwo to 32 distinct bounded integer seeds.
config_sha256Exact identity of the receiving repository's .launchcommit.yaml.
environmentRequired values for ros_distro, rmw_implementation and/or machine.

Run preflight with an explicitly chosen local repository:

sh
flightops-tui reproduction preflight review-package --repo /absolute/project
flightops-tui reproduction rerun review-package \
  --repo /absolute/project --output /absolute/new-rerun

Preflight verifies packaged bytes, the clean source repository and committed revisions, build configuration identity, declared environment values, and local ROS/Gazebo/colcon availability. Unresolved dependencies and unfulfilled artifacts block execution. --resource ID=PATH can verify external bytes during preflight; it does not install them into the project or establish that the simulator loaded them. Such resources still require explicit project integration and a corrected inventory before rerun.

The new rerun directory records reproduction-source.json before execution, the normal runner artifacts in execution/, and a separate reproduction outcome. Failures and interruptions remain retained. Output inside the imported package is refused. Reusing an output path is refused. The existing runner still owns gate, scenario, cancellation and cleanup semantics.

What these results establish

verified means included bytes match this manifest. ready means the explicit preflight requirements passed. Neither means that a rerun succeeded, a failure was reproduced, all transitive dependencies were discovered, or the producer is authentic. The artifact inventory is an explicit allowlist with a stated scope; callers cannot turn an incomplete inventory into certified dependency closure.

Simulation reruns retain their original execution/assurance distinctions. Comparison records remain assurance: none. The saved viewer shows the recorded verification result and does not silently re-read artifacts or upgrade its freshness.

The current implementation supports directory packages and local simulation invocations. Archive extraction, automatic dependency acquisition, remote upload, hardware execution and independently authenticated producers are not implemented. Test portability on a separate machine with its own installed dependencies before treating a package as independently reproducible.