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

60 lines
2.6 KiB
Markdown

# 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:
```powershell
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.