ThePirateRay/docs/research/rayforge-lightburn-device-import-spike.md

2.6 KiB

Rayforge synthetic LightBurn JCZ device-import spike

  • Date: 2026-10-19
  • Rayforge commit: c28918c87f8273dd1d244f5a057addc192807fa5
  • Fixture: synthetic public .lbdev; no machine identifiers
  • Scope: device-profile importer only, with no discovery or transport

Result

Pinned Rayforge parses the synthetic JCZFiber profile and preserves its display name, 110 x 110 mm work area and generic home-on-start value. It does not select a driver because its LightBurn driver map has no JCZFiber entry.

The imported DeviceProfile also has no representation of the observed RequireFrameBeforeStart setting or the synthetic cut-list frequency and QPulseWidth fields. The import is therefore explicitly classified as unsafe for JCZ use rather than receiving guessed defaults.

The external addon now supplies the narrow profile seam missing from Rayforge core. It recognizes only the explicit public synthetic profile identity, requires LightBurn 2.1.03, JCZFiber, the observed 110 x 110 mm work area, Q-pulse-width enablement, fiber-type code 3, a valid 1-4000 kHz profile range, and RequireFrameBeforeStart: true. It associates the result only with PirateRayJCZNoDeviceDriver. Cut-list frequency is normalized from serialized Hz to display kHz and QPulseWidth remains ns. Encoding stays blocked because physical identity, lens/correction match, certified limits and promotion review are not verified.

The checked result is tests/fixtures/rayforge-lightburn-device-import.json. Two runs produced the same SHA-256 digest, 94f0d17837471399334a82c84558985d35da0f1a8eee6a176eb02d57ae3aeb18.

Evidence boundary

The fixture uses field names already recorded by the sanitized LightBurn device-export analysis. Its values are synthetic examples inside observed ranges, not a copy of a private export and not certified machine limits or material settings. It deliberately omits private GUIDs, source paths and unpublished connection serialization.

This spike characterizes the current importer and proves the smallest mapping at the external-addon boundary. It does not change Rayforge core or silently map JCZFiber to a G-code or Ruida driver.

Reproduce

Run against the pinned Rayforge checkout:

python scripts/spike_rayforge_lightburn_device_import.py C:\path\to\rayforge

Next seam

Offline controller-list buffering and explicit state ordering are complete. The next software gate is packaged Windows GTK interaction. Image-layer equivalence and absent QPulseWidth remain blocked rather than defaulted.

No USB enumeration, controller command, motion, framing or emission occurred.