{
  "version": "1.16.13",
  "date": "2026-10-04",
  "scope": "Original synthetic scalar rates at explicitly nonuniform times, no true angle or measured IMU",
  "sources": [
    {
      "url": "https://docs.scipy.org/doc/scipy/reference/generated/scipy.integrate.cumulative_trapezoid.html",
      "use": "Composite cumulative trapezoid coordinates and API initial 0/None concept only; no API execution"
    }
  ],
  "model": {
    "rateUnit": "deg/s",
    "timeUnit": "second",
    "angleUnit": "degree",
    "initialAngleDeg": 5,
    "clock": "single clock/session",
    "leftAssumption": "previous rate constant over interval",
    "trapezoidAssumption": "linear rate between endpoints",
    "trueAngleDeclared": false,
    "betweenSampleMotionKnown": false,
    "gapPolicyValidated": false
  },
  "rows": [
    {
      "sampleMs": 0,
      "rateDegPerSecond": "0",
      "leftAngleDeg": "5",
      "trapezoidAngleDeg": "5",
      "trapezoidWithOffsetDeg": "5",
      "offsetContributionDeg": "0"
    },
    {
      "sampleMs": 10,
      "rateDegPerSecond": "10",
      "leftAngleDeg": "5",
      "trapezoidAngleDeg": "101/20",
      "trapezoidWithOffsetDeg": "253/50",
      "offsetContributionDeg": "1/100"
    },
    {
      "sampleMs": 30,
      "rateDegPerSecond": "20",
      "leftAngleDeg": "26/5",
      "trapezoidAngleDeg": "107/20",
      "trapezoidWithOffsetDeg": "269/50",
      "offsetContributionDeg": "3/100"
    },
    {
      "sampleMs": 70,
      "rateDegPerSecond": "10",
      "leftAngleDeg": "6",
      "trapezoidAngleDeg": "119/20",
      "trapezoidWithOffsetDeg": "301/50",
      "offsetContributionDeg": "7/100"
    }
  ],
  "intervals": [
    {
      "fromMs": 0,
      "toMs": 10,
      "dtSeconds": "1/100",
      "leftIncrementDeg": "0",
      "trapezoidIncrementDeg": "1/20"
    },
    {
      "fromMs": 10,
      "toMs": 30,
      "dtSeconds": "1/50",
      "leftIncrementDeg": "1/5",
      "trapezoidIncrementDeg": "3/10"
    },
    {
      "fromMs": 30,
      "toMs": 70,
      "dtSeconds": "1/25",
      "leftIncrementDeg": "4/5",
      "trapezoidIncrementDeg": "3/5"
    }
  ],
  "offset": {
    "addedConstantDegPerSecond": 1,
    "hardwareValidated": false,
    "rule": "difference = added offset * elapsed seconds; same initial angle and quadrature"
  },
  "wrongConstantDt": {
    "dtSeconds": "1/100",
    "finalTrapezoidAngleDeg": "107/20",
    "differenceFromActualDtDeg": "-3/5"
  },
  "hardwareStatus": "not-run"
}
