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.
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). - 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.