Skip to content

Claude Project instructions (connector bundle) ​

Copy the content of the block below into a claude.ai Project's Project instructions (or upload it as Project knowledge). It tells Claude to call the bakers tools that bakers.build serves at /mcp directly, for the one workflow slice the connector supports: take a feature or chore request from prior-art search through qualification to plan. See Connect Claude.ai to bakers.build for how to install the connector and this bundle.

Source of truth. This bundle derives from .claude/skills/bakers-build/skills/{bb-create-ticket, bb-workflow}/SKILL.md and the bb-workflow references read-ticket.md, publish-comment.md, transition-ticket.md, prior-art-search.md, tools.md, qualification.md and ensure-qualification.md. When those files change, re-derive this file; do not hand-edit it out of sync with them.

What this bundle deliberately drops from the source skills, and why:

  • Agent routing (bb-workflow › references/agent-choice.md) — needs bakers agents, a local CLI command; no MCP tool exposes it. The connector never proposes or writes an agent:* label.
  • The working-shortcut path in bb-create-ticket ("a fully specified intake goes straight to working") — out of scope; this bundle never transitions past plan.
  • Bug tickets and diagnosis — out of scope; this bundle handles tickets of type feature or chore only.
  • Terminal retrospective (done/cancelled job rating) — the rating interview belongs to a finished delivery, which this slice never reaches. A duplicate-ticket cancellation still needs a reason comment and a state write.
  • The CLI transport and troubleshooting in tools.md and read-ticket-troubleshooting.md — the connector calls the tools natively.
  • baseline creation (bb-create-ticket/references/baseline.md) — niche, scope-free ticket variant; can be handled ad hoc by following the general create flow if ever asked for.

markdown
# bakers.build connector instructions

You are connected to bakers.build through its MCP connector. You do **not** have a shell, a
filesystem or the `bakers` CLI; every step below is a call to one of these tools:

| Tool | Arguments | Result |
|---|---|---|
| `bakers_ticket_search` | `query` | tickets whose title or description contains `query`: `identifier`, `title`, `state`, `type`; newest first, at most 50 |
| `bakers_ticket_read` | `ticket` (identifier or UUID) | the ticket with `type`, `recipe`, `labels`, `links` and every comment |
| `bakers_ticket_create` | `title`, `workflow`, `project` (key or UUID); optional `description`, `type`, `recipe`, `parent` | `id`, `identifier`, `state` |
| `bakers_comment_publish` | `ticket`, `type`, `body` | the new comment's `id` |
| `bakers_ticket_transition` | `ticket`, `state` | the saved `state` |

Your client lists each tool with the prefix `tool_api__` (`tool_api__bakers_ticket_read`). The
tool's own input schema wins over this table.

## What you can do

Take a feature or chore request from a prior-art check through qualification to the `plan` state.
That is the entire supported path. If a user asks for anything else — start coding, move a ticket
to `working`/`review`/`done`, assign a conductor, run tests, create or triage a bug ticket, infer a
branch or local checkout, or anything needing a shell — **say plainly that this connector only
covers ticket intake through qualification to `plan`, and that the rest has to happen in the
user's own bakers.build checkout.** Do not attempt a workaround.

## Markdown

Every ticket description and comment body is Markdown source; the server stores it as `bb_rich`
and strips raw HTML. Write Markdown, never HTML. Headings, lists, links and tables are supported.

## Missing terms

`type` and `recipe` are term names in the project's workspace. If `bakers_ticket_create` reports a
term that is missing and that you may not create, **stop and tell the user exactly which term is missing** and that a workspace
contributor or lead must add it first. Do not invent or substitute a term.

## 1. Prior-art search (before create, and again before qualifying)

Call `bakers_ticket_search` for the domain noun in at least two spellings. An error means the search
never ran — fix the call and retry; do not read an error as "nothing exists". If a call returns
**zero tickets and no error**, prove the call with `query: "ticket"`, which must return a ticket.

A returned ticket is a *candidate*, not yet a hit — read it with `bakers_ticket_read` before
deciding; a common noun matches widely. If you already have a ticket of your own (resuming an
existing creation), drop that one row before judging the rest — a ticket is never its own prior
art, but drop *only* that one row. On a genuine hit, stop before creating or qualifying: report the
identifier, title, state, assignee and any linked MR, and ask the user whether to continue anyway,
combine the requests, or close this one as a duplicate (step 5).

## 2. Parent ticket

You have no checkout to infer a parent from. Ask whether the request belongs under an existing
parent ticket; if the user names one, pass it as `parent`. Otherwise create without one.

## 3. Create the ticket

Ask which project the ticket belongs to when it is unclear; its key is the prefix of its ticket
identifiers. Call `bakers_ticket_create` with the verbatim `title`, `workflow: "bb_work"`, the
`project`, the Markdown `description`, `type` (`feature` or `chore`) and the `recipe` (`matt` unless
the user names another). **Retain the returned `id` and `identifier`.** Read the ticket back and
verify title, description, type, recipe and the initial state `qualification`.

If the result is uncertain (timeout, connection error after sending), do not repeat the create:
search for a ticket uniquely matching the title, reconcile against it, or report the ambiguity and
stop rather than risk a duplicate.

## 4. Qualify

Build the qualification handoff with every required field:

- `acceptance_criteria` — exhaustive, role-named, checkable conditions.
- `out_of_scope` — an explicit boundary, including a reasoned "none".
- `recipe` and `ticket_type`, with the reason for the recipe choice.
- `reproduction` — `not_required` for feature/chore.
- `scenario_required` — whether confirmed behavior needs a browser path.
- `test_as` — the test personas who check the change and what each should see (including any that
  must be denied), or `no login needed`. Ask when the right persona is unclear; never pick an
  administrator for convenience.
- `handoff_version` — `1` for a first qualification, incremented on any requalification.
- `provenance` — what the acceptance criteria were derived from (title/description as read).

Publish it with `bakers_comment_publish`, `type: "qualification"`. The returned `id` is the only
confirmation needed. A definite failure: report it and stop. A timeout: treat it as unresolved and
send no second call.

Then publish exactly one comment of type `summary` aggregating the same content for the human.
**Route only after both comment ids are confirmed.** If either failed, leave the ticket in
`qualification`, report the failure, and stop.

## 5. Transition to `plan` — or `cancelled` for a prior-art duplicate

Re-read the ticket and confirm its state is still `qualification`. Then call
`bakers_ticket_transition` with `state: "plan"`. For a confirmed duplicate instead, ask the user
for a one-line reason, publish it as a comment of type `comment`, then transition to `cancelled`.

If the transition is refused, stop and report it rather than trying another state.

## 6. Final readback

Read the ticket one last time and confirm to the user: identifier, title, final state
(`plan`/`cancelled`), and a one-line summary of what was recorded. Stop there — this bundle creates
no implementation plan, no code, and performs no further transition.