L4 live-adapter record — Fusion 2704.1.53 — 2026-09-06

Milestone M2. Records what was measured against the running kernel while building the adapter, per CLAUDE.md section 11 and PRD 14.4. Every figure below came from a probe run through tools/fusion_exec.py; none is inferred.

Fusion version

2704.1.53

Python

3.14.0

Platform

macOS x86_64

Documents opened

0 — every body from TemporaryBRepManager

Probes

p09_adapter_api_shapes, p10_edge_closure_and_length, p11_open_edge_control, p12_adapter_smoke

Confirmed API shapes (probe 09)

Claim

Verdict

Evidence

getParameterExtents() -> (ok, start, end)

CONFIRMED

arity 3, first element True

getStrokes tolerance is centimeters, honored as chordal deviation

CONFIRMED

0.000990087 mm achieved for a 0.001 mm request

Cylinder exposes origin, axis, radius

CONFIRMED

Cone exposes origin, axis, radius, halfAngle

CONFIRMED

Cone.origin is not the apex

CONFIRMED

separation measured non-zero; PRD 6.3

Torus exposes origin, axis, majorRadius, minorRadius

CONFIRMED

isinstance(face.geometry, adsk.core.Cylinder) discriminates

CONFIRMED

BRepEdge.isClosed

REFUTED — does not exist

raises AttributeError

Edge closure (probes 10, 11)

BRepEdge has no isClosed. Closure must come from vertex geometry:

Test

Result

startVertex is endVertex on a closed cope curve

False — identity is a trap

startVertex.geometry.isEqualTo(endVertex.geometry)

True

|P(end) P(start)|

0.000000000000 mm

Control. Every edge in tools/probes/fixtures.py is closed — 10 of 10 across cylinder, cone, torus, coped tube, severed tube and bent tube, all bodies of revolution. A discriminator only ever observed answering True is untested, so a box was added: 12 edges, 12 reported open. Without that control the test could not fail.

Arc length (probe 10) — PRD 6.4 [CHANGED v1→v2]

Analytic ground truth, which is the whole design of the measurement:

Quantity

Value

getLengthAtParameter, circle r = 14.3 mm

89.849549893 mm

BRepEdge.length, same edge

89.849549893 mm

Analytic 2πr

89.849549893 mm

Error

0.000000000 mm

Inscribed chord sum, n = 20 000

short by 3.69e-07 mm

So the function is exact on analytic geometry, and PRD 6.4’s preference over chord summation stands.

Surface-surface intersection curves — the guarantee does not carry:

Axis angle

getLengthAtParameter

chord sum n = 200 000

chord − getLength

relative

30°

148.924974988 mm

148.927406465 mm

+0.002431476 mm

+1.633e-05

45°

118.581262478 mm

118.586505359 mm

+0.005242881 mm

+4.421e-05

60°

105.505783493 mm

105.510396829 mm

+0.004613336 mm

+4.372e-05

75°

99.599232880 mm

99.600681149 mm

+0.001448268 mm

+1.454e-05

90°

97.867166722 mm

97.870609281 mm

+0.003442559 mm

+3.517e-05

A converged inscribed chord sum cannot exceed the arc length of the curve it samples, so the two functions describe different curves. Not monotonic in the angle; isTolerant is False and tolerance 0.0 on all five. Which value is true is [OPEN-13].

Product code executed on kernel geometry (probe 12)

The first end-to-end run of the real adapter/ + core/ path, not a probe reimplementation.

Step

Result

cylinder_parameters_of radius

14.300000000 mm — millimeters at the boundary (ADR-011)

stroke_edge

456 points, worst radial deviation 0.000000000 mm

outward_axis_for_cut_end

+z, correctly opposite the cut

Tier A closure vs 2πr

0.000000000 mm

render_cylinder_template

valid PDF

That closure figure reproduces PRD 11.9(c) through the product code.

Hazard reproduced by accident — PRD 7.13

Taking “the first cylindrical face” of a coped tube returns the cutting tool’s surface:

Face

Radius

Axis

Area

0

16.0000 mm

(+0.866, 0, +0.500)

857.9129 mm²

1

14.3000 mm

(0, 0, +1.000)

7739.4401 mm²

Here the areas differ by 9×, so “largest” happens to work — but PRD 7.13 measured a severing cut whose two candidates differ by 0.0112 %, where it does not. Host-face selection is a deliberate act (FR-1), never a scan.

New stub/runtime divergences

Joining the seven in PRD 7.11:

  • BRepEdge.isClosed — in the stub, absent at runtime.

  • getPointAtParameter raises RuntimeError: 3 past the parameter end rather than returning ok = False. Float rounding on start + (end−start)·i/n at i == n is enough to trigger it; clamp the parameter.