{
  "schemaVersion": 1,
  "product": "astronomy-equipment-compatibility",
  "methodVersion": "1.1.0",
  "plan": {
    "product": "astronomy-equipment-compatibility",
    "version": 1,
    "fields": {
      "focal": 800,
      "aperture": 130,
      "reducer": 0.8,
      "seeing": 2.5,
      "pixel": 3.76,
      "sensorWidth": 23.5,
      "sensorHeight": 15.7,
      "imageCircle": 44,
      "backfocus": 55,
      "tolerance": 0.5,
      "filterCorrection": "Yes",
      "filterThickness": 2,
      "index": 1.5
    },
    "tables": {
      "train": [
        {
          "name": "Spacer / thread adapter",
          "length": 16.5,
          "input": "M48x0.75 female",
          "output": "M42x0.75 male",
          "source": ""
        },
        {
          "name": "Filter drawer",
          "length": 21,
          "input": "M42x0.75 female",
          "output": "M42x0.75 male",
          "source": ""
        },
        {
          "name": "Camera flange to sensor",
          "length": 17.5,
          "input": "M42x0.75 female",
          "output": "Sensor",
          "source": ""
        }
      ]
    },
    "demo": true
  },
  "units": {
    "gap": "mm",
    "effective": "mm",
    "length": "mm",
    "diagonal": "mm",
    "scale": "arcsec/pixel",
    "fieldWidth": "deg",
    "fieldHeight": "deg",
    "focal": "mm",
    "correction": "mm",
    "imageCircle": "mm",
    "sensorWidth": "mm",
    "sensorHeight": "mm",
    "tolerance": "mm",
    "mismatch": "count",
    "unknown": "count",
    "needsReview": "count",
    "componentCount": "count",
    "sourceCount": "count",
    "fRatio": "ratio",
    "criticalFocusZone": "micron",
    "samplingRatio": "ratio"
  },
  "result": {
    "title": "Your rig, in focus.",
    "status": {
      "tone": "warn",
      "title": "1 check needs attention",
      "body": "A planning check, not a compatibility guarantee. The telescope-side interface and physical clearances still need verification."
    },
    "raw": {
      "gap": 0.6666666666666643,
      "effective": 55.666666666666664,
      "length": 55,
      "diagonal": 28.261988606607286,
      "scale": 1.211806875,
      "fieldWidth": 2.103593074879283,
      "fieldHeight": 1.4054666119388104,
      "mismatch": 0,
      "unknown": 0,
      "focal": 640,
      "correction": 0.6666666666666667,
      "imageCircle": 44,
      "sensorWidth": 23.5,
      "sensorHeight": 15.7,
      "tolerance": 0.5,
      "spacing": false,
      "coverage": true,
      "needsReview": 1,
      "componentCount": 3,
      "sourceCount": 0,
      "fRatio": 4.923076923076923,
      "criticalFocusZone": 29.326390532544384,
      "samplingRatio": 2.063035002999137
    },
    "checks": [
      {
        "key": "spacing",
        "label": "Backfocus spacing",
        "status": "review",
        "target": "#field-backfocus",
        "detail": "Add approximately 0.6667 mm of physical spacing. Verify any adapter before purchase."
      },
      {
        "key": "threads",
        "label": "Thread handoffs",
        "status": "pass",
        "target": "#datasets",
        "detail": "2 nominal metric-thread handoffs agree. Engagement and clearance still need verification."
      },
      {
        "key": "coverage",
        "label": "Sensor coverage",
        "status": "pass",
        "target": "#field-imageCircle",
        "detail": "28.26 mm diagonal is inside the 44 mm image circle. This is not a vignetting or corner-quality guarantee."
      },
      {
        "key": "order",
        "label": "Sensor endpoint",
        "status": "pass",
        "target": "#datasets",
        "detail": "Train ends at “Sensor.” Confirm the final length is the flange-to-sensor distance."
      },
      {
        "key": "sampling",
        "label": "Pixel sampling",
        "status": "pass",
        "target": "#field-seeing",
        "detail": "2.06 arcsec of seeing per pixel scale unit; well matched. Sampling is close to or exceeds the seeing limit. Drizzle is unlikely to add resolved detail; native integration is the reference choice. Reference values only; verify against your own guiding and focus quality."
      }
    ],
    "connections": [
      {
        "index": 0,
        "label": "Spacer / thread adapter → Filter drawer",
        "status": "pass",
        "detail": "M42 × 0.75, opposite genders"
      },
      {
        "index": 1,
        "label": "Filter drawer → Camera flange to sensor",
        "status": "pass",
        "detail": "M42 × 0.75, opposite genders"
      }
    ],
    "metrics": [
      {
        "label": "Effective focal length",
        "value": "640 mm",
        "detail": "800 mm × 0.8 reducer / Barlow factor"
      },
      {
        "label": "Field of view",
        "value": "2.1° × 1.41°",
        "detail": "Rectangular frame; no distortion model"
      },
      {
        "label": "Image scale",
        "value": "1.21″/px",
        "detail": "Unbinned angular sampling, not resolution"
      },
      {
        "label": "Sensor diagonal",
        "value": "28.26 mm",
        "detail": "Published image circle: 44 mm"
      },
      {
        "label": "Focal ratio",
        "value": "f/4.92",
        "detail": "640 mm effective focal length ÷ 130 mm aperture"
      },
      {
        "label": "Critical focus zone",
        "value": "±29.33 µm",
        "detail": "Approximate focus tolerance at 550 nm; reference value, verify for your case"
      }
    ],
    "visual": {
      "kind": "train",
      "title": "Rear reference plane → sensor",
      "items": [
        {
          "label": "Spacer / thread adapter",
          "length": 16.5,
          "input": "M48x0.75 female",
          "output": "M42x0.75 male",
          "source": ""
        },
        {
          "label": "Filter drawer",
          "length": 21,
          "input": "M42x0.75 female",
          "output": "M42x0.75 male",
          "source": ""
        },
        {
          "label": "Camera flange to sensor",
          "length": 17.5,
          "input": "M42x0.75 female",
          "output": "Sensor",
          "source": ""
        }
      ]
    },
    "warnings": [
      "The telescope-to-first-component interface is not checked. Verify it separately.",
      "Nominal thread matches do not verify engagement depth, shoulders, clearances, or tilt.",
      "Apply filter-path correction once, only if the specified target excludes it."
    ],
    "sections": [
      {
        "title": "Rig bill of materials",
        "columns": [
          "Component",
          "Optical length (mm)",
          "Input connection",
          "Output connection",
          "Evidence"
        ],
        "rows": [
          [
            "Spacer / thread adapter",
            16.5,
            "M48x0.75 female",
            "M42x0.75 male",
            "User-entered; verify"
          ],
          [
            "Filter drawer",
            21,
            "M42x0.75 female",
            "M42x0.75 male",
            "User-entered; verify"
          ],
          [
            "Camera flange to sensor",
            17.5,
            "M42x0.75 female",
            "Sensor",
            "User-entered; verify"
          ]
        ]
      }
    ],
    "notes": [
      "Effective focal length = native focal length × reducer or Barlow factor. Image scale = 206.265 × pixel size in µm ÷ effective focal length in mm.",
      "Field of view = 2 × atan(sensor dimension ÷ (2 × effective focal length)), converted to degrees. Sensor diagonal = √(width² + height²).",
      "Physical target = specified sensor distance + optional glass correction. Glass correction = thickness × (1 − 1 / refractive index). Spacing gap = physical target − summed component lengths.",
      "Metric threads reconcile only when diameter and pitch agree and genders are opposite. Unrecognized labels stay unresolved. The first component’s telescope-side interface is not modeled."
    ]
  },
  "limitations": "A dimensional check is not a compatibility guarantee. Verify manufacturer reference planes, thread engagement, clearances, tilt, and optical performance."
}
