jelou workflow), local testing with traces
(jelou test), production triage (jelou logs), and user state reset
(jelou users).
Syncing workflows to local files (
jelou link, pull,
status, push, incoming) is documented in
Projects and channels.jelou workflow
jelou workflow has 16 subcommands in total (besides the ones above:
update, set-default, delete/rm, hide, unhide, allow-user,
allow-country, evaluate, skill, build, branches,
canonicalize-branch, inject-ecommerce, adopt, authoring). Explore them
with jelou workflow --describe.validate runs a canonical multi-phase pipeline (schema → autofix →
normalize → ids → config → quality → whatsapp → edges → lint → finalize) and
reports { status, errorCount, warnCount } per phase. With errors it exits with
a non-zero code; --allow-warnings exits 0 if only warnings remain.
Additional flags: --fix (alias --write) canonicalizes the file in place
(mints ids, normalizes branch tokens, repairs edge handles); --quiet only
prints files that have errors or warnings; --out <path> saves the same JSON
payload to disk in addition to stdout.
--partial <file> runs the full validator on a single in-progress draft in
preview mode: it returns rich diagnostics but never gates — it always
exits 0 regardless of errors. As of v1.88, a validate-on-write hook runs this
same preview automatically the moment an AI agent writes a workflow’s JSON,
so diagnostics arrive immediately (they’re advisory only: they never block
the write).
Also as of v1.88, validate now validates tools/*.json files too (not
just workflows/*.json) using the real tool-push rules, and it no longer
incorrectly flags $output.set() inside a tool’s CODE node — that’s the
correct way a tool returns a value.
jelou test
Test workflows locally: send messages, persist traces and chats, and
inspect them.
AI cost per turn
Every time anAI Agent node replies, the output of jelou test send text and jelou test turn status includes a cost field with the tokens and the amount the turn consumed. There is one entry in items for each bubble that carried a cost, and that bubble’s rendered_chats row repeats it.
Cost field of a turn
You don’t need to turn anything on in the node: the cost arrives on every test turn. The Show cost when testing on WhatsApp toggle only controls the footer on WhatsApp.
Local testing dashboard
jelou test send text, jelou test chats list, and jelou test trace
produce.
What it shows:
- Targets / workflows — the workflows you can test (those that have recorded runs, plus the ones in the lockfile even if they don’t have any yet).
- Runs (test chats) — each recorded test conversation, with its turns, the
rendered message, and its terminal status (
STABLE,TIMEOUT,HARNESS_STALL,HARNESS_ERROR). - AI cost per turn — every
AI Agentturn shows, below its last bubble, the turn’s tokens and cost, for example1,234 tokens · $0.0031. If the model has no price, it shows only the tokens. - Per-node trace — for each run, the workflow’s step-by-step execution: each node with its initial and final state.
/api/targets, /api/workflows, /api/runs, /api/runs/:id,
/api/runs/:id/trace) and, if there’s a profile that can send messages, it
lets you start new chats from the UI (POST /api/chats,
/api/runs/:id/messages).
What data it works with:
- It reads the per-target
qa.dbfiles (SQLite) — the same ones the otherjelou testcommands create and query. There’s no separate database: the dashboard only visualizes them. - Data is isolated per repo (
repo-idsegment = git root directory name + a short hash) and per profile. That’s why you must run it inside the repo with your runs, or point it at another one with--repo <segment>.
It’s local-only (listens on loopback); for remote access use SSH port
forwarding:
ssh -L 8766:localhost:8766 <host>.
The BrainOps bundles
jelou-build-workflow and jelou-test-workflow
(skills) orchestrate this build-and-test cycle for
workflows from an AI agent.jelou logs — production conversation triage
Read-only access to a bot’s conversation history. It lets you drill down
from conversation → chat timeline → the node that failed.
--from/--to (ISO-8601), --cursor for pagination, and --out <path> to save the JSON envelope. The --bot-id is the bot connected to the
channel — discover it with jelou channels list. The drill-down flow prints the
next command under each FAILED execution.
jelou users reset
Hard-resets a user’s cached state with a bot (clears the state,
skill, and state_manual keys). Useful before re-testing from scratch or to
unblock a user stuck in a loop.