Bowerloom docs

Status and error reference

Read the exact status or refusal before choosing a next action.

Open beta · 0.7.0-beta.1

Open Markdown

Use the actual result from the matching installed version. A status is an observed state. An error identifies a refused operation.

Keep your project out of iCloud Drive folders. Project commands such as bowerloom up, ls, status, apply, and skills sync refuse a project under ~/Documents or ~/Desktop when Desktop and Documents sync is on, and under the ~/Library cloud folders, with PROJECT_IN_CLOUD_FOLDER. The older forms that take an explicit path do not run this check. This beta reads skills only from public sources. See the beta limits.

Status fields

FieldMeaning in the reviewed setup
statusready-for-review, drifted, or revision-pending
revisionInstalled setup revision, or null when inspection cannot establish it
specReadyWhether the inspected specification meets its required checks
runtimeReadyFalse in the setup results documented here
executionAuthorizedFalse in the setup results documented here
reviewRequiredTrue in the setup results documented here
driftRecorded differences or inspection failures
compiledCandidateThe compiled definition identity when inspection can establish it
contextImportedFalse in the setup results documented here
hostedAgentCreatedFalse in the setup results documented here

bowerloom status in a project folder reports ready, drifted, or revision-pending in Setup:. With --json it also reports specReady, runtimeReady, executionAuthorized, revision, drift, and owned. runtimeReady and executionAuthorized are false. Read CLI reference.

ready-for-review requires human review. It does not mean that a team runs or has execution permission.

revision-pending requires retained transaction state and explicit recovery. drifted requires inspection of actual differences.

Setup refusals

CodeTrigger and meaningPreserve and next action
BOWERLOOM_EXISTSThe target already contains .bowerloom/.Inspect the setup. Use revision.
EXACT_APPROVAL_REQUIREDApproval is absent or lacks the required revision form.Retain the plan. Obtain its exact human approval.
IDENTITY_POLICY_UNSUPPORTEDRecorded identity policy does not meet the supported path.Preserve the receipt. Inspect compatibility without editing identity.
PRIVATE_OWNER_REQUIREDDirectory ownership or permissions violate the required boundary.Inspect the selected path. Do not bypass ownership controls.
REVISION_PENDINGA retained revision marker blocks fresh installation.Preserve the transaction. Use recovery.
STALE_APPROVALCurrent inputs or binding do not match approval.Retain the refusal. Plan again and obtain new approval.
STARTUP_TARGETThe target fails the required absolute path form.Select the intended valid path. Plan again.
TARGET_EXISTSNew mode finds an existing target.Inspect it. Choose existing mode only for the intended project.
UNSAFE_DIRECTORYA path fails required directory conditions.Inspect the path and ancestors. Do not force the write.

A wrong setup approval returns STALE_APPROVAL with exit 1 and no project changes. Do not infer every I/O failure is unchanged.

Exit codes

Exit codeMeaning
0Done, or nothing to change.
1Refused. The code names the reason.
2Usage error (USAGE).
3Approval required. The plan and its revision are printed. Nothing was written.
4Held by a gate. bowerloom up returns 4 with prepared, workers held, or prepared, N items held.
130Stopped at the yes/no question with Ctrl-C or Ctrl-D. It prints Stopped. Nothing was changed.

Exit 3 and exit 4 belong to the project commands: up, ls, status, team, skill, prompt, skills add, check, sync, recover, migrate, and apply. There is no --yes. Pass --approve <revision> with the revision from the plan. Approvals and exit codes explains the flow.

In a terminal, a refusal prints Refused (<CODE>): <message>, one plain sentence, and a Next: line. Without a terminal, it prints one line of JSON on standard error.

Project and approval refusals

CodeMeaningNext action
USAGEThe command line did not match a Bowerloom command. Nothing changed.Run bowerloom help.
APPROVAL_REQUIREDThe plan needs your approval. Exit 3.Run the same command with --approve <revision>.
APPROVAL_DECLINEDYou declined. Nothing changed.Run the command again to see the plan.
STALE_APPROVALThe plan changed after you saw it. Nothing was applied.Run the command again without --approve to see the new plan.
WORKERS_HELDThe project is prepared. No worker was started. Exit 4.Run bowerloom status.
PROJECT_NOT_FOUNDBowerloom looked in this folder and every parent up to your home folder.Run bowerloom up --team <name> --goal <goal> in the project folder.
PROJECT_ROOT_REFUSEDA whole disk or home folder is too broad to be a project.Change into the project folder.
PROJECT_IN_CLOUD_FOLDERThe project is under ~/Documents or ~/Desktop with Desktop and Documents sync on, or under a ~/Library cloud folder. Cloud sync changes file times and moves files, which breaks the checks that keep a project safe.Move the project, for example mv <project-folder> ~/Projects/.
PROJECT_UNSAFEBowerloom does not trust a .bowerloom folder that other people or links can change.Run ls -ld .bowerloom.
PROJECT_UNREADABLEBowerloom cannot read a folder on the way to the project.Run ls -ld <folder>.
PROJECT_LOCKEDTwo commands must not change one project at the same time. Nothing changed.Run bowerloom status, then try again.
PROJECT_LOCK_UNAVAILABLEThe lock uses a local port, and this computer did not give it out. A sandbox that blocks local ports gives this refusal.Run bowerloom status. If an agent sandbox runs Bowerloom, read Agent sandboxes.
PROJECT_LOCK_SLOT_COLLISIONThe lock uses a local port, and another program is listening on it.Run lsof -nP -iTCP:<port> -sTCP:LISTEN.
PROJECT_BRIEF_INVALIDA new team is built from the project brief that setup saved, and it cannot be read. On a clone, bowerloom up --team and team create refuse this way, because .bowerloom/brief.json stays on the first machine.Run bowerloom status. On a clone, follow the teammate steps.
INSPECTION_LIMITA .bowerloom folder holds too many entries to list.Reduce the entries.

Create commands also refuse with TEAM_EXISTS, TEAM_ID_RESERVED, TEAM_NAME_INVALID, TEAM_NOT_FOUND, SKILL_EXISTS, SKILL_NAME_RESERVED, SKILL_NAME_INVALID, PROMPT_EXISTS, PROMPT_NAME_INVALID, REVISION_PENDING, AUTHORING_PENDING, AUTHORING_RECEIPT_INVALID, AUTHORING_UNSAFE_PATH, AUTHORING_UNREGISTERED, AUTHORING_WRITE_INTERRUPTED, and AUTHORING_ITEM_MISSING. Create teams, skills, and prompts explains them. AUTHORING_RECEIPT_INVALID means Bowerloom reads its record of created items strictly, so a hand edit can break it. Run git diff .bowerloom/authoring/receipt.json. AUTHORING_UNSAFE_PATH means Bowerloom does not read or write through links, shared files, or files others can change. Run ls -la .bowerloom. AUTHORING_ITEM_MISSING means a created item is gone. Run git status .bowerloom.

Skills and sync refusals

CodeMeaningNext action
MANIFEST_NOT_FOUNDThere is no skills.json to check yet.Run bowerloom skills add npm:<package>@<version>:<path>.
MANIFEST_INVALIDBowerloom reads skills.json strictly, so a hand edit can break it.Run git diff .bowerloom/skills.json.
MANIFEST_UNSAFEBowerloom does not trust a skills.json that other people or links can change.Run ls -l .bowerloom/skills.json.
MANIFEST_WRITE_UNCONFIRMEDskills.json was written, but it changed again before Bowerloom read it back.Check it, then run bowerloom skills check.
MANIFEST_PIN_NOT_EXACTA pin that can move installs different files on different machines.Run bowerloom help skills.
MANIFEST_LICENSE_UNSUPPORTEDThis beta installs MIT and Apache-2.0 skills only.Choose another skill.
MANIFEST_DUPLICATE_IDEach skill needs its own id.Run git diff .bowerloom/skills.json.
MANIFEST_LIMITskills.json holds at most 32 skills and 1 MiB.Run bowerloom skills check.
SKILLS_ADD_SPEC_INVALIDThe source names a package or repository, an exact pin, and the skill folder.Run bowerloom help skills.
SKILLS_ADD_EXISTSskills.json already holds a skill with this id or this source.To move that id to another version or commit, add --replace: bowerloom skills add <source> --id <id> --replace.
SKILLS_ADD_SOURCE_CHANGED--replace keeps the npm package or GitHub repository and moves only its version or commit.Add the other source under a new id.
SKILLS_ADD_REPLACE_MISSINGThere is no skill with this id to replace.Run bowerloom skills check.
SKILLS_ADD_NOT_FOUNDThe package name, version, commit, or folder was not found.Check each.
SKILLS_ADD_SKILL_MISSINGA skill folder holds a SKILL.md file at its top.Check the folder.
SKILLS_ADD_LICENSE_UNKNOWNThis beta installs a skill only when its MIT or Apache-2.0 license ships with it.Choose another skill.
SKILLS_ADD_UNSAFE_CONTENTSkills here are text files only, and nothing in them is run.Choose another skill.
SKILLS_ADD_NETWORKThe fetch failed. Nothing changed.Run the same command again.
SKILLS_ADD_HOST_REFUSEDBowerloom asked no other host than registry.npmjs.org or api.github.com. Nothing changed.Run bowerloom help skills.
SKILLS_OFFLINE--offline found a pin that needs a fetch. Nothing changed in the project.Run bowerloom skills sync without --offline.
SKILLS_SYNC_CONTENT_MISMATCHFetched bytes do not match the pin. Bowerloom stopped before any change to the project.Run bowerloom skills check.
SKILLS_SYNC_INTERRUPTEDEvery skill it finished is complete, and the rest are untouched.Run bowerloom skills sync.
SKILLS_SYNC_LIMITA sync handles at most 64 skills at once.Run bowerloom skills check.
SKILLS_CACHE_RECOVERY_REQUIREDThe private cache needs a look before this pin can be read.Run bowerloom help advanced.
SKILLS_STATE_UNSAFEThe private state folder is not one that only you can change.Check $XDG_STATE_HOME/bowerloom when XDG_STATE_HOME is set, else ~/.local/state/bowerloom.
SKILLS_STATE_STRAY_ENTRYThe private state folder holds an entry Bowerloom did not make.Move the named entry out with mv.
SKILLS_RECOVER_NOTHINGNothing of this item is unfinished.Run bowerloom status.
SKILLS_MIGRATE_NOTHINGThe project has no .bowerloom-skills folder.Run bowerloom skills sync.
SKILLS_MIGRATE_STATE_INVALIDMigrate needs the private state folder the earlier install was made with.Run bowerloom help skills.
SKILLS_MIGRATE_NOT_IN_MANIFESTskills.json must pin the installed skill before it can be migrated.Run bowerloom skills check.
MANAGED_SKILL_LEGACY_PRESENTSkills from an earlier Bowerloom must be migrated before sync can manage this project.Run bowerloom skills migrate plan --state <earlier-state-folder>.
MANAGED_SKILL_RECOVERY_REQUIREDA change was interrupted inside one skill. Bowerloom changes nothing else until it is recovered.Run bowerloom skills recover plan --item <id>.
MANAGED_SKILL_LOCAL_DRIFTYou changed a copy. Bowerloom never overwrites it.Undo the edit, then run bowerloom skills sync.
MANAGED_SKILL_PATH_OCCUPIEDSomething Bowerloom did not install is where a copy goes.Move it, then run bowerloom skills sync.
MANAGED_SKILL_LOCK_SLOT_COLLISIONBowerloom holds its project lock on a local port on 127.0.0.1, and it checks the lock by connecting to that port. The check failed. Another program may listen on the port, or a sandbox may block Bowerloom from connecting to localhost. Nothing of the named skill changed. In this beta the message does not name the port, and the terminal Next: line shows <port> as written.If an agent sandbox runs Bowerloom, run Bowerloom outside it, as Agent sandboxes says. Otherwise list the programs that listen with lsof -nP -iTCP -sTCP:LISTEN. Then run bowerloom skills sync again.
MANAGED_SKILL_HISTORY_FULLA skill has 64 operations in its private history. Bowerloom deletes no history by itself.Follow the Next: line: move the older op-<key> folders out with mv, then run the command again.
APPLY_NAME_COLLISIONBowerloom never overwrites what it did not install, and two items cannot share one place.Run bowerloom apply after you resolve it.
PROMPT_INVALIDBowerloom reads only plain prompt files you own.Run ls -l .bowerloom/prompts.

Request-file skills refusals

The request-file bowerloom skills source, skills plan, skills update, skills apply, and skills inspect forms print one line of JSON on standard error. A refusal exits 1. A usage error exits 2. CLI reference lists the forms.

CodeTrigger and meaningPreserve and next action
USAGEThe command form is not valid. Exit 2.Read help. Use the exact form.
SKILLS_RECORDA request or plan record is not valid.Keep the record. Fix it and plan again.
SKILLS_CHANGEDThe record or its directory changed.Inspect the record and its directory. Plan again.
SKILLS_OUTPUTThe command could not write its result.Inspect the output path. Do not assume a write happened.
SKILLS_INTERRUPTED_UNCERTAINA signal or the 35-second limit stopped the command.Inspect before another write.
SKILLS_REFUSEDThe command stopped for a known reason. The message names the reason in parentheses, such as NPM_CACHE_DIRECTORY or GIT_TREE_BOUND.Keep the error. Inspect the cache and installation records.
SKILLS_UNCERTAINThe cache state is not certain. The message names two codes.Run skills source inspect, then skills source recover plan, before another action.
SKILLS_UNCERTAIN with _CACHE_OPEN_PARTIALRecovery cannot read the operation folder.Start again with a new SOURCE_OPERATION.

Installation commands name these reasons in parentheses, in the message of a SKILLS_REFUSED error:

Code in parenthesesMeaningPreserve and next action
MANAGED_SKILL_STALE_APPROVALThe approved revision no longer matches the plan.Plan again and obtain new approval.
MANAGED_SKILL_LOCAL_DRIFTSomeone edited an installed file.Keep the edit. Inspect before you plan again.
MANAGED_SKILL_RECOVERY_REQUIREDAn earlier installation needs recovery.Run skills recover plan.
MANAGED_SKILL_LOCKEDAnother command holds the installation.Wait, then plan again.
MANAGED_SKILL_TIMEOUTThe command ran past its time limit.Inspect before you plan again.
MANAGED_SKILL_ABORTEDThe command stopped early.Inspect before you plan again.
MANAGED_SKILL_REFUSEDThe general installation refusal. It also covers cache or receipt drift.Inspect the cache and installation. Do not overwrite local files.

For example, a wrong approval printed this line on standard error in the test run for this release, and exited 1:

{"error":{"code":"SKILLS_REFUSED","message":"The skills command stopped (MANAGED_SKILL_STALE_APPROVAL). Inspect the exact local cache and operation records before another action; no native execution authority is granted."}}

Stop results

ResultMeaningNext action
NOT_RUNNINGNo execution started, or previous execution finished.Report this actual scope.
STOPPEDThe original registered owner acknowledged cleanup.Retain the owner's result.
STOP_UNCONFIRMEDCleanup remains unconfirmed.Preserve records and inspect the original owner.

A timeout does not establish cleanup. Stop registered work explains registry scope.

Other subsystem errors

Connection, harness, backend, recipe, and runtime commands have separate boundaries. A harness is an agent application, such as Claude Code or Codex. Read the exact subsystem output and its reference prerequisites.

A refused operation does not authorize an older or less restricted path. Use Troubleshooting for the next supported inspection.