{
  "schema": "bindsight-local-workflow-verification/1",
  "scope": "Real local API and CPU workflow execution; not biological or experimental validation.",
  "passed": true,
  "started_at": "2026-09-29T18:40:03.400173+00:00",
  "inputs": {
    "counts": {
      "bytes": 268162,
      "sha256": "ce5c5c6670707568b28a6e2ce561a05b708121f150ad1d093775a05d5503229c"
    },
    "design": {
      "bytes": 636,
      "sha256": "4f7e3fa2b16811d4e294ede695a777776846fa91caf247eeee43df93f44603a4"
    }
  },
  "comparison": {
    "factor": "condition",
    "numerator": "tumor",
    "denominator": "normal",
    "paired_by": "case_barcode",
    "fdr": 0.05,
    "log2fc": 1.0
  },
  "python": "3.13.14",
  "platform": {
    "system": "Windows",
    "machine": "AMD64"
  },
  "libraries": {
    "anndata": "0.12.19",
    "bindsight": "0.3.6",
    "biopython": "1.88",
    "fastapi": "0.141.1",
    "formulaic": "1.2.2",
    "formulaic-contrasts": "1.0.0",
    "h5py": "3.14.0",
    "httpx2": "2.13.1",
    "numcodecs": "0.16.5",
    "numpy": "2.2.6",
    "pandas": "2.3.2",
    "pyarrow": "23.0.1",
    "pydeseq2": "0.5.4",
    "scikit-learn": "1.7.2",
    "scipy": "1.16.3",
    "starlette": "1.7.0",
    "torch": null,
    "transformers": null,
    "zarr": "3.1.6"
  },
  "numeric_thread_environment": {
    "OMP_NUM_THREADS": null,
    "OPENBLAS_NUM_THREADS": null,
    "MKL_NUM_THREADS": null
  },
  "git_revision": "ff5694ec31df7786b7e89d0bd660ebfd6af6ffd9",
  "git_working_tree_dirty": true,
  "source_sha256": {
    "scripts/verify_local_workflow.py": "77f0ef529a30699d1c621c09030a3d744f2fabbe86234347de852370d034d28b",
    "pyproject.toml": "32df87707f63d816a7719f9eabc4bee4f02dabe7bc84c3d1614a7ac2ab97de0c",
    "bindsight/config.py": "b7affc65254a068cf167fa41517998a21d8be67a66ae813f8e697b5c3e54e3e4",
    "bindsight/deg/cache.py": "e30e94223804e9caf6fe2fc6224e5545b257956fb47149e65d794d9f2e3b6754",
    "bindsight/deg/pydeseq2_runner.py": "4f0753d8f3fddf42b4769b8448005b951d82f9d314e12e46717ec546b015ae46",
    "bindsight/deg/inference.py": "925e3b889a72139694c487dfd6d1442c4ac140293e61ba2f0d39a7595576c7d1",
    "bindsight/deg/diagnostics.py": "cb39a0abd15d27433d9646eb2cfbaa86d28838b29e9e2df1e3560d8fe457a17a",
    "bindsight/pipelines/discover.py": "3927929fa1e0508fa04283617f394bf47979bc841b2a1b66d37e1f5db733cf50",
    "bindsight/targets/open_targets.py": "c4a65730700a94b8d2134651981ddf309869a1daa4002b40737ffad3288a9983",
    "bindsight/targets/gtex.py": "23cca4059f6aab6a1f4026e1e872fc297254df7990a525b78cd07986c93b99d1",
    "bindsight/structures/topology.py": "9578359192193d0d51f0f7090218026dd85e09b31bb9a659caf0d762603e663b",
    "bindsight/structures/alphafolddb.py": "276e5bd525945ec4e9c2105d92fb85b7d86c4363ca7cf0c888d41cc54c4c6aa4",
    "bindsight/report/coverage.py": "760d8c56ad0fd79cc64b4b8471abf0009e0fc42b4542289cd0ff5870be4c05a9",
    "bindsight/report/fit_diagnostics.py": "c9047333c4e9775d55fc5d8ca774acb348027d2bd4d61a36c14f3bf39128dd9a",
    "bindsight/report/html.py": "76555c505c12dee7916ff5ed4387c372254f3fd00bfc95ffdff21c226e405164",
    "bindsight/report/templates/report.html.j2": "e0f3dbb0e19a6db5b5d3cc0595aeb64aeff0d852bce5fa00d42939d80c4a11f2",
    "bindsight/report/web/app.py": "c5b21adc21d46e348807cec840677e9b33029fd8146fd1545d7de5f2cb05c50d",
    "bindsight/report/web/workbench_routes.py": "1a79c4e3290f4c34b7f376ba0b9a58dbef3a6da7ad281255368b806037b36298",
    "bindsight/report/web/workspace.py": "a8ab157da8426695ddcb92372792bf66289aa3a25daf3a086c7be10ac79e4c05",
    "bindsight/report/web/resources.py": "1961082e71ed994ccfacfc91dd088dbe54ab8082ad293f93ba551265ce8d2b5c",
    "bindsight/report/web/gpu.py": "077c8a0de89be7d8498f8b39070c2147b1bdbc5acb6540688ff8fc3ad6a311f4",
    "bindsight/report/web/worker.py": "5888b8c7f2afb8b5539dc0c6c47a6f9b19b97d58f169fd2b16c842935dfd7365"
  },
  "states": [
    {
      "state": "running",
      "elapsed_seconds": 23.258
    },
    {
      "state": "completed",
      "elapsed_seconds": 421.866
    }
  ],
  "artifacts": {
    "report": {
      "http_status": 200,
      "bytes": 118425,
      "sha256": "3895717c987ca47cfef02bbb385210520b18f749cc7bbf314c2a7d29fae2a2fa"
    },
    "manifest": {
      "http_status": 200,
      "bytes": 20978,
      "sha256": "eabf068918af215bfbdc090981ff8fd08774177253c979abc4e87e9df112c4ba"
    },
    "candidates": {
      "http_status": 200,
      "bytes": 36487,
      "sha256": "b7123d62b9844e71c34ce300c6e0f94bb20c92485c110a0b854baf0c658d5679"
    },
    "deg": {
      "http_status": 200,
      "bytes": 992719,
      "sha256": "2fc585f42fe3c7aa7cbb337e95aca283924450dc374da614c20be08f89648898"
    },
    "config": {
      "http_status": 200,
      "bytes": 2246,
      "sha256": "2066829c53823b072da174fb68e59a49633a729bdda2da1fdb3d6800c5c0e19e"
    },
    "taxonomy": {
      "http_status": 200,
      "bytes": 386259,
      "sha256": "e035ad669ec83ed4326be66339cf29c9ae37ec3b1cea2e78c98e9244cf0f32b1"
    },
    "coverage": {
      "http_status": 200,
      "bytes": 149,
      "sha256": "1009e64142f40a5f16d75a02d4e72103742d593958cbde60768f0a647e02734b"
    },
    "fit_diagnostics": {
      "http_status": 200,
      "bytes": 1820,
      "sha256": "b871b8b61d930f62a1390803f8821a37d958198698ec9bce605115f35e8bb455"
    }
  },
  "input_check": {
    "genes": 19944,
    "samples": 6
  },
  "final_state": "completed",
  "design_handoff": {
    "recorded_targets": 5,
    "eligible_targets": 5,
    "scope": "Read-only target selection and provenance check; GPU design was not run."
  },
  "resource_admission": {
    "policy": "cpu-discovery-admission-v1",
    "admitted": true,
    "n_cpus": 1,
    "genes": 19944,
    "samples": 6,
    "input_bytes": 268798,
    "estimated_memory_bytes": 572611712,
    "one_worker_memory_bytes": 572611712,
    "memory_reserve_bytes": 539756953,
    "estimated_disk_bytes": 561660412,
    "measurements": {
      "cpus": 8,
      "memory_available_bytes": 2698784768,
      "disk_free_bytes": 665752379392,
      "measurement_errors": []
    },
    "reasons": [],
    "warnings": [],
    "limits": "Conservative admission heuristic, not a benchmarked peak or guarantee of completion. Available resources change over time. Design complexity, library/OS overhead, container limits and downloaded references can exceed this budget. Compressed file size does not replace full gene/sample dimensions. Worker count changes scheduling only; the model and thresholds are unchanged.",
    "dependencies": {
      "usable": true,
      "status": "ok",
      "checks": [
        {
          "module": "numpy",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "scipy.linalg",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "scipy.stats",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "pandas",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "pyarrow.parquet",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "pydeseq2.dds",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "pydeseq2.ds",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "formulaic",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "bindsight.deg.inference",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "bindsight.pipelines.discover",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "bindsight.report.html",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "matplotlib.backends.backend_agg",
          "required": true,
          "usable": true,
          "error": ""
        },
        {
          "module": "Bio.PDB.MMCIF2Dict",
          "required": false,
          "usable": true,
          "error": ""
        },
        {
          "module": "openpyxl",
          "required": false,
          "usable": true,
          "error": ""
        }
      ],
      "error": "",
      "checked_at": "2026-09-29T18:40:27.323464+00:00",
      "cache_seconds": 30.0,
      "limitation": "Actual imports and the pinned inference adapter are checked in a subprocess. This does not execute a model, test reference services, or verify optional GPU tools. Optional parser failures remain visible and can limit annotations."
    }
  },
  "stages": [
    {
      "name": "deg",
      "status": "completed",
      "tool": "pydeseq2",
      "version": "0.5.4"
    },
    {
      "name": "discover",
      "status": "completed",
      "tool": "bindsight/0.3.6",
      "version": "0.3.6"
    },
    {
      "name": "structure_inputs",
      "status": "completed",
      "tool": "bindsight.report.web.worker",
      "version": "0.3.6"
    },
    {
      "name": "annotation_coverage",
      "status": "completed",
      "tool": "bindsight.report",
      "version": "0.3.6"
    },
    {
      "name": "report",
      "status": "completed",
      "tool": "bindsight.report",
      "version": "0.3.6"
    }
  ],
  "coverage": {
    "available": true,
    "unassessed_lookups": 0,
    "dispositions": {},
    "intentionally_beyond_enrichment_cap": 460,
    "structure_not_queried": 81
  },
  "numerical_fit": {
    "available": true,
    "warnings": [
      "Residual degrees of freedom: 2 (below 3). The design leaves little information for estimating residual variation; interpret the resulting uncertainty cautiously.",
      "Gene-wise dispersion: 38 genes had a nonconverged optimizer flag. A returned estimate does not establish optimizer convergence.",
      "MAP dispersion: 9 genes had a nonconverged optimizer flag. A returned estimate does not establish optimizer convergence.",
      "The regularization-preserving dispersion grid fallback was used for 47 fits across 2 inference calls. Counts can include the same gene more than once; fallback estimates retain their nonconverged optimizer flags."
    ],
    "details": [
      "Log fold-change: 0 recorded nonconverged optimizer flags."
    ],
    "scope": "These diagnostics describe numerical fitting. They do not establish biological validity or experimental validation."
  },
  "effective_deg_parameters": {
    "design_formula": "~ case_barcode + condition",
    "categorical_factors": [
      "condition",
      "case_barcode"
    ],
    "contrast": [
      "condition",
      "tumor",
      "normal"
    ],
    "fdr_threshold": 0.05,
    "log2fc_threshold": 1.0,
    "min_replicates": 3,
    "min_count": 10,
    "n_cpus": 1
  },
  "checks": {
    "required_stages_completed": true,
    "no_failed_stages": true,
    "all_eight_downloads_nonempty": true,
    "download_hashes_match_manifest": true,
    "fit_record_matches_deg_table": true,
    "fit_summary_available": true,
    "report_contains_recorded_fit_warnings": true,
    "annotation_state_matches_coverage": true,
    "source_unchanged_during_execution": true,
    "eligible_targets_have_recorded_hashes": true
  },
  "finished_at": "2026-09-29T18:47:06.762427+00:00",
  "elapsed_seconds": 423.362
}
