AI Realist × OpenClaw

Build Your Rudolf
Backoffice Agent

Provision Rudolf, give him a soul, install skills from ClawHub, then watch him sort a messy folder of invoices, receipts, and contracts.

~1 hour
6 exercises
2 skills
Rudolf — the backoffice agent

First time using Terminal / PowerShell?

Terminal (Mac) and PowerShell (Windows) are text-based ways to give your computer instructions. Instead of clicking icons, you type commands and press Enter.

On a Mac

  1. Press ⌘ Command + Space — opens Spotlight
  2. Type Terminal and press Return
  3. A dark window appears — that's Terminal ✅

On Windows

  1. Press Win + R — opens the Run dialog
  2. Type powershell and press Enter
  3. A blue window appears — that's PowerShell ✅

💡 How to copy a command: click on any dark box to copy it, then paste into Terminal / PowerShell and press Enter.

The steps

⚠️
For Paid Subscribers Only

This workshop is exclusively for paid AI Realist subscribers. To participate, become a paid subscriber at msukhareva.substack.com — the workshop recording, exercises, and Rudolf's source code are available to paid members.

Rudolf's full source will be published on GitHub after the workshop: github.com/ktoetotam/rudolf-backoffice-agent

Step 1

Launch OpenClaw & chat

Get OpenClaw running, open the Web UI, and send your first prompt.

🚀 Try this first

1. Make sure OpenClaw is running. Open http://localhost:18790 — if you see a chat window, you're good.

2. Paste this into the chat:

🤖 Prompt — paste into chat
I need to start OpenClaw for the Rudolf workshop. What commands should I run to launch the server and open the Web UI? Cover both macOS Terminal and Windows PowerShell, and explain what each does.

If OpenClaw responds — great, move to Step 2. If it doesn't, follow the fallback below.

🛠️ Fallback: start OpenClaw manually
Terminal / PowerShell
# macOS Terminal — or — Windows PowerShell
openclaw gateway run --bind loopback --auth none --port 18790

# Then open http://localhost:18790 in your browser
# and paste the prompt above into the chat.

🦞 Tip. Run openclaw --version to confirm it's installed. If missing, see the Workshop Setup Guide.

Step 2

Download the messy folder

Pull the workshop's unsorted documents from Google Drive into a local folder Rudolf can read.

🤖 Prompt — paste into chat
Download the workshop files from this Google Drive folder into ~/workshop/unsorted-backoffice/ (or the Windows equivalent under %USERPROFILE%\workshop\unsorted-backoffice\): https://drive.google.com/drive/folders/1R1A-LhmFS3YSda9bwxGHv9JvDftoBgN9 Use the gog skill if you have it. If not, ask me how to proceed. Don't download FACILITATOR_NOTES.md — that's the answer key, not for participants. When done, list what you downloaded and confirm the count.

What you'll get

~32 files: PDFs, .docx, .xlsx, photos, emails, plain text — a deliberate mess. Some have honest filenames (invoice_2024-03.pdf); some lie (payment_due.pdf is actually a quote). Sorting them is the whole point.

🖥️ Or do it manually
Terminal / PowerShell
# 1. Open the Drive folder in your browser
# 2. Select all files (Ctrl/Cmd+A) and click Download — Drive zips them for you
# 3. Unzip into ~/workshop/unsorted-backoffice/ (macOS) or %USERPROFILE%\workshop\unsorted-backoffice\ (Windows)
Step 3

Provision Rudolf

Create a fresh workspace and register Rudolf as a new OpenClaw agent. He gets his own files, sessions, and identity — isolated from your other agents.

🤖 Prompt — paste into chat
Provision a new OpenClaw agent named Rudolf according to best practices in https://docs.openclaw.ai/concepts/agent-workspace and https://docs.openclaw.ai/concepts/architecture. Create the workspace at ~/.openclaw/workspace-backoffice/ (or %USERPROFILE%\.openclaw\workspace-backoffice\ on Windows). Create the seven canonical placeholder files (AGENTS.md, SOUL.md, IDENTITY.md, USER.md, TOOLS.md, HEARTBEAT.md, MEMORY.md). Register the agent with the CLI. Initialise git in the workspace. Don't write content into any of the markdown files yet beyond placeholders — I'll provide the text in the next steps. After provisioning, run openclaw agents list --json and confirm Rudolf appears.
🖥️ Or do it manually (macOS / Linux)
Terminal · macOS
mkdir -p ~/.openclaw/workspace-backoffice
cd ~/.openclaw/workspace-backoffice
touch AGENTS.md SOUL.md IDENTITY.md USER.md TOOLS.md HEARTBEAT.md MEMORY.md
git init && git add -A && git commit -m "Initial Rudolf workspace"
openclaw agents add backoffice --workspace ~/.openclaw/workspace-backoffice --non-interactive
openclaw agents list --json
🖥️ Or do it manually (Windows PowerShell)
Terminal · macOS
New-Item -ItemType Directory -Force -Path "$env:USERPROFILE\.openclaw\workspace-backoffice"
Set-Location "$env:USERPROFILE\.openclaw\workspace-backoffice"
"AGENTS.md","SOUL.md","IDENTITY.md","USER.md","TOOLS.md","HEARTBEAT.md","MEMORY.md" | ForEach-Object { New-Item -ItemType File -Force -Name $_ | Out-Null }
git init; git add -A; git commit -m "Initial Rudolf workspace"
openclaw agents add backoffice --workspace "$env:USERPROFILE\.openclaw\workspace-backoffice" --non-interactive
openclaw agents list --json

📋 Why one workspace per agent? OpenClaw isolates each agent — its own AGENTS.md, sessions, auth. That's how Rudolf and your other agents coexist without stepping on each other.

Step 4

Configure Rudolf's SOUL.md and AGENTS.md

SOUL.md is character (who Rudolf is). AGENTS.md is procedure (how Rudolf works). Keeping them separate is a docs-recommended best practice.

🤖 Prompt — paste into chat
Write SOUL.md and AGENTS.md for Rudolf in this workspace using OpenClaw best practices at https://docs.openclaw.ai/concepts/soul — SOUL.md is personality + hard limits only; procedures live in AGENTS.md. SOUL.md content: # SOUL.md — Rudolf ## Identity - Name: Rudolf - Context: Backoffice and document keeping for freelancers - Role: Autonomous backoffice keeper — sorts, reconciles, flags, summarises ## Mission Keep the user's backoffice folder clean, complete, and audit-ready. Open every file before filing it. Reconcile numbers across receipts, invoices, and bank statements. Flag the things humans should decide. The user should be able to hand any sorted folder to their accountant and have nothing come back. ## Personality - Calm, precise, dry. The unflappable clerk of a small German municipality. - Treats every file like evidence — opens it, reads enough to be sure, then files it. - Distrusts filenames. Believes the content. - Quietly insistent about backups. ## Communication Style - Reports in tables. Tables before prose. - Leads with totals, then anomalies, then open questions. - Neutral register. No exclamation marks. No emoji. - Names the file path every time he refers to a file. ## Core Skills - Inventory, Classification, Reconciliation, Anomaly flagging, Summary. ## Hard Limits (Never, under any circumstances) - Never edit invoices, receipts, contracts, or spreadsheets. - Never delete. Move questionable items to 99_unsorted_or_personal/. - Never classify a personal item as a business expense without confirmation. - Never overwrite an existing file. Append a suffix and flag. - Never trust filename alone. Open and verify. - Never silently merge duplicates. Preserve both. Flag. - Never round figures in financial summaries. ## Anti-Patterns (Never say) - "Sure!" / "Happy to help!" / "I'll do my best" / "hope this helps" / "all clear" without listing what was checked. For AGENTS.md, cover: Session Boot, Per-File Workflow, Escalation Rules, Reconciliation Pass, Session End, Memory Rules, File Access. Ask me for the full text if you don't have it.

The seven Hard Limits

RuleWhat it prevents
Never edit invoices / receipts / spreadsheetsDestroying the audit trail with "fixes"
Never delete; move to 99_unsorted_or_personal/Losing files that turn out to matter
Never classify personal as business without confirmationTax problems
Never overwriteSilent data loss
Never trust filename aloneThe payment_due.pdf trap (filename says invoice, content is a quote)
Never silently merge duplicatesThe final-v2 vs final-FINAL trap
Never round figuresAccountant will spot it and come back
Step 5

Configure HEARTBEAT.md, USER.md, MEMORY.md

Schedules, who-the-user-is, and the place durable preferences accumulate.

HEARTBEAT.md — a single rotating heartbeat

🤖 Prompt — paste into chat
Write HEARTBEAT.md for Rudolf following the rotating-heartbeat pattern at https://github.com/digitalknk/openclaw-runbook/blob/main/examples/heartbeat-example.md Cadences: - Downloads scan: every 2 hours (09:00–18:00 local) - Open questions: every 24 hours (09:00 only) - Unfiled inbox: every 24 hours (anytime) - Backup integrity: every 7 days (03:00 only) - Quarter-end reminder: every 24 hours (08:00 only) State file: heartbeat-state.json in the workspace, seeded with all timestamps at 0. Each check reports only if actionable, otherwise returns HEARTBEAT_OK.

USER.md — interactive interview

🤖 Prompt — paste into chat
Switch to the Rudolf agent (/backoffice) and tell him: "Rudolf, run the new-user interview. Ask me up to five questions about my country, VAT regime, currency, accountant contact, known clients, and folder preferences. Update USER.md with my answers."

MEMORY.md — start empty

One line. # MEMORY.md — that's it. Rudolf appends over time.

Step 6

Generate TOOLS.md with the OS-aware prompt

TOOLS.md is for this machine's specifics — paths, naming conventions, local quirks. The agent probes the system, proposes a plan, and waits for your approval before writing.

🤖 Prompt — paste into chat
Generate Rudolf's TOOLS.md — but plan first, don't write yet. 1. Read SOUL.md, AGENTS.md, HEARTBEAT.md in this workspace to learn what Rudolf is and what he does. 2. Probe this machine: OS, shells, python, node/npm, anything else relevant. 3. For each of Rudolf's tasks, think about the best tool given what's already on this system and OpenClaw best practices. 4. Browse ClawHub for good-quality skills that fit. Propose any that genuinely help. 5. Output a plan: per task → tool or skill, why it fits, what (if anything) needs installing. Stop there. Wait for my approval before writing TOOLS.md.

💡 Why plan-then-write? You spot anything off (a skill you don't want, an install you'd rather skip) before it's baked into TOOLS.md.

Rudolf's skillset

Two skills: one installed from ClawHub for accounting knowledge, one custom-built so Rudolf can generate fake invoices for the workshop demo.

🛠 Install

Install skills from ClawHub

Use skill-vetter to security-check anything before installing. Then install accountant — pure markdown of accounting principles, no scripts, no network calls.

🤖 Prompt — paste into chat
Install two skills for Rudolf: skill-vetter (security checker) and accountant (domain knowledge). First, use skill-vetter to scan accountant. If it's safe, install both into ~/.openclaw/workspace-backoffice/skills/. Confirm by listing the files in the skills/ folder.
🖥️ Or do it manually
Terminal · macOS
clawhub inspect accountant
clawhub install skill-vetter
openclaw skills run skill-vetter accountant
clawhub install accountant --dir ~/.openclaw/workspace-backoffice/skills/

🔍 Why vet every skill? A compromised skill in your workspace can read your files and call out to the network on Rudolf's permissions. accountant happens to be SKILL.md only (no scripts), so it's safe — but check, don't assume.

🔨 Build

Custom skill: rudolf-invoice

A fake invoice generator tailored to Anna Schmidt's fictional UX consulting business. Used to populate the workshop scenario without sending real invoices anywhere.

🤖 Build it

🤖 Prompt — paste into chat
Build a custom OpenClaw skill called rudolf-invoice in ~/.openclaw/workspace-backoffice/skills/rudolf-invoice/. First, research the official skill creation docs at https://docs.openclaw.ai — confirm SKILL.md metadata format and registration flow. Scope: - Generate fake EU invoices on Anna Schmidt's letterhead (UX Consulting, Berlin, IBAN DE21 1001 0010 0009 9988 76, USt-IdNr DE329918847). - Output both DOCX and PDF. - Parameters: invoice number, date, due date, currency, client name/address/tax-id, line item, description, amount. - Save locally — demo-only, no Drive upload. - Use Python 3 stdlib + python-docx + fpdf2. Bundle a system-font copy (Arial.ttf) so PDF doesn't depend on system fonts. Produce: SKILL.md, scripts/generate_invoice.py, assets/template-fake.docx, assets/arial.ttf. Test by generating one invoice to Müller GmbH for EUR 3,141.60 and confirming pdftotext shows "Anna Schmidt UX Consulting".
How to invoke once built
Terminal · macOS
python3 ~/.openclaw/workspace-backoffice/skills/rudolf-invoice/scripts/generate_invoice.py \
  --number INV-2024-001 --date "15 March 2024" --due "29 March 2024" --currency EUR \
  --client "Müller GmbH" --address "Marienplatz 8" --city "80331 München, Germany" \
  --tax "VAT: DE123456789" --item "UX Audit & Redesign" \
  --desc "Full UX audit with wireframes" --amount "3141.60" \
  --output /tmp/INV-2024-001_MuellerGmbH
📝 Wire up

Register skills in TOOLS.md

Installing a skill in skills/ isn't enough — Rudolf needs to be told it exists and what it's for.

🤖 Prompt — paste into chat
Append a Skills section to Rudolf's TOOLS.md listing both installed skills: ## Skills | Skill | Path | Purpose | |-----------------|-----------------------------|-----------------------------------------------------------------------------| | accountant | skills/accountant/ | Accounting principles, tax fundamentals, bookkeeping knowledge | | rudolf-invoice | skills/rudolf-invoice/ | Generate fake EU invoices (Anna Schmidt demo). DOCX + PDF |

🎙 Talk to Rudolf

Now that Rudolf has identity, soul, procedures, heartbeat, tools, and skills — put him to work. Switch to the Rudolf agent and ask him to sort the messy folder.

  1. Switch to Rudolf: in OpenClaw, select the backoffice agent or type /backoffice.
  2. Send the prompt below. Rudolf will follow his Session Boot procedure: ask for the target folder, back it up, then sort.
🤖 Prompt — paste into chat
Rudolf, please sort the folder ~/workshop/unsorted-backoffice/ (or %USERPROFILE%\workshop\unsorted-backoffice\ on Windows). Follow your Session Boot procedure. Back the folder up first. Open every file before filing it. Flag anything ambiguous instead of guessing. After sorting, run a Reconciliation Pass against expenses_2024.xlsx and produce an accountant-ready summary for Q1 2024.

What good output looks like

👀 Watch for the traps. Rudolf should catch payment_due.pdf, Untitled.pdf (the tax authority notice), and the version chaos. If he misses one, that's a teaching moment.

📚 Homework

Optional

Build a quarter-summary skill

🤖 Prompt — paste into chat
Build a skill called quarter-summary in ~/.openclaw/workspace-backoffice/skills/quarter-summary/. What it does: - Takes a sorted backoffice folder as input. - Computes per-category totals for a given quarter (Q1, Q2, Q3, Q4). - Produces a one-page Markdown summary for the user's accountant: gross income, deductible expenses by category, outstanding receivables, open questions. - Uses Python 3 stdlib only — no third-party packages. - Never modifies source files. Produce: SKILL.md + scripts/summary.py. Test on Rudolf's sorted output from the previous step.

Tips & tricks

🧠 Switch off thinking for routine tasks

ModeBest forAvoid when
OnReconciliation, ambiguous classification, summariesListing files, status checks
OffRoutine moves, simple lookups, heartbeat checksAnything that needs cross-referencing

🦞 Keep heartbeats lean

OpenClaw docs warn: "Start with 1–2 checks. It's easy to add more. It's harder to debug an agent that's constantly doing things you forgot you told it to do." Rudolf's HEARTBEAT.md has five — that's already the upper edge.