Source: https://guthlabs.ai/docs/instruments/2d-collision-solver-oblique/mechanism/

instrument mechanism / verified-clean

# 2D Collision Solver (oblique) mechanism

The inspectable method record for 2D Collision Solver (oblique), kept separate from implementation and qualification.

Status: **VERIFIED_CLEAN**Lifecycle: **verified-clean**

## Model scope

The honest label 'idealized rigid-body, frictionless contact' is appropriate only if the implementation leaves tangential components unchanged and uses restitution along the line of centers. As written, the component-wise formula description is incorrect and the impact-angle definition is incomplete, so the instrument cannot be approved without correction.

- For an ideal frictionless collision, the 1D restitution/momentum formulas apply only along the line-of-centers normal component; the tangential components remain unchanged. Applying elastic/inelastic formulas independently to both normal and tangent components is incorrect unless a tangential friction/impulse model is explicitly supplied.

- The impact angle is underdefined: it must specify the orientation of the line-of-centers unit normal relative to the coordinate axes, or the normal vector itself.

- The spec does not state the exact normal-component formulas or the convention for coefficient of restitution e.

- A physically standard model requires positive masses and normally constrains 0 <= e <= 1 for passive elastic/inelastic impacts.

## Units and conventions

- m1 and m2 are positive masses in the same mass unit.

- All velocity-vector components use the same velocity unit; outputs preserve that unit unless an explicit conversion is specified.

- impact_angle_deg is interpreted as the line-of-centers normal angle measured counterclockwise from the +x axis.

- The tangent unit vector is t = (-sin(theta), cos(theta)).

- For a frictionless contact, tangential velocity components are unchanged and the normal components use v1n' = ((m1 - e*m2)*v1n + (1+e)*m2*v2n)/(m1+m2) and v2n' = ((1+e)*m1*v1n + (m2 - e*m1)*v2n)/(m1+m2).

- The test vectors use the corrected frictionless-contact interpretation rather than applying restitution independently to the tangent component.

## Inspectable vector

One of 4 source-bound review vectors:

````
{
  "inputs": {
    "m1": 1,
    "m2": 1,
    "v1": [
      2,
      1
    ],
    "v2": [
      -1,
      0
    ],
    "impact_angle_deg": 0,
    "line_of_centers_unit": [
      1,
      0
    ],
    "e": 1,
    "velocity_unit": "m/s"
  },
  "expected_outputs": {
    "v1_prime": [
      -1,
      1
    ],
    "v2_prime": [
      2,
      0
    ],
    "velocity_unit": "m/s"
  },
  "working": "n=(1,0), t=(0,1). Normal components: v1n=2, v2n=-1; tangential components: v1t=1, v2t=0. For equal masses and e=1: v1n'=((1-1)*2+(1+1)*1*(-1))/2=-2/2=-1. v2n'=((1+1)*1*2+(1-1)*(-1))/2=4/2=2. Tangential components are unchanged, so v1'=(-1)n+1t=(-1,1) and v2'=2n+0t=(2,0)."
}
````

## Failure boundary

**BREAK_CLAIMED** · SELF_FLAGGED

A zero-total-mass input makes the solver's mass denominator vanish, producing undefined post-collision velocities unless the instrument validates and rejects the input. The branch test also exposes a required approaching-versus-separating decision that a solver must implement consistently.

## Other records

[01**Overview**](<https://guthlabs.ai/docs/instruments/2d-collision-solver-oblique/>)[03**Implementation**](<https://guthlabs.ai/docs/instruments/2d-collision-solver-oblique/implementation/>)[04**Qualification**](<https://guthlabs.ai/docs/instruments/2d-collision-solver-oblique/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-tranche4/tranche4-results.json`

- `BOUNDARY_HAZARD_CATALOG.json`
