diff --git a/README.md b/README.md index 798ed53..6ca5bf8 100644 --- a/README.md +++ b/README.md @@ -43,12 +43,16 @@ are preserved and analyzed. The operator confirmed a 110 mm lens; local test projects are unverified and must not be used as working-project evidence. See the [local settings acquisition](docs/research/lightburn-local-settings-2026-10-24.md). +Two operator-verified projects now establish project-level `frequency` and +`QPulseWidth` serialization; see the +[verified-project analysis](docs/research/lightburn-verified-projects-2026-10-24.md). +Missing pulse width still requires explicit resolution before executable import. + The offline M1 reuse proofs now pass as one consolidated acceptance checkpoint: the Rayforge/MeerK40t path has deterministic mock encoding, fail-closed JCZ profile and parameter gates, list buffering, cancellation/recovery, layer and -recipe semantics, and a transport-free workflow preview. The remaining gates -are a private known-working `.lbrn2` project and a reviewed Windows GTK runtime -for the packaged no-device workflow test. See the +recipe semantics, and a transport-free workflow preview. A reviewed Windows GTK +runtime and the packaged no-device workflow test remain outstanding. See the [Phase 0 status](docs/status/phase-0.md) and [Rayforge GUI preflight](docs/research/rayforge-windows-gui-preflight.md). diff --git a/docs/CODEX_HANDOFF.md b/docs/CODEX_HANDOFF.md index d7cc7fd..70370a6 100644 --- a/docs/CODEX_HANDOFF.md +++ b/docs/CODEX_HANDOFF.md @@ -53,9 +53,12 @@ python scripts/check_public_repo.py . The closed-application local settings directory is now preserved and hashed in PrivateStash; see `docs/research/lightburn-local-settings-2026-10-24.md`. -The operator confirmed a 110 mm installed lens. Local project candidates are -unverified test files and must not be used; temporary copies were removed -before analysis or commit. No known-working project was collected. +The operator confirmed a 110 mm installed lens. General local project candidates +remain excluded as unverified. The operator subsequently selected two specific +successful projects; their verified private copies establish project-level +`frequency` and `QPulseWidth` serialization. See +`docs/research/lightburn-verified-projects-2026-10-24.md`. One layer omits +`QPulseWidth`; its effective default remains unresolved. M1 is not complete. Do not describe the repository as a finished desktop application until both gates below have real evidence: @@ -63,8 +66,9 @@ application until both gates below have real evidence: 1. A Windows artifact for the pinned Rayforge revision must be produced on a reviewed build runner, verified without execution, and pass the manual no-device desktop checklist. -2. A known-working private JPT `.lbrn2` project must establish how project-level - frequency and `QPulseWidth` are serialized before those fields are mapped. +2. The known-working private JPT `.lbrn2` serialization evidence gate is met. + Import mapping still requires explicit unit conversion and fail-closed + handling of absent pulse width, with synthetic offline tests. Raw projects, screenshots containing identifiers, machine data and build binaries stay out of the public repository. @@ -81,8 +85,9 @@ order: 4. `scripts/validate_m1_manual_acceptance.py`. If no artifact is available, do not install a build environment here. The next -useful input is the private known-working `.lbrn2` collection or Kaz's explicit -decision on ADR 0003. The M3 protocol can also be reviewed offline, but its +offline implementation task is evidence-backed MOPA import mapping with +synthetic tests; Kaz's explicit decision on ADR 0003 is also outstanding. +The M3 protocol can also be reviewed offline, but its operation allowlist must stay empty until exact read-only request evidence is available. Until the external gates and separate hardware approval arrive, ADR 0002 remains Proposed and no controller backend, USB endpoint access, diff --git a/docs/research/lightburn-verified-projects-2026-10-24.md b/docs/research/lightburn-verified-projects-2026-10-24.md new file mode 100644 index 0000000..96b0ecf --- /dev/null +++ b/docs/research/lightburn-verified-projects-2026-10-24.md @@ -0,0 +1,47 @@ +# Operator-verified LightBurn projects + +- Date: 2026-10-24 +- Provenance: two files explicitly selected by the operator as successfully tested +- Scope: byte-preserving acquisition and offline XML analysis; no hardware access + +The two explicitly supplied files supersede the earlier exclusion only for +these selected originals. Other unverified local projects remain excluded. +Raw geometry, names, paths and complete settings remain in PrivateStash. +Both copied files were verified against their originals with SHA-256. +See [public manifest](../../evidence/public-lightburn-verified-projects.jsonl). + +Both roots are `LightBurnProject`, with `AppVersion="2.1.03"` and +`FormatVersion="1"`. Process settings occur as direct children of +`CutSetting`, with numeric strings in a `Value` attribute. + +| Artifact ID | Layer type | Raw `frequency` | Raw `QPulseWidth` | +| --- | --- | ---: | ---: | +| `sha256-1e1ec8441cc23ee997a6` | Scan | 200000 | absent | +| `sha256-1e1ec8441cc23ee997a6` | Cut | 80000 | 180 | +| `sha256-1e1ec8441cc23ee997a6` | Scan | 1000000 | 10 | +| `sha256-0807d2a2d1613e1aff90` | Scan | 1000000 | 10 | +| `sha256-0807d2a2d1613e1aff90` | Cut | 80000 | 180 | +| `sha256-0807d2a2d1613e1aff90` | Scan | 1000000 | 10 | + +All four Scan settings also have `crossHatch Value="1"`. These are stored +layer settings, not independent proof of which settings emitted on a machine. +Successful operation is the operator's statement; it was not replayed here. + +## Import implications + +This closes the missing operator-verified project serialization evidence gate: +`frequency` and case-sensitive `QPulseWidth` are now observed in actual +projects, consistent with the earlier device export findings. + +The absent pulse-width field must remain distinguishable from zero or an +explicit value. Its effective LightBurn default or inheritance is not established +by this inspection. An importer must preserve absence and require an explicit, +validated resolution before a MOPA job can become executable. + +These raw values do not independently establish units, safe ranges, calibration +or device identity. The next implementation should use synthetic geometry and +test explicit unit conversions, field absence and invalid values. It must not +copy private project geometry into public fixtures or enable hardware access. + +The reviewed Windows artifact and manual no-device desktop acceptance remain +open. ADR 0002 remains Proposed until those gates have also passed. diff --git a/evidence/public-lightburn-verified-projects.jsonl b/evidence/public-lightburn-verified-projects.jsonl new file mode 100644 index 0000000..7c3966b --- /dev/null +++ b/evidence/public-lightburn-verified-projects.jsonl @@ -0,0 +1,2 @@ +{"analysis_refs": ["docs/research/lightburn-verified-projects-2026-10-24.md"], "artifact_id": "sha256-1e1ec8441cc23ee997a6", "classification": "private-sensitive", "media_type": "application/octet-stream", "observed_at_utc": "2026-10-24T10:44:44.053873Z", "origin": "operator-confirmed successful JPT LightBurn projects", "sha256": "1e1ec8441cc23ee997a61d70592d1e8fa3035d3541729abf5a89f73c7f3aa528", "size_bytes": 202189} +{"analysis_refs": ["docs/research/lightburn-verified-projects-2026-10-24.md"], "artifact_id": "sha256-0807d2a2d1613e1aff90", "classification": "private-sensitive", "media_type": "application/octet-stream", "observed_at_utc": "2026-10-24T10:44:44.053873Z", "origin": "operator-confirmed successful JPT LightBurn projects", "sha256": "0807d2a2d1613e1aff90294fe515d7a26aa2df9ba214b77fd1990ba315bea9d1", "size_bytes": 1198348} diff --git a/tests/test_public_evidence.py b/tests/test_public_evidence.py index 5430bf9..8c2c722 100644 --- a/tests/test_public_evidence.py +++ b/tests/test_public_evidence.py @@ -52,6 +52,7 @@ class PublicEvidenceTests(unittest.TestCase): "public-installer-configs.jsonl": 9, "public-lightburn-exports.jsonl": 4, "public-lightburn-local-settings.jsonl": 1, + "public-lightburn-verified-projects.jsonl": 2, } actual = { path.name: len(path.read_text(encoding="utf-8").splitlines())