error: or warning: on standard error. With --json, the code is in error.code or warnings[].code, as The envelope shows. The app shows the message in its own words, under a title that names what failed, such as Couldn’t switch to work. It ends with a step in the app, such as Sign In Again, or with Learn More, which opens the part of this page that lists the code.
Where a fix is a command, the app’s way follows it, starting “In the app”. Those steps give the macOS app’s words. On Windows, you select each control, and it reads in sentence case, such as Sign in again.
Exit codes says what each exit status means. label_unusable appears only in pitboard log.
A row that starts with a tool’s name gives what the code means for that tool.
On Windows, a message names claude.cmd or codex.cmd where Pitboard found the one npm installs, as Claude Code does not start in Windows PowerShell says.
Accounts and labels
| Code | Exit | Meaning | What to do |
|---|---|---|---|
account_unknown | 1 | No account is enrolled under that label. The message lists the labels that are. | Check the label, or add the account with pitboard enroll <label> --sign-in. In the app, click Add Account. |
label_taken | 1 | The label belongs to another account of the same tool. | Choose another label. |
already_enrolled | 1 | The account is enrolled under the label the message names. | Use that label. To add another account, run pitboard enroll <label> --sign-in. In the app, sign in to a different account in Add Account. |
label_ambiguous | 1 | A label with no tool, such as work, names accounts of more than one tool. | Add the tool: claude/work, codex/work or desktop/work. |
provider_unknown | 1 | A label for use, forget or the first of rename starts with an unknown tool, such as codx/work. | Start it with claude/, codex/ or desktop/, or leave the tool out. |
live_account_not_enrolled | 1 | The account in use is not enrolled, so Pitboard cannot park its login. | Enrol it with pitboard enroll <label>, pitboard enroll codex/<label> or pitboard enroll desktop/<label>. In the app, click Add Account. |
cannot_forget_active_account | 1 | The account is in use. | Switch to another account, then forget it. In the app, switch to another account, then choose Remove Account. |
account_not_in_use | 1 | You clicked Update Claude Code’s Config for an account no longer in use. Pitboard wrote nothing. | Nothing. A switch writes the config itself. |
usage | 2 | The command line is wrong. | Check it with --help. |
usage | 2 | A label for enroll, or the second label for rename, breaks the label rules. | Choose a label the rules allow. |
usage | 2 | The second label for rename names another tool, as in pitboard rename work codex/job. | Keep the account’s tool. To move it, enrol the account in that tool. |
Parked logins
| Code | Exit | Meaning | What to do |
|---|---|---|---|
nothing_parked | 1 | The account has no parked login. The last one went back into use, and the tool moved on from it. | Sign in to it again with pitboard enroll <label> --sign-in. In the app, click Sign In Again. |
parked_login_expired | 1 | The parked login has expired. | Run pitboard enroll <label> --sign-in. In the app, click Sign In Again. |
parked_login_refused | 1 | Anthropic or OpenAI no longer accepts the parked login. Pitboard dropped it and moved nothing. | Run pitboard enroll <label> --sign-in. In the app, click Sign In Again. |
parked_login_belongs_elsewhere | 1 | The parked login belongs to another account than the label’s. Nothing moved. | Run pitboard doctor, then pitboard enroll <label> --sign-in. In the app, open Diagnostics, then click Sign In Again. |
parked_credential_missing | 1 | The parked login is missing from where Pitboard keeps it: the keychain, vault in Pitboard’s directory on Linux and Windows, or ~/.pitboard/parks for Claude Desktop. | Run pitboard enroll <label> --sign-in. In the app, click Sign In Again. |
parked_credential_corrupt | 1 | The parked login is not the one Pitboard recorded. | Run pitboard enroll <label> --sign-in. In the app, click Sign In Again. |
park_slot_exhausted | 1 | Pitboard found no free name to park a login under. | Run pitboard doctor. In the app, open Diagnostics. |
renewal_failed | 1 | Pitboard could not renew a parked login. | Run pitboard doctor if it keeps happening. In the app, open Diagnostics. |
credential_too_large | 3 | On macOS, the login is too large for security to read from standard input, and PITBOARD_NO_ARGV=1 forbids the argument line. | Unset PITBOARD_NO_ARGV. Or, for Claude Code, sign out of MCP servers you no longer use. See Large logins on macOS. |
credential_too_large | 3 | On Windows, Claude Code’s login is too large for Credential Manager, even in pieces. | Sign out of MCP servers you no longer use. |
vault_form_unsupported | 1 | pitboard vault move ran on macOS or Windows, which keep parked logins one way. Nothing changed. | Nothing. Only Linux keeps them either way. |
Switching
These come from a Claude Code or Codex switch. A Claude Desktop switch has its own, in Claude Desktop.| Code | Exit | Meaning | What to do |
|---|---|---|---|
switch_rolled_back | 1 | Pitboard could not write the incoming login, so it put the outgoing one back. Nothing was lost. | Fix the reason the message gives, then switch again. |
switch_did_not_hold | 3 | Claude Code: a /logout removed the incoming login before the switch finished. Both logins are parked. | Run claude, sign in to any enrolled account, then run pitboard use with the account you switched to. In the app, switch to that account. |
switch_did_not_hold | 3 | Codex: a codex process started before the switch rewrote auth.json during it. The incoming login is still parked. | Quit every codex, then run pitboard. Run neither codex login nor codex logout first: each revokes the login it finds. In the app, click Refresh. |
switch_unverified | 3 | Writing the incoming login failed, and Pitboard could not read the login back to see what changed. Nothing was deleted. | Unlock the keychain, run Pitboard from a desktop session where Credential Manager holds the login, or make .credentials.json or auth.json readable to you. Then run the same pitboard use again. In the app, switch again. |
switch_corrupted | 3 | Pitboard could not write the incoming login or put the outgoing one back. The outgoing login is still parked. | Sign in to any enrolled account with claude or codex login, then run pitboard use with the account you switched from. In the app, switch to that account. |
signed_in_account_changed | 1 | The account in use changed during the switch. Nothing moved. | Try again. |
identity_unverifiable | 1 | Pitboard could not confirm with Anthropic or OpenAI whose login it was about to move, so it moved nothing. The message names the login, the one signed in or the one parked for the account switched to, and what the service answered. | Do what the message says. If the message names a SOCKS proxy, set that variable to an HTTP proxy or unset it, as Proxies describes. |
live_login_refused | 1 | Anthropic refuses the refresh token of Claude Code’s login in use for good, so that login no longer works and Pitboard cannot park it. | Run pitboard use <label> --yes to put the account’s login in its place, or sign in to Claude Code again. In the app, choose Replace when Pitboard asks. |
account_on_hold | 1 | Anthropic has put the account on hold. Pitboard keeps its login. | Follow Anthropic’s instructions for the account, at the link the message gives, then try again. |
replace_failed | 1 | Pitboard could not put the account’s login in place of the refused one. The account’s login is still parked. | Run the switch again. If it keeps failing, run pitboard doctor. In the app, open Diagnostics. |
install_failed | 1 | Nothing was signed in, and Pitboard could not put the account’s login where the tool reads it. The account’s login is still parked. | Fix the reason the message gives, then run the switch again. |
session_expired | 1 | The tool’s login in use has expired, so Pitboard cannot identify it. If the message says cannot be renewed, Pitboard tried to renew it, and Anthropic no longer accepts it or it has no refresh token. | Run claude or codex once so it renews its login, then try again. If the message says cannot be renewed, run claude and sign in. |
Signing in
| Code | Exit | Meaning | What to do |
|---|---|---|---|
sign_in_incomplete | 1 | The tool’s sign-in stopped before it finished. Nothing was enrolled. | Run pitboard enroll <label> --sign-in again. In the app, click Add Account again. |
sign_in_not_isolated | 1 | Codex keeps its login in memory only, so a sign-in would leave nothing to enrol. | See Codex keeps its login outside its file store. |
sign_in_in_progress | 1 | Another sign-in, from pitboard enroll --sign-in or the app, is still waiting. | Finish or cancel that one first. |
sign_in_pinned_to_console | 3 | Managed settings set Claude Code’s forceLoginMethod to console, so its sign-in would make an Anthropic Console login, which Pitboard cannot enrol. No sign-in started. | See Before you add a Claude Code account. |
sign_in_not_installed | 3 | Pitboard could not confirm the new login replaced the one in use, so it parked it. | Run pitboard. If nothing is signed in, sign in to any enrolled account with claude or codex login. Then run pitboard use <label>. In the app, click Refresh, then switch to the account. |
sign_in_not_installed | 3 | The same, and Pitboard could not park it either. | Sign in to the account with claude or codex login. In the app, click Sign In Again. |
sign_in_not_kept | 1 | The new login could not be put in use, so Pitboard did not keep it. The tool keeps its login. | Run pitboard enroll <label> --sign-in again. In the app, click Sign In Again. |
claude_program_missing, codex_program_missing, claude_not_found, codex_not_found | 1 | Pitboard cannot find claude or codex to sign in with. | Install the tool, put its folder on your PATH, or set PITBOARD_CLAUDE or PITBOARD_CODEX to its full path. For the app, see Pitboard cannot find a tool. |
Interrupted switches
A Claude Code or Codex switch that was interrupted, and that the next change cannot finish, showsrecovery_undetermined in these places:
| Where | How |
|---|---|
| Every change | An error. The change stops and changes nothing. |
pitboard status | A warning. |
| Each read in the app | The notice A switch didn’t finish, with a Cancel Switch button. |
pitboard status --offline | A warning. |
pitboard doctor | Listed under interrupted switch. |
| The app’s Diagnostics | Listed under Switch That Didn’t Finish. |
| Code | Exit | Meaning | What to do |
|---|---|---|---|
recovery_undetermined | 1 | An earlier switch was interrupted, and Pitboard cannot yet tell whether it finished. Nothing changed. | Run claude or codex once, then try again. If it still fails, see An interrupted switch cannot be finished. |
recovery_elsewhere | 1 | CLAUDE_CONFIG_DIR or CODEX_HOME differs from the interrupted switch’s, so Pitboard cannot tell what it did. Nothing changed. | Set the variable back and try again, or run pitboard abandon. In the app, click Cancel Switch on the notice. |
recovery_failed | 1 | Pitboard could not read or write journal.json, its record of a switch in progress. | Check that you can read and write the file the message names. |
recovery_record_corrupt | 3 | journal.json is damaged. Nothing changed. | Check that pitboard status, or the app, shows the account you expect in use, then delete the file the message names. |
The Pitboard directory
| Code | Exit | Meaning | What to do |
|---|---|---|---|
home_not_absolute | 1 | A variable naming a folder is empty or relative. Pitboard reads and changes nothing. | Set the variable the message names to a full path, or unset it. |
state_on_synced_drive | 1 | Pitboard’s directory is inside a folder that syncs to other machines, such as Dropbox, iCloud Drive or, on Windows, OneDrive or a roaming profile. Two machines taking turns with one parked login end it for both. | Set PITBOARD_HOME to a local folder. The Pitboard directory lists the folder names Pitboard refuses. |
state_unreadable | 1 | Pitboard could not read its account list, state.json. | Check that you can read the file the message names. |
state_corrupt | 1 | The account list is not valid. | Delete the file the message names and enrol your accounts again. Their parked logins are lost. |
state_from_newer_version | 1 | A newer Pitboard wrote the account list. | Update Pitboard the way you installed it. Until then, a status line that runs the older copy shows unenrolled. |
state_version_unknown | 1 | The account list is in a format no Pitboard has written. | Delete the file the message names and enrol your accounts again. |
state_names_unknown_tool | 1 | The account list has an account of a tool this Pitboard does not know. | Update Pitboard. |
state_wrong_machine | 1 | The account list was written on another computer, so Pitboard does not use it. | Run pitboard adopt, then sign in to each account again. See The Pitboard directory came from another computer. |
state_write_failed | 1 | Pitboard could not save its account list. | Check that you can write to the file the message names. |
home_unwritable | 1 | Pitboard could not write to its directory, a lock file in it or the renewal schedule’s files. | Check that you can write to the path the message names. |
pitboard_open | 1 | pitboard uninstall while the Pitboard app is open, which would make Pitboard’s directory again. Nothing was deleted. | Quit the app with Quit Pitboard, or Exit in its icon’s menu on Windows. On Linux, press Ctrl+Q in its window, or choose Quit in its tray menu. Then run pitboard uninstall again. |
home_not_absolute refuses these values:
| Variable | Refused when |
|---|---|
HOME, or USERPROFILE on Windows, PITBOARD_HOME, CLAUDE_CONFIG_DIR | Empty or relative, such as pitboard |
CLAUDE_SECURESTORAGE_CONFIG_DIR, CODEX_HOME | Relative |
Claude Code and Codex files
| Code | Exit | Meaning | What to do |
|---|---|---|---|
claude_config_missing | 1 | Claude Code has not run on this machine: its config file is missing. | Run claude once, sign in, then try again. |
claude_config_unreadable | 1 | Pitboard could not read Claude Code’s config. | Check that you can read the file the message names. |
claude_config_not_json | 3 | Claude Code’s config is not valid JSON, perhaps because it is mid-write. | Wait a few seconds and try again. |
live_credential_absent | 1 | Nothing is signed in to the tool. | Sign in with claude or codex login, then try again. |
live_credential_elsewhere | 3 | Claude Code’s config names an account in use, and Pitboard cannot find its login where it reads. | Check for a Pitboard update. If there is none, report a problem with pitboard doctor --json. In the app, click Copy Report in Diagnostics. |
live_credential_shape_unexpected | 3 | The login in use is not shaped like a Claude Code or Codex login. | Run pitboard doctor before you switch again. In the app, open Diagnostics. |
live_store_unsupported | 3 | Codex keeps its login outside auth.json, is signed in with an API key or has settings Pitboard cannot read. The message names the setting. | See Codex files. |
login_restricted | 3 | A setting of the tool’s rules out the login a change would put in use: Codex would sign out of it and delete it, or leave it unused, and Claude Code would refuse it. The message names the setting. Nothing changed. | For Codex, see Codex settings rule out an account. For Claude Code, see Before you add a Claude Code account. |
codex_home_missing | 1 | On Windows, CODEX_HOME names no folder, so Codex does not start. | Make that folder, or unset CODEX_HOME. |
custom_oauth_endpoint | 3 | CLAUDE_CODE_CUSTOM_OAUTH_URL is set, so Pitboard does not act on Claude Code. | Unset it in the environment and in the env block of any Claude Code settings file. See Custom OAuth endpoint. |
left_login_changed | 1 | The login file behind the keychain or Credential Manager changed, or is gone, since pitboard stow said what it held. | Run pitboard stow again. In the app, click Clean Up again. |
left_login_not_enrolled | 1 | The login file behind the keychain or Credential Manager holds the login of an account not enrolled here, which the message names. | Enrol that account, then run pitboard stow again. In the app, add that account, then click Clean Up again. |
left_login_unidentified | 1 | pitboard stow could not ask Anthropic whose login the file holds, or could not renew it. | Check the connection and try again. |
stored_login_changed | 1 | A sign-in replaced Claude Code’s stored login while pitboard stow was deleting the file because of that login. | Run pitboard stow again. In the app, click Clean Up again. |
pitboard stow keeps its own code, cause and exit status. The file stays, and the message ends with what stow did first. An ending of that login no longer works means stow renewed the file’s login and could not write it back.
Credential stores and locks
| Code | Exit | Meaning | What to do |
|---|---|---|---|
credential_store_unreadable | 1 | The keychain, Credential Manager or the file that holds a login could not be read. | Run pitboard doctor. In the app, open Diagnostics. |
credential_store_unreadable | 1 | On Windows, Credential Manager holds a Claude Code login, and nothing Pitboard reads says whether Claude Code uses Credential Manager or .credentials.json. | Set CLAUDE_CODE_FORCE_WINDOWS_CREDMAN to 1 in the env of Claude Code’s settings.json, as Use Pitboard with Claude Code shows. |
credential_store_unreadable | 1 | On Windows, Credential Manager holds pieces of a Claude Code login that no read can join, which Claude Code cannot read either. | See The Claude Code login in Credential Manager cannot be read. |
credential_store_locked | 1 | The keychain is locked, and macOS cannot ask for its password here, as over SSH. | See macOS says the keychain is locked. |
credential_store_locked | 1 | On Windows, Credential Manager cannot be reached from this sign-in, as over SSH with a key. | Run Pitboard from a desktop session. |
credential_store_locked | 1 | On Linux, the login keyring that holds parked logins is locked and cannot ask to be unlocked here, or no Secret Service answers on this session’s bus. | See Linux says the login keyring is locked. |
credential_sealed | 1 | On Windows, a parked login sealed to your Windows account does not open in this sign-in: after an administrator reset your password, on a profile restored on another PC, or over SSH with a key. | See Parked logins do not open on this PC. |
credential_not_json | 3 | A stored login is not valid JSON. | Run pitboard doctor. In the app, open Diagnostics. |
credential_write_failed | 1 | Writing a login failed. | Fix the reason the message gives, then try again. |
credential_not_durable | 1 | A login read back different or empty after it was written. | Run pitboard doctor. In the app, open Diagnostics. |
switch_in_progress | 1 | Another process held Claude Code’s write lock or refresh lock for the whole wait, about 7.5 seconds. | Try again in a few seconds. A lock left by a killed Claude Code session clears within a minute. |
lock_unavailable | 1 | Pitboard could not take one of those locks for another reason. | Fix the reason the message gives, then try again. |
claude, sign in, then try again.
Claude Desktop
A change to a Claude Desktop account can stop with these codes. So canabandon while a move waits, and uninstall while Pitboard holds a Claude Desktop login or a move of one waits. Where another section lists the same code, such as live_credential_absent, this table gives its Claude Desktop meaning.
An interrupted Claude Desktop move shows move_waiting on each read, as Warning codes lists. pitboard doctor lists it under interrupted Claude Desktop move, and the app’s Diagnostics under Switch That Didn’t Finish. A Claude Desktop change stops only where it cannot settle the move.
| Code | Exit | Meaning | What to do |
|---|---|---|---|
live_store_unsupported | 3 | Pitboard switches Claude Desktop on macOS only, where HOME is your account’s own home. | Run Pitboard on macOS with HOME unset, or set to your account’s home. |
live_store_unsupported | 3 | Pitboard could not lock Claude’s data folder. | Fix the reason the message gives, then try again. |
app_open | 1 | Claude is open, or part of it still runs after it quit, such as ShipIt. Nothing changed. | Quit Claude with Command-Q, then try again. See Claude is open. |
app_state_unknown | 1 | Pitboard could not read the list of processes, so it cannot tell whether Claude is open. Nothing changed. | Try again. |
login_folder_busy | 1 | Another Pitboard directory is changing Claude’s login. Nothing changed. | Try again once it has finished. |
login_folder_unknown | 3 | Claude’s data folder is in a state Pitboard moves no login in. The message says which, such as account data in a form Pitboard has not read, an entry it could not look at, a link, a third-party deployment of Claude, Reset App Data waiting, or a cookie store or settings it cannot read. Nothing changed. | Follow the message. For account data Pitboard has not read, see Account data in a form Pitboard has not read. |
login_folder_unreadable | 1 | Pitboard could not read Claude’s cookie store. Nothing changed. | Open Claude, quit it with Command-Q, then try again. |
live_credential_absent | 1 | Claude is signed out. | Run pitboard enroll desktop/<label> --sign-in, then sign in inside Claude and quit it. In the app, click Add Account, then Continue. |
sign_in_unfinished | 1 | Claude has not finished signing in. Nothing changed. | Open Claude, wait until it shows your chats, quit it with Command-Q, then try again. |
login_in_doubt | 3 | Pitboard cannot tell whose login Claude holds: Claude names another account than the one Pitboard recorded, or an account was signed in to outside Pitboard. Nothing changed. | Open Claude, check which account it shows and quit it. Then run pitboard enroll desktop/<label> with that account’s label. In the app, click Add Account, then Add the Account Claude Shows. See Claude Desktop logins. |
different_volume | 3 | ~/.pitboard/parks is on another volume than Claude’s data folder. Pitboard never copies a Claude Desktop login. | Keep Pitboard’s directory on the volume your home is on. |
parks_not_private | 3 | Others can reach ~/.pitboard/parks, or it is a link or not yours. | Run the chmod 700 the message names, or set PITBOARD_HOME to a folder of your own on this volume. |
machine_unknown | 3 | Pitboard could not read this Mac’s identifier, which it writes beside every parked Claude Desktop login. Nothing changed. | Report a problem with pitboard doctor --json. In the app, click Copy Report in Diagnostics. |
parked_credential_corrupt | 1 | The parked login is not the one Pitboard recorded, or it was parked on another Mac, where Claude’s key differs. | Run pitboard enroll desktop/<label> --sign-in. In the app, click Sign In Again. |
credential_store_unreadable | 1 | Pitboard could not look at a parked login’s folder in ~/.pitboard/parks, or at anything in it. The login is still there. | Make the path the message names, and each folder it is in, readable to you. Then try again. |
recovery_undetermined | 1 | An earlier move was interrupted, and Pitboard cannot tell where it stopped. Nothing changed. | See A Claude Desktop move was interrupted. |
recovery_undetermined | 1 | Pitboard stopped partway through settling or giving up an earlier move. The message says why. Nothing is lost, and the move stays recorded. | Keep Claude closed and try again. Pitboard settles the move first. If it stops again, give up the move. |
recovery_elsewhere | 1 | An earlier move was interrupted in another user account’s data folder. Nothing changed. | Run Pitboard as that user, or run pitboard abandon. In the app, click Cancel Switch on the notice. |
app_opened_midway | 1 | Claude was opened while Pitboard moved a login, so Pitboard stopped. Nothing is lost, and the move stays recorded. | Quit Claude with Command-Q, then try again. Pitboard settles the move first. |
move_undone | 1 | Pitboard could not park the login in use, and undid what it had done. That account stays in use. | Try again. |
move_stopped | 1 | Pitboard stopped partway through a move. The move stays recorded. | Keep Claude closed and try again. Pitboard settles the move first. |
switch_left_signed_out | 1 | Pitboard parked the account in use and could not put the other in use. Claude is signed out, and both logins are parked. | Run pitboard use with either account. In the app, switch to either. |
switch_left_signed_out | 1 | Claude was signed out, and Pitboard could not put the account switched to in use. Its login is still parked. | Run the same pitboard use again. In the app, switch to it again. |
move_mixed | 3 | Giving up a move would leave parts of one account beside another login in the data folder. Nothing changed. | Open Claude, check which account it shows and quit it. Then run pitboard enroll desktop/<label> with that account’s label. In the app, click Add Account, then Add the Account Claude Shows. Pitboard sets the other parts aside first. |
uninstall_would_strand | 1 | No Claude Desktop account is in use and one is parked, so uninstall would delete every Claude Desktop login Pitboard holds. | Run pitboard use with that account, then run pitboard uninstall. Or forget each Claude Desktop account first. In the app, switch to that account or remove each Claude Desktop account, then uninstall again. |
uninstall_would_strand | 1 | No Claude Desktop account is in use or parked, and a folder set aside holds a Claude Desktop login, so uninstall would delete it. | Run pitboard enroll desktop/<label> --sign-in, then run pitboard uninstall. In the app, add an account with Add Account, then uninstall again. |
sign_in_settled_elsewhere | 1 | While pitboard enroll --sign-in waited, another Pitboard command finished, undid or removed that sign-in. Nothing was enrolled. | Run pitboard to see who is signed in. In the app, click Refresh. |
Renewal schedule
pitboard watch install refuses with the same codes, for the watch service in place of the schedule. Where a fix says to turn on daily renewal again, run pitboard watch install again instead. Where it refuses with schedule_unsupported, leave pitboard watch running in a terminal.
| Code | Exit | Meaning | What to do |
|---|---|---|---|
schedule_unsupported | 1 | This system has no scheduler Pitboard writes to. On Linux, systemd did not start the system, as in many containers. | Run pitboard renew yourself from time to time. |
schedule_not_default_home | 1 | PITBOARD_HOME names a directory other than Pitboard’s own, ~/.pitboard or %USERPROFILE%\AppData\Local\Pitboard, and the schedule renews only that one. A link to it counts as another directory. | Unset PITBOARD_HOME, then turn on daily renewal again. For the other directory, run pitboard renew with PITBOARD_HOME set. |
schedule_refused | 1 | launchctl on macOS, Task Scheduler on Windows or your user’s systemd on Linux refused the schedule, or could not be asked. The message gives its answer. | Fix what it names, then turn on daily renewal again. |
schedule_manager_elsewhere | 1 | On Linux, your user’s systemd does not read units from systemd/user in XDG_CONFIG_HOME, or runs them with another HOME. Nothing changed. | Give your shell and your user’s systemd the same HOME and XDG_CONFIG_HOME, as systemd reads units from another folder or home says. Then turn on daily renewal again. |
schedule_program_missing | 1 | The app only: the command line inside the app, which the schedule would run, is not there. | Install the app again. |
schedule_program_temporary | 1 | On macOS, the app runs from a temporary copy macOS made, which is gone once the app quits. | Move Pitboard to your Applications folder, open it from there and turn on daily renewal again. |
schedule_program_temporary | 1 | On Windows, pitboard.exe runs from the temporary copy Windows made of a zip it opened. | Install Pitboard, or extract the zip, and turn on daily renewal from there. |
schedule_program_temporary | 1 | On Linux, pitboard runs from inside an AppImage, in the folder its runtime mounted or extracted it into, which is gone once it quits. | Install Pitboard as Install Pitboard describes, and turn on daily renewal from there. |
schedule_program_unnamed | 1 | The app only: this copy has no command line inside it for the schedule to run. | Install the app as Install Pitboard describes, then open that copy. |
Warm-up
| Code | Exit | Meaning | What to do |
|---|---|---|---|
warm_up_unsupported | 1 | pitboard warm on or pitboard warm now named a Codex or Claude Desktop account. Pitboard warms up Claude Code accounts only. | Turn it on for a Claude Code account. |
warm_up_not_started | 1 | Claude Code’s request was answered, and Anthropic still has no five-hour period running. | Pitboard counts it against the day’s three tries. Check the account’s limits with pitboard status. In the app, read them in Accounts. |
warm_up_limit_reached | 1 | A limit of the account is used up, and Anthropic refused the request. | Wait for that limit to reset. |
warm_up_login_refused | 1 | Anthropic refused the login’s access token. | Sign in to the account again. |
warm_up_unreachable | 1 | Anthropic could not be reached, or was overloaded. | Pitboard tries again after 1 minute, doubling up to 15 minutes. |
warm_up_timed_out | 1 | Claude Code did not finish within 2 minutes, and Pitboard stopped it. | As for warm_up_unreachable. |
warm_up_failed | 1 | Claude Code failed for another reason, which the message gives in its words. | Check that claude runs in a terminal. |
warm_up_auth_overridden | 1 | Claude Code’s managed settings, or an API key in its remote token file, make it sign in another way, so a request would not be on the account’s login. | Remove the key the message names, or ask whoever manages this computer. |
warm_up_in_progress | 1 | Another Pitboard is warming up an account. | Try again in a minute. |
warm_setting_unreadable | 1 | Pitboard could not read warm.json. | Make it readable to you again. |
warm_setting_corrupt | 1 | warm.json is not in a shape Pitboard reads. | Delete it, then turn warm-up on again for each account. |
pitboard warm now refuses an account with nothing to start with the code of the reason: limit_used_up, no_reading, nothing_to_start, parked_login_expired or nothing_parked, as When it holds back describes. Where nothing can be warmed up here, it refuses with that reason’s code: switch_interrupted, custom_oauth_endpoint, warm_up_auth_overridden or claude_not_found.
Root, sudo and administrator
| Code | Exit | Meaning | What to do |
|---|---|---|---|
elevated | 1 | Pitboard runs with sudo, as root on macOS, or as root in a folder another user owns on Linux, so it refuses every change. pitboard status and the app’s reads warn read_only instead. | Run the command as yourself. See Pitboard changes nothing as root. |
elevated | 1 | On Windows, Pitboard runs elevated: from a terminal started with Run as administrator, with User Account Control off, or as the built-in Administrator. Reads warn read_only. | See Pitboard changes nothing as administrator. |
Windows
| Code | Exit | Meaning | What to do |
|---|---|---|---|
system_too_old | 1 | Windows is older than Windows 11 24H2, build 26100, or Pitboard cannot tell its build, so Pitboard refuses every change. Reads warn read_only. | Update Windows. See Pitboard changes nothing on this version of Windows. |
windows_not_released | 1 | A Windows build of a 0.x release, made before Pitboard for Windows was released. It changes nothing and answers only --version, --help, completions and manpage. | Install Pitboard for Windows. |
Command output
| Code | Exit | Meaning | What to do |
|---|---|---|---|
checks_failed | 3 | pitboard doctor found at least one broken check. data.checks lists every check. | Follow the advice under each broken check. |
output_is_not_a_report | 2 | pitboard completions or pitboard manpage was given --json. Each prints a generated file, which has no JSON form. | Run the command without --json. |
confirmation_needed | 2 | pitboard forget, pitboard stow or pitboard uninstall could not ask before deleting, as in a script or with --json, and was not given --yes. Nothing changed. | Run it in a terminal, or add --yes. See Questions before deleting. |
Stale codes
stale in Status data says why a reading is not live. pitboard status shows its text after the reading’s age, as in measured 14:02, 3m ago · Anthropic could not be reached. The app shows its own words as a note on the account. For a Codex account, the text names OpenAI, Codex and codex.
stale | Command line | App | What to do |
|---|---|---|---|
not_asked | read without asking Anthropic | Read without asking Anthropic | Pitboard read without asking, as --offline does. Run pitboard status without --offline, as yourself. |
asked_recently | None | None | Nothing. Pitboard asked too recently for the limit to have moved one percentage point. pitboard status --fresh asks anyway. |
interrupted | the check did not finish | The check didn’t finish | Run the command again. In the app, click Refresh. |
unreachable | Anthropic could not be reached | Anthropic couldn’t be reached | Check the connection, then run pitboard status --fresh. In the app, click Refresh. |
server_error | Anthropic answered with an error; try again later | Anthropic answered with an error; try again later | Run pitboard status --fresh later. In the app, click Refresh later. |
refused | Anthropic refused to answer for this login | Anthropic refused to answer for this sign-in | Sign in to the account again. |
on_hold | Anthropic has put this account on hold | Anthropic has put this account on hold | Follow Anthropic’s instructions for the account. Pitboard keeps its parked login. |
rate_limited | Anthropic is rate limiting usage checks | Anthropic is rate limiting usage checks | Wait. Pitboard waits before it asks again, and --fresh waits too. |
answer_not_understood | Anthropic's answer was not understood | Anthropic’s answer wasn’t understood | Report a problem. |
session_expired | Claude Code's session has expired; `claude` renews it | Claude Code’s session has expired; using Claude Code renews it | The tool renews its login in use at its next request. Run claude once. |
login_refused | its parked login is no longer accepted; sign in again | Its saved sign-in no longer works | Sign in to the account again. |
login_refused | Claude Code's login is no longer accepted; run `claude` and sign in again | Claude Code’s sign-in no longer works | On the account in use: Anthropic refused the login in use, which Pitboard tried to renew to identify it. Run claude and sign in. |
nothing_signed_in | nothing is signed in | Nothing is signed in | Run claude and sign in, or codex login for Codex. |
login_unreadable | Claude Code's login could not be read; run `pitboard doctor` | Claude Code’s sign-in couldn’t be read | The login is there but unreadable, such as behind a locked keychain or in Credential Manager over SSH. Run pitboard doctor. In the app, open Diagnostics. |
login_unusable | Claude Code's login is not one Pitboard can park or switch; run `pitboard doctor` | Claude Code’s sign-in isn’t one Pitboard can switch | The login is one Pitboard cannot park or switch, such as one made with an API key. Run pitboard doctor. In the app, open Diagnostics. |
park_unreadable | its parked login cannot be read; run `pitboard doctor` | Its saved sign-in can’t be read | Run pitboard doctor. In the app, open Diagnostics. |
parked_access_expired | None | None | Nothing. The parked login’s access token has expired, and Pitboard could not renew it this time. |
nothing_parked | None | None | The account has no parked login. Sign in to it again. |
login_replaced | its login was replaced by a sign-in outside Pitboard; sign in again | Its sign-in was replaced by a sign-in outside Pitboard | See An account reads login replaced outside Pitboard. Given with --offline too. |
login_replaced | its login was signed out or replaced in Claude; sign in again | Its sign-in was signed out or replaced in Claude | Claude Desktop: see An account reads login replaced outside Pitboard. Given with --offline too. |
no_usage | Pitboard reads no usage for Claude Desktop, once for all its accounts | No usage read in the menu | Nothing. A Claude Desktop account has no usage to read: see What Pitboard does not do for Claude Desktop. |
Cause codes
error.cause says what went wrong in a request to Anthropic or OpenAI. These errors carry one:
| Error | error.cause |
|---|---|
identity_unverifiable | Always |
left_login_unidentified | Always |
live_login_refused | login_refused |
account_on_hold | refused |
session_expired | token_expired, or login_refused where the message says cannot be renewed |
renewal_failed | When known |
An error that stops pitboard stow | That error’s own |
null. checks_failed and output_is_not_a_report have no cause field.
error.cause.worth_retrying says whether asking again later could get a different answer.
| Cause | worth_retrying | Meaning |
|---|---|---|
unreachable | true | Anthropic or OpenAI could not be reached. |
rate_limited | true | Anthropic or OpenAI asked for fewer requests. |
server_error | true | Anthropic or OpenAI answered with an error. |
refused | false | Anthropic or OpenAI refused the request, and would refuse it again. |
answer_not_understood | false | Pitboard did not understand the answer. |
login_refused | false | The login was revoked, or already used somewhere else. |
token_expired | false | The login’s access token has expired. |
Warning codes
A warning does not stop the command or change its exit status. In the app, it joins the notice of the switch that raised it, or gets its own notice under the title in this table, in the app’s words.| Code | Title in the app | Meaning | What to do |
|---|---|---|---|
interrupted_switch_finished | A switch that didn’t finish is done | An earlier switch was interrupted after it had finished. Pitboard recorded it as finished. | Nothing. |
interrupted_switch_undone | A switch that didn’t finish was undone | An earlier switch was interrupted before it finished. Pitboard undid it, and nothing was lost. | Nothing. |
recovery_undetermined | A switch didn’t finish | A switch was interrupted, and the next change cannot finish it. | See Interrupted switches. |
interrupted_move_finished | A switch in Claude that didn’t finish is done | An earlier Claude Desktop move was interrupted, and Pitboard finished it first. The message says where that left Claude. | Nothing. |
interrupted_move_undone | A switch in Claude that didn’t finish was undone | An earlier Claude Desktop move was interrupted, and Pitboard undid it first. The message says where that left Claude. | Nothing. |
move_waiting | A switch in Claude didn’t finish | A Claude Desktop move was interrupted, and its record waits. | Keep Claude closed. The next change to a Claude Desktop account settles it first. See A Claude Desktop move was interrupted. |
move_not_given_up | A switch in Claude wasn’t cancelled | abandon gave up a Claude Code or Codex switch, then could not give up a Claude Desktop move. The message says why, such as Claude being open. The move still waits. | Do what the message says. |
move_not_settled | None: only pitboard repair says it | repair could not settle a Claude Desktop move, and repaired the rest. The message says why, such as Claude being open. The move still waits. | Do what the message says. |
login_item_gone | Part of a sign-in was missing | After a move, an item of a Claude Desktop login was in neither the data folder nor its parked login. Pitboard went on without it. The message names the item. | Nothing. |
set_aside | Pitboard moved a folder out of the way | Pitboard moved something into a folder in ~/.pitboard/parks and deleted nothing. The message says which: what blocked a move, an account’s earlier parked login, the keys an account had before Claude rewrote them, or the parts of a login a give-up left. | Nothing. pitboard doctor lists the folders, and so does the app’s Diagnostics, which the notice’s Show Diagnostics opens. |
config_backup_failed | Pitboard has a warning | Pitboard could not back up Claude Code’s config after a switch, so it left the config as it was. | Check that you can write to backups in Pitboard’s directory, then run pitboard use with the account in use. In the app, click Update Claude Code’s Config on the notice Claude Code’s config names another account. |
config_write_failed | Pitboard has a warning | Pitboard could not update Claude Code’s config after a switch, so /status may show another account. | Run pitboard use with the account in use. In the app, click Update Claude Code’s Config on the notice Claude Code’s config names another account. |
renewal_failed | Pitboard has a warning | A read could not renew a parked login. The account shows its last reading. | Run pitboard doctor if it keeps happening. In the app, open Diagnostics. |
parked_login_refused | A saved sign-in no longer works | Anthropic or OpenAI refused a parked login when Pitboard renewed it. | Run pitboard enroll <label> --sign-in. In the app, click Sign In Again on the account. |
parks_pending_removal | Old saved sign-ins are still there | Parked logins Pitboard no longer needs could not be deleted yet. | Nothing. Pitboard tries again at its next change. |
lock_compromised | A sign-in may have been written twice | Claude Code took back its write or refresh lock during the change. The change stood. | Run pitboard to check which account is signed in. In the app, click Refresh. A login parked meanwhile may need a sign-in again. |
written_on_the_command_line | A sign-in was passed on the command line | On macOS, a login too large for security to read from standard input went on its argument line. | See Large logins on macOS. |
auth_overridden | An environment variable overrides the sign-in | A variable such as ANTHROPIC_API_KEY, or apiKeyHelper in a settings file, makes Claude Code sign in another way. | Unset what the message names, then restart Claude Code. See Variables that override the login. |
fallback_login | A leftover sign-in file | On macOS, a login file sits behind the keychain, ~/.claude/.credentials.json by default. Open Claude Code sessions follow a switch only at their next renewal. | Run pitboard stow. In the app, click Clean Up on the notice. If Pitboard cannot read the file, run pitboard doctor. In the app, open Diagnostics. See Claude Code over SSH uses another account. |
fallback_login | A leftover sign-in file | On Windows, .credentials.json sits behind Credential Manager. Open Claude Code sessions follow a switch only at their next renewal. | Run pitboard stow, or select Clean up on the notice. |
sessions_still_running | Open sessions still use the previous account | After a Codex switch, Codex processes started before it still use the previous account. The message names them. | Start each again, as Restart what runs Codex says. Do not sign out in any: that revokes the parked login. |
sessions_keep_old_login | Open sessions still use the old sign-in | After you sign in again to a Codex account, Codex processes started before still use the old login. | Start each again. Otherwise one can put the old login back when it renews. |
sessions_unknown | Couldn’t tell which sessions are open | After a Codex switch or sign-in, Pitboard could not read the list of processes. | Start each Codex process again. Do not sign out in any. |
sign_in_parked_not_in_use | The new sign-in was saved, not put in use | After a sign-in, Pitboard could not identify the login the tool has in use, so it parked the new one. | See If Pitboard cannot identify the login in use. |
sign_in_awaited | None: the notice Adding a Claude Desktop account didn’t finish, or Signing in to home again didn’t finish, says it | Claude is signed out for a sign-in, and the account that was in use is parked. | Finish or undo it, as Finish or undo an add or a sign-in again says. |
login_replaced | A sign-in was replaced outside Pitboard | A sign-in outside Pitboard, such as /login in Claude Code, replaced the only login of the account the message names. | Run pitboard enroll <label> --sign-in, click Sign In Again on the notice, or forget the account. In the app, Remove Account forgets it. See An account reads login replaced outside Pitboard. |
login_replaced | A sign-in was replaced outside Pitboard | The Claude Desktop account the message names was signed out in Claude, which ends its login at claude.ai. Pitboard holds no login for it. | Run pitboard enroll desktop/<label> --sign-in. In the app, click Sign In Again on the notice. |
in_use_unconfirmed | The account in use isn’t confirmed | Claude Code’s config has named another account since Anthropic last identified the stored login, or Anthropic was not asked since an update from 0.9.0 or earlier, so another login may be stored. | Run pitboard status to ask Anthropic. The app asks by itself. See Claude Code shows another account than Pitboard. |
config_names_another | Claude Code’s config names another account | Claude Code’s config names another account than the stored login’s, so /status shows an account that requests do not use. | Run pitboard use with the account in use. In the app, click Update Claude Code’s Config on the notice. |
in_use_unconfirmed, config_names_another | The account in use isn’t confirmed | Claude Desktop: Claude’s settings have named another account, or nobody, since Pitboard last read Claude, so Claude may hold another login. | Open Claude, check which account it shows and quit it. Then run pitboard enroll desktop/<label> with that account’s label. In the app, click Add the Account Claude Shows on the notice. |
login_taken_as_named | A sign-in was taken as the account named for it | use, or enroll --sign-in as it parks the account in use: Pitboard had not seen the login Claude held, and parked it as the account Claude’s settings name. See Claude Desktop logins. | If Claude showed another account, switch back to the one the message names. Then check in Claude, quit it and enrol that login under its own label. In the app, click Add Account, then Add the Account Claude Shows. |
login_taken_as_named | A sign-in was taken as the account named for it | An enrolment, the one that finishes --sign-in included: Pitboard had recorded the login Claude held as another account’s, and filed it as the account Claude’s settings name. The message names both. | Open Claude and check which account it shows. If it is another, quit Claude, then run pitboard enroll desktop/<label> with that account’s label. In the app, click Add Account, then Add the Account Claude Shows. |
looks_signed_out | The account in use may be signed out | Claude’s settings look signed out since Pitboard last read the account in use. | Nothing. The next change to a Claude Desktop account checks. |
| Any other error code | Pitboard has a warning | A renewal or a config update failed with that error without stopping the command. | See that code’s row. |
read_only | Pitboard has a warning | A change here would fail with elevated or system_too_old. A read shows the last numbers, and renews and writes nothing. | See Root, sudo and administrator and Windows. |