Skip to content

Release v1.0.0 — everything booping does became a playbook - #20

Merged
A merged 158 commits into
masterfrom
release/1.0.0
Aug 8, 2026
Merged

Release v1.0.0 — everything booping does became a playbook#20
A merged 158 commits into
masterfrom
release/1.0.0

Conversation

@A

@A A commented Aug 8, 2026

Copy link
Copy Markdown
Owner

Everything booping does became a playbook. /playbook is now the only skill the plugin ships — groom, develop, retro, learn, code-review, setup, migrate and playbook-authoring all run as playbooks, discovered beside the ones you write yourself. Runs carry their own state and resume across sessions, and retro and code review became tracks of their own.

This release is dogfooded: the repo's own Project Vault is checked in at vault/ — browse a finished plan, the targeted lessons the loop accumulated, or a retrospective to see what the artifacts actually look like. 1.0 works end to end but is beta-grade; expect rough edges, and if installation gives you trouble, run /playbook setup and talk the problem through with it.

⚠️ Breaking changes

  • /chat and /help are gone/playbook is the plugin's only skill.
  • Your config.yaml needs re-nesting under a core namespace: a key one playbook owns at core.{name}_playbook, shared keys directly under core.
  • Existing Project Vaults must migrate — a vault behind the shipped migrations blocks every render surface with a notice until you run /playbook migrate.
  • Per-playbook _lessons/ directories and the lesson step: key no longer route lessons — legacy content surfaces a migration note instead.
  • Playbook names must be unique across the core, global and project levels; a same-named playbook used to shadow silently, and now stops the run.
  • In your own playbooks, agent: became detached: (a leftover agent: key stops the run), and the @head shorthand was dropped in favour of the git_commit macro.

Migration notes at the end.

Running the loop

  • Runs resume where they stopped. Each run persists its status to its own artifact, so a later session picks it up from the state frontier rather than from the driving conversation. An active groom or develop run can also be cancelled from any point — a real terminal outcome with its own exit hooks, not an abandoned file.
  • Retro is its own track. Develop closes a plan at done immediately instead of holding it open. Retro and learn advance a standalone retrospectives/{slug}.md, linked back from the plan's retro: key; retro queues every done plan not yet covered, mines session logs and the sprint diff for what actually happened, and takes your raw feedback before triaging by root cause.
  • Code review is its own track, and re-review is first class. Every review persists as codereviews/{plan}/{timestamp}.md moving through in-agent-reviewhuman-reviewdone, while the plan carries the full code_reviews: history and stays in the queue — so a plan can be reviewed, fixed, and reviewed again without leaving its track. You give the verdict; only approved fixes are applied.
  • Groom asks less. It runs its steps in the driving session rather than one sub-agent per step, and stops at a single approval gate near the end instead of four confirm points. Codebase and web research still run as parallel detached passes, and a cross-review pass runs when you name a validator agent.
  • A plan is a directoryplans/{slug}/ holds its index.md, briefing and web research together.
  • Setup takes a repo from any state to a working project: machine config, scaffolded Project Vault, .booping marker, and a home-dir symlink for Obsidian. It skips phases already satisfied, so re-running it reports state instead of changing it, and seeds fresh vaults at the highest shipped migration id.
  • sprints.md reports what a sprint cost — active time excluding every stretch the run spent waiting on you, alongside token totals and the models that ran.

Making it yours

  • Lessons route by target. They live in two flat _lessons/ roots — the global level and your Project Vault — and each carries a targets: list naming exactly where it applies: {playbook}, {playbook}/{step}, agent:{id} or skill:{name}. An untargeted lesson injects nowhere. Shaping an agent for one project is now a lesson rather than a separate extension file.
  • Three delegation levels, declared per step by detached:inline (the runner performs it), assisted (the runner performs it but hands heavy reads to your configured research agent, resuming it across a loopback rather than respawning), and detached (its own sub-agent). core.research_agent points assisted reads wherever you like.
  • Subgraphs. A graph: node can be a subgraph — its own dependencies, an inner graph of steps, an optional prose repeat:, one nesting level.
  • Playbooks as templates. jinja: true renders preamble and step bodies against live project context. A step is a directory holding prompt.md, optionally per-model bodies (opus-5.md, fable-5.md) and its own eval suite. Bodies load one at a time, so a run's context grows with the graph it walks, not with every body the playbook contains.
  • Config, queries and scaffolds. Settings layer across the core, global and project levels, later winning, and any key loads at any level without an unknown-key warning — review templates now layer the same way lessons already did. Vault frontmatter became queryable through config-declared query specs, with --where filters, sorting and projection. Config can also declare scaffold trees and argv macros that rendered bodies call through macro().
  • Hooks got sharper. A frontmatter-update hook can write to any workdir-relative file with {instance} interpolation, not only the machine's own artifact; script hooks resolve from shared _scripts/ roots, playbook-local first, and take arguments, so one parameterised script replaces a family of near-duplicates.
  • playbook-authoring ships in core — it drives a new playbook from brief and decomposition through manifest, then per step a spec, fixtures, prompt and eval suite driven to green.

Other changes

  • The shared plan-lifecycle vocabulary is gone; each artifact moves only through its own playbook's states: machine.
  • sprints.md is seeded once at setup as a live Obsidian Bases view and never regenerated; render-sprints was retired.
  • Learn shows the full playbook table of contents and pins each lesson's exact targets: before writing.
  • Develop's intake renamed awaiting-plan-review to awaiting-approval.
  • Project resolution falls back to vault containment on a marker miss, so a workdir inside a vault assembles the same context as a repo workdir.
  • The pre-1.0 migration set was collapsed into three: vault layout, tracks and lessons, session metrics.
  • Testing infrastructure: hermetic renders, committed playbook report snapshots, mdcheck structural rules, parallel CI jobs.
  • Internal rendering, transition-engine and CLI work behind all of the above.

Migration notes

  1. Update the plugin, then open any project and run /playbook migrate. It surveys what is pending against your marker's watermark, applies each migration in id order on one up-front approval, and commits each to the vault separately. A failing migration halts and names the id, the failure, and a hand-applicable remedy.
  2. Re-nest your config.yaml under core.
  3. In your own playbooks, rename agent: to detached: and replace @head with the git_commit macro.
  4. Rename any playbook whose name collides across levels — the listing flags the clash.
  5. Move per-playbook lessons into a flat _lessons/ root and give each a targets: list.

A and others added 30 commits July 27, 2026 22:23
…j2 partial (M1)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… loader (M2)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… --project (M3)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… (M4)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…k skill + docs (M5)

Kill criterion failed (+10% vs -30% target); old /groom stays canonical,
new experimental /groom-playbook skill drives the core groom playbook.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… dirs

Each jinja body now renders with its own ChoiceLoader chain: the body
itself (by basename) -> step dir -> playbook dir -> local/global/core
playbook roots -> src/templates. A PlaybookEnvironment.join_path
override resolves ./ and ../ against the including file's own directory
at any nesting depth; bare names fall through to the chain unchanged.

src/templates stays last so _partials/ keeps resolving plugin-root
relative, at the cost of a playbook-local _partials/ shadowing it. The
graph and step chrome templates render through a separate plugin-only
env so a playbook cannot shadow them.

Also drop the "no playbook.md, skipping" warning: a directory without a
manifest is now skipped silently.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
…amed states in loader (M1)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
… transition report (M2)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…or (M3)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ll-run integration test (M4)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…iving protocol, docs (M5)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ybook scan + name clash (M1)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…ons.j2 + step append + clash STOP + --no-lessons (M2)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…rker + driving lessons binding (M3)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…s reference, stale shadowing refs removed (M4)

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…tch file target + {instance} interpolation, plan-transition rejection, report prefix (M1)
…vocabulary docs across playbook.md, CLAUDE.md, driving partials (M2)
…ites

Rebuild core groom playbook: playbook.yaml with states/graph, new steps
(draft-plan, decompose-work, verify-references), _scripts status hooks,
_specs design docs. Each step ships promptfoo eval suite (tests.yaml,
fixtures, model variants).

Add eval tooling: justfile recipes (eval, eval-md, smoke, regress),
bin/eval-md.sh + bin/report-md.jq markdown reporter. Ignore repo-root
_booping/ runtime log.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
- frontmatter-update on a file without a frontmatter block now prepends
  one instead of aborting; existing content becomes the body unchanged
- groom steps stop authoring `reviewed_at: null` — run hooks own the
  artifact frontmatter, files open at their H1
- run slugs take their timestamp from the local clock
  (`date +%Y%m%d-%H-%M`), never from model memory

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A and others added 26 commits August 8, 2026 13:25
…ansition

An absolute --target ending in the machine's declared artifact: now implies
the workdir, so hooks run beside the artifact without a separate --workdir.
Relative targets, non-matching paths, and machines without artifact: keep cwd.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
A workdir inside home_dir/{project}/ now assembles the same context as a
repo workdir; repo_directory becomes optional and hook resolution falls
back to the process cwd when the containment-resolved project has none.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…eview to awaiting-approval

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…or release — M1 snapshots + mdcheck as Python scripts

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…or release — M2 eval tooling moves to scripts/

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…or release — M3 dead code deleted

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…or release — M4 CLAUDE.md layout + commands sweep

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
…nting — M2 session-stats subcommand, session-time retired
…nting — M3 metrics_ key rename, migration 006, config surfacing and docs
The vault lived under home_dir at ~/Dev/@A/notes/projects/claude-booping,
tracked in the private notes repo. Move it to vault/ here so plans, retros
and lessons version alongside the code they describe.

- .booping gains vault_path: vault
- _core_playbooks becomes a relative symlink (../playbooks), keeping the
  absolute home path out of a public repo
- vault/notes/ and .booping.log are gitignored: local scratchpad and
  operational log, not part of the published vault
- drop _booping/.booping.log, dead since migration 004
Migration 004 converted _booping/agent_*.md into targeted _lessons/ files;
nothing has read that path since. The developer agent description still
pointed at it. Lessons are discovered automatically, so the sentence is
removed rather than repointed.
…ss cases

Both judged a freshly generated artifact whose shape varies run to run — the
fixtures corpus rubrics and the llm-tests row-quality rubrics went red on roughly
half the runs without any source change. The deterministic smoke cases stay.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
The suites judge freshly generated artifacts, so a full run lands on a different
red set each time — a per-sha gate blocked merges on judge variance rather than on
source drift. The sticky PR comment stays as the advisory record of a run.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Six incremental migrations described a history no 1.0 vault will ever walk
step by step. Fold them into three that each cover a coherent layout change:
vault layout, tracks and lessons, session metrics.

- fixture marker watermark drops 6 -> 3, and the migrate snapshot follows
- README gains a 'What it's for' section, links the checked-in vault/, and
  states the beta-grade maturity of 1.0
A added 2 commits August 9, 2026 01:07
astral-sh/setup-uv publishes moving major tags only through v7, so @v9
never resolved and every CI run died at 'Set up job' before a single
test ran. v9.0.0 is a real tag; pin it exactly.
Two failures the setup-uv breakage had been masking — every run died at
'Set up job', so neither had ever executed on CI.

The mdcheck job installed just and Rust but never uv, while `just mdcheck`
shells out to `uv run`; it failed with 'uv: not found'.

test_sets_commit_with_the_git_macro resolved its repo from pytest's cwd,
so it passed only on a machine where this checkout is itself an attached
booping project. `.booping` is gitignored, so CI resolved no project,
repo_dir came through as None and the `cwd: repo` macro aborted. The test
now brings its own git repo and marker.
@A
A merged commit 1bcc622 into master Aug 8, 2026
3 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant