Skip to content
RasaGet a free licence
Menu

tutorial

Chapter 0 of 4

Build and check your first Mantle agent

by Rod Rivera Published

Use the starter pack to build a plant-shop assistant and check its configuration before running it.

You will build Juniper, a fictional plant-shop assistant, with the Mantle starter pack. It supplies authoring guidance for Claude Code, a configuration checker and a commit hook to help you catch mistakes as you work.

A project can install and run while ignoring a misplaced setting. This series shows how to check the configuration as well as trying the conversation. The earlier catalog audit below explains why that check matters.

An earlier catalog audit found 39 behavioral rules across project config files. Things like “never state a balance that did not come from a tool.” The engine applied zero of them. No error at load. No warning at train time. The agents just ran without their guardrails, for weeks, until someone read the built prompt and noticed the rules weren’t in it.

The cause? The rules were indented two spaces too deep. Mantle parsed them, found them in a spot it doesn’t read from, and silently threw them away.

That is the kind of mistake this tutorial is about. Not the loud ones — Mantle tells you about those. The silent ones: config that parses, trains, runs, and quietly does the wrong thing.

What the starter pack is

The starter pack is three tools that share one idea — every known silent mistake should be caught by a machine, not by weeks of confusion:

  1. Six Claude Code skills — playbooks that teach an AI assistant the correct 2026 file shapes, so “scaffold me an agent” produces config that is right the first time.
  2. A lint — lint_mantle.py, a single-file checker with ten checks. Every check encodes a failure a real project in the companion catalog actually hit. The 39-ignored-rules bug is check number one.
  3. A git hook — a one-time install that runs the lint on every commit, so a silent mistake cannot even be saved without being pointed out.

The three pieces meet in the everyday loop, where the lint runs twice — once when the change is built, once when it is committed — with your own reading of the diff in between:

The everyday loop. First you ask for a change and the build playbook makes it, finishing by running lint_mantle.py because the playbook says to. Then you read the diff, which no machine does for you. Then git commit runs the same lint again from .git/hooks/pre-commit, and a failure blocks the commit with each finding naming its own fix. Below, what each layer can actually prove: the lint proves the project is internally consistent with no known trap, but not that the engine accepts it; make train proves the engine accepts and builds it, but not that conversations go well; and conversation quality needs separate evaluation.

What you will build

Juniper, a small plant-shop helper with two skills and a memory:

you  do you have anything that survives a dark bathroom?
bot  Yes — a ZZ plant or a snake plant would be happy there.
     Want me to check what's in stock?

you  yes please
bot  We have 4 ZZ plants and 7 snake plants in stock right now.

you  I'll take a ZZ plant
bot  Great choice. I've noted a ZZ plant for you — ask me anytime
     to check your order.

More importantly, in Chapter 3 you will break Juniper on purpose, seven different ways, and inspect the checker’s diagnostics. Some settings are silently ignored; others fail at training or installation. That chapter is the reason this tutorial exists: once you have seen a silent failure get caught, you understand why the guardrails earn their place.

The chapters

#ChapterYou will
1The safety netInstall the pack, meet the lint, wire the git hook
2Scaffold JuniperGenerate the agent and understand every file it makes
3Break it on purposeInspect the diagnostic for each configuration mistake
4Run it, review it, keep it healthyTrain, chat, and adopt the everyday workflow

Before you start

  • Python 3.11 or 3.12 — Mantle requires ≥ 3.11 (and Chapter 3 shows you the deeply confusing error you get when you ignore this).
  • uv and git.
  • Claude Code for Chapters 2–4. (The lint and hook work without it; the scaffolding skills are what need it.)
  • A free Rasa Pro Developer Edition licence and an OpenAI API key — only needed from Chapter 4, when Juniper first runs.

The installation targets rasa-pro==3.21.0.dev5. The compatibility report records the current automated checks; recorded terminal examples are illustrations, not a claim that every live model run repeats identically. The release audit checks the published wheel for the Mantle engine and reports the stable channel separately. Chapter 3 explains why an arbitrary stable pin is not a substitute for the tested runtime.

Where everything lives