From 4ca490cb4f7e590523aa646b66db1b335c3f8bc4 Mon Sep 17 00:00:00 2001 From: David Refoua Date: Fri, 30 Oct 2026 17:14:50 +0330 Subject: [PATCH 1/3] Align framing validation and track cross-controller convergence --- desktop/src/main.rs | 22 +++++- docs/FILE-COMPARISON.md | 39 +++++----- docs/REUSE-PREFLIGHT-RECEIPT.md | 45 +++++++++++ docs/TRANSPORT-CONVERGENCE.md | 111 ++++++++++++++++++++++++++++ docs/file-comparison-evidence.json | 58 ++++++++++----- docs/file-comparison.csv | 48 ++++++------ docs/reuse-capabilities.json | 1 + libraries/BoardCore/src/WireCodec.h | 1 + mobile/lib/usb_transport.dart | 4 +- mobile/test/usb_transport_test.dart | 7 ++ tests/fixtures/cobs.json | 92 +++++++++++++++++++++++ tests/protocol_test.cpp | 6 ++ 12 files changed, 373 insertions(+), 61 deletions(-) create mode 100644 docs/TRANSPORT-CONVERGENCE.md create mode 100644 tests/fixtures/cobs.json diff --git a/desktop/src/main.rs b/desktop/src/main.rs index 0c4823e7..3f19b803 100644 --- a/desktop/src/main.rs +++ b/desktop/src/main.rs @@ -2144,6 +2144,9 @@ fn cobs_encode(input: &[u8]) -> Vec { out } fn cobs_decode(input: &[u8]) -> Option> { + if input.is_empty() { + return None; + } let mut out = Vec::new(); let mut at = 0; while at < input.len() { @@ -2153,7 +2156,11 @@ fn cobs_decode(input: &[u8]) -> Option> { } at += 1; for _ in 1..code { - out.push(*input.get(at)?); + let value = *input.get(at)?; + if value == 0 { + return None; + } + out.push(value); at += 1; } if code != 0xff && at < input.len() { @@ -6498,6 +6505,19 @@ mod tests { assert_eq!(payload, vec![80, 2, 1]); } #[test] + fn shared_cobs_vectors() { + let vectors: serde_json::Value = serde_json::from_str(include_str!("../../tests/fixtures/cobs.json")).unwrap(); + let bytes = |v: &serde_json::Value| v.as_array().unwrap().iter().map(|v| u8::try_from(v.as_u64().unwrap()).unwrap()).collect::>(); + for value in vectors["valid"].as_array().unwrap() { + let encoded=bytes(&value["encoded"]);let decoded=bytes(&value["decoded"]); + assert_eq!(cobs_decode(&encoded),Some(decoded.clone())); + let mut actual=cobs_encode(&decoded);assert_eq!(actual.pop(),Some(0)); + assert_eq!(actual,encoded); + } + for value in vectors["invalid"].as_array().unwrap() { assert!(cobs_decode(&bytes(value)).is_none()); } + assert_eq!(crc8(&bytes(&vectors["crc8_atm"]["input"])),vectors["crc8_atm"]["checksum"].as_u64().unwrap() as u8); + } + #[test] fn streaming_packet_bounds() { let p = rainbow_packet(240, 240, true, 20); assert_eq!(p.len(), 730); diff --git a/docs/FILE-COMPARISON.md b/docs/FILE-COMPARISON.md index 38d45c8d..539aa4d2 100644 --- a/docs/FILE-COMPARISON.md +++ b/docs/FILE-COMPARISON.md @@ -2,7 +2,7 @@ Whole-repository superiority is **not established**. This report exposes retained code, scoped improvements, omissions and gaps; it does not turn missing reviews into exclusions. -Routing: 1475 paths have no specialist capability match. They remain visible through `consult-reuse.ps1 -Concern donor-audit` and issue #3; lack of a keyword match is NOT an exclusion. Every CSV row includes capability routing and owning issue links. +Routing: 1466 paths have no specialist capability match. They remain visible through `consult-reuse.ps1 -Concern donor-audit` and issue #3; lack of a keyword match is NOT an exclusion. Every CSV row includes capability routing and owning issue links. Inventory: 4738 files; 436 complete source-file comparisons; 4302 pending comparisons; 310 compared files with known parity gaps. Header/implementation pairs can describe the same gap. Missing sparse files remain pending. @@ -1230,7 +1230,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O - Omitted/replaced code: `UpgradeChannel construction/lifecycle and whole-activity discovery/tone/app-update parity`. Disposition: **pending**. Reason: Pakar separately owns AppUpdateChannel, peer-discovery, BLE and tone channels; this row certifies only the inspected SAF adaptation, not full donor upgrade/automation/discovery/mirroring equivalence or provider/OS behavior. Keep their owning rows and remaining acceptance rather than infer parity from class names. - Test-code evidence: `mobile/test/documents_test.dart:64 [UTF8-LF sha256=641aee7d7a005c5c309683cf98154f571c1e3c398dd5674fc68b020807807df0; anchor=S3 document intake above 2MiB uses one bounded slot policy]`. - Test-code evidence: `mobile/test/documents_test.dart:38 [UTF8-LF sha256=641aee7d7a005c5c309683cf98154f571c1e3c398dd5674fc68b020807807df0; anchor=Changed owner while choosing export abandons token; never writes or deletes]`. -- Test-code evidence: `mobile/test/usb_transport_test.dart:317 [UTF8-LF sha256=19c07b6986d1ebe734d4ffb37aa19b01becc8ebc5bfde504972b9e1e0f3214fd; anchor=Real channel session performs HELLO introduction snapshot and atomic batch without HTTP or DNS]`. +- Test-code evidence: `mobile/test/usb_transport_test.dart:324 [UTF8-LF sha256=c18934fdea3c2001264dcab582a4ebf1c1f5b7897c9ffc514821e4c6047c563f; anchor=Real channel session performs HELLO introduction snapshot and atomic batch without HTTP or DNS]`. - Test-code evidence: `mobile/test/firmware_image_test.dart:215 [UTF8-LF sha256=81f47d2e4a07740c1dab37cf55849a8a5c91eddf47631e7b631da5dad7b6ca4b; anchor=Wrong chip or observed small slot cannot reach manual mutation]`. - Remaining: Verify actual Android document providers, cancellation, process/activity destruction, exact selected-byte upload/export and one-use-token failure behavior on the authorized phone. Dart MethodChannel fixtures are not native SAF/provider or physical OTA proof. Finish useful omitted automation/preferences/new-intent/upgrade lifecycle imports with exact source evidence. @@ -1920,9 +1920,14 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. Original-byte SHA-256: `9a5fde33e199021bb6615bd7ff6d321a258f24ab9099e0a52bc9d857adebae8c`. - Target: `docs/PC-CONTROLLER-MERGE-READINESS.md:68 [UTF8-LF sha256=a023cd4573108622cbd76a62cb52115c7dd6735d1b15999b73df1e5a2a9b96d5; anchor=### Framing and dispatch]`. +- Target: `libraries/BoardCore/src/WireCodec.h:41 [UTF8-LF sha256=8f9bf8a72b39e03415b295ec8b326fb9ba4c20c719ea12263cbad1b61972347c; anchor=if (input[readIndex] == 0) return 0;]`. +- Target: `docs/TRANSPORT-CONVERGENCE.md:9 [UTF8-LF sha256=563b5ad2e461ac39ab0e444ce4a6dd4663ddf229439a3e24c0bec8e4c2a62f32; anchor=## Decision: shared semantics, appropriate carriers]`. - Retained: Read all bounded C++11 CRC/COBS algorithms and complete Pakar WireCodec.h. CRC/decoder structure is common; encoder bounds and ownership wrappers differ. Documented the path toward one dependency-free codec rather than silently replacing the live implementation. +- Retained: 2026-10-30: reread both complete primitives against the preserved b0111ae0 donor snapshot. Apply the same zero-in-data-block COBS rejection to both current projects, retaining valid bytes, fixed buffers, in-place decode and owning/borrowed frame boundaries. PC Go host UDP uses its corrected shared Go decoder; the Pakar Rust/Dart adapters gain equivalent validation and targeted regressions. The cross-repository fixture and first-pass decision do not claim complete carrier/API or stock-board interoperability. - Omitted/replaced code: `One-source codec and zero-copy UART integration`. Disposition: **pending**. Reason: A raw algorithm import must preserve maximum framing/capacity behavior, partial RX, synchronous nested replies and 328P stack lifetime. Equal CRC conventions do not justify swapping owning Frame arrays for borrowed views without all consumers. -- Remaining: Issue #3/#6: shared bounded codec conformance, malformed/full-boundary fixtures and AVR lifetime/budget verification; no new test execution is claimed. +- Test-code evidence: `tests/protocol_test.cpp:15 [UTF8-LF sha256=4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144; anchor=Same malformed COBS vectors as PCController]`. +- Test-code evidence: `tests/fixtures/cobs.json:2 [UTF8-LF sha256=81683deafa749b231e483d2b75e4c45cae2a3262cab014ad0a20c74a82b31694; anchor=COBS delimiter-free]`. +- Remaining: Issues #41 and PC#702 coordinate shared core ownership, typed service/opcode compatibility, optional capabilities and full transport/client parity. First-slice fixtures/strict malformed rejection are implemented; AVR lifetime, flash/stack deltas, full-boundary/resource, deployed/LAN/physical and complete shared-code acceptance remain open. ### PCController: `Project/ProtocolContract.h` @@ -2155,7 +2160,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O - Target: `firmware/esp/src/HostDemand.h:9 [UTF8-LF sha256=ed625496269aacbfc22ee281879893a58d9695cad2e2338c24934a6d1018e1b8; anchor=class HostDemand]`. - Target: `firmware/esp/src/HostSerial.h:26 [UTF8-LF sha256=d7dee1d9329e3959d2e362783295de00e6345dfd66cdde3f2ee1def0856fc1da; anchor=serial.enableReboot(false)]`. - Target: `desktop/src/usb_demand.rs:84 [UTF8-LF sha256=1901dd438e454e83718feb769745bd83175a28808d746b5385d523e3c0155dac; anchor=pub struct Lease]`. -- Target: `mobile/lib/usb_transport.dart:87 [UTF8-LF sha256=880728e89341200cfb9c1c846e2c2407e4b105608e5b4dac0355c01b1ce2ad2c; anchor=class PakarUsbTransport]`. +- Target: `mobile/lib/usb_transport.dart:89 [UTF8-LF sha256=6b7600fb34460397f778d5d46239e2e90954c33ae1a2b28f0b37a492185dd13b; anchor=class PakarUsbTransport]`. - Target: `libraries/BoardCore/src/SerialLink.h:26 [UTF8-LF sha256=99373bc4c090e34324cfd2ae8c94d6666c227ad7e157a47fbd85125aac6c13a0; anchor=UartFlow::receiveBudget(serial_.available())]`. - Target: `libraries/BoardCore/src/UartFlow.h:25 [UTF8-LF sha256=44f8638f725c9cf83a6f53639144f107aace1556dd254d6dcebcaed4853c6469; anchor=constexpr uint16_t serviceBudget = 64]`. - Retained: Fully read actual UART API and synchronous payload lifetime contract. Shared SerialLink keeps AVR HardwareSerial ownership, separate RX/TX frame storage and handler/opaque context; Stream constructor preserves the S3 explicit pins/buffers. @@ -2446,7 +2451,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. Original-byte SHA-256: `30454374bc87aeed2d4a536f27a24aa8c382920e9047b40d68a42faef47990c4`. - Target: `desktop/src/bridge.rs:110 [UTF8-LF sha256=a05278f91cf4fe82a4043e4c746422f265b07d070c29c892677211db8af2b2d5; anchor=pub struct Runtime]`. -- Target: `desktop/src/main.rs:2448 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=SerialCommand::Bridge(target]`. +- Target: `desktop/src/main.rs:2455 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=SerialCommand::Bridge(target]`. - Retained: Read through EOF. Preserve primary selected owner and explicit Disconnect/revocation; sharing never opens another serial handle or acquires a board from discovery. Bridge listener starts only on opt-in and closes through owned stop lifetime. - Omitted/replaced code: `Complete host suspend/resume lifecycleInstruction service/Windows power-event integration`. Disposition: **pending**. Reason: Current bridge is scoped to the existing app runtime/connection Gate, not a new always-running service. Listener suspend/resume behavior and platform power callbacks require additional integration and actual host acceptance. - Test-code evidence: `desktop/src/bridge.rs:2179 [UTF8-LF sha256=a05278f91cf4fe82a4043e4c746422f265b07d070c29c892677211db8af2b2d5; anchor=fn bridge_network_repeater_confirms_upstream_usb_readback_and_preserves_both_hops]`. @@ -2552,7 +2557,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O - Target: `firmware/esp/src/WebAccess.h:36 [UTF8-LF sha256=774b524f4cd81c003e4139d0bb6cf3353d987674bbfb49d7a1b989ee2a232294; anchor=ApiPolicy::numberedRoute]`. - Retained: Actual TestVersionedCoreAPIRoutesAreRejected test cases adapted into the C++ helper exercised by ESP async middleware; generalized to all numbered API roots and pre-auth rejection. - Omitted/replaced code: `TestCanonicalRESTRouteInventory, TestRESTAppActionCannotInjectCoordinatorNavigationMetadata, typed app launch/action outcome lifecycle`. Disposition: **pending**. Reason: These exercise the full PCController Go host coordinator, not the ESP handlers. Applicable generic typed action/outcome/auth ownership and full real multiplexer route inventory still need explicit Pakar contracts and tests. The narrower source/wire tests here do not claim end-to-end async server acceptance. -- Test-code evidence: `tests/protocol_test.cpp:79 [UTF8-LF sha256=92cd55f433424863ff59ba08b048c873c205af3133dba1bf1c9aacf5034135af; anchor=Actual donor TestVersionedCoreAPIRoutesAreRejected cases]`. +- Test-code evidence: `tests/protocol_test.cpp:85 [UTF8-LF sha256=4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144; anchor=Actual donor TestVersionedCoreAPIRoutesAreRejected cases]`. - Test-code evidence: `tests/living_contract_test.mjs:26 [UTF8-LF sha256=67389b8a5ef0a051959d1938d52abb6b48edeb194e8a73f51235d376c8121d59; anchor=pre-auth 404 wiring]`. - Remaining: Port applicable real top-level route inventory, typed app outcomes and coordinator-owned metadata spoof tests after mapping the actual Pakar host coordinator. @@ -2584,7 +2589,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O - Target: `mobile/lib/discovery.dart:116 [UTF8-LF sha256=8cb3956f80a50c5be2c134829bc7d323a3f4c58fbbcf1ea5d5e1aaa10ac7fbba; anchor=class DiscoveryCatalog]`. - Target: `mobile/lib/devices_page.dart:73 [UTF8-LF sha256=73b22cde59bac6f882fd989e6494a09d3d19b010b0fc8e5ae69e55591eca44c0; anchor=catalog]`. - Target: `desktop/src/peer_http.rs:339 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=pub fn device_client_builder]`. -- Target: `desktop/src/main.rs:818 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=peer_http::remember_address]`. +- Target: `desktop/src/main.rs:818 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=peer_http::remember_address]`. - Target: `firmware/esp/src/PeerLanResolver.h:13 [UTF8-LF sha256=2413d89e26403aae1a9a528c60da09acf4ea5079067b8c1183e7e6c4d8f41546; anchor=class PeerLanResolver]`. - Retained: Actual complete donor resolver and tests read from canonical PCController; adapted successful-address caching, retaining URL hostname/HTTP Host/TLS SNI rather than replacing the public identity with an IP. - Retained: 2026-10-28 reread resolver.go and resolver_test.go through EOF for ESP-to-ESP recovery. Adapt its reconnect-sticky successful address to a four-entry board+hostname+boot-verified cache. .local explicitly uses SDK mdns_query_a with a 900ms budget; unicast uses TCPIP-owned asynchronous IPv4 DNS and object-owned late callbacks instead of unbounded getaddrinfo. Explicit saved-route hints are reverified after reboot. HTTP Host remains the configured hostname; no cache/discovery record grants authorization or causes command replay. @@ -2614,7 +2619,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O - Test-code evidence: `desktop/src/platform/discovery.rs:229 [UTF8-LF sha256=126098720cf4b0d91a74e7147b41954f2361960f4ae7d210896f8c762ae24fd3; anchor=fn discovery_auto_selects_one_physical_identity_not_one_interface]`. - Test-code evidence: `mobile/test/automatic_board_connection_test.dart:32 [UTF8-LF sha256=cee36549184c34fbc52bf695f2bf92a507b60315c6b8534b04f2cc8ebae08616; anchor=void main()]`. - Test-code evidence: `mobile/test/automatic_connection_widget_test.dart:65 [UTF8-LF sha256=fdcf213e00e2e2e0f4840a5a89151435358b1ecbf9c05cf13979c1a536b67d34; anchor=void main()]`. -- Test-code evidence: `tests/protocol_test.cpp:21 [UTF8-LF sha256=92cd55f433424863ff59ba08b048c873c205af3133dba1bf1c9aacf5034135af; anchor=admission.needsHello(2000,0)]`. +- Test-code evidence: `tests/protocol_test.cpp:27 [UTF8-LF sha256=4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144; anchor=admission.needsHello(2000,0)]`. - Remaining: Issue #2/#10: installed native/Android startup, real router/AP discovery, DHCP and hostname rename/reconnect acceptance remain open. Read-only socket/widget fixtures do not prove physical network or production deployment; unsaved drafts and maintenance owners still block new-board handoff. ### PCController: `Tools/Controller/internal/link/request_admission_test.go` @@ -2622,7 +2627,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. Original-byte SHA-256: `0148ea4aac3cf230050045756a4308157adf786a2b6ca2d4fd99bcf665a622c1`. - Target: `desktop/src/connection.rs:28 [UTF8-LF sha256=b87a15893bb66b66dbfa84ff9ffb611a40532dc679991397651267045e14e9b0; anchor=pub struct Gate]`. -- Target: `desktop/src/main.rs:2256 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=fn serial_worker(]`. +- Target: `desktop/src/main.rs:2263 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=fn serial_worker(]`. - Target: `desktop/src/usb_table.rs:101 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=pub struct Operation]`. - Retained: Lamp-background checkpoint reread actual request-admission fixture and current selected-USB worker/HTTP-isolation regression. App-only presentation IPC is separate from physical admission; selected transport, lease and no-late-write contracts remain unchanged. Inspected main.rs target/proof rebound without execution or physical claims. - Retained: Fully read all489lines through EOF. Adapted queued-intent revocation/no-late-write and ownership-before/after admission assertions as Rust selected-method epoch tests. The production Gate keeps revoked owners until their resource leases drop and never admits a competing route or a second USB handle. @@ -2632,7 +2637,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O - Omitted/replaced code: `PulseDTR cancellation/restoration/write exclusion and live physical port acquisition/late-close tests`. Disposition: **pending**. Reason: This pass intentionally adds no automatic reset and keeps AVR/ISP/audio deferred. Inactive DTR on Rust open is source configuration, not measured electrical behavior; OS acquisition/cancellation/retryable-close ownership still needs dedicated fake-handle and real-host acceptance. - Test-code evidence: `desktop/src/connection.rs:129 [UTF8-LF sha256=b87a15893bb66b66dbfa84ff9ffb611a40532dc679991397651267045e14e9b0; anchor=fn handoff_waits_for_all_actual_old_resources_and_rejects_stale_epoch()]`. - Test-code evidence: `desktop/src/connection.rs:117 [UTF8-LF sha256=b87a15893bb66b66dbfa84ff9ffb611a40532dc679991397651267045e14e9b0; anchor=fn usb_offline_never_admits_network_and_disconnect_revokes_everything()]`. -- Test-code evidence: `desktop/src/main.rs:6223 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=fn usb_selected_http_worker_never_contacts_even_a_live_network_endpoint()]`. +- Test-code evidence: `desktop/src/main.rs:6230 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=fn usb_selected_http_worker_never_contacts_even_a_live_network_endpoint()]`. - Test-code evidence: `desktop/src/usb_table.rs:842 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn actual_usb_worker_preempts_large_preview_and_confirms_compact_board_readback()]`. - Test-code evidence: `desktop/src/usb_table.rs:735 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn compact_usb_readback_validates_all_values_without_renewing_full_observations()]`. - Scoped advantage: User-required exclusive Wi-Fi-or-USB lifecycle replaces Both rather than silently falling back; physical resources retire before the new method opens. Source evidence only until guarded tests and runtime observations. @@ -2642,7 +2647,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. Original-byte SHA-256: `ff6c7b21f72bfb944d232c87210f8ffa139dfe016e8b5756f2582604489fffc4`. -- Target: `tests/protocol_test.cpp:62 [UTF8-LF sha256=92cd55f433424863ff59ba08b048c873c205af3133dba1bf1c9aacf5034135af; anchor=Adapt donor matching-identity/request assertions]`. +- Target: `tests/protocol_test.cpp:68 [UTF8-LF sha256=4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144; anchor=Adapt donor matching-identity/request assertions]`. - Target: `desktop/src/terminal_ui.rs:1412 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn server_reboot_between_preflight_and_post_stops_without_replay()]`. - Target: `desktop/src/peer_http.rs:1561 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_settings_pin_every_nested_request_and_verify_same_boot()]`. - Target: `desktop/src/usb_table.rs:101 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=pub struct Operation]`. @@ -2679,7 +2684,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O - Target: `firmware/esp/application.ino:2077 [UTF8-LF sha256=a607abb53d7834663853f2adb45286361d9d5b1cf82edb0d18ee11c9d9a74c41; anchor=bool authenticate()]`. - Target: `assets/web/peer-http.js:90 [UTF8-LF sha256=9613bb23bfa007afcde525d49a193b25b93788b0f24e6a0374ce4f49560f8f9e; anchor=function assertOwner(peer)]`. - Target: `desktop/src/peer_http.rs:590 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=pub fn admit(]`. -- Target: `desktop/src/main.rs:845 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=fn scoped_http_request(]`. +- Target: `desktop/src/main.rs:845 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=fn scoped_http_request(]`. - Target: `desktop/src/usb_table.rs:571 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=pub struct Admission]`. - Target: `mobile/lib/command_readback.dart:14 [UTF8-LF sha256=c920c79353178bfb46aaed6e80a467951b9131f7f3cab0653d970f6408d8703c; anchor=bool commandReadbackMatches(]`. - Target: `desktop/src/cell_batch.rs:15 [UTF8-LF sha256=e1c9e090e67ac7d1da3487a8219067d0a4bc9fd471a13d6a24f7a9462bead947; anchor=pub struct Correlation]`. @@ -2731,7 +2736,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O - Test-code evidence: `tests/web_peer_http_test.mjs:24 [UTF8-LF sha256=db715ef84572ee0279db89cdb3bc5700bbd6e7ebe206a8fdedf335b60d60d048; anchor=Same-host reboot between draft creation and preflight]`. - Test-code evidence: `desktop/src/peer_http.rs:1640 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_revocation_during_preflight_stops_before_write()]`. - Test-code evidence: `desktop/src/peer_http.rs:1660 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_revocation_after_dispatch_reports_uncertainty_not_success()]`. -- Test-code evidence: `desktop/src/main.rs:887 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=// The mapping response identifies its own producer.]`. +- Test-code evidence: `desktop/src/main.rs:887 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=// The mapping response identifies its own producer.]`. - Test-code evidence: `desktop/src/peer_http.rs:1442 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_enveloped_read_needs_no_http_status_preflight()]`. - Test-code evidence: `desktop/src/peer_http.rs:1459 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_foreign_or_previous_boot_response_is_never_adopted()]`. - Test-code evidence: `desktop/src/peer_http.rs:1481 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_incomplete_or_invalid_envelope_is_not_legacy()]`. @@ -3182,7 +3187,7 @@ Verdict: **parity-gap**. Revision: `5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad`. O - Target: `desktop/src/platform/windows_tray.rs:17 [UTF8-LF sha256=94bd79acba0dd4d572222cb064e451a274ee38579a392c95c56d997779cc35bf; anchor=struct TooltipSync]`. - Target: `desktop/src/platform/windows_notifications.rs:158 [UTF8-LF sha256=71f2254825ba2b16d83696ce0e0cf74ec7c95eedda5f60e1c3d167826693ec1a; anchor=fn tooltip_data(]`. -- Target: `desktop/src/main.rs:5195 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=event_log.failure("Windows tray tooltip", &error)]`. +- Target: `desktop/src/main.rs:5202 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=event_log.failure("Windows tray tooltip", &error)]`. - Retained: Full donor plan read through EOF as source requirements, not trusted commands. Generic existing tray lifecycle/menu/disposal retained; actual windows.rs NIM_MODIFY/TIP sections read and adapted to the owned GUID rather than duplicate registration. Tooltip Shell acceptance is separated from object presence; failed writes retain pending latest state with bounded retry/incident recovery and observed restart epoch invalidation. - Omitted/replaced code: `Playback percent/error/paused inputs, media thumbnail toolbar Previous/Play/Next/Mute and video-only iconic clipping`. Disposition: **not-applicable**. Reason: Pakar is explicitly mpv-free and owns controller operations, not playback/chapter/video. No synthetic media percentages or nonexistent actions are imported; actual pending-operation activity remains. - Omitted/replaced code: `Full root taskbar initialization/retry, thumbnail toolbar lifecycle, visible tray/menu/notification clicks and all Windows shell suite acceptance`. Disposition: **pending**. Reason: This fixes only GUID-bound tooltip synchronization on an already owned tray object. Mock clocks, NOTIFYICONDATA assertions and observed restart messages cannot certify complete root shell readiness or user-visible action delivery. @@ -3399,7 +3404,7 @@ Verdict: **parity-gap**. Revision: `5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad`. O Verdict: **parity-gap**. Revision: `5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad`. Original-byte SHA-256: `92b065a4d8ff01ae3b4a81fa11fb6e5b671f85bb1f667be6af389e692fef9f71`. - Target: `desktop/src/cli_console.rs:26 [UTF8-LF sha256=bdf70294c5d4a40007baaf637a8ee26a8576f6dfd03604274fdd9a7d3de2a4ac; anchor=fn write_output(]`. -- Target: `desktop/src/main.rs:5806 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=cli_println!("{reply}")]`. +- Target: `desktop/src/main.rs:5813 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=cli_println!("{reply}")]`. - Target: `desktop/src/terminal_ui.rs:994 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=cli_eprintln!(]`. - Retained: Lamp-background checkpoint scoped rereview of actual cli_output/write_cli_line and complete Pakar cli_console.rs. New explicit CLI option retains inherited pipe handles and fallible non-panicking output; GUI launches never attach or allocate a terminal. Inspected consumer hashes are rebound without claiming unrelated diagnostic/reporting parity. - Retained: Read complete152-line6485-byte donor through EOF. Actual cli_println/cli_eprintln, cli_output, write_cli_line and disconnected_cli_output_returns_an_error_without_panicking are adapted into cli_console. All primary native stdout/stderr call sites use fallible writes, including IPC, help/version, shell errors, management and TUI startup. Partial print support retains the existing table text interface without adding newline artifacts. @@ -3415,7 +3420,7 @@ Verdict: **parity-gap**. Revision: `5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad`. O Verdict: **equivalent-behavior**. Revision: `5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad`. Original-byte SHA-256: `452eb004c52bdcff6936de5602cfdddf5c925d58db9e1e48220fc9a21075b696`. -- Target: `desktop/src/main.rs:2 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=#![cfg_attr(windows, windows_subsystem = "windows")]]`. +- Target: `desktop/src/main.rs:2 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=#![cfg_attr(windows, windows_subsystem = "windows")]]`. - Target: `desktop/src/cli_console.rs:69 [UTF8-LF sha256=bdf70294c5d4a40007baaf637a8ee26a8576f6dfd03604274fdd9a7d3de2a4ac; anchor=pub fn prepare(]`. - Target: `desktop/src/application_identity.rs:3 [UTF8-LF sha256=c37a32df5c00a1cc559c58d226b87d6e9756e7d837b56488646bd0ecc54f26bb; anchor=pub const WINDOWS_APP_ID]`. - Target: `desktop/src/platform/windows_jump_list.rs:13 [UTF8-LF sha256=847796332bd1ba7dd3c51a38a1699b0881ae7efe29249d8129de00d2a481d841; anchor=wide_null(crate::application_identity::WINDOWS_APP_ID)]`. @@ -3837,7 +3842,7 @@ Verdict: **parity-gap**. Revision: `5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad`. O - Test-code evidence: `desktop/src/ui/status_bar.rs:629 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_connection_and_rgb_require_current_route_not_cached_peer_or_websocket()]`. - Test-code evidence: `desktop/src/ui/status_bar.rs:650 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_measured_progress_distinguishes_unknown_zero_and_completion()]`. - Test-code evidence: `desktop/src/ui/status_bar.rs:668 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_progress_and_focus_use_visible_accent_with_actual_dark_app_palette()]`. -- Test-code evidence: `desktop/src/main.rs:5908 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=fn status_bar_startup_message_respects_disconnected_and_selected_route()]`. +- Test-code evidence: `desktop/src/main.rs:5915 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=fn status_bar_startup_message_respects_disconnected_and_selected_route()]`. - Test-code evidence: `desktop/src/ui/status_bar.rs:701 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_real_egui_slots_stay_single_row_in_narrow_rtl_and_scaled_views()]`. - Test-code evidence: `desktop/src/ui/status_bar.rs:726 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_telemetry_changes_preserve_slot_bounds_and_never_request_save()]`. - Test-code evidence: `desktop/src/ui/status_bar.rs:741 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_buttons_dispatch_click_and_keyboard_without_passive_actions()]`. diff --git a/docs/REUSE-PREFLIGHT-RECEIPT.md b/docs/REUSE-PREFLIGHT-RECEIPT.md index 4c0d558e..0c3c481c 100644 --- a/docs/REUSE-PREFLIGHT-RECEIPT.md +++ b/docs/REUSE-PREFLIGHT-RECEIPT.md @@ -1,5 +1,50 @@ # Donor-first preflight receipt +## Controller transport convergence first slice, 2026-10-30 (#41 / PC#702) + +Read current repository instructions, transport and merge-readiness documents; +consult avr-convergence and exact donor-audit Project/ProtocolCodec.h mappings. +Read complete PC/Pakar C++ CRC/COBS primitives and current Go COBS, plus concrete +UART/header, UDP packet, Rust/Dart USB and Pealayer decoder slices. The latter +are slice review, not whole-file donor certification. Added a transport-convergence +index route so previously unindexed host UDP/framing sources remain visible. +Both root epics track actual unrelated-history/file-by-file merger requirements +and reference the existing MCU/firmware owners, not competing architecture epics. + +The pre-fix Go conformance test accepts0200 as valid COBS. C++/Go/Rust/Dart +decoders now reject embedded zeroes without changing valid encodings. PC UDP +already reuses the Go primitive and now rejects short nonfinal fragments in its +encoder, matching the existing decoder. Pealayer already rejects embedded zeroes; +its runtime is left unchanged. Shared JSON fixtures are byte-identical in both +repos; no third protocol, socket owner, allocator or dispatcher is introduced. +PC's read-only MCU list exposes existing Mega/native lanes and explicit adapter +metadata; it does not claim an STM32/ESP hardware port or change328P programming. + +Initial verification hit the existing hash gate after protocol_test.cpp changed; +no bypass was used. Existing proofs are rebound only after reviewing the bounded +diff and retaining anchors. A Go command initially requested a UDP package with +no tests; real UDP codec tests were added, not a test-selector exception. The +first UDP fixture compared nil and empty payload slices as different; byte-wise +payload comparison now retains every actual wire-field assertion. Source/CI, +installed apps, LAN loss/timing and hardware acceptance remain separate. + +PC checkpoint f2b1b3ff is pushed in PR703: stable-path Go native/UDP tests pass, +canonical CMake firmware_protocol_codec_unit passes, and both MCU inventory +tests pass without a toolchain invocation. Pakar's canonical Rust test passes +shared_cobs_vectors; canonical mobile analysis reports no issues and all13 USB +transport tests pass. The shared fixture SHA256 is81683deafa749b231e483d2b75e4c45cae2a3262cab014ad0a20c74a82b31694. +The larger protocol wrapper passed its framing/renderer/storage/programming +fixtures but stopped at a later stale reference after a formatting-only source +edit; it was not labeled a complete passing suite. Final comparison checks and +CI remain exact-head gates. No source/profile tests are physical timing proof. + +Repository reconciliation is not complete: the initial refresh found ten PC +PRs (before this new PR), including failing host/source checks on699, an unstable +692, blocked688 and several active drafts; Pealayer has seven, including unstable +drafts216/212. Owner worktrees are clean and preserved, along with22 PC and three +Pealayer stashes. They are not discarded or blindly merged. Pakar40's stale route +gate is repaired; its final full CI is still independent from this transport pass. + ## Web correction preview connection/foreground ownership, 2026-10-30 (#3) Reread the complete actual PCController mobile/lib/unified/pwm_control.dart diff --git a/docs/TRANSPORT-CONVERGENCE.md b/docs/TRANSPORT-CONVERGENCE.md new file mode 100644 index 00000000..ef4a517a --- /dev/null +++ b/docs/TRANSPORT-CONVERGENCE.md @@ -0,0 +1,111 @@ +# Controller transport convergence + +Tracking: [PakarController#41](https://github.com/atomicdeploy/PakarController/issues/41) +and [PCController#702](https://github.com/atomicdeploy/PCController/issues/702). +This is an implementation inventory and staged decision, not a claim of complete +transport parity or wire interoperability. Existing donor decisions remain in +file-comparison-evidence.json; this document does not replace that ledger. + +## Decision: shared semantics, appropriate carriers + +Keep one command/event/service contract, portable framing primitives and tested +carrier adapters. Do not call COBS a USB transport or put a desktop-sized envelope +in every AVR message. USB-UART, hardware CDC and TinyUSB CDC are physical choices +for the same application protocol. UDP datagrams and serial streams have different +delivery properties; bootloader protocols are external recovery contracts. + +Do not remove the current native-service boundary: outer opcode0x11 is an audio +cue in Pakar but PWM in PCController. Both use A5/COBS/CRC-8/ATM and48-byte payloads, +yet reserved-byte admission, HELLO/status/settings, timestamped ACK/events and +EEPROM layouts differ. Sharing codec mathematics does not make these semantics +interchangeable. See PC-CONTROLLER-MERGE-READINESS.md for the preserved comparison. + +## Actual implementation comparison + +| Path / current owner | Useful attributes | Gaps / decision | +| --- | --- | --- | +| Pakar BoardCore Protocol/WireCodec, ESP UsbApiService, Rust usb_api and Flutter usb_transport | Fixed buffers and48-byte frames; explicit identity/boot fencing, demand leases; USB API chunks reuse selected services without Wi-Fi | Not a universal file/API/maintenance parity claim. Audit every advertised operation and client surface. Keep offline recovery and on-demand streams. | +| PCController Project/ProtocolCodec + UartProtocol, Go internal/native | Allocation-free C++ primitives; separate RX/TX and synchronous borrowed frame lifetime; timestamped ACK/events; Go shares framing with host UDP | Preserve nested replies and AVR stack budget. Wire IDs collide with Pakar; do not reinterpret old commands or replace zero-copy views blindly. | +| PCController transport/udp and Pealayer server/{udp_codec,binary_udp,udp_client} | Already share DGLU typed-value RPC, UUID target/session,64-bit correlation, bounded fragmentation/reassembly, leases, replay ledger and event sequencing | Not encrypted/authenticated by CRC. Local access/authority policy remains required. Flutter/MCU parity and real LAN/loss/soak acceptance are not established by codec tests. | +| Pakar PKAR UDP pixel frames | Small bounded RGB chunks and staged frame commit; useful for low-latency presentation | Not a general command protocol: no authentication or peer/boot targeting in this packet. Keep trusted-LAN scope; never promote to Internet maintenance/control. Retain throughput while designing an owned streaming service. | +| Pakar HTTP/WebSocket/MQTT, BLE and USB API | Existing typed commands, shared capability/peer policy, correlated receipts, maintenance and presentation services | Enabled adapters must advertise actual commands/limits; a selected-route bridge is not complete API parity. WS-first applies where a named command exists, not an invented opcode. | +| PCController IPC/HTTP/WS, native stdio/TCP/C ABI | Shared production dispatch and protected host ownership rather than another firmware implementation | Reconcile its typed operation registry and push domains with Pakar; do not start a second serial owner or turn discovery into authority. | +| Urboot/urclock/ISP and ESP ROM/OTA | Standard programming/recovery, backup/integrity and target-specific electrical policies | Preserve these adapters. They are not competing business protocols and cannot be replaced by a generic packet decoder. | +| Telnet/SSH shell, SCP/SFTP/FTP | Human/standard-client access and bounded file services | Keep shell negotiation and access policy distinct; terminal text must not interleave framed USB. Not an excuse to duplicate command dispatch. | + +Sources inspected include the complete current C++ framing primitives, Go COBS, +native and UDP packet codec slices, Rust/Dart USB codec slices, USB request/route +and demand contracts, Pealayer's actual COBS decoder, and the existing PC/Pakar +merge-readiness and host-UDP specifications. This is not a complete read of every +service/dispatcher/client. Per-file pending work stays pending. + +## First implementation checkpoint + +- Same malformed COBS input was accepted by PCController C++/Go and Pakar C++/ + Rust/Dart decoders: zero inside a data block. Reject it before dispatch, even + if a surrounding envelope has a matching CRC. Valid wire bytes do not change. +- PCController UDP encoding now applies the same full-nonfinal-fragment rule as + its decoder. Previously it could emit a packet its own receiver rejects. +- tests/fixtures/cobs.json is a byte-identical cross-repository fixture, not a + new transport. Go and Rust consume it; C++ and Dart have targeted malformed + envelope regressions. Keep CRC-8/ATM's123456789→F4 check and encoder bytes. +- Pealayer already rejects embedded zeroes; do not change its working runtime + merely to claim an import. Its empty-decoded-buffer convention is not evidence + that an empty application frame is accepted. +- PCController exposes its actual extra-MCU build lanes through the read-only + `node Tools/Firmware/targets.mjs list`. Explicit adapter metadata prevents a + future STM32 registration accidentally executing the AVR-specific build path. + +No board update, network scan/actuation or production process replacement is +part of this checkpoint. Source/fixture checks, compiled targets, installed apps, +wire timing and physical output have separate acceptance. + +## Next pass: living shared contract and adapters + +1. Select a canonical portable core owner and generated operation registry. Keep + hardware profile, business role and feature budget independent. Until the + repository merger, pin shared sources/fixtures with reviewed hashes; do not + invent a third dispatcher or silently fork the source owner. +2. Define shared identities, boot/session admission, request IDs, deadline/cancel, + typed errors, receipts, event revision/time, leases and resynchronization. + Preserve stable operation IDs and richer timing fields. Choose explicit + service namespaces rather than treating the reserved byte as a version. +3. Accept unknown optional fields; reject unknown required semantics safely. + Advertise enabled services and actual size/queue/fragment limits. Slim builds + omit implementations with flags and return Unsupported, not success/no-op. + Back/forward compatibility means a negotiated common capability subset; it + cannot guarantee arbitrary future semantics or ambiguous existing opcode use. +4. Use reliable control/maintenance and owned lossy presentation separately. + Bound queues, fragment lifetimes and memory; CRC is not authentication. + Outcome-unknown mutations never automatically replay after reconnect/retry. +5. Exercise the same operations/events, files/firmware, subscriptions and errors + through every enabled adapter and client. Each missing cell in that matrix is + an issue, not an advertised completed transport. Do not remove useful recovery + or high-rate paths merely because another carrier lacks their capability. + +## Following pass: MCU HAL and history-preserving merger + +PCController already builds the production sketch and source aggregators for +ATmega328P, explicit Mega2560 profiles and native conformance targets. Pakar's +separate AVR lifecycle/dispatch is not yet the same source tree. Reconcile it +under existing PC issues103/227/18/125/375 and Pakar issues3/6/16. + +Extract GPIO, serial/USB, monotonic clocks/timers, storage, interrupts, buses, +watchdog/reset and LED-driver seams. Add actual STM32/ESP adapters only after chip, +pins, toolchain, peripherals and memory budgets are selected. A name or build flag +alone is not MCU support; no fabricated working target is added here. Protect +current ISR timing, RF input, tone scheduling, relay safety and storage commits. + +The future repository destination remains undecided. Before merging, preserve +immutable refs and manifests, worktree/stash/private-state inventories and both +Git graphs. Stage a reviewed `git merge --allow-unrelated-histories`, with path +moves retaining provenance. Compare every unique/overlapping file: source hash, +owner, licenses, useful behavior, tests, conflicts, semantic result and omissions. +No copy-flattening, blanket ours/theirs choice or deletion of uncertain history. +Code must have a named canonical owner before duplicate implementations retire. + +Raw EEPROM/settings images remain rollback artifacts, not cross-product imports. +Use guarded semantic import/readback. Require slim/full profile flash/RAM/stack, +interoperability, loss/reorder/reconnect/backpressure, real-device/soak and recovery +evidence before calling the consolidated system finished. Resolve all applicable +PR reviews and checks without merging unrelated active owner drafts blindly. diff --git a/docs/file-comparison-evidence.json b/docs/file-comparison-evidence.json index 8c3cfa6e..ccf72ed6 100644 --- a/docs/file-comparison-evidence.json +++ b/docs/file-comparison-evidence.json @@ -2174,16 +2174,38 @@ "source_read": "complete", "verdict": "parity-gap", "preserved": [ - "Read all bounded C++11 CRC/COBS algorithms and complete Pakar WireCodec.h. CRC/decoder structure is common; encoder bounds and ownership wrappers differ. Documented the path toward one dependency-free codec rather than silently replacing the live implementation." + "Read all bounded C++11 CRC/COBS algorithms and complete Pakar WireCodec.h. CRC/decoder structure is common; encoder bounds and ownership wrappers differ. Documented the path toward one dependency-free codec rather than silently replacing the live implementation.", + "2026-10-30: reread both complete primitives against the preserved b0111ae0 donor snapshot. Apply the same zero-in-data-block COBS rejection to both current projects, retaining valid bytes, fixed buffers, in-place decode and owning/borrowed frame boundaries. PC Go host UDP uses its corrected shared Go decoder; the Pakar Rust/Dart adapters gain equivalent validation and targeted regressions. The cross-repository fixture and first-pass decision do not claim complete carrier/API or stock-board interoperability." ], "targets": [ { "path": "docs/PC-CONTROLLER-MERGE-READINESS.md", "anchor": "### Framing and dispatch", "sha256": "a023cd4573108622cbd76a62cb52115c7dd6735d1b15999b73df1e5a2a9b96d5" + }, + { + "path": "libraries/BoardCore/src/WireCodec.h", + "anchor": "if (input[readIndex] == 0) return 0;", + "sha256": "8f9bf8a72b39e03415b295ec8b326fb9ba4c20c719ea12263cbad1b61972347c" + }, + { + "path": "docs/TRANSPORT-CONVERGENCE.md", + "anchor": "## Decision: shared semantics, appropriate carriers", + "sha256": "563b5ad2e461ac39ab0e444ce4a6dd4663ddf229439a3e24c0bec8e4c2a62f32" + } + ], + "proof": [ + { + "path": "tests/protocol_test.cpp", + "anchor": "Same malformed COBS vectors as PCController", + "sha256": "4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144" + }, + { + "path": "tests/fixtures/cobs.json", + "anchor": "COBS delimiter-free", + "sha256": "81683deafa749b231e483d2b75e4c45cae2a3262cab014ad0a20c74a82b31694" } ], - "proof": [], "omissions": [ { "code": "One-source codec and zero-copy UART integration", @@ -2192,7 +2214,7 @@ } ], "remaining": [ - "Issue #3/#6: shared bounded codec conformance, malformed/full-boundary fixtures and AVR lifetime/budget verification; no new test execution is claimed." + "Issues #41 and PC#702 coordinate shared core ownership, typed service/opcode compatibility, optional capabilities and full transport/client parity. First-slice fixtures/strict malformed rejection are implemented; AVR lifetime, flash/stack deltas, full-boundary/resource, deployed/LAN/physical and complete shared-code acceptance remain open." ] }, { @@ -2304,7 +2326,7 @@ { "path": "tests/protocol_test.cpp", "anchor": "admission.needsHello(2000,0)", - "sha256": "92cd55f433424863ff59ba08b048c873c205af3133dba1bf1c9aacf5034135af" + "sha256": "4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144" } ], "omissions": [ @@ -7444,7 +7466,7 @@ "targets": [ { "path": "desktop/src/main.rs", - "sha256": "29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c", + "sha256": "a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a", "anchor": "#![cfg_attr(windows, windows_subsystem = \"windows\")]" }, { @@ -7512,7 +7534,7 @@ }, { "path": "desktop/src/main.rs", - "sha256": "29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c", + "sha256": "a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a", "anchor": "cli_println!(\"{reply}\")" }, { @@ -7671,7 +7693,7 @@ }, { "path": "mobile/test/usb_transport_test.dart", - "sha256": "19c07b6986d1ebe734d4ffb37aa19b01becc8ebc5bfde504972b9e1e0f3214fd", + "sha256": "c18934fdea3c2001264dcab582a4ebf1c1f5b7897c9ffc514821e4c6047c563f", "anchor": "Real channel session performs HELLO introduction snapshot and atomic batch without HTTP or DNS" }, { @@ -9374,7 +9396,7 @@ { "path": "desktop/src/main.rs", "anchor": "SerialCommand::Bridge(target", - "sha256": "29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c" + "sha256": "a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a" } ], "omissions": [ @@ -15715,7 +15737,7 @@ }, { "path": "desktop/src/main.rs", - "sha256": "29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c", + "sha256": "a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a", "anchor": "fn scoped_http_request(" }, { @@ -15859,7 +15881,7 @@ }, { "path": "desktop/src/main.rs", - "sha256": "29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c", + "sha256": "a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a", "anchor": "// The mapping response identifies its own producer." }, { @@ -16005,7 +16027,7 @@ "targets": [ { "path": "tests/protocol_test.cpp", - "sha256": "92cd55f433424863ff59ba08b048c873c205af3133dba1bf1c9aacf5034135af", + "sha256": "4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144", "anchor": "Adapt donor matching-identity/request assertions" }, { @@ -16927,7 +16949,7 @@ "proof": [ { "path": "tests/protocol_test.cpp", - "sha256": "92cd55f433424863ff59ba08b048c873c205af3133dba1bf1c9aacf5034135af", + "sha256": "4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144", "anchor": "Actual donor TestVersionedCoreAPIRoutesAreRejected cases" }, { @@ -18521,7 +18543,7 @@ }, { "path": "desktop/src/main.rs", - "sha256": "29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c", + "sha256": "a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a", "anchor": "fn status_bar_startup_message_respects_disconnected_and_selected_route()" }, { @@ -22718,7 +22740,7 @@ }, { "path": "mobile/lib/usb_transport.dart", - "sha256": "880728e89341200cfb9c1c846e2c2407e4b105608e5b4dac0355c01b1ce2ad2c", + "sha256": "6b7600fb34460397f778d5d46239e2e90954c33ae1a2b28f0b37a492185dd13b", "anchor": "class PakarUsbTransport" }, { @@ -23132,7 +23154,7 @@ }, { "path": "desktop/src/main.rs", - "sha256": "29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c", + "sha256": "a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a", "anchor": "event_log.failure(\"Windows tray tooltip\", &error)" } ], @@ -23256,7 +23278,7 @@ }, { "path": "desktop/src/main.rs", - "sha256": "29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c", + "sha256": "a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a", "anchor": "fn serial_worker(" }, { @@ -23293,7 +23315,7 @@ }, { "path": "desktop/src/main.rs", - "sha256": "29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c", + "sha256": "a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a", "anchor": "fn usb_selected_http_worker_never_contacts_even_a_live_network_endpoint()" }, { @@ -24168,7 +24190,7 @@ { "path": "desktop/src/main.rs", "anchor": "peer_http::remember_address", - "sha256": "29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c" + "sha256": "a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a" }, { "path": "firmware/esp/src/PeerLanResolver.h", diff --git a/docs/file-comparison.csv b/docs/file-comparison.csv index 5a2f2385..49f95fb1 100644 --- a/docs/file-comparison.csv +++ b/docs/file-comparison.csv @@ -131,7 +131,7 @@ "PCController","docs/Application-Branding.md","b0111ae0c80dc34149ea1044de7dd5488920301b","6e5610037a2738d8045cc1b2d4ed286be1f137141f1a003e1e89d7e8fb788d56","ui-shell","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","docs/assets/doc-banner.svg","b0111ae0c80dc34149ea1044de7dd5488920301b","bc9bf576f260a9be80802fa93f76226853c3ab4a0fd4347bde5dcb6dbe2541b6","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","docs/assets/pccontroller-hero.svg","b0111ae0c80dc34149ea1044de7dd5488920301b","7efb583076d38abd1d0430344ff9614772da143e09808905dd4917dcec0b5681","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","docs/BINARY-UDP.md","b0111ae0c80dc34149ea1044de7dd5488920301b","8e5a5528edff8ae7e24cdfaa770828edaef8d77cb8a0fa8aa6a0b1211a73cbc1","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","docs/BINARY-UDP.md","b0111ae0c80dc34149ea1044de7dd5488920301b","8e5a5528edff8ae7e24cdfaa770828edaef8d77cb8a0fa8aa6a0b1211a73cbc1","transport-convergence","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/41","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","docs/Board-Mirroring.md","b0111ae0c80dc34149ea1044de7dd5488920301b","66e5e336dc56e80e9bbcf7a6408bd3f7a043459410b65c95cecae639cc1357b2","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","docs/Channel-Folders.md","b0111ae0c80dc34149ea1044de7dd5488920301b","1199c0abd6c7d738d7f01b8419c2cae942011660c9fe2e31cfba156a1974d36a","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","docs/CI-CD-and-Releases.md","b0111ae0c80dc34149ea1044de7dd5488920301b","d563bba3edcb94f5ee3a19a56f2a4b8cf72661b8a40321984ff2622dd6894038","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -230,7 +230,7 @@ "PCController","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/AutomationReceiver.kt","b0111ae0c80dc34149ea1044de7dd5488920301b","62b35a9e21256156419bcd4a75cb2b0bb3f4ac0a635e2fab9348c735e74ffd7c","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/BuzzerPcm.kt","b0111ae0c80dc34149ea1044de7dd5488920301b","50f86743a860cfafafde97113347c2cd6c93d046b5ac2a5a75b547e655770e3e","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/DiscoveryChannel.kt","b0111ae0c80dc34149ea1044de7dd5488920301b","b4b829b34dfd99d1cadcd05b4d15b23e1277d6d8ffa82090f2abfd4843d48c5c","host-wifi | mobile-app-updates | network-cloud","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7 | https://github.com/atomicdeploy/PakarController/issues/31","parity-gap","complete","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/AppUpdateDiscoveryChannel.kt:16 [UTF8-LF sha256=671c6d58afc2c594f4bd7df89cbd7d98b233b43c7be14fc5697109924bdd4678; anchor=class AppUpdateDiscoveryChannel] | mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/HostWifiChannel.kt:25 [UTF8-LF sha256=f13356e25411713c0075585d3e3618452773d0f19d909e7360173302371b735e; anchor=class HostWifiChannel] | mobile/lib/host_wifi.dart:11 [UTF8-LF sha256=0d2d6572a327b800e5ae5f34f670e427ed2ef5c216ba8b28e4d0471dcbe3268a; anchor=class HostWifi] | desktop/src/platform/host_wifi.rs:102 [UTF8-LF sha256=acbb40d2fa47e1c098c656dfe118e2aaf907036debeb9c00c016953139e446b4; anchor=pub fn join] | desktop/src/ui/host_wifi.rs:21 [UTF8-LF sha256=b6d400eb8e1ddbfb59138452f61081eddd8d561629dc61a1ccc2c1af4613de08; anchor=pub fn draw] | mobile/lib/app_update_discovery.dart:58 [UTF8-LF sha256=ac6157940d99d94c21a32e7baebe1e7d05d868fb432016f63cd2efad74fd2fc8; anchor=verifyAppUpdatePeer]","Actual Android NSD browse/resolve/registration and multicast lock lifecycle adapted to app-package-only service. Dart uses bounded SSDP/MNDP messages plus exact package manifests; raw advertisements never grant install or board control. Issue #31 reread the complete actual DiscoveryChannel and reused main-loop callback ownership, stale-callback rejection and close-time retirement in HostWifiChannel. Donor has no host Wi-Fi join implementation: Android NetworkSpecifier/save-network consent and Windows Native Wi-Fi profile calls are new platform integration, not a claimed donor import. Windows UI reuses existing fixed-geometry dialog/dropdown controls; no implicit join on render/discovery, no passwords in app preferences and no claim that OS acceptance verifies a board.","Remaining generic donor/platform acceptance outside this bounded update slice [pending]","Remaining generic donor/platform acceptance outside this bounded update slice: Android foreground services/background uptime, split APKs and signing-key rotation, direct Android USB-host firmware programming, generic host RPC parity and actual Android/LAN/TLS/ESP/AVR physical acceptance remain separate. Exact self-package signer sets and newer version codes fail closed; no silent installer or uncertain programming replay.","mobile/test/app_update_discovery_test.dart:37 [UTF8-LF sha256=202d5265b03db20e13768806bf617a944ddd3a70f7241d17e559c3c319bdede9; anchor=Actual manifest GET] | mobile/test/host_wifi_test.dart:9 [UTF8-LF sha256=89de0319a0a89f2f8fcf72eecdf642a93db117de9021c9198f0e619f87e9eb88; anchor=network hints use reported SSIDs] | desktop/src/ui/host_wifi.rs:108 [UTF8-LF sha256=b6d400eb8e1ddbfb59138452f61081eddd8d561629dc61a1ccc2c1af4613de08; anchor=fn rendering_does_not_join_or_scan]","","Issue #7/#2/#3: actual installed Android peer transfer/OS consent/remote endpoint/board flash and human acceptance; source tests and staged APK are not deployment.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/MainActivity.kt","b0111ae0c80dc34149ea1044de7dd5488920301b","5bf90a090b5975f5dc3b7e09ed47ba09e9dad8bf812515902b24cacc35e9a618","usb-otg | mobile-firmware","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","parity-gap","complete","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/MainActivity.kt:32 [UTF8-LF sha256=262271e184d4287fa3e2a6dc8cac9cae7f5cb0cdf7e2b143ecfaa4288bdfd0cf; anchor=private val firmwareMaximum = 0x330000 - 1] | mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/UsbControllerChannel.kt:22 [UTF8-LF sha256=9261161c45322fdd1b277b4deb13dbefd10a31d112e610e04490314f83e0af57; anchor=class UsbControllerChannel] | mobile/lib/documents.dart:19 [UTF8-LF sha256=9b447b248f21e855c2481e28c6c31e66969af5ab837fd32e4d57eb76164b9ff5; anchor=class AndroidDocuments] | mobile/lib/firmware_image.dart:8 [UTF8-LF sha256=274b96b95c959594b8720f40d4998dc6e307ed8fe31e82093c19b581ea4a0654; anchor=abstract final class FirmwareImagePolicy]","Actual canonical 8269-byte MainActivity read completely through EOF by the mobile owner and evidence owner. Retains real ACTION_OPEN_DOCUMENT/ACTION_CREATE_DOCUMENT, single selection, bounded executor-based input reads, cancellation, one outstanding document operation, one-use random destination token consumed before write, explicit abandon without deletion, finite byte export and close-time token/pending cleanup. Pakar package/channel names replace PCController identity, not its document ownership contract. | USB-OTG review reread the complete canonical MainActivity through EOF at the recorded donor hash. Reuse its owned platform-channel/executor/close-time retirement pattern for UsbControllerChannel. No Android USB driver exists in the inventoried donor: Android UsbManager is a new bounded CDC ACM adapter, not a claimed wholesale donor import. Native USB enumeration, permission and external-power safety remain physical acceptance gates. | The obsolete generic2097152-byte intake/export ceiling is replaced by the same exclusive0x330000 S3 application-slot ceiling used by Dart firmware admission. Native SAF remains only a bounded byte/document provider: selected-board chip/hash-header/capacity/SHA checks happen in the firmware owner before upload. A selected or exported document never automatically programs ESP or AVR. | 2026-10-27 minigame mobile gate reread the complete canonical donor and Pakar MainActivity through EOF. The donor remains clean at b0111ae0c80dc34149ea1044de7dd5488920301b with original-byte SHA256 5bf90a090b5975f5dc3b7e09ed47ba09e9dad8bf812515902b24cacc35e9a618; restored that source identity after it had been replaced by the identically named target hash. Existing bounded SAF/token/lifecycle adaptation and pending automation/preferences/upgrade omissions remain unchanged; this narrow rereview makes no new Android runtime or broad parity claim.","AutomationBridge.channel, automation MethodChannel and cleanup [pending] | PreferencesChannel and preferences.launch from onNewIntent [pending] | UpgradeChannel construction/lifecycle and whole-activity discovery/tone/app-update parity [pending]","AutomationBridge.channel, automation MethodChannel and cleanup: The donor's generic Android automation bridge is not part of this SAF/image-limit change. App-to-app remote commands and intent authorization require their actual implementation/dependency review; no document channel or BLE integration is claimed to substitute for it. | PreferencesChannel and preferences.launch from onNewIntent: Pakar has its own preferences UI but does not yet import this donor's OS preference-launch/new-intent lifecycle. Opening SAF or retaining Flutter state does not implement that useful Android contract. | UpgradeChannel construction/lifecycle and whole-activity discovery/tone/app-update parity: Pakar separately owns AppUpdateChannel, peer-discovery, BLE and tone channels; this row certifies only the inspected SAF adaptation, not full donor upgrade/automation/discovery/mirroring equivalence or provider/OS behavior. Keep their owning rows and remaining acceptance rather than infer parity from class names.","mobile/test/documents_test.dart:64 [UTF8-LF sha256=641aee7d7a005c5c309683cf98154f571c1e3c398dd5674fc68b020807807df0; anchor=S3 document intake above 2MiB uses one bounded slot policy] | mobile/test/documents_test.dart:38 [UTF8-LF sha256=641aee7d7a005c5c309683cf98154f571c1e3c398dd5674fc68b020807807df0; anchor=Changed owner while choosing export abandons token; never writes or deletes] | mobile/test/usb_transport_test.dart:317 [UTF8-LF sha256=19c07b6986d1ebe734d4ffb37aa19b01becc8ebc5bfde504972b9e1e0f3214fd; anchor=Real channel session performs HELLO introduction snapshot and atomic batch without HTTP or DNS] | mobile/test/firmware_image_test.dart:215 [UTF8-LF sha256=81f47d2e4a07740c1dab37cf55849a8a5c91eddf47631e7b631da5dad7b6ca4b; anchor=Wrong chip or observed small slot cannot reach manual mutation]","","Verify actual Android document providers, cancellation, process/activity destruction, exact selected-byte upload/export and one-use-token failure behavior on the authorized phone. Dart MethodChannel fixtures are not native SAF/provider or physical OTA proof. Finish useful omitted automation/preferences/new-intent/upgrade lifecycle imports with exact source evidence.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/MainActivity.kt","b0111ae0c80dc34149ea1044de7dd5488920301b","5bf90a090b5975f5dc3b7e09ed47ba09e9dad8bf812515902b24cacc35e9a618","usb-otg | mobile-firmware","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","parity-gap","complete","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/MainActivity.kt:32 [UTF8-LF sha256=262271e184d4287fa3e2a6dc8cac9cae7f5cb0cdf7e2b143ecfaa4288bdfd0cf; anchor=private val firmwareMaximum = 0x330000 - 1] | mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/UsbControllerChannel.kt:22 [UTF8-LF sha256=9261161c45322fdd1b277b4deb13dbefd10a31d112e610e04490314f83e0af57; anchor=class UsbControllerChannel] | mobile/lib/documents.dart:19 [UTF8-LF sha256=9b447b248f21e855c2481e28c6c31e66969af5ab837fd32e4d57eb76164b9ff5; anchor=class AndroidDocuments] | mobile/lib/firmware_image.dart:8 [UTF8-LF sha256=274b96b95c959594b8720f40d4998dc6e307ed8fe31e82093c19b581ea4a0654; anchor=abstract final class FirmwareImagePolicy]","Actual canonical 8269-byte MainActivity read completely through EOF by the mobile owner and evidence owner. Retains real ACTION_OPEN_DOCUMENT/ACTION_CREATE_DOCUMENT, single selection, bounded executor-based input reads, cancellation, one outstanding document operation, one-use random destination token consumed before write, explicit abandon without deletion, finite byte export and close-time token/pending cleanup. Pakar package/channel names replace PCController identity, not its document ownership contract. | USB-OTG review reread the complete canonical MainActivity through EOF at the recorded donor hash. Reuse its owned platform-channel/executor/close-time retirement pattern for UsbControllerChannel. No Android USB driver exists in the inventoried donor: Android UsbManager is a new bounded CDC ACM adapter, not a claimed wholesale donor import. Native USB enumeration, permission and external-power safety remain physical acceptance gates. | The obsolete generic2097152-byte intake/export ceiling is replaced by the same exclusive0x330000 S3 application-slot ceiling used by Dart firmware admission. Native SAF remains only a bounded byte/document provider: selected-board chip/hash-header/capacity/SHA checks happen in the firmware owner before upload. A selected or exported document never automatically programs ESP or AVR. | 2026-10-27 minigame mobile gate reread the complete canonical donor and Pakar MainActivity through EOF. The donor remains clean at b0111ae0c80dc34149ea1044de7dd5488920301b with original-byte SHA256 5bf90a090b5975f5dc3b7e09ed47ba09e9dad8bf812515902b24cacc35e9a618; restored that source identity after it had been replaced by the identically named target hash. Existing bounded SAF/token/lifecycle adaptation and pending automation/preferences/upgrade omissions remain unchanged; this narrow rereview makes no new Android runtime or broad parity claim.","AutomationBridge.channel, automation MethodChannel and cleanup [pending] | PreferencesChannel and preferences.launch from onNewIntent [pending] | UpgradeChannel construction/lifecycle and whole-activity discovery/tone/app-update parity [pending]","AutomationBridge.channel, automation MethodChannel and cleanup: The donor's generic Android automation bridge is not part of this SAF/image-limit change. App-to-app remote commands and intent authorization require their actual implementation/dependency review; no document channel or BLE integration is claimed to substitute for it. | PreferencesChannel and preferences.launch from onNewIntent: Pakar has its own preferences UI but does not yet import this donor's OS preference-launch/new-intent lifecycle. Opening SAF or retaining Flutter state does not implement that useful Android contract. | UpgradeChannel construction/lifecycle and whole-activity discovery/tone/app-update parity: Pakar separately owns AppUpdateChannel, peer-discovery, BLE and tone channels; this row certifies only the inspected SAF adaptation, not full donor upgrade/automation/discovery/mirroring equivalence or provider/OS behavior. Keep their owning rows and remaining acceptance rather than infer parity from class names.","mobile/test/documents_test.dart:64 [UTF8-LF sha256=641aee7d7a005c5c309683cf98154f571c1e3c398dd5674fc68b020807807df0; anchor=S3 document intake above 2MiB uses one bounded slot policy] | mobile/test/documents_test.dart:38 [UTF8-LF sha256=641aee7d7a005c5c309683cf98154f571c1e3c398dd5674fc68b020807807df0; anchor=Changed owner while choosing export abandons token; never writes or deletes] | mobile/test/usb_transport_test.dart:324 [UTF8-LF sha256=c18934fdea3c2001264dcab582a4ebf1c1f5b7897c9ffc514821e4c6047c563f; anchor=Real channel session performs HELLO introduction snapshot and atomic batch without HTTP or DNS] | mobile/test/firmware_image_test.dart:215 [UTF8-LF sha256=81f47d2e4a07740c1dab37cf55849a8a5c91eddf47631e7b631da5dad7b6ca4b; anchor=Wrong chip or observed small slot cannot reach manual mutation]","","Verify actual Android document providers, cancellation, process/activity destruction, exact selected-byte upload/export and one-use-token failure behavior on the authorized phone. Dart MethodChannel fixtures are not native SAF/provider or physical OTA proof. Finish useful omitted automation/preferences/new-intent/upgrade lifecycle imports with exact source evidence.","Not established by source/hash/test-code comparison; see issue #2" "PCController","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/PreferencesChannel.kt","b0111ae0c80dc34149ea1044de7dd5488920301b","bcb2e5893fcb8a7d1036b23b322c0743ef65468975abbf42d9a783751dd718ec","preferences","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/4","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/ToneMirrorChannel.kt","b0111ae0c80dc34149ea1044de7dd5488920301b","e84a6eaffab4096a3eb29b51c83cb41da0548390d5bbad1fe28e8f895c67ec4a","firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/UpgradeChannel.kt","b0111ae0c80dc34149ea1044de7dd5488920301b","c35459e58af7b325f450aa54e20a797efadde5006da1683f370500b2ffea3cc4","mobile-app-updates","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","parity-gap","complete","mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/AppUpdateChannel.kt:37 [UTF8-LF sha256=2a9844c3b879deac14ef05f3b2dbf808e2d9e8ede93a818d951a84c9d82804b8; anchor=class AppUpdateChannel]","Actual private staging/storage/size/hash/self-package/signer/newer-version/minSDK/ABI validation and Android PackageInstaller user-consent/receipt flow. Added SAF import/export, bounded native queue, same digest immediately before install and actual installed SHA/version verification after restart; pending-user-action is never success.","Remaining generic donor/platform acceptance outside this bounded update slice [pending]","Remaining generic donor/platform acceptance outside this bounded update slice: Android foreground services/background uptime, split APKs and signing-key rotation, direct Android USB-host firmware programming, generic host RPC parity and actual Android/LAN/TLS/ESP/AVR physical acceptance remain separate. Exact self-package signer sets and newer version codes fail closed; no silent installer or uncertain programming replay.","mobile/test/app_updates_test.dart:81 [UTF8-LF sha256=1aabfe844bf8cb7e159fc7adfe3a061aa8cee02e14391f21b4f858ff7612bdfe; anchor=verified]","","Issue #7/#2/#3: actual installed Android peer transfer/OS consent/remote endpoint/board flash and human acceptance; source tests and staged APK are not deployment.","Not established by source/hash/test-code comparison; see issue #2" @@ -400,7 +400,7 @@ "PCController","Project/MacroQueue.cpp","b0111ae0c80dc34149ea1044de7dd5488920301b","43a627c50e9908c20ea4b1d33c2eb4ef914672362ec5b9f5129604a7e5678b96","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/MacroQueue.h","b0111ae0c80dc34149ea1044de7dd5488920301b","ffbf6b0a39383b632dfdf0412e9a4e57b3c847c2746f72da117f5e98937e7606","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/MotionDoorPolicy.h","b0111ae0c80dc34149ea1044de7dd5488920301b","39ccef4732a2e67b1d86ce72f8d593b9f3cc27892c6009c23ba4d651783d703d","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Project/ProtocolCodec.h","b0111ae0c80dc34149ea1044de7dd5488920301b","9a5fde33e199021bb6615bd7ff6d321a258f24ab9099e0a52bc9d857adebae8c","avr-convergence | uart-flow-control | firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","parity-gap","complete","docs/PC-CONTROLLER-MERGE-READINESS.md:68 [UTF8-LF sha256=a023cd4573108622cbd76a62cb52115c7dd6735d1b15999b73df1e5a2a9b96d5; anchor=### Framing and dispatch]","Read all bounded C++11 CRC/COBS algorithms and complete Pakar WireCodec.h. CRC/decoder structure is common; encoder bounds and ownership wrappers differ. Documented the path toward one dependency-free codec rather than silently replacing the live implementation.","One-source codec and zero-copy UART integration [pending]","One-source codec and zero-copy UART integration: A raw algorithm import must preserve maximum framing/capacity behavior, partial RX, synchronous nested replies and 328P stack lifetime. Equal CRC conventions do not justify swapping owning Frame arrays for borrowed views without all consumers.","","","Issue #3/#6: shared bounded codec conformance, malformed/full-boundary fixtures and AVR lifetime/budget verification; no new test execution is claimed.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Project/ProtocolCodec.h","b0111ae0c80dc34149ea1044de7dd5488920301b","9a5fde33e199021bb6615bd7ff6d321a258f24ab9099e0a52bc9d857adebae8c","transport-convergence | avr-convergence | uart-flow-control | firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6 | https://github.com/atomicdeploy/PakarController/issues/41","parity-gap","complete","docs/PC-CONTROLLER-MERGE-READINESS.md:68 [UTF8-LF sha256=a023cd4573108622cbd76a62cb52115c7dd6735d1b15999b73df1e5a2a9b96d5; anchor=### Framing and dispatch] | libraries/BoardCore/src/WireCodec.h:41 [UTF8-LF sha256=8f9bf8a72b39e03415b295ec8b326fb9ba4c20c719ea12263cbad1b61972347c; anchor=if (input[readIndex] == 0) return 0;] | docs/TRANSPORT-CONVERGENCE.md:9 [UTF8-LF sha256=563b5ad2e461ac39ab0e444ce4a6dd4663ddf229439a3e24c0bec8e4c2a62f32; anchor=## Decision: shared semantics, appropriate carriers]","Read all bounded C++11 CRC/COBS algorithms and complete Pakar WireCodec.h. CRC/decoder structure is common; encoder bounds and ownership wrappers differ. Documented the path toward one dependency-free codec rather than silently replacing the live implementation. | 2026-10-30: reread both complete primitives against the preserved b0111ae0 donor snapshot. Apply the same zero-in-data-block COBS rejection to both current projects, retaining valid bytes, fixed buffers, in-place decode and owning/borrowed frame boundaries. PC Go host UDP uses its corrected shared Go decoder; the Pakar Rust/Dart adapters gain equivalent validation and targeted regressions. The cross-repository fixture and first-pass decision do not claim complete carrier/API or stock-board interoperability.","One-source codec and zero-copy UART integration [pending]","One-source codec and zero-copy UART integration: A raw algorithm import must preserve maximum framing/capacity behavior, partial RX, synchronous nested replies and 328P stack lifetime. Equal CRC conventions do not justify swapping owning Frame arrays for borrowed views without all consumers.","tests/protocol_test.cpp:15 [UTF8-LF sha256=4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144; anchor=Same malformed COBS vectors as PCController] | tests/fixtures/cobs.json:2 [UTF8-LF sha256=81683deafa749b231e483d2b75e4c45cae2a3262cab014ad0a20c74a82b31694; anchor=COBS delimiter-free]","","Issues #41 and PC#702 coordinate shared core ownership, typed service/opcode compatibility, optional capabilities and full transport/client parity. First-slice fixtures/strict malformed rejection are implemented; AVR lifetime, flash/stack deltas, full-boundary/resource, deployed/LAN/physical and complete shared-code acceptance remain open.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/ProtocolContract.h","b0111ae0c80dc34149ea1044de7dd5488920301b","7d69fa2430137e34dda659b3dd7fcc526814d3ed685f8efebe0923d052f3f77a","avr-convergence | uart-flow-control | firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","parity-gap","complete","docs/PC-CONTROLLER-MERGE-READINESS.md:66 [UTF8-LF sha256=a023cd4573108622cbd76a62cb52115c7dd6735d1b15999b73df1e5a2a9b96d5; anchor=## Wire blockers: same COBS does not mean same board contract]","Read all generated constants and compared current target text: newline-normalized file equals libraries/BoardCore/src/pccontroller/ProtocolContract.h. Stable numeric declarations are actually retained, but neither envelope nor every handler/response is interoperable.","Stock native board attachment and complete registered request support [pending]","Stock native board attachment and complete registered request support: Reserved-byte rule, native 0x11 PWM versus Pakar audio, HELLO/settings/status and timed ACK/event shapes differ. Existing tunnel does not make a stock donor board usable. One living capability contract is required, not release adapters or renumbered APIs.","","","Issue #3/#6/#10: choose shared codec/dispatch/timing boundaries and update every consumer with fixtures before allowing direct donor-board attachment.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/ProtocolContract.json","b0111ae0c80dc34149ea1044de7dd5488920301b","af30319345d28fbae9fb2fb2cee755252a224ce79c31ad3bd8039b27ab279a1f","firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/PwmController.cpp","b0111ae0c80dc34149ea1044de7dd5488920301b","396dd3cc4f8bc92bb2d0f29368c2c02b5d5b4847ab650c3e609256aa7cbf65ab","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -432,8 +432,8 @@ "PCController","Project/SystemInputs.h","b0111ae0c80dc34149ea1044de7dd5488920301b","06bec201d3786cf01afd4e2dde0314c4f5e40c2ebf70c9e45a67e96665b0aea3","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/TemperatureRoles.h","b0111ae0c80dc34149ea1044de7dd5488920301b","13795f785758aa5634affcdd2ef6817291bb97227a4eb5eecf463d4379fc5a70","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/TransitionMath.h","b0111ae0c80dc34149ea1044de7dd5488920301b","64d107c8f02830b77028c1a579d4398e7bd5446953076944f8c64f60521403bd","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Project/UartProtocol.cpp","b0111ae0c80dc34149ea1044de7dd5488920301b","bd2d1b8586622e7cc5a2712402b8832519745c7403b0326097dfd4dda07efb2f","avr-convergence | usb-otg | uart-flow-control | firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","parity-gap","complete","libraries/BoardCore/src/SerialLink.h:26 [UTF8-LF sha256=99373bc4c090e34324cfd2ae8c94d6666c227ad7e157a47fbd85125aac6c13a0; anchor=UartFlow::receiveBudget(serial_.available())] | libraries/BoardCore/src/UartFlow.h:25 [UTF8-LF sha256=44f8638f725c9cf83a6f53639144f107aace1556dd254d6dcebcaed4853c6469; anchor=constexpr uint16_t serviceBudget = 64]","Actual entry-occupancy receive snapshot, drop-until-delimiter recovery, bounded framing and synchronous response behavior adapted to shared SerialLink. Added64-byte cap for ESP32's larger RX ring and explicit negative-read handling; CRC/COBS code unchanged. | Hardware UART remains on AVR; buffered unsolicited sends require enough TX ring space for a complete maximum frame. Failed game-state sends keep stateDirty armed. Busy-wire/polling behavior and default retained.","Zero-copy Frame view, in-place RX decode and externally exposed macro TX scratch [pending] | framingErrors(), crcErrors(), responseErrors() separate counters [pending] | Event high-bit timestamp, BuzzerChanged and timed Ack/ErrorResponse suffixes [pending] | advisory unknown reserved envelope byte acceptance [replaced]","Zero-copy Frame view, in-place RX decode and externally exposed macro TX scratch: Actual donor member TX scratch and streaming writeCobs are now adapted, preserving byte-exact packets and partial-write boundary repair. Current AVR FrontPanel transmit path falls from about652 to502 stack bytes including TX interrupt, against588 bytes remaining after globals; this is a focused ELF estimate, not whole-program high-water proof. Owning RX Frame and in-place decode optimization remain pending; no mutable macro scratch API is exposed. | framingErrors(), crcErrors(), responseErrors() separate counters: Existing shared combined errors and S3 hardwareErrors are retained. Separate counter taxonomy and peer/client telemetry need full validated layout adaptation; this bounded flow change does not invent or renumber remote fields. | Event high-bit timestamp, BuzzerChanged and timed Ack/ErrorResponse suffixes: Donor raw operation/schema values differ from the established Pakar envelope and explicit PCController adapter. Blindly appending suffixes would change ACK matching and nested contract semantics. Read full ProtocolRuntime/ControllerEvents and clients, then integrate timestamped projection through the explicit adapter. | advisory unknown reserved envelope byte acceptance: Pakar deliberately requires its fixed zero reserved byte and valid CRC, per living API fail-closed integrity policy. No numbered generation negotiation or compatibility alias is introduced. Existing protocol_test preserves CRC-correct nonzero rejection; optional opcodes still reach semantic dispatch.","tests/serial_link_test.cpp:52 [UTF8-LF sha256=c103ffb2c7530bb4c85373433b123fe072bb6649f2d97b82f70fa08d404eeae8; anchor=Actual donor split-RX/synchronous-TX isolation]","Buffered AVR profile is distinct and explicitly rejects ESP8266 targeting; no blind write replay.","Paired S3 application integration, reconnect/readback ownership and physical stress; build flag is not hardware acceptance. | Complete zero-copy/counter/timestamp projection pending above; actual donor protocol registry is not imported wholesale.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Project/UartProtocol.h","b0111ae0c80dc34149ea1044de7dd5488920301b","287a95a65a9b9655e64a15ece051bc792a06564b648a1b53eed4f373c564e458","avr-convergence | usb-otg | uart-flow-control | firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","parity-gap","complete","firmware/esp/src/HostDemand.h:9 [UTF8-LF sha256=ed625496269aacbfc22ee281879893a58d9695cad2e2338c24934a6d1018e1b8; anchor=class HostDemand] | firmware/esp/src/HostSerial.h:26 [UTF8-LF sha256=d7dee1d9329e3959d2e362783295de00e6345dfd66cdde3f2ee1def0856fc1da; anchor=serial.enableReboot(false)] | desktop/src/usb_demand.rs:84 [UTF8-LF sha256=1901dd438e454e83718feb769745bd83175a28808d746b5385d523e3c0155dac; anchor=pub struct Lease] | mobile/lib/usb_transport.dart:87 [UTF8-LF sha256=880728e89341200cfb9c1c846e2c2407e4b105608e5b4dac0355c01b1ce2ad2c; anchor=class PakarUsbTransport] | libraries/BoardCore/src/SerialLink.h:26 [UTF8-LF sha256=99373bc4c090e34324cfd2ae8c94d6666c227ad7e157a47fbd85125aac6c13a0; anchor=UartFlow::receiveBudget(serial_.available())] | libraries/BoardCore/src/UartFlow.h:25 [UTF8-LF sha256=44f8638f725c9cf83a6f53639144f107aace1556dd254d6dcebcaed4853c6469; anchor=constexpr uint16_t serviceBudget = 64]","Fully read actual UART API and synchronous payload lifetime contract. Shared SerialLink keeps AVR HardwareSerial ownership, separate RX/TX frame storage and handler/opaque context; Stream constructor preserves the S3 explicit pins/buffers. | USB-OTG task reread this complete actual donor header and implementation. Retain the established Pakar COBS/CRC envelope and synchronous frame lifetime across UART0, hardware CDC and owned TinyUSB CDC, rather than add a second public protocol or copy incompatible donor operation identifiers. Finite observation demand is separate from command ownership and explicit replies.","Zero-copy Frame view, in-place RX decode and externally exposed macro TX scratch [pending] | framingErrors(), crcErrors(), responseErrors() separate counters [pending] | Event high-bit timestamp, BuzzerChanged and timed Ack/ErrorResponse suffixes [pending] | advisory unknown reserved envelope byte acceptance [replaced]","Zero-copy Frame view, in-place RX decode and externally exposed macro TX scratch: Actual donor member TX scratch and streaming writeCobs are now adapted, preserving byte-exact packets and partial-write boundary repair. Current AVR FrontPanel transmit path falls from about652 to502 stack bytes including TX interrupt, against588 bytes remaining after globals; this is a focused ELF estimate, not whole-program high-water proof. Owning RX Frame and in-place decode optimization remain pending; no mutable macro scratch API is exposed. | framingErrors(), crcErrors(), responseErrors() separate counters: Existing shared combined errors and S3 hardwareErrors are retained. Separate counter taxonomy and peer/client telemetry need full validated layout adaptation; this bounded flow change does not invent or renumber remote fields. | Event high-bit timestamp, BuzzerChanged and timed Ack/ErrorResponse suffixes: Donor raw operation/schema values differ from the established Pakar envelope and explicit PCController adapter. Blindly appending suffixes would change ACK matching and nested contract semantics. Read full ProtocolRuntime/ControllerEvents and clients, then integrate timestamped projection through the explicit adapter. | advisory unknown reserved envelope byte acceptance: Pakar deliberately requires its fixed zero reserved byte and valid CRC, per living API fail-closed integrity policy. No numbered generation negotiation or compatibility alias is introduced. Existing protocol_test preserves CRC-correct nonzero rejection; optional opcodes still reach semantic dispatch.","tests/host_demand_test.cpp:22 [UTF8-LF sha256=aaf8339b0acafc270aece95144b9310e84cc150193003567bc339a98d5731923; anchor=int main()] | tests/host_usb_test.cpp:4 [UTF8-LF sha256=777369c0955c5eced1b601e0c30c88d6df128bd59e507ef93d16a44976f9f071; anchor=int main()] | desktop/src/usb_table.rs:1062 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn usb_demand_actual_worker_has_no_full_capture_without_reader_and_releases_lease] | tests/serial_link_test.cpp:52 [UTF8-LF sha256=c103ffb2c7530bb4c85373433b123fe072bb6649f2d97b82f70fa08d404eeae8; anchor=Actual donor split-RX/synchronous-TX isolation]","Bounded large-ring RX, negative availability/read rejection and paired buffered build mode without busy GPIO.","Optimize zero-copy/storage only with full shared consumer and AVR stack/RAM proof; no claim of donor-wide protocol parity. | Finish separate counters and timestamped event contracts, and physical UART/LED/OTA contention acceptance.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Project/UartProtocol.cpp","b0111ae0c80dc34149ea1044de7dd5488920301b","bd2d1b8586622e7cc5a2712402b8832519745c7403b0326097dfd4dda07efb2f","transport-convergence | avr-convergence | usb-otg | uart-flow-control | firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6 | https://github.com/atomicdeploy/PakarController/issues/41","parity-gap","complete","libraries/BoardCore/src/SerialLink.h:26 [UTF8-LF sha256=99373bc4c090e34324cfd2ae8c94d6666c227ad7e157a47fbd85125aac6c13a0; anchor=UartFlow::receiveBudget(serial_.available())] | libraries/BoardCore/src/UartFlow.h:25 [UTF8-LF sha256=44f8638f725c9cf83a6f53639144f107aace1556dd254d6dcebcaed4853c6469; anchor=constexpr uint16_t serviceBudget = 64]","Actual entry-occupancy receive snapshot, drop-until-delimiter recovery, bounded framing and synchronous response behavior adapted to shared SerialLink. Added64-byte cap for ESP32's larger RX ring and explicit negative-read handling; CRC/COBS code unchanged. | Hardware UART remains on AVR; buffered unsolicited sends require enough TX ring space for a complete maximum frame. Failed game-state sends keep stateDirty armed. Busy-wire/polling behavior and default retained.","Zero-copy Frame view, in-place RX decode and externally exposed macro TX scratch [pending] | framingErrors(), crcErrors(), responseErrors() separate counters [pending] | Event high-bit timestamp, BuzzerChanged and timed Ack/ErrorResponse suffixes [pending] | advisory unknown reserved envelope byte acceptance [replaced]","Zero-copy Frame view, in-place RX decode and externally exposed macro TX scratch: Actual donor member TX scratch and streaming writeCobs are now adapted, preserving byte-exact packets and partial-write boundary repair. Current AVR FrontPanel transmit path falls from about652 to502 stack bytes including TX interrupt, against588 bytes remaining after globals; this is a focused ELF estimate, not whole-program high-water proof. Owning RX Frame and in-place decode optimization remain pending; no mutable macro scratch API is exposed. | framingErrors(), crcErrors(), responseErrors() separate counters: Existing shared combined errors and S3 hardwareErrors are retained. Separate counter taxonomy and peer/client telemetry need full validated layout adaptation; this bounded flow change does not invent or renumber remote fields. | Event high-bit timestamp, BuzzerChanged and timed Ack/ErrorResponse suffixes: Donor raw operation/schema values differ from the established Pakar envelope and explicit PCController adapter. Blindly appending suffixes would change ACK matching and nested contract semantics. Read full ProtocolRuntime/ControllerEvents and clients, then integrate timestamped projection through the explicit adapter. | advisory unknown reserved envelope byte acceptance: Pakar deliberately requires its fixed zero reserved byte and valid CRC, per living API fail-closed integrity policy. No numbered generation negotiation or compatibility alias is introduced. Existing protocol_test preserves CRC-correct nonzero rejection; optional opcodes still reach semantic dispatch.","tests/serial_link_test.cpp:52 [UTF8-LF sha256=c103ffb2c7530bb4c85373433b123fe072bb6649f2d97b82f70fa08d404eeae8; anchor=Actual donor split-RX/synchronous-TX isolation]","Buffered AVR profile is distinct and explicitly rejects ESP8266 targeting; no blind write replay.","Paired S3 application integration, reconnect/readback ownership and physical stress; build flag is not hardware acceptance. | Complete zero-copy/counter/timestamp projection pending above; actual donor protocol registry is not imported wholesale.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Project/UartProtocol.h","b0111ae0c80dc34149ea1044de7dd5488920301b","287a95a65a9b9655e64a15ece051bc792a06564b648a1b53eed4f373c564e458","transport-convergence | avr-convergence | usb-otg | uart-flow-control | firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6 | https://github.com/atomicdeploy/PakarController/issues/41","parity-gap","complete","firmware/esp/src/HostDemand.h:9 [UTF8-LF sha256=ed625496269aacbfc22ee281879893a58d9695cad2e2338c24934a6d1018e1b8; anchor=class HostDemand] | firmware/esp/src/HostSerial.h:26 [UTF8-LF sha256=d7dee1d9329e3959d2e362783295de00e6345dfd66cdde3f2ee1def0856fc1da; anchor=serial.enableReboot(false)] | desktop/src/usb_demand.rs:84 [UTF8-LF sha256=1901dd438e454e83718feb769745bd83175a28808d746b5385d523e3c0155dac; anchor=pub struct Lease] | mobile/lib/usb_transport.dart:89 [UTF8-LF sha256=6b7600fb34460397f778d5d46239e2e90954c33ae1a2b28f0b37a492185dd13b; anchor=class PakarUsbTransport] | libraries/BoardCore/src/SerialLink.h:26 [UTF8-LF sha256=99373bc4c090e34324cfd2ae8c94d6666c227ad7e157a47fbd85125aac6c13a0; anchor=UartFlow::receiveBudget(serial_.available())] | libraries/BoardCore/src/UartFlow.h:25 [UTF8-LF sha256=44f8638f725c9cf83a6f53639144f107aace1556dd254d6dcebcaed4853c6469; anchor=constexpr uint16_t serviceBudget = 64]","Fully read actual UART API and synchronous payload lifetime contract. Shared SerialLink keeps AVR HardwareSerial ownership, separate RX/TX frame storage and handler/opaque context; Stream constructor preserves the S3 explicit pins/buffers. | USB-OTG task reread this complete actual donor header and implementation. Retain the established Pakar COBS/CRC envelope and synchronous frame lifetime across UART0, hardware CDC and owned TinyUSB CDC, rather than add a second public protocol or copy incompatible donor operation identifiers. Finite observation demand is separate from command ownership and explicit replies.","Zero-copy Frame view, in-place RX decode and externally exposed macro TX scratch [pending] | framingErrors(), crcErrors(), responseErrors() separate counters [pending] | Event high-bit timestamp, BuzzerChanged and timed Ack/ErrorResponse suffixes [pending] | advisory unknown reserved envelope byte acceptance [replaced]","Zero-copy Frame view, in-place RX decode and externally exposed macro TX scratch: Actual donor member TX scratch and streaming writeCobs are now adapted, preserving byte-exact packets and partial-write boundary repair. Current AVR FrontPanel transmit path falls from about652 to502 stack bytes including TX interrupt, against588 bytes remaining after globals; this is a focused ELF estimate, not whole-program high-water proof. Owning RX Frame and in-place decode optimization remain pending; no mutable macro scratch API is exposed. | framingErrors(), crcErrors(), responseErrors() separate counters: Existing shared combined errors and S3 hardwareErrors are retained. Separate counter taxonomy and peer/client telemetry need full validated layout adaptation; this bounded flow change does not invent or renumber remote fields. | Event high-bit timestamp, BuzzerChanged and timed Ack/ErrorResponse suffixes: Donor raw operation/schema values differ from the established Pakar envelope and explicit PCController adapter. Blindly appending suffixes would change ACK matching and nested contract semantics. Read full ProtocolRuntime/ControllerEvents and clients, then integrate timestamped projection through the explicit adapter. | advisory unknown reserved envelope byte acceptance: Pakar deliberately requires its fixed zero reserved byte and valid CRC, per living API fail-closed integrity policy. No numbered generation negotiation or compatibility alias is introduced. Existing protocol_test preserves CRC-correct nonzero rejection; optional opcodes still reach semantic dispatch.","tests/host_demand_test.cpp:22 [UTF8-LF sha256=aaf8339b0acafc270aece95144b9310e84cc150193003567bc339a98d5731923; anchor=int main()] | tests/host_usb_test.cpp:4 [UTF8-LF sha256=777369c0955c5eced1b601e0c30c88d6df128bd59e507ef93d16a44976f9f071; anchor=int main()] | desktop/src/usb_table.rs:1062 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn usb_demand_actual_worker_has_no_full_capture_without_reader_and_releases_lease] | tests/serial_link_test.cpp:52 [UTF8-LF sha256=c103ffb2c7530bb4c85373433b123fe072bb6649f2d97b82f70fa08d404eeae8; anchor=Actual donor split-RX/synchronous-TX isolation]","Bounded large-ring RX, negative availability/read rejection and paired buffered build mode without busy GPIO.","Optimize zero-copy/storage only with full shared consumer and AVR stack/RAM proof; no claim of donor-wide protocol parity. | Finish separate counters and timestamped event contracts, and physical UART/LED/OTA contention acceptance.","Not established by source/hash/test-code comparison; see issue #2" "PCController","ProjectConfig.h","b0111ae0c80dc34149ea1044de7dd5488920301b","ea03bcf7f2822166274ee5b51568e1250dd55af9a0282435e409c9adb08748a3","avr-convergence | preferences","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/4 | https://github.com/atomicdeploy/PakarController/issues/6","parity-gap","complete","docs/PC-CONTROLLER-MERGE-READINESS.md:44 [UTF8-LF sha256=a023cd4573108622cbd76a62cb52115c7dd6735d1b15999b73df1e5a2a9b96d5; anchor=## System-wide gap matrix]","Read every actual default, memory rationale and conflicting-feature guard. Compared donor 115200 application UART and constrained optional modules with Pakar 38400, active scheduler/macros/automations and separate ESP ownership. Documentation only, no flag changed.","Direct donor defaults, optional boot opcodes/menu-label/audio storage and broader hardware engines [pending]","Direct donor defaults, optional boot opcodes/menu-label/audio storage and broader hardware engines: Donor-constrained flash tradeoffs are not Pakar measurements. These useful feature families need explicit profile/EEPROM and memory decisions; a 328P must not blindly enable every feature or inherit donor absent-hardware behavior.","","","Issue #3/#6: source-level profile mapping followed by measured affected AVR flash/SRAM/stack and driver acceptance; no new compile or commissioning in this pass.","Not established by source/hash/test-code comparison; see issue #2" "PCController","README.md","b0111ae0c80dc34149ea1044de7dd5488920301b","862dd06b91efdfbc09f4d895e305ecec71d84637a7bf7d4d95d907bcd3b83566","repository-governance","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/11","parity-gap","complete","README.md:43 [UTF8-LF sha256=6ef2bde812ca8aaf889f5ad1c8313ae6e4e5ac079b93424ef4be6e2cdd007da5; anchor=## Get started] | docs/README.md:7 [UTF8-LF sha256=006973cc50167b64df88e80d539604df763b3edffac561a9ada86fcc7b69683b; anchor=## Operate and recover]","Task-oriented quick start, distinct surfaces, engineering-download provenance, maintained guide hub and truthful source/physical verification boundary adapted to actual Pakar contracts.","PCController hardware map, media/seat operations, Go/C ABI examples [not-applicable] | Complete operator walkthrough and supported cross-platform native package matrix [pending]","PCController hardware map, media/seat operations, Go/C ABI examples: Different product hardware/runtime; copying would misdirect wiring or invent Pakar commands. | Complete operator walkthrough and supported cross-platform native package matrix: Pakar native packages and hardware acceptance do not match every donor target; preserve explicit platform limits rather than claim unsupported installers.","tests/doc_links_test.mjs:13 [UTF8-LF sha256=1f3a40d9c4fba2f5da02dc92a6637f8c073e07b10307cf5d8f405691902bba33; anchor=assert.deepEqual(checkGuides]","","Expand accepted operator walkthroughs as runtime and hardware gates are completed.","Not established by source/hash/test-code comparison; see issue #2" "PCController","REUSE.toml","b0111ae0c80dc34149ea1044de7dd5488920301b","5e8fb99c410dedb16ffbffdcb3b303ba8a4b5739f925abb5d47c93175d26f88c","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -858,7 +858,7 @@ "PCController","Tools/Controller/internal/hostbridge/keyboard_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","a92a5f9f72fc77f4a08df6f161e967b35c36aba642c4200f4ee1f8d7f7fb6efd","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/hostbridge/keyboard.go","b0111ae0c80dc34149ea1044de7dd5488920301b","b903b64d83fb8ef2118144175fc03662f8ac0d6ab5912a5d3ed4066e0276bd78","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/hostbridge/lifecycle_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","e017aa817a7f89cb872e1b7bb1ad9c6d56b174d852eb339b6cf8b5ebfab07910","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/internal/hostbridge/lifecycle.go","b0111ae0c80dc34149ea1044de7dd5488920301b","30454374bc87aeed2d4a536f27a24aa8c382920e9047b40d68a42faef47990c4","bridge-repeater","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3","parity-gap","complete","desktop/src/bridge.rs:110 [UTF8-LF sha256=a05278f91cf4fe82a4043e4c746422f265b07d070c29c892677211db8af2b2d5; anchor=pub struct Runtime] | desktop/src/main.rs:2448 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=SerialCommand::Bridge(target]","Read through EOF. Preserve primary selected owner and explicit Disconnect/revocation; sharing never opens another serial handle or acquires a board from discovery. Bridge listener starts only on opt-in and closes through owned stop lifetime.","Complete host suspend/resume lifecycleInstruction service/Windows power-event integration [pending]","Complete host suspend/resume lifecycleInstruction service/Windows power-event integration: Current bridge is scoped to the existing app runtime/connection Gate, not a new always-running service. Listener suspend/resume behavior and platform power callbacks require additional integration and actual host acceptance.","desktop/src/bridge.rs:2179 [UTF8-LF sha256=a05278f91cf4fe82a4043e4c746422f265b07d070c29c892677211db8af2b2d5; anchor=fn bridge_network_repeater_confirms_upstream_usb_readback_and_preserves_both_hops]","","Issue #2: Complete host suspend/resume lifecycleInstruction service/Windows power-event integration. Core native USB/network command sharing has source/socket fixtures; actual ASUS/LAN/Android/physical acceptance and full opaque firmware/binary streaming forwarding remain open.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/internal/hostbridge/lifecycle.go","b0111ae0c80dc34149ea1044de7dd5488920301b","30454374bc87aeed2d4a536f27a24aa8c382920e9047b40d68a42faef47990c4","bridge-repeater","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3","parity-gap","complete","desktop/src/bridge.rs:110 [UTF8-LF sha256=a05278f91cf4fe82a4043e4c746422f265b07d070c29c892677211db8af2b2d5; anchor=pub struct Runtime] | desktop/src/main.rs:2455 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=SerialCommand::Bridge(target]","Read through EOF. Preserve primary selected owner and explicit Disconnect/revocation; sharing never opens another serial handle or acquires a board from discovery. Bridge listener starts only on opt-in and closes through owned stop lifetime.","Complete host suspend/resume lifecycleInstruction service/Windows power-event integration [pending]","Complete host suspend/resume lifecycleInstruction service/Windows power-event integration: Current bridge is scoped to the existing app runtime/connection Gate, not a new always-running service. Listener suspend/resume behavior and platform power callbacks require additional integration and actual host acceptance.","desktop/src/bridge.rs:2179 [UTF8-LF sha256=a05278f91cf4fe82a4043e4c746422f265b07d070c29c892677211db8af2b2d5; anchor=fn bridge_network_repeater_confirms_upstream_usb_readback_and_preserves_both_hops]","","Issue #2: Complete host suspend/resume lifecycleInstruction service/Windows power-event integration. Core native USB/network command sharing has source/socket fixtures; actual ASUS/LAN/Android/physical acceptance and full opaque firmware/binary streaming forwarding remain open.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/hostbridge/manager_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","608aad1baf6cbc1e42977bb6264aa20fc854adbb5e32536c4c638caf4e485afa","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/hostbridge/manager.go","b0111ae0c80dc34149ea1044de7dd5488920301b","b34517a1c30084d2362e951638e0039d78abd45a5128b62342bb717b6c44b1b2","firmware-delivery | bridge-repeater","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","parity-gap","complete","desktop/src/firmware_feed.rs:228 [UTF8-LF sha256=839700ab270d23de6e65beca90071e7c0fb3ad9f4da0cd4d06864e0fb96cde10; anchor=pub struct Wire] | mobile/lib/firmware_feed.dart:106 [UTF8-LF sha256=fb8f8c35c609def5a1da0997a16175baefcc0f568439df0aea1a6c00b801ab55; anchor=class FirmwareFeedWire]","Adapt the fully read actual outbound WebSocket and genuine Socket.IO client paths: explicit protocol, Bearer header, Engine.IO open, namespace connect, ping/pong, exact event tuple, bounded sessions and no command replay. Native and Android accept only fresh session/board/boot-bound SHA-pinned offers from the configured download origin, not generic remote RPC.","Remaining donor mechanisms outside this delivery slice [pending]","Remaining donor mechanisms outside this delivery slice: Generic reciprocal JSON-RPC/Socket.IO command routing, board mirroring, hotkeys/webhooks, durable generic command queues and the rest of this host integration manager remain pending. Foreground firmware automation now supports bounded read-only feed reconnect with fresh sessions and persisted consumed digests; that is not generic command replay or full host-manager parity.","desktop/src/firmware_feed.rs:735 [UTF8-LF sha256=839700ab270d23de6e65beca90071e7c0fb3ad9f4da0cd4d06864e0fb96cde10; anchor=fn firmware_feed_actual_websocket_and_socketio_sessions_deliver_once] | mobile/test/firmware_delivery_test.dart:272 [UTF8-LF sha256=2a5a1ff4950f3806d522d2afe76050884aff03a7f3f0556abc329f25a0042976; anchor=Actual WS/Socket.IO listener deduplicates offers]","","Issue #2/#7: verify the owner's actual authenticated WSS/Socket.IO endpoint and emitted firmware event. Loopback protocol fixtures are not Internet/TLS server interoperability or Android background uptime.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/hostbridge/notification_queue_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","a6e03107738760743d585323a172231aada59fde7e85079ec77a5f16aaceb586","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -1008,7 +1008,7 @@ "PCController","Tools/Controller/internal/ipcjson/raw_transport_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","2020cd0746f4385b8851802f1fdd7fe710ca2b4185b50d870917c0c2bfe39f3e","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/ipcjson/release_http_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","2f02d1d715d230d66efb379a895730421008a621f2c0607f6a22eb5c4d27fd31","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/ipcjson/release_http.go","b0111ae0c80dc34149ea1044de7dd5488920301b","53290a3cfc4ef579b55005c1f081485a352a6595c665d92ff967c8e8cd42535b","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/internal/ipcjson/rest_routes_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","729b980122ce5e3b3024544c9229d52ce03647bf195d62958fa388304d44fbe8","api-contract | updates-telemetry","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","parity-gap","complete","libraries/BoardCore/src/ApiPolicy.h:8 [UTF8-LF sha256=ee7dcf1c76d2d1703ae2d8d11ab0feff19650f08e8cfddfa03faac17ba6a163c; anchor=inline bool numberedRoute] | firmware/esp/src/WebAccess.h:36 [UTF8-LF sha256=774b524f4cd81c003e4139d0bb6cf3353d987674bbfb49d7a1b989ee2a232294; anchor=ApiPolicy::numberedRoute]","Actual TestVersionedCoreAPIRoutesAreRejected test cases adapted into the C++ helper exercised by ESP async middleware; generalized to all numbered API roots and pre-auth rejection.","TestCanonicalRESTRouteInventory, TestRESTAppActionCannotInjectCoordinatorNavigationMetadata, typed app launch/action outcome lifecycle [pending]","TestCanonicalRESTRouteInventory, TestRESTAppActionCannotInjectCoordinatorNavigationMetadata, typed app launch/action outcome lifecycle: These exercise the full PCController Go host coordinator, not the ESP handlers. Applicable generic typed action/outcome/auth ownership and full real multiplexer route inventory still need explicit Pakar contracts and tests. The narrower source/wire tests here do not claim end-to-end async server acceptance.","tests/protocol_test.cpp:79 [UTF8-LF sha256=92cd55f433424863ff59ba08b048c873c205af3133dba1bf1c9aacf5034135af; anchor=Actual donor TestVersionedCoreAPIRoutesAreRejected cases] | tests/living_contract_test.mjs:26 [UTF8-LF sha256=67389b8a5ef0a051959d1938d52abb6b48edeb194e8a73f51235d376c8121d59; anchor=pre-auth 404 wiring]","","Port applicable real top-level route inventory, typed app outcomes and coordinator-owned metadata spoof tests after mapping the actual Pakar host coordinator.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/internal/ipcjson/rest_routes_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","729b980122ce5e3b3024544c9229d52ce03647bf195d62958fa388304d44fbe8","api-contract | updates-telemetry","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","parity-gap","complete","libraries/BoardCore/src/ApiPolicy.h:8 [UTF8-LF sha256=ee7dcf1c76d2d1703ae2d8d11ab0feff19650f08e8cfddfa03faac17ba6a163c; anchor=inline bool numberedRoute] | firmware/esp/src/WebAccess.h:36 [UTF8-LF sha256=774b524f4cd81c003e4139d0bb6cf3353d987674bbfb49d7a1b989ee2a232294; anchor=ApiPolicy::numberedRoute]","Actual TestVersionedCoreAPIRoutesAreRejected test cases adapted into the C++ helper exercised by ESP async middleware; generalized to all numbered API roots and pre-auth rejection.","TestCanonicalRESTRouteInventory, TestRESTAppActionCannotInjectCoordinatorNavigationMetadata, typed app launch/action outcome lifecycle [pending]","TestCanonicalRESTRouteInventory, TestRESTAppActionCannotInjectCoordinatorNavigationMetadata, typed app launch/action outcome lifecycle: These exercise the full PCController Go host coordinator, not the ESP handlers. Applicable generic typed action/outcome/auth ownership and full real multiplexer route inventory still need explicit Pakar contracts and tests. The narrower source/wire tests here do not claim end-to-end async server acceptance.","tests/protocol_test.cpp:85 [UTF8-LF sha256=4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144; anchor=Actual donor TestVersionedCoreAPIRoutesAreRejected cases] | tests/living_contract_test.mjs:26 [UTF8-LF sha256=67389b8a5ef0a051959d1938d52abb6b48edeb194e8a73f51235d376c8121d59; anchor=pre-auth 404 wiring]","","Port applicable real top-level route inventory, typed app outcomes and coordinator-owned metadata spoof tests after mapping the actual Pakar host coordinator.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/ipcjson/rf_binding_collision_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","2ddcbd80ac5303060438092ca3c03e140ea59b1c371b7307b525bfd0fdfd0944","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/ipcjson/rf_bindings_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","635cd578c44e5c0a037ccb535f88b39000ac79cf0996d245b4d3509b34b0e72d","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/ipcjson/rf_bindings.go","b0111ae0c80dc34149ea1044de7dd5488920301b","9e5b39a54e4ec0996e104809d22d498c6043680dd8318a272f7dcff94f725ddc","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -1032,16 +1032,16 @@ "PCController","Tools/Controller/internal/lanresolver/resolver_linux.go","b0111ae0c80dc34149ea1044de7dd5488920301b","e2d070699041caa182cee760389d096ea619168fefb22319c163ccf29f903b57","mobile-network | network-cloud","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/lanresolver/resolver_other.go","b0111ae0c80dc34149ea1044de7dd5488920301b","92b65281787b65a4e38ff46de6a7b40c876ae10aeb20604f827ddfa51a4c77f0","mobile-network | network-cloud","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/lanresolver/resolver_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","b03498f9df5a9f8e5bc3c94eabec71ab4fb412b53c1fb1729fe63a45ec1ba3b9","automatic-connection | connection-resilience | mobile-network | network-cloud","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10","parity-gap","complete","mobile/test/selection_batch_network_test.dart:19 [UTF8-LF sha256=41eb7d501bf707974913ef8d1813b0e18d841b85266c032778acd15848f09dc3; anchor=test(] | desktop/src/peer_http.rs:959 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn local_address_cache_accepts_only_verified_tcp_peer_not_advertised_ip]","Adapted actual cached-address reuse and changed-DHCP-address scenarios with injected lookups/dials. Added actual loopback HTTP Host identity, authentication/timeout retention, selection/batch/readback and melody fixtures. | Native fixtures exercise actual reqwest loopback TCP, cached subsequent resolution, original HTTP Host and explicit port, provenance rejection, finite cache/replacement and invalidation. They are not Windows mDNS, Android DNS or DHCP physical acceptance. | Current native discovery fixtures cover persisted route roundtrip, endpoint/board/scheme/port fencing and credential-free failed-hostname recovery. Flutter trusted-CA HTTPS/WSS fixtures exercise actual numeric TCP fallback with original logical certificate identity, wrong-board rejection and shared-route reuse without repeated DNS. Separate ControlShell widget fixtures cover startup, manual Disconnect and editor handoff holds; none contacts production.","Go net.TCPConn placeholders, netip addresses and go test runtime [replaced]","Go net.TCPConn placeholders, netip addresses and go test runtime: Tests exercise the Dart resolver used by this application and a real local HTTP listener; Go donor tests are not executed as Flutter evidence. Physical phone/Wi-Fi and audible melody acceptance remain separate.","mobile/test/lan_resolver_transport_test.dart:12 [UTF8-LF sha256=bf4a46ca2ce7a9639b66bd7c03f9ecd57065b58a2d7fb2cc5e8f6a0edc3f637e; anchor=void main()] | mobile/test/selection_batch_network_test.dart:19 [UTF8-LF sha256=41eb7d501bf707974913ef8d1813b0e18d841b85266c032778acd15848f09dc3; anchor=test(] | desktop/src/peer_http.rs:1110 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn local_address_cache_bounds_replaces_and_invalidates_without_ttl_or_authority] | mobile/test/network_route_recovery_test.dart:11 [UTF8-LF sha256=e353a06b0fab6f9dd84cc7ce24aee1a5e8517c6e179b3975826f6adaa52f951f; anchor=void main()] | mobile/test/configuration_event_transport_test.dart:9 [UTF8-LF sha256=4c48e1641b05832a0c0fd5945a9a63e080b8563515f00970f03bb7fcdee9dd08; anchor=void main()] | tests/peer_relay_test.cpp:140 [UTF8-LF sha256=30aa409380278617eacba57eba16589bb4e7b4671479e9c44087817882494ba2; anchor=int main()]","Adds session routing and identity-fenced durable recovery, trusted-CA TLS fixtures and no mutation replay.","Focused Flutter fixtures pass; actual phone/LAN, physical color and audible melody acceptance remain open. ESP relay/cache/route-store fixtures cover cached reuse with failed mDNS, changed DHCP address, saved-route re-verification, wrong identity/boot, private-address validation, command no-replay, memory/receipt limits, safe late DNS callbacks and interrupted filesystem publication. Actual bidirectional board latency and heap/long-soak acceptance are still pending.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/internal/lanresolver/resolver.go","b0111ae0c80dc34149ea1044de7dd5488920301b","8dec2b65850f9bfecf71c510f9f29392cc09def0e9590568d61ae982707cb4d7","automatic-connection | connection-resilience | mobile-network | network-cloud","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10","parity-gap","complete","mobile/lib/lan_resolver.dart:8 [UTF8-LF sha256=0dd6bae6e31632f2b526796cf4a67b5b31af978bac11d00bc932f3aef5576e92; anchor=class LanResolver] | mobile/lib/api.dart:181 [UTF8-LF sha256=bbb407cc65ccd54e10d7a21328d07831ce5fa3eff70eebe99a6a10b3815257e8; anchor=final LanResolver resolver;] | mobile/lib/discovery.dart:116 [UTF8-LF sha256=8cb3956f80a50c5be2c134829bc7d323a3f4c58fbbcf1ea5d5e1aaa10ac7fbba; anchor=class DiscoveryCatalog] | mobile/lib/devices_page.dart:73 [UTF8-LF sha256=73b22cde59bac6f882fd989e6494a09d3d19b010b0fc8e5ae69e55591eca44c0; anchor=catalog] | desktop/src/peer_http.rs:339 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=pub fn device_client_builder] | desktop/src/main.rs:818 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=peer_http::remember_address] | firmware/esp/src/PeerLanResolver.h:13 [UTF8-LF sha256=2413d89e26403aae1a9a528c60da09acf4ea5079067b8c1183e7e6c4d8f41546; anchor=class PeerLanResolver]","Actual complete donor resolver and tests read from canonical PCController; adapted successful-address caching, retaining URL hostname/HTTP Host/TLS SNI rather than replacing the public identity with an IP. | 2026-10-28 reread resolver.go and resolver_test.go through EOF for ESP-to-ESP recovery. Adapt its reconnect-sticky successful address to a four-entry board+hostname+boot-verified cache. .local explicitly uses SDK mdns_query_a with a 900ms budget; unicast uses TCPIP-owned asynchronous IPv4 DNS and object-owned late callbacks instead of unbounded getaddrinfo. Explicit saved-route hints are reverified after reboot. HTTP Host remains the configured hostname; no cache/discovery record grants authorization or causes command replay. | Flutter HTTP and WebSocket share one resolver. TCP connect failures may trigger bounded read-only relookup but retain the last successful address; actual DNS SocketException/empty answer invalidates it. HTTP/auth/timeout failures do not evict or trigger discovery/replay. Cached route data never grants board/boot ownership. | Actual complete resolver reread at unchanged source hash for measured ASUS .local latency. A separate bounded32-host native cache accepts only actual response TCP remote_addr after valid board/boot and requested-hostname checks, retains URL Host/SNI, never trusts advertised IP and never grants command ownership. Fresh no-idle-pool clients reuse verified routing. Only typed dial/resolution failures mark a retained hint for later relookup; HTTP/auth/body timeouts do not discard it. Successful verified TCP replacement clears the bounded lookup mark; no mutation is replayed. | Actual pinned tungstenite0.30 TLS source was inspected for original-URI SNI and normal root verification. Native WS now dials numeric endpoints or the same actual-TCP cache (including verified configured DNS aliases; .local labels still match the board). A missing hint waits quietly for the existing selected HTTP worker: no duplicate WS HTTP/DNS runtime or resolver thread. TCP timeout and absolute TLS/HTTP-upgrade deadline precede handshake; selected-route revocation is checked on each IO. Both Plain and Rustls use bounded runtime reads. Actual loopback seeding/Host, empty-cache/no-socket, mismatch/revocation and deadline fixtures cover this adaptation; TLS validation and physical LAN remain separate proof. | Reread complete donor resolver/tests for automatic-connection. Current policy supersedes earlier failed-resolution-only wording: hold actual TCP routing for the connected session until reachability failure or retirement. Persist hostname and last verified numeric origin as an endpoint/scheme/port/board-bound read-only recovery hint; try hostname first on a new session. Cached hostname requests preserve logical HTTP Host/TLS SNI and normal certificate validation; both clients' HTTPS recovery retains original hostname certificate identity even when the TCP dial uses a saved IP. Flutter unencrypted HTTP recovery can retain a verified numeric transport alias while saving the logical hostname separately. Only fresh compatible same-board status promotes the hint; no credentials, WebSocket authority or mutation replay come from persisted routing. Verified active renames preserve drafts/layout, while loopback forwarded URLs and remote DNS aliases remain transport aliases rather than being rewritten into board.local with the wrong port.","Donor forget(key,cached) on TCP dial error [replaced] | Go mutex, process-global resolver, Linux platform NBNS fallback and unbounded address candidates [replaced]","Donor forget(key,cached) on TCP dial error: Current user policy retains successful routing for the connected session until reachability failure or retirement, then tries hostname-first read-only recovery and the board-bound saved IP. A successful verified replacement refreshes the route; failed lookup alone does not promote another address. No HTTP mutation is replayed. | Go mutex, process-global resolver, Linux platform NBNS fallback and unbounded address candidates: Dart isolate ownership and a shared per-API resolver replace Go synchronization/global state. DNS and each dial have deadlines, successful cache is bounded64 hosts and candidates2; platform discovery remains separate. Android OS/mDNS resolution and DHCP movement still need actual phone/LAN acceptance; no platform helper or multicast success is inferred.","mobile/test/lan_resolver_transport_test.dart:12 [UTF8-LF sha256=bf4a46ca2ce7a9639b66bd7c03f9ecd57065b58a2d7fb2cc5e8f6a0edc3f637e; anchor=void main()] | mobile/test/selection_batch_network_test.dart:19 [UTF8-LF sha256=41eb7d501bf707974913ef8d1813b0e18d841b85266c032778acd15848f09dc3; anchor=test(] | desktop/src/peer_http.rs:1199 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn local_verified_address_override_preserves_http_hostname_and_explicit_port] | tests/peer_relay_test.cpp:140 [UTF8-LF sha256=30aa409380278617eacba57eba16589bb4e7b4671479e9c44087817882494ba2; anchor=int main()]","Session-sticky routing plus hostname-first durable same-board recovery; authentication and generic HTTP failures never grant discovery or mutation replay authority.","Verify physical Android DNS-SD/mDNS resolution, reconnect/DHCP change, TLS hostname identity and retained discovery records under real network loss. Preserve explicit Disconnect and identity fencing.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/internal/lanresolver/resolver.go","b0111ae0c80dc34149ea1044de7dd5488920301b","8dec2b65850f9bfecf71c510f9f29392cc09def0e9590568d61ae982707cb4d7","automatic-connection | connection-resilience | mobile-network | network-cloud","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10","parity-gap","complete","mobile/lib/lan_resolver.dart:8 [UTF8-LF sha256=0dd6bae6e31632f2b526796cf4a67b5b31af978bac11d00bc932f3aef5576e92; anchor=class LanResolver] | mobile/lib/api.dart:181 [UTF8-LF sha256=bbb407cc65ccd54e10d7a21328d07831ce5fa3eff70eebe99a6a10b3815257e8; anchor=final LanResolver resolver;] | mobile/lib/discovery.dart:116 [UTF8-LF sha256=8cb3956f80a50c5be2c134829bc7d323a3f4c58fbbcf1ea5d5e1aaa10ac7fbba; anchor=class DiscoveryCatalog] | mobile/lib/devices_page.dart:73 [UTF8-LF sha256=73b22cde59bac6f882fd989e6494a09d3d19b010b0fc8e5ae69e55591eca44c0; anchor=catalog] | desktop/src/peer_http.rs:339 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=pub fn device_client_builder] | desktop/src/main.rs:818 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=peer_http::remember_address] | firmware/esp/src/PeerLanResolver.h:13 [UTF8-LF sha256=2413d89e26403aae1a9a528c60da09acf4ea5079067b8c1183e7e6c4d8f41546; anchor=class PeerLanResolver]","Actual complete donor resolver and tests read from canonical PCController; adapted successful-address caching, retaining URL hostname/HTTP Host/TLS SNI rather than replacing the public identity with an IP. | 2026-10-28 reread resolver.go and resolver_test.go through EOF for ESP-to-ESP recovery. Adapt its reconnect-sticky successful address to a four-entry board+hostname+boot-verified cache. .local explicitly uses SDK mdns_query_a with a 900ms budget; unicast uses TCPIP-owned asynchronous IPv4 DNS and object-owned late callbacks instead of unbounded getaddrinfo. Explicit saved-route hints are reverified after reboot. HTTP Host remains the configured hostname; no cache/discovery record grants authorization or causes command replay. | Flutter HTTP and WebSocket share one resolver. TCP connect failures may trigger bounded read-only relookup but retain the last successful address; actual DNS SocketException/empty answer invalidates it. HTTP/auth/timeout failures do not evict or trigger discovery/replay. Cached route data never grants board/boot ownership. | Actual complete resolver reread at unchanged source hash for measured ASUS .local latency. A separate bounded32-host native cache accepts only actual response TCP remote_addr after valid board/boot and requested-hostname checks, retains URL Host/SNI, never trusts advertised IP and never grants command ownership. Fresh no-idle-pool clients reuse verified routing. Only typed dial/resolution failures mark a retained hint for later relookup; HTTP/auth/body timeouts do not discard it. Successful verified TCP replacement clears the bounded lookup mark; no mutation is replayed. | Actual pinned tungstenite0.30 TLS source was inspected for original-URI SNI and normal root verification. Native WS now dials numeric endpoints or the same actual-TCP cache (including verified configured DNS aliases; .local labels still match the board). A missing hint waits quietly for the existing selected HTTP worker: no duplicate WS HTTP/DNS runtime or resolver thread. TCP timeout and absolute TLS/HTTP-upgrade deadline precede handshake; selected-route revocation is checked on each IO. Both Plain and Rustls use bounded runtime reads. Actual loopback seeding/Host, empty-cache/no-socket, mismatch/revocation and deadline fixtures cover this adaptation; TLS validation and physical LAN remain separate proof. | Reread complete donor resolver/tests for automatic-connection. Current policy supersedes earlier failed-resolution-only wording: hold actual TCP routing for the connected session until reachability failure or retirement. Persist hostname and last verified numeric origin as an endpoint/scheme/port/board-bound read-only recovery hint; try hostname first on a new session. Cached hostname requests preserve logical HTTP Host/TLS SNI and normal certificate validation; both clients' HTTPS recovery retains original hostname certificate identity even when the TCP dial uses a saved IP. Flutter unencrypted HTTP recovery can retain a verified numeric transport alias while saving the logical hostname separately. Only fresh compatible same-board status promotes the hint; no credentials, WebSocket authority or mutation replay come from persisted routing. Verified active renames preserve drafts/layout, while loopback forwarded URLs and remote DNS aliases remain transport aliases rather than being rewritten into board.local with the wrong port.","Donor forget(key,cached) on TCP dial error [replaced] | Go mutex, process-global resolver, Linux platform NBNS fallback and unbounded address candidates [replaced]","Donor forget(key,cached) on TCP dial error: Current user policy retains successful routing for the connected session until reachability failure or retirement, then tries hostname-first read-only recovery and the board-bound saved IP. A successful verified replacement refreshes the route; failed lookup alone does not promote another address. No HTTP mutation is replayed. | Go mutex, process-global resolver, Linux platform NBNS fallback and unbounded address candidates: Dart isolate ownership and a shared per-API resolver replace Go synchronization/global state. DNS and each dial have deadlines, successful cache is bounded64 hosts and candidates2; platform discovery remains separate. Android OS/mDNS resolution and DHCP movement still need actual phone/LAN acceptance; no platform helper or multicast success is inferred.","mobile/test/lan_resolver_transport_test.dart:12 [UTF8-LF sha256=bf4a46ca2ce7a9639b66bd7c03f9ecd57065b58a2d7fb2cc5e8f6a0edc3f637e; anchor=void main()] | mobile/test/selection_batch_network_test.dart:19 [UTF8-LF sha256=41eb7d501bf707974913ef8d1813b0e18d841b85266c032778acd15848f09dc3; anchor=test(] | desktop/src/peer_http.rs:1199 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn local_verified_address_override_preserves_http_hostname_and_explicit_port] | tests/peer_relay_test.cpp:140 [UTF8-LF sha256=30aa409380278617eacba57eba16589bb4e7b4671479e9c44087817882494ba2; anchor=int main()]","Session-sticky routing plus hostname-first durable same-board recovery; authentication and generic HTTP failures never grant discovery or mutation replay authority.","Verify physical Android DNS-SD/mDNS resolution, reconnect/DHCP change, TLS hostname identity and retained discovery records under real network loss. Preserve explicit Disconnect and identity fencing.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/link/discovery_cancel_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","090f3a0df47c063ae8a7df2932b9cc6e7717b61ed79ab1e527ae629b77cf2f07","network-cloud","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/internal/link/discovery.go","b0111ae0c80dc34149ea1044de7dd5488920301b","f35ffa43fe47035e206f4e7fe5dfaf8f0798127c4c10eb7a07db935b44b0edac","automatic-connection | network-cloud","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3","parity-gap","complete","desktop/src/platform/discovery.rs:107 [UTF8-LF sha256=126098720cf4b0d91a74e7147b41954f2361960f4ae7d210896f8c762ae24fd3; anchor=pub fn unique_board] | mobile/lib/automatic_board_connection.dart:49 [UTF8-LF sha256=fcddfe921713712973ae3258c3ff031d395892e0497302f22d05e0ebd9bafdf8; anchor=class AutomaticBoardConnector] | libraries/BoardCore/src/AvrPeerHealth.h:10 [UTF8-LF sha256=e4611c613227f063aeb44ae48b32b3f9308a36e8fddc1df06278983ba33e152d; anchor=class AvrAdmissionRecovery]","Root and native specialist read the complete actual donor through EOF. Adapt AutoOpen's preferred-candidate/ambiguity and authenticate-before-adoption ownership to a completed bounded read-only LAN sweep. Both clients retain the previous healthy peer, count duplicate interfaces by verified physical board identity, refuse multiple boards and retire late results after explicit Disconnect or method changes. Native four-worker probes and Flutter scan generations do not choose the first responder or let a retained catalog grant ownership.","AutoOpen serial filtering, ResetAfterOpen/DTR pulse and Go provisional authentication runtime [pending] | Donor exact HELLO/goroutine/channel and TCP Virtual Board contracts [replaced]","AutoOpen serial filtering, ResetAfterOpen/DTR pulse and Go provisional authentication runtime: This user request adds automatic LAN board selection, not implicit USB enumeration/reset or a replacement Go serial transport. Existing selected USB remains independent and production hold forbids unintended reset. Full serial VID/port-rebind/quarantine parity remains useful separate work; it is not claimed imported by LAN fixtures. | Donor exact HELLO/goroutine/channel and TCP Virtual Board contracts: Pakar already owns its living board/boot/capability/version status and revocable native/Dart transport. Reuse the donor selection and cleanup discipline without adding a second protocol or copying Go-specific synchronization into Rust/Flutter.","desktop/src/platform/discovery.rs:229 [UTF8-LF sha256=126098720cf4b0d91a74e7147b41954f2361960f4ae7d210896f8c762ae24fd3; anchor=fn discovery_auto_selects_one_physical_identity_not_one_interface] | mobile/test/automatic_board_connection_test.dart:32 [UTF8-LF sha256=cee36549184c34fbc52bf695f2bf92a507b60315c6b8534b04f2cc8ebae08616; anchor=void main()] | mobile/test/automatic_connection_widget_test.dart:65 [UTF8-LF sha256=fdcf213e00e2e2e0f4840a5a89151435358b1ecbf9c05cf13979c1a536b67d34; anchor=void main()] | tests/protocol_test.cpp:21 [UTF8-LF sha256=92cd55f433424863ff59ba08b048c873c205af3133dba1bf1c9aacf5034135af; anchor=admission.needsHello(2000,0)]","","Issue #2/#10: installed native/Android startup, real router/AP discovery, DHCP and hostname rename/reconnect acceptance remain open. Read-only socket/widget fixtures do not prove physical network or production deployment; unsaved drafts and maintenance owners still block new-board handoff.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/internal/link/discovery.go","b0111ae0c80dc34149ea1044de7dd5488920301b","f35ffa43fe47035e206f4e7fe5dfaf8f0798127c4c10eb7a07db935b44b0edac","automatic-connection | network-cloud","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3","parity-gap","complete","desktop/src/platform/discovery.rs:107 [UTF8-LF sha256=126098720cf4b0d91a74e7147b41954f2361960f4ae7d210896f8c762ae24fd3; anchor=pub fn unique_board] | mobile/lib/automatic_board_connection.dart:49 [UTF8-LF sha256=fcddfe921713712973ae3258c3ff031d395892e0497302f22d05e0ebd9bafdf8; anchor=class AutomaticBoardConnector] | libraries/BoardCore/src/AvrPeerHealth.h:10 [UTF8-LF sha256=e4611c613227f063aeb44ae48b32b3f9308a36e8fddc1df06278983ba33e152d; anchor=class AvrAdmissionRecovery]","Root and native specialist read the complete actual donor through EOF. Adapt AutoOpen's preferred-candidate/ambiguity and authenticate-before-adoption ownership to a completed bounded read-only LAN sweep. Both clients retain the previous healthy peer, count duplicate interfaces by verified physical board identity, refuse multiple boards and retire late results after explicit Disconnect or method changes. Native four-worker probes and Flutter scan generations do not choose the first responder or let a retained catalog grant ownership.","AutoOpen serial filtering, ResetAfterOpen/DTR pulse and Go provisional authentication runtime [pending] | Donor exact HELLO/goroutine/channel and TCP Virtual Board contracts [replaced]","AutoOpen serial filtering, ResetAfterOpen/DTR pulse and Go provisional authentication runtime: This user request adds automatic LAN board selection, not implicit USB enumeration/reset or a replacement Go serial transport. Existing selected USB remains independent and production hold forbids unintended reset. Full serial VID/port-rebind/quarantine parity remains useful separate work; it is not claimed imported by LAN fixtures. | Donor exact HELLO/goroutine/channel and TCP Virtual Board contracts: Pakar already owns its living board/boot/capability/version status and revocable native/Dart transport. Reuse the donor selection and cleanup discipline without adding a second protocol or copying Go-specific synchronization into Rust/Flutter.","desktop/src/platform/discovery.rs:229 [UTF8-LF sha256=126098720cf4b0d91a74e7147b41954f2361960f4ae7d210896f8c762ae24fd3; anchor=fn discovery_auto_selects_one_physical_identity_not_one_interface] | mobile/test/automatic_board_connection_test.dart:32 [UTF8-LF sha256=cee36549184c34fbc52bf695f2bf92a507b60315c6b8534b04f2cc8ebae08616; anchor=void main()] | mobile/test/automatic_connection_widget_test.dart:65 [UTF8-LF sha256=fdcf213e00e2e2e0f4840a5a89151435358b1ecbf9c05cf13979c1a536b67d34; anchor=void main()] | tests/protocol_test.cpp:27 [UTF8-LF sha256=4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144; anchor=admission.needsHello(2000,0)]","","Issue #2/#10: installed native/Android startup, real router/AP discovery, DHCP and hostname rename/reconnect acceptance remain open. Read-only socket/widget fixtures do not prove physical network or production deployment; unsaved drafts and maintenance owners still block new-board handoff.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/link/quarantine_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","943d64e23e5fe9a95d3e690d70c48c72ba6aa4e5ca6543a0974a3e54f09d97b6","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/internal/link/request_admission_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","0148ea4aac3cf230050045756a4308157adf786a2b6ca2d4fd99bcf665a622c1","peer-binding","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10","parity-gap","complete","desktop/src/connection.rs:28 [UTF8-LF sha256=b87a15893bb66b66dbfa84ff9ffb611a40532dc679991397651267045e14e9b0; anchor=pub struct Gate] | desktop/src/main.rs:2256 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=fn serial_worker(] | desktop/src/usb_table.rs:101 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=pub struct Operation]","Lamp-background checkpoint reread actual request-admission fixture and current selected-USB worker/HTTP-isolation regression. App-only presentation IPC is separate from physical admission; selected transport, lease and no-late-write contracts remain unchanged. Inspected main.rs target/proof rebound without execution or physical claims. | Fully read all489lines through EOF. Adapted queued-intent revocation/no-late-write and ownership-before/after admission assertions as Rust selected-method epoch tests. The production Gate keeps revoked owners until their resource leases drop and never admits a competing route or a second USB handle. | New main fixture invokes the actual HTTP worker against a live loopback listener while USB is selected, asserting zero accepted connections and zero failure events. This is an unexecuted source fixture reference until the guarded owner runs tests, not live USB or electrical proof. | Reread current canonical Session, fakePort and request_admission_test.go. Adapt actual control-over-background admission between unsent USB snapshot chunks, without overtaking an in-flight request or post-ACK verification. The production Rust worker now validates matching sequence/opcode ACK plus compact same-boot board-observed state, rather than delaying confirmation for all480 RGB pixels, mappings and icon metadata. Full captures still own capability/peripheral freshness and actual RGB; partial readback does not renew those observations. Missing companion uses read-only full verification, never mutation replay. Production-worker fragmented-port and wrong-boot/scalar/state fixtures cover this scoped adaptation, not all donor reset/open/750ms strip contracts.","Priority/background strip scheduling,750ms ACK bound, active-opcode wait diagnostics and delayed/concurrent exact ACK matching [pending] | PulseDTR cancellation/restoration/write exclusion and live physical port acquisition/late-close tests [pending]","Priority/background strip scheduling,750ms ACK bound, active-opcode wait diagnostics and delayed/concurrent exact ACK matching: USB control priority, correlated ACK and compact board readback now have production-worker fakePort coverage. Full donor750ms strip-specific deadline, delayed/concurrent request matrix and OS acquisition/close/reset ownership still require dedicated adaptation and acceptance. | PulseDTR cancellation/restoration/write exclusion and live physical port acquisition/late-close tests: This pass intentionally adds no automatic reset and keeps AVR/ISP/audio deferred. Inactive DTR on Rust open is source configuration, not measured electrical behavior; OS acquisition/cancellation/retryable-close ownership still needs dedicated fake-handle and real-host acceptance.","desktop/src/connection.rs:129 [UTF8-LF sha256=b87a15893bb66b66dbfa84ff9ffb611a40532dc679991397651267045e14e9b0; anchor=fn handoff_waits_for_all_actual_old_resources_and_rejects_stale_epoch()] | desktop/src/connection.rs:117 [UTF8-LF sha256=b87a15893bb66b66dbfa84ff9ffb611a40532dc679991397651267045e14e9b0; anchor=fn usb_offline_never_admits_network_and_disconnect_revokes_everything()] | desktop/src/main.rs:6223 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=fn usb_selected_http_worker_never_contacts_even_a_live_network_endpoint()] | desktop/src/usb_table.rs:842 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn actual_usb_worker_preempts_large_preview_and_confirms_compact_board_readback()] | desktop/src/usb_table.rs:735 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn compact_usb_readback_validates_all_values_without_renewing_full_observations()]","User-required exclusive Wi-Fi-or-USB lifecycle replaces Both rather than silently falling back; physical resources retire before the new method opens. Source evidence only until guarded tests and runtime observations.","Run guarded native tests and verify selected USB causes no HTTP/DNS/SSDP/telemetry or second physical connection; validate bounded route retirement, dirty-draft protection and retired outcomes in actual runtime. Do not infer whole donor parity or electrical acceptance from Gate tests.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/internal/link/request_admission_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","0148ea4aac3cf230050045756a4308157adf786a2b6ca2d4fd99bcf665a622c1","peer-binding","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10","parity-gap","complete","desktop/src/connection.rs:28 [UTF8-LF sha256=b87a15893bb66b66dbfa84ff9ffb611a40532dc679991397651267045e14e9b0; anchor=pub struct Gate] | desktop/src/main.rs:2263 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=fn serial_worker(] | desktop/src/usb_table.rs:101 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=pub struct Operation]","Lamp-background checkpoint reread actual request-admission fixture and current selected-USB worker/HTTP-isolation regression. App-only presentation IPC is separate from physical admission; selected transport, lease and no-late-write contracts remain unchanged. Inspected main.rs target/proof rebound without execution or physical claims. | Fully read all489lines through EOF. Adapted queued-intent revocation/no-late-write and ownership-before/after admission assertions as Rust selected-method epoch tests. The production Gate keeps revoked owners until their resource leases drop and never admits a competing route or a second USB handle. | New main fixture invokes the actual HTTP worker against a live loopback listener while USB is selected, asserting zero accepted connections and zero failure events. This is an unexecuted source fixture reference until the guarded owner runs tests, not live USB or electrical proof. | Reread current canonical Session, fakePort and request_admission_test.go. Adapt actual control-over-background admission between unsent USB snapshot chunks, without overtaking an in-flight request or post-ACK verification. The production Rust worker now validates matching sequence/opcode ACK plus compact same-boot board-observed state, rather than delaying confirmation for all480 RGB pixels, mappings and icon metadata. Full captures still own capability/peripheral freshness and actual RGB; partial readback does not renew those observations. Missing companion uses read-only full verification, never mutation replay. Production-worker fragmented-port and wrong-boot/scalar/state fixtures cover this scoped adaptation, not all donor reset/open/750ms strip contracts.","Priority/background strip scheduling,750ms ACK bound, active-opcode wait diagnostics and delayed/concurrent exact ACK matching [pending] | PulseDTR cancellation/restoration/write exclusion and live physical port acquisition/late-close tests [pending]","Priority/background strip scheduling,750ms ACK bound, active-opcode wait diagnostics and delayed/concurrent exact ACK matching: USB control priority, correlated ACK and compact board readback now have production-worker fakePort coverage. Full donor750ms strip-specific deadline, delayed/concurrent request matrix and OS acquisition/close/reset ownership still require dedicated adaptation and acceptance. | PulseDTR cancellation/restoration/write exclusion and live physical port acquisition/late-close tests: This pass intentionally adds no automatic reset and keeps AVR/ISP/audio deferred. Inactive DTR on Rust open is source configuration, not measured electrical behavior; OS acquisition/cancellation/retryable-close ownership still needs dedicated fake-handle and real-host acceptance.","desktop/src/connection.rs:129 [UTF8-LF sha256=b87a15893bb66b66dbfa84ff9ffb611a40532dc679991397651267045e14e9b0; anchor=fn handoff_waits_for_all_actual_old_resources_and_rejects_stale_epoch()] | desktop/src/connection.rs:117 [UTF8-LF sha256=b87a15893bb66b66dbfa84ff9ffb611a40532dc679991397651267045e14e9b0; anchor=fn usb_offline_never_admits_network_and_disconnect_revokes_everything()] | desktop/src/main.rs:6230 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=fn usb_selected_http_worker_never_contacts_even_a_live_network_endpoint()] | desktop/src/usb_table.rs:842 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn actual_usb_worker_preempts_large_preview_and_confirms_compact_board_readback()] | desktop/src/usb_table.rs:735 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn compact_usb_readback_validates_all_values_without_renewing_full_observations()]","User-required exclusive Wi-Fi-or-USB lifecycle replaces Both rather than silently falling back; physical resources retire before the new method opens. Source evidence only until guarded tests and runtime observations.","Run guarded native tests and verify selected USB causes no HTTP/DNS/SSDP/telemetry or second physical connection; validate bounded route retirement, dirty-draft protection and retired outcomes in actual runtime. Do not infer whole donor parity or electrical acceptance from Gate tests.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/link/rf_clock_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","2eb584d3405d30d37e876e18c7f0e2554198157e168625a758cfb88da290a91f","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/link/rf_clock.go","b0111ae0c80dc34149ea1044de7dd5488920301b","614433093e13389a122e5de000fc4b817f9ae666948a89cfbb3a241bd4e06e65","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/link/serial_close_windows_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","62a8c35bb1c111fb27c83ae51349827505c94f380d8a5866a71dd70ed08e5f30","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/internal/link/session_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","ff6c7b21f72bfb944d232c87210f8ffa139dfe016e8b5756f2582604489fffc4","peer-binding","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10","parity-gap","complete","tests/protocol_test.cpp:62 [UTF8-LF sha256=92cd55f433424863ff59ba08b048c873c205af3133dba1bf1c9aacf5034135af; anchor=Adapt donor matching-identity/request assertions] | desktop/src/terminal_ui.rs:1412 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn server_reboot_between_preflight_and_post_stops_without_replay()] | desktop/src/peer_http.rs:1561 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_settings_pin_every_nested_request_and_verify_same_boot()] | desktop/src/usb_table.rs:101 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=pub struct Operation]","Actual fakePort matching/mismatched request and identity scenarios read fully and adapted to C++ peer validation and native same-host reboot/pinned-header/409 no-replay HTTP fixtures. | Old receipts stay in Events, not new peer's confirmed output. | Full session_test.go reread through EOF and live hash reverified. Admission revocation, peer mismatch and no-replay assertions adapted to actual native GUI HTTP loopback fixtures, not claims of importing Go fakePort acquisition/reset/ACK routing. | Reread complete donor at unchanged live hash; mismatch/admission assertions now also execute real WebAccess middleware and AsyncHttpService with SDK/transport/auth doubles. Retired queued probe never reaches the simulated hardware call or replays. This does not validate Basic-auth parsing, physical ISP or downstream AVR epoch. | Reread current canonical Session, fakePort and request_admission_test.go. Adapt actual control-over-background admission between unsent USB snapshot chunks, without overtaking an in-flight request or post-ACK verification. The production Rust worker now validates matching sequence/opcode ACK plus compact same-boot board-observed state, rather than delaying confirmation for all480 RGB pixels, mappings and icon metadata. Full captures still own capability/peripheral freshness and actual RGB; partial readback does not renew those observations. Missing companion uses read-only full verification, never mutation replay. Production-worker fragmented-port and wrong-boot/scalar/state fixtures cover this scoped adaptation, not all donor reset/open/750ms strip contracts.","serialOpenWithPending/late acquisition/configuration cancellation/close retry, preclose ordering and terminal error ownership; corresponding fakePort tests [pending] | priority requestAdmission, sequence/opcode-matched ACK/Error/events, reserved macro sequence, boot HELLO retry and recoverable decoder overflow tests [pending] | compact HELLO schemas/build stamp and DTR reset/inactive control-line tests [pending]","serialOpenWithPending/late acquisition/configuration cancellation/close retry, preclose ordering and terminal error ownership; corresponding fakePort tests: Useful serial lifecycle/quarantine has no equivalent in HTTP-only TUI. Adapt with actual Rust USB owner before discovery/reconnect; never close another client's port. | priority requestAdmission, sequence/opcode-matched ACK/Error/events, reserved macro sequence, boot HELLO retry and recoverable decoder overflow tests: HTTP fencing is not downstream AVR ACK/decoder ownership. These production behaviors and exact tests remain pending with USB/UART host integration. | compact HELLO schemas/build stamp and DTR reset/inactive control-line tests: Build stamp is not board/boot identity; numbered public generation negotiation conflicts with living API. Adapt additive identity and explicit one-shot reset policy with serial owner, without schema selectors/reset-on-connect.","desktop/src/terminal_ui.rs:1484 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn shared_cli_mutation_inherits_pinned_epoch_headers()] | tests/peer_fence_test.mjs:23 [UTF8-LF sha256=09291cb48a20e945aef09f5176eb9089db1bf7440fc45deb73daf9e832a456c4; anchor=Upload callbacks precede middleware] | desktop/src/peer_http.rs:1590 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_preflight_reboot_or_capability_loss_never_dispatches_mutation()] | desktop/src/peer_http.rs:1623 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_readback_from_new_boot_is_not_applied()] | desktop/src/peer_http.rs:1682 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_unfenced_mutation_fails_before_network_and_preserves_correlation()] | desktop/src/peer_http.rs:1607 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_server_boot_conflict_is_not_replayed()] | tests/web_access_fence_test.cpp:121 [UTF8-LF sha256=a6d3b4d5a9fd3703c6265d093acaa21bd2cb17a30cda92ba9b4e18848e322a72; anchor=Real async queue + real fence recheck] | desktop/src/usb_table.rs:842 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn actual_usb_worker_preempts_large_preview_and_confirms_compact_board_readback()] | desktop/src/usb_table.rs:735 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn compact_usb_readback_validates_all_values_without_renewing_full_observations()]","","GUI HTTP and Web pin adoption implemented as bounded slices; native WebSocket/USB/mobile/standalone CLI/cloud fencing, remembered pairing and AVR-only boot identity remain pending; ESP32-S3 application not integrated. | Port remaining useful serial lifecycle/priority/ACK/reset tests; fixtures/source/compile are not physical acceptance.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/internal/link/session.go","b0111ae0c80dc34149ea1044de7dd5488920301b","1311fdcde94b2ef8ed06db63ff874a255c135dc1969709e6f43ff4b5c5c8235b","usb-otg | bluetooth | connection-resilience | peer-binding","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10 | https://github.com/atomicdeploy/PakarController/issues/20","parity-gap","complete","desktop/src/terminal_ui.rs:806 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn command_request(] | mobile/lib/api.dart:2090 [UTF8-LF sha256=bbb407cc65ccd54e10d7a21328d07831ce5fa3eff70eebe99a6a10b3815257e8; anchor=bool _acceptIdentity(] | mobile/lib/main.dart:218 [UTF8-LF sha256=814e5944b0f27d21f2005ff4bfa8e391dc5721435e25f9c40ccf2c934090a7db; anchor=api.onPeerChanged = ()] | mobile/lib/bridge.dart:373 [UTF8-LF sha256=6b7fe15e223d7a110972adc698dc66e739f956f596ed265894445f333676df98; anchor=watchdog = Timer.periodic] | libraries/BoardCore/src/PeerFence.h:31 [UTF8-LF sha256=9f1ab63252bd881d2fc786e230a18db331e66708a1bd3ccd0f096d2d2b5d49d5; anchor=inline bool accepts(] | firmware/esp/src/WebAccess.h:92 [UTF8-LF sha256=774b524f4cd81c003e4139d0bb6cf3353d987674bbfb49d7a1b989ee2a232294; anchor=bool peerAllowed(] | firmware/esp/application.ino:2077 [UTF8-LF sha256=a607abb53d7834663853f2adb45286361d9d5b1cf82edb0d18ee11c9d9a74c41; anchor=bool authenticate()] | assets/web/peer-http.js:90 [UTF8-LF sha256=9613bb23bfa007afcde525d49a193b25b93788b0f24e6a0374ce4f49560f8f9e; anchor=function assertOwner(peer)] | desktop/src/peer_http.rs:590 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=pub fn admit(] | desktop/src/main.rs:845 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=fn scoped_http_request(] | desktop/src/usb_table.rs:571 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=pub struct Admission] | mobile/lib/command_readback.dart:14 [UTF8-LF sha256=c920c79353178bfb46aaed6e80a467951b9131f7f3cab0653d970f6408d8703c; anchor=bool commandReadbackMatches(] | desktop/src/cell_batch.rs:15 [UTF8-LF sha256=e1c9e090e67ac7d1da3487a8219067d0a4bc9fd471a13d6a24f7a9462bead947; anchor=pub struct Correlation] | desktop/src/realtime.rs:8 [UTF8-LF sha256=134977c4f18998b92ebb2e8d763147a1c0eeb2039c019a603cb7de712502fa01; anchor=pub struct Intent] | mobile/lib/command_wire.dart:49 [UTF8-LF sha256=5b60bf4d43874d5ef071dbc118cbbc581c2c59d1af8491116aba56570298a3cb; anchor=String commandPacket(] | libraries/BoardCore/src/CommandReceipts.h:8 [UTF8-LF sha256=061d79642fdeb1e07f528a63438ba466c3784fc96aef7ff9ca881508675dd2dc; anchor=class CommandReceipts] | mobile/lib/table_workspace.dart:13 [UTF8-LF sha256=02445683146ff2b3bdca50bfa8d1aa1dedb94261c361613fdb545e7ca4f7c83e; anchor=class TableWorkspace] | libraries/BoardCore/src/BleWire.h:31 [UTF8-LF sha256=e6b8a769227fed14658e25d2f21be2773e2607902abd79cf91cd03eda22c7230; anchor=class Receiver] | firmware/esp32s3/src/BleService.h:71 [UTF8-LF sha256=7274cd7a20d0a67ca68e924b2792778d9a86ece8ce837a0a1fa518d744a67b94; anchor=class BleService] | firmware/esp32s3/src/BleStorage.h:21 [UTF8-LF sha256=1b0b11d0d1f7f398699629ccdbd32d11e3308aef5f738f5963fcfd1d176d81e8; anchor=class BleBulkOwner] | firmware/esp/src/BleRoutes.h:219 [UTF8-LF sha256=b89a7a050b6f1f4121d8de0809dfce67cca404170e40a252cce66e95e5aa7b5d; anchor=String bleRequest(] | services/remote-panel/gateway.mjs:12 [UTF8-LF sha256=6092a0b79c3277ef171d25e4228b42831eb06990689b84f40101b9b898ac872a; anchor=export class Gateway] | services/remote-panel/service.mjs:13 [UTF8-LF sha256=724a7a0167e09af540c7dc6329bd2cc7ae5ed7ce496dfeaa3297a1b6d06a3737; anchor=export function createPanel] | desktop/src/peer_identity.rs:359 [UTF8-LF sha256=18eb925ae24b4f69e08205c33f12a798d73020313fcf4311d51a9118042f0979; anchor=pub fn usb_introduction_error(]","Lamp-background checkpoint reread all 916 canonical donor lines plus native HTTP admission/producer-envelope checks, selected serial lease and batch ACK correlation. Flutter peer-retirement/command admission/readback and lifecycle proof inspected after compact-footer change. New app-local CellBackgrounds command never enters board request queue or replay path. Only inspected consumers rebound; no new hardware/transport acceptance. | Actual Session.Request closing/context checks before and after admission adapted to TUI atomic stop checks before/after fresh preflight; no post-dispatch replay. | Full source read. Fail-closed identity checks strengthened with HTTP server-side board/boot fences; donor HELLO/build stamp is NOT a boot epoch. | Before/after admission ownership checks also adapted to Web's shared pinned HTTP preflight and post-response generation validation. Existing session.go full review/live 1bf4d52 hash remains unchanged; this is not import of Go serial acquisition or request-priority scheduling. | Full session.go reread through EOF and live source hash reverified. Actual acquireWrite/requestAdmission before/after admission closing checks adapted to native HTTP queued generation, deadline and post-preflight ownership checks. Shared native/TUI strict Pin validation removes the duplicate validator; pinned clients refuse redirects. | Reread complete donor at unchanged live hash for firmware admission/dispatch ownership. Supplied HTTP headers are checked for all methods including hardware-affecting GET probe; actual loop dispatch rechecks the same request before SPI/reset. Header-free compatibility is deliberately unfenced, not ownership proof. | Fully reread current session.go and session_test.go for Android networking. Adapted actual SetBeforeClose/notifyBeforeClose synchronous retirement into mobile HTTP/WebSocket board/boot acceptance, root state revocation and discarded prior firmware owners. Learned critical identity cannot silently disappear into legacy readiness. A one-second bridge watchdog is independent from the chosen telemetry interval, and retired MQTT callbacks cannot publish through a replacement client. | Canonical b0111ae0 session.go916lines fully reread through EOF; old1bf4d52 review remains historical. Existing bounded HTTP/mobile ownership targets do not imply current whole serial-session parity. Frozen native transport targets were separately reviewed: selected-method epoch Gate/Stamp/Lease, before-write lease checks, actual USB handle drop before handoff, HTTP/WS lease retention, no idle HTTP connection pool, no Both fallback and stale-event retirement. | Matched opcode/sequence admission and no-replay principles now also govern actual USB table commands. UI-captured connection stamp, physical-open session, board/boot pin and enqueue time survive the queue unchanged; admission is checked before queueing and before writing. Frozen snapshot chunks validate nonce/token/offset/size, retain capture-start freshness, and a new same-peer capture after ACK verifies requested values. This is a scoped Rust adaptation, not all donor priority/reset/AVR contracts. | Mobile explicit Disconnect retires polling, retries and old live callbacks. Cell/output/mode/effect/brightness mutations require fresh preflight and post-ACK readback; failed confirmation stops bulk without optimistic success. Android direct USB is not implemented or offered as a working connection. | Actual last-published 480-pixel RGB now travels in the same bounded frozen USB capture through the existing Frame parser, with capture-start freshness, matching mapping and current-peer admission. USB readback also synchronizes observed effect; there is no Wi-Fi fallback or fabricated six-pixel preview. This newer source passes197 native tests but is not yet deployed because the ASUS tunnel failed. | Stress audit fixes same-count foreign receipts: immutable local operation ID, exact selection/state/effect, Pin and route survive HTTP/USB admission/result. UI compares its own correlation; USB rejects payload/admission mismatch. Full donor priority scheduling is not claimed. | Reread the full current Session source for the live ASUS queue failure. Actual grantNextLocked highest-priority/strict-greater FIFO selection is now adapted to a bounded64-entry native HTTP waiting window: foreground commands overtake unsent status/mapping and optional configuration work, without preempting an in-flight request. Mutations retain8s expiry and revocable generation/board/boot fencing; read-only work has a separate24s bound. Atomic batches reuse the worker's fresh preflight rather than running it twice, retaining final admission, one POST, ACK and same-boot readback. This does not import USB sequence allocation, DTR/reset defaults or serial priority scheduling. | Actual Session admission/matched-ACK/no-replay principles now guard WebSocket-first native/mobile commands. One random intent ID, bounded boot-relative deadline and exact packet digest survive same-intent HTTP recovery. The loop-owned RAM receipt cache consumes before mutation and never evicts an unexpired ID. Immediate same-board state accompanies each ACK; other clients receive immediate state pushes. Older HTTP reads cannot roll newer state back. Flutter keeps both scroll controllers and a fixed result slot through pending/completed writes without renewing expired telemetry. This scoped adaptation does not import serial sequence allocation, reset defaults or all donor contracts. | Separate command authority from board-keyed Flutter user workspace state: lifecycle pauses timers, not a healthy socket; resume probes the same socket before HTTP fallback; silent sockets have independent WS freshness and bounded reconnect. Stale or foreign leases disable writes without destroying selection, search, drafts or scroll. Hidden settings no longer issue periodic network/AVR reads. No old mutation is queued or replayed. | Reread current canonical Session, fakePort and request_admission_test.go. Adapt actual control-over-background admission between unsent USB snapshot chunks, without overtaking an in-flight request or post-ACK verification. The production Rust worker now validates matching sequence/opcode ACK plus compact same-boot board-observed state, rather than delaying confirmation for all480 RGB pixels, mappings and icon metadata. Full captures still own capability/peripheral freshness and actual RGB; partial readback does not renew those observations. Missing companion uses read-only full verification, never mutation replay. Production-worker fragmented-port and wrong-boot/scalar/state fixtures cover this scoped adaptation, not all donor reset/open/750ms strip contracts. | Reread actual Session admission/ACK ownership for the ten-minute ASUS failure. Native immutable reads use a verified-token four-chunk window and one absolute8s capture/freshness deadline, not a premature2s per-fragment timeout. Mutation ACK/deadline/no-replay rules are unchanged. Capture progress is a bounded typed owner-IPC observation, not toast identity; verified same-board presentation survives read failure and wire reacquisition without renewing old hardware authority. | Bluetooth slice: fully reread canonical b0111ae0 Session source (SHA1311fdcde...), not the old ../repos copy. Adapted RequestWithPriority/acquireWrite/WithRequestWriteGuard, consumed single-inflight admission and synchronous close fencing to S3 main-loop GATT ingress and targeted replies. Existing CommandReceipts and shared business/configuration/update handlers remain authoritative; fragment ACK is not a command receipt. | Memory-pressure review retains those exact ownership/wire rules while moving all eight BLE ingress slots and the unchanged whole Receiver/Sender into one PSRAM-only BleBulkStorage lifetime allocation before BLEDevice::init. Missing storage prevents BLE startup/admission, with no scarce-DRAM fallback. Fences/disable/reconnect reset session state but never free/replace storage underneath callbacks. Internal mutexes/atomics/callback owners, INFO bytes and SDK/LED timing-critical memory remain internal; pure BleWire protocol source is unchanged. | Actual Arduino-ESP32 3.3.12 cores/esp32/esp32-hal-psram.c was read through EOF (original-byte SHA2562f47f8b635de8ffb64d160576a2705b063235fb9f54e01b98e8d2bf3f48352bd). Its explicit MALLOC_CAP_SPIRAM|MALLOC_CAP_8BIT allocation/no-internal-fallback boundary is used by the new Pakar owner. The Go donor does not implement S3 PSRAM or NimBLE allocation; this platform adaptation does not transplant or relabel serial buffers, and does not override the prebuilt SDK's internal-only NimBLE pool/host-stack settings. | Reread canonical Session source at SHA1311fdcde94b2ef8ed06db63ff874a255c135dc1969709e6f43ff4b5c5c8235b for the native mapping failure. Adapt its before/after admission and matched-response ownership principles: a current pinned mapping GET validates the response producer board/boot plus the unexpired, still-current scope, without an unrelated HTTP status preflight. Foreign or incomplete producer envelopes reject without fallback. An absent envelope is discarded before the original status -> mapping -> status legacy fences run; no stale mapping survives a changed board/boot. Six actual loopback HTTP fixtures passed via the canonical native gui_mapping filter. ASUS build12 runtime separately confirmed80 mappings with no active incidents on the selected current peer; that is not a long-soak, pixel RGB, or physical cell-order acceptance. | BLE lifecycle remains a scoped S3 SDK adaptation, not an unreviewed donor feature: missing/corrupt settings default Off; runtime enable persists intent without entering unbounded SDK initialization in the loop; disable retires late owners and honestly requires reboot to release retained SDK pools. Compile exclusion preserves loaded intent and rejects enabling unavailable hardware. Pure real-owner fixtures cover missing/corrupt records, reboot state, exclusion and request admission; no claim of SDK init timeout or BLE/TLS/OTA coexistence. | Temporary Internet panel: canonical b0111ae0 Session source reread through EOF and blob SHA1311fdcde reverified, distinct from older ../repos checkout SHAe171bf35. Adapted matched-request/ACK ownership, pre-dispatch board/boot admission and synchronous disconnect retirement to existing MQTT CloudCommandGuard. Each QoS0/non-retained mutation is sent once and requires correlated ACK plus fresh same-boot readback. Retained data grants no control lease. Real HTTP/WebSocket auth and Origin tests cover this slice, not serial/AVR/physical LED acceptance. | Canonical Session source reread fully for USB health; RemoteError/decodeRemoteError preserve actual correlated opcode and device code. Rust USB introduction now distinguishes invalid report/capacity, Busy, safety rejection and Unsupported instead of classifying all failures as release mismatch. Malformed replies remain explicit; no admission override or retry added. Actual ASUS reconnect passed on the current ESP; this change does not claim the historical rejection cause was reproduced. | Native UI checkpoint gate rereview is scoped, not a new complete-file donor review: canonical RequestWithPriority, acquireWrite, writeRawContext, SetBeforeClose and notifyBeforeClose were reread against mobile initState retirement callbacks, _command, Api.settledStatus/_acceptIdentity, TableWorkspace restoration/snapshot and changed lifecycle assertions. Prior full donor certification and original-byte hash remain unchanged. Connection ownership, synchronous peer/boot retirement, matched post-ACK readback and no mutation replay remain intact. Color labels, canonical selection, key positions and indicator placement are presentation only; pixel-only events require the presented board/boot without freshness renewal. Changed tests locate the moved display option and retain zero-write, selection and both-scroll-axis assertions. No new runtime or hardware acceptance is claimed.","serialOpenWithPending/late acquisition/configuration cancellation/close retry, preclose ordering and terminal error ownership; corresponding fakePort tests [pending] | priority requestAdmission, sequence/opcode-matched ACK/Error/events, reserved macro sequence, boot HELLO retry and recoverable decoder overflow tests [pending] | compact HELLO schemas/build stamp and DTR reset/inactive control-line tests [pending] | WithRequestWriteGuard final transport admission;750ms strip ACK/background priority and active-opcode slot diagnostics [pending] | Bluetooth transport is not Go serial acquisition or a complete firmware-file transport [pending]","serialOpenWithPending/late acquisition/configuration cancellation/close retry, preclose ordering and terminal error ownership; corresponding fakePort tests: Useful serial lifecycle/quarantine has no equivalent in HTTP-only TUI. Adapt with actual Rust USB owner before discovery/reconnect; never close another client's port. | priority requestAdmission, sequence/opcode-matched ACK/Error/events, reserved macro sequence, boot HELLO retry and recoverable decoder overflow tests: HTTP fencing is not downstream AVR ACK/decoder ownership. These production behaviors and exact tests remain pending with USB/UART host integration. | compact HELLO schemas/build stamp and DTR reset/inactive control-line tests: Build stamp is not board/boot identity; numbered public generation negotiation conflicts with living API. Adapt additive identity and explicit one-shot reset policy with serial owner, without schema selectors/reset-on-connect. | WithRequestWriteGuard final transport admission;750ms strip ACK/background priority and active-opcode slot diagnostics: Selected-method lease checks precede normal Rust serial writes, retaining the old physical-owner lease until resource drop. Native HTTP now adapts donor queued priority selection, but USB request-priority scheduling, reserved macro sequence and single-inflight opcode/sequence ACK ownership remain pending; OS-inflight bytes are non-retractable. Rust USB/PnP close/open cancellation, timing and no-network handoff still require runtime acceptance. | Bluetooth transport is not Go serial acquisition or a complete firmware-file transport: S3 has no Classic/SPP/audio hardware. UART DTR/reset/acquisition/quarantine and macro-priority mechanisms are not GATT operations; existing serial implementation is preserved, not removed. Direct BLE firmware binary transfer/raw pixel streaming, authenticated encrypted/bonded BLE, full donor serial suites and real phone/RF/coexistence/mirroring acceptance remain pending in issue #20; remote firmware jobs reuse the existing updater and require its network route.","desktop/src/terminal_ui.rs:1136 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn same_hostname_reboot_revokes_drafts_and_old_receipts()] | desktop/src/peer_identity.rs:504 [UTF8-LF sha256=18eb925ae24b4f69e08205c33f12a798d73020313fcf4311d51a9118042f0979; anchor=fn usb_introduction_error_preserves_actual_board_reason_without_suggesting_policy_bypass()] | mobile/test/bridge_discovery_test.dart:37 [UTF8-LF sha256=1e650a1f6897c67ce9e87de864ff28ed98e0a818ca95ba6b413897b5cd99a905; anchor=Same-host board/boot replacement retires firmware owners synchronously] | tests/peer_fence_test.mjs:23 [UTF8-LF sha256=09291cb48a20e945aef09f5176eb9089db1bf7440fc45deb73daf9e832a456c4; anchor=Upload callbacks precede middleware] | tests/web_peer_http_test.mjs:24 [UTF8-LF sha256=db715ef84572ee0279db89cdb3bc5700bbd6e7ebe206a8fdedf335b60d60d048; anchor=Same-host reboot between draft creation and preflight] | desktop/src/peer_http.rs:1640 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_revocation_during_preflight_stops_before_write()] | desktop/src/peer_http.rs:1660 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_revocation_after_dispatch_reports_uncertainty_not_success()] | desktop/src/main.rs:887 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=// The mapping response identifies its own producer.] | desktop/src/peer_http.rs:1442 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_enveloped_read_needs_no_http_status_preflight()] | desktop/src/peer_http.rs:1459 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_foreign_or_previous_boot_response_is_never_adopted()] | desktop/src/peer_http.rs:1481 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_incomplete_or_invalid_envelope_is_not_legacy()] | desktop/src/peer_http.rs:1504 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_revoked_inflight_result_is_not_applied()] | desktop/src/peer_http.rs:1521 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_expired_queue_does_not_contact_device()] | desktop/src/peer_http.rs:1534 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_without_envelope_retains_both_legacy_status_fences()] | tests/web_access_fence_test.cpp:121 [UTF8-LF sha256=a6d3b4d5a9fd3703c6265d093acaa21bd2cb17a30cda92ba9b4e18848e322a72; anchor=Real async queue + real fence recheck] | desktop/src/usb_table.rs:1539 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn table_write_is_exact_boot_fenced_and_post_ack_values_are_not_assumed()] | mobile/test/connection_lifecycle_test.dart:254 [UTF8-LF sha256=7c3e281d1e98ee1cf49e9116a0cc8c85a9adcc33683992d225b6258dcd94bce4; anchor=Lost post-ACK readback stops bulk without discarding a fresh workspace] | desktop/src/ui/cell_table.rs:1866 [UTF8-LF sha256=a895f275243c9079783aa7f0165bac1d21f692e84b30f8aaeed4fbcc52cf8a19; anchor=Even identical values require the exact operation ID] | desktop/src/realtime.rs:786 [UTF8-LF sha256=134977c4f18998b92ebb2e8d763147a1c0eeb2039c019a603cb7de712502fa01; anchor=fn realtime_actual_ws_worker_delivers_receipt_without_http_or_poll_tick()] | mobile/test/live_realtime_test.dart:8 [UTF8-LF sha256=6af0113cf86b6f20fc9e28405bf7fbeb26a66805b5cd12f9bdb4ba39571a00f8; anchor=Explicit opt-in, real board mutation] | mobile/test/realtime_transport_test.dart:11 [UTF8-LF sha256=ef8a5a39abe37c40e3393cdde5b3f012dbc5a7adfc2e2cd104571ca04cd5de7e; anchor=Real loopback transport] | mobile/test/table_layout_test.dart:59 [UTF8-LF sha256=254598b19cab81a963e6319ddb9acf63675d22d8d6f451211beef89da2367abd; anchor=Cell commands and incoming state preserve both scroll axes and canvas position] | tests/cloud_command_guard_test.cpp:28 [UTF8-LF sha256=2de44ca916fe1670eba11edeb706e88dfdafc4994d0a9d07301a279ef71c0581; anchor=Receipts::Conflict] | mobile/test/workspace_lifecycle_test.dart:422 [UTF8-LF sha256=537941477dab0a2460cf42aab9220a7baf8d1aecf36eb140b21179674985071e; anchor=Background/resume retains selection] | mobile/test/realtime_transport_test.dart:74 [UTF8-LF sha256=ef8a5a39abe37c40e3393cdde5b3f012dbc5a7adfc2e2cd104571ca04cd5de7e; anchor=HTTP refresh cannot impersonate] | desktop/src/usb_table.rs:842 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn actual_usb_worker_preempts_large_preview_and_confirms_compact_board_readback()] | desktop/src/usb_table.rs:735 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn compact_usb_readback_validates_all_values_without_renewing_full_observations()] | desktop/src/usb_table.rs:1411 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn actual_usb_worker_windows_read_latency_does_not_expire_large_capture] | tests/ble_wire_test.cpp:15 [UTF8-LF sha256=bf5675db9debf06160e8ef72d59e7c764bc3f88cde508cfcbb32a989f004c34e; anchor=int main()] | tests/ble_firmware_test.mjs:130 [UTF8-LF sha256=7bfd1e524abb6303f16bc0d9bf75a80ba892876d9c72548575954de34fd8a4f0; anchor=BLE firmware integration source guards] | tests/ble_storage_test.cpp:51 [UTF8-LF sha256=22f4c0e4fc0846492ddaa6c04a01e113ace607d86e9edeac1d2c69b8ee46a349; anchor=Do not retain an internal bulk-buffer fallback] | tests/ble_storage_stubs/esp_heap_caps.h:18 [UTF8-LF sha256=f6ff5f7843125cd7e780df39fd9d31006af9ef23070641ec580288235750365c; anchor=assert(capabilities==(MALLOC_CAP_SPIRAM|MALLOC_CAP_8BIT))] | services/remote-panel/gateway.test.mjs:87 [UTF8-LF sha256=2fdbab7b76e05249f07d126b9f655a4ff909a59291ec924d8eb2b6ec4f8455f6; anchor=Real HTTP mutation receives one board ACK/readback]","","HTTP/Web/mobile and selected USB table ownership are implemented bounded slices, not full serial/cloud parity. Remembered pairing, standalone CLI/cloud fencing, USB mapping edits, live acceptance of the newer USB pixel telemetry and AVR-only boot identity remain pending. Firmware and native USB table are live on ASUS; physical cell placement/color acceptance remains separate. | Port remaining useful serial lifecycle/priority/ACK/reset tests; fixtures/source/compile are not physical acceptance. | Measure S3 internal8-bit heap free/largest/minimum after explicit BLE PSRAM allocation and with real GATT/Wi-Fi/OTA activity. Verify missing-PSRAM startup leaves Wi-Fi/USB usable and no callback outlives its owner. Allocator/protocol fixtures and estimated BSS savings are not heap/radio/coexistence or physical programming acceptance.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/internal/link/session_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","ff6c7b21f72bfb944d232c87210f8ffa139dfe016e8b5756f2582604489fffc4","peer-binding","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10","parity-gap","complete","tests/protocol_test.cpp:68 [UTF8-LF sha256=4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144; anchor=Adapt donor matching-identity/request assertions] | desktop/src/terminal_ui.rs:1412 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn server_reboot_between_preflight_and_post_stops_without_replay()] | desktop/src/peer_http.rs:1561 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_settings_pin_every_nested_request_and_verify_same_boot()] | desktop/src/usb_table.rs:101 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=pub struct Operation]","Actual fakePort matching/mismatched request and identity scenarios read fully and adapted to C++ peer validation and native same-host reboot/pinned-header/409 no-replay HTTP fixtures. | Old receipts stay in Events, not new peer's confirmed output. | Full session_test.go reread through EOF and live hash reverified. Admission revocation, peer mismatch and no-replay assertions adapted to actual native GUI HTTP loopback fixtures, not claims of importing Go fakePort acquisition/reset/ACK routing. | Reread complete donor at unchanged live hash; mismatch/admission assertions now also execute real WebAccess middleware and AsyncHttpService with SDK/transport/auth doubles. Retired queued probe never reaches the simulated hardware call or replays. This does not validate Basic-auth parsing, physical ISP or downstream AVR epoch. | Reread current canonical Session, fakePort and request_admission_test.go. Adapt actual control-over-background admission between unsent USB snapshot chunks, without overtaking an in-flight request or post-ACK verification. The production Rust worker now validates matching sequence/opcode ACK plus compact same-boot board-observed state, rather than delaying confirmation for all480 RGB pixels, mappings and icon metadata. Full captures still own capability/peripheral freshness and actual RGB; partial readback does not renew those observations. Missing companion uses read-only full verification, never mutation replay. Production-worker fragmented-port and wrong-boot/scalar/state fixtures cover this scoped adaptation, not all donor reset/open/750ms strip contracts.","serialOpenWithPending/late acquisition/configuration cancellation/close retry, preclose ordering and terminal error ownership; corresponding fakePort tests [pending] | priority requestAdmission, sequence/opcode-matched ACK/Error/events, reserved macro sequence, boot HELLO retry and recoverable decoder overflow tests [pending] | compact HELLO schemas/build stamp and DTR reset/inactive control-line tests [pending]","serialOpenWithPending/late acquisition/configuration cancellation/close retry, preclose ordering and terminal error ownership; corresponding fakePort tests: Useful serial lifecycle/quarantine has no equivalent in HTTP-only TUI. Adapt with actual Rust USB owner before discovery/reconnect; never close another client's port. | priority requestAdmission, sequence/opcode-matched ACK/Error/events, reserved macro sequence, boot HELLO retry and recoverable decoder overflow tests: HTTP fencing is not downstream AVR ACK/decoder ownership. These production behaviors and exact tests remain pending with USB/UART host integration. | compact HELLO schemas/build stamp and DTR reset/inactive control-line tests: Build stamp is not board/boot identity; numbered public generation negotiation conflicts with living API. Adapt additive identity and explicit one-shot reset policy with serial owner, without schema selectors/reset-on-connect.","desktop/src/terminal_ui.rs:1484 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn shared_cli_mutation_inherits_pinned_epoch_headers()] | tests/peer_fence_test.mjs:23 [UTF8-LF sha256=09291cb48a20e945aef09f5176eb9089db1bf7440fc45deb73daf9e832a456c4; anchor=Upload callbacks precede middleware] | desktop/src/peer_http.rs:1590 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_preflight_reboot_or_capability_loss_never_dispatches_mutation()] | desktop/src/peer_http.rs:1623 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_readback_from_new_boot_is_not_applied()] | desktop/src/peer_http.rs:1682 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_unfenced_mutation_fails_before_network_and_preserves_correlation()] | desktop/src/peer_http.rs:1607 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_server_boot_conflict_is_not_replayed()] | tests/web_access_fence_test.cpp:121 [UTF8-LF sha256=a6d3b4d5a9fd3703c6265d093acaa21bd2cb17a30cda92ba9b4e18848e322a72; anchor=Real async queue + real fence recheck] | desktop/src/usb_table.rs:842 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn actual_usb_worker_preempts_large_preview_and_confirms_compact_board_readback()] | desktop/src/usb_table.rs:735 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn compact_usb_readback_validates_all_values_without_renewing_full_observations()]","","GUI HTTP and Web pin adoption implemented as bounded slices; native WebSocket/USB/mobile/standalone CLI/cloud fencing, remembered pairing and AVR-only boot identity remain pending; ESP32-S3 application not integrated. | Port remaining useful serial lifecycle/priority/ACK/reset tests; fixtures/source/compile are not physical acceptance.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/internal/link/session.go","b0111ae0c80dc34149ea1044de7dd5488920301b","1311fdcde94b2ef8ed06db63ff874a255c135dc1969709e6f43ff4b5c5c8235b","usb-otg | bluetooth | connection-resilience | peer-binding","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10 | https://github.com/atomicdeploy/PakarController/issues/20","parity-gap","complete","desktop/src/terminal_ui.rs:806 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn command_request(] | mobile/lib/api.dart:2090 [UTF8-LF sha256=bbb407cc65ccd54e10d7a21328d07831ce5fa3eff70eebe99a6a10b3815257e8; anchor=bool _acceptIdentity(] | mobile/lib/main.dart:218 [UTF8-LF sha256=814e5944b0f27d21f2005ff4bfa8e391dc5721435e25f9c40ccf2c934090a7db; anchor=api.onPeerChanged = ()] | mobile/lib/bridge.dart:373 [UTF8-LF sha256=6b7fe15e223d7a110972adc698dc66e739f956f596ed265894445f333676df98; anchor=watchdog = Timer.periodic] | libraries/BoardCore/src/PeerFence.h:31 [UTF8-LF sha256=9f1ab63252bd881d2fc786e230a18db331e66708a1bd3ccd0f096d2d2b5d49d5; anchor=inline bool accepts(] | firmware/esp/src/WebAccess.h:92 [UTF8-LF sha256=774b524f4cd81c003e4139d0bb6cf3353d987674bbfb49d7a1b989ee2a232294; anchor=bool peerAllowed(] | firmware/esp/application.ino:2077 [UTF8-LF sha256=a607abb53d7834663853f2adb45286361d9d5b1cf82edb0d18ee11c9d9a74c41; anchor=bool authenticate()] | assets/web/peer-http.js:90 [UTF8-LF sha256=9613bb23bfa007afcde525d49a193b25b93788b0f24e6a0374ce4f49560f8f9e; anchor=function assertOwner(peer)] | desktop/src/peer_http.rs:590 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=pub fn admit(] | desktop/src/main.rs:845 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=fn scoped_http_request(] | desktop/src/usb_table.rs:571 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=pub struct Admission] | mobile/lib/command_readback.dart:14 [UTF8-LF sha256=c920c79353178bfb46aaed6e80a467951b9131f7f3cab0653d970f6408d8703c; anchor=bool commandReadbackMatches(] | desktop/src/cell_batch.rs:15 [UTF8-LF sha256=e1c9e090e67ac7d1da3487a8219067d0a4bc9fd471a13d6a24f7a9462bead947; anchor=pub struct Correlation] | desktop/src/realtime.rs:8 [UTF8-LF sha256=134977c4f18998b92ebb2e8d763147a1c0eeb2039c019a603cb7de712502fa01; anchor=pub struct Intent] | mobile/lib/command_wire.dart:49 [UTF8-LF sha256=5b60bf4d43874d5ef071dbc118cbbc581c2c59d1af8491116aba56570298a3cb; anchor=String commandPacket(] | libraries/BoardCore/src/CommandReceipts.h:8 [UTF8-LF sha256=061d79642fdeb1e07f528a63438ba466c3784fc96aef7ff9ca881508675dd2dc; anchor=class CommandReceipts] | mobile/lib/table_workspace.dart:13 [UTF8-LF sha256=02445683146ff2b3bdca50bfa8d1aa1dedb94261c361613fdb545e7ca4f7c83e; anchor=class TableWorkspace] | libraries/BoardCore/src/BleWire.h:31 [UTF8-LF sha256=e6b8a769227fed14658e25d2f21be2773e2607902abd79cf91cd03eda22c7230; anchor=class Receiver] | firmware/esp32s3/src/BleService.h:71 [UTF8-LF sha256=7274cd7a20d0a67ca68e924b2792778d9a86ece8ce837a0a1fa518d744a67b94; anchor=class BleService] | firmware/esp32s3/src/BleStorage.h:21 [UTF8-LF sha256=1b0b11d0d1f7f398699629ccdbd32d11e3308aef5f738f5963fcfd1d176d81e8; anchor=class BleBulkOwner] | firmware/esp/src/BleRoutes.h:219 [UTF8-LF sha256=b89a7a050b6f1f4121d8de0809dfce67cca404170e40a252cce66e95e5aa7b5d; anchor=String bleRequest(] | services/remote-panel/gateway.mjs:12 [UTF8-LF sha256=6092a0b79c3277ef171d25e4228b42831eb06990689b84f40101b9b898ac872a; anchor=export class Gateway] | services/remote-panel/service.mjs:13 [UTF8-LF sha256=724a7a0167e09af540c7dc6329bd2cc7ae5ed7ce496dfeaa3297a1b6d06a3737; anchor=export function createPanel] | desktop/src/peer_identity.rs:359 [UTF8-LF sha256=18eb925ae24b4f69e08205c33f12a798d73020313fcf4311d51a9118042f0979; anchor=pub fn usb_introduction_error(]","Lamp-background checkpoint reread all 916 canonical donor lines plus native HTTP admission/producer-envelope checks, selected serial lease and batch ACK correlation. Flutter peer-retirement/command admission/readback and lifecycle proof inspected after compact-footer change. New app-local CellBackgrounds command never enters board request queue or replay path. Only inspected consumers rebound; no new hardware/transport acceptance. | Actual Session.Request closing/context checks before and after admission adapted to TUI atomic stop checks before/after fresh preflight; no post-dispatch replay. | Full source read. Fail-closed identity checks strengthened with HTTP server-side board/boot fences; donor HELLO/build stamp is NOT a boot epoch. | Before/after admission ownership checks also adapted to Web's shared pinned HTTP preflight and post-response generation validation. Existing session.go full review/live 1bf4d52 hash remains unchanged; this is not import of Go serial acquisition or request-priority scheduling. | Full session.go reread through EOF and live source hash reverified. Actual acquireWrite/requestAdmission before/after admission closing checks adapted to native HTTP queued generation, deadline and post-preflight ownership checks. Shared native/TUI strict Pin validation removes the duplicate validator; pinned clients refuse redirects. | Reread complete donor at unchanged live hash for firmware admission/dispatch ownership. Supplied HTTP headers are checked for all methods including hardware-affecting GET probe; actual loop dispatch rechecks the same request before SPI/reset. Header-free compatibility is deliberately unfenced, not ownership proof. | Fully reread current session.go and session_test.go for Android networking. Adapted actual SetBeforeClose/notifyBeforeClose synchronous retirement into mobile HTTP/WebSocket board/boot acceptance, root state revocation and discarded prior firmware owners. Learned critical identity cannot silently disappear into legacy readiness. A one-second bridge watchdog is independent from the chosen telemetry interval, and retired MQTT callbacks cannot publish through a replacement client. | Canonical b0111ae0 session.go916lines fully reread through EOF; old1bf4d52 review remains historical. Existing bounded HTTP/mobile ownership targets do not imply current whole serial-session parity. Frozen native transport targets were separately reviewed: selected-method epoch Gate/Stamp/Lease, before-write lease checks, actual USB handle drop before handoff, HTTP/WS lease retention, no idle HTTP connection pool, no Both fallback and stale-event retirement. | Matched opcode/sequence admission and no-replay principles now also govern actual USB table commands. UI-captured connection stamp, physical-open session, board/boot pin and enqueue time survive the queue unchanged; admission is checked before queueing and before writing. Frozen snapshot chunks validate nonce/token/offset/size, retain capture-start freshness, and a new same-peer capture after ACK verifies requested values. This is a scoped Rust adaptation, not all donor priority/reset/AVR contracts. | Mobile explicit Disconnect retires polling, retries and old live callbacks. Cell/output/mode/effect/brightness mutations require fresh preflight and post-ACK readback; failed confirmation stops bulk without optimistic success. Android direct USB is not implemented or offered as a working connection. | Actual last-published 480-pixel RGB now travels in the same bounded frozen USB capture through the existing Frame parser, with capture-start freshness, matching mapping and current-peer admission. USB readback also synchronizes observed effect; there is no Wi-Fi fallback or fabricated six-pixel preview. This newer source passes197 native tests but is not yet deployed because the ASUS tunnel failed. | Stress audit fixes same-count foreign receipts: immutable local operation ID, exact selection/state/effect, Pin and route survive HTTP/USB admission/result. UI compares its own correlation; USB rejects payload/admission mismatch. Full donor priority scheduling is not claimed. | Reread the full current Session source for the live ASUS queue failure. Actual grantNextLocked highest-priority/strict-greater FIFO selection is now adapted to a bounded64-entry native HTTP waiting window: foreground commands overtake unsent status/mapping and optional configuration work, without preempting an in-flight request. Mutations retain8s expiry and revocable generation/board/boot fencing; read-only work has a separate24s bound. Atomic batches reuse the worker's fresh preflight rather than running it twice, retaining final admission, one POST, ACK and same-boot readback. This does not import USB sequence allocation, DTR/reset defaults or serial priority scheduling. | Actual Session admission/matched-ACK/no-replay principles now guard WebSocket-first native/mobile commands. One random intent ID, bounded boot-relative deadline and exact packet digest survive same-intent HTTP recovery. The loop-owned RAM receipt cache consumes before mutation and never evicts an unexpired ID. Immediate same-board state accompanies each ACK; other clients receive immediate state pushes. Older HTTP reads cannot roll newer state back. Flutter keeps both scroll controllers and a fixed result slot through pending/completed writes without renewing expired telemetry. This scoped adaptation does not import serial sequence allocation, reset defaults or all donor contracts. | Separate command authority from board-keyed Flutter user workspace state: lifecycle pauses timers, not a healthy socket; resume probes the same socket before HTTP fallback; silent sockets have independent WS freshness and bounded reconnect. Stale or foreign leases disable writes without destroying selection, search, drafts or scroll. Hidden settings no longer issue periodic network/AVR reads. No old mutation is queued or replayed. | Reread current canonical Session, fakePort and request_admission_test.go. Adapt actual control-over-background admission between unsent USB snapshot chunks, without overtaking an in-flight request or post-ACK verification. The production Rust worker now validates matching sequence/opcode ACK plus compact same-boot board-observed state, rather than delaying confirmation for all480 RGB pixels, mappings and icon metadata. Full captures still own capability/peripheral freshness and actual RGB; partial readback does not renew those observations. Missing companion uses read-only full verification, never mutation replay. Production-worker fragmented-port and wrong-boot/scalar/state fixtures cover this scoped adaptation, not all donor reset/open/750ms strip contracts. | Reread actual Session admission/ACK ownership for the ten-minute ASUS failure. Native immutable reads use a verified-token four-chunk window and one absolute8s capture/freshness deadline, not a premature2s per-fragment timeout. Mutation ACK/deadline/no-replay rules are unchanged. Capture progress is a bounded typed owner-IPC observation, not toast identity; verified same-board presentation survives read failure and wire reacquisition without renewing old hardware authority. | Bluetooth slice: fully reread canonical b0111ae0 Session source (SHA1311fdcde...), not the old ../repos copy. Adapted RequestWithPriority/acquireWrite/WithRequestWriteGuard, consumed single-inflight admission and synchronous close fencing to S3 main-loop GATT ingress and targeted replies. Existing CommandReceipts and shared business/configuration/update handlers remain authoritative; fragment ACK is not a command receipt. | Memory-pressure review retains those exact ownership/wire rules while moving all eight BLE ingress slots and the unchanged whole Receiver/Sender into one PSRAM-only BleBulkStorage lifetime allocation before BLEDevice::init. Missing storage prevents BLE startup/admission, with no scarce-DRAM fallback. Fences/disable/reconnect reset session state but never free/replace storage underneath callbacks. Internal mutexes/atomics/callback owners, INFO bytes and SDK/LED timing-critical memory remain internal; pure BleWire protocol source is unchanged. | Actual Arduino-ESP32 3.3.12 cores/esp32/esp32-hal-psram.c was read through EOF (original-byte SHA2562f47f8b635de8ffb64d160576a2705b063235fb9f54e01b98e8d2bf3f48352bd). Its explicit MALLOC_CAP_SPIRAM|MALLOC_CAP_8BIT allocation/no-internal-fallback boundary is used by the new Pakar owner. The Go donor does not implement S3 PSRAM or NimBLE allocation; this platform adaptation does not transplant or relabel serial buffers, and does not override the prebuilt SDK's internal-only NimBLE pool/host-stack settings. | Reread canonical Session source at SHA1311fdcde94b2ef8ed06db63ff874a255c135dc1969709e6f43ff4b5c5c8235b for the native mapping failure. Adapt its before/after admission and matched-response ownership principles: a current pinned mapping GET validates the response producer board/boot plus the unexpired, still-current scope, without an unrelated HTTP status preflight. Foreign or incomplete producer envelopes reject without fallback. An absent envelope is discarded before the original status -> mapping -> status legacy fences run; no stale mapping survives a changed board/boot. Six actual loopback HTTP fixtures passed via the canonical native gui_mapping filter. ASUS build12 runtime separately confirmed80 mappings with no active incidents on the selected current peer; that is not a long-soak, pixel RGB, or physical cell-order acceptance. | BLE lifecycle remains a scoped S3 SDK adaptation, not an unreviewed donor feature: missing/corrupt settings default Off; runtime enable persists intent without entering unbounded SDK initialization in the loop; disable retires late owners and honestly requires reboot to release retained SDK pools. Compile exclusion preserves loaded intent and rejects enabling unavailable hardware. Pure real-owner fixtures cover missing/corrupt records, reboot state, exclusion and request admission; no claim of SDK init timeout or BLE/TLS/OTA coexistence. | Temporary Internet panel: canonical b0111ae0 Session source reread through EOF and blob SHA1311fdcde reverified, distinct from older ../repos checkout SHAe171bf35. Adapted matched-request/ACK ownership, pre-dispatch board/boot admission and synchronous disconnect retirement to existing MQTT CloudCommandGuard. Each QoS0/non-retained mutation is sent once and requires correlated ACK plus fresh same-boot readback. Retained data grants no control lease. Real HTTP/WebSocket auth and Origin tests cover this slice, not serial/AVR/physical LED acceptance. | Canonical Session source reread fully for USB health; RemoteError/decodeRemoteError preserve actual correlated opcode and device code. Rust USB introduction now distinguishes invalid report/capacity, Busy, safety rejection and Unsupported instead of classifying all failures as release mismatch. Malformed replies remain explicit; no admission override or retry added. Actual ASUS reconnect passed on the current ESP; this change does not claim the historical rejection cause was reproduced. | Native UI checkpoint gate rereview is scoped, not a new complete-file donor review: canonical RequestWithPriority, acquireWrite, writeRawContext, SetBeforeClose and notifyBeforeClose were reread against mobile initState retirement callbacks, _command, Api.settledStatus/_acceptIdentity, TableWorkspace restoration/snapshot and changed lifecycle assertions. Prior full donor certification and original-byte hash remain unchanged. Connection ownership, synchronous peer/boot retirement, matched post-ACK readback and no mutation replay remain intact. Color labels, canonical selection, key positions and indicator placement are presentation only; pixel-only events require the presented board/boot without freshness renewal. Changed tests locate the moved display option and retain zero-write, selection and both-scroll-axis assertions. No new runtime or hardware acceptance is claimed.","serialOpenWithPending/late acquisition/configuration cancellation/close retry, preclose ordering and terminal error ownership; corresponding fakePort tests [pending] | priority requestAdmission, sequence/opcode-matched ACK/Error/events, reserved macro sequence, boot HELLO retry and recoverable decoder overflow tests [pending] | compact HELLO schemas/build stamp and DTR reset/inactive control-line tests [pending] | WithRequestWriteGuard final transport admission;750ms strip ACK/background priority and active-opcode slot diagnostics [pending] | Bluetooth transport is not Go serial acquisition or a complete firmware-file transport [pending]","serialOpenWithPending/late acquisition/configuration cancellation/close retry, preclose ordering and terminal error ownership; corresponding fakePort tests: Useful serial lifecycle/quarantine has no equivalent in HTTP-only TUI. Adapt with actual Rust USB owner before discovery/reconnect; never close another client's port. | priority requestAdmission, sequence/opcode-matched ACK/Error/events, reserved macro sequence, boot HELLO retry and recoverable decoder overflow tests: HTTP fencing is not downstream AVR ACK/decoder ownership. These production behaviors and exact tests remain pending with USB/UART host integration. | compact HELLO schemas/build stamp and DTR reset/inactive control-line tests: Build stamp is not board/boot identity; numbered public generation negotiation conflicts with living API. Adapt additive identity and explicit one-shot reset policy with serial owner, without schema selectors/reset-on-connect. | WithRequestWriteGuard final transport admission;750ms strip ACK/background priority and active-opcode slot diagnostics: Selected-method lease checks precede normal Rust serial writes, retaining the old physical-owner lease until resource drop. Native HTTP now adapts donor queued priority selection, but USB request-priority scheduling, reserved macro sequence and single-inflight opcode/sequence ACK ownership remain pending; OS-inflight bytes are non-retractable. Rust USB/PnP close/open cancellation, timing and no-network handoff still require runtime acceptance. | Bluetooth transport is not Go serial acquisition or a complete firmware-file transport: S3 has no Classic/SPP/audio hardware. UART DTR/reset/acquisition/quarantine and macro-priority mechanisms are not GATT operations; existing serial implementation is preserved, not removed. Direct BLE firmware binary transfer/raw pixel streaming, authenticated encrypted/bonded BLE, full donor serial suites and real phone/RF/coexistence/mirroring acceptance remain pending in issue #20; remote firmware jobs reuse the existing updater and require its network route.","desktop/src/terminal_ui.rs:1136 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn same_hostname_reboot_revokes_drafts_and_old_receipts()] | desktop/src/peer_identity.rs:504 [UTF8-LF sha256=18eb925ae24b4f69e08205c33f12a798d73020313fcf4311d51a9118042f0979; anchor=fn usb_introduction_error_preserves_actual_board_reason_without_suggesting_policy_bypass()] | mobile/test/bridge_discovery_test.dart:37 [UTF8-LF sha256=1e650a1f6897c67ce9e87de864ff28ed98e0a818ca95ba6b413897b5cd99a905; anchor=Same-host board/boot replacement retires firmware owners synchronously] | tests/peer_fence_test.mjs:23 [UTF8-LF sha256=09291cb48a20e945aef09f5176eb9089db1bf7440fc45deb73daf9e832a456c4; anchor=Upload callbacks precede middleware] | tests/web_peer_http_test.mjs:24 [UTF8-LF sha256=db715ef84572ee0279db89cdb3bc5700bbd6e7ebe206a8fdedf335b60d60d048; anchor=Same-host reboot between draft creation and preflight] | desktop/src/peer_http.rs:1640 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_revocation_during_preflight_stops_before_write()] | desktop/src/peer_http.rs:1660 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_revocation_after_dispatch_reports_uncertainty_not_success()] | desktop/src/main.rs:887 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=// The mapping response identifies its own producer.] | desktop/src/peer_http.rs:1442 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_enveloped_read_needs_no_http_status_preflight()] | desktop/src/peer_http.rs:1459 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_foreign_or_previous_boot_response_is_never_adopted()] | desktop/src/peer_http.rs:1481 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_incomplete_or_invalid_envelope_is_not_legacy()] | desktop/src/peer_http.rs:1504 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_revoked_inflight_result_is_not_applied()] | desktop/src/peer_http.rs:1521 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_expired_queue_does_not_contact_device()] | desktop/src/peer_http.rs:1534 [UTF8-LF sha256=4e824caea5ef7bea0b2fc81af1ba1571bb7f3374582c3d641223cf0ce20cae50; anchor=fn gui_mapping_without_envelope_retains_both_legacy_status_fences()] | tests/web_access_fence_test.cpp:121 [UTF8-LF sha256=a6d3b4d5a9fd3703c6265d093acaa21bd2cb17a30cda92ba9b4e18848e322a72; anchor=Real async queue + real fence recheck] | desktop/src/usb_table.rs:1539 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn table_write_is_exact_boot_fenced_and_post_ack_values_are_not_assumed()] | mobile/test/connection_lifecycle_test.dart:254 [UTF8-LF sha256=7c3e281d1e98ee1cf49e9116a0cc8c85a9adcc33683992d225b6258dcd94bce4; anchor=Lost post-ACK readback stops bulk without discarding a fresh workspace] | desktop/src/ui/cell_table.rs:1866 [UTF8-LF sha256=a895f275243c9079783aa7f0165bac1d21f692e84b30f8aaeed4fbcc52cf8a19; anchor=Even identical values require the exact operation ID] | desktop/src/realtime.rs:786 [UTF8-LF sha256=134977c4f18998b92ebb2e8d763147a1c0eeb2039c019a603cb7de712502fa01; anchor=fn realtime_actual_ws_worker_delivers_receipt_without_http_or_poll_tick()] | mobile/test/live_realtime_test.dart:8 [UTF8-LF sha256=6af0113cf86b6f20fc9e28405bf7fbeb26a66805b5cd12f9bdb4ba39571a00f8; anchor=Explicit opt-in, real board mutation] | mobile/test/realtime_transport_test.dart:11 [UTF8-LF sha256=ef8a5a39abe37c40e3393cdde5b3f012dbc5a7adfc2e2cd104571ca04cd5de7e; anchor=Real loopback transport] | mobile/test/table_layout_test.dart:59 [UTF8-LF sha256=254598b19cab81a963e6319ddb9acf63675d22d8d6f451211beef89da2367abd; anchor=Cell commands and incoming state preserve both scroll axes and canvas position] | tests/cloud_command_guard_test.cpp:28 [UTF8-LF sha256=2de44ca916fe1670eba11edeb706e88dfdafc4994d0a9d07301a279ef71c0581; anchor=Receipts::Conflict] | mobile/test/workspace_lifecycle_test.dart:422 [UTF8-LF sha256=537941477dab0a2460cf42aab9220a7baf8d1aecf36eb140b21179674985071e; anchor=Background/resume retains selection] | mobile/test/realtime_transport_test.dart:74 [UTF8-LF sha256=ef8a5a39abe37c40e3393cdde5b3f012dbc5a7adfc2e2cd104571ca04cd5de7e; anchor=HTTP refresh cannot impersonate] | desktop/src/usb_table.rs:842 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn actual_usb_worker_preempts_large_preview_and_confirms_compact_board_readback()] | desktop/src/usb_table.rs:735 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn compact_usb_readback_validates_all_values_without_renewing_full_observations()] | desktop/src/usb_table.rs:1411 [UTF8-LF sha256=13c191e37a4a881d96fb668c0ccb99fa2f168955e6abb78bb37940a629434042; anchor=fn actual_usb_worker_windows_read_latency_does_not_expire_large_capture] | tests/ble_wire_test.cpp:15 [UTF8-LF sha256=bf5675db9debf06160e8ef72d59e7c764bc3f88cde508cfcbb32a989f004c34e; anchor=int main()] | tests/ble_firmware_test.mjs:130 [UTF8-LF sha256=7bfd1e524abb6303f16bc0d9bf75a80ba892876d9c72548575954de34fd8a4f0; anchor=BLE firmware integration source guards] | tests/ble_storage_test.cpp:51 [UTF8-LF sha256=22f4c0e4fc0846492ddaa6c04a01e113ace607d86e9edeac1d2c69b8ee46a349; anchor=Do not retain an internal bulk-buffer fallback] | tests/ble_storage_stubs/esp_heap_caps.h:18 [UTF8-LF sha256=f6ff5f7843125cd7e780df39fd9d31006af9ef23070641ec580288235750365c; anchor=assert(capabilities==(MALLOC_CAP_SPIRAM|MALLOC_CAP_8BIT))] | services/remote-panel/gateway.test.mjs:87 [UTF8-LF sha256=2fdbab7b76e05249f07d126b9f655a4ff909a59291ec924d8eb2b6ec4f8455f6; anchor=Real HTTP mutation receives one board ACK/readback]","","HTTP/Web/mobile and selected USB table ownership are implemented bounded slices, not full serial/cloud parity. Remembered pairing, standalone CLI/cloud fencing, USB mapping edits, live acceptance of the newer USB pixel telemetry and AVR-only boot identity remain pending. Firmware and native USB table are live on ASUS; physical cell placement/color acceptance remains separate. | Port remaining useful serial lifecycle/priority/ACK/reset tests; fixtures/source/compile are not physical acceptance. | Measure S3 internal8-bit heap free/largest/minimum after explicit BLE PSRAM allocation and with real GATT/Wi-Fi/OTA activity. Verify missing-PSRAM startup leaves Wi-Fi/USB usable and no callback outlives its owner. Allocator/protocol fixtures and estimated BSS savings are not heap/radio/coexistence or physical programming acceptance.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/link/tcp_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","11034d7cfc3b986c1c049780f511a01078745529e71c021f2af2b5ad492b63de","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/localdevice/client_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","fc80471b4d729864cf128aa83594847377724aad9b682baa5f957a4818aa0957","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/localdevice/client.go","b0111ae0c80dc34149ea1044de7dd5488920301b","fd9011efc91c7cf8f9ec27d0e5ef125ca0dc74613673a0df9ff34974004ebe15","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -1058,11 +1058,11 @@ "PCController","Tools/Controller/internal/managedbrowser/protocol.go","b0111ae0c80dc34149ea1044de7dd5488920301b","1a99834ebc0c38cc36415bb0e04f4d3d9c57629b3c2cdecd37a23b2776ae7109","firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/native/automation_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","cb04db4011b9c1db6fc7819b9c5a0fbf684a95bf1e98d6093034602a4f1f005a","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/native/automation.go","b0111ae0c80dc34149ea1044de7dd5488920301b","abc318d9ed4d11eea61826ca80a86613fb616d2c4bfd6c311c487006225de04e","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/internal/native/cobs.go","b0111ae0c80dc34149ea1044de7dd5488920301b","29d14cf9b2695ed7237fd954e996dbff1c33e844059ce689c599d4fcda933f6a","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/internal/native/cobs.go","b0111ae0c80dc34149ea1044de7dd5488920301b","29d14cf9b2695ed7237fd954e996dbff1c33e844059ce689c599d4fcda933f6a","transport-convergence","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/41","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/native/commands.go","b0111ae0c80dc34149ea1044de7dd5488920301b","0d01cdd343012334479c164a5787959513f2581992269f5b27376dd3d19729b7","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. legacy-unverified is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/native/decoder.go","b0111ae0c80dc34149ea1044de7dd5488920301b","9b07a624715414b5f5c8a0555c7882eb00651f472ab3d97e0085c539ddcd8e7e","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/native/frame_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","1f114d2bafe028a7d1986ecd7a5251fc7968d701ff4e68832cc26c8d67e547dc","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/internal/native/frame.go","b0111ae0c80dc34149ea1044de7dd5488920301b","52961b3c114d9fcdcc862991388c914447c84088983ac4d3dad658671ef15d9a","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/internal/native/frame.go","b0111ae0c80dc34149ea1044de7dd5488920301b","52961b3c114d9fcdcc862991388c914447c84088983ac4d3dad658671ef15d9a","transport-convergence","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/41","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/native/host_menu_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","8d8dd620f5d9f912ba6ac68cb96dabd54b9db82b1868831e9e3a2b36980cfddf","ui-shell","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/native/host_menu.go","b0111ae0c80dc34149ea1044de7dd5488920301b","d5102eb4e075170a4320ec00fc6b547817e40d7da0512772076647c40716b113","ui-shell","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/internal/native/i2c_test.go","b0111ae0c80dc34149ea1044de7dd5488920301b","5a53b5e1251d03173929458bca6fccc9bccedc6402bcbf12b2bb017ca5acf36d","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -1329,8 +1329,8 @@ "PCController","Tools/Controller/tests/board-mirroring-linux.test.mjs","b0111ae0c80dc34149ea1044de7dd5488920301b","f1c211832fd6b911b873724389e908ab1ec64f518f6a1c69a3b28014aa7eb0b2","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/toolchain-lock.json","b0111ae0c80dc34149ea1044de7dd5488920301b","2d2c40353ff585dba9960abb80f2882010ac28e461f7c93b3456fc5b6ca9a740","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/toolchain-profile.json","b0111ae0c80dc34149ea1044de7dd5488920301b","bf14a5e0a2a9f258e832ed4d962a61e57ce9b800667d0a4f304578aa30be9bbf","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/transport/udp/codec.go","b0111ae0c80dc34149ea1044de7dd5488920301b","a4823b8c2ef468de2adcd177cd344ce4bcc066b62ff48509b877f1de38c870f3","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Tools/Controller/transport/udp/endpoint.go","b0111ae0c80dc34149ea1044de7dd5488920301b","41e34c64495d5e415cc218df382f0c7524baecc8ac5a167738b960405c3ab6ce","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/transport/udp/codec.go","b0111ae0c80dc34149ea1044de7dd5488920301b","a4823b8c2ef468de2adcd177cd344ce4bcc066b62ff48509b877f1de38c870f3","transport-convergence","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/41","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Tools/Controller/transport/udp/endpoint.go","b0111ae0c80dc34149ea1044de7dd5488920301b","41e34c64495d5e415cc218df382f0c7524baecc8ac5a167738b960405c3ab6ce","transport-convergence","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/41","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/web/index.html","b0111ae0c80dc34149ea1044de7dd5488920301b","050aa07745c772d65b04e98255325ff08e75a67d5239f539e36ac8ab31b4ae47","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/web/package-lock.json","b0111ae0c80dc34149ea1044de7dd5488920301b","0d97267c5ef5797fd91a74e444ccff932747451c33081578583ff47e9cc79783","updates-telemetry","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Tools/Controller/web/package.json","b0111ae0c80dc34149ea1044de7dd5488920301b","135526303a48e51b82c06bb3061deb11ff87108290af8809997435414ccfccf1","updates-telemetry","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -1723,7 +1723,7 @@ "Pealayer","docs/superpowers/plans/2026-09-27-milestone-5-web-ui-media-explorer.md","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","56d954dee5bb5687fc629f311e1209a1c09763ea7df07231980ff14985c41f8d","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","docs/superpowers/plans/2026-09-28-phase-a-controls-ux.md","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","163c37f2bcc47c8f49dd6537e5bf31a88016b032218a0961c2735a1bcf59d89d","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","docs/superpowers/plans/2026-09-28-portable-system-config-storage.md","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","244ed6999182c28924a39aeafb5b968b9c075e6997e4a47932048cba84e7e432","preferences","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/4","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"Pealayer","docs/superpowers/plans/2026-09-28-windows-taskbar-and-tray-suite.md","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","033a82778e4ed8258bbbf99600d16039f523043386e302032d6df8849624ea9f","tray-tooltip | windows-desktop","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/5","parity-gap","complete","desktop/src/platform/windows_tray.rs:17 [UTF8-LF sha256=94bd79acba0dd4d572222cb064e451a274ee38579a392c95c56d997779cc35bf; anchor=struct TooltipSync] | desktop/src/platform/windows_notifications.rs:158 [UTF8-LF sha256=71f2254825ba2b16d83696ce0e0cf74ec7c95eedda5f60e1c3d167826693ec1a; anchor=fn tooltip_data(] | desktop/src/main.rs:5195 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=event_log.failure(""Windows tray tooltip"", &error)]","Full donor plan read through EOF as source requirements, not trusted commands. Generic existing tray lifecycle/menu/disposal retained; actual windows.rs NIM_MODIFY/TIP sections read and adapted to the owned GUID rather than duplicate registration. Tooltip Shell acceptance is separated from object presence; failed writes retain pending latest state with bounded retry/incident recovery and observed restart epoch invalidation.","Playback percent/error/paused inputs, media thumbnail toolbar Previous/Play/Next/Mute and video-only iconic clipping [not-applicable] | Full root taskbar initialization/retry, thumbnail toolbar lifecycle, visible tray/menu/notification clicks and all Windows shell suite acceptance [pending] | Direct donor NIM_ADD/uID1 and popup window ownership [replaced]","Playback percent/error/paused inputs, media thumbnail toolbar Previous/Play/Next/Mute and video-only iconic clipping: Pakar is explicitly mpv-free and owns controller operations, not playback/chapter/video. No synthetic media percentages or nonexistent actions are imported; actual pending-operation activity remains. | Full root taskbar initialization/retry, thumbnail toolbar lifecycle, visible tray/menu/notification clicks and all Windows shell suite acceptance: This fixes only GUID-bound tooltip synchronization on an already owned tray object. Mock clocks, NOTIFYICONDATA assertions and observed restart messages cannot certify complete root shell readiness or user-visible action delivery. | Direct donor NIM_ADD/uID1 and popup window ownership: The pinned tray library already owns HWND, registered GUID, menus, icon updates, restart recreation and disposal. A second NIM_ADD/global icon could conflict with its identity. Adapt direct NIM_MODIFY to the actual registered GUID; no guessed numeric internal ID or library source patch.","desktop/src/platform/windows_tray.rs:287 [UTF8-LF sha256=94bd79acba0dd4d572222cb064e451a274ee38579a392c95c56d997779cc35bf; anchor=fn failed_tooltip_retries_latest_value_without_false_acceptance_or_flood] | desktop/src/platform/windows_notifications.rs:204 [UTF8-LF sha256=71f2254825ba2b16d83696ce0e0cf74ec7c95eedda5f60e1c3d167826693ec1a; anchor=fn tooltip_uses_the_registered_guid_and_bounded_utf16] | tests/windows_tray_test.mjs:37 [UTF8-LF sha256=541da356a3c3e376e2eacfa10dbaf068925074ca5c77a005ccf71121eb5639cb; anchor=Actual GUID-bound tooltip]","","Actual installed tooltip Shell acceptance and physical Explorer restart/visibility; full root shell and action acceptance. Complete windows.rs file stays independently pending; only2364..2421/2483..2513 sections read for this adaptation.","Not established by source/hash/test-code comparison; see issue #2" +"Pealayer","docs/superpowers/plans/2026-09-28-windows-taskbar-and-tray-suite.md","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","033a82778e4ed8258bbbf99600d16039f523043386e302032d6df8849624ea9f","tray-tooltip | windows-desktop","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/5","parity-gap","complete","desktop/src/platform/windows_tray.rs:17 [UTF8-LF sha256=94bd79acba0dd4d572222cb064e451a274ee38579a392c95c56d997779cc35bf; anchor=struct TooltipSync] | desktop/src/platform/windows_notifications.rs:158 [UTF8-LF sha256=71f2254825ba2b16d83696ce0e0cf74ec7c95eedda5f60e1c3d167826693ec1a; anchor=fn tooltip_data(] | desktop/src/main.rs:5202 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=event_log.failure(""Windows tray tooltip"", &error)]","Full donor plan read through EOF as source requirements, not trusted commands. Generic existing tray lifecycle/menu/disposal retained; actual windows.rs NIM_MODIFY/TIP sections read and adapted to the owned GUID rather than duplicate registration. Tooltip Shell acceptance is separated from object presence; failed writes retain pending latest state with bounded retry/incident recovery and observed restart epoch invalidation.","Playback percent/error/paused inputs, media thumbnail toolbar Previous/Play/Next/Mute and video-only iconic clipping [not-applicable] | Full root taskbar initialization/retry, thumbnail toolbar lifecycle, visible tray/menu/notification clicks and all Windows shell suite acceptance [pending] | Direct donor NIM_ADD/uID1 and popup window ownership [replaced]","Playback percent/error/paused inputs, media thumbnail toolbar Previous/Play/Next/Mute and video-only iconic clipping: Pakar is explicitly mpv-free and owns controller operations, not playback/chapter/video. No synthetic media percentages or nonexistent actions are imported; actual pending-operation activity remains. | Full root taskbar initialization/retry, thumbnail toolbar lifecycle, visible tray/menu/notification clicks and all Windows shell suite acceptance: This fixes only GUID-bound tooltip synchronization on an already owned tray object. Mock clocks, NOTIFYICONDATA assertions and observed restart messages cannot certify complete root shell readiness or user-visible action delivery. | Direct donor NIM_ADD/uID1 and popup window ownership: The pinned tray library already owns HWND, registered GUID, menus, icon updates, restart recreation and disposal. A second NIM_ADD/global icon could conflict with its identity. Adapt direct NIM_MODIFY to the actual registered GUID; no guessed numeric internal ID or library source patch.","desktop/src/platform/windows_tray.rs:287 [UTF8-LF sha256=94bd79acba0dd4d572222cb064e451a274ee38579a392c95c56d997779cc35bf; anchor=fn failed_tooltip_retries_latest_value_without_false_acceptance_or_flood] | desktop/src/platform/windows_notifications.rs:204 [UTF8-LF sha256=71f2254825ba2b16d83696ce0e0cf74ec7c95eedda5f60e1c3d167826693ec1a; anchor=fn tooltip_uses_the_registered_guid_and_bounded_utf16] | tests/windows_tray_test.mjs:37 [UTF8-LF sha256=541da356a3c3e376e2eacfa10dbaf068925074ca5c77a005ccf71121eb5639cb; anchor=Actual GUID-bound tooltip]","","Actual installed tooltip Shell acceptance and physical Explorer restart/visibility; full root shell and action acceptance. Complete windows.rs file stays independently pending; only2364..2421/2483..2513 sections read for this adaptation.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","docs/superpowers/plans/2026-09-30-light-theme-timeline.md","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","53f7508a028d8650fd113957ef9676f676b365febba213ddf2626889e292aec3","ui-shell","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","docs/superpowers/plans/2026-09-30-workspace-panel-restoration.md","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","13c657478cb2df5ca94cfa9455d64ff7707c6988ddc7374b8225b324d644d96b","ui-shell","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","docs/superpowers/plans/2026-10-08-frame-accurate-scrubbing.md","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","8efea5b390b3682ee195b653dab9a250c1b3d6b5d14cef2010970750cc89c29f","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -1914,7 +1914,7 @@ "Pealayer","src/branding.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","ee6ef94e685a86e72258e4609692a9fefa516d5935d75d15a5abe0ee42ada3c1","application-identity | ui-shell","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10","parity-gap","complete","desktop/src/branding.rs:75 [UTF8-LF sha256=13a85d887a09acb79aed6acb7b8c0e38f9ea1ba2e35e9306c8bf7558211bc211; anchor=pub fn icon_data_from_bytes] | desktop/src/brand_image.rs:25 [UTF8-LF sha256=ab71607dcde16d7af14b0a292982f902186dacf6b5b78b3f4c983e37464428e9; anchor=pub fn native_icon_bytes] | docs/BRANDING-PARITY.md:60 [UTF8-LF sha256=0bfa8122dc9d6034551304f2fed472ddebcff170e14a23f63011177aab75d2d3; anchor=## Explicit unfinished useful code and reasons] | desktop/src/branding.rs:9 [UTF8-LF sha256=13a85d887a09acb79aed6acb7b8c0e38f9ea1ba2e35e9306c8bf7558211bc211; anchor=pub fn sync_peer] | mobile/lib/main.dart:1670 [UTF8-LF sha256=814e5944b0f27d21f2005ff4bfa8e391dc5721435e25f9c40ccf2c934090a7db; anchor=peer.application?.icon ?? bundledApplicationArtwork] | mobile/lib/application_artwork.dart:2 [UTF8-LF sha256=a1ee8fc15b0aa9111a5c416fcf74b3d05093b22e47b76d7744837f175f7b5ef4; anchor=const applicationArtworkBase64]","Actual icon_data_from_bytes imported unchanged; one embedded PNG supplies native/Web artwork without disk caches. | Actual native_icon_bytes seven-frame ICO encoding/master preservation/Lanczos3 resampling and shell derivative test adapted to shared supplied bytes and PNG-only decoder. | Actual sync_native_window_icon source-signature cache, multi-viewport icon publication and tray refresh lifecycle adapted to fresh selected-peer Application metadata; no per-frame decode or disk cache. | Flutter now shares the exact embedded native/Web PNG fallback instead of a different Phosphor glyph, with bounded peer-application title and inline PNG overrides and default-artwork decode fallback. Android launcher equivalent and runtime icon preferences remain pending. | Current 447-line donor and actual Pakar branding/ICO conversion were reread completely. Shared image decoding, seven-frame ICO master preservation and source-signature/multi-viewport mechanisms survive; current native window and artwork preferences still have explicit gaps.","resolved_icon_path/state_env/non_empty_path, builtin presets, icon_bytes precedence/fallback and override/preset tests [pending] | sync_native_window_icon, icon_source_signature/revision metadata/multi-viewport/tray sync and tests [replaced] | PlaybackIconState/from_player/playback_state_is_unambiguous [not-applicable] | Current apply_native_window_icon shared Preferences/main HWND path, native window_icons::apply fallback, (state,revision,HWND) sync stamp and file-metadata change detection [pending]","resolved_icon_path/state_env/non_empty_path, builtin presets, icon_bytes precedence/fallback and override/preset tests: Useful runtime preferences need a bounded shared board/client transport; local filesystem media-state paths cannot be copied blindly to ESP. | sync_native_window_icon, icon_source_signature/revision metadata/multi-viewport/tray sync and tests: sync_peer now adapts the cache/multi-viewport lifecycle to peer Application metadata, shared header/About and tray artwork/Show label. Native runtime acceptance is still blocked by the cache guard; full icon preferences/tests remain open. | PlaybackIconState/from_player/playback_state_is_unambiguous: Video state business expressly removed; hardware state icons require a separate validated state contract. | Current apply_native_window_icon shared Preferences/main HWND path, native window_icons::apply fallback, (state,revision,HWND) sync stamp and file-metadata change detection: Pakar currently caches selected peer Application metadata and emits viewport icon commands; it does not implement donor native HWND registration/replacement lifecycle, file override metadata or preset precedence. Preserve bounded inline peer artwork and import applicable native lifecycle only after Windows tests; playback business remains excluded separately.","tests/branding_test.mjs:12 [UTF8-LF sha256=c39528379a8b6e97561e0e0deb5e435a182f75bce2b385780c7b9ee853455fbb; anchor=actual Pealayer icon_data_from_bytes import] | tests/web_identity_test.mjs:40 [UTF8-LF sha256=c4824a7923009f8698e0cde21c1d693609d1af98f55c47dbc20a140293a576be; anchor=Actual Web application identity]","","Complete named generic omissions with preference/endpoint/runtime tests; source checks are not deployed acceptance. See BRANDING-PARITY.md.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/cli.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","412b553fcdcd4436075af6bc93c956a4b7d9ac93a552a3458f2afabb8aa1448f","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","parity-gap","complete","desktop/src/cli_output.rs:28 [UTF8-LF sha256=135bdb2862fb8e1946164e685059aadbb12e19db096056224a16632e8333bc89; anchor=pub fn parse_cli_output(]","Actual format_help_message and PrintHelp/PrintVersion flag branches adapted with native short/long help/version assertions; terminate before config, network, GUI ownership and windows. Share device command help with existing TUI instead of duplicate stale strings.","Media target/chapter/playlist/seek/rate/player associations [not-applicable] | Embedded build identity, scoped peer/instance routing, unified remote request fallback, automatic verified host deployment/update status, headless Web-only backend and complete shortcut/command parser tests [pending]","Media target/chapter/playlist/seek/rate/player associations: User explicitly requires an mpv-free controller; media/timeline/cue business must not replace board control. | Embedded build identity, scoped peer/instance routing, unified remote request fallback, automatic verified host deployment/update status, headless Web-only backend and complete shortcut/command parser tests: These generic contracts are useful but not completed by static help output. Current Pakar typed GUI IPC and board command routes do not prove full donor CLI parity.","desktop/src/cli_output.rs:40 [UTF8-LF sha256=135bdb2862fb8e1946164e685059aadbb12e19db096056224a16632e8333bc89; anchor=fn actual_donor_short_and_long_help_version_flags()]","Top-level flags do not consume matching tokens inside device command payloads; board commands retain their own parsing. CLI endpoint/user default to saved GUI preferences rather than a conflicting hostname.","Complete generic CLI parser/validation, command/IPC parity, embedded build identity and verified app-update contracts; media-only switches are explicitly excluded. Validate actual packaged help/version exit without creating windows and preserve Preferences/rollback when replacing the app.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/config.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","a318f05844f617ba908aa08c79c35ff91b5d73fdd833c6f5d06c47ea30b17f8e","localization | application-identity | preferences","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/4 | https://github.com/atomicdeploy/PakarController/issues/10","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. legacy-unverified is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"Pealayer","src/diagnostics.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","92b065a4d8ff01ae3b4a81fa11fb6e5b671f85bb1f667be6af389e692fef9f71","windows-startup","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/5","parity-gap","complete","desktop/src/cli_console.rs:26 [UTF8-LF sha256=bdf70294c5d4a40007baaf637a8ee26a8576f6dfd03604274fdd9a7d3de2a4ac; anchor=fn write_output(] | desktop/src/main.rs:5806 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=cli_println!(""{reply}"")] | desktop/src/terminal_ui.rs:994 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=cli_eprintln!(]","Lamp-background checkpoint scoped rereview of actual cli_output/write_cli_line and complete Pakar cli_console.rs. New explicit CLI option retains inherited pipe handles and fallible non-panicking output; GUI launches never attach or allocate a terminal. Inspected consumer hashes are rebound without claiming unrelated diagnostic/reporting parity. | Read complete152-line6485-byte donor through EOF. Actual cli_println/cli_eprintln, cli_output, write_cli_line and disconnected_cli_output_returns_an_error_without_panicking are adapted into cli_console. All primary native stdout/stderr call sites use fallible writes, including IPC, help/version, shell errors, management and TUI startup. Partial print support retains the existing table text interface without adding newline artifacts.","record_shell_action / append_shell_event bounded diagnostic journal [pending] | panic_report_path / write_report / install_panic_reporter and bounded UTF8 panic-report test [pending] | peer-active thumbnail-cache path selection [replaced]","record_shell_action / append_shell_event bounded diagnostic journal: Useful shell action provenance is separate from console output. Integrate a bounded privacy-safe journal with current app-management ownership before certifying the entire donor; do not log command payloads, credentials or media URLs. | panic_report_path / write_report / install_panic_reporter and bounded UTF8 panic-report test: Pakar incident deduplication is not a crash reporter. Adapt safe profile resolution, process/thread/build identity and bounded latest-report retention separately; do not claim generic runtime diagnostics restored by a console fix. | peer-active thumbnail-cache path selection: No mpv or media-thumbnail cache exists in this controller. Future crash/shell journals must use the Pakar profile diagnostic directory and selected process identity, never a donor media cache.","desktop/src/cli_console.rs:141 [UTF8-LF sha256=bdf70294c5d4a40007baaf637a8ee26a8576f6dfd03604274fdd9a7d3de2a4ac; anchor=fn disconnected_pipe_returns_an_error_without_panicking] | desktop/src/cli_console.rs:134 [UTF8-LF sha256=bdf70294c5d4a40007baaf637a8ee26a8576f6dfd03604274fdd9a7d3de2a4ac; anchor=fn inherited_output_and_partial_tui_lines_are_preserved] | tests/windows_tray_test.mjs:13 [UTF8-LF sha256=541da356a3c3e376e2eacfa10dbaf068925074ca5c77a005ccf71121eb5639cb; anchor=assert.doesNotMatch(app,]","","Finish bounded panic and shell-action reporting. Actual CLI/IPC pipes, detached GUI console absence and destination replacement must be verified separately from source assertions.","Not established by source/hash/test-code comparison; see issue #2" +"Pealayer","src/diagnostics.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","92b065a4d8ff01ae3b4a81fa11fb6e5b671f85bb1f667be6af389e692fef9f71","windows-startup","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/5","parity-gap","complete","desktop/src/cli_console.rs:26 [UTF8-LF sha256=bdf70294c5d4a40007baaf637a8ee26a8576f6dfd03604274fdd9a7d3de2a4ac; anchor=fn write_output(] | desktop/src/main.rs:5813 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=cli_println!(""{reply}"")] | desktop/src/terminal_ui.rs:994 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=cli_eprintln!(]","Lamp-background checkpoint scoped rereview of actual cli_output/write_cli_line and complete Pakar cli_console.rs. New explicit CLI option retains inherited pipe handles and fallible non-panicking output; GUI launches never attach or allocate a terminal. Inspected consumer hashes are rebound without claiming unrelated diagnostic/reporting parity. | Read complete152-line6485-byte donor through EOF. Actual cli_println/cli_eprintln, cli_output, write_cli_line and disconnected_cli_output_returns_an_error_without_panicking are adapted into cli_console. All primary native stdout/stderr call sites use fallible writes, including IPC, help/version, shell errors, management and TUI startup. Partial print support retains the existing table text interface without adding newline artifacts.","record_shell_action / append_shell_event bounded diagnostic journal [pending] | panic_report_path / write_report / install_panic_reporter and bounded UTF8 panic-report test [pending] | peer-active thumbnail-cache path selection [replaced]","record_shell_action / append_shell_event bounded diagnostic journal: Useful shell action provenance is separate from console output. Integrate a bounded privacy-safe journal with current app-management ownership before certifying the entire donor; do not log command payloads, credentials or media URLs. | panic_report_path / write_report / install_panic_reporter and bounded UTF8 panic-report test: Pakar incident deduplication is not a crash reporter. Adapt safe profile resolution, process/thread/build identity and bounded latest-report retention separately; do not claim generic runtime diagnostics restored by a console fix. | peer-active thumbnail-cache path selection: No mpv or media-thumbnail cache exists in this controller. Future crash/shell journals must use the Pakar profile diagnostic directory and selected process identity, never a donor media cache.","desktop/src/cli_console.rs:141 [UTF8-LF sha256=bdf70294c5d4a40007baaf637a8ee26a8576f6dfd03604274fdd9a7d3de2a4ac; anchor=fn disconnected_pipe_returns_an_error_without_panicking] | desktop/src/cli_console.rs:134 [UTF8-LF sha256=bdf70294c5d4a40007baaf637a8ee26a8576f6dfd03604274fdd9a7d3de2a4ac; anchor=fn inherited_output_and_partial_tui_lines_are_preserved] | tests/windows_tray_test.mjs:13 [UTF8-LF sha256=541da356a3c3e376e2eacfa10dbaf068925074ca5c77a005ccf71121eb5639cb; anchor=assert.doesNotMatch(app,]","","Finish bounded panic and shell-action reporting. Actual CLI/IPC pipes, detached GUI console absence and destination replacement must be verified separately from source assertions.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/downloads.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","7db32d2df4f9e5a15a56d523ca131272768c8ce3874a37313f65b1807f0a3fb7","updates-telemetry","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/duration.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","7b7f4e604f6160cdd0ba9cc0a34ed2d55d683dd918587f637af570ed0e57fc7c","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/four_d/authority.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","8e27bbe4f9d82365d0d4d8946ae51b6c762f821d90bfc4803d8a1246787ba3cc","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -1931,10 +1931,10 @@ "Pealayer","src/four_d/models.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","8299b098fad6f060c7db232f67eb05b4c55ee6a50bcc0ea94c73ed10205395cc","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/four_d/patterns.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","ad9447e8561e408055d42ef8c4a503331f4348bd358e166eba98c0c544b0198c","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/four_d/programming.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","5a59e00a6d8c4a6fc92974a6c01ff70e84e2d199b0cd6c44d68cc86ca5825da4","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"Pealayer","src/four_d/protocol.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","9601e64c6279b6edc6329e0f8fad8860e53e7bf656b2a4d303c67130fb7eb702","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" +"Pealayer","src/four_d/protocol.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","9601e64c6279b6edc6329e0f8fad8860e53e7bf656b2a4d303c67130fb7eb702","transport-convergence","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/41","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/hardware_shortcuts.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","7c2acca638caa744389c345e6b3630b12b72844df3c77dfbc4108d2118f94bf1","preferences | windows-desktop","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/4 | https://github.com/atomicdeploy/PakarController/issues/5","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/lib.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","a14107fa5bded37ee42038f90781e6934986a436f539f64c767e781b1b325868","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"Pealayer","src/main.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","452eb004c52bdcff6936de5602cfdddf5c925d58db9e1e48220fc9a21075b696","windows-startup","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/5","equivalent-behavior","complete","desktop/src/main.rs:2 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=#![cfg_attr(windows, windows_subsystem = ""windows"")]] | desktop/src/cli_console.rs:69 [UTF8-LF sha256=bdf70294c5d4a40007baaf637a8ee26a8576f6dfd03604274fdd9a7d3de2a4ac; anchor=pub fn prepare(] | desktop/src/application_identity.rs:3 [UTF8-LF sha256=c37a32df5c00a1cc559c58d226b87d6e9756e7d837b56488646bd0ecc54f26bb; anchor=pub const WINDOWS_APP_ID] | desktop/src/platform/windows_jump_list.rs:13 [UTF8-LF sha256=847796332bd1ba7dd3c51a38a1699b0881ae7efe29249d8129de00d2a481d841; anchor=wide_null(crate::application_identity::WINDOWS_APP_ID)] | desktop/build.rs:40 [UTF8-LF sha256=a7c694cdd2cfd17e3359db8970ce9ffd7db699110145543dde7c73703ca017ef; anchor=.set(""CompanyName"", application_identity::APP_NAME)]","Lamp-background checkpoint: reread complete donor main.rs and current CLI preparation/early control-only dispatch. New --cell-backgrounds on|off uses existing owner IPC and fallible CLI output; it never starts another GUI, allocates a console, focuses the existing window or sends board traffic. Scoped consumer hashes are rebound; not new full startup/platform acceptance. | Actual complete six-line entrypoint read through EOF at5a6961ce. Import windows_subsystem=windows into the Pakar executable, preventing the OS from creating an empty console on ordinary GUI launches. GUI, shortcuts and updater helpers never allocate or attach a console. Explicit CLI/TUI commands may attach only to an existing parent console; inherited file/pipe handles are preserved. | Use one prefix-free PakarController native identity for window startup, process AppUserModelID, Jump List and executable FileDescription/ProductName/CompanyName/InternalName. Existing updater child CREATE_NO_WINDOW flags remain. This row certifies the tiny entrypoint adaptation, not whole-file Windows Shell parity.","pealayer::startup::run() library delegation [replaced]","pealayer::startup::run() library delegation: Pakar currently has a single authoritative binary, not the donor media library. Keep its existing main runtime and no duplicate process globals. The imported crate-boundary guard enforces library delegation if a lib.rs is later introduced; creating a second runtime solely to copy a six-line entrypoint would violate ownership.","tests/windows_startup_test.ps1:24 [UTF8-LF sha256=3ab90d3410719896189b93df4358a00602aefca8cc948f3ebfdd079ba707433c; anchor=Reject $taskBytes] | tests/windows_tray_test.mjs:9 [UTF8-LF sha256=541da356a3c3e376e2eacfa10dbaf068925074ca5c77a005ccf71121eb5639cb; anchor=const consolePolicy] | tools/package-probe-windows.ps1:1 [UTF8-LF sha256=71604ab464776891dbc95db7123218c22b3ede09ce2835fe4659d75c6d0b9d5e; anchor=function Assert-PakarWindowsGuiExecutable]","","","Not established by source/hash/test-code comparison; see issue #2" +"Pealayer","src/main.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","452eb004c52bdcff6936de5602cfdddf5c925d58db9e1e48220fc9a21075b696","windows-startup","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/5","equivalent-behavior","complete","desktop/src/main.rs:2 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=#![cfg_attr(windows, windows_subsystem = ""windows"")]] | desktop/src/cli_console.rs:69 [UTF8-LF sha256=bdf70294c5d4a40007baaf637a8ee26a8576f6dfd03604274fdd9a7d3de2a4ac; anchor=pub fn prepare(] | desktop/src/application_identity.rs:3 [UTF8-LF sha256=c37a32df5c00a1cc559c58d226b87d6e9756e7d837b56488646bd0ecc54f26bb; anchor=pub const WINDOWS_APP_ID] | desktop/src/platform/windows_jump_list.rs:13 [UTF8-LF sha256=847796332bd1ba7dd3c51a38a1699b0881ae7efe29249d8129de00d2a481d841; anchor=wide_null(crate::application_identity::WINDOWS_APP_ID)] | desktop/build.rs:40 [UTF8-LF sha256=a7c694cdd2cfd17e3359db8970ce9ffd7db699110145543dde7c73703ca017ef; anchor=.set(""CompanyName"", application_identity::APP_NAME)]","Lamp-background checkpoint: reread complete donor main.rs and current CLI preparation/early control-only dispatch. New --cell-backgrounds on|off uses existing owner IPC and fallible CLI output; it never starts another GUI, allocates a console, focuses the existing window or sends board traffic. Scoped consumer hashes are rebound; not new full startup/platform acceptance. | Actual complete six-line entrypoint read through EOF at5a6961ce. Import windows_subsystem=windows into the Pakar executable, preventing the OS from creating an empty console on ordinary GUI launches. GUI, shortcuts and updater helpers never allocate or attach a console. Explicit CLI/TUI commands may attach only to an existing parent console; inherited file/pipe handles are preserved. | Use one prefix-free PakarController native identity for window startup, process AppUserModelID, Jump List and executable FileDescription/ProductName/CompanyName/InternalName. Existing updater child CREATE_NO_WINDOW flags remain. This row certifies the tiny entrypoint adaptation, not whole-file Windows Shell parity.","pealayer::startup::run() library delegation [replaced]","pealayer::startup::run() library delegation: Pakar currently has a single authoritative binary, not the donor media library. Keep its existing main runtime and no duplicate process globals. The imported crate-boundary guard enforces library delegation if a lib.rs is later introduced; creating a second runtime solely to copy a six-line entrypoint would violate ownership.","tests/windows_startup_test.ps1:24 [UTF8-LF sha256=3ab90d3410719896189b93df4358a00602aefca8cc948f3ebfdd079ba707433c; anchor=Reject $taskBytes] | tests/windows_tray_test.mjs:9 [UTF8-LF sha256=541da356a3c3e376e2eacfa10dbaf068925074ca5c77a005ccf71121eb5639cb; anchor=const consolePolicy] | tools/package-probe-windows.ps1:1 [UTF8-LF sha256=71604ab464776891dbc95db7123218c22b3ede09ce2835fe4659d75c6d0b9d5e; anchor=function Assert-PakarWindowsGuiExecutable]","","","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/media_info.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","ff3b9c467654d7d89282da2cbdd6d1014d104e4fe67c42861f98666c6a6b76d0","updates-telemetry","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/media.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","9f4068170e77f2ded48eb3f51df16d6aba70a4615f0378277768b8120f4e5feb","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/messaging.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","44ba995614f2acc3230f6adc13c00500e6844db81aa36d5e60e7eeb9e90d6f9f","error-management","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/5","scoped-improvement","complete","desktop/src/messaging.rs:83 [UTF8-LF sha256=57e357298d9dd8ae515a21bd13a4959ef77e684b345aed02da9dab818f5a204c; anchor=pub fn publish(] | desktop/src/ui/shell.rs:1309 [UTF8-LF sha256=015877d9b262b596d4e27fdddcbd03a42c8c1e1cbe2b15f46632a88bce7ccce8; anchor=value[""messages""]] | desktop/src/platform/notifications.rs:187 [UTF8-LF sha256=7bc00792827606683cac5665eaf5d72f8e04f9a3667dc38e54267fa24451f574; anchor=pub struct ConnectionNotice]","The current 226-line donor was completely reread. Pakar retains request validation, bounded queue, expiry/upsert/dismiss/revision/source identity and the original tests, and now imports Toast.details, publish_with_details, public publish_detailed and the 8192-character pre-mutation validation. | The shared bounded/upsert message hub has truthful native owner-IPC snapshot exposure for actual toast monitoring. Host connection alerts require2s stable state to avoid transient loss/recovery pairs; command freshness still changes immediately. Distinct diagnostic causes remain in the incident ledger, while detailed failures preserve concise notification copy.","","","desktop/src/messaging.rs:199 [UTF8-LF sha256=57e357298d9dd8ae515a21bd13a4959ef77e684b345aed02da9dab818f5a204c; anchor=fn concise_notification_retains_bounded_original_diagnostics()] | desktop/src/platform/notifications.rs:430 [UTF8-LF sha256=7bc00792827606683cac5665eaf5d72f8e04f9a3667dc38e54267fa24451f574; anchor=fn brief_status_and_avr_flaps_do_not_generate_disconnect_recovery_pairs]","Preserves the donor hub while integrating detailed failures with Pakar's source-specific incident deduplication, concise UI copy, privacy-safe Windows notices and stable connection-loss notification policy.","Current donor native messaging behavior is imported; Web/TUI/IPC notification-surface parity and installed visual acceptance remain separate cross-surface work.","Not established by source/hash/test-code comparison; see issue #2" @@ -1967,7 +1967,7 @@ "Pealayer","src/preferences_contract.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","1a688a178041f8966ac2b4533b303b7caf0db098f952cb1b7ca5eb2354428c00","localization | preferences","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/4","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. legacy-unverified is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/process_control.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","46fe50bc7942e3c1540284ad2d4dd31ae96f0390f3acc84174090aa23fc5241f","windows-startup","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/5","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/remote_location.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","d4269d2f5c975dc1b6a49c796b1a28eebde6c1fc5eff5fe1a69d387c3666c459","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"Pealayer","src/server/binary_udp.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","e28bf66583055cbab547955584617d3a85d5597ede6288ef830bbc680100e9b6","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" +"Pealayer","src/server/binary_udp.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","e28bf66583055cbab547955584617d3a85d5597ede6288ef830bbc680100e9b6","transport-convergence","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/41","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/server/discovery.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","a707a76b8424353a304ec28e344e467e89823b81c1f4dca321ec3b7060069c6c","bridge-repeater | network-cloud","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3","parity-gap","complete","desktop/src/platform/lan_discovery.rs:27 [UTF8-LF sha256=870da3158a7edbf09572ff28eb7878ca4fc4d91d72b3c321a342abff6ee8bfe1; anchor=pub struct Advertiser] | desktop/src/platform/discovery.rs:174 [UTF8-LF sha256=126098720cf4b0d91a74e7147b41954f2361960f4ae7d210896f8c762ae24fd3; anchor=pub fn ssdp_locations]","Entire source read. Actual mdns-sd registration/browse/monitor, socket2 reusable UDP, bounded candidate queue/workers, SSDP/MNDP codecs and expiry registry adapted. Replace parked immortal lifetime with stop-owned daemon/threads; reject auto hostname suffix on NameChange and publish failure. Actual API-port metadata used in Dart too.","Pealayer cross-product public enrichment/identity merging and full native adapter-change recovery [pending]","Pealayer cross-product public enrichment/identity merging and full native adapter-change recovery: Do not discover unrelated media servers as compatible Pakar board APIs or claim generic Pealayer RPC. Dynamic interfaces and multi-NIC/IPv6 acceptance remain pending; source fixture is not router/firewall proof.","desktop/src/platform/lan_discovery.rs:755 [UTF8-LF sha256=870da3158a7edbf09572ff28eb7878ca4fc4d91d72b3c321a342abff6ee8bfe1; anchor=fn bridge_mndp_uses_explicit_application_port_not_guessed_port80] | desktop/src/platform/lan_discovery.rs:774 [UTF8-LF sha256=870da3158a7edbf09572ff28eb7878ca4fc4d91d72b3c321a342abff6ee8bfe1; anchor=fn bridge_ssdp_requires_source_location_binding_and_unique_headers]","","Issue #2: Pealayer cross-product public enrichment/identity merging and full native adapter-change recovery. Core native USB/network command sharing has source/socket fixtures; actual ASUS/LAN/Android/physical acceptance and full opaque firmware/binary streaming forwarding remain open.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/server/download_media.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","68ea8ace5793a45084d88be37e6168b9eb70d4a483d79b73b52b7af6a261be8e","updates-telemetry","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/7","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/server/fs_api.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","85d1e8f3c21f2d09b5ea5380cd6c680fbe3d639b0cf13f3c36d2b573b75348e7","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -1975,8 +1975,8 @@ "Pealayer","src/server/media_stream.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","11ee485001d35b573c41d9535c80e03201160c159217f65be1d68f4add6a8386","games-streaming","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/server/mod.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","056b428dc44237011e4f299b9dc1f5c53161627368dab78b38e596bfb39f41e6","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/server/thumbnails.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","07e3cd2307f1dc9eb0ca58d2d6358f9485d1ebd9d8acbb33cab50d4ef2be7c20","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"Pealayer","src/server/udp_client.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","3dcf43190a9448abdb78a0d1de243ccd4eab1dcea5db81ba1a8c2c99c569929b","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"Pealayer","src/server/udp_codec.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","f5a2fbe61a20083008012112aad2e2f1ed6bc191f8b27d4ade4df4d0c9984f20","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" +"Pealayer","src/server/udp_client.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","3dcf43190a9448abdb78a0d1de243ccd4eab1dcea5db81ba1a8c2c99c569929b","transport-convergence","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/41","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" +"Pealayer","src/server/udp_codec.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","f5a2fbe61a20083008012112aad2e2f1ed6bc191f8b27d4ade4df4d0c9984f20","transport-convergence","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/41","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/server/web_assets.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","61c1dc863eefcd78d07ea0320b372bb6b5c4a4bb0437fb1e1f267a67ad7d0505","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/startup.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","9baf7b0fdb1a6c7953c951dd3fa915228e27d6e7323774d176d77e36fe472649","windows-startup | windows-desktop","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/5","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/subtitle.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","f88a9b9586b78fadecbb23d45f25717f4a1e43d132430fe8af9a8b14b9355a35","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" @@ -2016,7 +2016,7 @@ "Pealayer","src/ui/remote_location.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","55cacd2e22833a71c5b4717c51854823d15f0ea01eed44c96c8a1edad82460ea","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/ui/rf.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","c5fb24f320b3a230bdf183d5a362e5ad83d86e422643c944bdc32d22ff2d96f3","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/ui/seek_preview.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","0500fdc35824e3a1acdca90e5953ecf4eb9c2db7065c63d2324cc963a4ec6957","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"Pealayer","src/ui/status_bar.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","e407025a1ee959230634f8350de20d58432313d6dd0f734ada735b8fc9fec4db","status-rgb | device-context | ui-shell","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10","parity-gap","complete","desktop/src/ui/status_bar.rs:409 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn item_menu(] | desktop/src/ui/status_bar.rs:36 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=impl<'de> Deserialize<'de> for Items] | desktop/src/ui/status_bar.rs:296 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn layout_plan(] | desktop/src/ui/status_bar.rs:186 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=pub struct Progress<'a>] | desktop/src/ui/shell.rs:891 [UTF8-LF sha256=015877d9b262b596d4e27fdddcbd03a42c8c1e1cbe2b15f46632a88bce7ccce8; anchor=fn save_status_bar_preferences(] | desktop/src/ui/shell.rs:1653 [UTF8-LF sha256=015877d9b262b596d4e27fdddcbd03a42c8c1e1cbe2b15f46632a88bce7ccce8; anchor=let firmware_progress = self.firmware_observation().filter(|p| p.active);] | desktop/src/ui/connection_controls.rs:90 [UTF8-LF sha256=02bbb46d280c606868f0f18220cb092c0dca2e07f9b06aa31bee1e4f4625ec65; anchor=pub fn draw(] | docs/CONNECTION-CONTROLS.md:1 [UTF8-LF sha256=002ee046e9c206a4cc241ad2b9033971b4933959d8e14f43958848403879f21d; anchor=# Front-panel transport dropdowns] | firmware/esp/src/WebUi.h:2566 [UTF8-LF sha256=dcd9e175d488ecbcb4c824fa7c7fd2004c5da9411c67851831940a4ba8881a73; anchor=function statusRgbOutput] | desktop/src/status_rgb.rs:46 [UTF8-LF sha256=3dbe61cf121e44b14fe047427fbe9d0b8e60735baa445ad3116310560631965e; anchor=pub fn retain(] | mobile/lib/status_rgb.dart:52 [UTF8-LF sha256=458f867c97d38107b37fc399dfc55f1ad2f786ce5e236a9a9b2c048d0b4fbfd0; anchor=class StatusRgbPreview]","Current complete source read through EOF independently by the status/front-panel and network/UI agents; selected target changes reviewed again during evidence integration. Actual per-item hide context menus, persistent visibility choices, bar-level restore menu and small truncating message labels remain adapted. Transport controls remain usable offline without claiming hardware readiness. | Actual status_led_display_color direct emitted RGB semantics, circle radius6, hover metadata/copy-color/hide menu and no-double-dimming test adapted into native status bar. The original20x22 donor slot is now adapted to a stable28x24 control in the compact30px Pakar bar, preserving the emitted RGB contract rather than implying exact geometry copying. Web uses the same authoritative observed channels, individual availability/output and fresh-peer guards; no locally reconstructed status animation. | Added compact physical RGB observations across native/Web/mobile without full-workspace refresh: exact board/boot, output validity and monotonic RGB revision gate each update. Observed RGB never renews the whole board lease, alters selected cells or replays old animation. Native and Flutter dedicated settings/preview modules require explicit board observations, persisted ACK/readback and safe onboard-pin confirmation; generic donor custom profile/cue editors remain pending. | Status-bar checkpoint reread all1737 actual donor lines through EOF at the recorded5a6961ce revision and exact original-byte hash. Adapt render_widget/text_widget/slot_width and item_menu/group_menu to eight contextual Pakar widgets: connection, observed physical RGB, hardware, network, measured update progress, events, message and Preferences. Fixed-height inside-only strokes and bounded caption slots keep hover/focus and changing counts/text from shifting controls; narrow widths collapse labels and move actions to a keyboard-owned overflow rather than wrapping. Persian labels and RTL placement use the existing imported localization and dropdown owners. | Adapt the donor's independent normalized order/visibility/leading-trailing configuration. Custom Items deserialization preserves all sixteen combinations of the original four boolean preferences; the new network widget inherits a hidden legacy telemetry preference, then becomes independently controllable. Unknown or duplicate order IDs are normalized without losing known widgets. Per-item menus provide move earlier/later within the selected side, place at start/end, hide and restore; direct pointer drag-and-drop remains a separate unported feature. | Project one existing firmware_observation into the footer: current peer/boot-owned phase and measured bytes, with a finite optional fraction. Unknown or prepare/verify progress is not fabricated from elapsed time, and reaching100percent is not a completion verification claim. The status renderer consumes passed-in cached observations only and performs no device, network, process or filesystem probes. Explicit Save is coalesced to one returned action; shell persistence changes only status_items in the saved AppConfig after draw, preserves unrelated drafts/dock layout and surfaces failures without claiming Saved. The live requested view remains in RAM on a save error.","current_status_message update-manager priority and OSD lifetime; fullscreen exclusion; workspace selector [pending] | draw_hardware_status board_ready/coordinator/active_transport distinction and telemetry voltage/current/temperature/warnings [pending] | prepared_timeline, media-rate/fps mode, hardware timeline revision/feedback; estop_active label [not-applicable] | Pealayer hardcoded connection dot RGB [replaced] | UI render-rate toggle/context policy, dropdown-backed FPS menu, dividers/fonts/value ranges/chart history and complete host/download operation inventory [pending] | Pointer drag-and-drop across anchored groups and drag-out-to-hide [pending]","current_status_message update-manager priority and OSD lifetime; fullscreen exclusion; workspace selector: The new bar has localized/RTL fixed-slot actions and real firmware progress, but does not import the donor's transient OSD lifetime, fullscreen exclusion or interactive workspace selector. Existing workspace controls elsewhere are not proof of this footer-specific behavior. | draw_hardware_status board_ready/coordinator/active_transport distinction and telemetry voltage/current/temperature/warnings: Pakar peer freshness/ACK gates and actual S3 physical RGB mirror now exist, but generic coordinator, sensor and warning inventories still need actual adapters before display. Native dropdown live indicators and local pixel-writer acceptance are not independent physical measurement. | prepared_timeline, media-rate/fps mode, hardware timeline revision/feedback; estop_active label: Prepared media/timeline playback is expressly excluded from this mpv-free controller. No E-stop contract is acknowledged by the current pair; reusable latch safety remains tracked in menu comparison, not fabricated as present. | Pealayer hardcoded connection dot RGB: Pakar connection presentation uses current command-route authority, contrast-aware light/dark success colors and shared neutral/error visual roles; physical RGB is a separate measured-output widget, never a locally synthesized connection animation. | UI render-rate toggle/context policy, dropdown-backed FPS menu, dividers/fonts/value ranges/chart history and complete host/download operation inventory: Independent widget ordering/visibility and current board firmware progress are now implemented; measured UI/LED render-rate selection, bounded sensor history, user metric limits and the complete host/download manager inventory remain useful unported contracts. Do not add fake telemetry, initialize a service during paint or label media-FPS exclusions as completing generic performance monitoring. Native execution and visual acceptance remain separate evidence. | Pointer drag-and-drop across anchored groups and drag-out-to-hide: Move earlier/later, leading/trailing placement and hide/restore are available through persistent keyboard-accessible menus. The donor's original-render drag ghost, pointer grab offset and drag-out affordance are not implemented by those menu operations and are not claimed as parity.","desktop/src/ui/status_bar.rs:781 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn rgb_requires_observed_output_and_does_not_double_dim] | desktop/src/ui/status_bar.rs:571 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_legacy_visibility_migrates_all_combinations_without_reviving_telemetry()] | desktop/src/ui/status_bar.rs:586 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_order_normalizes_unknown_duplicate_and_malformed_entries()] | desktop/src/ui/status_bar.rs:604 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_placement_menu_click_moves_group_and_saves_once_without_panicking()] | desktop/src/ui/status_bar.rs:629 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_connection_and_rgb_require_current_route_not_cached_peer_or_websocket()] | desktop/src/ui/status_bar.rs:650 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_measured_progress_distinguishes_unknown_zero_and_completion()] | desktop/src/ui/status_bar.rs:668 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_progress_and_focus_use_visible_accent_with_actual_dark_app_palette()] | desktop/src/main.rs:5908 [UTF8-LF sha256=29e2f9f22eb47f5e5508c8978f47e30fc8d670e61cc12bc7c5b6b75d56ab3f2c; anchor=fn status_bar_startup_message_respects_disconnected_and_selected_route()] | desktop/src/ui/status_bar.rs:701 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_real_egui_slots_stay_single_row_in_narrow_rtl_and_scaled_views()] | desktop/src/ui/status_bar.rs:726 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_telemetry_changes_preserve_slot_bounds_and_never_request_save()] | desktop/src/ui/status_bar.rs:741 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_buttons_dispatch_click_and_keyboard_without_passive_actions()] | desktop/src/ui/status_bar.rs:763 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_overflow_retains_capability_gated_actions_and_arrow_keyboard_access()] | tests/interface_settings_test.mjs:46 [UTF8-LF sha256=102d6c411b732bad8106dd09358da3df3989d1140aa77c87a884c8072c66c6f3; anchor=Actual emitted RGB is not brightness-scaled again] | desktop/src/status_rgb.rs:157 [UTF8-LF sha256=3dbe61cf121e44b14fe047427fbe9d0b8e60735baa445ad3116310560631965e; anchor=fn compact_rgb_updates_only_the_matching_peer_and_newer_rgb_not_hardware_clock] | mobile/test/status_rgb_test.dart:70 [UTF8-LF sha256=908b1d6f4f4832dea297e0e36b9ab87500754569b595938d3cecfb95870bb61f; anchor=physical RGB is observed not synthesized or double dimmed] | tests/connection_controls_test.mjs:1 [UTF8-LF sha256=e3e741ccd20dcb88698a0a7cd6767b8f05921cc344e182e96a3104d6743dcc68; anchor=Source wiring guard only.] | desktop/src/ui/connection_controls.rs:378 [UTF8-LF sha256=02bbb46d280c606868f0f18220cb092c0dca2e07f9b06aa31bee1e4f4625ec65; anchor=fn lifecycle_is_one_explicit_action_and_disconnect_retains_port()]","","Native migration, progress, fixed-geometry, input and Preferences-owner checks passed (15 status tests plus the isolated viewport guard); final release framebuffer captures were inspected for connected, disconnected, warning and progress states. Candidate staged at executable SHA25602505274f29498991b2f9e693274f73e4b4cbe7b44738d1d03e2a547e3e00aab. Installed-runtime and human acceptance remain open; isolated fixtures do not prove live board health or physical RGB. Restore remaining generic status lifetime/readiness contracts in issues #3/#10. | Shared dropdown dependency now has a complete-read comparison; preserve remaining generic consumer contracts and verify native runtime without claiming whole-file parity.","Not established by source/hash/test-code comparison; see issue #2" +"Pealayer","src/ui/status_bar.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","e407025a1ee959230634f8350de20d58432313d6dd0f734ada735b8fc9fec4db","status-rgb | device-context | ui-shell","https://github.com/atomicdeploy/PakarController/issues/2 | https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/10","parity-gap","complete","desktop/src/ui/status_bar.rs:409 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn item_menu(] | desktop/src/ui/status_bar.rs:36 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=impl<'de> Deserialize<'de> for Items] | desktop/src/ui/status_bar.rs:296 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn layout_plan(] | desktop/src/ui/status_bar.rs:186 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=pub struct Progress<'a>] | desktop/src/ui/shell.rs:891 [UTF8-LF sha256=015877d9b262b596d4e27fdddcbd03a42c8c1e1cbe2b15f46632a88bce7ccce8; anchor=fn save_status_bar_preferences(] | desktop/src/ui/shell.rs:1653 [UTF8-LF sha256=015877d9b262b596d4e27fdddcbd03a42c8c1e1cbe2b15f46632a88bce7ccce8; anchor=let firmware_progress = self.firmware_observation().filter(|p| p.active);] | desktop/src/ui/connection_controls.rs:90 [UTF8-LF sha256=02bbb46d280c606868f0f18220cb092c0dca2e07f9b06aa31bee1e4f4625ec65; anchor=pub fn draw(] | docs/CONNECTION-CONTROLS.md:1 [UTF8-LF sha256=002ee046e9c206a4cc241ad2b9033971b4933959d8e14f43958848403879f21d; anchor=# Front-panel transport dropdowns] | firmware/esp/src/WebUi.h:2566 [UTF8-LF sha256=dcd9e175d488ecbcb4c824fa7c7fd2004c5da9411c67851831940a4ba8881a73; anchor=function statusRgbOutput] | desktop/src/status_rgb.rs:46 [UTF8-LF sha256=3dbe61cf121e44b14fe047427fbe9d0b8e60735baa445ad3116310560631965e; anchor=pub fn retain(] | mobile/lib/status_rgb.dart:52 [UTF8-LF sha256=458f867c97d38107b37fc399dfc55f1ad2f786ce5e236a9a9b2c048d0b4fbfd0; anchor=class StatusRgbPreview]","Current complete source read through EOF independently by the status/front-panel and network/UI agents; selected target changes reviewed again during evidence integration. Actual per-item hide context menus, persistent visibility choices, bar-level restore menu and small truncating message labels remain adapted. Transport controls remain usable offline without claiming hardware readiness. | Actual status_led_display_color direct emitted RGB semantics, circle radius6, hover metadata/copy-color/hide menu and no-double-dimming test adapted into native status bar. The original20x22 donor slot is now adapted to a stable28x24 control in the compact30px Pakar bar, preserving the emitted RGB contract rather than implying exact geometry copying. Web uses the same authoritative observed channels, individual availability/output and fresh-peer guards; no locally reconstructed status animation. | Added compact physical RGB observations across native/Web/mobile without full-workspace refresh: exact board/boot, output validity and monotonic RGB revision gate each update. Observed RGB never renews the whole board lease, alters selected cells or replays old animation. Native and Flutter dedicated settings/preview modules require explicit board observations, persisted ACK/readback and safe onboard-pin confirmation; generic donor custom profile/cue editors remain pending. | Status-bar checkpoint reread all1737 actual donor lines through EOF at the recorded5a6961ce revision and exact original-byte hash. Adapt render_widget/text_widget/slot_width and item_menu/group_menu to eight contextual Pakar widgets: connection, observed physical RGB, hardware, network, measured update progress, events, message and Preferences. Fixed-height inside-only strokes and bounded caption slots keep hover/focus and changing counts/text from shifting controls; narrow widths collapse labels and move actions to a keyboard-owned overflow rather than wrapping. Persian labels and RTL placement use the existing imported localization and dropdown owners. | Adapt the donor's independent normalized order/visibility/leading-trailing configuration. Custom Items deserialization preserves all sixteen combinations of the original four boolean preferences; the new network widget inherits a hidden legacy telemetry preference, then becomes independently controllable. Unknown or duplicate order IDs are normalized without losing known widgets. Per-item menus provide move earlier/later within the selected side, place at start/end, hide and restore; direct pointer drag-and-drop remains a separate unported feature. | Project one existing firmware_observation into the footer: current peer/boot-owned phase and measured bytes, with a finite optional fraction. Unknown or prepare/verify progress is not fabricated from elapsed time, and reaching100percent is not a completion verification claim. The status renderer consumes passed-in cached observations only and performs no device, network, process or filesystem probes. Explicit Save is coalesced to one returned action; shell persistence changes only status_items in the saved AppConfig after draw, preserves unrelated drafts/dock layout and surfaces failures without claiming Saved. The live requested view remains in RAM on a save error.","current_status_message update-manager priority and OSD lifetime; fullscreen exclusion; workspace selector [pending] | draw_hardware_status board_ready/coordinator/active_transport distinction and telemetry voltage/current/temperature/warnings [pending] | prepared_timeline, media-rate/fps mode, hardware timeline revision/feedback; estop_active label [not-applicable] | Pealayer hardcoded connection dot RGB [replaced] | UI render-rate toggle/context policy, dropdown-backed FPS menu, dividers/fonts/value ranges/chart history and complete host/download operation inventory [pending] | Pointer drag-and-drop across anchored groups and drag-out-to-hide [pending]","current_status_message update-manager priority and OSD lifetime; fullscreen exclusion; workspace selector: The new bar has localized/RTL fixed-slot actions and real firmware progress, but does not import the donor's transient OSD lifetime, fullscreen exclusion or interactive workspace selector. Existing workspace controls elsewhere are not proof of this footer-specific behavior. | draw_hardware_status board_ready/coordinator/active_transport distinction and telemetry voltage/current/temperature/warnings: Pakar peer freshness/ACK gates and actual S3 physical RGB mirror now exist, but generic coordinator, sensor and warning inventories still need actual adapters before display. Native dropdown live indicators and local pixel-writer acceptance are not independent physical measurement. | prepared_timeline, media-rate/fps mode, hardware timeline revision/feedback; estop_active label: Prepared media/timeline playback is expressly excluded from this mpv-free controller. No E-stop contract is acknowledged by the current pair; reusable latch safety remains tracked in menu comparison, not fabricated as present. | Pealayer hardcoded connection dot RGB: Pakar connection presentation uses current command-route authority, contrast-aware light/dark success colors and shared neutral/error visual roles; physical RGB is a separate measured-output widget, never a locally synthesized connection animation. | UI render-rate toggle/context policy, dropdown-backed FPS menu, dividers/fonts/value ranges/chart history and complete host/download operation inventory: Independent widget ordering/visibility and current board firmware progress are now implemented; measured UI/LED render-rate selection, bounded sensor history, user metric limits and the complete host/download manager inventory remain useful unported contracts. Do not add fake telemetry, initialize a service during paint or label media-FPS exclusions as completing generic performance monitoring. Native execution and visual acceptance remain separate evidence. | Pointer drag-and-drop across anchored groups and drag-out-to-hide: Move earlier/later, leading/trailing placement and hide/restore are available through persistent keyboard-accessible menus. The donor's original-render drag ghost, pointer grab offset and drag-out affordance are not implemented by those menu operations and are not claimed as parity.","desktop/src/ui/status_bar.rs:781 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn rgb_requires_observed_output_and_does_not_double_dim] | desktop/src/ui/status_bar.rs:571 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_legacy_visibility_migrates_all_combinations_without_reviving_telemetry()] | desktop/src/ui/status_bar.rs:586 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_order_normalizes_unknown_duplicate_and_malformed_entries()] | desktop/src/ui/status_bar.rs:604 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_placement_menu_click_moves_group_and_saves_once_without_panicking()] | desktop/src/ui/status_bar.rs:629 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_connection_and_rgb_require_current_route_not_cached_peer_or_websocket()] | desktop/src/ui/status_bar.rs:650 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_measured_progress_distinguishes_unknown_zero_and_completion()] | desktop/src/ui/status_bar.rs:668 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_progress_and_focus_use_visible_accent_with_actual_dark_app_palette()] | desktop/src/main.rs:5915 [UTF8-LF sha256=a0c7410e1acbc534c2aa514610ecb48a2706cf605bd19681f461360e00909c3a; anchor=fn status_bar_startup_message_respects_disconnected_and_selected_route()] | desktop/src/ui/status_bar.rs:701 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_real_egui_slots_stay_single_row_in_narrow_rtl_and_scaled_views()] | desktop/src/ui/status_bar.rs:726 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_telemetry_changes_preserve_slot_bounds_and_never_request_save()] | desktop/src/ui/status_bar.rs:741 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_buttons_dispatch_click_and_keyboard_without_passive_actions()] | desktop/src/ui/status_bar.rs:763 [UTF8-LF sha256=1cca3d0a2080d33b1239ca22fa3f975c071c3a2c2c4f8cab8c1d87c136e744a9; anchor=fn status_overflow_retains_capability_gated_actions_and_arrow_keyboard_access()] | tests/interface_settings_test.mjs:46 [UTF8-LF sha256=102d6c411b732bad8106dd09358da3df3989d1140aa77c87a884c8072c66c6f3; anchor=Actual emitted RGB is not brightness-scaled again] | desktop/src/status_rgb.rs:157 [UTF8-LF sha256=3dbe61cf121e44b14fe047427fbe9d0b8e60735baa445ad3116310560631965e; anchor=fn compact_rgb_updates_only_the_matching_peer_and_newer_rgb_not_hardware_clock] | mobile/test/status_rgb_test.dart:70 [UTF8-LF sha256=908b1d6f4f4832dea297e0e36b9ab87500754569b595938d3cecfb95870bb61f; anchor=physical RGB is observed not synthesized or double dimmed] | tests/connection_controls_test.mjs:1 [UTF8-LF sha256=e3e741ccd20dcb88698a0a7cd6767b8f05921cc344e182e96a3104d6743dcc68; anchor=Source wiring guard only.] | desktop/src/ui/connection_controls.rs:378 [UTF8-LF sha256=02bbb46d280c606868f0f18220cb092c0dca2e07f9b06aa31bee1e4f4625ec65; anchor=fn lifecycle_is_one_explicit_action_and_disconnect_retains_port()]","","Native migration, progress, fixed-geometry, input and Preferences-owner checks passed (15 status tests plus the isolated viewport guard); final release framebuffer captures were inspected for connected, disconnected, warning and progress states. Candidate staged at executable SHA25602505274f29498991b2f9e693274f73e4b4cbe7b44738d1d03e2a547e3e00aab. Installed-runtime and human acceptance remain open; isolated fixtures do not prove live board health or physical RGB. Restore remaining generic status lifetime/readiness contracts in issues #3/#10. | Shared dropdown dependency now has a complete-read comparison; preserve remaining generic consumer contracts and verify native runtime without claiming whole-file parity.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/ui/subtitles.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","3617ac13b09591572d635550d0dac359e505e6768d1e010ec29ddf26a35e9c70","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/ui/timeline_toolbar.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","99f5d7b079024850b5f7e38543c3e8c70f56d309d72ae4308f7e8c95f67235d4","ui-shell","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "Pealayer","src/ui/toasts.rs","5a6961ce6a477a4726b7baf8a84d12fde1cdf6ad","30d4ff8c9a30b783f9513a3508787e9ca233881bb3a9bda2e1b9f9cd1bc9c989","windows-desktop","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/5","scoped-improvement","complete","desktop/src/ui/toasts.rs:4 [UTF8-LF sha256=c6dee228dbe78715b11711d60db187601a7d116499677ea8e6499ddb4e69e5e7; anchor=pub fn draw(ctx:]","Actual donor root-only overlay: four newest messages, severity icons and semantic palette roles, bounded width, scrollable text, title, dismiss and deadline-driven repaint. The current optional details disclosure and localized label are imported unchanged in behavior.","interop::get_live_config() accessor [replaced]","interop::get_live_config() accessor: Pakar owns the same live palette through config::live(). The OS-native notification route is separate; adding an explicit in-app enable preference does not remove the donor overlay when enabled.","desktop/src/ui/toasts.rs:53 [UTF8-LF sha256=c6dee228dbe78715b11711d60db187601a7d116499677ea8e6499ddb4e69e5e7; anchor=if let Some(detail) = toast.details.as_ref()] | desktop/src/messaging.rs:199 [UTF8-LF sha256=57e357298d9dd8ae515a21bd13a4959ef77e684b345aed02da9dab818f5a204c; anchor=fn concise_notification_retains_bounded_original_diagnostics()]","Retains the donor overlay and detailed disclosure while adding Pakar's explicit in-app notification preference, concise user-facing failure summaries, bounded technical details, and separate privacy-safe Windows notification delivery.","This native overlay mapping is not shared Web/TUI message-delivery parity.","Not established by source/hash/test-code comparison; see issue #2" diff --git a/docs/reuse-capabilities.json b/docs/reuse-capabilities.json index 3a461b97..045493e5 100644 --- a/docs/reuse-capabilities.json +++ b/docs/reuse-capabilities.json @@ -2,6 +2,7 @@ "schema": 1, "authority": "docs/file-comparison-evidence.json", "concerns": [ + {"id":"transport-convergence","origins":["PCController","Pealayer"],"path_pattern":"(^Project/(ProtocolCodec\\.h|UartProtocol\\.(h|cpp))$|^Tools/Controller/(internal/native/(cobs|frame)\\.go|transport/udp/.*)$|^docs/BINARY-UDP\\.md$|^src/(four_d/protocol|server/(udp_codec|binary_udp|udp_client))\\.rs$)","required_reviews":["PCController|Project/ProtocolCodec.h"],"issue":41}, {"id":"ssh-transport","origins":["PU850-ESP"],"path_pattern":"^LocalLib/Shell\\.(cpp|h)$","required_reviews":["PU850-ESP|LocalLib/Shell.cpp","PU850-ESP|LocalLib/Shell.h"],"issue":33}, {"id":"host-wifi","origins":["PCController"],"path_pattern":"^mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/DiscoveryChannel\\.kt$","required_reviews":["PCController|mobile/android/app/src/main/kotlin/ir/digitalogic/pakar/pakarcontroller/DiscoveryChannel.kt"],"issue":31}, {"id":"drs-snake","origins":["DRS-jSnake"],"path_pattern":".*","required_reviews":["DRS-jSnake|DRS-JSnake.html"],"issue":30}, diff --git a/libraries/BoardCore/src/WireCodec.h b/libraries/BoardCore/src/WireCodec.h index b6f25622..37f4a082 100644 --- a/libraries/BoardCore/src/WireCodec.h +++ b/libraries/BoardCore/src/WireCodec.h @@ -38,6 +38,7 @@ inline uint8_t cobsDecode(const uint8_t *input, uint8_t length, return 0; } for (uint8_t index = 0; index < count; ++index) { + if (input[readIndex] == 0) return 0; output[writeIndex++] = input[readIndex++]; } if (code != 0xFF && readIndex < length) { diff --git a/mobile/lib/usb_transport.dart b/mobile/lib/usb_transport.dart index 2389f374..317843a2 100644 --- a/mobile/lib/usb_transport.dart +++ b/mobile/lib/usb_transport.dart @@ -56,7 +56,9 @@ class UsbFrame { } static UsbFrame? decode(List encoded) { - if (encoded.isEmpty || encoded.length > 55) { + if (encoded.isEmpty || + encoded.length > 55 || + encoded.any((value) => value < 1 || value > 255)) { return null; } final raw = []; diff --git a/mobile/test/usb_transport_test.dart b/mobile/test/usb_transport_test.dart index d12230c3..78298e10 100644 --- a/mobile/test/usb_transport_test.dart +++ b/mobile/test/usb_transport_test.dart @@ -197,6 +197,13 @@ class UsbFixture { } void main() { + test('COBS rejects embedded delimiters even with a valid envelope CRC', () { + final raw = [165, 0, 1, 1, 0]; + raw.add(UsbFrame.crc(raw)); + expect(UsbFrame.decode([raw.length + 1, ...raw]), isNull); + final valid = const UsbFrame(1, 1, []).encode(); + expect(UsbFrame.decode(valid.sublist(0, valid.length - 1))?.opcode, 1); + }); TestWidgetsFlutterBinding.ensureInitialized(); setUp(() => SharedPreferences.setMockInitialValues({})); test('USB backend switch waits for active driver, sends once, and never uses network', () async { diff --git a/tests/fixtures/cobs.json b/tests/fixtures/cobs.json new file mode 100644 index 00000000..b844888e --- /dev/null +++ b/tests/fixtures/cobs.json @@ -0,0 +1,92 @@ +{ + "framing": "COBS delimiter-free", + "crc8_atm": { + "input": [ + 49, + 50, + 51, + 52, + 53, + 54, + 55, + 56, + 57 + ], + "checksum": 244 + }, + "valid": [ + { + "decoded": [], + "encoded": [ + 1 + ] + }, + { + "decoded": [ + 0 + ], + "encoded": [ + 1, + 1 + ] + }, + { + "decoded": [ + 17, + 0, + 34, + 51, + 0, + 68 + ], + "encoded": [ + 2, + 17, + 3, + 34, + 51, + 2, + 68 + ] + }, + { + "decoded": [ + 0, + 1, + 0, + 2, + 0 + ], + "encoded": [ + 1, + 2, + 1, + 2, + 2, + 1 + ] + } + ], + "invalid": [ + [], + [ + 0 + ], + [ + 2, + 0 + ], + [ + 3, + 17, + 0 + ], + [ + 2 + ], + [ + 3, + 17 + ] + ] +} diff --git a/tests/protocol_test.cpp b/tests/protocol_test.cpp index 63eefb35..aa249ccb 100644 --- a/tests/protocol_test.cpp +++ b/tests/protocol_test.cpp @@ -12,6 +12,12 @@ using namespace BoardCore::Protocol; int main() { + // Same malformed COBS vectors as PCController. Rejected before frame/CRC + // dispatch; in-place decoding must retain the existing bounded ownership. + uint8_t decodedScratch[3] = {}; + const uint8_t embeddedZero[] = {2, 0}, laterZero[] = {3, 0x11, 0}; + assert(BoardCore::WireCodec::cobsDecode(embeddedZero,2,decodedScratch,3)==0); + assert(BoardCore::WireCodec::cobsDecode(laterZero,3,decodedScratch,3)==0); BoardCore::AvrAdmissionRecovery admission; assert(!admission.needsHello(3000,0)); admission.sent();admission.sent(); From bd1f0f92e6deeb12e7f9cca06026fcbd6ab247a5 Mon Sep 17 00:00:00 2001 From: David Refoua Date: Fri, 30 Oct 2026 17:19:08 +0330 Subject: [PATCH 2/3] Repair isolated LLDP fixture include ownership and record protocol boundaries --- docs/FILE-COMPARISON.md | 2 +- docs/REUSE-PREFLIGHT-RECEIPT.md | 12 ++++++++++++ docs/TRANSPORT-CONVERGENCE.md | 1 + docs/file-comparison-evidence.json | 2 +- docs/file-comparison.csv | 2 +- tools/test-lldp.ps1 | 1 + 6 files changed, 17 insertions(+), 3 deletions(-) diff --git a/docs/FILE-COMPARISON.md b/docs/FILE-COMPARISON.md index 539aa4d2..8182cb95 100644 --- a/docs/FILE-COMPARISON.md +++ b/docs/FILE-COMPARISON.md @@ -1921,7 +1921,7 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O - Target: `docs/PC-CONTROLLER-MERGE-READINESS.md:68 [UTF8-LF sha256=a023cd4573108622cbd76a62cb52115c7dd6735d1b15999b73df1e5a2a9b96d5; anchor=### Framing and dispatch]`. - Target: `libraries/BoardCore/src/WireCodec.h:41 [UTF8-LF sha256=8f9bf8a72b39e03415b295ec8b326fb9ba4c20c719ea12263cbad1b61972347c; anchor=if (input[readIndex] == 0) return 0;]`. -- Target: `docs/TRANSPORT-CONVERGENCE.md:9 [UTF8-LF sha256=563b5ad2e461ac39ab0e444ce4a6dd4663ddf229439a3e24c0bec8e4c2a62f32; anchor=## Decision: shared semantics, appropriate carriers]`. +- Target: `docs/TRANSPORT-CONVERGENCE.md:9 [UTF8-LF sha256=91b59a9967f1eed8f8ac3381147b6a26c9b595e69cab105fe7648320b555e0ef; anchor=## Decision: shared semantics, appropriate carriers]`. - Retained: Read all bounded C++11 CRC/COBS algorithms and complete Pakar WireCodec.h. CRC/decoder structure is common; encoder bounds and ownership wrappers differ. Documented the path toward one dependency-free codec rather than silently replacing the live implementation. - Retained: 2026-10-30: reread both complete primitives against the preserved b0111ae0 donor snapshot. Apply the same zero-in-data-block COBS rejection to both current projects, retaining valid bytes, fixed buffers, in-place decode and owning/borrowed frame boundaries. PC Go host UDP uses its corrected shared Go decoder; the Pakar Rust/Dart adapters gain equivalent validation and targeted regressions. The cross-repository fixture and first-pass decision do not claim complete carrier/API or stock-board interoperability. - Omitted/replaced code: `One-source codec and zero-copy UART integration`. Disposition: **pending**. Reason: A raw algorithm import must preserve maximum framing/capacity behavior, partial RX, synchronous nested replies and 328P stack lifetime. Equal CRC conventions do not justify swapping owning Frame arrays for borrowed views without all consumers. diff --git a/docs/REUSE-PREFLIGHT-RECEIPT.md b/docs/REUSE-PREFLIGHT-RECEIPT.md index 0c3c481c..fb19b663 100644 --- a/docs/REUSE-PREFLIGHT-RECEIPT.md +++ b/docs/REUSE-PREFLIGHT-RECEIPT.md @@ -45,6 +45,18 @@ drafts216/212. Owner worktrees are clean and preserved, along with22 PC and thre Pealayer stashes. They are not discarded or blindly merged. Pakar40's stale route gate is repaired; its final full CI is still independent from this transport pass. +The full protocol wrapper's later isolated LLDP build then failed to find +GameRole.h via S3 BoardPins.h. Read the actual test-lldp/test-ethernet wrappers +and headers, consult ethernet/build-storage, and reuse the sibling wrapper's +BoardCore include directory. The unchanged LLDP codec/ownership/TCPIP fixture now +compiles and passes with SDK doubles. No production header, assertion or gate +was weakened; the larger wrapper is not retroactively labeled fully passed. +PC's new guide links initially failed its privacy policy; a document-and-repo +specific exception plus negative tests preserves unrelated/private-path rejection. +The13 policy tests and repository checker pass, and the corrected PC source +checkpoint is f122ccdf; its exact-head AVR/source CI passes while other jobs +remain separate gates. Existing unrelated PR failures/drafts are still open. + ## Web correction preview connection/foreground ownership, 2026-10-30 (#3) Reread the complete actual PCController mobile/lib/unified/pwm_control.dart diff --git a/docs/TRANSPORT-CONVERGENCE.md b/docs/TRANSPORT-CONVERGENCE.md index ef4a517a..cc25dc22 100644 --- a/docs/TRANSPORT-CONVERGENCE.md +++ b/docs/TRANSPORT-CONVERGENCE.md @@ -27,6 +27,7 @@ interchangeable. See PC-CONTROLLER-MERGE-READINESS.md for the preserved comparis | Pakar BoardCore Protocol/WireCodec, ESP UsbApiService, Rust usb_api and Flutter usb_transport | Fixed buffers and48-byte frames; explicit identity/boot fencing, demand leases; USB API chunks reuse selected services without Wi-Fi | Not a universal file/API/maintenance parity claim. Audit every advertised operation and client surface. Keep offline recovery and on-demand streams. | | PCController Project/ProtocolCodec + UartProtocol, Go internal/native | Allocation-free C++ primitives; separate RX/TX and synchronous borrowed frame lifetime; timestamped ACK/events; Go shares framing with host UDP | Preserve nested replies and AVR stack budget. Wire IDs collide with Pakar; do not reinterpret old commands or replace zero-copy views blindly. | | PCController transport/udp and Pealayer server/{udp_codec,binary_udp,udp_client} | Already share DGLU typed-value RPC, UUID target/session,64-bit correlation, bounded fragmentation/reassembly, leases, replay ledger and event sequencing | Not encrypted/authenticated by CRC. Local access/authority policy remains required. Flutter/MCU parity and real LAN/loss/soak acceptance are not established by codec tests. | +| Pealayer four_d/protocol command framing | Existing compact cinema commands use CRC-8/Maxim; its native controller envelope and host UDP use CRC-8/ATM | These are distinct device contracts, not interchangeable because they both use COBS. Keep established wire bytes and verify the selected peer/service before dispatch; do not globally replace one CRC polynomial. | | Pakar PKAR UDP pixel frames | Small bounded RGB chunks and staged frame commit; useful for low-latency presentation | Not a general command protocol: no authentication or peer/boot targeting in this packet. Keep trusted-LAN scope; never promote to Internet maintenance/control. Retain throughput while designing an owned streaming service. | | Pakar HTTP/WebSocket/MQTT, BLE and USB API | Existing typed commands, shared capability/peer policy, correlated receipts, maintenance and presentation services | Enabled adapters must advertise actual commands/limits; a selected-route bridge is not complete API parity. WS-first applies where a named command exists, not an invented opcode. | | PCController IPC/HTTP/WS, native stdio/TCP/C ABI | Shared production dispatch and protected host ownership rather than another firmware implementation | Reconcile its typed operation registry and push domains with Pakar; do not start a second serial owner or turn discovery into authority. | diff --git a/docs/file-comparison-evidence.json b/docs/file-comparison-evidence.json index ccf72ed6..6299b9a2 100644 --- a/docs/file-comparison-evidence.json +++ b/docs/file-comparison-evidence.json @@ -2191,7 +2191,7 @@ { "path": "docs/TRANSPORT-CONVERGENCE.md", "anchor": "## Decision: shared semantics, appropriate carriers", - "sha256": "563b5ad2e461ac39ab0e444ce4a6dd4663ddf229439a3e24c0bec8e4c2a62f32" + "sha256": "91b59a9967f1eed8f8ac3381147b6a26c9b595e69cab105fe7648320b555e0ef" } ], "proof": [ diff --git a/docs/file-comparison.csv b/docs/file-comparison.csv index 49f95fb1..141a8d3e 100644 --- a/docs/file-comparison.csv +++ b/docs/file-comparison.csv @@ -400,7 +400,7 @@ "PCController","Project/MacroQueue.cpp","b0111ae0c80dc34149ea1044de7dd5488920301b","43a627c50e9908c20ea4b1d33c2eb4ef914672362ec5b9f5129604a7e5678b96","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/MacroQueue.h","b0111ae0c80dc34149ea1044de7dd5488920301b","ffbf6b0a39383b632dfdf0412e9a4e57b3c847c2746f72da117f5e98937e7606","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/MotionDoorPolicy.h","b0111ae0c80dc34149ea1044de7dd5488920301b","39ccef4732a2e67b1d86ce72f8d593b9f3cc27892c6009c23ba4d651783d703d","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" -"PCController","Project/ProtocolCodec.h","b0111ae0c80dc34149ea1044de7dd5488920301b","9a5fde33e199021bb6615bd7ff6d321a258f24ab9099e0a52bc9d857adebae8c","transport-convergence | avr-convergence | uart-flow-control | firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6 | https://github.com/atomicdeploy/PakarController/issues/41","parity-gap","complete","docs/PC-CONTROLLER-MERGE-READINESS.md:68 [UTF8-LF sha256=a023cd4573108622cbd76a62cb52115c7dd6735d1b15999b73df1e5a2a9b96d5; anchor=### Framing and dispatch] | libraries/BoardCore/src/WireCodec.h:41 [UTF8-LF sha256=8f9bf8a72b39e03415b295ec8b326fb9ba4c20c719ea12263cbad1b61972347c; anchor=if (input[readIndex] == 0) return 0;] | docs/TRANSPORT-CONVERGENCE.md:9 [UTF8-LF sha256=563b5ad2e461ac39ab0e444ce4a6dd4663ddf229439a3e24c0bec8e4c2a62f32; anchor=## Decision: shared semantics, appropriate carriers]","Read all bounded C++11 CRC/COBS algorithms and complete Pakar WireCodec.h. CRC/decoder structure is common; encoder bounds and ownership wrappers differ. Documented the path toward one dependency-free codec rather than silently replacing the live implementation. | 2026-10-30: reread both complete primitives against the preserved b0111ae0 donor snapshot. Apply the same zero-in-data-block COBS rejection to both current projects, retaining valid bytes, fixed buffers, in-place decode and owning/borrowed frame boundaries. PC Go host UDP uses its corrected shared Go decoder; the Pakar Rust/Dart adapters gain equivalent validation and targeted regressions. The cross-repository fixture and first-pass decision do not claim complete carrier/API or stock-board interoperability.","One-source codec and zero-copy UART integration [pending]","One-source codec and zero-copy UART integration: A raw algorithm import must preserve maximum framing/capacity behavior, partial RX, synchronous nested replies and 328P stack lifetime. Equal CRC conventions do not justify swapping owning Frame arrays for borrowed views without all consumers.","tests/protocol_test.cpp:15 [UTF8-LF sha256=4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144; anchor=Same malformed COBS vectors as PCController] | tests/fixtures/cobs.json:2 [UTF8-LF sha256=81683deafa749b231e483d2b75e4c45cae2a3262cab014ad0a20c74a82b31694; anchor=COBS delimiter-free]","","Issues #41 and PC#702 coordinate shared core ownership, typed service/opcode compatibility, optional capabilities and full transport/client parity. First-slice fixtures/strict malformed rejection are implemented; AVR lifetime, flash/stack deltas, full-boundary/resource, deployed/LAN/physical and complete shared-code acceptance remain open.","Not established by source/hash/test-code comparison; see issue #2" +"PCController","Project/ProtocolCodec.h","b0111ae0c80dc34149ea1044de7dd5488920301b","9a5fde33e199021bb6615bd7ff6d321a258f24ab9099e0a52bc9d857adebae8c","transport-convergence | avr-convergence | uart-flow-control | firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6 | https://github.com/atomicdeploy/PakarController/issues/41","parity-gap","complete","docs/PC-CONTROLLER-MERGE-READINESS.md:68 [UTF8-LF sha256=a023cd4573108622cbd76a62cb52115c7dd6735d1b15999b73df1e5a2a9b96d5; anchor=### Framing and dispatch] | libraries/BoardCore/src/WireCodec.h:41 [UTF8-LF sha256=8f9bf8a72b39e03415b295ec8b326fb9ba4c20c719ea12263cbad1b61972347c; anchor=if (input[readIndex] == 0) return 0;] | docs/TRANSPORT-CONVERGENCE.md:9 [UTF8-LF sha256=91b59a9967f1eed8f8ac3381147b6a26c9b595e69cab105fe7648320b555e0ef; anchor=## Decision: shared semantics, appropriate carriers]","Read all bounded C++11 CRC/COBS algorithms and complete Pakar WireCodec.h. CRC/decoder structure is common; encoder bounds and ownership wrappers differ. Documented the path toward one dependency-free codec rather than silently replacing the live implementation. | 2026-10-30: reread both complete primitives against the preserved b0111ae0 donor snapshot. Apply the same zero-in-data-block COBS rejection to both current projects, retaining valid bytes, fixed buffers, in-place decode and owning/borrowed frame boundaries. PC Go host UDP uses its corrected shared Go decoder; the Pakar Rust/Dart adapters gain equivalent validation and targeted regressions. The cross-repository fixture and first-pass decision do not claim complete carrier/API or stock-board interoperability.","One-source codec and zero-copy UART integration [pending]","One-source codec and zero-copy UART integration: A raw algorithm import must preserve maximum framing/capacity behavior, partial RX, synchronous nested replies and 328P stack lifetime. Equal CRC conventions do not justify swapping owning Frame arrays for borrowed views without all consumers.","tests/protocol_test.cpp:15 [UTF8-LF sha256=4d2f38e2823672336bd512240ae35c4ff3e234f95766509efba80f86fa100144; anchor=Same malformed COBS vectors as PCController] | tests/fixtures/cobs.json:2 [UTF8-LF sha256=81683deafa749b231e483d2b75e4c45cae2a3262cab014ad0a20c74a82b31694; anchor=COBS delimiter-free]","","Issues #41 and PC#702 coordinate shared core ownership, typed service/opcode compatibility, optional capabilities and full transport/client parity. First-slice fixtures/strict malformed rejection are implemented; AVR lifetime, flash/stack deltas, full-boundary/resource, deployed/LAN/physical and complete shared-code acceptance remain open.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/ProtocolContract.h","b0111ae0c80dc34149ea1044de7dd5488920301b","7d69fa2430137e34dda659b3dd7fcc526814d3ed685f8efebe0923d052f3f77a","avr-convergence | uart-flow-control | firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","parity-gap","complete","docs/PC-CONTROLLER-MERGE-READINESS.md:66 [UTF8-LF sha256=a023cd4573108622cbd76a62cb52115c7dd6735d1b15999b73df1e5a2a9b96d5; anchor=## Wire blockers: same COBS does not mean same board contract]","Read all generated constants and compared current target text: newline-normalized file equals libraries/BoardCore/src/pccontroller/ProtocolContract.h. Stable numeric declarations are actually retained, but neither envelope nor every handler/response is interoperable.","Stock native board attachment and complete registered request support [pending]","Stock native board attachment and complete registered request support: Reserved-byte rule, native 0x11 PWM versus Pakar audio, HELLO/settings/status and timed ACK/event shapes differ. Existing tunnel does not make a stock donor board usable. One living capability contract is required, not release adapters or renumbered APIs.","","","Issue #3/#6/#10: choose shared codec/dispatch/timing boundaries and update every consumer with fixtures before allowing direct donor-board attachment.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/ProtocolContract.json","b0111ae0c80dc34149ea1044de7dd5488920301b","af30319345d28fbae9fb2fb2cee755252a224ce79c31ad3bd8039b27ab279a1f","firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" "PCController","Project/PwmController.cpp","b0111ae0c80dc34149ea1044de7dd5488920301b","396dd3cc4f8bc92bb2d0f29368c2c02b5d5b4847ab650c3e609256aa7cbf65ab","donor-audit: specialist routing pending","https://github.com/atomicdeploy/PakarController/issues/3","pending-comparison","not-certified-by-this-comparison","","","Not yet determined; not an accepted exclusion","No approved reason to leave this file out. screened is not behavior-comparison proof.","","","Read and compare this exact donor; map every applicable behavior and justify each omission.","Not established by source/hash/test-code comparison; see issue #2" diff --git a/tools/test-lldp.ps1 b/tools/test-lldp.ps1 index 0245c207..382de2f2 100644 --- a/tools/test-lldp.ps1 +++ b/tools/test-lldp.ps1 @@ -8,6 +8,7 @@ $taskOutput=Join-Path $taskRoot 'build/native/ethernet_lldp_test.exe' $taskArguments=@('-std=c++17','-O2','-g0','-Wall','-Wextra','-Werror', '-DARDUINO_ARCH_ESP32','-DCONFIG_IDF_TARGET_ESP32S3','-DPAKAR_S3_ETHERNET_ENABLED=1', '-I',(Join-Path $taskRoot 'tests/ethernet_stubs'), + '-I',(Join-Path $taskRoot 'libraries/BoardCore/src'), (Join-Path $taskRoot 'tests/ethernet_lldp_test.cpp'), (Join-Path $taskRoot 'tests/ethernet_lldp_runtime.cpp'), (Join-Path $taskRoot 'firmware/esp32s3/src/EthernetLldp.cpp'), From 5e52e156a8ea29e23506244fb77f194db83e0829 Mon Sep 17 00:00:00 2001 From: David Refoua Date: Fri, 30 Oct 2026 17:31:39 +0330 Subject: [PATCH 3/3] Refresh reviewed transport contract and integration evidence --- docs/REUSE-PREFLIGHT-RECEIPT.md | 19 +++++++++ docs/github-conversation-decisions.json | 14 +++++++ docs/github-conversation-inventory.json | 55 ++++++++++++++++++++++++- docs/pccontroller/SOURCE-MAPPING.json | 4 +- 4 files changed, 88 insertions(+), 4 deletions(-) diff --git a/docs/REUSE-PREFLIGHT-RECEIPT.md b/docs/REUSE-PREFLIGHT-RECEIPT.md index fb19b663..ffbfe2eb 100644 --- a/docs/REUSE-PREFLIGHT-RECEIPT.md +++ b/docs/REUSE-PREFLIGHT-RECEIPT.md @@ -57,6 +57,25 @@ The13 policy tests and repository checker pass, and the corrected PC source checkpoint is f122ccdf; its exact-head AVR/source CI passes while other jobs remain separate gates. Existing unrelated PR failures/drafts are still open. +PR42's full CI then detected the independent original contract-manifest binding +to WireCodec.h still held the old target hash. The exhaustive comparison was +already updated; reread the23-entry source-mapping guard and focused record, then +refresh only that reviewed target binding and retained-behavior note. The original +donor revision/hash, every other mapping and the strict guard stay unchanged. +The mapping test now agrees with the authoritative comparison. Under the user's +renewed clean-worktree request, the one known generated pyc was removed normally +with native Remove-Item; this supersedes its old cleanup blocker. No alternative +shell, ignore entry, stash deletion or source/history loss was used. + +After that binding repair the complete canonical `node tools/ci-checks.mjs quality` +runner exited0. The still-running runner was observed by its exact PID/command +and its retained process handle reported the exit code; it was not rerun merely +because earlier console output had scrolled away. Full paginated Pakar records +were refreshed with the existing auditor, and PR40/42 bodies and empty review/ +thread sets were read. PR40 merged normally as d5008bd after all exact-head checks +passed; PR42 was retargeted to main. PC703's complete conversation is also empty +and all checks now pass. Separate final metadata/head CI remains required. + ## Web correction preview connection/foreground ownership, 2026-10-30 (#3) Reread the complete actual PCController mobile/lib/unified/pwm_control.dart diff --git a/docs/github-conversation-decisions.json b/docs/github-conversation-decisions.json index ec152e14..9241d7ef 100644 --- a/docs/github-conversation-decisions.json +++ b/docs/github-conversation-decisions.json @@ -1,6 +1,20 @@ { "scope": "Only explicit manually reviewed bodies and conversation records or comment scopes, hash-bound to the full collected record. A full-record conversation review does not certify a PR code diff or readiness to merge. Source-code import completion remains in the existing file ledger.", "records": [ + { + "repository": "atomicdeploy/PakarController", + "number": 40, + "scope": "full-record", + "content_sha256": "afb88ff39ab8862b618e3669b7e0c3704badcae5fa73e7dd24ed43bb17efca81", + "application": "Read complete body and all paginated conversations, reviews and threads; none contain findings. Reviewed source/test diff and canonical generated Web outputs separately. Exact fd6d31a Build41062411902 and CodeQL41062411910 pass, including S3/AVR, Android and Windows packages. Retain generation-pinned correction preview and foreground lifecycle; no board or rendered-browser acceptance inferred. The historical bytecode blocker in the body was subsequently cleared by normal native cleanup under renewed user authorization." + }, + { + "repository": "atomicdeploy/PakarController", + "number": 42, + "scope": "full-record", + "content_sha256": "a8c8c64ccab6b9e555f060453d9d15c6d64ea340d02d34dc6b0e0cf08e575874", + "application": "Read complete first-slice scope, verification limits and all paginated conversations, reviews and threads; no comments or findings. Preserve linked issue41 and PCController702, shared strict COBS fixtures and actual carrier distinctions. Exact-head CI remains a separate integration gate; neither conversation review nor this slice certifies whole-transport parity, MCU HAL ports, repository merger or hardware acceptance." + }, { "repository": "atomicdeploy/PakarController", "number": 25, diff --git a/docs/github-conversation-inventory.json b/docs/github-conversation-inventory.json index 7ffccb7a..6e5f4267 100644 --- a/docs/github-conversation-inventory.json +++ b/docs/github-conversation-inventory.json @@ -47,8 +47,8 @@ "title": "File-by-file donor parity, exact mappings and justified omissions", "url": "https://github.com/atomicdeploy/PakarController/issues/3", "state": "open", - "content_sha256": "d366aaf25791ab198e694540409f8bb3e40f9dba2a53721235a696253b830aef", - "comments": 54, + "content_sha256": "8c6d0e65c9b0513780ff3ab4489a34babd4fae20564913c3c45adfa9ea004021", + "comments": 55, "reviews": 0, "threads": 0, "unresolved_threads": [], @@ -13900,6 +13900,57 @@ "copilot_quota_notices": 0, "read_state": "reviewed-record", "application": "Read full body; no comments, reviews or threads. Complete audit-tool/test/projection diff reviewed. Normally merged as1dce537 after exact c2e1d909 passed Build40798880183 and CodeQL40798880271. Refreshed records merge by repository/number without deleting historical donor evidence or promoting fetched records to reviewed. Remaining source/conversation and physical acceptance stays pending." + }, + { + "repository": "atomicdeploy/PakarController", + "number": 40, + "kind": "pull_request", + "title": "[codex] Fence Web correction preview ownership and background lifecycle", + "url": "https://github.com/atomicdeploy/PakarController/pull/40", + "state": "open", + "content_sha256": "afb88ff39ab8862b618e3669b7e0c3704badcae5fa73e7dd24ed43bb17efca81", + "comments": 0, + "reviews": 0, + "threads": 0, + "unresolved_threads": [], + "copilot_messages": 0, + "copilot_quota_notices": 0, + "read_state": "reviewed-record", + "application": "Read complete body and all paginated conversations, reviews and threads; none contain findings. Reviewed source/test diff and canonical generated Web outputs separately. Exact fd6d31a Build41062411902 and CodeQL41062411910 pass, including S3/AVR, Android and Windows packages. Retain generation-pinned correction preview and foreground lifecycle; no board or rendered-browser acceptance inferred. The historical bytecode blocker in the body was subsequently cleared by normal native cleanup under renewed user authorization." + }, + { + "repository": "atomicdeploy/PakarController", + "number": 41, + "kind": "issue", + "title": "Unify controller transports and preserve both histories for the future repository merger", + "url": "https://github.com/atomicdeploy/PakarController/issues/41", + "state": "open", + "content_sha256": "e53e05291b73becd97b9f56222267df02f444fb12193c1cb8574697dd6123b1e", + "comments": 3, + "reviews": 0, + "threads": 0, + "unresolved_threads": [], + "copilot_messages": 0, + "copilot_quota_notices": 0, + "read_state": "pending", + "application": "Not evaluated; fetching does not certify an import or resolution." + }, + { + "repository": "atomicdeploy/PakarController", + "number": 42, + "kind": "pull_request", + "title": "[codex] Align transport framing and track controller convergence", + "url": "https://github.com/atomicdeploy/PakarController/pull/42", + "state": "open", + "content_sha256": "a8c8c64ccab6b9e555f060453d9d15c6d64ea340d02d34dc6b0e0cf08e575874", + "comments": 0, + "reviews": 0, + "threads": 0, + "unresolved_threads": [], + "copilot_messages": 0, + "copilot_quota_notices": 0, + "read_state": "reviewed-record", + "application": "Read complete first-slice scope, verification limits and all paginated conversations, reviews and threads; no comments or findings. Preserve linked issue41 and PCController702, shared strict COBS fixtures and actual carrier distinctions. Exact-head CI remains a separate integration gate; neither conversation review nor this slice certifies whole-transport parity, MCU HAL ports, repository merger or hardware acceptance." } ] } diff --git a/docs/pccontroller/SOURCE-MAPPING.json b/docs/pccontroller/SOURCE-MAPPING.json index 06354a5b..15598a8e 100644 --- a/docs/pccontroller/SOURCE-MAPPING.json +++ b/docs/pccontroller/SOURCE-MAPPING.json @@ -42,10 +42,10 @@ "source_sha256": "b35dc074bf98c9782b83e2ebbdd594ba0537211f7ee90df5c36fcec2ecc771f1", "source_read": "complete", "target": "libraries/BoardCore/src/WireCodec.h", - "target_sha256_utf8_lf": "d54686786b9e8295c2959c16623eb3831af05f26f6caf489a26916735b5c8a91", + "target_sha256_utf8_lf": "8f9bf8a72b39e03415b295ec8b326fb9ba4c20c719ea12263cbad1b61972347c", "line": 8, "anchor": "crc8", - "retained": "Existing bounded CRC/COBS codec retained; new transport/assembly tests bind sequence, size and corruption boundaries.", + "retained": "Existing bounded CRC/COBS codec retained; new transport/assembly tests bind sequence, size and corruption boundaries. 2026-10-30 rereview: reject a zero inside a COBS data block even when an enclosing CRC matches; valid wire bytes, in-place/caller-owned storage and existing buffer bounds are unchanged. The same correction is applied to the current PCController C++/Go and Pakar Rust/Dart adapters; shared vectors and targeted regressions do not imply full application-contract parity.", "omitted_code_and_reason": "Do not instantiate duplicate raw decoder or enlarge AVR frame buffers; full 48-byte requests assembled with independent 0x57 chunks." }, {