2.9 KiB
Rayforge-to-JCZ semantic equivalence spike
- Date: 2026-10-18
- Rayforge commit:
c28918c87f8273dd1d244f5a057addc192807fa5 - MeerK40t commit:
d511944e08788e88077727f682957759884ff5ca - Scope: deterministic semantic encoding with no transport
Result
A real Rayforge raygeo.ops.Ops stream was constructed with job boundaries,
50 percent power, 250 mm/s feed, 40 kHz frequency, 200 ns pulse width, a
synthetic square, a one millisecond dwell and job end. The external addon
encoded it into a deterministic semantic trace without discovery or transport.
The encoded values matched the pinned BalorMK mock golden trace for all six checked semantics:
| Concept | Rayforge input | JCZ/Balor semantic value |
|---|---|---|
| Power | 0.5 fraction |
0x0800 |
| Mark speed | 15000 mm/min |
0x0094 for synthetic 110 mm field |
| Frequency | 40000 Hz |
Q-switch period 0x01f4 |
| Pulse width | 200 ns |
0x00c8 |
| Geometry | four marks | matching 0x7000/0x7100 coordinates |
| Dwell | 1 ms |
0x0064 ten-microsecond units |
Two runs produced identical results with SHA-256
6507c887b624a28820a79cf92a49b12b518a47aca7612a17af1f4ba5302b1e8d.
The checked result is tests/fixtures/rayforge-jcz-equivalence.json.
Unit finding
Rayforge's laser-step UI contract labels pulse width as nanoseconds, matching
BalorMK's MOPA UI. However, the current Ruida RPA encoder docstring calls the
same Ops.pulse_width value microseconds. The spike follows the laser-step
contract and records this disagreement as an upstream unit-clarity gap. A
production adapter must not infer the unit from a driver-specific comment.
What this proves
- Rayforge
Opscarries the required frequency and pulse-width state into an external binary encoder. - The selected values can map deterministically to the same controller-level semantics emitted by the pinned BalorMK mock implementation.
- Coordinate, speed and dwell conversions can remain inside a small encoder boundary with no USB dependency.
What this does not prove
- The semantic trace is now accompanied by separately documented 12-byte command records; neither artifact is a complete production command list.
- The 110 mm field is synthetic and applies no lens correction.
- No machine/source/lens profile validation is implemented.
- Unsupported Ops, cancellation, status, list buffering and error recovery still need explicit behavior and negative tests.
- No USB enumeration, controller command, motion or emission was attempted.
Decision impact
Spike C passes at the semantic boundary. The result supports a Rayforge JCZ addon architecture. A follow-up spike now covers transport-free 12-byte command records. At this checkpoint, list behavior, full Windows packaging and the remaining stock MeerK40t workflow assessment were still open. Later offline progress is summarized by the M1 no-device acceptance checkpoint; ADR 0002 remains proposed because its external gates are still open.