{
 "about": {
  "method": "progress-curve-initial-rates",
  "origin": "Original synthetic timecourses (exact straight lines; the integrated Michaelis-Menten equation plus a fixed noise vector), not experimental data",
  "ruling": "CSO memo of 11 October 2026, item 9 (docs/board/memos/2026-10-11-cso-assay-depth-stage.md); roadmap-v0-depth A6",
  "strainedAbovePercent": 10,
  "rateUnits": "signal/min without epsilon and path length; uM/min with both",
  "tolerances": {
   "status, reason, rows, n, rateUnit, strained": "exact",
   "slope, intercept, rate": "within 1e-9 relative (1e-12 absolute where the value is zero)",
   "residuals": "within 1e-9 absolute",
   "conversionPercent": "within 1e-9 relative; null exactly where the oracle gives null",
   "mm.vmax, mm.km": "within 1e-6 relative (the engine's own Michaelis-Menten fit on the oracle's rates)"
  },
  "recordedOn": "2026-10-12",
  "script": "pipeline/assay-analyser/oracles/progress_curve_rates.py",
  "scriptSha256": "b772ee3a960c15dceae453e70553862449bff7b7dd38425288ade3fc79ed7ca4",
  "helper": {
   "script": "pipeline/assay-analyser/oracles/stage_a_oracle.py",
   "sha256": "492d85ca2fa6750db80b1c64214fd4a0b13cd4c588267244f6262c504c73e3e8"
  },
  "environment": {
   "image": "ghcr.io/biotechmat/drybench/oracle-env:11b8a5e4456df7eb@sha256:7e69891ca1d9f24838660e0a9887bdb654ce7771d2f2ac7e7275e9b1eb3b6a09",
   "r": "R version 4.4.3 (2025-02-28)",
   "packages": {
    "jsonlite": "2.0.0"
   },
   "python": "3.11.15",
   "numpy": "2.0.2",
   "scipy": "1.13.1",
   "recordedOn": "2026-10-12",
   "cpu": "AMD EPYC 9V45 96-Core Processor",
   "cpuClass": "x86-64-v3",
   "simd": [
    "SSSE3",
    "SSE41",
    "POPCNT",
    "SSE42",
    "AVX",
    "F16C",
    "FMA3",
    "AVX2"
   ],
   "openblasCore": "Haswell",
   "threads": 1
  },
  "crossCheck": {
   "tool": "R stats::lm(y ~ t)",
   "version": "R version 4.4.3 (2025-02-28)",
   "script": "pipeline/assay-analyser/oracles/r/progress_rates_lm.R",
   "scriptSha256": "ff803c25e28261224ca864f7b2341c47f06a72694c06839505d5703b323c43fd",
   "ran": true,
   "settings": "lm on the reads the oracle used for each estimated well",
   "tolerances": {
    "slope, intercept": "1e-9 relative"
   },
   "cases": 25,
   "agreeing": 25,
   "rOnly": [],
   "scipyOnly": [],
   "result": [
    {
     "case": "exact-rising-signal",
     "well": "A1",
     "slope": 0.02,
     "intercept": 0.1,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "exact-rising-signal",
     "well": "A2",
     "slope": 0.035,
     "intercept": 0.05,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "exact-rising-molar",
     "well": "A1",
     "slope": 0.02,
     "intercept": 0.1,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "exact-rising-molar",
     "well": "B1",
     "slope": 0.02,
     "intercept": 0.1,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "exact-seconds",
     "well": "A1",
     "slope": 0.000333333333333333,
     "intercept": 0.1,
     "slopeRelativeDifference": 9.75781955236954e-16,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "exact-seconds",
     "well": "B1",
     "slope": 0.000333333333333333,
     "intercept": 0.1,
     "slopeRelativeDifference": 9.75781955236954e-16,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "exact-falling-nadh",
     "well": "C3",
     "slope": -0.031,
     "intercept": 1.2,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "exact-wrong-direction",
     "well": "A1",
     "slope": 0.02,
     "intercept": 0.1,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "exact-millimolar",
     "well": "A1",
     "slope": 0.02,
     "intercept": 0.1,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "exact-millimolar",
     "well": "A2",
     "slope": 0.02,
     "intercept": 0.1,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "mass-substrate-unit",
     "well": "A1",
     "slope": 0.02,
     "intercept": 0.1,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "missing-read-skipped",
     "well": "A1",
     "slope": 0.02,
     "intercept": 0.1,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "marker-withheld",
     "well": "A2",
     "slope": 0.02,
     "intercept": 0.1,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "plate-early-window",
     "well": "A1",
     "slope": 0.00136,
     "intercept": 0.08087,
     "slopeRelativeDifference": 4.783244878612522e-16,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "plate-early-window",
     "well": "A2",
     "slope": 0.00311,
     "intercept": 0.07947,
     "slopeRelativeDifference": 2.7889444951395604e-16,
     "interceptRelativeDifference": 1.7462926648816482e-16,
     "agrees": true
    },
    {
     "case": "plate-early-window",
     "well": "A3",
     "slope": 0.00454,
     "intercept": 0.08033,
     "slopeRelativeDifference": 1.9104884096660868e-16,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "plate-early-window",
     "well": "A4",
     "slope": 0.006735,
     "intercept": 0.07947,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "plate-early-window",
     "well": "A5",
     "slope": 0.00788,
     "intercept": 0.08101,
     "slopeRelativeDifference": 4.402851461870067e-16,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "plate-early-window",
     "well": "A6",
     "slope": 0.00945,
     "intercept": 0.07955,
     "slopeRelativeDifference": 0.0,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "plate-late-window",
     "well": "A1",
     "slope": 0.00116220588235294,
     "intercept": 0.0828544117647059,
     "slopeRelativeDifference": 1.1194596643656479e-15,
     "interceptRelativeDifference": 1.6749606342297493e-16,
     "agrees": true
    },
    {
     "case": "plate-late-window",
     "well": "A2",
     "slope": 0.00221507352941176,
     "intercept": 0.0838176470588235,
     "slopeRelativeDifference": 2.3494346164266794e-15,
     "interceptRelativeDifference": 3.311423857573806e-16,
     "agrees": true
    },
    {
     "case": "plate-late-window",
     "well": "A3",
     "slope": 0.00386522058823529,
     "intercept": 0.0844404411764706,
     "slopeRelativeDifference": 1.1220080693821492e-15,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    },
    {
     "case": "plate-late-window",
     "well": "A4",
     "slope": 0.00598786764705882,
     "intercept": 0.0831257352941176,
     "slopeRelativeDifference": 5.794127653535845e-16,
     "interceptRelativeDifference": 6.677974159849151e-16,
     "agrees": true
    },
    {
     "case": "plate-late-window",
     "well": "A5",
     "slope": 0.00789367647058824,
     "intercept": 0.0818198529411765,
     "slopeRelativeDifference": 8.790446289205649e-16,
     "interceptRelativeDifference": 1.6961394220289964e-16,
     "agrees": true
    },
    {
     "case": "plate-late-window",
     "well": "A6",
     "slope": 0.00924544117647059,
     "intercept": 0.0802933823529412,
     "slopeRelativeDifference": 3.7526029161088267e-16,
     "interceptRelativeDifference": 0.0,
     "agrees": true
    }
   ]
  }
 },
 "oracle": {
  "engine": "Python fractions (exact cases); scipy.stats.linregress (noisy cases); scipy.special.lambertw for the integrated Michaelis-Menten curves; scipy.optimize.curve_fit (lm) for the plate's Vmax and Km"
 },
 "cases": [
  {
   "name": "exact-rising-signal",
   "about": "A straight line, 0.1 + 0.02 t, in the window 0 to 4 min: slope 0.02 per min, rate 0.02 signal/min, no conversion without epsilon and path length",
   "axisUnit": "min",
   "reads": [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10"
   ],
   "series": {
    "A1": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ],
    "A2": [
     "0.05",
     "0.085",
     "0.12",
     "0.155",
     "0.19",
     "0.225",
     "0.26",
     "0.295",
     "0.33",
     "0.365",
     "0.4"
    ]
   },
   "markers": [],
   "substrate": {
    "A1": "100",
    "A2": "200"
   },
   "substrateUnit": "µM",
   "settings": {
    "window": [
     "0",
     "4"
    ],
    "direction": "rises",
    "epsilon": null,
    "pathLength": null
   },
   "expected": {
    "A1": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.02,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 0.02,
     "rateUnit": "signal/min",
     "conversionPercent": null,
     "strained": false,
     "slopeExact": "1/50"
    },
    "A2": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.035,
     "intercept": 0.05,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 0.035,
     "rateUnit": "signal/min",
     "conversionPercent": null,
     "strained": false,
     "slopeExact": "7/200"
    }
   }
  },
  {
   "name": "exact-rising-molar",
   "about": "The same line with epsilon 18000 and l 0.3 cm: rate 0.02 / 5400 M/min = 3.7037 uM/min; 4 min at 100 uM converts 14.8 percent (strained), at 1000 uM 1.48 percent",
   "axisUnit": "min",
   "reads": [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10"
   ],
   "series": {
    "A1": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ],
    "B1": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ]
   },
   "markers": [],
   "substrate": {
    "A1": "100",
    "B1": "1000"
   },
   "substrateUnit": "µM",
   "settings": {
    "window": [
     "0",
     "4"
    ],
    "direction": "rises",
    "epsilon": "18000",
    "pathLength": "0.3"
   },
   "expected": {
    "A1": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.02,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 3.7037037037037037,
     "rateUnit": "µM/min",
     "conversionPercent": 14.814814814814813,
     "strained": true,
     "slopeExact": "1/50"
    },
    "B1": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.02,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 3.7037037037037037,
     "rateUnit": "µM/min",
     "conversionPercent": 1.4814814814814814,
     "strained": false,
     "slopeExact": "1/50"
    }
   }
  },
  {
   "name": "exact-seconds",
   "about": "The same lines with time in seconds: the slope is per second and the rate per minute is unchanged",
   "axisUnit": "s",
   "reads": [
    "0",
    "60",
    "120",
    "180",
    "240",
    "300",
    "360",
    "420",
    "480",
    "540",
    "600"
   ],
   "series": {
    "A1": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ],
    "B1": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ]
   },
   "markers": [],
   "substrate": {
    "A1": "100",
    "B1": "1000"
   },
   "substrateUnit": "µM",
   "settings": {
    "window": [
     "0",
     "240"
    ],
    "direction": "rises",
    "epsilon": "18000",
    "pathLength": "0.3"
   },
   "expected": {
    "A1": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.0003333333333333333,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 3.7037037037037037,
     "rateUnit": "µM/min",
     "conversionPercent": 14.814814814814813,
     "strained": true,
     "slopeExact": "1/3000"
    },
    "B1": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.0003333333333333333,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 3.7037037037037037,
     "rateUnit": "µM/min",
     "conversionPercent": 1.4814814814814814,
     "strained": false,
     "slopeExact": "1/3000"
    }
   }
  },
  {
   "name": "exact-falling-nadh",
   "about": "NADH used: 1.2 - 0.031 t falls, declared falling, so the rate is +0.031 / 6220 M/min = 4.984 uM/min; 6 min at 300 uM converts 9.97 percent (not strained)",
   "axisUnit": "min",
   "reads": [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10"
   ],
   "series": {
    "C3": [
     "1.2",
     "1.169",
     "1.138",
     "1.107",
     "1.076",
     "1.045",
     "1.014",
     "0.983",
     "0.952",
     "0.921",
     "0.89"
    ]
   },
   "markers": [],
   "substrate": {
    "C3": "300"
   },
   "substrateUnit": "µM",
   "settings": {
    "window": [
     "2",
     "8"
    ],
    "direction": "falls",
    "epsilon": "6220",
    "pathLength": "1"
   },
   "expected": {
    "C3": {
     "status": "estimated",
     "n": 7,
     "rows": [
      2,
      3,
      4,
      5,
      6,
      7,
      8
     ],
     "slope": -0.031,
     "intercept": 1.2,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 4.983922829581993,
     "rateUnit": "µM/min",
     "conversionPercent": 9.96784565916399,
     "strained": false,
     "slopeExact": "-31/1000"
    }
   }
  },
  {
   "name": "exact-wrong-direction",
   "about": "A rising signal declared falling gives a negative rate and no conversion: the direction is the user's and is shown with the value",
   "axisUnit": "min",
   "reads": [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10"
   ],
   "series": {
    "A1": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ]
   },
   "markers": [],
   "substrate": {
    "A1": "100"
   },
   "substrateUnit": "µM",
   "settings": {
    "window": [
     "0",
     "4"
    ],
    "direction": "falls",
    "epsilon": "18000",
    "pathLength": "0.3"
   },
   "expected": {
    "A1": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.02,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": -3.7037037037037037,
     "rateUnit": "µM/min",
     "conversionPercent": null,
     "strained": false,
     "slopeExact": "1/50"
    }
   }
  },
  {
   "name": "exact-millimolar",
   "about": "[S]0 in mM converts to M (0.1 mM, 14.8 percent); a well with no [S]0 shows no conversion",
   "axisUnit": "min",
   "reads": [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10"
   ],
   "series": {
    "A1": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ],
    "A2": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ]
   },
   "markers": [],
   "substrate": {
    "A1": "0.1"
   },
   "substrateUnit": "mM",
   "settings": {
    "window": [
     "0",
     "4"
    ],
    "direction": "rises",
    "epsilon": "18000",
    "pathLength": "0.3"
   },
   "expected": {
    "A1": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.02,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 3.7037037037037037,
     "rateUnit": "µM/min",
     "conversionPercent": 14.814814814814813,
     "strained": true,
     "slopeExact": "1/50"
    },
    "A2": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.02,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 3.7037037037037037,
     "rateUnit": "µM/min",
     "conversionPercent": null,
     "strained": false,
     "slopeExact": "1/50"
    }
   }
  },
  {
   "name": "mass-substrate-unit",
   "about": "[S]0 in mg/mL: the rate is in uM/min, the conversion is not shown",
   "axisUnit": "min",
   "reads": [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10"
   ],
   "series": {
    "A1": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ]
   },
   "markers": [],
   "substrate": {
    "A1": "0.5"
   },
   "substrateUnit": "mg/mL",
   "settings": {
    "window": [
     "0",
     "4"
    ],
    "direction": "rises",
    "epsilon": "18000",
    "pathLength": "0.3"
   },
   "expected": {
    "A1": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.02,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 3.7037037037037037,
     "rateUnit": "µM/min",
     "conversionPercent": null,
     "strained": false,
     "slopeExact": "1/50"
    }
   }
  },
  {
   "name": "missing-read-skipped",
   "about": "A blank read inside the window is skipped, never interpolated: n is 4, the slope on exact data unchanged",
   "axisUnit": "min",
   "reads": [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10"
   ],
   "series": {
    "A1": [
     "0.1",
     "0.12",
     null,
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ]
   },
   "markers": [],
   "substrate": {
    "A1": "100"
   },
   "substrateUnit": "µM",
   "settings": {
    "window": [
     "0",
     "4"
    ],
    "direction": "rises",
    "epsilon": null,
    "pathLength": null
   },
   "expected": {
    "A1": {
     "status": "estimated",
     "n": 4,
     "rows": [
      0,
      1,
      3,
      4
     ],
     "slope": 0.02,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 0.02,
     "rateUnit": "signal/min",
     "conversionPercent": null,
     "strained": false,
     "slopeExact": "1/50"
    }
   }
  },
  {
   "name": "marker-withheld",
   "about": "A reader marker (OVRFLW) inside the window withholds the well with the read named; one outside the window does not",
   "axisUnit": "min",
   "reads": [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10"
   ],
   "series": {
    "A1": [
     "0.1",
     "0.12",
     "0.14",
     null,
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ],
    "A2": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     null,
     "0.3"
    ]
   },
   "markers": [
    {
     "well": "A1",
     "read": 3,
     "raw": "OVRFLW"
    },
    {
     "well": "A2",
     "read": 9,
     "raw": "OVRFLW"
    }
   ],
   "substrate": {
    "A1": "100",
    "A2": "100"
   },
   "substrateUnit": "µM",
   "settings": {
    "window": [
     "0",
     "4"
    ],
    "direction": "rises",
    "epsilon": null,
    "pathLength": null
   },
   "expected": {
    "A1": {
     "status": "withheld",
     "reason": "marker",
     "rows": [
      3
     ]
    },
    "A2": {
     "status": "estimated",
     "n": 5,
     "rows": [
      0,
      1,
      2,
      3,
      4
     ],
     "slope": 0.02,
     "intercept": 0.1,
     "residuals": [
      0.0,
      0.0,
      0.0,
      0.0,
      0.0
     ],
     "rate": 0.02,
     "rateUnit": "signal/min",
     "conversionPercent": null,
     "strained": false,
     "slopeExact": "1/50"
    }
   }
  },
  {
   "name": "too-few-points",
   "about": "Two reads in the window: too few for a slope with residuals; withheld, the reads named",
   "axisUnit": "min",
   "reads": [
    "0",
    "1",
    "2",
    "3",
    "4",
    "5",
    "6",
    "7",
    "8",
    "9",
    "10"
   ],
   "series": {
    "A1": [
     "0.1",
     "0.12",
     "0.14",
     "0.16",
     "0.18",
     "0.2",
     "0.22",
     "0.24",
     "0.26",
     "0.28",
     "0.3"
    ]
   },
   "markers": [],
   "substrate": {
    "A1": "100"
   },
   "substrateUnit": "µM",
   "settings": {
    "window": [
     "0",
     "1.5"
    ],
    "direction": "rises",
    "epsilon": null,
    "pathLength": null
   },
   "expected": {
    "A1": {
     "status": "withheld",
     "reason": "too-few-points",
     "rows": [
      0,
      1
     ]
    }
   }
  },
  {
   "name": "plate-early-window",
   "about": "Six substrate levels from 10 to 320 uM, integrated Michaelis-Menten (Vmax 2 uM/min, Km 50 uM) plus noise; the window 0 to 6 min. The low levels convert more than 10 percent and are flagged, not refused",
   "axisUnit": "min",
   "reads": [
    "0",
    "2",
    "4",
    "6",
    "8",
    "10",
    "12",
    "14",
    "16",
    "18",
    "20",
    "22",
    "24",
    "26",
    "28",
    "30"
   ],
   "series": {
    "A1": [
     "0.0811",
     "0.0828",
     "0.0872",
     "0.0887",
     "0.0938",
     "0.0953",
     "0.0988",
     "0.0997",
     "0.1038",
     "0.1046",
     "0.1074",
     "0.1082",
     "0.1120",
     "0.1121",
     "0.1147",
     "0.1144"
    ],
    "A2": [
     "0.0788",
     "0.0869",
     "0.0915",
     "0.0980",
     "0.1017",
     "0.1086",
     "0.1121",
     "0.1174",
     "0.1207",
     "0.1269",
     "0.1293",
     "0.1341",
     "0.1358",
     "0.1414",
     "0.1427",
     "0.1468"
    ],
    "A3": [
     "0.0806",
     "0.0885",
     "0.0995",
     "0.1072",
     "0.1167",
     "0.1241",
     "0.1344",
     "0.1408",
     "0.1497",
     "0.1553",
     "0.1648",
     "0.1700",
     "0.1778",
     "0.1826",
     "0.1910",
     "0.1957"
    ],
    "A4": [
     "0.0795",
     "0.0934",
     "0.1054",
     "0.1204",
     "0.1315",
     "0.1451",
     "0.1557",
     "0.1701",
     "0.1802",
     "0.1931",
     "0.2031",
     "0.2167",
     "0.2266",
     "0.2385",
     "0.2477",
     "0.2601"
    ],
    "A5": [
     "0.0812",
     "0.0960",
     "0.1135",
     "0.1279",
     "0.1463",
     "0.1606",
     "0.1777",
     "0.1921",
     "0.2100",
     "0.2246",
     "0.2411",
     "0.2551",
     "0.2723",
     "0.2864",
     "0.3024",
     "0.3164"
    ],
    "A6": [
     "0.0789",
     "0.0998",
     "0.1166",
     "0.1363",
     "0.1533",
     "0.1740",
     "0.1913",
     "0.2107",
     "0.2275",
     "0.2478",
     "0.2649",
     "0.2839",
     "0.3012",
     "0.3216",
     "0.3382",
     "0.3576"
    ]
   },
   "markers": [],
   "substrate": {
    "A1": "10",
    "A2": "20",
    "A3": "40",
    "A4": "80",
    "A5": "160",
    "A6": "320"
   },
   "substrateUnit": "µM",
   "settings": {
    "window": [
     "0",
     "6"
    ],
    "direction": "rises",
    "epsilon": "18000",
    "pathLength": "0.3"
   },
   "expected": {
    "A1": {
     "status": "estimated",
     "n": 4,
     "rows": [
      0,
      1,
      2,
      3
     ],
     "slope": 0.0013599999999999994,
     "intercept": 0.08087,
     "residuals": [
      0.00023000000000000798,
      -0.000789999999999999,
      0.0008900000000000019,
      -0.00032999999999999696
     ],
     "rate": 0.2518518518518517,
     "rateUnit": "µM/min",
     "conversionPercent": 15.111111111111105,
     "strained": true
    },
    "A2": {
     "status": "estimated",
     "n": 4,
     "rows": [
      0,
      1,
      2,
      3
     ],
     "slope": 0.003110000000000001,
     "intercept": 0.07946999999999999,
     "residuals": [
      -0.00066999999999999,
      0.0012100000000000166,
      -0.0004099999999999937,
      -0.00012999999999999123
     ],
     "rate": 0.5759259259259261,
     "rateUnit": "µM/min",
     "conversionPercent": 17.27777777777778,
     "strained": true
    },
    "A3": {
     "status": "estimated",
     "n": 4,
     "rows": [
      0,
      1,
      2,
      3
     ],
     "slope": 0.004540000000000001,
     "intercept": 0.08033,
     "residuals": [
      0.00027000000000000635,
      -0.000910000000000008,
      0.0010100000000000109,
      -0.00036999999999999533
     ],
     "rate": 0.8407407407407408,
     "rateUnit": "µM/min",
     "conversionPercent": 12.611111111111112,
     "strained": true
    },
    "A4": {
     "status": "estimated",
     "n": 4,
     "rows": [
      0,
      1,
      2,
      3
     ],
     "slope": 0.006735,
     "intercept": 0.07947,
     "residuals": [
      3.0000000000002247e-05,
      0.0004600000000000021,
      -0.0010100000000000109,
      0.0005199999999999927
     ],
     "rate": 1.247222222222222,
     "rateUnit": "µM/min",
     "conversionPercent": 9.354166666666666,
     "strained": false
    },
    "A5": {
     "status": "estimated",
     "n": 4,
     "rows": [
      0,
      1,
      2,
      3
     ],
     "slope": 0.007880000000000003,
     "intercept": 0.08101,
     "residuals": [
      0.00018999999999999573,
      -0.0007700000000000068,
      0.0009699999999999848,
      -0.00039000000000000146
     ],
     "rate": 1.45925925925926,
     "rateUnit": "µM/min",
     "conversionPercent": 5.472222222222223,
     "strained": false
    },
    "A6": {
     "status": "estimated",
     "n": 4,
     "rows": [
      0,
      1,
      2,
      3
     ],
     "slope": 0.00945,
     "intercept": 0.07955,
     "residuals": [
      -0.0006499999999999978,
      0.001350000000000004,
      -0.0007500000000000007,
      5.000000000002225e-05
     ],
     "rate": 1.75,
     "rateUnit": "µM/min",
     "conversionPercent": 3.2812499999999996,
     "strained": false
    }
   },
   "mm": {
    "vmax": 2.031328685001258,
    "km": 55.25961631660577,
    "rateUnit": "µM/min",
    "substrateUnit": "µM",
    "wells": [
     "A1",
     "A2",
     "A3",
     "A4",
     "A5",
     "A6"
    ]
   }
  },
  {
   "name": "plate-late-window",
   "about": "The same plate over 0 to 30 min: the rates fall short of the initial rates and every low level is strained; the window is the user's choice and is reported with the value",
   "axisUnit": "min",
   "reads": [
    "0",
    "2",
    "4",
    "6",
    "8",
    "10",
    "12",
    "14",
    "16",
    "18",
    "20",
    "22",
    "24",
    "26",
    "28",
    "30"
   ],
   "series": {
    "A1": [
     "0.0811",
     "0.0828",
     "0.0872",
     "0.0887",
     "0.0938",
     "0.0953",
     "0.0988",
     "0.0997",
     "0.1038",
     "0.1046",
     "0.1074",
     "0.1082",
     "0.1120",
     "0.1121",
     "0.1147",
     "0.1144"
    ],
    "A2": [
     "0.0788",
     "0.0869",
     "0.0915",
     "0.0980",
     "0.1017",
     "0.1086",
     "0.1121",
     "0.1174",
     "0.1207",
     "0.1269",
     "0.1293",
     "0.1341",
     "0.1358",
     "0.1414",
     "0.1427",
     "0.1468"
    ],
    "A3": [
     "0.0806",
     "0.0885",
     "0.0995",
     "0.1072",
     "0.1167",
     "0.1241",
     "0.1344",
     "0.1408",
     "0.1497",
     "0.1553",
     "0.1648",
     "0.1700",
     "0.1778",
     "0.1826",
     "0.1910",
     "0.1957"
    ],
    "A4": [
     "0.0795",
     "0.0934",
     "0.1054",
     "0.1204",
     "0.1315",
     "0.1451",
     "0.1557",
     "0.1701",
     "0.1802",
     "0.1931",
     "0.2031",
     "0.2167",
     "0.2266",
     "0.2385",
     "0.2477",
     "0.2601"
    ],
    "A5": [
     "0.0812",
     "0.0960",
     "0.1135",
     "0.1279",
     "0.1463",
     "0.1606",
     "0.1777",
     "0.1921",
     "0.2100",
     "0.2246",
     "0.2411",
     "0.2551",
     "0.2723",
     "0.2864",
     "0.3024",
     "0.3164"
    ],
    "A6": [
     "0.0789",
     "0.0998",
     "0.1166",
     "0.1363",
     "0.1533",
     "0.1740",
     "0.1913",
     "0.2107",
     "0.2275",
     "0.2478",
     "0.2649",
     "0.2839",
     "0.3012",
     "0.3216",
     "0.3382",
     "0.3576"
    ]
   },
   "markers": [],
   "substrate": {
    "A1": "10",
    "A2": "20",
    "A3": "40",
    "A4": "80",
    "A5": "160",
    "A6": "320"
   },
   "substrateUnit": "µM",
   "settings": {
    "window": [
     "0",
     "30"
    ],
    "direction": "rises",
    "epsilon": "18000",
    "pathLength": "0.3"
   },
   "expected": {
    "A1": {
     "status": "estimated",
     "n": 16,
     "rows": [
      0,
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      10,
      11,
      12,
      13,
      14,
      15
     ],
     "slope": 0.0011622058823529413,
     "intercept": 0.08285441176470588,
     "residuals": [
      -0.0017544117647058793,
      -0.0023788235294117666,
      -0.0003032352941176458,
      -0.0011276470588235388,
      0.0016479411764705743,
      0.0008235294117646952,
      0.001999117647058818,
      0.0005747058823529355,
      0.0023502941176470615,
      0.0008258823529411763,
      0.0013014705882352928,
      -0.00022294117647059242,
      0.001252647058823525,
      -0.0009717647058823525,
      -0.0006961764705882417,
      -0.0033205882352941307
     ],
     "rate": 0.215223311546841,
     "rateUnit": "µM/min",
     "conversionPercent": 64.5669934640523,
     "strained": true
    },
    "A2": {
     "status": "estimated",
     "n": 16,
     "rows": [
      0,
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      10,
      11,
      12,
      13,
      14,
      15
     ],
     "slope": 0.002215073529411765,
     "intercept": 0.08381764705882352,
     "residuals": [
      -0.0050176470588235295,
      -0.0013477941176470443,
      -0.00117794117647059,
      0.0008919117647058911,
      0.00016176470588234737,
      0.002631617647058826,
      0.0017014705882353043,
      0.0025713235294117787,
      0.0014411764705882374,
      0.00321102941176471,
      0.0011808823529411705,
      0.0015507352941176444,
      -0.0011794117647058733,
      -9.558823529404181e-06,
      -0.003139705882352961,
      -0.0034698529411764656
     ],
     "rate": 0.41019880174291945,
     "rateUnit": "µM/min",
     "conversionPercent": 61.52982026143791,
     "strained": true
    },
    "A3": {
     "status": "estimated",
     "n": 16,
     "rows": [
      0,
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      10,
      11,
      12,
      13,
      14,
      15
     ],
     "slope": 0.003865220588235294,
     "intercept": 0.0844404411764706,
     "residuals": [
      -0.003840441176470588,
      -0.0036708823529411905,
      -0.00040132352941175953,
      -0.0004317647058823537,
      0.0013377941176470481,
      0.0010073529411764731,
      0.00357691176470587,
      0.0022464705882352942,
      0.0034160294117646928,
      0.0012855882352941217,
      0.0030551470588235374,
      0.0005247058823529549,
      0.0005942647058823636,
      -0.0023361764705882304,
      -0.0016666176470588323,
      -0.004697058823529415
     ],
     "rate": 0.7157815904139433,
     "rateUnit": "µM/min",
     "conversionPercent": 53.68361928104575,
     "strained": true
    },
    "A4": {
     "status": "estimated",
     "n": 16,
     "rows": [
      0,
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      10,
      11,
      12,
      13,
      14,
      15
     ],
     "slope": 0.005987867647058823,
     "intercept": 0.08312573529411765,
     "residuals": [
      -0.003625735294117652,
      -0.0017014705882353043,
      -0.0016772058823529556,
      0.0013470588235294095,
      0.00047132352941176014,
      0.002095588235294127,
      0.0007198529411764909,
      0.003144117647058825,
      0.0012683823529411609,
      0.0021926470588235214,
      0.00021691176470589602,
      0.001841176470588235,
      -0.00023455882352940716,
      -0.00031029411764707526,
      -0.003086029411764696,
      -0.0026617647058823635
     ],
     "rate": 1.1088643790849673,
     "rateUnit": "µM/min",
     "conversionPercent": 41.58241421568627,
     "strained": true
    },
    "A5": {
     "status": "estimated",
     "n": 16,
     "rows": [
      0,
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      10,
      11,
      12,
      13,
      14,
      15
     ],
     "slope": 0.007893676470588234,
     "intercept": 0.08181985294117648,
     "residuals": [
      -0.000619852941176488,
      -0.0016072058823529412,
      0.00010544117647058593,
      -0.0012819117647058786,
      0.0013307352941176742,
      -0.00015661764705884873,
      0.0011560294117647085,
      -0.00023132352941174217,
      0.0018813235294117547,
      0.0006939705882353098,
      0.001406617647058822,
      -0.00038073529411764007,
      0.0010319117647059062,
      -0.0006554411764705947,
      -0.00044279411764702736,
      -0.0022301470588234618
     ],
     "rate": 1.4617919389978211,
     "rateUnit": "µM/min",
     "conversionPercent": 27.408598856209142,
     "strained": true
    },
    "A6": {
     "status": "estimated",
     "n": 16,
     "rows": [
      0,
      1,
      2,
      3,
      4,
      5,
      6,
      7,
      8,
      9,
      10,
      11,
      12,
      13,
      14,
      15
     ],
     "slope": 0.009245441176470586,
     "intercept": 0.0802933823529412,
     "residuals": [
      -0.0013933823529412026,
      0.0010157352941176229,
      -0.0006751470588235581,
      0.0005339705882352885,
      -0.0009569117647059144,
      0.0012522058823529192,
      6.132352941176644e-05,
      0.0009704411764705767,
      -0.0007204411764705765,
      0.0010886764705882457,
      -0.0003022058823529128,
      0.00020691176470588601,
      -0.000983970588235239,
      0.0009251470588235167,
      -0.0009657352941176423,
      -5.661764705883199e-05
     ],
     "rate": 1.712118736383442,
     "rateUnit": "µM/min",
     "conversionPercent": 16.051113153594766,
     "strained": true
    }
   },
   "mm": {
    "vmax": 2.1654049124437695,
    "km": 80.02568586365645,
    "rateUnit": "µM/min",
    "substrateUnit": "µM",
    "wells": [
     "A1",
     "A2",
     "A3",
     "A4",
     "A5",
     "A6"
    ]
   }
  }
 ]
}
