diff --git a/.gitattributes b/.gitattributes index 3cabf03..9f76a7b 100644 --- a/.gitattributes +++ b/.gitattributes @@ -7,3 +7,4 @@ *.yaml text eol=lf *.yml text eol=lf *.png binary +third_party/licenses/*.txt text eol=lf diff --git a/README.md b/README.md index 46767fa..798ed53 100644 --- a/README.md +++ b/README.md @@ -37,9 +37,11 @@ Phase 0 has established a reproducible evidence and research baseline: pass. Phase 0 remains open while we collect known-working LightBurn projects, device -screenshots, the closed-application preferences folder, machine photos, and -operator notes directly from the actual control computer. The bundle and -exported preferences are already preserved and analyzed. +screenshots, machine photos, and operator notes directly from the actual control +computer. The bundle, exported preferences and closed-application local settings +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). The offline M1 reuse proofs now pass as one consolidated acceptance checkpoint: the Rayforge/MeerK40t path has deterministic mock encoding, fail-closed JCZ diff --git a/docs/CODEX_HANDOFF.md b/docs/CODEX_HANDOFF.md index 812898e..d7cc7fd 100644 --- a/docs/CODEX_HANDOFF.md +++ b/docs/CODEX_HANDOFF.md @@ -1,6 +1,6 @@ # Codex continuation brief -- Updated: 2026-10-21 +- Updated: 2026-10-24 - Current focus: M1 build, packaging and no-device acceptance - Hardware access: prohibited - Automatic toolchain installation: prohibited @@ -51,6 +51,12 @@ python scripts/check_public_repo.py . ## External gates +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. + M1 is not complete. Do not describe the repository as a finished desktop application until both gates below have real evidence: diff --git a/docs/research/lightburn-local-settings-2026-10-24.md b/docs/research/lightburn-local-settings-2026-10-24.md new file mode 100644 index 0000000..fb4d0b8 --- /dev/null +++ b/docs/research/lightburn-local-settings-2026-10-24.md @@ -0,0 +1,53 @@ +# Local LightBurn settings acquisition + +- Date: 2026-10-24 +- Scope: offline acquisition of the closed application's local settings directory +- Hardware access: none; connection status was not tested + +## Evidence and integrity + +The complete settings directory was archived in PrivateStash. Its 255 files +include 250 preference backups, current and previous settings, two JSON files +and a material-test preset. Archive members were checked against source SHA-256 +digests before and after copying; ZIP integrity and the final archive digest +were also checked. The source files were not modified. + +The archive SHA-256 is +`d64320d13d8a543820ab1dd25e42791ac9a6faff89b7cb07aadbd707e9a3ca39`. +The current settings member SHA-256 is +`0b1f3496e9838788cd1e8469a2ddae279a7d0dc872767768f77fbeeaff4603e2`. +The public artifact contract is recorded in +[`public-lightburn-local-settings.jsonl`](../../evidence/public-lightburn-local-settings.jsonl). +Raw preferences, backup contents and exact local paths remain private. + +## Observations + +The current settings file contains JSON despite its INI extension. It has four +device records. Exactly one uses `LibUSB` with a 110 x 110 mm work area. That +profile enables `Laser_QPulseWidthEnabled` and `RequireFrameBeforeStart`. +The global cut list has 60 entries, including 35 with `frequency` and 25 with +`QPulseWidth`. These counts agree with the earlier export analysis; they do +not establish that every profile field is unchanged or that global recipes +belong to a particular machine. + +The operator separately confirmed the installed lens as **110 mm**. This is +an operator statement, not an independent verification of the lens label, +calibration or correction profile. A stored connection type does not establish +that a controller is connected or works. + +## Excluded project files and remaining gates + +The operator stated that the locally discovered project candidates are +unverified test files and instructed us not to use them. Nine temporary copies +were removed from this acquisition before analysis or commit. Their originals +were unchanged; no project content was analyzed or retained as evidence. + +This collection closes the missing closed-application settings snapshot. It +does **not** close the known-working JPT project gate: project-level frequency +and pulse-width serialization still require independently identified, +operator-verified project evidence. Do not derive an executable import mapping +from these settings or the excluded test projects. + +The reviewed Windows artifact and manual no-device desktop acceptance also +remain outstanding. No controller, USB endpoint, framing, motion or laser +operation was performed or authorized by this collection. diff --git a/evidence/public-lightburn-local-settings.jsonl b/evidence/public-lightburn-local-settings.jsonl new file mode 100644 index 0000000..915e824 --- /dev/null +++ b/evidence/public-lightburn-local-settings.jsonl @@ -0,0 +1 @@ +{"analysis_refs": ["docs/research/lightburn-local-settings-2026-10-24.md"], "artifact_id": "sha256-d64320d13d8a543820ab", "classification": "private-sensitive", "media_type": "application/x-zip-compressed", "observed_at_utc": "2026-10-24T10:36:56.001526Z", "origin": "closed local LightBurn settings", "sha256": "d64320d13d8a543820ab1dd25e42791ac9a6faff89b7cb07aadbd707e9a3ca39", "size_bytes": 1781002} diff --git a/tests/test_public_evidence.py b/tests/test_public_evidence.py index 000a88c..5430bf9 100644 --- a/tests/test_public_evidence.py +++ b/tests/test_public_evidence.py @@ -51,6 +51,7 @@ class PublicEvidenceTests(unittest.TestCase): expected = { "public-installer-configs.jsonl": 9, "public-lightburn-exports.jsonl": 4, + "public-lightburn-local-settings.jsonl": 1, } actual = { path.name: len(path.read_text(encoding="utf-8").splitlines())