Skip to content

Troubleshooting

A short, structured list of things that catch real users out — drawn from bacio's ## Gotchas in SKILL.md and from common stumbles when grounding the docs.

Errors with obvious fixes

bacio: not inside a git repository

Most bacio commands resolve the current repo from your working directory. cd into a git working tree first.

If you genuinely want to run something that doesn't need a repo — bacio repo list, bacio --version, bacio schema list — those work anywhere.

bacio: unknown field "..." in JSON payload

You misspelled or invented a field in --json. The JSON decoder is strict — typos surface as errors, not as silent no-ops. Run:

bash
bacio schema show <command-name>

…to see the exact accepted shape. <command-name> is the dotted form: issue.add, feature.edit, doc.link, etc.

bacio: title is required

A required field on a mutating call is missing or empty. Check the schema for which fields are required:

bash
bacio schema show issue.add | jq .required

unauthorized from bacio api

You started the server with --token T (or BACIO_API_TOKEN=T), but your request didn't include Authorization: Bearer T. With the CLI client:

bash
export BACIO_API_TOKEN=T
bacio --remote http://127.0.0.1:5320 issue list

payload_too_large

You posted a body bigger than 4 MiB. Probably a paste accident — bodies are length-capped at 1 MiB inside bacio itself; the HTTP body cap is just defence-in-depth. Trim and retry.

bacio: invalid prefix

Prefixes are exactly 4 alphanumeric characters, no whitespace. bacio init --prefix A_UTH is rejected; bacio init --prefix AUTH works.

Behaviour that surprises people

"Why did everything in my audit log attribute to my OS user?"

Your agent forgot to pass --user <agent-name> on every call. The flag is permissive — bacio doesn't reject calls without it — so this is on you (or your agent) to pass consistently. Reminding the agent once usually sticks for the session.

"I deleted MINI-3 and the next issue is MINI-5"

Issue numbers don't repeat. Deleting MINI-3 does not free up the number — the next issue is still whatever next_issue_number was when you created it. Intentional: external references (commit messages, PRs) keep pointing at something real.

"My agent kept calling bacio issue show ten times in a row"

It's missed the bacio issue brief convention. brief returns the issue + parent feature + relations + PRs + comments + linked-doc bodies in one read. Ask the agent to use it.

"bacio init --with-skill doesn't work"

That flag doesn't exist (the website's old quickstart was wrong). bacio init and bacio install-skill are two separate commands.

bash
bacio init                # bind prefix
bacio install-skill       # install the canonical SKILL.md

"Two clones of the same project ended up with different prefixes"

The auto-allocator picks from the repo basename and skips taken prefixes. If two repos with the same basename register on the same machine, the second gets a numeric suffix. Solution: pass --prefix explicitly to align them, or rename one of the clones on disk.

"bacio sync won't push"

Non-fast-forward — someone else pushed first. bacio sync automatically pulls, re-imports/re-exports, and retries once. If it still fails, run the steps manually:

bash
cd ~/sync/your-project
git pull --rebase
cd ~/code/your-project
bacio sync                    # re-runs the full pipeline

"I edited the sync repo YAML directly and now bacio is confused"

Don't edit the YAML directly — bacio's the writer. Edits made through your editor bypass validators, don't record audit rows, and may be overwritten on the next bacio sync. If you've already done it:

bash
cd ~/sync/your-project
bacio sync verify           # see what's broken

…and revert the manual edit in git.

State machine confusions

"bacio issue state MINI-3 In Progress failed unexpectedly"

The state parser is permissive: it lower-cases the input and accepts -, _, or space as separators, so in_progress, in-progress, IN PROGRESS, and In Progress all parse to the same state. If something does fail, the value isn't a state at all — check bacio schema show issue.state for the canonical list (todo, in_progress, needs_action, in_review, done, cancelled).

"bacio issue next returned {"issue": null} — is something broken?"

No. That's the success-with-nothing-claimable shape. Exit code is 0. Callers should poll / retry, not treat it as an error. See bacio issue.

"An agent crashed mid-claim and now MINI-3 is stuck in in_progress with no progress"

bacio issue next is atomic but the workload after isn't. Clear the stale claim manually:

bash
bacio issue state MINI-3 todo
bacio issue unassign MINI-3

Forgotten flags

--as <name> on bacio comment add

Required. bacio has no auth — you name yourself. JSON path uses "author" instead.

--confirm <PREFIX> on bacio repo rm

Required. The command refuses to run without it, printing the cascade preview instead. Rehearse with --dry-run first.

--user <agent-name> on every agent call

Permissive (bacio won't reject the call), but the audit log attribution depends on it. Set it once at the top of your agent's bacio interactions.

When in doubt

  • Pass -o json and read the structured error. The field code is stable; error is the human message.
  • bacio --help and bacio <subcommand> --help cover every flag.
  • bacio schema show <name> is authoritative for JSON shapes — never guess from documentation.

See also

  • FAQ — common questions about bacio's design and philosophy.
  • Exit codes — the 0 / 1 model plus the issue next edge case.
  • JSON payloads — the strict-decode contract.

bacio · v0.1 · MIT