Troubleshooting
Start with the checks for your interface. Desktop users do not need to install the Python CLI or configure hooks to connect open chats.
Desktop Does Not Find My Chat
- Codex CLI must be running on the same computer and operating-system account. A Linux VM cannot discover chats on its Mac host.
- Select Refresh chats. The list shows loaded CLI conversations, not saved history.
- Start Codex normally or resume a saved chat, then refresh.
- Check Settings > Codex if the executable is not detected.
Desktop Shows a Chat I Closed
Codex can retain a conversation after its terminal closes. Use Disconnect to release its Scene or the trash icon to disconnect and hide it. Neither deletes Codex history or shifts other Scene numbers. An idle chat shows Ready, not a question or attention badge.
Desktop Controls Are Dark
Select the correct numbered Scene. Controls light only for supported live actions: a single pending approval request or a known running turn. Ordinary questions, multiple simultaneous approvals, and special permission requests must be handled in Codex. See Control Codex.
Desktop Connection or Sound Problems
- Close any separately running Pad-Lattice daemon before starting Desktop.
- Refresh chats updates the chat list. Settings > Reload interface reloads the window without disconnecting conversations.
- In Demo & Show > Demo or Demo & Show > Show, enable Sound and check the computer's output device. In a VM, check the guest's audio output too.
- For MIDI, use Settings > Devices > MIDI controllers to refresh ports and reconnect. The controller must be attached to the same computer or VM, not occupied by a DAW.
- For phone pairing, follow Connect Screens.
CLI and Hardware Diagnostics
The commands below apply to the independent CLI installation. Do not run a second daemon alongside Desktop.
Open CLI troubleshooting
Start with one read-only report:
pad-lattice doctor
It checks discovery, profile matching, daemon reachability, socket permissions,
and stale global Codex hooks without opening the controller or changing LEDs.
Use pad-lattice doctor --json when attaching diagnostics to an issue; the
report omits session identities and agent metadata.
It also abbreviates home and runtime-directory paths.
The Virtual Surface Does Not Open
Start it explicitly and use the URL printed in the terminal:
pad-lattice web
Automatic browser launch is a convenience, not a runtime requirement. On a
headless host or when the desktop opener fails, run pad-lattice web --no-open
and open the printed tokenized loopback administrator URL yourself. Do not
share that URL.
If port 8765 is occupied, let the operating system choose a free one:
pad-lattice web --port 0
Only one Pad-Lattice daemon may own a given Unix socket. Stop the existing
daemon or select another path with --socket.
A Phone or Tablet Cannot Pair
Confirm that the daemon was started with --lan and that both devices are on
the same trusted network:
pad-lattice web --lan
If the printed address belongs to a VPN, container, or unreachable interface, select the interface explicitly:
pad-lattice web --lan --bind-host 192.168.1.20
Shared-network VMs are normally hidden from other LAN devices. Follow the Parallels Desktop instructions to forward one private host port without exposing the whole VM.
Also check the host firewall. Pairing QR links and PINs are one-use and expire after five minutes; create another from the local admin page when needed. Pairing tokens are deliberately forgotten when the daemon restarts, so a previously paired browser must pair again.
Do not forward the port through a router or expose it beyond the trusted local network. LAN mode is unencrypted.
No Device Is Detected
Inspect raw ports, profile matches, and installed profiles:
pad-lattice ports
pad-lattice devices
pad-lattice profile list
Auto-detection uses supported profiles only. Select experimental hardware such as the Mini Mk3 or Pro Mk3 explicitly:
pad-lattice demo --profile novation/launchpad/mini-mk3
If multiple ports match, pass exact names:
pad-lattice demo \
--profile novation/launchpad/pro-mk1 \
--input "Launchpad Pro Standalone Port" \
--output "Launchpad Pro Standalone Port"
No LEDs Change
Start with the demo:
pad-lattice demo --no-greeting
Check that the controller is attached to the same host or VM, USB passthrough is active, and Ableton Live or another MIDI application does not own the port.
Monitor raw input:
pad-lattice monitor-midi --seconds 15
If pad messages appear but LEDs remain unchanged, verify the output port and programmer-mode messages in the selected profile.
Controller Does Not Return to Normal Mode
Stop Pad-Lattice with Ctrl-C so profile shutdown runs. All bundled profiles
restore their normal Live mode on close. If a process was terminated without
cleanup, power-cycle the controller or select Live mode from the hardware.
Another Process Owns MIDI
Only one demo, daemon, test, DAW, or MIDI tool can own a port at a time:
ps -ef | grep pad-lattice
Stop the existing process before starting another.
Daemon Works but Codex Does Not Update
Use one socket path everywhere:
export PAD_LATTICE_SOCKET=/tmp/pad-lattice.sock
pad-lattice daemon --no-greeting
From another terminal:
export PAD_LATTICE_SOCKET=/tmp/pad-lattice.sock
pad-lattice send-state running
If this renders, start Codex through the launcher with the same socket and run
/hooks to verify that every Pad-Lattice command is trusted:
pad-lattice codex --socket /tmp/pad-lattice.sock --label test
The scoped commands contain the resolved socket path. Changing it may require trusting the new definition.
Pad-Lattice Hooks Appear in Plain Codex
Current versions inject hooks only through pad-lattice codex. If a plain
codex session still shows Pad-Lattice hooks, remove entries installed by an
early alpha build:
pad-lattice uninstall-codex-hooks
Restart the plain Codex session after cleanup. Unrelated hook handlers are preserved.
A Background Session Replaced the Center
Background state updates should change only their status indicator. Use the
eight right-side Agent Scene selectors to confirm the selected session. If behavior differs,
verify that every integration sends a stable backend and session_id;
messages without identity all share local/default.
Inspect the daemon's exact target and slot assignments:
pad-lattice status --watch
Amber Overflow Light Stays On
CC 95 is a steady amber warning when more sessions are registered than the
surface can show. Use pad-lattice status to inspect overflow entries, then
end sessions that are no longer active:
pad-lattice end-session --backend codex --session-id SESSION_ID
Closing a pad-lattice codex launcher removes its leased Scene immediately.
Plain codex sessions do not register automatically; Desktop can connect them explicitly.
Approve or Reject Does Nothing
An action control is completely dark when no live request can consume it. A
lit Approve or Reject control means an interactive Codex PermissionRequest
hook is waiting for that exact session.
Confirm all of the following:
- the requesting agent's right-side Scene is selected;
- the session was started with
pad-lattice codex; /hooksshows the current Pad-LatticePermissionRequesthandler as trusted;- the daemon and launcher use the same socket;
- the 60-second surface-decision window has not elapsed.
Restart through the launcher and review a changed definition again:
pad-lattice codex --label task -- resume <SESSION_ID>
If the surface window expires, Codex presents its normal keyboard approval prompt. Approve applies only to the current permission request.
Test routing with an explicit identity:
pad-lattice listen-actions --backend test --session-id agent-a
Select that session's Scene, then press or tap an action. The listener should receive a JSON message containing the same identity. Actions are intentionally ignored instead of broadcast when no matching subscriber exists.
For codex-exec, only Stop is available. Interactive Stop, Retry, and ordinary
chat replies are not provided by Codex permission hooks.
A Closed Codex Session Remains Colored
Use the leased launcher for immediate process-lifecycle cleanup:
pad-lattice codex --label task -- resume <SESSION_ID>
Sessions created by an older integration may be removed manually or retired by the unleased-session TTL:
pad-lattice status
pad-lattice end-session --backend codex --session-id <SESSION_ID>
Validate a Profile
Run Pad-Lattice's built-in parser and semantic checks without opening MIDI:
pad-lattice profile validate ./controller.json
Profile authors can additionally check the published JSON Schema after
installing the optional schema extra:
pad-lattice profile validate ./controller.json --validate-schema
This remains a dry run. Physical mapping is verified separately:
For physical mapping problems, create a guided report:
pad-lattice profile test \
--profile-file ./controller.json \
--report controller-report.json
GitHub Pages Does Not Update
The documentation workflow runs on demand. In the repository Actions tab, select Documentation and choose Run workflow. It builds the site, checks the search index, and deploys the Pages artifact.