diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 9ac7e89fd3..17f6e82961 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -309,6 +309,8 @@ jobs: bun test/tools/kicad_library_test.ts build/kicad-library-test.js - name: KiCad Windows path and installer fixtures run: | + bun test/tools/atomic_text_test.cjs + python3 test/tools/kicad_cache_test.py python3 test/tools/kicad_install_test.py python3 test/tools/kicad_discovery_test.py python3 test/tools/kicad_open_script_test.py diff --git a/docs/reviews/kicad-health-cache-927.md b/docs/reviews/kicad-health-cache-927.md new file mode 100644 index 0000000000..b7449933e6 --- /dev/null +++ b/docs/reviews/kicad-health-cache-927.md @@ -0,0 +1,103 @@ +# Windows KiCad health cache: #927 follow-up + +Native qualification of the original #930 fix found a remaining JSON transport +bug. This follow-up keeps #927 open until a corrected package passes native +acceptance and ships. + +## Native reproduction + +GitHub Windows run [41896427524](https://github.com/BackplaneWorks/Backplane/actions/runs/41896427524) +used the authentic test-only 0.14.2 ZIP produced by run 41886983230, as a newly +created standard local user, with the real packaged Electron application and +its own service. The service and UI were not patched or overlaid. + +- Product commit `afa9679273206b3e9b1da4c966c9b63fb6f57ab4`, tree + `ec6c85b4a8b62a0227f09151a9ec52a362b20ae2`. +- ZIP SHA256 `de613310949b72b0a70bebf9a07aff021cdea98f894856fabdc42134d678cd22`. +- Service SHA256 `11f53c9619d095e0ccd520c5616743155ee240b9637021d4d5a0bea4707aadd1`. +- Compiler `composite-settle-41262875`, producer + `w-t1792701529-415584-1614985`; historical `releaseBuildApproved:false` + remains unchanged. This is not stock-compiler output equivalence evidence. + +Typing `C:\backplane_kicad\` and `C:\bp927\new tools\test\` character by +character preserved the exact input in the DOM, actual RPC-persisted SQLite +setting, and a real page reload. Resolver output selected and ran the correct +CLI. However, `kicad-health.json` sometimes became invalid JSON, and its saved +`setting` decoded backspace/newline/tab characters instead of literal path +characters. Program Files and PATH selection also ran the expected native CLI, +but strict cache parsing failed. These are partial results, not an overall pass. + +The separate Node and exact Bun-runtime probes reproduced the loss at the +native Windows child-argument to Cygwin `env.exe`/`sh.exe` boundary. The old +`Rt.save` supplied `Json.show` output as `$2` to `printf '%s'`: paired JSON +backslashes were halved before printf received them. JSON parsing subsequently +interpreted `\b`, `\n` and `\t`. The JSON encoder and input field did not do +that conversion. A raw DOS path's trailing backslash could also be doubled. +Naive global argument quoting did not preserve both raw paths and JSON. + +The real in-app installer downloaded and extracted the exact bp.6 CLI (SHA256 +`23b81e721e0a38ec8c277837badf4507e5518c4f5ddc9f89ec3d83a7a9ae2d43`). +The follow-up resolver/version step stopped while clearing an artificial +missing-path override. Install-only continuation +[41898136634](https://github.com/BackplaneWorks/Backplane/actions/runs/41898136634) +used no runtime fixtures and no override: the real in-app download/extraction +completed in about 20 seconds, produced that exact pinned executable, and the +installed CLI successfully printed `10.99.0` as the standard user. The bp.6 +identity is bound by the verified archive, manifest and executable hash. +The remaining strict health check failed on the same invalid cache JSON. +This establishes successful installation/CLI execution without claiming full +acceptance. Peak job memory was 1,108,713,472 bytes; pagefile usage and peak +usage both remained zero in that continuation. #946 passed there again. + +The independent unchanged #946 canonical native check passed in 41896427524, +including real System32 `msvcrt.dll`, AMD64 identity and `_get_osfhandle` +export observation. That does not make the #927 acceptance pass or promote +historical test-only package metadata. + +The kernel-enforced Job Object cap was 8 GiB, peak job usage 3,629,793,280 bytes. +The user authorized the runner's existing pagefile without modifying it; +observed use started at 0 MiB, ended at 267 MiB, and peaked at 379 MiB. +Timestamped host-wide paging counters were retained in the Actions artifact. + +## Fix and regression checks + +`Rt.save` now writes UTF-8 through the native filesystem. `FS.write_atomic` +creates a private random temporary directory beside the destination, opens +an exclusive mode-0600 file, writes and closes it, then renames it over the +cache. JSON and paths never become child arguments. A write/rename failure +keeps the previous complete cache and cleans its private staging directory. + +The actual Bend `Rt.save` IO regression checks Windows drive paths, trailing +backslashes, `\b`, `\n`, `\t`, spaces, UNC paths, Unicode, quotes and actual +control characters. The native effect regression also checks replacement, +file permissions on POSIX, partial-write failure, rename failure and cleanup. +The effect controls and a source assertion that `Rt.save` uses the native +writer without `Proc.run` run with Bun in every `scripts/local-small.py` lane. +The actual Bend IO fixture and effect controls also run in the Linux +nightly/release CI workflow; that workflow is not the per-PR merge gate. +Scoped Boat execution and canonical proof have separate receipts; an +interrupted proof never counts as passing. + +Boat job `j20261104193708-1087045` completed successfully under kernel +`memory.max=3699998720`, swap 0. Atomic-write controls, the compiled actual +`Rt.save` IO test, all seven discovery tests, 21 installer tests (three actual +PowerShell cases skipped on Linux), and unchanged LAWS/PROOF shape checks +passed. The unchanged canonical `bend PROOF.bend` attempt was separately +**incomplete**: kernel-confirmed OOM kill after 13.529 seconds, before the +explicit 120-second timeout, with no proof output. No law/proof was changed. +Receipts are under `extra/kicad-927-native-fix/evidence/`. + +After review, Boat `j20261104195200-1195105` reran those scoped checks with +Bun effect controls and the caller assertion: all passed. It then attempted +`scripts/local-small.py --focused-only --guards-only`. That broader gate +**failed**, in the existing sidebar-draft guard, because the pinned hashes +for `src/core/kexport.bend`, `src/core/refview.bend` and `src/mobile/hubs.bend` +were stale. All reviewed sidebar inputs, its manifest, scanner, guard and +test are byte-identical to branch base `caf71af247d87f9d89c0af7ced8a2721d152d541`; +current main `123676a2ff041a712c112010f7a04e8a85290a6f` retains those same +three mismatches. No guard or pin was bypassed/refreshed here. The scoped +pass does not qualify that full small gate. Its failure is routed separately. + +This source fix still needs a real corrected packaged-build acceptance run; +the already-produced frozen package cannot contain it. Package production and +publication remain owned by the installer/root, with publication held. diff --git a/extra/kicad-927-native-fix/check.py b/extra/kicad-927-native-fix/check.py new file mode 100644 index 0000000000..fa60d01529 --- /dev/null +++ b/extra/kicad-927-native-fix/check.py @@ -0,0 +1,33 @@ +"""Boat-only scoped check receipt; canonical proof keeps its separate verdict.""" +import hashlib +import json +from pathlib import Path +import subprocess + +out = Path('build/issue927-native-fix') +out.mkdir(parents=True, exist_ok=True) +group = Path('/sys/fs/cgroup') / Path('/proc/self/cgroup').read_text().split('0::', 1)[1].strip().lstrip('/') +memory = int((group / 'memory.max').read_text()) +swap = int((group / 'memory.swap.max').read_text()) +assert 0 < memory <= 3_700_000_000 and swap == 0 +record = {'state': 'incomplete', 'memoryMaxBytes': memory, 'swapMaxBytes': swap, + 'sources': {p: hashlib.sha256(Path(p).read_bytes()).hexdigest() for p in + ['src/server/host.bend', 'src/server/effects/host.js', 'src/server/kicad.bend']}, + 'checks': []} +for command in [['bun', 'test/tools/atomic_text_test.cjs'], + ['python3', 'test/tools/kicad_cache_test.py'], + ['python3', 'test/tools/kicad_discovery_test.py'], + ['python3', 'test/tools/kicad_install_test.py'], + ['python3', 'scripts/laws-shape.py']]: + result = subprocess.run(command, stdout=subprocess.PIPE, stderr=subprocess.STDOUT, timeout=120) + log = str(len(record['checks'])) + '.txt' + (out / log).write_bytes(result.stdout) + print(result.stdout.decode(errors='replace'), flush=True) + record['checks'].append({'command': command, 'exit': result.returncode, 'log': log}) + (out / 'CHECKS.json').write_text(json.dumps(record, indent=2) + '\n') + if result.returncode: + raise SystemExit(result.returncode) +record['state'] = 'passed' +record['canonicalProofQualified'] = False +(out / 'CHECKS.json').write_text(json.dumps(record, indent=2) + '\n') +print('Scoped checks passed; canonical PROOF is a separate verdict.', flush=True) diff --git a/extra/kicad-927-native-fix/evidence/boat-j20261104193708-1087045/CHECKS.json b/extra/kicad-927-native-fix/evidence/boat-j20261104193708-1087045/CHECKS.json new file mode 100644 index 0000000000..460968ec45 --- /dev/null +++ b/extra/kicad-927-native-fix/evidence/boat-j20261104193708-1087045/CHECKS.json @@ -0,0 +1,53 @@ +{ + "state": "passed", + "memoryMaxBytes": 3699998720, + "swapMaxBytes": 0, + "sources": { + "src/server/host.bend": "99dae01c4bcf7f0b7c97f30a78d139588334f3f44363fb29b0cb533060a0257d", + "src/server/effects/host.js": "ca0c8fa96abec3ebe69ff8af7d9f936c0117309ef0cdedb2838ea9202437ac03", + "src/server/kicad.bend": "4a3a25358aa6aa4a99870da9a42d018f69e3878562958354cef0420728be9a7b" + }, + "checks": [ + { + "command": [ + "node", + "test/tools/atomic_text_test.cjs" + ], + "exit": 0, + "log": "0.txt" + }, + { + "command": [ + "python3", + "test/tools/kicad_cache_test.py" + ], + "exit": 0, + "log": "1.txt" + }, + { + "command": [ + "python3", + "test/tools/kicad_discovery_test.py" + ], + "exit": 0, + "log": "2.txt" + }, + { + "command": [ + "python3", + "test/tools/kicad_install_test.py" + ], + "exit": 0, + "log": "3.txt" + }, + { + "command": [ + "python3", + "scripts/laws-shape.py" + ], + "exit": 0, + "log": "4.txt" + } + ], + "canonicalProofQualified": false +} diff --git a/extra/kicad-927-native-fix/evidence/boat-j20261104193708-1087045/PROOF.json b/extra/kicad-927-native-fix/evidence/boat-j20261104193708-1087045/PROOF.json new file mode 100644 index 0000000000..bb7bbdc482 --- /dev/null +++ b/extra/kicad-927-native-fix/evidence/boat-j20261104193708-1087045/PROOF.json @@ -0,0 +1,57 @@ +{ + "command": [ + "bend", + "PROOF.bend" + ], + "timeout_seconds": 120, + "kernel_before": { + "cgroup": "/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/run-r087f9fded3fb4103bf3c9a087fc61d71.scope", + "memory_max": "3699998720", + "swap_max": "0", + "memory_peak": 674193408, + "events": { + "low": 0, + "high": 0, + "max": 0, + "oom": 0, + "oom_kill": 0, + "oom_group_kill": 0 + } + }, + "inputs_sha256": { + "LAWS.bend": "fb75fb0fac15b9efb809965a9751cd804ff9960d46be39744d29c42888572ec6", + "PROOF.bend": "9e20d4b1b99084bd6be32ef7d0c27db5f6d86b1cee02b2855fb4a1aa8c33fd0c", + "src/server/kicad.bend": "4a3a25358aa6aa4a99870da9a42d018f69e3878562958354cef0420728be9a7b", + "src/core/kicad_install.bend": "c5bb81c95f0acdd6f14f11b096495545c3c06db94413b56b15d34e617e1132e5" + }, + "state": "incomplete", + "exit_code": -9, + "exit_reason": "cgroup_oom_kill", + "timed_out": false, + "seconds": 13.529, + "kernel_after": { + "cgroup": "/sys/fs/cgroup/user.slice/user-1000.slice/user@1000.service/app.slice/run-r087f9fded3fb4103bf3c9a087fc61d71.scope", + "memory_max": "3699998720", + "swap_max": "0", + "memory_peak": 3700002816, + "events": { + "low": 0, + "high": 0, + "max": 895, + "oom": 1, + "oom_kill": 1, + "oom_group_kill": 0 + } + }, + "events_delta": { + "low": 0, + "high": 0, + "max": 895, + "oom": 1, + "oom_kill": 1, + "oom_group_kill": 0 + }, + "peak_child_rss_kib": 3635164, + "output_sha256": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855", + "output_bytes": 0 +} diff --git a/extra/kicad-927-native-fix/evidence/boat-j20261104195200-1195105/CHECKS.json b/extra/kicad-927-native-fix/evidence/boat-j20261104195200-1195105/CHECKS.json new file mode 100644 index 0000000000..e3e976c1ff --- /dev/null +++ b/extra/kicad-927-native-fix/evidence/boat-j20261104195200-1195105/CHECKS.json @@ -0,0 +1,53 @@ +{ + "state": "passed", + "memoryMaxBytes": 3699998720, + "swapMaxBytes": 0, + "sources": { + "src/server/host.bend": "99dae01c4bcf7f0b7c97f30a78d139588334f3f44363fb29b0cb533060a0257d", + "src/server/effects/host.js": "ca0c8fa96abec3ebe69ff8af7d9f936c0117309ef0cdedb2838ea9202437ac03", + "src/server/kicad.bend": "4a3a25358aa6aa4a99870da9a42d018f69e3878562958354cef0420728be9a7b" + }, + "checks": [ + { + "command": [ + "bun", + "test/tools/atomic_text_test.cjs" + ], + "exit": 0, + "log": "0.txt" + }, + { + "command": [ + "python3", + "test/tools/kicad_cache_test.py" + ], + "exit": 0, + "log": "1.txt" + }, + { + "command": [ + "python3", + "test/tools/kicad_discovery_test.py" + ], + "exit": 0, + "log": "2.txt" + }, + { + "command": [ + "python3", + "test/tools/kicad_install_test.py" + ], + "exit": 0, + "log": "3.txt" + }, + { + "command": [ + "python3", + "scripts/laws-shape.py" + ], + "exit": 0, + "log": "4.txt" + } + ], + "canonicalProofQualified": false +} diff --git a/extra/kicad-927-native-fix/evidence/boat-j20261104195200-1195105/RUN.txt b/extra/kicad-927-native-fix/evidence/boat-j20261104195200-1195105/RUN.txt new file mode 100644 index 0000000000..a14c6abe3e --- /dev/null +++ b/extra/kicad-927-native-fix/evidence/boat-j20261104195200-1195105/RUN.txt @@ -0,0 +1,302 @@ +job j20261104195200-1195105: logs and artifacts in /home/h/.local/state/backplane/boat/jobs/j20261104195200-1195105 +reusing this thread's warm sandbox bx_brgmtb2b (default): no new Boat start +source: /home/h/Documents/i2cjak/backplane-bend/.backplane/worktrees/backplane-fix-kicad-native-927 @ 79a18057e23e6b235f3b57905d52aee5c08b606a (dirty: yes), 3625 files, 85M +pushed in 35s +bend 2.0.36 already installed +tree committed +setup in 2s +running: sh scripts/heavy-boat.sh bash -c set\ -e\;\ python3\ extra/kicad-927-native-fix/check.py\;\ python3\ scripts/local-small.py\ --focused-only\ --guards-only +[boat-job] 4 cpu, 7 GiB, stack 1048576 +ok native atomic UTF-8 text: caller has no shell transport; Windows escapes, replacement, private mode, failure preservation and cleanup + +test_production_save_literal_windows_paths (__main__.Cache.test_production_save_literal_windows_paths) ... ok + +---------------------------------------------------------------------- +Ran 1 test in 0.918s + +OK + +test_bundled_exe_wins_over_system (__main__.Discovery.test_bundled_exe_wins_over_system) ... ok +test_explicit_missing_root_stops_fallback (__main__.Discovery.test_explicit_missing_root_stops_fallback) ... ok +test_explicit_root_with_spaces_and_trailing_slash (__main__.Discovery.test_explicit_root_with_spaces_and_trailing_slash) ... ok +test_older_managed_exe_is_discovered (__main__.Discovery.test_older_managed_exe_is_discovered) ... ok +test_selected_managed_version (__main__.Discovery.test_selected_managed_version) ... ok +test_standard_program_files_without_path_entry (__main__.Discovery.test_standard_program_files_without_path_entry) ... ok +test_windows_path_and_json_assertions (__main__.Discovery.test_windows_path_and_json_assertions) ... ok + +---------------------------------------------------------------------- +Ran 7 tests in 2.091s + +OK + +test_darwin_tar_without_gnu_sha256sum (__main__.Installer.test_darwin_tar_without_gnu_sha256sum) ... ok +test_existing_runtime_preserved_before_network (__main__.Installer.test_existing_runtime_preserved_before_network) ... ok +test_incomplete_layout_not_promoted (__main__.Installer.test_incomplete_layout_not_promoted) ... ok +test_other_installer_lock_preserved (__main__.Installer.test_other_installer_lock_preserved) ... ok +test_other_platform_manifest_not_promoted (__main__.Installer.test_other_platform_manifest_not_promoted) ... ok +test_partial_download_leaves_no_install (__main__.Installer.test_partial_download_leaves_no_install) ... ok +test_path_traversal_rejected_before_unpack (__main__.Installer.test_path_traversal_rejected_before_unpack) ... ok +test_pre_downloaded_archive_is_not_downloaded_again (__main__.Installer.test_pre_downloaded_archive_is_not_downloaded_again) ... ok +test_release_sums_must_agree (__main__.Installer.test_release_sums_must_agree) ... ok +test_tar_install_backslash_and_escape_sequence_path (__main__.Installer.test_tar_install_backslash_and_escape_sequence_path) ... ok +test_tar_install_spaced_unicode_path_and_layout (__main__.Installer.test_tar_install_spaced_unicode_path_and_layout) ... ok +test_unsupported_refused_before_directory_or_network (__main__.Installer.test_unsupported_refused_before_directory_or_network) ... ok +test_windows_native_parent_with_backslashes_and_spaces (__main__.Installer.test_windows_native_parent_with_backslashes_and_spaces) ... ok +test_windows_zip_actual_powershell (__main__.Installer.test_windows_zip_actual_powershell) ... skipped 'actual PowerShell ZIP extraction runs on Cygwin' +test_windows_zip_actual_powershell_without_powershell_on_path (__main__.Installer.test_windows_zip_actual_powershell_without_powershell_on_path) ... skipped 'actual closed-PATH PowerShell ZIP extraction runs on Cygwin' +test_windows_zip_missing_system_powershell_cleans_stage (__main__.Installer.test_windows_zip_missing_system_powershell_cleans_stage) ... ok +test_windows_zip_resolves_system_powershell_off_path (__main__.Installer.test_windows_zip_resolves_system_powershell_off_path) ... ok +test_windows_zip_traversal_refused (__main__.Installer.test_windows_zip_traversal_refused) ... skipped 'actual PowerShell ZIP extraction runs on Cygwin' +test_wrong_header_even_with_matching_hash (__main__.Installer.test_wrong_header_even_with_matching_hash) ... ok +test_wrong_pinned_hash_preserves_other_version (__main__.Installer.test_wrong_pinned_hash_preserves_other_version) ... ok +test_wrong_root_rejected_before_unpack (__main__.Installer.test_wrong_root_rejected_before_unpack) ... ok + +---------------------------------------------------------------------- +Ran 21 tests in 0.700s + +OK (skipped=3) + + +Scoped checks passed; canonical PROOF is a separate verdict. +ok binary asset streaming: byte parity, 64KiB bound, partial writes, yields, backpressure, timeout/disconnect, identity/cap checks and descriptor cleanup +✔ bun/linux: exact body/headers, bounded pieces and fair yields (2.724535ms) +✔ posix/linux: exact body/headers, bounded pieces and fair yields (0.883483ms) +✔ bun/win32: exact body/headers, bounded pieces and fair yields (0.566538ms) +✔ bun/darwin: exact body/headers, bounded pieces and fair yields (0.55642ms) +✔ posix/darwin: exact body/headers, bounded pieces and fair yields (0.668974ms) +✔ gzip preference, original MIME/cache/frame headers and Vary survive unchanged (0.442965ms) +✔ unusable gzip (missing) falls back to exact plain bytes (1.000516ms) +✔ unusable gzip (empty) falls back to exact plain bytes (0.921582ms) +✔ unusable gzip (directory) falls back to exact plain bytes (1.107219ms) +✔ unusable gzip (unreadable) falls back to exact plain bytes (3.913051ms) +✔ unusable plain (missing) retains the original 404 (0.554676ms) +✔ unusable plain (empty) retains the original 404 (0.569904ms) +✔ unusable plain (directory) retains the original 404 (0.521696ms) +✔ unusable plain (nul) retains the original 404 (0.4019ms) +✔ static symlinks retain their existing supported behavior (0.595571ms) +✔ bun: partial headers/body, repeated EAGAIN and zero writes preserve bytes (2.835516ms) +✔ bun: idle expiry and backend errors release every descriptor (1.415499ms) +✔ posix: partial headers/body, repeated EAGAIN and zero writes preserve bytes (2.292239ms) +✔ posix: idle expiry and backend errors release every descriptor (1.430075ms) +✔ write progress renews timeout and disconnected handles release the file (0.676278ms) +✔ short reads are complete; truncation/read errors cannot append an error body (4.447771ms) +✔ open descriptor pins replacement and initial length despite path changes (0.735926ms) +✔ invalid typed metadata {"piece":0} fails before opening/sending (0.346609ms) +✔ invalid typed metadata {"piece":65537} fails before opening/sending (0.306226ms) +✔ invalid typed metadata {"piece":null} fails before opening/sending (0.269318ms) +✔ invalid typed metadata {"coding":3} fails before opening/sending (0.266553ms) +✔ invalid typed metadata {"ctype":"text/html\r\nInjected: true"} fails before opening/sending (0.271202ms) +✔ invalid typed metadata {"cache":"\u0000"} fails before opening/sending (0.255233ms) +✔ invalid typed metadata {"extra":"\u0000"} fails before opening/sending (0.250575ms) +✔ brotli preference: .br first, else .gz, else plain bytes (7.634103ms) +ℹ tests 30 +ℹ suites 0 +ℹ pass 30 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 84.768731 +✔ browser subscriptions and helper leases match original production traces (2.854891ms) +✔ exact three-second endpoint, age expiry and disconnect cleanup (0.82106ms) +✔ LRU promotes reads, replacement renews age and preserves insertion order (0.658165ms) +✔ per-slot bytes and total bytes bound every admission (0.63407ms) +✔ rejected replacement drops stale value; unknown slots never allocate (1.066707ms) +✔ owned UTF16 strings preserve raw surrogate units and empty values (0.460846ms) +✔ high page churn and same-key rewrites keep all indexes bounded (451.735496ms) +✔ numeric metrics reveal no keys/values and policy cannot mutate in place (1.110887ms) +ℹ tests 8 +ℹ suites 0 +ℹ pass 8 +ℹ fail 0 +ℹ cancelled 0 +ℹ skipped 0 +ℹ todo 0 +ℹ duration_ms 491.846301 +ok secure Save: ACK, refusal, build failure, timeout, disconnect, duplicate and stale reply; pending metadata has no value +ok browser adapter: captured owner, ACK-only close, inline refusal, offline redraw and navigation +ok native atomic UTF-8 text: caller has no shell transport; Windows escapes, replacement, private mode, failure preservation and cleanup +. +---------------------------------------------------------------------- +Ran 1 test in 0.002s + +OK +E.EEEE.EEEEEEEEEE.E[boat-job] job j20261104195200-1195105 exit 1 +. +====================================================================== +ERROR: test_body_read_in_sidebar_dependency_fails_closed (__main__.SidebarDraftGuard.test_body_read_in_sidebar_dependency_fails_closed) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 45, in test_body_read_in_sidebar_dependency_fails_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_canonical_retention_bridges_change_missing_pin_and_scope_fail_closed (__main__.SidebarDraftGuard.test_canonical_retention_bridges_change_missing_pin_and_scope_fail_closed) (path='src/server/thin-signals.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 165, in test_canonical_retention_bridges_change_missing_pin_and_scope_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_canonical_retention_bridges_change_missing_pin_and_scope_fail_closed (__main__.SidebarDraftGuard.test_canonical_retention_bridges_change_missing_pin_and_scope_fail_closed) (path='src/server/thin-signal-text.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 165, in test_canonical_retention_bridges_change_missing_pin_and_scope_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_canonical_retention_bridges_change_missing_pin_and_scope_fail_closed (__main__.SidebarDraftGuard.test_canonical_retention_bridges_change_missing_pin_and_scope_fail_closed) (path='src/server/thin-side-index.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 165, in test_canonical_retention_bridges_change_missing_pin_and_scope_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_current_review_and_unknown_scratch_policy (__main__.SidebarDraftGuard.test_current_review_and_unknown_scratch_policy) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 36, in test_current_review_and_unknown_scratch_policy + receipt = guard.check(ROOT) + ^^^^^^^^^^^^^^^^^ + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_loading_bridges_and_modules_fail_closed (__main__.SidebarDraftGuard.test_loading_bridges_and_modules_fail_closed) (path='src/server/thin-body.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 131, in test_loading_bridges_and_modules_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_loading_bridges_and_modules_fail_closed (__main__.SidebarDraftGuard.test_loading_bridges_and_modules_fail_closed) (path='src/core/thinq.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 131, in test_loading_bridges_and_modules_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_loading_bridges_and_modules_fail_closed (__main__.SidebarDraftGuard.test_loading_bridges_and_modules_fail_closed) (path='src/server/thin-splice.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 131, in test_loading_bridges_and_modules_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_loading_bridges_and_modules_fail_closed (__main__.SidebarDraftGuard.test_loading_bridges_and_modules_fail_closed) (path='src/server/thinstore.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 131, in test_loading_bridges_and_modules_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_loading_bridges_and_modules_fail_closed (__main__.SidebarDraftGuard.test_loading_bridges_and_modules_fail_closed) (path='src/core/view-page.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 131, in test_loading_bridges_and_modules_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_loading_bridges_and_modules_fail_closed (__main__.SidebarDraftGuard.test_loading_bridges_and_modules_fail_closed) (path='src/web/list-windows.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 131, in test_loading_bridges_and_modules_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_native_bound_bridges_mutation_and_missing_pin_fail_closed (__main__.SidebarDraftGuard.test_native_bound_bridges_mutation_and_missing_pin_fail_closed) (name='src/core/native-sidebar.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 88, in test_native_bound_bridges_mutation_and_missing_pin_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_native_bound_bridges_mutation_and_missing_pin_fail_closed (__main__.SidebarDraftGuard.test_native_bound_bridges_mutation_and_missing_pin_fail_closed) (name='src/mobile/screen.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 88, in test_native_bound_bridges_mutation_and_missing_pin_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_native_bound_bridges_mutation_and_missing_pin_fail_closed (__main__.SidebarDraftGuard.test_native_bound_bridges_mutation_and_missing_pin_fail_closed) (name='src/mobile/hubs.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 88, in test_native_bound_bridges_mutation_and_missing_pin_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_native_bound_bridges_mutation_and_missing_pin_fail_closed (__main__.SidebarDraftGuard.test_native_bound_bridges_mutation_and_missing_pin_fail_closed) (name='src/core/thin-wire.bend') +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 88, in test_native_bound_bridges_mutation_and_missing_pin_fail_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +====================================================================== +ERROR: test_selected_mirror_bridge_source_change_fails_closed (__main__.SidebarDraftGuard.test_selected_mirror_bridge_source_change_fails_closed) +---------------------------------------------------------------------- +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/test/tools/sidebar_draft_guard_test.py", line 76, in test_selected_mirror_bridge_source_change_fails_closed + guard.check(root) + File "/home/user/backplane-fix-kicad-native-927/scripts/sidebar-draft-guard.py", line 68, in check + raise GuardError("reviewed sidebar dependencies changed: " + ", ".join(changed)) +sidebar_draft_guard.GuardError: reviewed sidebar dependencies changed: src/core/kexport.bend, src/core/refview.bend, src/mobile/hubs.bend + +---------------------------------------------------------------------- +Ran 10 tests in 1.389s + +FAILED (errors=16) +Traceback (most recent call last): + File "/home/user/backplane-fix-kicad-native-927/scripts/local-small.py", line 16, in + subprocess.run([sys.executable, 'test/tools/sidebar_draft_guard_test.py'], cwd=root, check=True) + File "/usr/lib/python3.12/subprocess.py", line 571, in run + raise CalledProcessError(retcode, process.args, +subprocess.CalledProcessError: Command '['/usr/bin/python3', 'test/tools/sidebar_draft_guard_test.py']' returned non-zero exit status 1. +Command exited with non-zero status 1 +[boat-job] peak RSS 451292 KiB, wall 6.48 s, exit 1 +[boat-job] command exit 1 in 7s +artifact: build/issue927-native-fix +sandbox bx_brgmtb2b kept warm for this thread until 15:12 (Boat stops it 5 min later at the latest); this job used 47 credit-s +exit 1 · logs /home/h/.local/state/backplane/boat/jobs/j20261104195200-1195105 diff --git a/extra/kicad-927-native-fix/evidence/run-41896427524/argv-probe-bun.json b/extra/kicad-927-native-fix/evidence/run-41896427524/argv-probe-bun.json new file mode 100644 index 0000000000..39569fa30c --- /dev/null +++ b/extra/kicad-927-native-fix/evidence/run-41896427524/argv-probe-bun.json @@ -0,0 +1,1181 @@ +{ + "scope": "Native argv diagnostic, not application acceptance", + "engine": { + "executable": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\diagnostic-tools\\bun.exe", + "versions": { + "node": "26.3.0", + "bun": "1.4.3", + "boringssl": "41bf9b59c2ebf277a7aa427e1ecad5cc80dd4d4f", + "openssl": "1.1.0", + "llhttp": "9.4.2", + "libarchive": "27cbc7827172698143e440801fc0ba39ccb4f1f5", + "mimalloc": "92ef6587c57b262f6e6abf513f7776a2f8d12aeb", + "picohttpparser": "f4d94b48b31e0abae029ebeafcfd9ca0680ede58", + "uwebsockets": "c6da4a4d3010e5553438c60f6bd76d981976867c", + "webkit": "0c06faadf65bf8e8c8ad3a5a8aca83e1e9ed653f", + "zig": "04e7f6ac1e009525bc00934f20199c68f04e0a24", + "zlib": "12731092979c6d07f42da27da673a9f6c7b13586", + "tinycc": "05f0fafaa3be31e31d7b4b5c17dc60f62c991171", + "lolhtml": "725ce499aa9b71e38b7a2d0a9fbb6d7294a4079e", + "ares": "c7a3138dcfe3bb0eaaf10c0c24c36dc66dc790ab", + "libdeflate": "92e6a0db9fa848d742f9eb286c92afc60f2c3dda", + "usockets": "c6da4a4d3010e5553438c60f6bd76d981976867c", + "lshpack": "cf0f70dd10b352194c97448eb5d00b4aa484f531", + "zstd": "f8745da6ff1ad1e7bab384bd1f9d742439278e99", + "v8": "14.6.202.34-node.20", + "uv": "1.51.1-dev", + "napi": "10", + "icu": "78.3", + "unicode": "17.0", + "sqlite": "3.53.4", + "typescript": "7.0.2", + "modules": "147" + }, + "sha256": "095db4abae203d42f29fdec26da4a882fcde6333cdd84e40c0c7828c0cf543f6" + }, + "cases": [ + { + "name": "raw", + "kind": "direct-sh", + "expected": "C:\\backplane_kicad\\new tools\\test\\", + "actual": "C:\\backplane_kicad\\new tools\\test\\\\", + "equal": false, + "expectedCodePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92 + ], + "actualCodePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92, + 92 + ], + "exit": 0, + "stderr": "bash.exe: warning: could not find /tmp, please create!\n" + }, + { + "name": "raw", + "kind": "env-sh", + "expected": "C:\\backplane_kicad\\new tools\\test\\", + "actual": "C:\\backplane_kicad\\new tools\\test\\\\", + "equal": false, + "expectedCodePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92 + ], + "actualCodePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92, + 92 + ], + "exit": 0, + "stderr": "bash.exe: warning: could not find /tmp, please create!\n" + }, + { + "name": "raw", + "kind": "production-cache-script", + "expected": "C:\\backplane_kicad\\new tools\\test\\", + "actual": "C:\\backplane_kicad\\new tools\\test\\\\", + "equal": false, + "expectedCodePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92 + ], + "actualCodePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92, + 92 + ], + "exit": 0, + "stderr": "bash.exe: warning: could not find /tmp, please create!\n" + }, + { + "name": "raw", + "kind": "env-sh-cyg-single", + "expected": "C:\\backplane_kicad\\new tools\\test\\", + "actual": "", + "equal": false, + "expectedCodePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92 + ], + "actualCodePoints": [], + "exit": 2, + "stderr": "bash.exe: warning: could not find /tmp, please create!\nsh: -c: line 1: unexpected EOF while looking for matching `''\n" + }, + { + "name": "raw", + "kind": "env-sh-cyg-double", + "expected": "C:\\backplane_kicad\\new tools\\test\\", + "actual": "C:\\\\backplane_kicad\\\\new tools\\\\test\\\\", + "equal": false, + "expectedCodePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92 + ], + "actualCodePoints": [ + 67, + 58, + 92, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 92, + 116, + 101, + 115, + 116, + 92, + 92 + ], + "exit": 0, + "stderr": "bash.exe: warning: could not find /tmp, please create!\n" + }, + { + "name": "json", + "kind": "direct-sh", + "expected": "{\"path\":\"C:\\\\backplane_kicad\\\\\",\"other\":\"D:\\\\new tools\\\\test\\\\\",\"quote\":\"a\\\"b\"}", + "actual": "{\"path\":\"C:\\backplane_kicad\\\\\",\"other\":\"D:\\new tools\\test\\\\\",\"quote\":\"a\\\"b\"}", + "equal": false, + "expectedCodePoints": [ + 123, + 34, + 112, + 97, + 116, + 104, + 34, + 58, + 34, + 67, + 58, + 92, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 92, + 34, + 44, + 34, + 111, + 116, + 104, + 101, + 114, + 34, + 58, + 34, + 68, + 58, + 92, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 92, + 116, + 101, + 115, + 116, + 92, + 92, + 34, + 44, + 34, + 113, + 117, + 111, + 116, + 101, + 34, + 58, + 34, + 97, + 92, + 34, + 98, + 34, + 125 + ], + "actualCodePoints": [ + 123, + 34, + 112, + 97, + 116, + 104, + 34, + 58, + 34, + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 92, + 34, + 44, + 34, + 111, + 116, + 104, + 101, + 114, + 34, + 58, + 34, + 68, + 58, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92, + 92, + 34, + 44, + 34, + 113, + 117, + 111, + 116, + 101, + 34, + 58, + 34, + 97, + 92, + 34, + 98, + 34, + 125 + ], + "exit": 0, + "stderr": "bash.exe: warning: could not find /tmp, please create!\n" + }, + { + "name": "json", + "kind": "env-sh", + "expected": "{\"path\":\"C:\\\\backplane_kicad\\\\\",\"other\":\"D:\\\\new tools\\\\test\\\\\",\"quote\":\"a\\\"b\"}", + "actual": "{\"path\":\"C:\\backplane_kicad\\\\\",\"other\":\"D:\\new tools\\test\\\\\",\"quote\":\"a\\\"b\"}", + "equal": false, + "expectedCodePoints": [ + 123, + 34, + 112, + 97, + 116, + 104, + 34, + 58, + 34, + 67, + 58, + 92, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 92, + 34, + 44, + 34, + 111, + 116, + 104, + 101, + 114, + 34, + 58, + 34, + 68, + 58, + 92, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 92, + 116, + 101, + 115, + 116, + 92, + 92, + 34, + 44, + 34, + 113, + 117, + 111, + 116, + 101, + 34, + 58, + 34, + 97, + 92, + 34, + 98, + 34, + 125 + ], + "actualCodePoints": [ + 123, + 34, + 112, + 97, + 116, + 104, + 34, + 58, + 34, + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 92, + 34, + 44, + 34, + 111, + 116, + 104, + 101, + 114, + 34, + 58, + 34, + 68, + 58, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92, + 92, + 34, + 44, + 34, + 113, + 117, + 111, + 116, + 101, + 34, + 58, + 34, + 97, + 92, + 34, + 98, + 34, + 125 + ], + "exit": 0, + "stderr": "bash.exe: warning: could not find /tmp, please create!\n" + }, + { + "name": "json", + "kind": "production-cache-script", + "expected": "{\"path\":\"C:\\\\backplane_kicad\\\\\",\"other\":\"D:\\\\new tools\\\\test\\\\\",\"quote\":\"a\\\"b\"}", + "actual": "{\"path\":\"C:\\backplane_kicad\\\\\",\"other\":\"D:\\new tools\\test\\\\\",\"quote\":\"a\\\"b\"}", + "equal": false, + "expectedCodePoints": [ + 123, + 34, + 112, + 97, + 116, + 104, + 34, + 58, + 34, + 67, + 58, + 92, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 92, + 34, + 44, + 34, + 111, + 116, + 104, + 101, + 114, + 34, + 58, + 34, + 68, + 58, + 92, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 92, + 116, + 101, + 115, + 116, + 92, + 92, + 34, + 44, + 34, + 113, + 117, + 111, + 116, + 101, + 34, + 58, + 34, + 97, + 92, + 34, + 98, + 34, + 125 + ], + "actualCodePoints": [ + 123, + 34, + 112, + 97, + 116, + 104, + 34, + 58, + 34, + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 92, + 34, + 44, + 34, + 111, + 116, + 104, + 101, + 114, + 34, + 58, + 34, + 68, + 58, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92, + 92, + 34, + 44, + 34, + 113, + 117, + 111, + 116, + 101, + 34, + 58, + 34, + 97, + 92, + 34, + 98, + 34, + 125 + ], + "exit": 0, + "stderr": "bash.exe: warning: could not find /tmp, please create!\n" + }, + { + "name": "json", + "kind": "env-sh-cyg-single", + "expected": "{\"path\":\"C:\\\\backplane_kicad\\\\\",\"other\":\"D:\\\\new tools\\\\test\\\\\",\"quote\":\"a\\\"b\"}", + "actual": "", + "equal": false, + "expectedCodePoints": [ + 123, + 34, + 112, + 97, + 116, + 104, + 34, + 58, + 34, + 67, + 58, + 92, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 92, + 34, + 44, + 34, + 111, + 116, + 104, + 101, + 114, + 34, + 58, + 34, + 68, + 58, + 92, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 92, + 116, + 101, + 115, + 116, + 92, + 92, + 34, + 44, + 34, + 113, + 117, + 111, + 116, + 101, + 34, + 58, + 34, + 97, + 92, + 34, + 98, + 34, + 125 + ], + "actualCodePoints": [], + "exit": 2, + "stderr": "bash.exe: warning: could not find /tmp, please create!\nsh: -c: line 1: unexpected EOF while looking for matching `''\n" + }, + { + "name": "json", + "kind": "env-sh-cyg-double", + "expected": "{\"path\":\"C:\\\\backplane_kicad\\\\\",\"other\":\"D:\\\\new tools\\\\test\\\\\",\"quote\":\"a\\\"b\"}", + "actual": "{\"path\":\"C:\\\\backplane_kicad\\\\\",\"other\":\"D:\\\\new tools\\\\test\\\\\",\"quote\":\"a\\\"b\"}", + "equal": true, + "expectedCodePoints": [ + 123, + 34, + 112, + 97, + 116, + 104, + 34, + 58, + 34, + 67, + 58, + 92, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 92, + 34, + 44, + 34, + 111, + 116, + 104, + 101, + 114, + 34, + 58, + 34, + 68, + 58, + 92, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 92, + 116, + 101, + 115, + 116, + 92, + 92, + 34, + 44, + 34, + 113, + 117, + 111, + 116, + 101, + 34, + 58, + 34, + 97, + 92, + 34, + 98, + 34, + 125 + ], + "actualCodePoints": [ + 123, + 34, + 112, + 97, + 116, + 104, + 34, + 58, + 34, + 67, + 58, + 92, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92, + 92, + 34, + 44, + 34, + 111, + 116, + 104, + 101, + 114, + 34, + 58, + 34, + 68, + 58, + 92, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 92, + 116, + 101, + 115, + 116, + 92, + 92, + 34, + 44, + 34, + 113, + 117, + 111, + 116, + 101, + 34, + 58, + 34, + 97, + 92, + 34, + 98, + 34, + 125 + ], + "exit": 0, + "stderr": "bash.exe: warning: could not find /tmp, please create!\n" + } + ] +} diff --git a/extra/kicad-927-native-fix/evidence/run-41896427524/canonical-946.json b/extra/kicad-927-native-fix/evidence/run-41896427524/canonical-946.json new file mode 100644 index 0000000000..605181e6d2 --- /dev/null +++ b/extra/kicad-927-native-fix/evidence/run-41896427524/canonical-946.json @@ -0,0 +1,485 @@ +{ + "status": "PASS", + "scope": "Canonical native system ABI only", + "releaseBuildApproved": false, + "originalTestOnlyMetadataChanged": false, + "factorySHA256Observed": "b1f159e4304d82577a55465891c423e0e9c3fbce063696529ac15ef2a374b823", + "factoryCRLFCount": 0, + "factoryCommit": "2823fe4641bbadcb41a6cf49f91fe2c7fbc77978", + "factoryTree": "6aee3595dfa1862952cfb28969f0a884a49ae8ff", + "factorySHA256": "b1f159e4304d82577a55465891c423e0e9c3fbce063696529ac15ef2a374b823", + "productCommit": "afa9679273206b3e9b1da4c966c9b63fb6f57ab4", + "productTree": "ec6c85b4a8b62a0227f09151a9ec52a362b20ae2", + "packageSHA256": "de613310949b72b0a70bebf9a07aff021cdea98f894856fabdc42134d678cd22", + "serviceSHA256": "11f53c9619d095e0ccd520c5616743155ee240b9637021d4d5a0bea4707aadd1", + "originalBuildSHA256": "24429bbbdbc764528b5869bd6ddd400a73b1c71985422a574c57cf54277bdf77", + "buildProvenance": { + "compilerMode": "composite-settle-41262875", + "producerWorkId": "w-t1792701529-415584-1614985", + "releaseBuildApproved": false + }, + "hostedRun": { + "githubActions": "true", + "runnerOS": "Windows", + "runId": "41896427524", + "runAttempt": "1", + "repository": "BackplaneWorks/Backplane" + }, + "sourceJS": { + "src/app/effects/img.js": "6e789691422135f9f8f3d14af05e12cd6dea088598ef57bcd562fc26ef932226", + "src/app/effects/link.js": "04edc7d08f42529f3e6ba1c6255f9295d9d28376b68b194409ea77f27109d82a", + "src/app/effects/win.js": "676ebd3fde19a3069c753694f6b4f96e2b7875dfe7821c2e0f9a27e136e138c7", + "src/gfx/effects/font.js": "9e333238117de8a5a96dc07eef8283c8ae81da54ccc62cb8cd6e32a40d08eb6f", + "src/mobile/bridge.js": "088ccb4d2ee53793d146781cd2a4eedce69f925a5e1f0e7c78d919a6c1750673", + "src/mobile/recent.js": "522e6af4a94a56fc7f18f4936438ffda5e4270a1d2f882c56edbdbe744d3f894", + "src/mobile/thin-native-host-307265.js": "7bec4689ebacae1b8ae5dda3808e377725297e5c559d18f478e998e82cdb6724", + "src/server/effects/accounts.js": "a2c2a452036d8dc174cc6a07ca37cbbe6cf8b38d775b39143e8cb7c9a2d2f999", + "src/server/effects/adopt.js": "9db21fbd4e02ece54d8cedfb7b76701d0f45b949d1b9d49c611c3eaef75e26cc", + "src/server/effects/bounded_cache.js": "ee4ba9fdfb8e0c9181f1ff0a9933ddcd12d5218ba801f6f94b3bb3350beef6b8", + "src/server/effects/cast.js": "f12d2b240dc00b7d6fecf8ea41f7ce8247bd00deac3784bb20e0fc0f6f621a79", + "src/server/effects/components_cache.js": "f3286c58c13c569fef6f0452d888bec0dae6530388bd354ac49a7d24dffbe5e8", + "src/server/effects/db.js": "1472da9b675e8b0d9badc4da87a36f339865d9c008ea27220875ac77661c4f40", + "src/server/effects/diagnostics.js": "2c978660d098f833a969512877b90be8fd91616e549ea33b660182f04ae4d233", + "src/server/effects/evlog.js": "fef85c89ef4bf7f82627250acb59b08f2e811d265a58dbfb1219df2f78407de0", + "src/server/effects/farcodec.js": "02de26164685d37aadb65d10878fdce339910eda6078612b40b30234033629a4", + "src/server/effects/google.js": "77c2de8eed86b49cb6033c9a67801e4356a2e1528129968934c4568ff9d13071", + "src/server/effects/host.js": "5764616d329d4f1b8515a07fff26c1f8b2a72da2c58966bdd16440567b561fc4", + "src/server/effects/hotboot.js": "af88c272583549f7f168448f9b04a977af48ce8ca0bcf80457f94a3c883fc86f", + "src/server/effects/hublock.js": "df21a74719a73ce229db113696ee034c030d35f331486848d6892bc355189330", + "src/server/effects/kicad_library.js": "d2e45867a3b6479db7168f31176c791a7820d03fbf54d63a5bcd525b9d88f994", + "src/server/effects/live-checkpoint.js": "77b7615a030fd2dcae1cf571ab68cafaa33cf756b944e87c25d862641c12f7b7", + "src/server/effects/liveness.js": "cce57308e11da34182f6935e5e127430eb8ca75758913be13c3bb768d5313917", + "src/server/effects/locks.js": "52f2e78db47f91f15972d06a01f344bc43f012ffbc89e33ba22ee6e3ac616575", + "src/server/effects/loop.js": "7ac13585622fedea795d735a6e43abd25713e29ee4197c8efc4eb2d8d7805678", + "src/server/effects/mailstore.js": "0088d78eda25a2bcbb38f5196b19fe723732e745314e73a2ea9f3191c321d975", + "src/server/effects/mem.js": "d3d02eef04bd64d02b9bc326427c6c6e7238ff98bbe113defc73c39a15312da9", + "src/server/effects/message_image.js": "b9d1bd7b8c68dcf9f35600b737c726811378c29113a2743cefc28087f1d93158", + "src/server/effects/pairing.js": "60c553fc95fa24479c02fc9c0e0845c30e297072ea1faa49594d410d15f421e5", + "src/server/effects/perf.js": "321e0c8c64ee0881383734c958b4982b6bade1b482fadc9ac3c0186c1658c9bf", + "src/server/effects/plot_board.js": "cef49672c6111ce584a9ce0d2f0792fa232f78e1ac8ad1bc50c102544d3e81cf", + "src/server/effects/project-home.js": "99f18ce07e59e5bd1be50829fa5f43bd7800f0a443a9f7085f91b7dad78376e5", + "src/server/effects/pty.js": "280eeb077899b02544502586ad8229b741960a9a8b146132da6051c3ac6f5de1", + "src/server/effects/push-gate.js": "178d8476d32dc05712acab0ec0941c794ce60f6e45cf753330258ed173d833b0", + "src/server/effects/render_asset.js": "e686b2b7b322c017ce18eb75dbd537046270f30de68c1bb2aa431400aa2fa284", + "src/server/effects/restart-hold.js": "c9423f5ce6b7c84bd34e29050b7bbc5d790b54623434f4eb74bde709afbdfaa9", + "src/server/effects/storefar.js": "c6d2a783542b0a14ad996a17338739000a606439532afaa5cfc0a8d5bce36736", + "src/server/effects/storeio.js": "10800136bd8d55a41409140f4d01427aa983e68f00d6291af964828fec9e35ed", + "src/server/effects/telemetry.js": "de2551d47c56e2a7e1205193490894a8856c520541a3255b026809b74ff063b1", + "src/server/effects/vault.js": "30e758c70786f8ca9c8453e0fb8ffb65df48163b234756c009d388fabb67259f", + "src/server/effects/wire_log.js": "7006943cdffe180d96f50e0cd8488391a26696e1f0750157c22c8a9437e1b437", + "src/server/effects/zip.js": "1cfd240f87e11a4a80fa6d910d166f683bdce5165570e2179356131129a91ff8", + "src/server/ui-replay-trace.js": "ad72c18e7bc9a104386ad552870c56ecccb1e80acf00c188a7c6df04d9ce8b2d", + "src/web/auth.js": "8c96536167572610772ca05c69c8be86c6447dfc6a294578670b310e3fb04fbe", + "src/web/board-catalog.js": "7e2cf073868f175595e103f7bf1403e278b3b3511f2688c4a8bbb6136f1fa784", + "src/web/body-windows.js": "b6eb198b5380920dd11e8a503de239fc9d678c574bd2200f561b927b43b1daf1", + "src/web/bub-move.js": "b28e7e97939be1eceb3844cb5ac1dfa3bea90f7b26c5bb6e129a780eed819f54", + "src/web/cache-identity.js": "a0a4b17bc75724fcf2e9172530830dfcc288d6740a177868d245ba62df4a160f", + "src/web/components.js": "01d91f3604f4fceadbdd29a62a555d0d60faa674f9a7d0a39075215a7663eaa3", + "src/web/composer-draft.js": "28bb5548c4dba1160bb8729657ace730cef74b99c21b9cdf4b5c7ffb5994bbb9", + "src/web/composer-size.js": "808b98f3eb2cae786a59038a811cb7619ae379fd0f97356d3eb154866d5346ea", + "src/web/connection-log.js": "6fc6e9ae7069f5982c4a3f0a089dace184510f8a646ec698daca07362b4424c6", + "src/web/conversation-frame.js": "f52d762faca4ea3d614409b31a7539e35c9a6436508bfa8b5ddfc5025efc85cb", + "src/web/desktop-browser.js": "178a4fe746d596c970b9cd2993b517639f784c8406aa58cb9362e27a7cfc3efb", + "src/web/draft-attachments.js": "f15d260bbcfabd2f9fdd57f9ee39685ea06dd03b2b0fa170a7ceba36805b639a", + "src/web/draw.js": "2db4b46cc034129fb9f5d8fc7d49fd798c2f4047a2346ac103c10edcbfaee9b9", + "src/web/entry-history.js": "d48c8af26bbdf2c035842b0a3be3ccff6428ac0449e91245f0485396dabcb8cb", + "src/web/floating-terminal.js": "3a158c642cbc462af0ff58060fe6cf3370aea1d17dafb19ee6a275ce8a4978d3", + "src/web/focused-cache.js": "07ef085639494ffb9225fdbe77d2f2017dd4674fe2e186795101beb5cbf4e36d", + "src/web/frame-summary.js": "8e7331fca084a32f2ead56eda4c56874be12330e3bff55f9b93a2dedb70d375f", + "src/web/home-drafts.js": "412550b73b1c4d72f8f5905cc1be5ec81f7af3e4462c119c42801daae71250f7", + "src/web/host.js": "18f23878107420e42b77d9d4c90178031c0ceb85d3fd716c005ca835ab5d49a1", + "src/web/http-cache.js": "3908c3177aa9aeee742f9724fa9d658776142feb676ee32267a561c752836640", + "src/web/image-actions.js": "b1e7a3b463f95b34e52c13cc615c76617806f6201b63b78240cd75bf6af267e0", + "src/web/improvements-capture.js": "f1770bbdff2b246a34bf358775bb78e89ba6290a3a375a8a41fb66170056de62", + "src/web/improvements-context.js": "b86c7af4dc46d681094688ed9f83b16e70dd4a4e186d87a508c49e1b935dd776", + "src/web/improvements-flow.js": "7044b692e091b09af12907df3b16fe2d655f51a7f18e246ad4e4143962d0aab8", + "src/web/improvements-recording-store.js": "0eddfac5719af26b5d8ec387483a57fa5b62029d686cd954406dee93c17d9fc7", + "src/web/improvements-recording.js": "944f10a65413a784c4d53d2696631b62a326699e8c20dc264292176c6e3642a1", + "src/web/improvements-rpc.js": "014c59a49408dacefe648accb14266303a6b2ccff4f9f695d42b4c0a5b24f854", + "src/web/improvements-store.js": "1590ea43ebf16a8dc445afa9decd51a2aa9b4a16d0906f49644423c477762ae8", + "src/web/improvements.js": "8608b60d34695387f148f1e63d7f99505592e0cb17d4ab86c6614617d07ba14f", + "src/web/issue-report.js": "24bc5067129e2e6da1249c6f16aabe2b225850aa271b3019d85a85edc3f3cf57", + "src/web/mail-drafts.js": "7aaa67938913c9473a858539443bb662dd73ae5530a0fdd660e8be16028e6a80", + "src/web/mesh-worker.js": "5dec67a5ee52bf07545bfdc8e454f6bab24bcf2b8ef9a458a8677d7bd1bd710a", + "src/web/message-images.js": "86d8d5d9a713a0f9ce4a9754f979acc1e1be05d2de7975a27ee68fb3a5b8e34d", + "src/web/model-feedback.js": "aa9d068b04f3296d7ccc07fc5a8a74b58a18a675bba8c7e7a4148653ac637ba8", + "src/web/model-menu-input.js": "cd20cde7296e5781df44970aa6b7c6ff2b88af0141cdefc1569106bfb0e91599", + "src/web/pairing-device.js": "6dbc5e8a4a8b0dfb4b76fa5cde3bb61f37de151fc284f64a1a39136540ac6da8", + "src/web/pairing-link.js": "02fff413454910724ecbbc9bb8b10733bf712741c06311fd9510278fadfc6c3c", + "src/web/pairing-ui.js": "8c3023de740fec7b20bf1e661fa54c03f1fd01ff27ed3dd60c567482c6ab9e58", + "src/web/phone-other.js": "1d4ae64d79e1aa357ee4101575b8c0d3cb8a1847dad171bf4c801f31210b69b1", + "src/web/phone-shell.js": "f9a927fa4bbe077c71cfa57a66bcf317a6ffbcc70cb32c0efa16e4d6ad0f6f54", + "src/web/phone-thread.js": "2804629c0758eb8c549345fe141d877ed4ddcd5728dcd44d7efefe71b687615a", + "src/web/plot2d.js": "526739866a48ffcea63033e72258fc61981894fd22599b0c2cff8cffb7686b99", + "src/web/probe.js": "eb772515405737286acfa8d66748a4d82202438a266d3c9c22bce2c441628a76", + "src/web/project-splitters.js": "ac2881cec85f4b66012162d0fcbe6bcb9d35ff979fc56457f9f3e1d932958d16", + "src/web/recent-views.js": "e93770fe872871f59b36bac145490c9e374edb59bb1218b3e70793923327bc73", + "src/web/reconnect.js": "727d0116d7d60343bbbe6b456b5afb266c815567cad5a8892b10c6bd3c3e8cc0", + "src/web/reflow.js": "f560e0fa6e192afe8e1a510702be261cb2c08f29da1322ce41e6fb887de4c4ce", + "src/web/replay.js": "c06cbba2364158ce2e4753b7abc050a644ee77d003edaf8891d5e9c7a9ed4561", + "src/web/report-writer.js": "d22fdb49faa909490b17214b7ad3c09945413330daa223e9d190a1fb4224f453", + "src/web/review-position.js": "65bbd3abf53c6d85410db3cfe11b21944c4c48aaecf21605f68c985c38f25617", + "src/web/secret-save.js": "7c7323b563909ebf4bcaebfd38dec9f5cab09124843b4567d94d8ecb87750dde", + "src/web/sent-claims.js": "2ddad60e3adf7d510967fda17cddba1e90664f07345b15e912794a37cc2617b4", + "src/web/shot-missing.js": "b524495b8fc0a4cf321ea2d113001cf38ca77a1259ebd273e2f31e4e3347df6e", + "src/web/sidebar-keys.js": "f276799e8adace11f9678ec7da48d91487cb63ceda52d387f2baa1b73b4d6f3c", + "src/web/sidebar-region.js": "5aa844c764717af18c750f7d6329952395cd002b589fe18ea1aa07605f03a682", + "src/web/solid-assets.js": "275ab4bfdd00e0a1a7273633cacbaab23d247797c4aafbb8ff2e7b0ee5bc1bc6", + "src/web/solid-dof.js": "736e659ac2b2d57ff03a52a475757ce837069ab100ddb6340b11938e9d01946d", + "src/web/solid-framing.js": "0714af5c1d763e900b6676d8abe82477b5699c03f5f5e447ded1b158863c6223", + "src/web/solid-hdr-resolve.js": "8adbefafc5b423f400dbe5ddf8007ce3944fab5e39a1d29dddeda7ac13b3bf3c", + "src/web/solid-mask-relief.js": "61608c5cdc51243fe9efc9626284ea470612c90f2bb4294243b431ecca422701", + "src/web/solid-material-policy.js": "297a847447d29bb3baa3a95488365d8e62b56a2403419bf669a6193e5a0ede97", + "src/web/solid-materials.js": "5b0630eadab9fd1825496739faa0af39164ae9db2c17d37fad18d2609f1445a4", + "src/web/solid-pathtrace-core.js": "4601c7ea1522dd7eb3d4a74faff2bcd299dd67a2be3cbd67d3dbb4d3bc9008d3", + "src/web/solid-pathtrace.js": "a4c13c35b1c5321d0bd95652eff5b5ae50b0105f452df19d3c52638f9dc1e3f8", + "src/web/solid-raster-batches.js": "73955c9b738b5ca02849680bb171c2345740c16df3bf8fa194450b7fd3ee175f", + "src/web/solid-shading-guide.js": "f25ed69d3cc7cbc975d1b95d11c3e32831c81b78bc6bf4c3b012be681e600c07", + "src/web/solid-solder-source.js": "1b9217817beddb224561eb639a8a5b81648e4e6b9e51528fcd893ccad4a6d584", + "src/web/solid-solder.js": "df813f95ffffefd7c795b37022e6338ed946d39aece41c87581d2120cec92e68", + "src/web/solid.js": "9acc6f3b93a2b9898ef65a6a07eb8aa9511b6e9584564f8983f368e56225037a", + "src/web/star-attention.js": "1f565ea855e65ffe6a4bbd309671882e6435164960c4f9714e8675a4af8bf13d", + "src/web/startup.js": "a35cdc6d702b0207c2ccdfe6928d50ded79f6cc1c2e114c3f39dc29b12c44095", + "src/web/subagent-inspector.js": "d87e2045309a28850e9fe4fe01afc0ade595db74fcf56dd7e16dcd2bbb0d171d", + "src/web/subs-feedback.js": "4396b755a792598edaa0439bf6a1f85f381d41180ef0609de3c92e1f616a8362", + "src/web/sw.js": "4c30bc8e8e90280a890cf72e97d251a45ad818990354c7fbb1f3d887d132b665", + "src/web/terminal-input.js": "d7715b500d85250d6f6958a192a50d9026cb465b2146fa2f2124f6785bd6d08c", + "src/web/terminal-output.js": "1a6b7c30c4eb263a3a29e88d00d63690de54c21241b155d620b4195266d1da49", + "src/web/text-copy.js": "6802e01d4ff685dca961b9a7a2ad256ce3686a9b95d450dd768935e1c0d3d259", + "src/web/text-preview.js": "1b397096c44b6edfb0ff6ba4461787400c06e767ece73da25d7eff9f28eb9af4", + "src/web/thin-continuations.js": "147b7fb39f6eed94132ac09463f6214a20e95f49b0e108a96a6ae6de18768402", + "src/web/thin-discovery.js": "0d4c3a03ca2a7823582ef343335adec7b3513574c927f6d53a47fd6257d5d116", + "src/web/thin-host.js": "0ff11d3635f7fdacc8c2787738d69e8b36e6a467652b0846eed9c568caa30d61", + "src/web/thin-results.js": "f582354ec0a6c484ca641a5459830ad17c197c6c056b837c2adbf09782084869", + "src/web/thin.js": "2316e4cbfcc0c18cd9fde143187c326b933c226ed0231d43bd99a992684b396f", + "src/web/timeline-scroller.js": "487760f8d37a4b9afca3ff70b7ea37212aa384e818843402bffa367c47ebdb57", + "src/web/usage-tabs.js": "5c64ef8fa52c7753abe4bcfbf4452eac25a22542975bec83d3321b509598c124", + "src/web/view-delta.js": "d382ed261bc30153561707768edd3ed21468a6b876f8502bd54295c3c63f0a09", + "src/web/view-prefetch.js": "8bb47eb3c114fc6230c445beede69cb870a18817c14a32fddf178336fe80c390", + "src/web/view-transition.js": "7d96a42ba5c8ba7faa36d58925e12075bf81376cb0c3d144618e2cd396b2e1ab", + "src/web/viewer-feedback.js": "a5c031b62b0c2161e30bb8557d6517e2533a2321c27988a8a8b73cdb62e54973", + "src/web/viewer-quality.js": "244662bea894b974db8e5906b09d0ab459cb6081a24dd7966a582b7c0f45d9cc", + "src/web/viewer-rpc.js": "931148dbd827494f1da27f73ec63c0156af6a7959201c2bc08a84e7a15a85bea", + "src/web/viewer-tools.js": "080bc474bf5f6a21cbdeb3018752dae388aeb3086a0dec6aeaeb3ae555558a2b", + "src/web/voice-mic.js": "7ce685b0b1086b84ed35a552647f3c43f969c4e16ab6475a419cef2e14b452b2", + "src/web/wire.js": "eb8764e7a951ed3e8d464e314379381b836421227ffd9550035231ddb024e7fe", + "src/web/workspace-hints.js": "0dada83418bf7a758b31f30ff6137177ec8153c27d0c14a20cfdeb3426e05abc", + "src/web/workspace-keys.js": "244944bc69a5bdff91b8eb5679280b45ddeeee5a0bdcb93229eb998f248e0cf2", + "src/web/workspace-menus.js": "abdbc1e59ae937d3d301aa9e206652ee7f6fda4153e5b41981a69bbee923ae0c" + }, + "canonicalMeasurement": { + "platform": "Windows", + "release": "2025Server", + "windowsVersion": "10.0.26100", + "peImports": { + "machine": "0x8664", + "imports": [ + "ntdll.dll", + "KERNEL32.dll", + "api-ms-win-core-synch-l1-2-0.dll", + "bcryptprimitives.dll" + ], + "delayImports": [ + "WSOCK32.dll", + "CRYPT32.dll", + "WS2_32.dll", + "dbghelp.dll", + "USERENV.dll", + "USER32.dll", + "ADVAPI32.dll", + "ole32.dll", + "SHELL32.dll", + "OLEAUT32.dll", + "IPHLPAPI.DLL" + ] + }, + "systemLibraries": [ + { + "name": "ntdll.dll", + "path": "C:\\Windows\\System32\\ntdll.dll", + "sha256": "160ef9b82e2895ef48fa031cb1cf683a8b123febf7cf7d5590cd3104864424b3", + "bytes": 2541720, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "kernel32.dll", + "path": "C:\\Windows\\System32\\kernel32.dll", + "sha256": "601aaacb3bdcbea24aec832d08a2f12ec7046183b6f40d18d61458d5e7008991", + "bytes": 853648, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "api-ms-win-core-synch-l1-2-0.dll", + "classification": "approved-system", + "redistributed": false, + "architecture": "windows-x64", + "apiSet": true + }, + { + "name": "bcryptprimitives.dll", + "path": "C:\\Windows\\System32\\bcryptprimitives.dll", + "sha256": "dd5275b711031fdb203b507a4dc6977fd8fa8ca18ca361f9f324457087db5106", + "bytes": 732776, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "wsock32.dll", + "path": "C:\\Windows\\System32\\wsock32.dll", + "sha256": "7c6658e8ddb19e10679c13050bc7febc33d190b162b653ebafb0da6e7d292519", + "bytes": 40960, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "crypt32.dll", + "path": "C:\\Windows\\System32\\crypt32.dll", + "sha256": "872700aa27e515f3b08e84d321701aeae0899cab435299f161b38db7d2a775f9", + "bytes": 1578808, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "ws2_32.dll", + "path": "C:\\Windows\\System32\\ws2_32.dll", + "sha256": "8a31219d7447e4db83499fb9d7a30db963a1fb38b2f0bae855fdf8117fcd7682", + "bytes": 541048, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "dbghelp.dll", + "path": "C:\\Windows\\System32\\dbghelp.dll", + "sha256": "e9786d6cfbf1500838f6f308e173631e6ec5064ec695bb847e6e833871e5e840", + "bytes": 2307560, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "userenv.dll", + "path": "C:\\Windows\\System32\\userenv.dll", + "sha256": "278fc09cfb324f37f9c23bfdf98bfe0e040fe8dee40ec0b2acc3689e479b1d3d", + "bytes": 187496, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "user32.dll", + "path": "C:\\Windows\\System32\\user32.dll", + "sha256": "d2bcc3d2fc93d4c237eade68ea6a6599ed3db8afef1e8b9bf0dd4874e1ed1dff", + "bytes": 1899744, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "advapi32.dll", + "path": "C:\\Windows\\System32\\advapi32.dll", + "sha256": "52772d37fbc97957025d2738b423d0a15d57159a9b567c945441fcc7d1ab0dbd", + "bytes": 766048, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "ole32.dll", + "path": "C:\\Windows\\System32\\ole32.dll", + "sha256": "ca1a1baf49dce011c74857381df167e98ecc25a5a461982ec6427a8a4ec1e479", + "bytes": 1708040, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "shell32.dll", + "path": "C:\\Windows\\System32\\shell32.dll", + "sha256": "85f56aeda86949de8a2e15772e4fe49788f5eb703272dd6508793e4a2d72bee8", + "bytes": 7801848, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "oleaut32.dll", + "path": "C:\\Windows\\System32\\oleaut32.dll", + "sha256": "3c1470ae0e32717507a2920634e995239b35a3fd6d430ca8ab31e8bb544d599c", + "bytes": 907760, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "iphlpapi.dll", + "path": "C:\\Windows\\System32\\iphlpapi.dll", + "sha256": "af2329cc8982ba3633934840828a00b51083ce96dad6075e757f498eb403821f", + "bytes": 224648, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false + }, + { + "name": "msvcrt.dll", + "path": "C:\\Windows\\System32\\msvcrt.dll", + "sha256": "d968512ef57a25b03e91ba97f59b57c4e3debe0d7cb8c25c88c56421b4986d67", + "bytes": 716080, + "architecture": "windows-x64", + "classification": "approved-system", + "redistributed": false, + "observedExports": [ + "_get_osfhandle" + ] + } + ], + "dependencyGraph": [ + { + "from": "service", + "name": "ntdll.dll", + "kind": "normal", + "resolvedSystemPath": "C:\\Windows\\System32\\ntdll.dll" + }, + { + "from": "service", + "name": "KERNEL32.dll", + "kind": "normal", + "resolvedSystemPath": "C:\\Windows\\System32\\kernel32.dll" + }, + { + "from": "service", + "name": "api-ms-win-core-synch-l1-2-0.dll", + "kind": "normal", + "resolvedSystemPath": "apiset:api-ms-win-core-synch-l1-2-0.dll" + }, + { + "from": "service", + "name": "bcryptprimitives.dll", + "kind": "normal", + "resolvedSystemPath": "C:\\Windows\\System32\\bcryptprimitives.dll" + }, + { + "from": "service", + "name": "WSOCK32.dll", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\wsock32.dll" + }, + { + "from": "service", + "name": "CRYPT32.dll", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\crypt32.dll" + }, + { + "from": "service", + "name": "WS2_32.dll", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\ws2_32.dll" + }, + { + "from": "service", + "name": "dbghelp.dll", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\dbghelp.dll" + }, + { + "from": "service", + "name": "USERENV.dll", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\userenv.dll" + }, + { + "from": "service", + "name": "USER32.dll", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\user32.dll" + }, + { + "from": "service", + "name": "ADVAPI32.dll", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\advapi32.dll" + }, + { + "from": "service", + "name": "ole32.dll", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\ole32.dll" + }, + { + "from": "service", + "name": "SHELL32.dll", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\shell32.dll" + }, + { + "from": "service", + "name": "OLEAUT32.dll", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\oleaut32.dll" + }, + { + "from": "service", + "name": "IPHLPAPI.DLL", + "kind": "delay", + "resolvedSystemPath": "C:\\Windows\\System32\\iphlpapi.dll" + }, + { + "from": "service", + "name": "kernel32.dll", + "kind": "dynamic", + "resolvedSystemPath": "C:\\Windows\\System32\\kernel32.dll" + }, + { + "from": "service", + "name": "msvcrt.dll", + "kind": "dynamic", + "resolvedSystemPath": "C:\\Windows\\System32\\msvcrt.dll" + } + ], + "runtimeLoaderImports": [], + "dynamicLoads": [ + { + "name": "kernel32.dll", + "declaredBy": [ + "src/server/effects/host.js", + "src/server/effects/hublock.js", + "src/server/effects/kicad_library.js", + "src/server/effects/locks.js", + "src/server/effects/pty.js", + "src/server/effects/zip.js" + ] + }, + { + "name": "msvcrt.dll", + "declaredBy": [ + "src/server/effects/zip.js" + ] + } + ], + "sourceDisposition": "Microsoft Windows system DLLs; no system binary is copied or redistributed." + }, + "msvcrtObservation": { + "nativeSystemDirectory": "C:\\Windows\\System32", + "measuredPath": "C:\\Windows\\System32\\msvcrt.dll", + "loadedImagePath": "C:\\Windows\\System32\\msvcrt.dll", + "sha256": "d968512ef57a25b03e91ba97f59b57c4e3debe0d7cb8c25c88c56421b4986d67", + "peMachine": "0x8664", + "export": "_get_osfhandle", + "exportAddress": "0x7ffd884b0360", + "exportInvoked": false + }, + "python": { + "version": "3.12.10 (tags/v3.12.10:0cc8128, Apr 8 2025, 12:21:36) [MSC v.1943 64 bit (AMD64)]", + "executable": "C:\\hostedtoolcache\\windows\\Python\\3.12.10\\x64\\python.exe", + "machine": "AMD64", + "utf8Mode": 1 + } +} diff --git a/extra/kicad-927-native-fix/evidence/run-41896427524/result.json b/extra/kicad-927-native-fix/evidence/run-41896427524/result.json new file mode 100644 index 0000000000..19890b1a62 --- /dev/null +++ b/extra/kicad-927-native-fix/evidence/run-41896427524/result.json @@ -0,0 +1,547 @@ +{ + "schema": 1, + "issue": 927, + "status": "FAIL", + "cases": [ + { + "name": "program-files", + "home": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\home-program-files 日本", + "pid": 3940, + "phase": "ready", + "origin": "http://127.0.0.1:56716", + "tourSkipped": true + }, + { + "name": "native-path", + "home": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\home-native-path 日本", + "pid": 4568, + "phase": "ready", + "origin": "http://127.0.0.1:31035", + "tourSkipped": true + }, + { + "name": "manual-0", + "home": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\home-manual-0 日本", + "pid": 10080, + "phase": "ready", + "origin": "http://127.0.0.1:38075", + "tourSkipped": true, + "inputAttempts": [ + { + "typed": "C:\\backplane_kicad\\", + "dom": "C:\\backplane_kicad\\", + "codePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92 + ] + } + ], + "typed": "C:\\backplane_kicad\\", + "dom": "C:\\backplane_kicad\\", + "domCodePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92 + ], + "saved": "C:\\backplane_kicad\\", + "savedCodePoints": [ + 67, + 58, + 92, + 98, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 95, + 107, + 105, + 99, + 97, + 100, + 92 + ], + "reloadPreserved": true, + "lastHealth": { + "commit": "8e4447d4fabc62777ac64721a8b420fed120cf4d", + "version": "10.99.0-bp.6", + "fork": true, + "cli": "C:/backplane_kicad/bin/kicad-cli.exe", + "again": false, + "busy": false, + "ipc": "", + "library_error": "", + "can_install": true, + "auth.probe": false, + "status": "ok", + "stamp": "C:/backplane_kicad/bin/kicad-cli.exe=0:4035072:1792446974:1:0:1793820260:0:689:1792446986:absent\n", + "setting": "C:\backplane_kicad\\", + "why": "", + "runs": true, + "source": "setting", + "api": 2, + "caps": [ + "api-server", + "headless-pcb", + "headless-sch", + "export-v10", + "parent-pid", + "capabilities", + "sketch-route", + "board-structure", + "assembly", + "idle-exit", + "shutdown", + "api-descriptor", + "symbol-from-libid", + "footprint-partial-update" + ], + "upstreamCommit": "fe761fb867a1c26e301c57d6da360867717757c7", + "kicadVersion": "10.99.0" + } + }, + { + "name": "manual-1", + "home": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\home-manual-1 日本", + "pid": 6604, + "phase": "ready", + "origin": "http://127.0.0.1:48974", + "tourSkipped": true, + "inputAttempts": [ + { + "typed": "C:\\bp927\\new tools\\test\\", + "dom": "C:\\bp927\\new tools\\test\\", + "codePoints": [ + 67, + 58, + 92, + 98, + 112, + 57, + 50, + 55, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92 + ] + } + ], + "typed": "C:\\bp927\\new tools\\test\\", + "dom": "C:\\bp927\\new tools\\test\\", + "domCodePoints": [ + 67, + 58, + 92, + 98, + 112, + 57, + 50, + 55, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92 + ], + "saved": "C:\\bp927\\new tools\\test\\", + "savedCodePoints": [ + 67, + 58, + 92, + 98, + 112, + 57, + 50, + 55, + 92, + 110, + 101, + 119, + 32, + 116, + 111, + 111, + 108, + 115, + 92, + 116, + 101, + 115, + 116, + 92 + ], + "reloadPreserved": true, + "lastHealth": { + "commit": "8e4447d4fabc62777ac64721a8b420fed120cf4d", + "version": "10.99.0-bp.6", + "fork": true, + "cli": "C:/bp927/new tools/test/bin/kicad-cli.exe", + "again": false, + "busy": false, + "ipc": "", + "library_error": "", + "can_install": true, + "auth.probe": false, + "status": "ok", + "stamp": "C:/bp927/new tools/test/bin/kicad-cli.exe=0:4035072:1792446974:1:0:1793820262:0:689:1792446986:absent\n", + "setting": "C:\bp927\new tools\test\\", + "why": "", + "runs": true, + "source": "setting", + "api": 2, + "caps": [ + "api-server", + "headless-pcb", + "headless-sch", + "export-v10", + "parent-pid", + "capabilities", + "sketch-route", + "board-structure", + "assembly", + "idle-exit", + "shutdown", + "api-descriptor", + "symbol-from-libid", + "footprint-partial-update" + ], + "upstreamCommit": "fe761fb867a1c26e301c57d6da360867717757c7", + "kicadVersion": "10.99.0" + } + }, + { + "name": "real-install", + "home": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\home-real-install 日本", + "pid": 10324, + "phase": "ready", + "origin": "http://127.0.0.1:40519", + "tourSkipped": true, + "inputAttempts": [ + { + "typed": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\absent-runtime\\", + "dom": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\absent-runtime\\", + "codePoints": [ + 68, + 58, + 92, + 97, + 92, + 66, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 92, + 66, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 92, + 98, + 117, + 105, + 108, + 100, + 92, + 107, + 105, + 99, + 97, + 100, + 45, + 57, + 50, + 55, + 45, + 110, + 97, + 116, + 105, + 118, + 101, + 92, + 97, + 98, + 115, + 101, + 110, + 116, + 45, + 114, + 117, + 110, + 116, + 105, + 109, + 101, + 92 + ] + }, + { + "typed": "", + "dom": "", + "codePoints": [] + } + ], + "typed": "", + "dom": "", + "domCodePoints": [], + "saved": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\absent-runtime\\", + "savedCodePoints": [ + 68, + 58, + 92, + 97, + 92, + 66, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 92, + 66, + 97, + 99, + 107, + 112, + 108, + 97, + 110, + 101, + 92, + 98, + 117, + 105, + 108, + 100, + 92, + 107, + 105, + 99, + 97, + 100, + 45, + 57, + 50, + 55, + 45, + 110, + 97, + 116, + 105, + 118, + 101, + 92, + 97, + 98, + 115, + 101, + 110, + 116, + 45, + 114, + 117, + 110, + 116, + 105, + 109, + 101, + 92 + ], + "installStartedAt": "2026-11-04T19:25:30.611Z", + "installedCli": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\home-real-install 日本\\kicad\\10.99.0-bp.6\\bin\\kicad-cli.exe", + "installedCliSHA256": "23b81e721e0a38ec8c277837badf4507e5518c4f5ddc9f89ec3d83a7a9ae2d43" + } + ], + "cleanup": [ + { + "pid": 10324, + "uiExited": true + }, + { + "pid": 6604, + "error": "close timeout", + "uiExited": true + }, + { + "pid": 10080, + "error": "close timeout", + "uiExited": true + }, + { + "pid": 4568, + "error": "close timeout", + "uiExited": true + }, + { + "pid": 3940, + "error": "close timeout", + "uiExited": true + } + ], + "published": false, + "hostedRun": { + "githubActions": "true", + "runnerOS": "Windows", + "runId": "41896427524", + "runAttempt": "1", + "repository": "BackplaneWorks/Backplane" + }, + "buildProvenance": { + "compilerMode": "composite-settle-41262875", + "producerWorkId": "w-t1792701529-415584-1614985", + "releaseBuildApproved": false + }, + "releaseBuildApproved": false, + "identity": { + "admin": false, + "sid": "S-1-5-21-3077485881-3661871218-4154919024-1003", + "name": "runnervmhao91\\bp927_e1960707" + }, + "resourcePolicy": { + "maxJobMemoryBytes": 8589934592, + "authorization": "User option 1: allow existing GitHub Windows pagefile for #927 test; retain cap and record paging", + "scope": "This #927 consumer and separate #946 native measurement only", + "allowExistingPagefile": true, + "pagefileModificationAllowed": false + }, + "resourcesStart": { + "pagingCounterScope": "Host-wide raw Windows memory counters; use timestamp/frequency deltas, not process attribution", + "peakJobMemoryBytes": 265170944, + "pagingCounters": { + "PageReadsPersec": 91882, + "PageWritesPersec": 0, + "PagesInputPersec": 908951, + "PagesOutputPersec": 0, + "PageFaultsPersec": 7165911, + "Timestamp_PerfTime": 2133070913, + "Frequency_PerfTime": 10000000, + "AvailableBytes": 13355458560, + "CommittedBytes": 2978013184, + "CommitLimit": 20265758720 + }, + "jobMemoryLimitBytes": 8589934592, + "peakProcessMemoryBytes": 145018880, + "observedAt": "2026-11-04T19:24:55.3016287Z", + "pageFiles": [ + { + "Name": "D:\\pagefile.sys", + "AllocatedBaseSize": 2944, + "CurrentUsage": 0, + "PeakUsage": 0 + } + ], + "limitFlags": 512, + "pid": 9136, + "member": true + }, + "package": { + "sourceCommit": "afa9679273206b3e9b1da4c966c9b63fb6f57ab4", + "sourceTree": "ec6c85b4a8b62a0227f09151a9ec52a362b20ae2", + "version": "0.14.2", + "zipSHA256": "de613310949b72b0a70bebf9a07aff021cdea98f894856fabdc42134d678cd22", + "executableSHA256": "ede316a237497aecc025cc31ac994b5af269a6ba81bf3cb2b612b4f2df4977d0", + "serviceSHA256": "11f53c9619d095e0ccd520c5616743155ee240b9637021d4d5a0bea4707aadd1" + }, + "failures": [ + { + "name": "program-files", + "error": "Error: Invalid production health JSON: Bad escaped character in JSON at position 665 (line 1 column 666)\n at health (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:34:25)\n at D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:117:55\n at until (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:23:51)\n at detected (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:117:17)\n at D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:174:55\n at async check (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:124:9)\n at async main (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:173:3)" + }, + { + "name": "native-path", + "error": "Error: Invalid production health JSON: Bad escaped character in JSON at position 688 (line 1 column 689)\n at health (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:34:25)\n at D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:117:55\n at until (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:23:51)\n at detected (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:117:17)\n at D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:177:67\n at async check (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:124:9)\n at async main (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:176:3)" + }, + { + "name": "manual-0", + "error": "Error: Invalid production health JSON: Bad escaped character in JSON at position 660 (line 1 column 661)\n at health (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:34:25)\n at D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:109:13\n at until (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:23:51)\n at typePath (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:108:17)\n at async D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:187:13\n at async check (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:124:9)\n at async main (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:183:5)" + }, + { + "name": "manual-1", + "error": "Error: Invalid production health JSON: Bad escaped character in JSON at position 660 (line 1 column 661)\n at health (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:34:25)\n at D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:109:13\n at until (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:23:51)\n at typePath (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:108:17)\n at async D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:187:13\n at async check (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:124:9)\n at async main (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:183:5)" + }, + { + "name": "install-health-json", + "error": "Invalid production health JSON: Bad escaped character in JSON at position 318 (line 1 column 319)" + }, + { + "name": "real-install", + "error": "Error: literal persisted setting timed out\n at until (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:24:9)\n at async typePath (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:106:3)\n at async installInput (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:205:19)\n at async D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:238:11\n at async check (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:124:9)\n at async main (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:201:3)" + } + ], + "error": "AssertionError [ERR_ASSERTION]: One or more native acceptance cases failed; see failures and partial evidence\n\n6 !== 0\n\n at main (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:250:10)" +} diff --git a/extra/kicad-927-native-fix/evidence/run-41898136634/resources-end.json b/extra/kicad-927-native-fix/evidence/run-41898136634/resources-end.json new file mode 100644 index 0000000000..c6232e03d1 --- /dev/null +++ b/extra/kicad-927-native-fix/evidence/run-41898136634/resources-end.json @@ -0,0 +1,30 @@ +{ + "pagingCounterScope": "Host-wide raw Windows memory counters; use timestamp/frequency deltas, not process attribution", + "pid": 3984, + "peakProcessMemoryBytes": 611639296, + "limitFlags": 512, + "observedAt": "2026-11-04T19:36:55.3743990Z", + "peakJobMemoryBytes": 1108713472, + "jobMemoryLimitBytes": 8589934592, + "pageFiles": [ + { + "Name": "D:\\pagefile.sys", + "AllocatedBaseSize": 2944, + "CurrentUsage": 0, + "PeakUsage": 0 + } + ], + "pagingCounters": { + "PageReadsPersec": 151529, + "PageWritesPersec": 0, + "PagesInputPersec": 1440795, + "PagesOutputPersec": 0, + "PageFaultsPersec": 10224497, + "Timestamp_PerfTime": 7317819252, + "Frequency_PerfTime": 10000000, + "AvailableBytes": 13753307136, + "CommittedBytes": 3032276992, + "CommitLimit": 20261367808 + }, + "member": true +} diff --git a/extra/kicad-927-native-fix/evidence/run-41898136634/resources-start.json b/extra/kicad-927-native-fix/evidence/run-41898136634/resources-start.json new file mode 100644 index 0000000000..e4b404a69b --- /dev/null +++ b/extra/kicad-927-native-fix/evidence/run-41898136634/resources-start.json @@ -0,0 +1,30 @@ +{ + "pagingCounterScope": "Host-wide raw Windows memory counters; use timestamp/frequency deltas, not process attribution", + "pid": 3984, + "peakProcessMemoryBytes": 144986112, + "limitFlags": 512, + "observedAt": "2026-11-04T19:35:36.6395194Z", + "peakJobMemoryBytes": 260636672, + "jobMemoryLimitBytes": 8589934592, + "pageFiles": [ + { + "Name": "D:\\pagefile.sys", + "AllocatedBaseSize": 2944, + "CurrentUsage": 0, + "PeakUsage": 0 + } + ], + "pagingCounters": { + "PageReadsPersec": 95767, + "PageWritesPersec": 0, + "PagesInputPersec": 1005197, + "PagesOutputPersec": 0, + "PageFaultsPersec": 7751667, + "Timestamp_PerfTime": 6530419440, + "Frequency_PerfTime": 10000000, + "AvailableBytes": 12594372608, + "CommittedBytes": 3887648768, + "CommitLimit": 20261367808 + }, + "member": true +} diff --git a/extra/kicad-927-native-fix/evidence/run-41898136634/result.json b/extra/kicad-927-native-fix/evidence/run-41898136634/result.json new file mode 100644 index 0000000000..1e3985432b --- /dev/null +++ b/extra/kicad-927-native-fix/evidence/run-41898136634/result.json @@ -0,0 +1,100 @@ +{ + "schema": 1, + "issue": 927, + "status": "FAIL", + "cases": [ + { + "name": "real-install", + "home": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\home-real-install 日本", + "pid": 7432, + "phase": "ready", + "origin": "http://127.0.0.1:40519", + "tourSkipped": true, + "noManualOverride": true, + "installStartedAt": "2026-11-04T19:36:34.955Z", + "installedCli": "D:\\a\\Backplane\\Backplane\\build\\kicad-927-native\\home-real-install 日本\\kicad\\10.99.0-bp.6\\bin\\kicad-cli.exe", + "installedCliSHA256": "23b81e721e0a38ec8c277837badf4507e5518c4f5ddc9f89ec3d83a7a9ae2d43", + "version": "10.99.0", + "installCompletedAt": "2026-11-04T19:36:55.147Z", + "realInstallBytesAndCliVerified": true + } + ], + "cleanup": [ + { + "pid": 7432, + "uiExited": true + } + ], + "published": false, + "hostedRun": { + "githubActions": "true", + "runnerOS": "Windows", + "runId": "41898136634", + "repository": "BackplaneWorks/Backplane", + "runAttempt": "1" + }, + "buildProvenance": { + "compilerMode": "composite-settle-41262875", + "producerWorkId": "w-t1792701529-415584-1614985", + "releaseBuildApproved": false + }, + "releaseBuildApproved": false, + "identity": { + "admin": false, + "sid": "S-1-5-21-3077485881-3661871218-4154919024-1003", + "name": "runnervmhao91\\bp927_276a4893" + }, + "resourcePolicy": { + "allowExistingPagefile": true, + "scope": "This #927 consumer and separate #946 native measurement only", + "pagefileModificationAllowed": false, + "authorization": "User option 1: allow existing GitHub Windows pagefile for #927 test; retain cap and record paging", + "maxJobMemoryBytes": 8589934592 + }, + "resourcesStart": { + "pagingCounterScope": "Host-wide raw Windows memory counters; use timestamp/frequency deltas, not process attribution", + "pid": 3984, + "peakProcessMemoryBytes": 144986112, + "limitFlags": 512, + "observedAt": "2026-11-04T19:35:36.6395194Z", + "peakJobMemoryBytes": 260636672, + "jobMemoryLimitBytes": 8589934592, + "pageFiles": [ + { + "Name": "D:\\pagefile.sys", + "AllocatedBaseSize": 2944, + "CurrentUsage": 0, + "PeakUsage": 0 + } + ], + "pagingCounters": { + "PageReadsPersec": 95767, + "PageWritesPersec": 0, + "PagesInputPersec": 1005197, + "PagesOutputPersec": 0, + "PageFaultsPersec": 7751667, + "Timestamp_PerfTime": 6530419440, + "Frequency_PerfTime": 10000000, + "AvailableBytes": 12594372608, + "CommittedBytes": 3887648768, + "CommitLimit": 20261367808 + }, + "member": true + }, + "package": { + "sourceCommit": "afa9679273206b3e9b1da4c966c9b63fb6f57ab4", + "sourceTree": "ec6c85b4a8b62a0227f09151a9ec52a362b20ae2", + "version": "0.14.2", + "zipSHA256": "de613310949b72b0a70bebf9a07aff021cdea98f894856fabdc42134d678cd22", + "executableSHA256": "ede316a237497aecc025cc31ac994b5af269a6ba81bf3cb2b612b4f2df4977d0", + "serviceSHA256": "11f53c9619d095e0ccd520c5616743155ee240b9637021d4d5a0bea4707aadd1" + }, + "acceptanceMode": "install-only", + "failures": [ + { + "name": "real-install", + "error": "Error: Invalid production health JSON: Bad escaped character in JSON at position 541 (line 1 column 542)\n at health (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:34:25)\n at D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:254:59\n at until (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:23:51)\n at D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:254:13\n at async check (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:124:9)\n at async main (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:204:3)" + } + ], + "error": "AssertionError [ERR_ASSERTION]: One or more native acceptance cases failed; see failures and partial evidence\n\n1 !== 0\n\n at main (D:\\a\\Backplane\\Backplane\\extra\\kicad-927-consumer\\accept.cjs:262:10)" +} diff --git a/scripts/local-small.py b/scripts/local-small.py index 30c7212574..256b3ee54f 100644 --- a/scripts/local-small.py +++ b/scripts/local-small.py @@ -10,6 +10,7 @@ subprocess.run(['node', '--test', 'test/tools/static_file_test.mjs'], cwd=root, check=True) subprocess.run(['node', '--test', 'test/tools/bounded_cache_test.mjs'], cwd=root, check=True) subprocess.run(['bun', 'test/tools/secret_save_test.mjs'], cwd=root, check=True) +subprocess.run(['bun', 'test/tools/atomic_text_test.cjs'], cwd=root, check=True) subprocess.run([sys.executable, 'test/tools/secret_box_handler_test.py'], cwd=root, check=True) # Required in every local lane, including focused-only and guards-only. subprocess.run([sys.executable, 'test/tools/sidebar_draft_guard_test.py'], cwd=root, check=True) diff --git a/src/server/effects/host.js b/src/server/effects/host.js index d15d6f9681..42ab363334 100644 --- a/src/server/effects/host.js +++ b/src/server/effects/host.js @@ -1877,6 +1877,27 @@ function fs_rename(from, to) { } } +function fs_write_atomic(destination, text) { + const fs = require("fs"), path = require("path"); + let stage, fd; + try { + stage = fs.mkdtempSync(path.join(path.dirname(destination), ".backplane-write-")); + const file = path.join(stage, "text"); + fd = fs.openSync(file, "wx", 0o600); + fs.writeFileSync(fd, text, { encoding: "utf8" }); + fs.closeSync(fd); fd = undefined; + // Same filesystem, so readers see either the previous complete file or + // this complete file. A failed write/rename preserves the previous cache. + fs.renameSync(file, destination); + return io_done({ $: "Unit" }); + } catch (e) { + return io_fail(host_errno(e)); + } finally { + if (fd !== undefined) { try { fs.closeSync(fd); } catch (_) {} } + if (stage) { try { fs.rmSync(stage, { recursive: true, force: true }); } catch (_) {} } + } +} + function fs_remove(path) { try { require("fs").rmSync(path); @@ -2341,6 +2362,7 @@ io_eff(CID(FS.list), fs_list); io_eff(CID(FS.mkdirs), fs_mkdirs); io_eff(CID(FS.mkdtemp), fs_mkdtemp); io_eff(CID(FS.rename), fs_rename); +io_eff(CID(FS.write_atomic), fs_write_atomic); io_eff(CID(FS.remove), fs_remove); io_eff(CID(FS.chmod), fs_chmod); io_eff(CID(FS.pairing_token), fs_pairing_token); diff --git a/src/server/host.bend b/src/server/host.bend index f99adc1731..32d0b186aa 100644 --- a/src/server/host.bend +++ b/src/server/host.bend @@ -224,6 +224,11 @@ def FS.mkdtemp(prefix: String) -> IO(Result<&1, &1, U32 & String, String>): def FS.rename(from: String, to: String) -> IO(Result<&1, &1, U32 & String, Unit>): import "./effects/host.js" +# Replace a UTF-8 text file through a private same-directory temporary file. +# Text and paths never pass through a shell or a child argument parser. +def FS.write_atomic(path: String, text: String) -> IO(Result<&1, &1, U32 & String, Unit>): + import "./effects/host.js" + def FS.remove(path: String) -> IO(Result<&1, &1, U32 & String, Unit>): import "./effects/host.js" diff --git a/src/server/kicad.bend b/src/server/kicad.bend index 55507a6bbd..9eb6ee3a26 100644 --- a/src/server/kicad.bend +++ b/src/server/kicad.bend @@ -476,7 +476,9 @@ def Rt.run(+rt: Rt) -> IO(Rt): IO.bind(Bool, Rt, Io.is_file(Rt.cli(rt)), found => Rt.run.k(found, rt)) def Rt.save(+home: String, +rt: Rt) -> IO(Unit): - IO.bind(P.Ran, Unit, P.Proc.run("sh", ["-c", "umask 077; printf '%s' \"$2\" > \"$1.tmp\" && mv \"$1.tmp\" \"$1\"", "sh", home ++ "/kicad-health.json", J.Json.show(Rt.json(rt))], "/"), _ => IO.pure(Unit, Unit{})) + # Native Windows argv quoting and Cygwin's parser disagree on backslashes: + # transporting JSON as a shell argument can turn \\b into a backspace. + IO.bind(Result<&1, &1, U32 & String, Unit>, Unit, H.FS.write_atomic(home ++ "/kicad-health.json", J.Json.show(Rt.json(rt))), _ => IO.pure(Unit, Unit{})) def Rt.refresh.k(check: Bool, +home: String, +setting: String, +stamp: String, +cs: List<&2, KCandidate>, can: Bool, +last: Rt) -> IO(Rt): match check: diff --git a/test/native/kicad_cache.bend b/test/native/kicad_cache.bend new file mode 100644 index 0000000000..ebb8e3e581 --- /dev/null +++ b/test/native/kicad_cache.bend @@ -0,0 +1,15 @@ +import Base +import ../../src/server/kicad.bend as K +import ../../src/core/json.bend as J +import ../check.bend as C + +def main() -> IO(Unit): + do IO: + +home : String <- K.Rt.env("TEST_KICAD_CACHE_HOME") + +setting : String <- K.Rt.env("TEST_KICAD_CACHE_SETTING") + +rt : K.Rt = K.Rt.set(K.Rt{"C:/Program Files/KiCad/bin/kicad-cli.exe", True{}, "10.99.0-bp.6", "fixture", J.Null{}}, "setting", J.Str{setting}) + +expected : String = J.Json.show(K.Rt.json(rt)) + K.Rt.save(home, rt) + +actual : String <- K.Io.text(home ++ "/kicad-health.json") + C.Check.str("native saved JSON bytes", actual, expected) + C.Check.str("native saved Windows setting", J.Json.get_str(Maybe.default(&2, J.Json, J.Json.parse(actual), J.Null{}), "setting", "missing"), setting) diff --git a/test/tools/atomic_text_test.cjs b/test/tools/atomic_text_test.cjs new file mode 100644 index 0000000000..7979903fed --- /dev/null +++ b/test/tools/atomic_text_test.cjs @@ -0,0 +1,52 @@ +'use strict'; +// Run on Boat or a disposable native Windows runner, never a user's machine. +const assert = require('node:assert/strict'); +const fs = require('node:fs'); +const path = require('node:path'); +const os = require('node:os'); +const source = fs.readFileSync(path.join(__dirname, '../../src/server/effects/host.js'), 'utf8') + .replace(/CID\(([^)]+)\)/g, '"$1"'); +// POSIX argv would hide a caller-only reversion to the original shell writer. +// Keep this assertion in the small gate as well as exercising the native effect. +const saveDefinition = fs.readFileSync(path.join(__dirname, '../../src/server/kicad.bend'), 'utf8') + .split(/^def /m).find(definition => definition.startsWith('Rt.save(')); +assert(saveDefinition, 'Production Rt.save definition is missing'); +assert.match(saveDefinition, /\bH\.FS\.write_atomic\(/, 'Rt.save must use the native atomic writer'); +assert.doesNotMatch(saveDefinition, /\b(?:P\.)?Proc\.run\(/, 'Rt.save must never transport JSON through child argv'); +function writer(io = fs) { + const effects = new Map(); + new Function('require', 'io_eff', 'io_done', 'io_fail', source)( + name => name === 'fs' ? io : require(name), (id, fn) => effects.set(id, fn), + value => ({ ok: true, value }), errno => ({ ok: false, errno })); + return effects.get('FS.write_atomic'); +} +const folder = fs.mkdtempSync(path.join(os.tmpdir(), 'bp atomic 日本 ')); +try { + const target = path.join(folder, 'kicad-health.json'); + const values = ['C:\\backplane_kicad\\', 'C:\\bp927\\new tools\\test\\', + 'D:\\Program Files\\KiCad\\bin\\kicad-cli.exe', '\\\\server\\share\\new\\test\\', + 'quotes " and \\ and actual controls \b\n\t and 日本']; + const write = writer(); + for (const setting of values) { + const text = JSON.stringify({ setting, stamp: values.join('\n') }); + assert.equal(write(target, text).ok, true); + assert.equal(fs.readFileSync(target, 'utf8'), text); + assert.equal(JSON.parse(fs.readFileSync(target, 'utf8')).setting, setting); + assert.deepEqual(fs.readdirSync(folder), ['kicad-health.json']); + if (process.platform !== 'win32') assert.equal(fs.statSync(target).mode & 0o777, 0o600); + } + const previous = fs.readFileSync(target, 'utf8'); + for (const failure of ['writeFileSync', 'renameSync']) { + const broken = Object.create(fs); + broken[failure] = (...args) => { + if (failure === 'writeFileSync') fs.writeSync(args[0], 'partial'); + throw Object.assign(Error('injected disk failure'), { errno: 5 }); + }; + assert.equal(writer(broken)(target, 'incomplete').ok, false); + assert.equal(fs.readFileSync(target, 'utf8'), previous); + assert.deepEqual(fs.readdirSync(folder), ['kicad-health.json']); + } + assert.equal(write(path.join(folder, 'absent', 'cache.json'), 'x').ok, false); + assert.equal(fs.readFileSync(target, 'utf8'), previous); + console.log('ok native atomic UTF-8 text: caller has no shell transport; Windows escapes, replacement, private mode, failure preservation and cleanup'); +} finally { fs.rmSync(folder, { recursive: true, force: true }); } diff --git a/test/tools/kicad_cache_test.py b/test/tools/kicad_cache_test.py new file mode 100644 index 0000000000..ba283a28d7 --- /dev/null +++ b/test/tools/kicad_cache_test.py @@ -0,0 +1,40 @@ +"""Compile/run the actual Rt.save boundary on Boat, or a hosted Windows runner.""" +import json +import os +from pathlib import Path +import shutil +import subprocess +import tempfile +import unittest + +ROOT = Path(__file__).resolve().parents[2] + + +class Cache(unittest.TestCase): + def test_production_save_literal_windows_paths(self): + with tempfile.TemporaryDirectory(prefix='bp-cache 日本 ') as tmp: + folder = Path(tmp) + program = folder / 'cache.js' + subprocess.run(['bend', 'test/native/kicad_cache.bend', '-o', str(program)], + cwd=ROOT, check=True, timeout=90) + home = folder / 'home with spaces' + home.mkdir() + values = ['C:\\backplane_kicad\\', 'C:\\bp927\\new tools\\test\\', + 'D:\\Program Files\\KiCad\\', '\\\\server\\share\\new\\test\\', + 'quotes " and actual controls \b\n\t 日本'] + for setting in values: + with self.subTest(setting=setting): + env = dict(os.environ, TEST_KICAD_CACHE_HOME=str(home), + TEST_KICAD_CACHE_SETTING=setting) + result = subprocess.run([shutil.which('bun'), str(program)], + cwd=ROOT, env=env, text=True, + capture_output=True, timeout=30) + self.assertEqual(result.returncode, 0, result.stdout + result.stderr) + self.assertNotRegex(result.stdout + result.stderr, r'(?m)^(FAIL|Error:)') + self.assertIn('ok native saved Windows setting', result.stdout) + self.assertEqual(json.loads((home / 'kicad-health.json').read_text())['setting'], setting) + self.assertEqual([p.name for p in home.iterdir()], ['kicad-health.json']) + + +if __name__ == '__main__': + unittest.main(verbosity=2)