Fake Serial Printer Implementation Plan

For Claude: REQUIRED SUB-SKILL: Use superpowers:executing-plans to implement this plan task-by-task.

Goal: Add a developer-toggleable FakeSerial printer that participates in discovery, connection, command execution, and UI selection like a real serial printer while exposing a real-time debug log.

Architecture: Introduce a cache-backed fake-serial service that owns virtual-node discovery, connection/session locking, stateful Marlin-like command emulation, and developer log state. Integrate that service into the existing Serial class and map:serial-printers command so the rest of the backend continues talking to a serial printer abstraction. Add a developer-only API and UI surface for toggling the feature, selecting the active fake baud rate, and watching the G-code transcript.

Tech Stack: Laravel 11, MongoDB models, cache-backed runtime state, Expo / React Native frontend, React Query, React Native Paper.


Task 1: Protocol Tests

Files:

  • Create: tests/Unit/Support/FakeSerial/FakeSerialEmulatorTest.php

Step 1: Write the failing test

Cover:

  • M105 returns a Marlin-like temperature line with ok.

  • M115 returns firmware info and capabilities.

  • Slow commands such as M109, M190, and G28 emit busy lines before a final ok.

  • Invalid commands emit an error-style line.

  • Motion commands update tracked position.

Step 2: Run test to verify it fails

Run: vendor/bin/phpunit tests/Unit/Support/FakeSerial/FakeSerialEmulatorTest.php Expected: FAIL because the emulator does not exist yet.

Step 3: Write minimal implementation

Create a pure PHP emulator that accepts a persisted state array plus a command string and returns:

  • updated state

  • transcript lines with delays

  • a final combined response string

Step 4: Run test to verify it passes

Run: vendor/bin/phpunit tests/Unit/Support/FakeSerial/FakeSerialEmulatorTest.php Expected: PASS

Task 2: Virtual Node Discovery Tests

Files:

  • Create: tests/Unit/Support/FakeSerial/FakeSerialManagerTest.php

Step 1: Write the failing test

Cover:

  • fake node is hidden when the feature is disabled

  • fake node is exposed when enabled

  • only the configured baud succeeds

  • the service rejects a second simultaneous connection

Step 2: Run test to verify it fails

Run: vendor/bin/phpunit tests/Unit/Support/FakeSerial/FakeSerialManagerTest.php Expected: FAIL because the manager does not exist yet.

Step 3: Write minimal implementation

Create the cache-backed manager that:

  • exposes the virtual node list

  • persists emulator state

  • manages single-session locking

  • stores a rolling developer transcript

Step 4: Run test to verify it passes

Run: vendor/bin/phpunit tests/Unit/Support/FakeSerial/FakeSerialManagerTest.php Expected: PASS

Task 3: Backend Integration

Files:

  • Modify: app/Libraries/Serial.php

  • Modify: app/Console/Commands/MapSerialPrinters.php

  • Modify: app/Console/Services/Concurrent/PollSerialConnections.php

  • Modify: app/Http/Controllers/PrinterController.php

  • Modify: app/Http/Controllers/ConfigurationController.php

  • Modify: app/Http/Controllers/UserController.php

  • Modify: app/Providers/AppServiceProvider.php

  • Modify: routes/api.php

  • Modify: config/system.php

  • Modify: app/Models/Printer.php

  • Create: app/Http/Controllers/DeveloperFakeSerialController.php

  • Create: app/Support/FakeSerial/FakeSerialEmulator.php

  • Create: app/Support/FakeSerial/FakeSerialManager.php

Step 1: Write the failing test

Extend the manager and emulator tests with expectations that reflect the integration contract:

  • fake node exists through Serial::nodeExists

  • mapper candidate list includes the fake node when enabled

  • fake printer metadata flags it as simulated

Step 2: Run tests to verify they fail

Run:

  • vendor/bin/phpunit tests/Unit/Support/FakeSerial/FakeSerialEmulatorTest.php

  • vendor/bin/phpunit tests/Unit/Support/FakeSerial/FakeSerialManagerTest.php

Expected: FAIL on missing integration behavior.

Step 3: Write minimal implementation

Implement:

  • Serial fake-node detection and fake-query execution path

  • line-by-line terminal updates for fake responses

  • mapper discovery through real plus virtual nodes

  • hidden config keys for fake enablement and fake baud rate

  • developer endpoints for read/update state and log retrieval

  • simulated printer metadata for frontend consumption

Step 4: Run tests to verify they pass

Run:

  • vendor/bin/phpunit tests/Unit/Support/FakeSerial/FakeSerialEmulatorTest.php

  • vendor/bin/phpunit tests/Unit/Support/FakeSerial/FakeSerialManagerTest.php

Expected: PASS

Task 4: Frontend Developer Tooling

Files:

  • Modify: frontend/components/NavBarMenuSettingsModalDeveloper.js

  • Modify: frontend/components/UserPrinterPicker.js

  • Create: frontend/components/NavBarMenuSettingsModalDeveloperFakeSerial.js

Step 1: Write the failing test

No frontend test harness exists. Treat runtime validation as the first red/green cycle:

  • the developer tab should show a fake-serial panel only when developer mode is enabled

  • the panel should toggle enablement, change the baud rate, and show the rolling transcript

  • the printer selector should render a computer icon for simulated printers

Step 2: Run runtime validation to verify current behavior is missing

Run from frontend/: pnpm exec expo export -p web Expected: current UI has no fake-serial developer panel and no simulated-printer icon.

Step 3: Write minimal implementation

Implement:

  • a developer-only FakeSerial panel

  • React Query reads/writes against the new developer endpoints

  • a selector UI that can render option icons for simulated printers

Step 4: Run runtime validation to verify it works

Run from frontend/: pnpm exec expo export -p web Expected: build succeeds and the updated selector/panel compile.

Task 5: Verification

Files:

  • None

Step 1: Run focused backend verification

Run:

  • vendor/bin/phpunit tests/Unit/Support/FakeSerial/FakeSerialEmulatorTest.php

  • vendor/bin/phpunit tests/Unit/Support/FakeSerial/FakeSerialManagerTest.php

Step 2: Run focused frontend verification

Run from frontend/: pnpm exec expo export -p web

Step 3: Document environment gaps

If verification fails because of local runtime issues such as logging permissions, missing Memcached, missing frontend dependencies, or absent services, record the exact blocker in the final summary.