{
  "schema_version": 1,
  "task": "jdp-tess-repro-check",
  "description": "SHA-256 manifest for the deterministic TESS-generated artifacts. Paths are relative to the repository root. The command field is the documented command that produces the artifact; the regen field gives the explicit-output command used by --regen under .scratch/repro/. A null regen means the artifact is digest-checked only, and digest_only_reason says why.",
  "artifacts": [
    {
      "id": "toy-transit-csv",
      "path": "research/tess-timing/data/transit-fit-run/synthetic_transit.csv",
      "sha256": "a524ef7f6dafddd840ff7aa028972f50157568c0e445c369aaca28b695b7f177",
      "command": "python research/tess-timing/scripts/toy_transit_fit.py",
      "regen": {
        "command": "python research/tess-timing/scripts/toy_transit_fit.py --out-dir .scratch/repro/toy-transit",
        "path": ".scratch/repro/toy-transit/synthetic_transit.csv"
      },
      "digest_only_reason": null
    },
    {
      "id": "toy-transit-json",
      "path": "research/tess-timing/data/transit-fit-run/transit_fit.json",
      "sha256": "96acb792b0445f186e36cb25b3200e59c358b69c180ff548b16138941b131131",
      "command": "python research/tess-timing/scripts/toy_transit_fit.py",
      "regen": null,
      "digest_only_reason": "The JSON records the output CSV and figure paths, so a run into .scratch/repro writes different path strings. It is digest-checked instead of compared byte-for-byte."
    },
    {
      "id": "toy-transit-svg",
      "path": "docs/figures/transit-fit.svg",
      "sha256": "874f94f64fd6527d296af5cb777f3de93e72e200547344650cf0a182247d7838",
      "command": "python research/tess-timing/scripts/toy_transit_fit.py",
      "regen": {
        "command": "python research/tess-timing/scripts/toy_transit_fit.py --out-dir .scratch/repro/toy-transit",
        "path": ".scratch/repro/toy-transit/transit-fit.svg"
      },
      "digest_only_reason": null
    },
    {
      "id": "target-docket-json",
      "path": "research/tess-timing/data/target-docket/docket.json",
      "sha256": "795ba8140736a4c6fd1e5b6ebf715942cc3d29612c80ba655889dc6afa30f885",
      "command": "python research/tess-timing/scripts/make_target_docket.py",
      "regen": {
        "command": "python research/tess-timing/scripts/make_target_docket.py --json-out .scratch/repro/docket/docket.json --markdown-out .scratch/repro/docket/TESS-TARGET-DOCKET.md",
        "path": ".scratch/repro/docket/docket.json"
      },
      "digest_only_reason": null
    },
    {
      "id": "target-docket-markdown",
      "path": "docs/TESS-TARGET-DOCKET.md",
      "sha256": "a4a5198dc1f66ca23f5293c9d81c8a4021ffcc722254d97d7495592cf071f6b6",
      "command": "python research/tess-timing/scripts/make_target_docket.py",
      "regen": {
        "command": "python research/tess-timing/scripts/make_target_docket.py --json-out .scratch/repro/docket/docket.json --markdown-out .scratch/repro/docket/TESS-TARGET-DOCKET.md",
        "path": ".scratch/repro/docket/TESS-TARGET-DOCKET.md"
      },
      "digest_only_reason": null
    },
    {
      "id": "aperture-json",
      "path": "research/tess-timing/data/aperture-run/synthetic_tpf.json",
      "sha256": "366e66116a594d3443306a5fd9406413ab6f6c0c197b4afb167bc14260f1ac92",
      "command": "python research/tess-timing/scripts/aperture_photometry.py --fixture",
      "regen": null,
      "digest_only_reason": "The JSON records the output CSV, JSON, and SVG paths, so a run into .scratch/repro writes different path strings. It is digest-checked instead of compared byte-for-byte."
    },
    {
      "id": "aperture-svg",
      "path": "research/tess-timing/data/aperture-run/synthetic_tpf.svg",
      "sha256": "4ac04b492ee346f3f2f7d2b6c491bc9106a360e5f954cf6c9d055e6dc6533647",
      "command": "python research/tess-timing/scripts/aperture_photometry.py --fixture",
      "regen": {
        "command": "python research/tess-timing/scripts/aperture_photometry.py --fixture --fixture-dir .scratch/repro/aperture/fixtures --out-dir .scratch/repro/aperture",
        "path": ".scratch/repro/aperture/synthetic_tpf.svg"
      },
      "digest_only_reason": null
    },
    {
      "id": "lightcurve-json",
      "path": "research/tess-timing/data/lightcurve-run/synthetic_lightcurve.json",
      "sha256": "0e15ee73a559cffe06a653c884233d0bd85e6af0e7247202ad9cd98b13727a4f",
      "command": "python research/tess-timing/scripts/make_lightcurve.py --fits research/tess-timing/data/synthetic_lightcurve.fits",
      "regen": null,
      "digest_only_reason": "The JSON records the output CSV path, so a run into .scratch/repro writes a different path string. It is digest-checked instead of compared byte-for-byte."
    },
    {
      "id": "lightcurve-csv",
      "path": "research/tess-timing/data/lightcurve-run/synthetic_lightcurve.csv",
      "sha256": "57918e38abc5c218e7a740f7f78c01293810ff45f6023d3df290b9aed80d71c6",
      "command": "python research/tess-timing/scripts/make_lightcurve.py --fits research/tess-timing/data/synthetic_lightcurve.fits",
      "regen": {
        "command": "python research/tess-timing/scripts/make_lightcurve.py --fits research/tess-timing/data/synthetic_lightcurve.fits --out-dir .scratch/repro/lightcurve",
        "path": ".scratch/repro/lightcurve/synthetic_lightcurve.csv"
      },
      "digest_only_reason": null
    },
    {
      "id": "injection-json",
      "path": "research/tess-timing/data/injection-run/injection.json",
      "sha256": "6a998035cf26b5da974990c4e83147c54f9c335865799f2963c70a5ead9ec10a",
      "command": "python research/tess-timing/scripts/run_injection.py",
      "regen": null,
      "digest_only_reason": "The injection campaign takes about 160 seconds, so it is digest-checked rather than re-run because of its runtime. The committed runtime ledger pins the runtime so a repeat run is byte-identical, but the campaign is too slow for a routine check."
    },
    {
      "id": "injection-svg",
      "path": "research/tess-timing/data/injection-run/injection.svg",
      "sha256": "36822f766081120c680619c923934eb9c378263d5b41ccddaa75c2507cec6b14",
      "command": "python research/tess-timing/scripts/run_injection.py",
      "regen": null,
      "digest_only_reason": "The injection campaign takes about 160 seconds, so it is digest-checked rather than re-run because of its runtime. The committed runtime ledger pins the runtime so a repeat run is byte-identical, but the campaign is too slow for a routine check."
    },
    {
      "id": "real-run-acquisition",
      "path": "research/tess-timing/data/real-run/acquisition.json",
      "sha256": "2d3687f260356186af5faa84b816cd8a31f24c603ec9c0fc1973b2ceb2112760",
      "command": "python research/tess-timing/scripts/acquire_real_target.py",
      "regen": null,
      "digest_only_reason": "Acquisition requires a network request to MAST and the record stores a download timestamp, so an offline run cannot reproduce the committed bytes."
    },
    {
      "id": "real-run-manifest",
      "path": "research/tess-timing/data/real-run/manifest.jsonl",
      "sha256": "9a923148b6a24bb22a34b3d74878f61b8f1e7f9a1d8acbb8de693dffd279d937",
      "command": "python research/tess-timing/scripts/acquire_real_target.py",
      "regen": null,
      "digest_only_reason": "Acquisition requires a network request to MAST and the manifest stores download timestamps, so an offline run cannot reproduce the committed bytes."
    },
    {
      "id": "real-run-tpf",
      "path": "research/tess-timing/data/real-run/tpf.fits",
      "sha256": "2b5bd6ee4747cfe0c5405c869b871064fd74e4b5f0521c4e6be9fdc2b5c96030",
      "command": "python research/tess-timing/scripts/acquire_real_target.py",
      "regen": null,
      "digest_only_reason": "The product is downloaded from MAST. This task is offline, the archive is not guaranteed to re-serve identical bytes, and no local generator writes the FITS product. The committed archive bytes are hashed instead."
    },
    {
      "id": "real-run-lightcurve",
      "path": "research/tess-timing/data/real-run/lightcurve.fits",
      "sha256": "1b76b4a4b73e24954fa6e29a7e28a174685113ecdbad1bf10ef0e7b766ce99e9",
      "command": "python research/tess-timing/scripts/acquire_real_target.py",
      "regen": null,
      "digest_only_reason": "The product is downloaded from MAST. This task is offline, the archive is not guaranteed to re-serve identical bytes, and no local generator writes the FITS product. The committed archive bytes are hashed instead."
    },
    {
      "id": "sector56-control-analysis",
      "path": "research/tess-timing/data/sector56-control-run/analysis.json",
      "sha256": "55a1ffe862e33a1e97192967b5aa5546d2a1ab61102d2120879ad5663dc71b84",
      "command": "python research/tess-timing/scripts/second_target_analysis.py",
      "regen": null,
      "digest_only_reason": "The documented command writes the KELT-11 b and sector 56 outputs to fixed committed paths and offers no output-path option. The record also embeds a generated_utc timestamp, so it cannot be reproduced byte-for-byte into another directory."
    },
    {
      "id": "sector56-control-folded",
      "path": "research/tess-timing/data/sector56-control-run/folded_lightcurve.csv",
      "sha256": "d5bec92c2070c56ab337b46853aca84ecb5aee49d8a20e1f861ad81602c598be",
      "command": "python research/tess-timing/scripts/second_target_analysis.py",
      "regen": null,
      "digest_only_reason": "The documented command writes the KELT-11 b and sector 56 outputs to fixed committed paths and offers no output-path option, so the folded CSV cannot be redirected into .scratch/repro for a byte comparison."
    },
    {
      "id": "real-run-2-acquisition",
      "path": "research/tess-timing/data/real-run-2/acquisition.json",
      "sha256": "680c5650970942a1449d6588c1ff2179db00de64ee8d2feb7c29a8b944fa40b9",
      "command": "python research/tess-timing/scripts/acquire_second_target.py",
      "regen": null,
      "digest_only_reason": "Acquisition requires a network request to MAST and the record stores a download timestamp, so an offline run cannot reproduce the committed bytes."
    },
    {
      "id": "real-run-2-manifest",
      "path": "research/tess-timing/data/real-run-2/manifest.jsonl",
      "sha256": "cc6c52b87c8b1ddab83ae610deb9eb303379515d9de460edb0fdb0426f146a47",
      "command": "python research/tess-timing/scripts/acquire_second_target.py",
      "regen": null,
      "digest_only_reason": "Acquisition requires a network request to MAST and the manifest stores download timestamps, so an offline run cannot reproduce the committed bytes."
    },
    {
      "id": "real-run-2-tpf",
      "path": "research/tess-timing/data/real-run-2/tpf.fits",
      "sha256": "e140ac21aa7b7ba9439f31da20b138301e49cc00e555a52ca2856e33822be0f9",
      "command": "python research/tess-timing/scripts/acquire_second_target.py",
      "regen": null,
      "digest_only_reason": "The product is downloaded from MAST. This task is offline, the archive is not guaranteed to re-serve identical bytes, and no local generator writes the FITS product. The committed archive bytes are hashed instead."
    },
    {
      "id": "real-run-2-lightcurve",
      "path": "research/tess-timing/data/real-run-2/lightcurve.fits",
      "sha256": "5b3be4a757da818466ee92fca8dad3bb3558191e9df98c01a9ad6044ccc1582d",
      "command": "python research/tess-timing/scripts/acquire_second_target.py",
      "regen": null,
      "digest_only_reason": "The product is downloaded from MAST. This task is offline, the archive is not guaranteed to re-serve identical bytes, and no local generator writes the FITS product. The committed archive bytes are hashed instead."
    },
    {
      "id": "second-target-analysis",
      "path": "research/tess-timing/data/second-target-run/analysis.json",
      "sha256": "bc0ba5ef99aaeafd8733523b9415c89d19db7ca5f1656144c6534799c2e579c2",
      "command": "python research/tess-timing/scripts/second_target_analysis.py",
      "regen": null,
      "digest_only_reason": "The documented command writes the KELT-11 b and sector 56 outputs to fixed committed paths and offers no output-path option. The record also embeds a generated_utc timestamp, so it cannot be reproduced byte-for-byte into another directory."
    },
    {
      "id": "second-target-folded",
      "path": "research/tess-timing/data/second-target-run/folded_lightcurve.csv",
      "sha256": "507dfaa94ecf035e4cef06d1ce1682fec824088959409ce28dfb1d17d0bb5120",
      "command": "python research/tess-timing/scripts/second_target_analysis.py",
      "regen": null,
      "digest_only_reason": "The documented command writes the KELT-11 b and sector 56 outputs to fixed committed paths and offers no output-path option, so the folded CSV cannot be redirected into .scratch/repro for a byte comparison."
    },
    {
      "id": "real-lightcurve-diagnostics",
      "path": "research/tess-timing/data/real-lc-run/diagnostics.json",
      "sha256": "f8b54a638e235992661b139c0a98e090dbe5779befa658dd344e647aefc86d3e",
      "command": "python research/tess-timing/scripts/real_lightcurve_diagnostics.py",
      "regen": {
        "command": "python research/tess-timing/scripts/real_lightcurve_diagnostics.py --json-out .scratch/repro/real-lc/diagnostics.json --markdown-out .scratch/repro/real-lc/TESS-REAL-LIGHTCURVE.md",
        "path": ".scratch/repro/real-lc/diagnostics.json"
      },
      "digest_only_reason": null
    },
    {
      "id": "real-aperture-json",
      "path": "research/tess-timing/data/real-aperture-run/real_aperture.json",
      "sha256": "d917cafd8f12157ea3cee0997717b6693e4fe7e751a947d9d9f707d18954e482",
      "command": "python research/tess-timing/scripts/real_aperture.py",
      "regen": {
        "command": "python research/tess-timing/scripts/real_aperture.py --json-out .scratch/repro/real-aperture/real_aperture.json --csv-out .scratch/repro/real-aperture/real_aperture.csv --markdown-out .scratch/repro/real-aperture/TESS-REAL-APERTURE.md",
        "path": ".scratch/repro/real-aperture/real_aperture.json"
      },
      "digest_only_reason": null
    },
    {
      "id": "real-aperture-csv",
      "path": "research/tess-timing/data/real-aperture-run/real_aperture.csv",
      "sha256": "420c5b5dca85212c8ecac217bde28bd9acbb8372c5dd18647e9d7d08b8c69c8c",
      "command": "python research/tess-timing/scripts/real_aperture.py",
      "regen": {
        "command": "python research/tess-timing/scripts/real_aperture.py --json-out .scratch/repro/real-aperture/real_aperture.json --csv-out .scratch/repro/real-aperture/real_aperture.csv --markdown-out .scratch/repro/real-aperture/TESS-REAL-APERTURE.md",
        "path": ".scratch/repro/real-aperture/real_aperture.csv"
      },
      "digest_only_reason": null
    },
    {
      "id": "real-windows-json",
      "path": "research/tess-timing/data/real-windows-run/windows.json",
      "sha256": "707971643ab01be668b3c62a6cf685036e1baaf983461c975a80b8cf184bd675",
      "command": "python research/tess-timing/scripts/predict_real_windows.py",
      "regen": {
        "command": "python research/tess-timing/scripts/predict_real_windows.py --json-out .scratch/repro/real-windows/windows.json --markdown-out .scratch/repro/real-windows/TESS-REAL-WINDOWS.md",
        "path": ".scratch/repro/real-windows/windows.json"
      },
      "digest_only_reason": null
    },
    {
      "id": "real-window-qc-json",
      "path": "research/tess-timing/data/real-window-qc/windows.json",
      "sha256": "086037887739e64f4d8a0ca12d9b043d762507ff3be33ffc0382d97e278f3319",
      "command": "python research/tess-timing/scripts/real_window_qc.py",
      "regen": null,
      "digest_only_reason": "The command writes its three outputs to fixed committed paths and its --check mode recomputes only into a fixed .scratch/real-window-qc-check directory. It has no output-path option, so a re-run cannot be directed into .scratch/repro for a byte comparison."
    },
    {
      "id": "real-window-qc-csv",
      "path": "research/tess-timing/data/real-window-qc/windows.csv",
      "sha256": "cb50f6ca2c4e8d364450747c26935e7a7f10fc2920c7b1facf42f4d68820e587",
      "command": "python research/tess-timing/scripts/real_window_qc.py",
      "regen": null,
      "digest_only_reason": "The command writes its three outputs to fixed committed paths and its --check mode recomputes only into a fixed .scratch/real-window-qc-check directory. It has no output-path option, so a re-run cannot be directed into .scratch/repro for a byte comparison."
    },
    {
      "id": "real-detrend-json",
      "path": "research/tess-timing/data/real-detrend-run/detrend.json",
      "sha256": "96403cbb9e9bc3fd93b3b5e2f8a99349b066a9fadeca19240b5e37ea95674e11",
      "command": "python research/tess-timing/scripts/real_detrend.py",
      "regen": {
        "command": "python research/tess-timing/scripts/real_detrend.py --json-out .scratch/repro/real-detrend/detrend.json --csv-out .scratch/repro/real-detrend/detrend.csv --markdown-out .scratch/repro/real-detrend/TESS-REAL-DETREND.md",
        "path": ".scratch/repro/real-detrend/detrend.json"
      },
      "digest_only_reason": null
    },
    {
      "id": "real-detrend-csv",
      "path": "research/tess-timing/data/real-detrend-run/detrend.csv",
      "sha256": "3191e4073f075074e1a246341158c002ff1b32bb179bd0a583235b46f2ea9774",
      "command": "python research/tess-timing/scripts/real_detrend.py",
      "regen": {
        "command": "python research/tess-timing/scripts/real_detrend.py --json-out .scratch/repro/real-detrend/detrend.json --csv-out .scratch/repro/real-detrend/detrend.csv --markdown-out .scratch/repro/real-detrend/TESS-REAL-DETREND.md",
        "path": ".scratch/repro/real-detrend/detrend.csv"
      },
      "digest_only_reason": null
    },
    {
      "id": "real-injection-json",
      "path": "research/tess-timing/data/real-injection/injection.json",
      "sha256": "4333274ceaa556d91b830b6483b5ecb6698c9d958e26e6a8a05050f7cc07a6f8",
      "command": "python research/tess-timing/scripts/real_injection.py",
      "regen": {
        "command": "python research/tess-timing/scripts/real_injection.py --json .scratch/repro/real-injection/injection.json --markdown .scratch/repro/real-injection/TESS-REAL-INJECTION.md",
        "path": ".scratch/repro/real-injection/injection.json"
      },
      "digest_only_reason": null
    },
    {
      "id": "aperture-sweep-json",
      "path": "research/tess-timing/data/aperture-sweep/aperture_sweep.json",
      "sha256": "417c61114e75e6214221099ebd55d86412ec6c046622e0a30ad2cc5af0fb397e",
      "command": "python research/tess-timing/scripts/aperture_sensitivity.py",
      "regen": {
        "command": "python research/tess-timing/scripts/aperture_sensitivity.py --json .scratch/repro/aperture-sweep/aperture_sweep.json --csv .scratch/repro/aperture-sweep/aperture_sweep.csv --doc .scratch/repro/aperture-sweep/TESS-APERTURE-SENSITIVITY.md",
        "path": ".scratch/repro/aperture-sweep/aperture_sweep.json"
      },
      "digest_only_reason": null
    },
    {
      "id": "aperture-sweep-csv",
      "path": "research/tess-timing/data/aperture-sweep/aperture_sweep.csv",
      "sha256": "51dbfa2a35975f4aa127eea8dd69785103c9632907e12bc1910b352054387e4c",
      "command": "python research/tess-timing/scripts/aperture_sensitivity.py",
      "regen": {
        "command": "python research/tess-timing/scripts/aperture_sensitivity.py --json .scratch/repro/aperture-sweep/aperture_sweep.json --csv .scratch/repro/aperture-sweep/aperture_sweep.csv --doc .scratch/repro/aperture-sweep/TESS-APERTURE-SENSITIVITY.md",
        "path": ".scratch/repro/aperture-sweep/aperture_sweep.csv"
      },
      "digest_only_reason": null
    },
    {
      "id": "mask-perturbation-json",
      "path": "research/tess-timing/data/mask-perturbation/mask_perturbation.json",
      "sha256": "2ba517080c9378389d56a34bf738fc8efddfde1f390e4de47763dc91f3db9fe2",
      "command": "python research/tess-timing/scripts/mask_perturbation.py",
      "regen": {
        "command": "python research/tess-timing/scripts/mask_perturbation.py --json .scratch/repro/mask-perturbation/mask_perturbation.json --csv .scratch/repro/mask-perturbation/mask_perturbation.csv --doc .scratch/repro/mask-perturbation/TESS-MASK-PERTURBATION.md",
        "path": ".scratch/repro/mask-perturbation/mask_perturbation.json"
      },
      "digest_only_reason": null
    },
    {
      "id": "mask-perturbation-csv",
      "path": "research/tess-timing/data/mask-perturbation/mask_perturbation.csv",
      "sha256": "bdf21e505959200443792926dab07787fa433f2a3ebbc9b82d2d583632cfd91e",
      "command": "python research/tess-timing/scripts/mask_perturbation.py",
      "regen": {
        "command": "python research/tess-timing/scripts/mask_perturbation.py --json .scratch/repro/mask-perturbation/mask_perturbation.json --csv .scratch/repro/mask-perturbation/mask_perturbation.csv --doc .scratch/repro/mask-perturbation/TESS-MASK-PERTURBATION.md",
        "path": ".scratch/repro/mask-perturbation/mask_perturbation.csv"
      },
      "digest_only_reason": null
    },
    {
      "id": "limb-dilution-json",
      "path": "research/tess-timing/data/systematics-run/limb_dilution.json",
      "sha256": "ab746810c93f52ee7b7547a221f3edc82e920588cca9fb3b4374f11a32d490c3",
      "command": "python research/tess-timing/scripts/limb_dilution_sensitivity.py",
      "regen": {
        "command": "python research/tess-timing/scripts/limb_dilution_sensitivity.py --out .scratch/repro/limb-dilution/limb_dilution.json",
        "path": ".scratch/repro/limb-dilution/limb_dilution.json"
      },
      "digest_only_reason": null
    },
    {
      "id": "uncertainty-budget-json",
      "path": "research/tess-timing/data/uncertainty-budget.json",
      "sha256": "fbd40d6b60f202cb550b9f0be4f8c2d3421e0f27d1be37c3df388a9d4b0cfc47",
      "command": "python research/tess-timing/scripts/check_uncertainty_budget.py",
      "regen": null,
      "digest_only_reason": "No generator script in the repository writes this JSON. It is a hand-authored source map; check_uncertainty_budget.py only validates it against the committed records and writes no file, so there is no command to regenerate it."
    }
  ]
}
