Source: https://guthlabs.ai/docs/instruments/ray-diagram-plotter-lens-mirror/implementation/

instrument implementation / implementation-contract

# Ray Diagram Plotter (lens/mirror) implementation

A source-bound implementation contract for Ray Diagram Plotter (lens/mirror); deployment and executable qualification remain separate.

Status: **VERIFIED_WITH_ERRATA**Lifecycle: **implementation-contract**

## Binding contract

This record describes what an executable surface must bind and validate. It does not claim that a public calculator, package, or production route is deployed.

**Record owner**: Guth Instruments

**Lifecycle**: verified-with-binding-errata

**Evidence ID**: t6-095

**Effect**: Computation or source lookup only

## Input and validation requirements

The focal-limit and zero-object-distance vectors produce undefined results and must be rejected or rendered as explicit nonfinite states. A plotting engine that blindly converts these values into SVG coordinates can generate NaN, infinity, or invalid geometry. The convention probe also shows that failing to define whether focal length is signed or type-derived can produce a completely different diagram.

## Required corrections

````
[
  {
    "vector": 4,
    "field": "image_distance/magnification/image_height",
    "wrong": "-0.0667 / 0.2222 / 0.0111",
    "correct": "-0.075 / 0.25 / 0.0125",
    "cause": "working computes 1/di = -13.3333, di = -0.075 TWICE (including in its own Correction clause) then ships -0.0667"
  }
]
````

## Inspectable interface fixture

The sample below is evidence for interface and validation tests, not a production implementation.

````
{
  "inputs": {
    "element": "converging lens",
    "f": 10,
    "do": 30,
    "object_height": 5,
    "units": "cm",
    "coordinate_convention": "lens at x=0; object at x=-30; positive x to the right",
    "sampled_points": {
      "parallel_ray": [
        -30,
        0,
        5,
        15
      ],
      "center_ray": [
        -30,
        0,
        15
      ],
      "front_focal_ray": [
        -30,
        -10,
        0,
        15
      ]
    }
  },
  "expected_outputs": {
    "image_distance": 15,
    "image_coordinate_x": 15,
    "magnification": -0.5,
    "image_height": -2.5,
    "image_type": "real, inverted, reduced",
    "sampled_y": {
      "parallel_ray": [
        {
          "x": -30,
          "y": 5
        },
        {
          "x": 0,
          "y": 5
        },
        {
          "x": 5,
          "y": 2.5
        },
        {
          "x": 15,
          "y": -2.5
        }
      ],
      "center_ray": [
        {
          "x": -30,
          "y": 5
        },
        {
          "x": 0,
          "y": 0
        },
        {
          "x": 15,
          "y": -2.5
        }
      ],
      "front_focal_ray": [
        {
          "x": -30,
          "y": 5
        },
        {
          "x": -10,
          "y": 0
        },
        {
          "x": 0,
          "y": 2.5
        },
        {
          "x": 15,
          "y": -2.5
        }
      ]
    },
    "key_features": {
      "lens_x": 0,
      "focal_points": [
        -10,
        10
      ],
      "two_focal_length_points": [
        -20,
        20
      ],
      "principal_ray_intersection": [
        15,
        -2.5
      ]
    }
  },
  "working": "Thin lens: 1/di = 1/f - 1/do = 1/10 - 1/30 = 3/30 - 1/30 = 2/30 = 1/15, so di = 15 cm. Magnification m = -di/do = -15/30 = -0.5. Image height = mh = (-0.5)(5) = -2.5 cm. Parallel ray after the lens: y = h(1 - x/f) = 5(1 - x/10), giving y(-30)=5, y(0)=5, y(5)=2.5, y(15)=-2.5. Center ray: y = -hx/do = -5x/30, giving y(-30)=5, y(0)=0, y(15)=-2.5. Front-focal ray passes through (-10,0), reaches (0,2.5), and then continues horizontally at y=-2.5 after the lens; all principal rays meet at (15,-2.5)."
}
````

## Other records

[01**Overview**](<https://guthlabs.ai/docs/instruments/ray-diagram-plotter-lens-mirror/>)[02**Mechanism**](<https://guthlabs.ai/docs/instruments/ray-diagram-plotter-lens-mirror/mechanism/>)[04**Qualification**](<https://guthlabs.ai/docs/instruments/ray-diagram-plotter-lens-mirror/qualification/>)

## Sources and evidence

These pointers bind the page to evidence. They do not grant authority or collapse verification into deployment.

- `VERIFIED_LEDGER.json`

- `evidence-tranche6/tranche6-results.json`

- `tranche errata record`
