Skip to main content

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;
  • /hooks shows the current Pad-Lattice PermissionRequest handler 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.