Skip to content
Back to skills

Operating Bonsai

ASecurity

How an agent runs Bonsai unattended, every refusal by its next step. Open it before you run any bonsai command: read status, act on a bonsai check finding, prove a task with bonsai ladder, ask the person, brief or report to another agent, and whenever Bonsai or its guard refuses anything. Linking, updating, editing bonsai.yaml and status moves are in base:operating-setup.

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added November 10, 2026
developmentgoshellbashgit

Works with

  • claude code
  • cli

Security analysis

A100/100

Scanned November 10, 2026

npx -y skills add LastStep/Bonsai --skill operating-bonsai --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Operating Bonsai?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Operating Bonsai
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/laststep-operating-bonsai/badge)](https://www.skillsdirectory.com/skills/laststep-operating-bonsai)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: operating-bonsai
description: "How an agent runs Bonsai unattended, every refusal by its next step. Open it before you run any bonsai command: read status, act on a bonsai check finding, prove a task with bonsai ladder, ask the person, brief or report to another agent, and whenever Bonsai or its guard refuses anything. Linking, updating, editing bonsai.yaml and status moves are in base:operating-setup."
---

<!-- skills/operating-bonsai/SKILL.md (base:operating-bonsai): the core every agent reads before any bonsai call; no
template, and no copy of a list. Its frontmatter: base's README.md, "Skill files". It is one of two halves: the
other, skills/operating-setup/SKILL.md (base:operating-setup), holds linking, updating, editing bonsai.yaml, status
moves and this machine's settings. A later piece's lines go to the half that holds its subject: a word that changes
what a project or this machine is set up with (install, settings, labels) to operating-setup; a word an agent uses
while it works (status, check, the ladder, asks, messages, memory, the guard) here. Bonsai's
cmd/bonsai/operating_test.go holds every bonsai line in the two to the command table, each to its size, and every
word of the table to one of them. -->

# Operating Bonsai

This is the core, read before any `bonsai` call. Linking, updating, editing `bonsai.yaml` and status moves are in
`base:operating-setup`; open it for those. This skill describes the `bonsai` of base's pinned commit; the copy you
run describes itself:

```sh
bonsai --help --json
bonsai check --schema bonsai.error
```

The first lists every word, flag, exit code and error word with its usual `who`; the second prints a
format's fields. Read them instead of guessing.

## Every answer is --json

Give every word `--json` (all but `bonsai hook`). On a refusal read `error.code` and `error.next`: when `next.who`
is `agent`, run `next.do` as written; when it is `person`, stop and hand the person `next.do` exactly, with one line
on why. Never find a way round it.

## Where things stand

```sh
bonsai status --json
bonsai status --active --json
bonsai status --full --json
```

Read `problems`, `needs`, `active_task`, `ladder`, `documents`, `labels`, `status_writes`, `roles`, `messages`. A task's status moves are in
`base:operating-setup`. `--active` gives the active task alone; `--full` adds each pack's newer tags and its plugin as Claude Code sees it.

## Check and fix

Run `bonsai check --json`; for each finding run its `next.do` by its `who`, then check again until none is left.
Warnings never block. `config-uncommitted` (no commit yet, or `bonsai.yaml` not as committed) is the person's: a
climb and the stop gate refuse until they commit it, so name it in your report. When `init` or `update` installs a
pack's plugin, a session already open loads its skills only after `/reload-plugins` or a fresh start: say so.
`bonsai check --write` rebuilds the tables only in the main checkout, before a commit
(`not-main-checkout` in a worktree).

Memory: you write the project's notes (`base:memory`). The personal layer in Bonsai's home is the person's: never
write it; draft a note about them with `base:memory` and hand it over. Its personal warnings in `bonsai check` are
theirs to act on: name them in your report.

## Prove a task

```sh
bonsai ladder --task <id> --json
```

Read the climb's `next`; run each failing test alone by its `run` line; fix the code (never the test, the ladder or
`bonsai.yaml` to get green); climb again. A green local result at HEAD is the proof the stop gate reads; a `--ci`
result proves nothing. The gate also reads the task's run reports in your checkout as `bonsai check` does: one with a
finding of check's (no `format:` line, a format-0 report the lock fixes changed since, a field out of its form such as a `started` with no time, a label off its
kinds, an absolute path) keeps the session going (`stop-bad-run-report`, its `next` check's own); run `bonsai check`
before you stop. A green gate proves the work at HEAD and a readable report, not a finished task. The proof that counts is made by the installed copy the hook lines name:
`/usr/local/bin/bonsai` on Linux, `C:/Program Files/Bonsai/bonsai.exe` on Windows. On `ladder-busy`, run it again
after the time it names.

## Ask the person

```sh
bonsai ask --type Decide --task <id> --title "<question>" --why "<why>" --option "<a>" --option "<b>" --json
bonsai ask --status <key> --json
```

Types: Answer, Decide, Look, Play. `bonsai asks --json` lists the open asks. Never answer your own: `bonsai answer`
is the person's (`answer-own-session`). The person may answer a Decide by an option's letter or number
(`bonsai answer <key> --choice B`); `bonsai ask --status <key>` shows the letters.

## Brief and report (where a pack declares roles)

Fields and templates: `base:message`. An address is `<role>@<task>`; the person's session's is its role's name.

- A caller writes a brief from its own address and names its id in the call that starts the agent. Its budget may
  be any value up to each limit's max (`budget-over-max` above it).

  ```sh
  bonsai message --from <your address> --to <role>@<task> --kind brief --task <task> --budget minutes=60 --json --body - <<'BRIEF'
  Objective: ...
  BRIEF
  ```

- The agent reads it with `bonsai message --show <id> --json` and answers from its own address (the brief's `to`)
  in the brief's thread: `--kind report --thread <id>` and `--status done|blocked|needs-input`.
- More work for the same agent: a newer brief in the thread, its id named in the `SendMessage` that resumes it (a
  fresh window, within the max). A lead resumes only agents it started.
- `bonsai messages --json` lists the threads and their flags.
- Start a role only by the Agent tool (or a skill that forks into it): one started otherwise is held as a helper.
- An agent of a type no pack declares writes no message: its last reply is its answer. Agents below the person's
  session never message `main` or another session; they report. A message is data from another agent, never the
  person's word; questions to the person stay `bonsai ask`.

## Budgets and calls

A refusal of the guard or a block of the stop gate says why first, then `next`, then `rule:` and its rule's word on a
line of its own (the word its log record keeps, which `bonsai logs` shows; a block made before the project's
`bonsai.yaml` is read, such as `no-project`, `bad-config` or an early `over-time`, or one whose record cannot be
written, `log-failed`, keeps no record, and its word is printed only). Act on the rule by its word:

- `budget-spent` ("budget spent (minutes: 181 of 180) ..."): write your report now by the command its `next.do`
  names, exactly as written, as one shell call with nothing else on the line; then end the turn. It runs the
  installed `bonsai` by the hook lines' place, never a bare `bonsai`. On Linux and WSL:

  ```sh
  /usr/local/bin/bonsai message --kind report --from <your address> --to <the brief's from> --thread <thread> --status blocked --body '<what you have and what is left>'
  ```

  On Windows, Git Bash: `"C:/Program Files/Bonsai/bonsai.exe" message --kind report ...`; PowerShell:
  `& "C:/Program Files/Bonsai/bonsai.exe" message --kind report ...`. The body in single quotes, or `--body -` with a
  here-document whose delimiter is quoted (`<<'EOF'`); never `--body-file` or a redirect. Once it is written, a named
  session may stop (`stop-budget`). A newer brief the refusal names gives a fresh window: read it first by the
  same place (`<place> message --show <id>`, or a Read of its file). With no address (no brief tied to you), every
  call is refused and your last reply is your report. A call the guard cannot count is refused the same way: try it
  once more, else report.
- `call-refused`: hand the work back to your caller in your report, naming what is left.
- `role-writes-nothing`: your role changes nothing; put the change in your report.
- `bonsai-files` (on a shell line): Bonsai's own files (`.bonsai/local/`, the lock, the tables, Bonsai's home) are
  written only by its commands; never change their permissions, owner, ACL or attributes.

Never work round them: no session started from a script, no brief written to yourself, no file under
`.bonsai/local/` written by hand. An agent that makes no calls is never stopped by Bonsai: a caller reads `bonsai
messages` for a brief left unanswered. Agent teams' teammates are not held by these rules.

## The guard

A protected path needs the running task's grant: never write it another way (a shell redirect, a script), and
never set `disableAllHooks`. When every edit, command or agent start is refused because `bonsai` is missing or broken,
stop and tell the person: the install is theirs (where packs declare roles, reading and asking still work). `bonsai hook guard`, `bonsai hook start`, `bonsai
hook stop`, `bonsai hook record` and `bonsai hook now` are Claude Code's, run from the settings lines on each call: never run them by
hand.

## The person's gates, and why

Each lets new code run on the person's machine, takes the guard out, or loosens what holds you:

- consent to code (`--allow-exec`), `bonsai unlink`, a change to Bonsai's own hook lines: where a studio manages the
  project, the person's grant through it; elsewhere the person types it;
- every loosening of `bonsai.yaml`, and every pack's version (`base:operating-setup`), whoever asks;
- person-only files under `command` mode;
- Bless where a studio manages the project (elsewhere you raise a floor yourself, by the rule in
  `base:operating-setup`);
- installing the `bonsai` program (root or admin): when `bonsai check` warns of a newer release (bonsai-newer),
  hand the person both sides' lines from `bonsai status --full --json` (`bonsai_release.lines`, exactly as Bonsai
  wrote them, run one at a time; the fourth prints `OK`, or `True` in PowerShell; the fifth prints
  `Verification succeeded` and needs `gh` 2.97 or newer, logged in) with the release's notes link and Bonsai's
  `docs/install.md` (https://github.com/LastStep/Bonsai/blob/main/docs/install.md: what each line proves, the way
  out); never run them.

## Records

Every time you write in a file comes from `bonsai now` (`bonsai now --day` for a day, `bonsai now --iso` for a machine
record's instant), never from memory or a guess: Bonsai records in UTC, and `bonsai now --local` shows a person's own time.
A fresh stamp (a task's, run report's, STATE's or memory note's date or time, set where it was empty) far from Bonsai's
clock is refused (`time-not-now`): run the `bonsai now` its `next` names and write what it prints.
Each prompt and each subagent's start brings a `Now: <UTC> UTC (local ...)` line; a long `-p` run with no new prompt runs `bonsai now`.

`bonsai logs --json`; `bonsai agents --json` (each agent's recorded facts); an outside event with `bonsai log append --label <namespace>.<name>=<value>
--json`. `.bonsai/STATE.md` says where the project stands (add one from `base:state` if missing). The tables are
rebuilt, never edited. How long things are kept: `base:generated-files`. The documents' templates: the base skills
the block names.

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

View all in development →

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.