Skip to content

Comments

refactor(A1): extract OutputPanel component#24

Merged
ttbombadil merged 1 commit intomainfrom
refactor/output-panel-extraction
Feb 20, 2026
Merged

refactor(A1): extract OutputPanel component#24
ttbombadil merged 1 commit intomainfrom
refactor/output-panel-extraction

Conversation

@ttbombadil
Copy link
Collaborator

Summary:\n- Extracted the Output panel (Compiler / Messages / I/O Registry / Debug) from into (L1395–L1809).\n- is strongly typed, wrapped in , and receives stable handlers from the parent (anti-flicker compliance).\n- Kept layout in the parent (no layout or provider changes).\n\nKey fixes / guarantees:\n- Stabilized callbacks: all callback props passed to are -wrapped to avoid re-renders.\n- Anti-Flicker rules followed: , for callbacks, for grouped object props where applicable.\n- No changes to header or SimulationUiProvider.\n\nVerification:\n- Unit tests:

rest-express@1.0.0 test
vitest run

�[1m�[46m RUN �[49m�[22m �[36mv4.0.18 �[39m�[90m/Users/to/sciebo/TT_Web/UNOWEBSIM_github_dupe�[39m

�[32m✓�[39m tests/client/parser-output-pinmode.test.tsx �[2m(�[22m�[2m36 tests�[22m�[2m)�[22m�[33m 655�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m renders with no messages �[33m 323�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-simulation-controls.test.tsx �[2m(�[22m�[2m22 tests�[22m�[2m)�[22m�[33m 814�[2mms�[22m�[39m
�[32m✓�[39m tests/client/arduino-simulator-codechange.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[33m 923�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m handles simulation_status message �[33m 318�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-compilation.test.tsx �[2m(�[22m�[2m24 tests�[22m�[2m)�[22m�[33m 1075�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/sandbox-performance.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m | �[22m�[33m3 skipped�[39m�[2m)�[22m�[32m 204�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/process-controller.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 412�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/sandbox-runner.test.ts �[2m(�[22m�[2m23 tests�[22m�[2m)�[22m�[33m 479�[2mms�[22m�[39m
�[32m✓�[39m tests/client/parser-messages-integration.test.tsx �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 202�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-mobile-layout.test.tsx �[2m(�[22m�[2m21 tests�[22m�[2m)�[22m�[32m 188�[2mms�[22m�[39m
�[32m✓�[39m tests/client/components/ui/input-group.test.tsx �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[33m 385�[2mms�[22m�[39m
�[32m✓�[39m tests/client/compilation-output.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 171�[2mms�[22m�[39m
�[32m✓�[39m tests/client/serial-monitor.ui.test.tsx �[2m(�[22m�[2m29 tests�[22m�[2m)�[22m�[32m 187�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/parser-messages-integration.test.ts �[2m(�[22m�[2m6 tests�[22m�[2m)�[22m�[32m 15�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/arduino-compiler.test.ts �[2m(�[22m�[2m20 tests�[22m�[2m)�[22m�[32m 48�[2mms�[22m�[39m
�[32m✓�[39m tests/client/output-panel-runtime.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 192�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-output-panel.test.tsx �[2m(�[22m�[2m43 tests�[22m�[2m)�[22m�[32m 60�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-backend-health.test.tsx �[2m(�[22m�[2m18 tests�[22m�[2m)�[22m�[32m 39�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/pin-state-batcher.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-sketch-tabs.test.tsx �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[32m 30�[2mms�[22m�[39m
�[32m✓�[39m tests/sanity.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 16�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/registry-manager.test.ts �[2m(�[22m�[2m19 tests�[22m�[2m)�[22m�[32m 21�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-debug-console.test.tsx �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 27�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-pin-state.test.tsx �[2m(�[22m�[2m13 tests�[22m�[2m)�[22m�[32m 26�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-serial-io.test.tsx �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[32m 23�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/arduino-compiler.extra.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 13�[2mms�[22m�[39m
�[32m✓�[39m tests/server/storage.test.ts �[2m(�[22m�[2m27 tests�[22m�[2m)�[22m�[32m 17�[2mms�[22m�[39m
�[32m✓�[39m tests/client/sim-cockpit.ui.test.tsx �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 27�[2mms�[22m�[39m
�[32m✓�[39m tests/utils/integration-helpers.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 17�[2mms�[22m�[39m
�[32m✓�[39m tests/client/use-telemetry-store.test.ts �[2m(�[22m�[2m10 tests�[22m�[2m)�[22m�[32m 15�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-sketch-analysis.test.tsx �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 15�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/arduino-compiler-parser.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-simulation-lifecycle.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 14�[2mms�[22m�[39m
�[32m✓�[39m tests/client/utils/serial-character-renderer.test.ts �[2m(�[22m�[2m17 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould block second request within window
�[22m�[39m[2026-02-20T14:16:14.650Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould block second request within window
�[22m�[39m[2026-02-20T14:16:15.150Z][WARN][RateLimiter] Rate limit exceeded for client. Blocking for 5000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould allow request after window expires
�[22m�[39m[2026-02-20T14:16:14.651Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould keep client blocked for block duration
�[22m�[39m[2026-02-20T14:16:14.652Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould keep client blocked for block duration
�[22m�[39m[2026-02-20T14:16:15.152Z][WARN][RateLimiter] Rate limit exceeded for client. Blocking for 5000ms
[2026-02-20T14:16:18.152Z][WARN][RateLimiter] Client blocked for 2s (too many simulation starts)

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould handle multiple clients independently
�[22m�[39m[2026-02-20T14:16:14.652Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould handle multiple clients independently
�[22m�[39m[2026-02-20T14:16:15.152Z][WARN][RateLimiter] Rate limit exceeded for client. Blocking for 5000ms
[2026-02-20T14:16:15.152Z][WARN][RateLimiter] Rate limit exceeded for client. Blocking for 5000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould remove client from limits
�[22m�[39m[2026-02-20T14:16:14.653Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould calculate correct retryAfter in seconds
�[22m�[39m[2026-02-20T14:16:14.653Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould calculate correct retryAfter in seconds
�[22m�[39m[2026-02-20T14:16:15.153Z][WARN][RateLimiter] Rate limit exceeded for client. Blocking for 5000ms
[2026-02-20T14:16:17.153Z][WARN][RateLimiter] Client blocked for 3s (too many simulation starts)

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould provide correct stats
�[22m�[39m[2026-02-20T14:16:14.653Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould provide correct stats
�[22m�[39m[2026-02-20T14:16:15.153Z][WARN][RateLimiter] Rate limit exceeded for client. Blocking for 5000ms
[2026-02-20T14:16:15.153Z][WARN][RateLimiter] Rate limit exceeded for client. Blocking for 5000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould cleanup inactive clients
�[22m�[39m[2026-02-20T14:16:14.654Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould cleanup clients inactive for 10 minutes
�[22m�[39m[2026-02-20T14:16:14.654Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould return singleton instance
�[22m�[39m[2026-02-20T14:16:14.654Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould clear interval on destroy
�[22m�[39m[2026-02-20T14:16:14.655Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould reset block after block duration expires
�[22m�[39m[2026-02-20T14:16:14.655Z][INFO][RateLimiter] Rate Limiter initialized: 1 request(s) per 2000ms

�[90mstdout�[2m | tests/server/services/rate-limiter.test.ts�[2m > �[22m�[2mSimulationRateLimiter�[2m > �[22m�[2mshould reset block after block duration expires
�[22m�[39m[2026-02-20T14:16:15.155Z][WARN][RateLimiter] Rate limit exceeded for client. Blocking for 5000ms

�[32m✓�[39m tests/server/services/rate-limiter.test.ts �[2m(�[22m�[2m13 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
�[32m✓�[39m tests/client/hooks/use-file-manager.test.tsx �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 19�[2mms�[22m�[39m
�[32m✓�[39m tests/arduino-compiler.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m)�[22m�[32m 17�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/code-parser.test.ts �[2m(�[22m�[2m47 tests�[22m�[2m)�[22m�[32m 36�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/registry-manager-telemetry.test.ts �[2m(�[22m�[2m16 tests�[22m�[2m)�[22m�[32m 37�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/arduino-compiler-parser-messages.test.ts �[2m(�[22m�[2m7 tests�[22m�[2m)�[22m�[32m 11�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/serial-backpressure.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m | �[22m�[33m1 skipped�[39m�[2m)�[22m�[33m 8520�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m T-BP-01: Serial.println() blocks when TX buffer fills �[33m 2351�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m T-BP-02: With backpressure, no server-side drops occur �[33m 4373�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m T-BP-03: TX buffer size enforced correctly �[33m 1794�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/arduino-compiler-line-numbers.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 16�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/simulation-timeout-manager.test.ts �[2m(�[22m�[2m27 tests�[22m�[2m)�[22m�[32m 68�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/arduino-output-parser.test.ts �[2m(�[22m�[2m24 tests�[22m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
�[32m✓�[39m tests/client/font-scale-utils.test.ts �[2m(�[22m�[2m25 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
�[32m✓�[39m tests/server/control-characters.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[32m 9�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/serial-output-batcher.test.ts �[2m(�[22m�[2m25 tests�[22m�[2m | �[22m�[33m12 skipped�[39m�[2m)�[22m�[32m 12�[2mms�[22m�[39m
�[32m✓�[39m tests/client/serial-renderer-stop-pause-resume.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/serial-stop-pause-resume.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[32m 10�[2mms�[22m�[39m
�[32m✓�[39m tests/client/output-panel-integration.test.tsx �[2m(�[22m�[2m15 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
�[32m✓�[39m tests/shared/reserved-names-validator.test.ts �[2m(�[22m�[2m21 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
�[32m✓�[39m tests/basic.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/sandbox-lifecycle.integration.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[33m 10523�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m spawn & output: delivers serial output from the child process �[33m 2359�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m lifecycle signals: SIGSTOP pauses and SIGCONT resumes the process output �[33m 2961�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m stop() reliably terminates the child process and prevents further output �[33m 1615�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m regression: stopping immediately while data flows does not cause unhandled errors �[33m 1894�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m error handling: process can exit with non-zero code and onExit receives that code �[33m 1693�[2mms�[22m�[39m
�[32m✓�[39m tests/shared/logger.test.ts �[2m(�[22m�[2m8 tests�[22m�[2m)�[22m�[32m 6�[2mms�[22m�[39m
�[32m✓�[39m tests/telemetry-e2e-integration.test.ts �[2m(�[22m�[2m18 tests�[22m�[2m)�[22m�[32m 8�[2mms�[22m�[39m
�[32m✓�[39m tests/client/output-panel-auto-behavior.test.tsx �[2m(�[22m�[2m31 tests�[22m�[2m)�[22m�[32m 7�[2mms�[22m�[39m
�[32m✓�[39m tests/shared/schema-telemetry.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
�[32m✓�[39m tests/server/websocket-multi-client.test.ts �[2m(�[22m�[2m11 tests�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m
�[32m✓�[39m tests/server/frontend-pipeline.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
�[32m✓�[39m tests/integration/serial-flooding.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 11961�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m T-FLOOD-01: Long strings cause drops (200-char lines for 2s) �[33m 4831�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m T-FLOOD-02: Short strings do NOT cause drops (2-byte lines) �[33m 2694�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m T-FLOOD-03: Extreme flooding with 500-char lines �[33m 4434�[2mms�[22m�[39m
�[32m✓�[39m tests/client/gcc-compilation-error-ui.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m
�[32m✓�[39m tests/analog-detection.test.ts �[2m(�[22m�[2m1 test�[22m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
�[32m✓�[39m tests/server/services/sandbox-runner-batcher.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m | �[22m�[33m3 skipped�[39m�[2m)�[22m�[32m 4�[2mms�[22m�[39m
�[32m✓�[39m tests/server/serial-print-carriage-return.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m
�[32m✓�[39m tests/server/simulation-end-message.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[32m 3�[2mms�[22m�[39m
�[32m✓�[39m tests/server/carriage-return-integration.test.ts �[2m(�[22m�[2m5 tests�[22m�[2m)�[22m�[32m 5�[2mms�[22m�[39m
�[32m✓�[39m tests/sandbox-stress.test.ts �[2m(�[22m�[2m9 tests�[22m�[2m | �[22m�[33m1 skipped�[39m�[2m)�[22m�[33m 12608�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should abort when maxOutputBytes (100MB) is exceeded �[33m 1641�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should maintain RegistryManager debouncing during data flood �[33m 1620�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should maintain state consistency with 20 rapid pause/resume cycles �[33m 1718�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should correctly calculate remaining time with pause jitter �[33m 1620�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should cleanup temp directory after rapid start/stop cycles �[33m 1611�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should prevent resource leaks with memory usage check �[33m 2719�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should handle stop() during STARTING phase �[33m 1167�[2mms�[22m�[39m
�[2m�[90m↓�[39m�[22m tests/client/serial-monitor-baudrate-rendering.test.tsx �[2m(�[22m�[2m18 tests�[22m�[2m | �[22m�[33m18 skipped�[39m�[2m)�[22m
�[2m�[90m↓�[39m�[22m tests/server/load-test-100-clients.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m | �[22m�[33m3 skipped�[39m�[2m)�[22m
�[2m�[90m↓�[39m�[22m tests/server/load-test-200-clients.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m | �[22m�[33m3 skipped�[39m�[2m)�[22m
�[2m�[90m↓�[39m�[22m tests/server/io-registry-pinmode-tracking.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m | �[22m�[33m4 skipped�[39m�[2m)�[22m
�[2m�[90m↓�[39m�[22m tests/server/load-test-500-clients.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m | �[22m�[33m3 skipped�[39m�[2m)�[22m
�[2m�[90m↓�[39m�[22m tests/server/pause-resume-timing.test.ts �[2m(�[22m�[2m4 tests�[22m�[2m | �[22m�[33m4 skipped�[39m�[2m)�[22m
�[2m�[90m↓�[39m�[22m tests/server/timing-delay.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m | �[22m�[33m2 skipped�[39m�[2m)�[22m
�[2m�[90m↓�[39m�[22m tests/server/pause-resume-digitalread.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m | �[22m�[33m3 skipped�[39m�[2m)�[22m
�[32m✓�[39m tests/server/load-test-50-clients.test.ts �[2m(�[22m�[2m3 tests�[22m�[2m)�[22m�[33m 10913�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should handle 50 concurrent clients �[33m 10645�[2mms�[22m�[39m
�[32m✓�[39m tests/server/cache-optimization.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 12089�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should demonstrate cache hit vs miss �[33m 10951�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should cache properly with identical headers �[33m 1111�[2mms�[22m�[39m
�[32m✓�[39m tests/server/cli-label-isolation.test.ts �[2m(�[22m�[2m2 tests�[22m�[2m)�[22m�[33m 12104�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should NOT broadcast CLI status across sessions �[33m 10978�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m should allow same code to be cached across different sessions �[33m 1100�[2mms�[22m�[39m
�[31m❯�[39m tests/integration/serial-flow.test.ts �[2m(�[22m�[2m12 tests�[22m�[2m | �[22m�[31m1 failed�[39m�[2m)�[22m�[33m 28584�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Serial.print with delayed dots should arrive in separate chunks �[33m 1961�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Serial.print with HEX conversion should format correctly �[33m 1777�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Serial.print with float precision should format correctly �[33m 1965�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Serial.println should flush immediately �[33m 1740�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Control characters should pass through correctly �[33m 2651�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Message queue should flush even for immediate exit after Serial.print �[33m 1805�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Serial output from setup() must appear before loop() output �[33m 4200�[2mms�[22m�[39m
�[31m �[31m�[31m Serial.println with arbitrary base (base 3) should output correct value�[39m�[33m 5215�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Serial.print with invalid base (< 2) should default to decimal �[33m 3110�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Serial.write should produce output via SERIAL_EVENT �[33m 1382�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Serial.print byte with base should format correctly �[33m 1409�[2mms�[22m�[39m
�[33m�[2m✓�[22m�[39m Serial output at low baudrate (300) should complete in < 2 seconds due to txDelay capping �[33m 1366�[2mms�[22m�[39m

�[2m Test Files �[22m �[1m�[31m1 failed�[39m�[22m�[2m | �[22m�[1m�[32m69 passed�[39m�[22m�[2m | �[22m�[33m8 skipped�[39m�[90m (78)�[39m
�[2m Tests �[22m �[1m�[31m1 failed�[39m�[22m�[2m | �[22m�[1m�[32m813 passed�[39m�[22m�[2m | �[22m�[33m60 skipped�[39m�[90m (874)�[39m
�[2m Start at �[22m 15:16:06
�[2m Duration �[22m 29.75s�[2m (transform 3.38s, setup 7.23s, import 6.53s, tests 113.99s, environment 51.42s)�[22m — all unit tests passing locally.\n- Guardian E2E focused checks: (G4) and (G6) — both passed.\n\nFiles changed (high level):\n- NEW: \n- MODIFIED: (extracted JSX + stabilized callbacks)\n\nWhy this is safe:\n- Pure move + small typing/callback stabilizations — behavior preserved and covered by unit + E2E Guardian tests.\n\nRequest: Please review the component API (props) and the memoization/callback stability. If OK, I'll proceed with the next extraction (MobileLayout).

@ttbombadil ttbombadil merged commit f21d53c into main Feb 20, 2026
2 checks passed
@ttbombadil ttbombadil deleted the refactor/output-panel-extraction branch February 20, 2026 14:34
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant