From e0420c310427daedd92cdaa6614ffb0d365c746f Mon Sep 17 00:00:00 2001 From: David Refoua Date: Sat, 31 Oct 2026 01:48:05 +0330 Subject: [PATCH 1/3] Refresh shared PortableShell components and adapt terminal integration --- docs/FILE-COMPARISON.md | 228 +++++---- docs/REUSE-PREFLIGHT-RECEIPT.md | 35 ++ docs/file-comparison-evidence.json | 308 +++++++----- docs/file-comparison.csv | 72 +-- docs/legacy-source-ledger.csv | 16 +- firmware/esp/src/ShellService.h | 8 +- firmware/esp/src/ShellTuiBinding.h | 10 +- .../portable-shell/portable_device_table.hpp | 359 ++++++++++---- .../portable-shell/portable_device_view.hpp | 446 +++++++++--------- .../esp/src/portable-shell/portable_editor.h | 126 ++++- .../esp/src/portable-shell/portable_meter.h | 166 +++++++ .../portable-shell/portable_shell_editor.hpp | 3 + .../esp/src/portable-shell/portable_style.h | 113 ++++- .../portable-shell/portable_table_policy.h | 8 + .../src/portable-shell/portable_terminal.h | 32 +- .../esp/src/portable-shell/portable_undo.h | 45 ++ .../esp/src/portable-shell/portable_util.h | 19 + tests/portable_shell_source_test.mjs | 6 +- tests/shell_tui_test.cpp | 19 +- tests/shell_workspace_test.cpp | 15 +- third_party/portable-shell/source.json | 66 ++- tools/test-shell.ps1 | 8 +- 22 files changed, 1473 insertions(+), 635 deletions(-) create mode 100644 firmware/esp/src/portable-shell/portable_meter.h create mode 100644 firmware/esp/src/portable-shell/portable_table_policy.h create mode 100644 firmware/esp/src/portable-shell/portable_undo.h create mode 100644 firmware/esp/src/portable-shell/portable_util.h diff --git a/docs/FILE-COMPARISON.md b/docs/FILE-COMPARISON.md index a73d350..42b4f16 100644 --- a/docs/FILE-COMPARISON.md +++ b/docs/FILE-COMPARISON.md @@ -4,7 +4,7 @@ Whole-repository superiority is **not established**. This report exposes retaine Routing: 1504 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: 4781 files; 437 complete source-file comparisons; 4344 pending comparisons; 311 compared files with known parity gaps. Header/implementation pairs can describe the same gap. Missing sparse files remain pending. +Inventory: 4785 files; 441 complete source-file comparisons; 4344 pending comparisons; 311 compared files with known parity gaps. Header/implementation pairs can describe the same gap. Missing sparse files remain pending. Every inventoried path, source revision/hash, target/proof file and line, omitted code, disposition and concrete reason is in `file-comparison.csv`. Hash-bound manual decisions are in `file-comparison-evidence.json`. Donor SHA-256 values bind original bytes; target/proof SHA-256 values bind UTF-8 without BOM with LF newlines. Anchors are recomputed into exact line numbers. Test-code presence is not test execution; execution receipts are in `FILE-COMPARISON-RECEIPTS.md`. @@ -18,7 +18,7 @@ Every inventoried path, source revision/hash, target/proof file and line, omitte | esp32WS2811 | 24 | 16 | 8 | 9 | | PCController | 1517 | 119 | 1398 | 107 | | Pealayer | 682 | 66 | 616 | 47 | -| portable-shell | 23 | 23 | 0 | 0 | +| portable-shell | 27 | 27 | 0 | 0 | | PU850-ESP | 109 | 109 | 0 | 96 | | PuzzleBoard | 22 | 22 | 0 | 1 | | RayanLamp | 2349 | 29 | 2320 | 19 | @@ -224,10 +224,10 @@ Verdict: **parity-gap**. Revision: `filesystem-snapshot`. Original-byte SHA-256: Verdict: **scoped-improvement**. Revision: `filesystem-snapshot`. Original-byte SHA-256: `1fd6ae8518b9de9ca62b4f94391c5615056409ace250755e5dc185ba090ceb15`. -- Target: `firmware/esp/src/portable-shell/portable_device_view.hpp:46 [UTF8-LF sha256=38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1; anchor=class DeviceView]`. +- Target: `firmware/esp/src/portable-shell/portable_device_view.hpp:62 [UTF8-LF sha256=fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652; anchor=class DeviceView]`. - Retained: Read the entire loose snippet. VT100 clear/home, bounded row rendering, task inspection intent and interactive command editing are retained by the structured shell TUI rather than pasted into production AVR loop code. - Omitted/replaced code: `top-level task('x')/cancel/add statements and private TaskItem memory dump`. Disposition: **replaced**. Reason: The loose text is not a compilable owner and reaches private scheduler internals. The shell exposes bounded public properties/actions without arbitrary callback addresses or unsafe pasted globals. -- Test-code evidence: `tests/shell_tui_test.cpp:24 [UTF8-LF sha256=650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d; anchor=assert(output.size()<=PS_DEVICE_VIEW_FRAME_BYTES)]`. +- Test-code evidence: `tests/shell_tui_test.cpp:33 [UTF8-LF sha256=1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7; anchor=assert(output.size()<=PS_DEVICE_VIEW_FRAME_BYTES)]`. - Scoped advantage: A bounded navigable TUI with secret redaction and draft ownership replaces non-compilable debug fragments and raw callback-address dumping. - Remaining: Actual serial/Telnet multi-session terminal rendering and hardware-control acceptance remain separate from the host model test. @@ -2889,13 +2889,13 @@ Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. O Verdict: **parity-gap**. Revision: `b0111ae0c80dc34149ea1044de7dd5488920301b`. Original-byte SHA-256: `ecd399e2bf7718f3eb7b62e49f9dd884c0fb179e3d907bd15b238c01d31501e3`. - Target: `desktop/src/terminal_ui.rs:478 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn window(total: usize, visible: usize, cursor: usize)]`. -- Target: `firmware/esp/src/portable-shell/portable_device_table.hpp:233 [UTF8-LF sha256=784b6315a407af641060db4f01e4caf92148bf149389b79d5b5e397946c525a2; anchor=// PCController's logical-row/section-line separation, without heap storage.]`. +- Target: `firmware/esp/src/portable-shell/portable_device_table.hpp:390 [UTF8-LF sha256=37b99ff1e9322f84ec0ccf80893034f545bbc78255ef067a6c0900f1cbed3b73; anchor=// Separate logical rows from section headings without heap storage.]`. - Retained: Actual tableWindow cursor-centred viewport arithmetic is adapted and exhaustively tested across total/visible/cursor cases. Reuses native logical selection/navigation and Unicode column clipping. - Retained: 2026-10-29: also adapt logical control-row versus section-line mapping into the canonical shared event view. Contiguous categories render once as section headings, selection counts only settings, and viewport follows the selected logical row. This closes the grouping portion of the historical omission below; mouse mapping, complete tone semantics and richer specialized editors remain open. - Omitted/replaced code: `Donor gocui DataTable groups/control-tone rendering, visibleLine mouse mapping and richer table columns`. Disposition: **pending**. Reason: Only the viewport math is currently integrated; gocui APIs require crossterm adaptation, while generic groups/tones/mouse and richer settings/mapping editors remain pending. No full donor table parity is claimed. - Test-code evidence: `desktop/src/terminal_ui.rs:1190 [UTF8-LF sha256=762c7ee8137a21fdbd83a40bb776238a6f75b943da35d01073bbff6b2dd64379; anchor=fn actual_donor_table_window_keeps_cursor_in_resized_viewport()]`. - Test-code evidence: `tests/terminal_ui_test.mjs:23 [UTF8-LF sha256=3916ae657e18de899b278509cd0f8fad53886579c9af53deebc6e47cb5ff9b26; anchor=TUI must reject redirected surfaces before contacting a device]`. -- Test-code evidence: `tests/shell_workspace_test.cpp:97 [UTF8-LF sha256=4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84; anchor=s.output.find("Lighting")==s.output.rfind("Lighting")]`. +- Test-code evidence: `tests/shell_workspace_test.cpp:97 [UTF8-LF sha256=2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd; anchor=s.output.find("LIGHTING")==s.output.rfind("LIGHTING")]`. - Scoped advantage: Bounded checkpoint only; no whole-repository superiority or physical acceptance claim. - Remaining: Complete useful omitted behavior and actual terminal/board acceptance; issue #2 remains open. @@ -4285,7 +4285,7 @@ Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b4 - Target: `third_party/portable-shell/README.md:1 [UTF8-LF sha256=dbdd9653cb23ba484160e050ed8c3c409d314b128ec0398620b391334c7bf24c; anchor=# Portable Shell source integration]`. - Retained: Inspected Git mode 120000 and target '.' at the pinned revision; accounted for without creating a recursive reference. - Omitted/replaced code: `CodeQL root symlink to '.'`. Disposition: **not-applicable**. Reason: Environment-specific analysis marker is not shell code; recreating it would introduce self-referential source traversal. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. ### portable-shell: `.gitignore` @@ -4295,7 +4295,7 @@ Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b4 - Target: `third_party/portable-shell/README.md:1 [UTF8-LF sha256=dbdd9653cb23ba484160e050ed8c3c409d314b128ec0398620b391334c7bf24c; anchor=# Portable Shell source integration]`. - Retained: Build/editor artifact exclusions retained in the exact reference snapshot; Pakar keeps its existing repository ignore policy. - Omitted/replaced code: `Global wildcard ignores`. Disposition: **replaced**. Reason: Applying *.exe, *.a and IDE exclusions repo-wide would hide tracked recovery/test assets and existing project policies. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. ### portable-shell: `CHANGELOG.md` @@ -4305,7 +4305,7 @@ Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b4 - Target: `third_party/portable-shell/README.md:1 [UTF8-LF sha256=dbdd9653cb23ba484160e050ed8c3c409d314b128ec0398620b391334c7bf24c; anchor=# Portable Shell source integration]`. - Retained: Read complete historical claims; retained verbatim as donor history, not imported as Pakar release certification. - Omitted/replaced code: `Complete/security/performance claims`. Disposition: **replaced**. Reason: Source inspection shows placeholders and allocation in history/parser; an old claim of zero alerts cannot establish current safety. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. ### portable-shell: `DOCUMENTATION.md` @@ -4316,18 +4316,18 @@ Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b4 - Target: `third_party/portable-shell/README.md:1 [UTF8-LF sha256=dbdd9653cb23ba484160e050ed8c3c409d314b128ec0398620b391334c7bf24c; anchor=# Portable Shell source integration]`. - Retained: Read all API/parameter/transport guidance; retained source documentation with corrected integration guidance. - Omitted/replaced code: `Raw-pointer parameter binding and advertised editable TUI`. Disposition: **replaced**. Reason: Pakar validates durable settings through owner APIs and has a genuinely interactive staged TUI; no second unsafe parameter owner. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. ### portable-shell: `examples/arduino_example.ino` Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46410d`. Original-byte SHA-256: `fe59231f346c7f5d8e44b206c5f1862e4fd71f308e7473fe1723c54bdcc3bcce`. -- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void executeDeviceShell]`. +- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void executeDeviceShell]`. - Target: `firmware/esp/src/TelnetShell.h:8 [UTF8-LF sha256=69b28602442267c2c524cf05660f789725cbdfed3db8ef7ecb088c387a9d9e97; anchor=class LineEditor]`. - Retained: Read complete sample callback/loop pattern. Existing loop-fed editor uses caller-owned output and bounded byte budgets. - Omitted/replaced code: `Direct GPIO sample commands, while(!Serial), analogRead(0) loop`. Disposition: **replaced**. Reason: Arbitrary LED/pin access conflicts with board pin ownership; startup/loop work must not block UART/game scheduling. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. ### portable-shell: `examples/linux_example.c` @@ -4340,7 +4340,7 @@ Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b4 - Retained: Read complete termios raw-mode sample and parameter setup; existing host shell tool retained. - Retained: Completed the host-side TCP/stdin path with hostname resolution, incremental Telnet negotiation, backpressure, bounded batch deadlines, hidden interactive authentication, terminal cleanup and no command replay. Actual loopback tests cover success/rejection/auth-required/timeout and interactive disconnect. Existing framed USB and board-side Telnet/TUI remain the real owners. - Omitted/replaced code: `POSIX-only sample, stop-as-reboot and fake all-operational status`. Disposition: **replaced**. Reason: Use the existing device client/owned USB transport rather than a disconnected demo process or false status. Runtime behavior cannot be fabricated. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Test-code evidence: `tests/telnet_client_test.mjs:19 [UTF8-LF sha256=6d38cafbcf7c44ce351f1b70691dfda3c57132134c2aea52a5abe18f43d00f42; anchor=async function session]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. @@ -4348,12 +4348,12 @@ Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b4 Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46410d`. Original-byte SHA-256: `779a8e30dba97d85f24e2d3a76d7b3d1a3aeeb4b8066682d90bfdc5bcb0f4295`. -- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void executeDeviceShell]`. +- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void executeDeviceShell]`. - Target: `tools/telnet-shell.mjs:49 [UTF8-LF sha256=85d7ea67800b3ea887d9515b37760a5bca81a4a1827afaffe415fb627869f812; anchor=export function connectShell]`. - Retained: Read entire skeleton; preserved as reference, not wired into production. - Retained: Completed the host-side TCP/stdin path with hostname resolution, incremental Telnet negotiation, backpressure, bounded batch deadlines, hidden interactive authentication, terminal cleanup and no command replay. Actual loopback tests cover success/rejection/auth-required/timeout and interactive disconnect. Existing framed USB and board-side Telnet/TUI remain the real owners. - Omitted/replaced code: `Printed server banner and unimplemented bind/accept/session loop`. Disposition: **replaced**. Reason: Pakar already has actual bounded multi-session Telnet admission, authentication and network lifecycle. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Test-code evidence: `tests/telnet_client_test.mjs:19 [UTF8-LF sha256=6d38cafbcf7c44ce351f1b70691dfda3c57132134c2aea52a5abe18f43d00f42; anchor=async function session]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. @@ -4361,56 +4361,65 @@ Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b4 Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46410d`. Original-byte SHA-256: `d024ffc22f99a7c9f50fa68bbaf02b0e722d68b0edaf39512454643e6f1986e2`. -- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void executeDeviceShell]`. +- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void executeDeviceShell]`. - Target: `third_party/portable-shell/README.md:1 [UTF8-LF sha256=dbdd9653cb23ba484160e050ed8c3c409d314b128ec0398620b391334c7bf24c; anchor=# Portable Shell source integration]`. - Retained: Read each asserted requirement and reconciled against actual donor code rather than trusting completion checkmarks. - Omitted/replaced code: `Thread-safe variable and full editor completeness claims`. Disposition: **replaced**. Reason: No synchronization exists for raw pointers; editor only prints and waits. Existing loop ownership and staged TUI retained. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. ### portable-shell: `include/portable_device_table.hpp` -Verdict: **equivalent-file**. Revision: `e90ffc004b39912e21a1799a75061ac61f22c74f`. Original-byte SHA-256: `784b6315a407af641060db4f01e4caf92148bf149389b79d5b5e397946c525a2`. +Verdict: **equivalent-file**. Revision: `3a7eeba179c238226deef1b64e3bd3b86c4e12e7`. Original-byte SHA-256: `37b99ff1e9322f84ec0ccf80893034f545bbc78255ef067a6c0900f1cbed3b73`. -- Target: `firmware/esp/src/portable-shell/portable_device_table.hpp:194 [UTF8-LF sha256=784b6315a407af641060db4f01e4caf92148bf149389b79d5b5e397946c525a2; anchor=renderTable]`. -- Retained: Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing. +- Target: `firmware/esp/src/portable-shell/portable_device_table.hpp:1 [UTF8-LF sha256=37b99ff1e9322f84ec0ccf80893034f545bbc78255ef067a6c0900f1cbed3b73; anchor=tableCapacity]`. +- Retained: Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork. - No production-code omission claimed for this reviewed file. -- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=Consumer must use canonical components]`. -- Test-code evidence: `tests/shell_workspace_test.cpp:119 [UTF8-LF sha256=4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84; anchor=Actual workspace binding]`. -- Remaining: Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration. +- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=Consumer must use canonical components]`. +- Test-code evidence: `tests/shell_workspace_test.cpp:122 [UTF8-LF sha256=2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd; anchor=Actual workspace binding]`. +- Remaining: Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration. ### portable-shell: `include/portable_device_view.hpp` -Verdict: **equivalent-file**. Revision: `e90ffc004b39912e21a1799a75061ac61f22c74f`. Original-byte SHA-256: `38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1`. +Verdict: **equivalent-file**. Revision: `3a7eeba179c238226deef1b64e3bd3b86c4e12e7`. Original-byte SHA-256: `fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652`. -- Target: `firmware/esp/src/portable-shell/portable_device_view.hpp:46 [UTF8-LF sha256=38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1; anchor=class DeviceView]`. -- Retained: Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing. +- Target: `firmware/esp/src/portable-shell/portable_device_view.hpp:2 [UTF8-LF sha256=fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652; anchor=#ifndef]`. +- Retained: Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork. - No production-code omission claimed for this reviewed file. -- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=Consumer must use canonical components]`. -- Test-code evidence: `tests/shell_workspace_test.cpp:119 [UTF8-LF sha256=4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84; anchor=Actual workspace binding]`. -- Remaining: Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration. +- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=Consumer must use canonical components]`. +- Test-code evidence: `tests/shell_workspace_test.cpp:122 [UTF8-LF sha256=2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd; anchor=Actual workspace binding]`. +- Remaining: Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration. ### portable-shell: `include/portable_editor.h` -Verdict: **equivalent-file**. Revision: `e90ffc004b39912e21a1799a75061ac61f22c74f`. Original-byte SHA-256: `1187b7714998afaa5a045f333c50ce3081de846c6c9b0d9b41b8186723bb48ea`. +Verdict: **equivalent-file**. Revision: `3a7eeba179c238226deef1b64e3bd3b86c4e12e7`. Original-byte SHA-256: `00bd8c83ae9d7ad8fdc3ae963e37acabf0b3f93096758f0294cdebed2f11cbd3`. -- Target: `firmware/esp/src/portable-shell/portable_editor.h:302 [UTF8-LF sha256=1187b7714998afaa5a045f333c50ce3081de846c6c9b0d9b41b8186723bb48ea; anchor=static inline int ps_editor_feed]`. -- Retained: Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing. +- Target: `firmware/esp/src/portable-shell/portable_editor.h:1 [UTF8-LF sha256=00bd8c83ae9d7ad8fdc3ae963e37acabf0b3f93096758f0294cdebed2f11cbd3; anchor=#ifndef]`. +- Retained: Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork. - No production-code omission claimed for this reviewed file. -- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=Consumer must use canonical components]`. -- Test-code evidence: `tests/shell_workspace_test.cpp:119 [UTF8-LF sha256=4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84; anchor=Actual workspace binding]`. -- Remaining: Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration. +- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=Consumer must use canonical components]`. +- Test-code evidence: `tests/shell_workspace_test.cpp:122 [UTF8-LF sha256=2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd; anchor=Actual workspace binding]`. +- Remaining: Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration. + +### portable-shell: `include/portable_meter.h` + +Verdict: **equivalent-file**. Revision: `3a7eeba179c238226deef1b64e3bd3b86c4e12e7`. Original-byte SHA-256: `48350a03fd496aaf50bf47149f8a099d7d07de9175024ef43a917e0a7cf53f1d`. + +- Target: `firmware/esp/src/portable-shell/portable_meter.h:1 [UTF8-LF sha256=48350a03fd496aaf50bf47149f8a099d7d07de9175024ef43a917e0a7cf53f1d; anchor=#ifndef]`. +- Retained: Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork. +- No production-code omission claimed for this reviewed file. +- Remaining: Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration. ### portable-shell: `include/portable_shell_editor.hpp` -Verdict: **equivalent-file**. Revision: `e90ffc004b39912e21a1799a75061ac61f22c74f`. Original-byte SHA-256: `9bf1a3b590217b8b1cc6562fbd681f9a71af9d761f057ac10585f597d3e11ff5`. +Verdict: **equivalent-file**. Revision: `3a7eeba179c238226deef1b64e3bd3b86c4e12e7`. Original-byte SHA-256: `1289e6667828d637042de29b31941427d8a9f222c3a7c967fd751f3b0c7ba7c3`. -- Target: `firmware/esp/src/portable-shell/portable_shell_editor.hpp:81 [UTF8-LF sha256=9bf1a3b590217b8b1cc6562fbd681f9a71af9d761f057ac10585f597d3e11ff5; anchor=class LineEditor]`. -- Retained: Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing. +- Target: `firmware/esp/src/portable-shell/portable_shell_editor.hpp:1 [UTF8-LF sha256=1289e6667828d637042de29b31941427d8a9f222c3a7c967fd751f3b0c7ba7c3; anchor=#ifndef]`. +- Retained: Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork. - No production-code omission claimed for this reviewed file. -- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=Consumer must use canonical components]`. -- Test-code evidence: `tests/shell_workspace_test.cpp:119 [UTF8-LF sha256=4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84; anchor=Actual workspace binding]`. -- Remaining: Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration. +- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=Consumer must use canonical components]`. +- Test-code evidence: `tests/shell_workspace_test.cpp:122 [UTF8-LF sha256=2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd; anchor=Actual workspace binding]`. +- Remaining: Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration. ### portable-shell: `include/portable_shell.h` @@ -4418,47 +4427,74 @@ Verdict: **scoped-improvement**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46 - Target: `firmware/esp/src/PortableShellCore.h:17 [UTF8-LF sha256=23ec970b7349e0eb29fbc420e5e8973461f46d0c4be70c141e0ee0bacbf6ace7; anchor=struct Command]`. - Target: `firmware/esp/src/TelnetShell.h:8 [UTF8-LF sha256=69b28602442267c2c524cf05660f789725cbdfed3db8ef7ecb088c387a9d9e97; anchor=class LineEditor]`. -- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void executeDeviceShell]`. +- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void executeDeviceShell]`. - Retained: Adapted PSCommand name/help model and portable callback output into immutable command catalogue/Terminal; independent session state remains in LineEditor. - Omitted/replaced code: `Heap-linked arbitrary register/unregister, Arduino bool/HIGH/LOW macros, raw mutable parameter pointers`. Disposition: **replaced**. Reason: Build-time immutable descriptors prevent dangling name/callback ownership and duplicate registrations; C++ types remain intact; settings go through validation. - Test-code evidence: `tests/portable_shell_test.cpp:8 [UTF8-LF sha256=1ce65230a875baf56a04184dc7b586cc7c15946b2fb066b12453759a84afb31f; anchor=int main()]`. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Scoped advantage: Actual command/VT100 integration preserves bounded authenticated owners and adds tested, non-executing command/property completion instead of a Tab bell placeholder. Device TUI adds Unicode frame bytes, bounded NAWS/TTYPE-aware layout, session terminal preferences and role-gated game actions/settings. Full Unicode entry, grapheme/RTL layout, CHARSET negotiation, advanced presentation override editing and live acceptance remain issue #29 work. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. ### portable-shell: `include/portable_style.h` -Verdict: **equivalent-file**. Revision: `e90ffc004b39912e21a1799a75061ac61f22c74f`. Original-byte SHA-256: `d86b758b8d8509667ee5e8a49b9ab8319b8961b32923f89b89ea3d23e3db0e11`. +Verdict: **equivalent-file**. Revision: `3a7eeba179c238226deef1b64e3bd3b86c4e12e7`. Original-byte SHA-256: `a29a3338b6ee4523fc394adeb496146f82840c931b4ac7035e52502bf9ce3f6e`. + +- Target: `firmware/esp/src/portable-shell/portable_style.h:1 [UTF8-LF sha256=a29a3338b6ee4523fc394adeb496146f82840c931b4ac7035e52502bf9ce3f6e; anchor=#ifndef]`. +- Retained: Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork. +- No production-code omission claimed for this reviewed file. +- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=Consumer must use canonical components]`. +- Test-code evidence: `tests/shell_workspace_test.cpp:122 [UTF8-LF sha256=2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd; anchor=Actual workspace binding]`. +- Remaining: Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration. + +### portable-shell: `include/portable_table_policy.h` + +Verdict: **equivalent-file**. Revision: `3a7eeba179c238226deef1b64e3bd3b86c4e12e7`. Original-byte SHA-256: `eed0e170b4b80284b0cbbda87c7998480ec6d4040192d0402ca5af112ddfec04`. -- Target: `firmware/esp/src/portable-shell/portable_style.h:15 [UTF8-LF sha256=d86b758b8d8509667ee5e8a49b9ab8319b8961b32923f89b89ea3d23e3db0e11; anchor=ps_style_ink]`. -- Retained: Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing. +- Target: `firmware/esp/src/portable-shell/portable_table_policy.h:1 [UTF8-LF sha256=eed0e170b4b80284b0cbbda87c7998480ec6d4040192d0402ca5af112ddfec04; anchor=#ifndef]`. +- Retained: Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork. - No production-code omission claimed for this reviewed file. -- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=Consumer must use canonical components]`. -- Test-code evidence: `tests/shell_workspace_test.cpp:119 [UTF8-LF sha256=4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84; anchor=Actual workspace binding]`. -- Remaining: Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration. +- Remaining: Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration. ### portable-shell: `include/portable_terminal.h` -Verdict: **equivalent-file**. Revision: `e90ffc004b39912e21a1799a75061ac61f22c74f`. Original-byte SHA-256: `356dea61f6096e06a6328691d8f919c2dc582086f2234714cf5efbb4ffef79e1`. +Verdict: **equivalent-file**. Revision: `3a7eeba179c238226deef1b64e3bd3b86c4e12e7`. Original-byte SHA-256: `93bed5802f25a474daed05338817b37b141a400f553a3ba5c7ca3857e1faeaf0`. + +- Target: `firmware/esp/src/portable-shell/portable_terminal.h:1 [UTF8-LF sha256=93bed5802f25a474daed05338817b37b141a400f553a3ba5c7ca3857e1faeaf0; anchor=#ifndef]`. +- Retained: Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork. +- No production-code omission claimed for this reviewed file. +- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=Consumer must use canonical components]`. +- Test-code evidence: `tests/shell_workspace_test.cpp:122 [UTF8-LF sha256=2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd; anchor=Actual workspace binding]`. +- Remaining: Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration. + +### portable-shell: `include/portable_undo.h` + +Verdict: **equivalent-file**. Revision: `3a7eeba179c238226deef1b64e3bd3b86c4e12e7`. Original-byte SHA-256: `adf67d72d371b0e15fb1be3c64dfdea5155840b55a23a987be5807437fed9be0`. + +- Target: `firmware/esp/src/portable-shell/portable_undo.h:1 [UTF8-LF sha256=adf67d72d371b0e15fb1be3c64dfdea5155840b55a23a987be5807437fed9be0; anchor=#ifndef]`. +- Retained: Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork. +- No production-code omission claimed for this reviewed file. +- Remaining: Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration. + +### portable-shell: `include/portable_util.h` + +Verdict: **equivalent-file**. Revision: `3a7eeba179c238226deef1b64e3bd3b86c4e12e7`. Original-byte SHA-256: `568c68488cc8821e694b2ba576f138dc4d0d6f8f9970e83b99188b7727014256`. -- Target: `firmware/esp/src/portable-shell/portable_terminal.h:371 [UTF8-LF sha256=356dea61f6096e06a6328691d8f919c2dc582086f2234714cf5efbb4ffef79e1; anchor=static inline int ps_telnet_feed]`. -- Retained: Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing. +- Target: `firmware/esp/src/portable-shell/portable_util.h:1 [UTF8-LF sha256=568c68488cc8821e694b2ba576f138dc4d0d6f8f9970e83b99188b7727014256; anchor=#ifndef]`. +- Retained: Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork. - No production-code omission claimed for this reviewed file. -- Test-code evidence: `tests/portable_shell_source_test.mjs:33 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=Consumer must use canonical components]`. -- Test-code evidence: `tests/shell_workspace_test.cpp:119 [UTF8-LF sha256=4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84; anchor=Actual workspace binding]`. -- Remaining: Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration. +- Remaining: Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration. ### portable-shell: `include/ps_io.h` Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46410d`. Original-byte SHA-256: `024a3ac2231b9b76b3a558a7f81406b5660ba7694c4f9e2f9b7caa585f05bcb1`. -- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void executeDeviceShell]`. +- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void executeDeviceShell]`. - Target: `firmware/esp/src/ShellWire.h:9 [UTF8-LF sha256=af3f23d908310dd349b0c90d1fc4385a212e6439b10c72f8dc2f37dace4b5216; anchor=class SerialChannel]`. - Target: `tools/telnet-shell.mjs:49 [UTF8-LF sha256=85d7ea67800b3ea887d9515b37760a5bca81a4a1827afaffe415fb627869f812; anchor=export function connectShell]`. - Retained: Read callback/context contracts; preserved per-session transport-independent output and existing explicit USB ownership. - Retained: Completed the host-side TCP/stdin path with hostname resolution, incremental Telnet negotiation, backpressure, bounded batch deadlines, hidden interactive authentication, terminal cleanup and no command replay. Actual loopback tests cover success/rejection/auth-required/timeout and interactive disconnect. Existing framed USB and board-side Telnet/TUI remain the real owners. - Omitted/replaced code: `New PSSocketContext/PSUdpContext/PSSerialContext and undefined stdio initializer`. Disposition: **replaced**. Reason: Existing WiFiClient/SerialChannel owners already provide the real transports with authentication and replay fencing; no duplicate socket or serial owner. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Test-code evidence: `tests/telnet_client_test.mjs:19 [UTF8-LF sha256=6d38cafbcf7c44ce351f1b70691dfda3c57132134c2aea52a5abe18f43d00f42; anchor=async function session]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. @@ -4470,18 +4506,18 @@ Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b4 - Target: `firmware/esp/src/PortableShellCore.h:17 [UTF8-LF sha256=23ec970b7349e0eb29fbc420e5e8973461f46d0c4be70c141e0ee0bacbf6ace7; anchor=struct Command]`. - Retained: MIT copyright and complete license retained with original source; derived header points to this notice. - No production-code omission claimed for this reviewed file. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. ### portable-shell: `Makefile` Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46410d`. Original-byte SHA-256: `e9d0814b7f08de2a7f53d004192a60cb329652e7b745bdee379144373cb26f4f`. -- Target: `tools/test-shell.ps1:8 [UTF8-LF sha256=51673e6f5ae86036a7a439214e3e456a0b8dab6f4dc17485e1244ca862174967; anchor=foreach($taskName]`. +- Target: `tools/test-shell.ps1:8 [UTF8-LF sha256=fcd706a22bf195f86ca43954692430a199ddb4f9375dc68801160e240f65c87d; anchor=foreach($taskName]`. - Target: `third_party/portable-shell/README.md:1 [UTF8-LF sha256=dbdd9653cb23ba484160e050ed8c3c409d314b128ec0398620b391334c7bf24c; anchor=# Portable Shell source integration]`. - Retained: Read full targets and retained upstream build recipe as reference. Tests integrated into the existing guarded native runner. - Omitted/replaced code: `Separate donor make clean/install/uninstall and -g profile`. Disposition: **replaced**. Reason: No second build cache or uncontrolled system installation; existing cross-platform canonical low-write test/build wrappers remain authoritative. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. ### portable-shell: `README.md` @@ -4491,7 +4527,7 @@ Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b4 - Target: `third_party/portable-shell/README.md:1 [UTF8-LF sha256=dbdd9653cb23ba484160e050ed8c3c409d314b128ec0398620b391334c7bf24c; anchor=# Portable Shell source integration]`. - Retained: Read entire requested branch README, including API examples and completed plan. Useful capabilities mapped to actual compiled owners. - Omitted/replaced code: `Production-ready/comprehensive claims and example server instructions`. Disposition: **replaced**. Reason: Examples and tests do not implement promised transport/editor behaviors; integration guide records inspected limitations explicitly. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. ### portable-shell: `src/portable_shell.c` @@ -4500,14 +4536,14 @@ Verdict: **scoped-improvement**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46 - Target: `firmware/esp/src/PortableShellCore.h:17 [UTF8-LF sha256=23ec970b7349e0eb29fbc420e5e8973461f46d0c4be70c141e0ee0bacbf6ace7; anchor=struct Command]`. - Target: `firmware/esp/src/TelnetShell.h:8 [UTF8-LF sha256=69b28602442267c2c524cf05660f789725cbdfed3db8ef7ecb088c387a9d9e97; anchor=class LineEditor]`. -- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void executeDeviceShell]`. -- Target: `firmware/esp/src/portable-shell/portable_device_view.hpp:46 [UTF8-LF sha256=38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1; anchor=class DeviceView]`. +- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void executeDeviceShell]`. +- Target: `firmware/esp/src/portable-shell/portable_device_view.hpp:62 [UTF8-LF sha256=fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652; anchor=class DeviceView]`. - Target: `firmware/esp/src/ShellLabels.h:5 [UTF8-LF sha256=3ea98be287d73a0188be5295a707d09bb66ad780f81d23554420245979b133cf; anchor=inline const char* propertyLabel]`. - Target: `firmware/esp/src/ShellToneCommand.h:8 [UTF8-LF sha256=4bcb091529777d891c2f435724ef9531d4417f098ecb5ee2914d1e16d7e55a7a; anchor=inline bool toneCommand]`. - Retained: Adapted strcmp command lookup and name/help metadata into the compiled catalogue; expanded Tab placeholder into safe completion plus descriptor-only muted suggestions accepted by Right/End, role-filtered grouped/wrapped Usage and a real validated finite beep route. TUI labels are presentation names, not changed API keys. - Omitted/replaced code: `ps_create/destroy/run, heap history, strtok argv, synchronous escape reads, raw-pointer atoi/atof setters, blocking edit loop`. Disposition: **replaced**. Reason: Existing fixed/scrubbed history, incremental parser, output backpressure, property validation and staged TUI prevent allocation failures, secret retention, truncated execution and blocking LED/UART work. - Test-code evidence: `tests/portable_shell_test.cpp:8 [UTF8-LF sha256=1ce65230a875baf56a04184dc7b586cc7c15946b2fb066b12453759a84afb31f; anchor=int main()]`. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Test-code evidence: `tests/shell_tone_dispatch_test.mjs:49 [UTF8-LF sha256=39e1e5a861b30040d05652b476789f6d3e6375c42d8ba535d6bf95be042612e2; anchor=Actual beep-to-buzzer-to-AVR branch]`. - Scoped advantage: Actual command/VT100 integration preserves bounded authenticated owners and adds tested, non-executing command/property completion instead of a Tab bell placeholder. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. @@ -4516,13 +4552,13 @@ Verdict: **scoped-improvement**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46 Verdict: **equivalent-behavior**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46410d`. Original-byte SHA-256: `1eb80f98d09fb1042fee3f5facb9dfc3813962b0645c05307c701064aa6e6df6`. -- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void executeDeviceShell]`. +- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void executeDeviceShell]`. - Target: `firmware/esp/src/ShellWire.h:9 [UTF8-LF sha256=af3f23d908310dd349b0c90d1fc4385a212e6439b10c72f8dc2f37dace4b5216; anchor=class SerialChannel]`. - Target: `tools/telnet-shell.mjs:49 [UTF8-LF sha256=85d7ea67800b3ea887d9515b37760a5bca81a4a1827afaffe415fb627869f812; anchor=export function connectShell]`. - Retained: Read all TCP/UDP/serial implementation; preserved original for review. Existing actual nonblocking Telnet and encapsulated USB remain single transport owners. - Retained: Completed the host-side TCP/stdin path with hostname resolution, incremental Telnet negotiation, backpressure, bounded batch deadlines, hidden interactive authentication, terminal cleanup and no command replay. Actual loopback tests cover success/rejection/auth-required/timeout and interactive disconnect. Existing framed USB and board-side Telnet/TUI remain the real owners. - Omitted/replaced code: `Blocking IPv4-only connect/recv, single partial send, unconnected UDP replies, serial init=-1 and no-op close`. Disposition: **replaced**. Reason: Avoid loop stalls, dropped output, invalid UDP destinations and fake serial support; hostname-first discovery and binary recovery are already shared project facilities. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Test-code evidence: `tests/telnet_client_test.mjs:19 [UTF8-LF sha256=6d38cafbcf7c44ce351f1b70691dfda3c57132134c2aea52a5abe18f43d00f42; anchor=async function session]`. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. @@ -4532,11 +4568,11 @@ Verdict: **scoped-improvement**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46 - Target: `firmware/esp/src/PortableShellCore.h:17 [UTF8-LF sha256=23ec970b7349e0eb29fbc420e5e8973461f46d0c4be70c141e0ee0bacbf6ace7; anchor=struct Command]`. - Target: `firmware/esp/src/TelnetShell.h:8 [UTF8-LF sha256=69b28602442267c2c524cf05660f789725cbdfed3db8ef7ecb088c387a9d9e97; anchor=class LineEditor]`. -- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void executeDeviceShell]`. +- Target: `firmware/esp/src/ShellService.h:197 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void executeDeviceShell]`. - Retained: Adapted actual ANSI clear/line/cursor/color/reset formatting into bounded callback emitters and used them by the live LineEditor and clear command. - Omitted/replaced code: `Unbounded signed cursor/color formatting and unused standalone cursor-home/right wrappers`. Disposition: **replaced**. Reason: Validate coordinate/SGR ranges; existing editor retains echo-free password handling, plain-terminal behavior and movement semantics without duplicated control owners. - Test-code evidence: `tests/portable_shell_test.cpp:8 [UTF8-LF sha256=1ce65230a875baf56a04184dc7b586cc7c15946b2fb066b12453759a84afb31f; anchor=int main()]`. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Scoped advantage: Actual command/VT100 integration preserves bounded authenticated owners and adds tested, non-executing command/property completion instead of a Tab bell placeholder. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. @@ -4545,11 +4581,11 @@ Verdict: **scoped-improvement**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46 Verdict: **scoped-improvement**. Revision: `67c5dcb8a63f4055cbdaf02e9ff271c53b46410d`. Original-byte SHA-256: `f26c767cd4ab7471a586b3b1500f9a613cc0ce00ac3f0ad23733e0c04af526eb`. - Target: `tests/portable_shell_test.cpp:8 [UTF8-LF sha256=1ce65230a875baf56a04184dc7b586cc7c15946b2fb066b12453759a84afb31f; anchor=int main()]`. -- Target: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Target: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Retained: Read all eight donor test scenarios; retained original tests and adapted independent-context, built-in, command-lookup, line-edit and VT100 output assertions into production-header fixtures. - Omitted/replaced code: `Mock no-crash checks as completeness evidence`. Disposition: **replaced**. Reason: New tests assert exact bytes, safe aliases, bounds, password isolation, ambiguous/property completion and fragmented escape handling, alongside existing history/TUI/USB/lease tests. - Test-code evidence: `tests/portable_shell_test.cpp:8 [UTF8-LF sha256=1ce65230a875baf56a04184dc7b586cc7c15946b2fb066b12453759a84afb31f; anchor=int main()]`. -- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773; anchor=const source=]`. +- Test-code evidence: `tests/portable_shell_source_test.mjs:5 [UTF8-LF sha256=52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea; anchor=const source=]`. - Scoped advantage: Actual command/VT100 integration preserves bounded authenticated owners and adds tested, non-executing command/property completion instead of a Tab bell placeholder. - Remaining: Issue #29: source/fixture acceptance only; no production flash or live USB/Telnet session acceptance in this integration task. @@ -4957,8 +4993,8 @@ Verdict: **scoped-improvement**. Revision: `431104072952f694a35b3a83c19f13fbb098 Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. Original-byte SHA-256: `5181d7cc83efe2416a3a198ff88aad2aeffc8871ee2ef7a2a1ffdad51d31b88e`. -- Target: `firmware/esp/src/ShellService.h:119 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=bool shellSet(]`. -- Target: `firmware/esp/src/ShellTuiBinding.h:66 [UTF8-LF sha256=fb551fb47f1c32d0b57c1245b2cc701af6265bf927b159bb556983dacd48d1e9; anchor=shellGet(property)]`. +- Target: `firmware/esp/src/ShellService.h:119 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=bool shellSet(]`. +- Target: `firmware/esp/src/ShellTuiBinding.h:66 [UTF8-LF sha256=71a0879a531b26b6058bb25eb13b5f09c8ae3e739a485c4620e37e2495e30d26; anchor=shellGet(property)]`. - Target: `firmware/esp/src/ShellSettings.h:20 [UTF8-LF sha256=9e73a173b820cf54b70e4fc6506bccbb67fee5e4ab600fc9660503d05c491417; anchor=bool configure(]`. - Target: `docs/PU850-PARITY.md:98 [UTF8-LF sha256=90fd0fcaa4c6bfab14639db6e6fa479a2f70729100ed5800edd73020f494d1a3; anchor=## Fresh runtime and shell section review, 2026-10-19]`. - Target: `firmware/esp/src/ShellPixelCommand.h:14 [UTF8-LF sha256=a5a9f5a43035578d904c547848429e71acd68867418c36f7e5fb1d6375ad32e6; anchor=template]`. @@ -4974,7 +5010,7 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O - Omitted/replaced code: `Commented AP_IP/AP_Gateway/AP_Subnet parameter entries`. Disposition: **pending**. Reason: The donor leaves these entries commented out. Pakar station static-address fields are implemented, but independent configurable AP address/gateway/subnet via the shell is not claimed complete. - Test-code evidence: `tests/shell_metadata_test.mjs:11 [UTF8-LF sha256=a2d96c172d01d99f67fee1a7da1b341a2583cbf1c7133bc4308d3b8dfc07f01a; anchor=const start=source.indexOf]`. - Test-code evidence: `tests/shell_wire_test.cpp:29 [UTF8-LF sha256=d3b4221251b6d150bdec3b9a9e78d3506e9d9c123b5699eef2919cc957da8562; anchor=4294967296]`. -- Test-code evidence: `tests/shell_tui_test.cpp:41 [UTF8-LF sha256=650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d; anchor=Readonly never emits Set.]`. +- Test-code evidence: `tests/shell_tui_test.cpp:50 [UTF8-LF sha256=1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7; anchor=Readonly never emits Set.]`. - Test-code evidence: `tests/telnet_shell_test.cpp:88 [UTF8-LF sha256=9554e3744bd58435e52bbc0879ebcb6fe24a965eb9db111e05812d7db8739b62; anchor=!editor.remember(true)]`. - Test-code evidence: `tests/shell_pixel_test.cpp:6 [UTF8-LF sha256=f914cdb8df67ea915d286187b89208be931cfde70cac255a10b30e0d63b05690; anchor=int main()]`. - Test-code evidence: `tests/shell_metadata_test.mjs:8 [UTF8-LF sha256=a2d96c172d01d99f67fee1a7da1b341a2583cbf1c7133bc4308d3b8dfc07f01a; anchor=const tuiKeys=]`. @@ -4987,8 +5023,8 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. Original-byte SHA-256: `48c0deb76d6105090fe1d58a2449427681a88775b1e63ddbb1b28ecff6341961`. -- Target: `firmware/esp/src/ShellService.h:119 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=bool shellSet(]`. -- Target: `firmware/esp/src/ShellTuiBinding.h:66 [UTF8-LF sha256=fb551fb47f1c32d0b57c1245b2cc701af6265bf927b159bb556983dacd48d1e9; anchor=shellGet(property)]`. +- Target: `firmware/esp/src/ShellService.h:119 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=bool shellSet(]`. +- Target: `firmware/esp/src/ShellTuiBinding.h:66 [UTF8-LF sha256=71a0879a531b26b6058bb25eb13b5f09c8ae3e739a485c4620e37e2495e30d26; anchor=shellGet(property)]`. - Target: `firmware/esp/src/ShellSettings.h:20 [UTF8-LF sha256=9e73a173b820cf54b70e4fc6506bccbb67fee5e4ab600fc9660503d05c491417; anchor=bool configure(]`. - Target: `docs/PU850-PARITY.md:98 [UTF8-LF sha256=90fd0fcaa4c6bfab14639db6e6fa479a2f70729100ed5800edd73020f494d1a3; anchor=## Fresh runtime and shell section review, 2026-10-19]`. - Retained: DeviceParameter name/type/read-only/get/set design is adapted to ShellProperty descriptors for hostname/label, network mode/DHCP/static addressing, station SSID/write-only password, MQTT/WebSocket endpoints, telemetry interval, shell settings and LED mode/brightness/effect. @@ -5002,7 +5038,7 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O - Omitted/replaced code: `Commented AP_IP/AP_Gateway/AP_Subnet parameter entries`. Disposition: **pending**. Reason: The donor leaves these entries commented out. Pakar station static-address fields are implemented, but independent configurable AP address/gateway/subnet via the shell is not claimed complete. - Test-code evidence: `tests/shell_metadata_test.mjs:11 [UTF8-LF sha256=a2d96c172d01d99f67fee1a7da1b341a2583cbf1c7133bc4308d3b8dfc07f01a; anchor=const start=source.indexOf]`. - Test-code evidence: `tests/shell_wire_test.cpp:29 [UTF8-LF sha256=d3b4221251b6d150bdec3b9a9e78d3506e9d9c123b5699eef2919cc957da8562; anchor=4294967296]`. -- Test-code evidence: `tests/shell_tui_test.cpp:41 [UTF8-LF sha256=650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d; anchor=Readonly never emits Set.]`. +- Test-code evidence: `tests/shell_tui_test.cpp:50 [UTF8-LF sha256=1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7; anchor=Readonly never emits Set.]`. - Test-code evidence: `tests/telnet_shell_test.cpp:88 [UTF8-LF sha256=9554e3744bd58435e52bbc0879ebcb6fe24a965eb9db111e05812d7db8739b62; anchor=!editor.remember(true)]`. - Scoped advantage: Source comparison and hash-bound fixture references only; deployment, terminal interoperability and hardware acceptance remain pending. - Remaining: Compile and deploy the integrated shell, then prove simultaneous bounded Telnet sessions, AP/station/Ethernet listener and discovery changes, and framed USB recovery alongside normal protocol commands. @@ -5186,7 +5222,7 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O - Target: `docs/PU850-PARITY.md:307 [UTF8-LF sha256=90fd0fcaa4c6bfab14639db6e6fa479a2f70729100ed5800edd73020f494d1a3; anchor=## Exhaustive continuation: foundation slice, 2026-10-19]`. - Target: `firmware/esp/src/ShellRemoteQuery.h:11 [UTF8-LF sha256=d5c21db264e3bc5519ca63c0ff7568183dc5b321ce6a6842468052068449c0e4; anchor=class RemoteQuery]`. -- Target: `firmware/esp/src/ShellService.h:20 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void serviceShellRemoteQuery()]`. +- Target: `firmware/esp/src/ShellService.h:20 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void serviceShellRemoteQuery()]`. - Target: `tools/udp-device-query.mjs:10 [UTF8-LF sha256=1d0c45a2f2f05a2564ed9a80d116fc52c4564e0e79b07cebb09ee8bd872e7e25; anchor=const nonce=]`. - Retained: Every section/function read through EOF: all UDP state/ports; initUdpDebug/UdpService/udpSend/handleUdpReceive/executeCommand; all ServiceEvent cases - Retained: Function-by-function disposition and exact remaining behaviors are recorded in docs/PU850-PARITY.md foundation slice. @@ -5228,7 +5264,7 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O - Target: `firmware/esp/src/TelnetShell.h:8 [UTF8-LF sha256=69b28602442267c2c524cf05660f789725cbdfed3db8ef7ecb088c387a9d9e97; anchor=class LineEditor]`. - Target: `firmware/esp/src/ShellProperties.h:16 [UTF8-LF sha256=7a6cb87cf78a769be09ac82a5d3d3b3912f485b36d98a6676b5320d8b54ed0fa; anchor=static const ShellProperty shellProperties[]]`. - Target: `firmware/esp/src/ShellWire.h:9 [UTF8-LF sha256=af3f23d908310dd349b0c90d1fc4385a212e6439b10c72f8dc2f37dace4b5216; anchor=class SerialChannel]`. -- Target: `firmware/esp/src/ShellTuiBinding.h:3 [UTF8-LF sha256=fb551fb47f1c32d0b57c1245b2cc701af6265bf927b159bb556983dacd48d1e9; anchor=struct ShellTuiSnapshot]`. +- Target: `firmware/esp/src/ShellTuiBinding.h:3 [UTF8-LF sha256=71a0879a531b26b6058bb25eb13b5f09c8ae3e739a485c4620e37e2495e30d26; anchor=struct ShellTuiSnapshot]`. - Target: `tools/device-shell.ps1:8 [UTF8-LF sha256=4e197e3502eb6ef40d2a3df7bdde97ed3c05140c97e06e3d07426232732a9c55; anchor=AutomaticCommandRetry=$false]`. - Target: `firmware/esp/src/SshShellBinding.h:37 [UTF8-LF sha256=a0333d0b81ed2196be82d6ce9e8e643789366f578b65d71a6e2490892382a560; anchor=void serviceSshShell()]`. - Target: `firmware/esp32s3/src/SshTransport.h:31 [UTF8-LF sha256=988641dc923aafab5ec72ce909067455c44faf468bb241d5b15b3bac1bba33d8; anchor=class SshTransport {]`. @@ -5257,8 +5293,8 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O - Test-code evidence: `tests/shell_properties_test.cpp:5 [UTF8-LF sha256=5e82c5c20b2b39fc1efe4def4c4362bded29a81e464ed23fb16b329e98ed037b; anchor=int main()]`. - Test-code evidence: `tests/telnet_shell_test.cpp:105 [UTF8-LF sha256=9554e3744bd58435e52bbc0879ebcb6fe24a965eb9db111e05812d7db8739b62; anchor=editor.redrawEvent(]`. - Test-code evidence: `tests/shell_wire_test.cpp:11 [UTF8-LF sha256=d3b4221251b6d150bdec3b9a9e78d3506e9d9c123b5699eef2919cc957da8562; anchor=C::Duplicate]`. -- Test-code evidence: `tests/shell_tui_test.cpp:32 [UTF8-LF sha256=650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d; anchor=Unchanged Enter is not a write.]`. -- Test-code evidence: `tools/test-shell.ps1:5 [UTF8-LF sha256=51673e6f5ae86036a7a439214e3e456a0b8dab6f4dc17485e1244ca862174967; anchor=-Concern device-shell -Gate]`. +- Test-code evidence: `tests/shell_tui_test.cpp:41 [UTF8-LF sha256=1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7; anchor=Unchanged Enter is not a write.]`. +- Test-code evidence: `tools/test-shell.ps1:5 [UTF8-LF sha256=fcd706a22bf195f86ca43954692430a199ddb4f9375dc68801160e240f65c87d; anchor=-Concern device-shell -Gate]`. - Test-code evidence: `tests/ssh_settings_test.cpp:17 [UTF8-LF sha256=44c6fda6dce749d7302d284c9f8ba1b9919b36fefd4e3e61fd00b665dfdf6ad2; anchor=int main()]`. - Test-code evidence: `tests/ssh_exec_transport_test.cpp:91 [UTF8-LF sha256=615435469fa43f155f61ee84ce5f9fa847503a1f1d36360e963a24949b11a680; anchor=Actual SSH exec transport:]`. - Test-code evidence: `tests/ssh_exec_binding_test.cpp:123 [UTF8-LF sha256=8d5b45f3825a81c91f8af77a263d87c37a4a53ec4f1399fca73f2490df9bbba0; anchor=Actual SSH shell exec binding/dispatcher:]`. @@ -5284,7 +5320,7 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O - Target: `firmware/esp/src/TelnetShell.h:8 [UTF8-LF sha256=69b28602442267c2c524cf05660f789725cbdfed3db8ef7ecb088c387a9d9e97; anchor=class LineEditor]`. - Target: `firmware/esp/src/ShellProperties.h:16 [UTF8-LF sha256=7a6cb87cf78a769be09ac82a5d3d3b3912f485b36d98a6676b5320d8b54ed0fa; anchor=static const ShellProperty shellProperties[]]`. - Target: `firmware/esp/src/ShellWire.h:9 [UTF8-LF sha256=af3f23d908310dd349b0c90d1fc4385a212e6439b10c72f8dc2f37dace4b5216; anchor=class SerialChannel]`. -- Target: `firmware/esp/src/ShellTuiBinding.h:3 [UTF8-LF sha256=fb551fb47f1c32d0b57c1245b2cc701af6265bf927b159bb556983dacd48d1e9; anchor=struct ShellTuiSnapshot]`. +- Target: `firmware/esp/src/ShellTuiBinding.h:3 [UTF8-LF sha256=71a0879a531b26b6058bb25eb13b5f09c8ae3e739a485c4620e37e2495e30d26; anchor=struct ShellTuiSnapshot]`. - Target: `tools/device-shell.ps1:8 [UTF8-LF sha256=4e197e3502eb6ef40d2a3df7bdde97ed3c05140c97e06e3d07426232732a9c55; anchor=AutomaticCommandRetry=$false]`. - Retained: PU ShellSession transport/editor separation, insertion/shift/backspace/delete, CSI/SS3 arrows/home/end, Ctrl-C/Ctrl-L and split CR-LF/CR-NUL behavior are adapted in instance-owned TelnetParser/LineEditor. - Retained: Generic parameter lookup/read-only enforcement and dispatch now map to ShellProperty descriptors, typed shellSet and the existing Pakar command/configuration owners; the same descriptors feed the device TUI. @@ -5300,8 +5336,8 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O - Test-code evidence: `tests/shell_properties_test.cpp:5 [UTF8-LF sha256=5e82c5c20b2b39fc1efe4def4c4362bded29a81e464ed23fb16b329e98ed037b; anchor=int main()]`. - Test-code evidence: `tests/telnet_shell_test.cpp:105 [UTF8-LF sha256=9554e3744bd58435e52bbc0879ebcb6fe24a965eb9db111e05812d7db8739b62; anchor=editor.redrawEvent(]`. - Test-code evidence: `tests/shell_wire_test.cpp:11 [UTF8-LF sha256=d3b4221251b6d150bdec3b9a9e78d3506e9d9c123b5699eef2919cc957da8562; anchor=C::Duplicate]`. -- Test-code evidence: `tests/shell_tui_test.cpp:32 [UTF8-LF sha256=650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d; anchor=Unchanged Enter is not a write.]`. -- Test-code evidence: `tools/test-shell.ps1:5 [UTF8-LF sha256=51673e6f5ae86036a7a439214e3e456a0b8dab6f4dc17485e1244ca862174967; anchor=-Concern device-shell -Gate]`. +- Test-code evidence: `tests/shell_tui_test.cpp:41 [UTF8-LF sha256=1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7; anchor=Unchanged Enter is not a write.]`. +- Test-code evidence: `tools/test-shell.ps1:5 [UTF8-LF sha256=fcd706a22bf195f86ca43954692430a199ddb4f9375dc68801160e240f65c87d; anchor=-Concern device-shell -Gate]`. - Scoped advantage: Source comparison and hash-bound fixture references only; deployment, terminal interoperability and hardware acceptance remain pending. - Remaining: Compile and deploy the integrated shell, then prove simultaneous bounded Telnet sessions, AP/station/Ethernet listener and discovery changes, and framed USB recovery alongside normal protocol commands. - Remaining: Exercise authentication changes, disconnect/reconnect, slow-reader backpressure and maintenance exclusion on the actual board; an immediate OK/queued command is not proof of AVR execution or physical LED/display/audio success. @@ -5362,7 +5398,7 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. Original-byte SHA-256: `a78d88c149d19d8989c6db3dce0731189c2bf46c45fd64b73e9871a80f6c9bdd`. - Target: `firmware/esp/src/TelnetShell.h:7 [UTF8-LF sha256=69b28602442267c2c524cf05660f789725cbdfed3db8ef7ecb088c387a9d9e97; anchor=class TelnetParser]`. -- Target: `firmware/esp/src/ShellService.h:450 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void serviceDeviceShells()]`. +- Target: `firmware/esp/src/ShellService.h:450 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void serviceDeviceShells()]`. - Target: `firmware/esp/src/ShellSettings.h:10 [UTF8-LF sha256=9e73a173b820cf54b70e4fc6506bccbb67fee5e4ab600fc9660503d05c491417; anchor=class ShellSettings]`. - Target: `firmware/esp/src/ShellBuild.h:5 [UTF8-LF sha256=64e2f53b7c399cd564fc41f942af57433a9baf3e0362190e138bd5a6f0ce4ce5; anchor=PAKAR_TELNET_SESSIONS]`. - Retained: Actual five-state IAC/option/subnegotiation parser, escaped IAC, server ECHO/SGA greeting and unsupported-option rejection are retained. Option state suppresses greeting-ACK negotiation loops. @@ -5377,7 +5413,7 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O - Test-code evidence: `tests/telnet_shell_test.cpp:18 [UTF8-LF sha256=9554e3744bd58435e52bbc0879ebcb6fe24a965eb9db111e05812d7db8739b62; anchor=No negotiation loops on greeting acknowledgements.]`. - Test-code evidence: `tests/shell_wire_test.cpp:34 [UTF8-LF sha256=d3b4221251b6d150bdec3b9a9e78d3506e9d9c123b5699eef2919cc957da8562; anchor=fs.failRename=true]`. - Test-code evidence: `tests/shell_wire_test.cpp:36 [UTF8-LF sha256=d3b4221251b6d150bdec3b9a9e78d3506e9d9c123b5699eef2919cc957da8562; anchor=!corrupt.enabled()]`. -- Test-code evidence: `tools/test-shell.ps1:5 [UTF8-LF sha256=51673e6f5ae86036a7a439214e3e456a0b8dab6f4dc17485e1244ca862174967; anchor=-Concern device-shell -Gate]`. +- Test-code evidence: `tools/test-shell.ps1:5 [UTF8-LF sha256=fcd706a22bf195f86ca43954692430a199ddb4f9375dc68801160e240f65c87d; anchor=-Concern device-shell -Gate]`. - Scoped advantage: Source comparison and hash-bound fixture references only; deployment, terminal interoperability and hardware acceptance remain pending. - Remaining: Compile and deploy the integrated shell, then prove simultaneous bounded Telnet sessions, AP/station/Ethernet listener and discovery changes, and framed USB recovery alongside normal protocol commands. - Remaining: Exercise authentication changes, disconnect/reconnect, slow-reader backpressure and maintenance exclusion on the actual board; an immediate OK/queued command is not proof of AVR execution or physical LED/display/audio success. @@ -5387,7 +5423,7 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. Original-byte SHA-256: `e85f5f1a4f2767323d9886313ddb2aabfd3acad7d781c2770bc8d2b2d2c6cb15`. - Target: `firmware/esp/src/TelnetShell.h:7 [UTF8-LF sha256=69b28602442267c2c524cf05660f789725cbdfed3db8ef7ecb088c387a9d9e97; anchor=class TelnetParser]`. -- Target: `firmware/esp/src/ShellService.h:450 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void serviceDeviceShells()]`. +- Target: `firmware/esp/src/ShellService.h:450 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void serviceDeviceShells()]`. - Target: `firmware/esp/src/ShellSettings.h:10 [UTF8-LF sha256=9e73a173b820cf54b70e4fc6506bccbb67fee5e4ab600fc9660503d05c491417; anchor=class ShellSettings]`. - Target: `firmware/esp/src/ShellBuild.h:5 [UTF8-LF sha256=64e2f53b7c399cd564fc41f942af57433a9baf3e0362190e138bd5a6f0ce4ce5; anchor=PAKAR_TELNET_SESSIONS]`. - Retained: Actual five-state IAC/option/subnegotiation parser, escaped IAC, server ECHO/SGA greeting and unsupported-option rejection are retained. Option state suppresses greeting-ACK negotiation loops. @@ -5402,7 +5438,7 @@ Verdict: **parity-gap**. Revision: `431104072952f694a35b3a83c19f13fbb098ca5b`. O - Test-code evidence: `tests/telnet_shell_test.cpp:18 [UTF8-LF sha256=9554e3744bd58435e52bbc0879ebcb6fe24a965eb9db111e05812d7db8739b62; anchor=No negotiation loops on greeting acknowledgements.]`. - Test-code evidence: `tests/shell_wire_test.cpp:34 [UTF8-LF sha256=d3b4221251b6d150bdec3b9a9e78d3506e9d9c123b5699eef2919cc957da8562; anchor=fs.failRename=true]`. - Test-code evidence: `tests/shell_wire_test.cpp:36 [UTF8-LF sha256=d3b4221251b6d150bdec3b9a9e78d3506e9d9c123b5699eef2919cc957da8562; anchor=!corrupt.enabled()]`. -- Test-code evidence: `tools/test-shell.ps1:5 [UTF8-LF sha256=51673e6f5ae86036a7a439214e3e456a0b8dab6f4dc17485e1244ca862174967; anchor=-Concern device-shell -Gate]`. +- Test-code evidence: `tools/test-shell.ps1:5 [UTF8-LF sha256=fcd706a22bf195f86ca43954692430a199ddb4f9375dc68801160e240f65c87d; anchor=-Concern device-shell -Gate]`. - Scoped advantage: Source comparison and hash-bound fixture references only; deployment, terminal interoperability and hardware acceptance remain pending. - Remaining: Compile and deploy the integrated shell, then prove simultaneous bounded Telnet sessions, AP/station/Ethernet listener and discovery changes, and framed USB recovery alongside normal protocol commands. - Remaining: Exercise authentication changes, disconnect/reconnect, slow-reader backpressure and maintenance exclusion on the actual board; an immediate OK/queued command is not proof of AVR execution or physical LED/display/audio success. @@ -6563,16 +6599,16 @@ Verdict: **parity-gap**. Revision: `filesystem-snapshot-no-git`. Original-byte S Verdict: **parity-gap**. Revision: `filesystem-snapshot-no-git`. Original-byte SHA-256: `3a3b4f13d0c839664edc2b15bb4418254463ff4d36016cb798a799016ef2890a`. -- Target: `firmware/esp/src/portable-shell/portable_device_view.hpp:46 [UTF8-LF sha256=38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1; anchor=class DeviceView]`. -- Target: `firmware/esp/src/ShellTuiBinding.h:3 [UTF8-LF sha256=fb551fb47f1c32d0b57c1245b2cc701af6265bf927b159bb556983dacd48d1e9; anchor=struct ShellTuiSnapshot]`. +- Target: `firmware/esp/src/portable-shell/portable_device_view.hpp:62 [UTF8-LF sha256=fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652; anchor=class DeviceView]`. +- Target: `firmware/esp/src/ShellTuiBinding.h:3 [UTF8-LF sha256=71a0879a531b26b6058bb25eb13b5f09c8ae3e739a485c4620e37e2495e30d26; anchor=struct ShellTuiSnapshot]`. - Retained: formIsFiltering focused-field key ownership is adapted to a pure ShellTui editing state: printable input/Tab cannot invoke workspace shortcuts while a draft is active; Esc/Ctrl-C cancel without applying. - Retained: Readonly fields cannot emit Set, unchanged Enter is not a write, CR-LF submits once, and a draft is cancelled if its key/editable/secret authority changes. Observed refreshes do not repaint or replace an active draft. - Retained: One shared ShellProperty snapshot binds TUI fields to the same shell/configuration validators, rather than introducing a separate TUI business or persistence layer. - Omitted/replaced code: `Huh form types, Go interface assertions and Bubble Tea runtime`. Disposition: **replaced**. Reason: The microcontroller uses an allocation-free C++ editing state and explicit Action handoff. No Go/Huh/Bubble Tea runtime is ported or required, and no full Huh select-filter UI is claimed. - Omitted/replaced code: `Unicode/Persian input and desktop form widgets`. Disposition: **pending**. Reason: Current Arduino form accepts bounded printable ASCII only; terminal character shaping, Persian editing and richer host widgets require separate implementation and acceptance. -- Test-code evidence: `tests/shell_tui_test.cpp:43 [UTF8-LF sha256=650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d; anchor=private\trefresh]`. -- Test-code evidence: `tests/shell_tui_test.cpp:37 [UTF8-LF sha256=650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d; anchor=Async observation cannot repaint draft.]`. -- Test-code evidence: `tests/shell_tui_test.cpp:72 [UTF8-LF sha256=650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d; anchor=rows[0].editable=false]`. +- Test-code evidence: `tests/shell_tui_test.cpp:52 [UTF8-LF sha256=1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7; anchor=private\trefresh]`. +- Test-code evidence: `tests/shell_tui_test.cpp:46 [UTF8-LF sha256=1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7; anchor=Async observation cannot repaint draft.]`. +- Test-code evidence: `tests/shell_tui_test.cpp:81 [UTF8-LF sha256=1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7; anchor=rows[0].editable=false]`. - Scoped advantage: Source comparison and hash-bound fixture references only; deployment, terminal interoperability and hardware acceptance remain pending. - Remaining: Compile and deploy the integrated shell, then prove simultaneous bounded Telnet sessions, AP/station/Ethernet listener and discovery changes, and framed USB recovery alongside normal protocol commands. - Remaining: Exercise authentication changes, disconnect/reconnect, slow-reader backpressure and maintenance exclusion on the actual board; an immediate OK/queued command is not proof of AVR execution or physical LED/display/audio success. @@ -6630,9 +6666,9 @@ Verdict: **parity-gap**. Revision: `filesystem-snapshot-no-git`. Original-byte S Verdict: **parity-gap**. Revision: `filesystem-snapshot-no-git`. Original-byte SHA-256: `3b56b9ee2bfa2e40b02e464c7cc2cd471d6dbb2148f06091bd56dfdf2926e1b3`. - Target: `firmware/esp/src/ShellWire.h:31 [UTF8-LF sha256=af3f23d908310dd349b0c90d1fc4385a212e6439b10c72f8dc2f37dace4b5216; anchor=class OutputWindow]`. -- Target: `firmware/esp/src/portable-shell/portable_terminal.h:210 [UTF8-LF sha256=356dea61f6096e06a6328691d8f919c2dc582086f2234714cf5efbb4ffef79e1; anchor=static inline size_t ps_terminal_text]`. -- Target: `firmware/esp/src/portable-shell/portable_device_view.hpp:46 [UTF8-LF sha256=38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1; anchor=class DeviceView]`. -- Target: `firmware/esp/src/ShellService.h:401 [UTF8-LF sha256=988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df; anchor=void closeDeviceShells()]`. +- Target: `firmware/esp/src/portable-shell/portable_terminal.h:236 [UTF8-LF sha256=93bed5802f25a474daed05338817b37b141a400f553a3ba5c7ca3857e1faeaf0; anchor=static inline size_t ps_terminal_text]`. +- Target: `firmware/esp/src/portable-shell/portable_device_view.hpp:62 [UTF8-LF sha256=fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652; anchor=class DeviceView]`. +- Target: `firmware/esp/src/ShellService.h:401 [UTF8-LF sha256=206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb; anchor=void closeDeviceShells()]`. - Target: `tools/device-shell.ps1:25 [UTF8-LF sha256=4e197e3502eb6ef40d2a3df7bdde97ed3c05140c97e06e3d07426232732a9c55; anchor=Exactly once; uncertain input is NEVER replayed.]`. - Retained: Session-fenced immutable input/output ownership is adapted into SerialChannel/OutputWindow and the host terminal tool: explicit Open/token, no uncertain input replay, nonwrapping sequences, output ACK before consumption and explicit close. - Retained: Terminal safety is adapted into bounded terminalText and TUI rendering: external CSI/OSC/DCS/control payloads cannot inject terminal actions, and only the project renderer emits ANSI; output/drafts/transcripts are bounded. @@ -6642,7 +6678,7 @@ Verdict: **parity-gap**. Revision: `filesystem-snapshot-no-git`. Original-byte S - Omitted/replaced code: `Transparent raw serial and automatic uncertain write retry`. Disposition: **replaced**. Reason: An additive boot/token-fenced COBS channel preserves ordinary USB recovery. Host terminal sends input once and does not reopen/replay actions automatically after uncertainty. - Test-code evidence: `tests/shell_wire_test.cpp:21 [UTF8-LF sha256=d3b4221251b6d150bdec3b9a9e78d3506e9d9c123b5699eef2919cc957da8562; anchor=Lost read reply replays same bytes]`. - Test-code evidence: `tests/shell_wire_test.cpp:26 [UTF8-LF sha256=d3b4221251b6d150bdec3b9a9e78d3506e9d9c123b5699eef2919cc957da8562; anchor=output.sequence()==UINT16_MAX]`. -- Test-code evidence: `tests/shell_tui_test.cpp:19 [UTF8-LF sha256=650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d; anchor=never-render-this]`. +- Test-code evidence: `tests/shell_tui_test.cpp:28 [UTF8-LF sha256=1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7; anchor=never-render-this]`. - Test-code evidence: `tests/telnet_shell_test.cpp:115 [UTF8-LF sha256=9554e3744bd58435e52bbc0879ebcb6fe24a965eb9db111e05812d7db8739b62; anchor=Inspect the caller-owned backing bytes]`. - Scoped advantage: Source comparison and hash-bound fixture references only; deployment, terminal interoperability and hardware acceptance remain pending. - Remaining: Compile and deploy the integrated shell, then prove simultaneous bounded Telnet sessions, AP/station/Ethernet listener and discovery changes, and framed USB recovery alongside normal protocol commands. diff --git a/docs/REUSE-PREFLIGHT-RECEIPT.md b/docs/REUSE-PREFLIGHT-RECEIPT.md index 55db81d..60d2613 100644 --- a/docs/REUSE-PREFLIGHT-RECEIPT.md +++ b/docs/REUSE-PREFLIGHT-RECEIPT.md @@ -12131,3 +12131,38 @@ only those two target hashes in PU850-ROUTE-PARITY.json, keeping donor hashes, route classifications and remaining acceptance unchanged. The actual50-route checker, Web identity test and no-write application-artwork check pass. This is not execution of native tests, firmware compilation or OTA/physical acceptance. + +## 2026-10-31: PortableShell consumer refresh + +Consulted donor-audit/portable-shell, terminal-ui, device-shell and build-storage; +read the canonical component changes and shared policy/utility/undo/meter owners. +The initial `shell` consultation name was invalid; corrected it to the documented +concerns before editing. Exact exports use PortableShell 3a7eeba. Existing +historical reference snapshots and consumer hardware/authentication owners stay. + +Updated target/proof bindings only for inspected changes. The table spacing, +uppercase category and styled footer expectations changed with the upstream +renderer; navigation/draft/owner-dispatch assertions remain. The old theme array +had four entries but the refreshed renderer defaults to index four: add default, +rename cyan, and derive choice count. Release mouse reporting before alternate +screen exit, with a binding regression test. + +A failed workspace assertion left Windows holding the test executable. A named +build output option in the existing gated test wrapper avoids output collisions; +it does not bypass reuse gates or alter tested sources. An initial script-edit +syntax error was corrected before rerunning. No production process was stopped, +no board flashed and no unrelated donor verdict was upgraded. + +Validation: the complete gated shell suite passed, including nine-page binding, +Telnet/TCP loopback, source hashes, wire admission, settings persistence, pixel +topology, tone dispatch and SSH policy. The final mouse-release regression and +page captures passed in the gated workspace-only run. Tests use hardware doubles; +SSH policy tests are not a live SSH connection or physical acceptance. + +The full-session F7/history-expansion/hex APIs are not exported by the standalone +header integration. This refresh does not claim those features are wired into +firmware. PU850 remains at fetched origin/main 4311040: ShellSession write/close +callbacks, CommandEntry handlers and DeviceParameter get/set callbacks provide +an adapter boundary. A future migration must preserve device handlers, network +lifecycle, persistence and serial/Telnet behavior, then compile and test hardware. +No PU850 replacement or board rollout was performed in this pass. diff --git a/docs/file-comparison-evidence.json b/docs/file-comparison-evidence.json index 3a7033e..578fddb 100644 --- a/docs/file-comparison-evidence.json +++ b/docs/file-comparison-evidence.json @@ -63,7 +63,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -98,7 +98,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -138,7 +138,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -166,7 +166,7 @@ { "path": "firmware/esp/src/ShellService.h", "anchor": "void executeDeviceShell", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df" + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb" }, { "path": "third_party/portable-shell/README.md", @@ -178,7 +178,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -218,7 +218,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [], @@ -240,7 +240,7 @@ { "path": "tools/test-shell.ps1", "anchor": "foreach($taskName", - "sha256": "51673e6f5ae86036a7a439214e3e456a0b8dab6f4dc17485e1244ca862174967" + "sha256": "fcd706a22bf195f86ca43954692430a199ddb4f9375dc68801160e240f65c87d" }, { "path": "third_party/portable-shell/README.md", @@ -252,7 +252,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -287,7 +287,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -322,7 +322,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -357,7 +357,7 @@ { "path": "firmware/esp/src/ShellService.h", "anchor": "void executeDeviceShell", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df" + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb" }, { "path": "firmware/esp/src/TelnetShell.h", @@ -369,7 +369,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -415,7 +415,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" }, { "path": "tests/telnet_client_test.mjs", @@ -449,7 +449,7 @@ { "path": "firmware/esp/src/ShellService.h", "anchor": "void executeDeviceShell", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df" + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb" }, { "path": "tools/telnet-shell.mjs", @@ -461,7 +461,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" }, { "path": "tests/telnet_client_test.mjs", @@ -504,7 +504,7 @@ { "path": "firmware/esp/src/ShellService.h", "anchor": "void executeDeviceShell", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df" + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb" } ], "proof": [ @@ -516,7 +516,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -546,7 +546,7 @@ { "path": "firmware/esp/src/ShellService.h", "anchor": "void executeDeviceShell", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df" + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb" }, { "path": "firmware/esp/src/ShellWire.h", @@ -563,7 +563,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" }, { "path": "tests/telnet_client_test.mjs", @@ -606,12 +606,12 @@ { "path": "firmware/esp/src/ShellService.h", "anchor": "void executeDeviceShell", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df" + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb" }, { "path": "firmware/esp/src/portable-shell/portable_device_view.hpp", "anchor": "class DeviceView", - "sha256": "38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1" + "sha256": "fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652" }, { "path": "firmware/esp/src/ShellLabels.h", @@ -633,7 +633,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" }, { "path": "tests/shell_tone_dispatch_test.mjs", @@ -668,7 +668,7 @@ { "path": "firmware/esp/src/ShellService.h", "anchor": "void executeDeviceShell", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df" + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb" }, { "path": "firmware/esp/src/ShellWire.h", @@ -685,7 +685,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" }, { "path": "tests/telnet_client_test.mjs", @@ -728,7 +728,7 @@ { "path": "firmware/esp/src/ShellService.h", "anchor": "void executeDeviceShell", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df" + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb" } ], "proof": [ @@ -740,7 +740,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -774,7 +774,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "proof": [ @@ -786,7 +786,7 @@ { "path": "tests/portable_shell_source_test.mjs", "anchor": "const source=", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773" + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea" } ], "omissions": [ @@ -2977,14 +2977,14 @@ "targets": [ { "path": "firmware/esp/src/portable-shell/portable_device_view.hpp", - "sha256": "38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1", + "sha256": "fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652", "anchor": "class DeviceView" } ], "proof": [ { "path": "tests/shell_tui_test.cpp", - "sha256": "650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d", + "sha256": "1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7", "anchor": "assert(output.size()<=PS_DEVICE_VIEW_FRAME_BYTES)" } ], @@ -6450,7 +6450,7 @@ }, { "path": "firmware/esp/src/ShellService.h", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df", + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb", "anchor": "void serviceShellRemoteQuery()" }, { @@ -16369,8 +16369,8 @@ }, { "path": "firmware/esp/src/portable-shell/portable_device_table.hpp", - "sha256": "784b6315a407af641060db4f01e4caf92148bf149389b79d5b5e397946c525a2", - "anchor": "// PCController's logical-row/section-line separation, without heap storage." + "sha256": "37b99ff1e9322f84ec0ccf80893034f545bbc78255ef067a6c0900f1cbed3b73", + "anchor": "// Separate logical rows from section headings without heap storage." } ], "preserved": [ @@ -16400,8 +16400,8 @@ }, { "path": "tests/shell_workspace_test.cpp", - "sha256": "4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84", - "anchor": "s.output.find(\"Lighting\")==s.output.rfind(\"Lighting\")" + "sha256": "2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd", + "anchor": "s.output.find(\"LIGHTING\")==s.output.rfind(\"LIGHTING\")" } ], "improvement": "Bounded checkpoint only; no whole-repository superiority or physical acceptance claim." @@ -21120,7 +21120,7 @@ }, { "path": "firmware/esp/src/ShellTuiBinding.h", - "sha256": "fb551fb47f1c32d0b57c1245b2cc701af6265bf927b159bb556983dacd48d1e9", + "sha256": "71a0879a531b26b6058bb25eb13b5f09c8ae3e739a485c4620e37e2495e30d26", "anchor": "struct ShellTuiSnapshot" }, { @@ -21217,12 +21217,12 @@ }, { "path": "tests/shell_tui_test.cpp", - "sha256": "650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d", + "sha256": "1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7", "anchor": "Unchanged Enter is not a write." }, { "path": "tools/test-shell.ps1", - "sha256": "51673e6f5ae86036a7a439214e3e456a0b8dab6f4dc17485e1244ca862174967", + "sha256": "fcd706a22bf195f86ca43954692430a199ddb4f9375dc68801160e240f65c87d", "anchor": "-Concern device-shell -Gate" }, { @@ -21363,7 +21363,7 @@ }, { "path": "firmware/esp/src/ShellTuiBinding.h", - "sha256": "fb551fb47f1c32d0b57c1245b2cc701af6265bf927b159bb556983dacd48d1e9", + "sha256": "71a0879a531b26b6058bb25eb13b5f09c8ae3e739a485c4620e37e2495e30d26", "anchor": "struct ShellTuiSnapshot" }, { @@ -21400,12 +21400,12 @@ }, { "path": "tests/shell_tui_test.cpp", - "sha256": "650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d", + "sha256": "1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7", "anchor": "Unchanged Enter is not a write." }, { "path": "tools/test-shell.ps1", - "sha256": "51673e6f5ae86036a7a439214e3e456a0b8dab6f4dc17485e1244ca862174967", + "sha256": "fcd706a22bf195f86ca43954692430a199ddb4f9375dc68801160e240f65c87d", "anchor": "-Concern device-shell -Gate" } ], @@ -21472,7 +21472,7 @@ }, { "path": "firmware/esp/src/ShellService.h", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df", + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb", "anchor": "void serviceDeviceShells()" }, { @@ -21514,7 +21514,7 @@ }, { "path": "tools/test-shell.ps1", - "sha256": "51673e6f5ae86036a7a439214e3e456a0b8dab6f4dc17485e1244ca862174967", + "sha256": "fcd706a22bf195f86ca43954692430a199ddb4f9375dc68801160e240f65c87d", "anchor": "-Concern device-shell -Gate" } ], @@ -21569,7 +21569,7 @@ }, { "path": "firmware/esp/src/ShellService.h", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df", + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb", "anchor": "void serviceDeviceShells()" }, { @@ -21611,7 +21611,7 @@ }, { "path": "tools/test-shell.ps1", - "sha256": "51673e6f5ae86036a7a439214e3e456a0b8dab6f4dc17485e1244ca862174967", + "sha256": "fcd706a22bf195f86ca43954692430a199ddb4f9375dc68801160e240f65c87d", "anchor": "-Concern device-shell -Gate" } ], @@ -21662,12 +21662,12 @@ "targets": [ { "path": "firmware/esp/src/ShellService.h", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df", + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb", "anchor": "bool shellSet(" }, { "path": "firmware/esp/src/ShellTuiBinding.h", - "sha256": "fb551fb47f1c32d0b57c1245b2cc701af6265bf927b159bb556983dacd48d1e9", + "sha256": "71a0879a531b26b6058bb25eb13b5f09c8ae3e739a485c4620e37e2495e30d26", "anchor": "shellGet(property)" }, { @@ -21704,7 +21704,7 @@ }, { "path": "tests/shell_tui_test.cpp", - "sha256": "650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d", + "sha256": "1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7", "anchor": "Readonly never emits Set." }, { @@ -21780,12 +21780,12 @@ "targets": [ { "path": "firmware/esp/src/ShellService.h", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df", + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb", "anchor": "bool shellSet(" }, { "path": "firmware/esp/src/ShellTuiBinding.h", - "sha256": "fb551fb47f1c32d0b57c1245b2cc701af6265bf927b159bb556983dacd48d1e9", + "sha256": "71a0879a531b26b6058bb25eb13b5f09c8ae3e739a485c4620e37e2495e30d26", "anchor": "shellGet(property)" }, { @@ -21812,7 +21812,7 @@ }, { "path": "tests/shell_tui_test.cpp", - "sha256": "650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d", + "sha256": "1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7", "anchor": "Readonly never emits Set." }, { @@ -21869,29 +21869,29 @@ "targets": [ { "path": "firmware/esp/src/portable-shell/portable_device_view.hpp", - "sha256": "38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1", + "sha256": "fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652", "anchor": "class DeviceView" }, { "path": "firmware/esp/src/ShellTuiBinding.h", - "sha256": "fb551fb47f1c32d0b57c1245b2cc701af6265bf927b159bb556983dacd48d1e9", + "sha256": "71a0879a531b26b6058bb25eb13b5f09c8ae3e739a485c4620e37e2495e30d26", "anchor": "struct ShellTuiSnapshot" } ], "proof": [ { "path": "tests/shell_tui_test.cpp", - "sha256": "650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d", + "sha256": "1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7", "anchor": "private\\trefresh" }, { "path": "tests/shell_tui_test.cpp", - "sha256": "650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d", + "sha256": "1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7", "anchor": "Async observation cannot repaint draft." }, { "path": "tests/shell_tui_test.cpp", - "sha256": "650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d", + "sha256": "1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7", "anchor": "rows[0].editable=false" } ], @@ -21932,17 +21932,17 @@ }, { "path": "firmware/esp/src/portable-shell/portable_terminal.h", - "sha256": "356dea61f6096e06a6328691d8f919c2dc582086f2234714cf5efbb4ffef79e1", + "sha256": "93bed5802f25a474daed05338817b37b141a400f553a3ba5c7ca3857e1faeaf0", "anchor": "static inline size_t ps_terminal_text" }, { "path": "firmware/esp/src/portable-shell/portable_device_view.hpp", - "sha256": "38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1", + "sha256": "fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652", "anchor": "class DeviceView" }, { "path": "firmware/esp/src/ShellService.h", - "sha256": "988751a727abecc9737d9f7b9b3e8d14c8031deb761a83133632d404da2215df", + "sha256": "206e4ffa92af68705e11a0b905c136c75918892d7c0b24071e8704b89187dddb", "anchor": "void closeDeviceShells()" }, { @@ -21964,7 +21964,7 @@ }, { "path": "tests/shell_tui_test.cpp", - "sha256": "650a377abfcef9bccf989b501d452b4d9a175f8970fa3fcc52f0e6d227bb1d2d", + "sha256": "1ab6c44565526636089091f51719d2a0abbc9512a493ae0e97194d4a9214f1a7", "anchor": "never-render-this" }, { @@ -26291,205 +26291,205 @@ { "origin": "portable-shell", "path": "include/portable_terminal.h", - "sha256": "356dea61f6096e06a6328691d8f919c2dc582086f2234714cf5efbb4ffef79e1", - "source_revision": "e90ffc004b39912e21a1799a75061ac61f22c74f", + "sha256": "93bed5802f25a474daed05338817b37b141a400f553a3ba5c7ca3857e1faeaf0", + "source_revision": "3a7eeba179c238226deef1b64e3bd3b86c4e12e7", "source_read": "complete", "verdict": "equivalent-file", "preserved": [ - "Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing." + "Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork." ], "targets": [ { "path": "firmware/esp/src/portable-shell/portable_terminal.h", - "sha256": "356dea61f6096e06a6328691d8f919c2dc582086f2234714cf5efbb4ffef79e1", - "anchor": "static inline int ps_telnet_feed" + "sha256": "93bed5802f25a474daed05338817b37b141a400f553a3ba5c7ca3857e1faeaf0", + "anchor": "#ifndef" } ], "proof": [ { "path": "tests/portable_shell_source_test.mjs", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773", + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea", "anchor": "Consumer must use canonical components" }, { "path": "tests/shell_workspace_test.cpp", - "sha256": "4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84", + "sha256": "2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd", "anchor": "Actual workspace binding" } ], "omissions": [], "remaining": [ - "Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration." + "Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration." ] }, { "origin": "portable-shell", "path": "include/portable_editor.h", - "sha256": "1187b7714998afaa5a045f333c50ce3081de846c6c9b0d9b41b8186723bb48ea", - "source_revision": "e90ffc004b39912e21a1799a75061ac61f22c74f", + "sha256": "00bd8c83ae9d7ad8fdc3ae963e37acabf0b3f93096758f0294cdebed2f11cbd3", + "source_revision": "3a7eeba179c238226deef1b64e3bd3b86c4e12e7", "source_read": "complete", "verdict": "equivalent-file", "preserved": [ - "Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing." + "Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork." ], "targets": [ { "path": "firmware/esp/src/portable-shell/portable_editor.h", - "sha256": "1187b7714998afaa5a045f333c50ce3081de846c6c9b0d9b41b8186723bb48ea", - "anchor": "static inline int ps_editor_feed" + "sha256": "00bd8c83ae9d7ad8fdc3ae963e37acabf0b3f93096758f0294cdebed2f11cbd3", + "anchor": "#ifndef" } ], "proof": [ { "path": "tests/portable_shell_source_test.mjs", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773", + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea", "anchor": "Consumer must use canonical components" }, { "path": "tests/shell_workspace_test.cpp", - "sha256": "4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84", + "sha256": "2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd", "anchor": "Actual workspace binding" } ], "omissions": [], "remaining": [ - "Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration." + "Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration." ] }, { "origin": "portable-shell", "path": "include/portable_shell_editor.hpp", - "sha256": "9bf1a3b590217b8b1cc6562fbd681f9a71af9d761f057ac10585f597d3e11ff5", - "source_revision": "e90ffc004b39912e21a1799a75061ac61f22c74f", + "sha256": "1289e6667828d637042de29b31941427d8a9f222c3a7c967fd751f3b0c7ba7c3", + "source_revision": "3a7eeba179c238226deef1b64e3bd3b86c4e12e7", "source_read": "complete", "verdict": "equivalent-file", "preserved": [ - "Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing." + "Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork." ], "targets": [ { "path": "firmware/esp/src/portable-shell/portable_shell_editor.hpp", - "sha256": "9bf1a3b590217b8b1cc6562fbd681f9a71af9d761f057ac10585f597d3e11ff5", - "anchor": "class LineEditor" + "sha256": "1289e6667828d637042de29b31941427d8a9f222c3a7c967fd751f3b0c7ba7c3", + "anchor": "#ifndef" } ], "proof": [ { "path": "tests/portable_shell_source_test.mjs", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773", + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea", "anchor": "Consumer must use canonical components" }, { "path": "tests/shell_workspace_test.cpp", - "sha256": "4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84", + "sha256": "2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd", "anchor": "Actual workspace binding" } ], "omissions": [], "remaining": [ - "Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration." + "Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration." ] }, { "origin": "portable-shell", "path": "include/portable_device_view.hpp", - "sha256": "38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1", - "source_revision": "e90ffc004b39912e21a1799a75061ac61f22c74f", + "sha256": "fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652", + "source_revision": "3a7eeba179c238226deef1b64e3bd3b86c4e12e7", "source_read": "complete", "verdict": "equivalent-file", "preserved": [ - "Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing." + "Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork." ], "targets": [ { "path": "firmware/esp/src/portable-shell/portable_device_view.hpp", - "sha256": "38ccd92c729abb086088e2a76e0a3e35130b8ed5e73c22968af56dd1e044fdf1", - "anchor": "class DeviceView" + "sha256": "fb02160a3c97be72039964175768bf9ad8c4efb5e3812c60c3cbcf18a179a652", + "anchor": "#ifndef" } ], "proof": [ { "path": "tests/portable_shell_source_test.mjs", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773", + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea", "anchor": "Consumer must use canonical components" }, { "path": "tests/shell_workspace_test.cpp", - "sha256": "4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84", + "sha256": "2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd", "anchor": "Actual workspace binding" } ], "omissions": [], "remaining": [ - "Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration." + "Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration." ] }, { "origin": "portable-shell", "path": "include/portable_style.h", - "sha256": "d86b758b8d8509667ee5e8a49b9ab8319b8961b32923f89b89ea3d23e3db0e11", - "source_revision": "e90ffc004b39912e21a1799a75061ac61f22c74f", + "sha256": "a29a3338b6ee4523fc394adeb496146f82840c931b4ac7035e52502bf9ce3f6e", + "source_revision": "3a7eeba179c238226deef1b64e3bd3b86c4e12e7", "source_read": "complete", "verdict": "equivalent-file", "preserved": [ - "Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing." + "Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork." ], "targets": [ { "path": "firmware/esp/src/portable-shell/portable_style.h", - "sha256": "d86b758b8d8509667ee5e8a49b9ab8319b8961b32923f89b89ea3d23e3db0e11", - "anchor": "ps_style_ink" + "sha256": "a29a3338b6ee4523fc394adeb496146f82840c931b4ac7035e52502bf9ce3f6e", + "anchor": "#ifndef" } ], "proof": [ { "path": "tests/portable_shell_source_test.mjs", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773", + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea", "anchor": "Consumer must use canonical components" }, { "path": "tests/shell_workspace_test.cpp", - "sha256": "4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84", + "sha256": "2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd", "anchor": "Actual workspace binding" } ], "omissions": [], "remaining": [ - "Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration." + "Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration." ] }, { "origin": "portable-shell", "path": "include/portable_device_table.hpp", - "sha256": "784b6315a407af641060db4f01e4caf92148bf149389b79d5b5e397946c525a2", - "source_revision": "e90ffc004b39912e21a1799a75061ac61f22c74f", + "sha256": "37b99ff1e9322f84ec0ccf80893034f545bbc78255ef067a6c0900f1cbed3b73", + "source_revision": "3a7eeba179c238226deef1b64e3bd3b86c4e12e7", "source_read": "complete", "verdict": "equivalent-file", "preserved": [ - "Complete canonical component at e90ffc004b39912e21a1799a75061ac61f22c74f. Shared full palettes, rich tables, inline values and optional typed controls/dialogs. Explicit feature flags retain smaller layouts. Render inspection corrected Unicode hints, diagnostic surfaces and modal compositing." + "Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork." ], "targets": [ { "path": "firmware/esp/src/portable-shell/portable_device_table.hpp", - "sha256": "784b6315a407af641060db4f01e4caf92148bf149389b79d5b5e397946c525a2", - "anchor": "renderTable" + "sha256": "37b99ff1e9322f84ec0ccf80893034f545bbc78255ef067a6c0900f1cbed3b73", + "anchor": "tableCapacity" } ], "proof": [ { "path": "tests/portable_shell_source_test.mjs", - "sha256": "f9b52abd7672d2053463adad77078e55c4fdd0bb3102463ce8c20c3895193773", + "sha256": "52b6834c58de5b07c7fd52e7be34f109aaa1c961ddd2f6362532a71fd4559aea", "anchor": "Consumer must use canonical components" }, { "path": "tests/shell_workspace_test.cpp", - "sha256": "4dc5ca08b38543de404e96a6a94cfcbac3483c9be89a6f1a0e877dac4cafeb84", + "sha256": "2be702d0a1bed5ec74488866d3d7d47416ec5740c200e6d3d1972845c0311fcd", "anchor": "Actual workspace binding" } ], "omissions": [], "remaining": [ - "Complete board firmware CI and separately authorized live device acceptance; no production deployment in this source integration." + "Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration." ] }, { @@ -26561,6 +26561,98 @@ "remaining": [ "Complete carrier/service parity and real deployed interoperability, timing, stack/RAM and physical acceptance separately." ] + }, + { + "origin": "portable-shell", + "path": "include/portable_meter.h", + "targets": [ + { + "path": "firmware/esp/src/portable-shell/portable_meter.h", + "sha256": "48350a03fd496aaf50bf47149f8a099d7d07de9175024ef43a917e0a7cf53f1d", + "anchor": "#ifndef" + } + ], + "proof": [], + "omissions": [], + "sha256": "48350a03fd496aaf50bf47149f8a099d7d07de9175024ef43a917e0a7cf53f1d", + "source_revision": "3a7eeba179c238226deef1b64e3bd3b86c4e12e7", + "source_read": "complete", + "verdict": "equivalent-file", + "preserved": [ + "Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork." + ], + "remaining": [ + "Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration." + ] + }, + { + "origin": "portable-shell", + "path": "include/portable_undo.h", + "targets": [ + { + "path": "firmware/esp/src/portable-shell/portable_undo.h", + "sha256": "adf67d72d371b0e15fb1be3c64dfdea5155840b55a23a987be5807437fed9be0", + "anchor": "#ifndef" + } + ], + "proof": [], + "omissions": [], + "sha256": "adf67d72d371b0e15fb1be3c64dfdea5155840b55a23a987be5807437fed9be0", + "source_revision": "3a7eeba179c238226deef1b64e3bd3b86c4e12e7", + "source_read": "complete", + "verdict": "equivalent-file", + "preserved": [ + "Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork." + ], + "remaining": [ + "Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration." + ] + }, + { + "origin": "portable-shell", + "path": "include/portable_util.h", + "targets": [ + { + "path": "firmware/esp/src/portable-shell/portable_util.h", + "sha256": "568c68488cc8821e694b2ba576f138dc4d0d6f8f9970e83b99188b7727014256", + "anchor": "#ifndef" + } + ], + "proof": [], + "omissions": [], + "sha256": "568c68488cc8821e694b2ba576f138dc4d0d6f8f9970e83b99188b7727014256", + "source_revision": "3a7eeba179c238226deef1b64e3bd3b86c4e12e7", + "source_read": "complete", + "verdict": "equivalent-file", + "preserved": [ + "Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork." + ], + "remaining": [ + "Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration." + ] + }, + { + "origin": "portable-shell", + "path": "include/portable_table_policy.h", + "targets": [ + { + "path": "firmware/esp/src/portable-shell/portable_table_policy.h", + "sha256": "eed0e170b4b80284b0cbbda87c7998480ec6d4040192d0402ca5af112ddfec04", + "anchor": "#ifndef" + } + ], + "proof": [], + "omissions": [], + "sha256": "eed0e170b4b80284b0cbbda87c7998480ec6d4040192d0402ca5af112ddfec04", + "source_revision": "3a7eeba179c238226deef1b64e3bd3b86c4e12e7", + "source_read": "complete", + "verdict": "equivalent-file", + "preserved": [ + "Exact canonical component refresh at 3a7eeba179c238226deef1b64e3bd3b86c4e12e7. Reviewed upstream changes and required utility/undo/meter/selection-policy dependencies. Preserve consumer authentication, command dispatch and hardware callbacks; one canonical renderer replaces the old reduced fork." + ], + "remaining": [ + "Issue #29: firmware compilation and live USB/Telnet/board acceptance remain pending. Full-session F7/history expansion/hex editor are not part of this standalone header component integration." + ] } ] } diff --git a/docs/file-comparison.csv b/docs/file-comparison.csv index 9d94b7c..f165e30 100644 --- a/docs/file-comparison.csv +++ b/docs/file-comparison.csv @@ -15,7 +15,7 @@ "ControllerBoardMini","Timer/LocalLib/TonePlayer.h","filesystem-snapshot","9f2aea4eadd0a4112ba62d4bdac906a9749026aa4e69404c2ff3169667f204df","firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","scoped-improvement","complete","firmware/avr/TonePlayer.h:19 [UTF8-LF sha256=c102c4d0a789f9d19e8c94db92001caf489beca04e65dead01186d91998c2cde; anchor=bool enqueue] | firmware/avr/TonePlayer.cpp:87 [UTF8-LF sha256=6c578fb07b1c5059d1d03690beed73806a77b9d28cd05359d9f225b945275ed1; anchor=startsAt = stepEndsAt_]","Read the complete byte-identical Timer/Puzzles header. Ten queued tones/pauses, PB1/D9 buzzer ownership and pitch constants remain available.","waitForTonesEnd blocking loop [replaced] | global queue/functions and millis()+duration deadline [replaced]","waitForTonesEnd blocking loop: Nonblocking update/isBusy preserves completion while UART, input and front-panel services continue. | global queue/functions and millis()+duration deadline: Object ownership plus rollover-safe anchored deadlines prevents namespace collision, drift and loop starvation.","tests/tone_player_test.cpp:40 [UTF8-LF sha256=d1d890f6ead81d22702eb685ae710935bc7c007af5f97236454b851a3f5adc42; anchor=player.update(start+270)]","Hardware compare toggling and nonblocking anchored deadlines retain cues while keeping the real-time control loop responsive.","Register tests are not audible clock, melody-synchronization or transducer proof.","Not established by source/hash/test-code comparison; see issue #2" "ControllerBoardMini","Timer/LocalLib/WS2811.cpp","filesystem-snapshot","0f7fec7879abd26dbf2d56df28441727ea76fcb9e093f009d39f20cae77832bb","firmware-hardware","https://github.com/atomicdeploy/PakarController/issues/3 | https://github.com/atomicdeploy/PakarController/issues/6","parity-gap","complete","firmware/esp/src/LedGrid.cpp:34 [UTF8-LF sha256=9e08798277b72ee4420add3d3dc530dce83bf507e824a088439c7dc123211793; anchor=FastLED.addLeds