Troubleshooting
Problems that have actually come up during setup or use, with the fix that worked. Add new entries here when new issues surface.
Password not found in Keychain
Any command complaining about this means this machine Keychain does not have the password. Fix: run session setup. If I already ran setup but the error persists, my Keychain access may have been revoked — re-run setup and click "Always Allow" when macOS prompts.
Keychain prompt on every command
The first time session connects to Odoo, macOS pops a dialog asking permission to read from Keychain. Click "Always Allow", not just "Allow". "Allow" is one-time and will re-prompt next command. "Always Allow" remembers the decision.
Permission denied on /usr/local/bin/session
The session wrapper needs read and execute permissions for my user. If I copied it with sudo, it may have restrictive permissions. Fix: sudo chmod 755 /usr/local/bin/session. Verify with ls -la /usr/local/bin/session — the start should read -rwxr-xr-x.
Missing personal stages error
The scripts expect 5 specific personal stage names in Odoo: Inbox, Today, This Week, Next Week, Later. If I renamed any or if they do not exist for my user, session pull and session seed will abort with a list of what was found vs expected. Fix: rename the stages in Odoo To-do to match exactly (case-sensitive, including spaces).
git pull conflict during session open
Rare, but can happen if I manually edited files in the repo on both machines without closing. Fix: cd ~/Projects/bpc-war-plan && git status to see conflicts. Usually the culprits are latest.json or sessions.log. If the conflict is in exports/, I can safely accept the most recent version (git checkout --theirs exports/ then git add exports/ && git rebase --continue) because both files are regenerated on the next session command anyway.
Task count looks wrong
If session pull returns way more or fewer tasks than I see in the Odoo To-do kanban, the filter may be mismatched. Diagnostics: examine exports/latest.json and check project_id, state, active, and personal_stage_type_ids on a sample of tasks. The filter in session.py uses project_id=False + personal_stage in 5 open stages + active=True + state open. All four conditions must hold for a task to appear.