Skip to content

tutorial

Chapter 0 of 4

Your First Rasa Mantle Agent, With Guardrails On

by Rod Rivera Published

Build a working Mantle agent using the starter pack — six AI skills, a nine-check lint, and a git hook that catches the silent mistakes before they cost you an afternoon.

Here is a story that actually happened.

A catalog of ten Rasa Mantle projects — written carefully, reviewed, shipped — declared 39 behavioral rules across their 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 lintlint_mantle.py, a single-file checker with nine 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 whether conversations go well has no checker at all.

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, five different ways, and watch the lint catch every one — including three breaks that produce no error at all at runtime. 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 purposeTrip all five silent traps; watch each get caught
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.

Every command and output in this series was run against rasa-pro==3.20.0.dev6 — the newest release on the engine line at time of writing. And yes, “dev” is correct: the Mantle engine currently ships only on pre-release versions. The newest stable rasa-pro contains no engine at all. That surprise has its own section in Chapter 3.

Where everything lives