# `tatbot` command reference Offline CLI workflows for public development and replay. Maintainers can inspect the complete machine-readable schema with `tatbot schema --json`. ``` tatbot [global flags] [verb] [args] [-- passthrough args] ``` Global flags may appear anywhere before the first `--`, as `--flag value` or `--flag=value`, unless a declared command option owns that spelling: `--json`, `--dry-run`, `--explain`, `-q`, `-v`. Stating one twice with different values is a usage error. `--json` execution is supported only by commands declaring structured output in `schema --json`; all commands support JSON plans and explanations. Use `--output FILE` for draw report destinations. Backend flags on structured commands require `--`; tokens after it are preserved. CLI-owned exit codes are below. Executed backends and SSH retain their own exit codes and error output; backend failures are not remapped to 1. ## Exit codes | code | meaning | | --- | --- | | 0 | ok | | 1 | underlying tool failed | | 2 | usage error | | 3 | safety gate refused | | 4 | wrong node for this verb | | 5 | hardware unreachable | | 6 | busy | ## Safety tiers | tier | meaning | gates | | --- | --- | --- | | `offline` | files only | — | ## Verbs ### `tatbot completion` — generate opt-in shell completion | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `completion bash` | `offline` | this checkout | native | print Bash completion generated from canonical command metadata | ### `tatbot body` — immutable human body model assets and cache audit | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `body export` | `offline` | this checkout | `web/inkmap/tools/export-soma.py` | bake genuine articulated SOMA poses into the shared Inkmap and simulation catalog (`--` → export-soma.py) | | `body bootstrap` | `offline` | this checkout | native | copy a pinned, pre-downloaded MHR and SOMA allowlist into an explicit verified cache | | `body audit` | `offline` | this checkout | native | read and hash every byte in an explicit MHR and SOMA cache without deserializing it | ### `tatbot teleop` — leader→follower teleoperation | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `teleop poses` | `offline` | this checkout | `scripts/vision/teleop_poses.py` | export measured follower tip poses and host read timestamps from a flight log (`--ee-tool`) | | `teleop analyze` | `offline` | this checkout | `cpp/teleop/analyze_log.py` | loop-timing stats from a .wxtl without a GUI | ### `tatbot rollout` — analyze policy rollouts and recorded data | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `rollout analyze` | `offline` | this checkout | `scripts/il_analyze_rollout.py` | did the pen draw the shape, did the loop keep time (`--` → il_analyze_rollout.py) | | `rollout bench` | `offline` | this checkout | `scripts/eval/wire_bench.py`, `scripts/eval/trajectory_plausibility.py` | no-robot checks of the serving path (wire bench / plausibility) (`--` → wire_bench.py / trajectory_plausibility.py) | | `rollout contract` | `offline` | this checkout | `scripts/eval/checkpoint_contract.py` | the input/action contract stored with a checkpoint (`--` → checkpoint_contract.py) | ### `tatbot sim` — scenario, dataset, evaluation and render tools | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `sim list` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/factory.py` | the named distributions the factory can generate | | `sim generate` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/factory.py`, `python/tatbot_sim/src/tatbot_sim/generate.py` | generate one named distribution into a LeRobot v3 dataset (`--` → tatbot_sim.generate (tyro)) | | `sim sample` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/cli.py` | materialize a bounded artwork suite of posed-body scenarios (`--` → tatbot_sim.inkmap.cli sample) | | `sim compile` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/cli.py` | compile one Inkmap placement into a replayable posed-body scenario (`--` → tatbot_sim.inkmap.cli compile) | | `sim perception` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/perception_dataset.py` | render audited privileged Inkmap perception labels on CPU (`--` → tatbot_sim.inkmap.cli perception) | | `sim perception-audit` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/perception_audit.py` | audit an existing privileged Inkmap perception corpus (`--` → tatbot_sim.inkmap.perception_audit) | | `sim pilot-plan` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/pilot.py`, `config/inkmap/synthetic-pilot.json` | write and audit the full Inkmap synthetic-pilot ledger (`--` → tatbot_sim.inkmap.cli pilot-plan) | | `sim pilot-audit` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/pilot.py` | audit an existing Inkmap synthetic-pilot ledger (`--` → tatbot_sim.inkmap.cli pilot-audit) | | `sim parity` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/parity_evidence.py`, `web/inkmap/tools/surface_parity.ts` | produce browser/simulator Inkmap mapping and mask parity evidence (`--` → tatbot_sim.inkmap.parity_evidence) | | `sim materialize` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/cli.py`, `web/inkgen/app.py` | generate and trace immutable Inkgen SVG artifacts before scenario compilation (`--` → tatbot_sim.inkmap.cli materialize-designs) | | `sim recipes` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/recipes.py` | expand a frozen artwork library into reproducible scenario recipes (`--` → tatbot_sim.inkmap.cli recipes) | | `sim recipes-status` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/recipes.py` | read a recipe ledger and audit its splits without any network (`--` → tatbot_sim.inkmap.cli recipes-status) | | `sim resolve` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/cli.py`, `web/inkmap/src/core/lang.ts` | resolve a typed InkLang request into one replayable posed-body scenario (`--` → tatbot_sim.inkmap.cli resolve) | | `sim qualify-artwork` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/artwork_qualification.py` | qualify shared artwork paint, duration, and simulated deposition (`--` → tatbot_sim.inkmap.artwork_qualification) | | `sim eval dataset` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/eval_cli.py` | score judged expert datasets and write a screen report (`--` → tatbot_sim.eval_cli) | | `sim eval policy` | `offline` | this checkout | `scripts/eval/sim_policy_eval.py` | run a checkpoint through a local ManiSkill worker and the async wire (`--` → sim_policy_eval.py) | | `sim preview` | `offline` | this checkout | `scripts/sim_preview.py` | preview what the factory would generate, no dataset written (`--` → sim_preview.py (tyro)) | | `sim reach` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/audit_reach.py` | audit tool IK reach over the domain-randomization distribution, headless (`--` → tatbot_sim.audit_reach (tyro)) | | `sim cinematic` | `offline` | this checkout | `scripts/sim_cinematic.py` | path-traced takes of a distribution for showing outside the lab (`--` → sim_cinematic.py (tyro)) | | `sim viewer` | `offline` | this checkout | `scripts/render_viewer.py` | build an HTML viewer over render directories with system Python (`--` → render_viewer.py) | | `sim audit` | `offline` | this checkout | `scripts/sim_dataset_audit.py` | audit a generated dataset or a night of shards (`--` → sim_dataset_audit.py (tyro)) | | `sim samples` | `offline` | this checkout | `scripts/sim_dataset_samples.py` | extract stills and short clips from a dataset or shards (`--` → sim_dataset_samples.py (tyro)) | | `sim showcase-artwork` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/showcase.py` | materialize five typed artwork previews for the Inkmap pose gallery (`--` → tatbot_sim.inkmap.showcase) | ### `tatbot travel` — travel demo previews and synthetic tracing episodes | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `travel preview` | `offline` | this checkout | native | render a travel episode and optional camera/hand inspection views without a dataset (`--` → travel preview) | | `travel generate` | `offline` | this checkout | native | generate travel LeRobot episodes with canonical SOMA surface-address labels (`--` → travel generate) | | `travel trace` | `motion-auto` | this checkout | native | scan the practice forearm with the blue wrist camera and follow a stroke of ink at the laser's hover (`--` → trace) | ### `tatbot calib` — native arm measurements and retained overhead registration | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `calib register-fit` | `offline` | this checkout | `scripts/vision/native_registration.py` | fit an unadopted overhead registration from original native holds and shared geometry | ### `tatbot vision` — offline vision processing and calibration | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `vision depth compare` | `offline` | this checkout | `scripts/vision/depth_compare.py` | compare filters on a retained raw scan burst | | `vision board witness` | `offline` | this checkout | `scripts/vision/board_witness.py`, `scripts/vision/board_mount_witness.py` | compare retained board depth with independently measured fiducial size | | `vision stencil generate` | `offline` | this checkout | `scripts/lib/stencil_generate.py` | generate a stencil frame: the coded flower-of-life (default) or the legacy floral frame, with print sheets | | `vision stencil reference` | `offline` | this checkout | `scripts/lib/stencil_reference.py` | export a tracking manifest for existing generated stencil artwork | | `vision stencil print` | `offline` | this checkout | `scripts/lib/stencil_print.py` | print sheets for a stencil: millimetre rulers, a pattern and size label, stencil-app PNG and paper PDFs | | `vision stencil replay` | `offline` | this checkout | `scripts/vision/stencil_observe.py` | replay known stencil tracking and optional advisory surface candidates | | `vision stencil observe` | `sensor` | this checkout | `scripts/vision/stencil_observe.py` | observe known stencils from an existing visiond owner socket | | `vision stencil bench` | `offline` | this checkout | `scripts/vision/stencil_bench.py` | score a stencil design and tracker in mm on seeded 2-D transfer scenes (tier 0) | | `vision tags print` | `offline` | this checkout | `scripts/vision/generate_wrist_tags.py` | render the wrist-tag print sheet (`--` → generate_wrist_tags.py) | | `vision handeye d405` | `offline` | this checkout | `scripts/vision/d405_handeye_plane.py` | plane-route hand-eye for the wrist D405s: fit depth planes against the touched-off paper (`--` → d405_handeye_plane.py) | ### `tatbot design` — an image or an SVG to a portable design, without a browser | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `design generate` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/design_cli.py`, `web/inkgen/app.py` | ask the generator for one tattoo-flash PNG (starting it if it is not up) (`--` → tatbot_sim.inkmap.design_cli generate) | | `design trace` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/design_cli.py`, `web/inkmap/tools/artwork.ts` | retired tracer: use drawingbot generate and import acquired artwork.json (`--` → tatbot_sim.inkmap.design_cli trace) | | `design place` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/design_cli.py`, `web/inkmap/tools/artwork.ts` | place one artwork on a plane or cylinder chart as a portable design (`--` → tatbot_sim.inkmap.design_cli place) | | `design check` | `offline` | this checkout | `python/tatbot_sim/src/tatbot_sim/inkmap/design_cli.py`, `web/inkmap/tools/artwork.ts` | validate a design with the browser reader and report its material footprint (`--` → tatbot_sim.inkmap.design_cli check) | ### `tatbot drawingbot` — DrawingBotV3 stroke experiments and preference review | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `drawingbot generate` | `offline` | this checkout | `scripts/drawingbot.sh`, `scripts/drawingbot.py`, `scripts/lib/drawing_python.sh`, `scripts/lib/drawing_python.py`, `scripts/lib/drawingbot/artifacts.py`, `scripts/lib/drawingbot/bridge.py`, `scripts/lib/drawingbot/replay.py`, `scripts/lib/drawingbot/recipe.py`, `scripts/lib/drawingbot/container.py`, `scripts/lib/drawingbot/job.py`, `scripts/lib/drawingbot/pens.py` | generate one physical DBV3 drawing with verified settings and a saved native recipe | | `drawingbot export` | `offline` | this checkout | `scripts/drawingbot.sh`, `scripts/drawingbot.py`, `scripts/lib/drawing_python.sh`, `scripts/lib/drawing_python.py`, `scripts/lib/drawingbot/artifacts.py`, `scripts/lib/drawingbot/bridge.py`, `scripts/lib/drawingbot/replay.py`, `scripts/lib/drawingbot/recipe.py`, `scripts/lib/drawingbot/container.py` | verify and replay native SVG acquisition only, without ROS compilation | | `drawingbot container` | `offline` | this checkout | `scripts/drawingbot.sh`, `scripts/drawingbot.py`, `scripts/lib/drawing_python.sh`, `scripts/lib/drawing_python.py`, `scripts/lib/drawingbot/artifacts.py`, `scripts/lib/drawingbot/bridge.py`, `scripts/lib/drawingbot/replay.py`, `scripts/lib/drawingbot/recipe.py`, `scripts/lib/drawingbot/container.py` | build, smoke-test or run the private mounted-app acquisition container | ### `tatbot inkmap` — ground InkLang placements and preview tattoos on canonical bodies | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `inkmap dev` | `offline` | this checkout | `scripts/inkmap_dev.sh`, `web/inkmap/package.json` | the tattoo preview app on this machine (`--` → inkmap_dev.sh) | | `inkmap resolve` | `offline` | this checkout | `web/inkmap/tools/resolve.ts`, `config/inkmap/inklang-resolution.schema.json`, `web/inkmap/package.json` | resolve InkLang placement text to a canonical rest-surface anchor as JSON | ### `tatbot inkgen` — generate tattoo artwork for Inkmap | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `inkgen batch` | `offline` | this checkout | `web/inkgen/batch.py`, `python/tatbot_sim/src/tatbot_sim/inkmap/inkgen_materialize.py` | run or resume a resumable artwork generation job (`--` → tatbot_sim.inkmap.cli batch) | | `inkgen batch-status` | `offline` | this checkout | `web/inkgen/batch.py` | read a generation job's ledger: requested, accepted, refused, failed, duplicate (`--` → tatbot_sim.inkmap.cli batch-status) | ### `tatbot profile` — inspect and validate hardware profiles | verb | tier | runs on | wraps | summary | | --- | --- | --- | --- | --- | | `profile show` | `offline` | this checkout | `scripts/lib/tatbot_profile.py` | the resolved hardware profile: backend, arms, e-stop, provenance | | `profile list` | `offline` | this checkout | `scripts/lib/tatbot_profile.py` | the profiles this checkout carries | | `profile check` | `offline` | this checkout | `scripts/lib/tatbot_profile.py` | can the resolved profile drive hardware? (exit 3 if not) | ## Compatibility spellings These deprecated forms translate to the same canonical handler. They warn once on stderr. They remain for at least 30 days and two reviewed releases after 2026-09-05, whichever is longer; removal also requires consumer review and a release note. | deprecated form | canonical form | | --- | --- | | `tatbot sim compile --sample N` | `tatbot sim sample --count N` | | `tatbot sim preview --reach` | `tatbot sim reach` | | `tatbot sim cinematic --viewer DIR…` | `tatbot sim viewer DIR…` | | `tatbot sim audit --samples DATASET` | `tatbot sim samples DATASET` | | `tatbot sim eval --policy-rollout -- ARGS` | `tatbot sim eval policy -- ARGS` | | `tatbot sim eval DATASET…` | `tatbot sim eval dataset DATASET…` | ## Bash completion Generate and source completion explicitly (Bash 4+): ```sh tatbot completion bash > /tmp/tatbot-completion.bash source /tmp/tatbot-completion.bash ``` Generation prints shell code; it does not install anything or edit shell startup files. Completion is generated from the canonical commands, options and choices. ## Examples ``` tatbot completion bash tatbot body export --python '' -- --help tatbot body bootstrap --spec config/body-models/mhr-soma-v1.json --cache-dir '' --source-dir '' tatbot body audit --spec config/body-models/mhr-soma-v1.json --cache-dir '' tatbot teleop poses flight.wxtl --out '' --urdf urdf/tatbot.urdf --workspace config/workspace.yaml tatbot teleop analyze '' tatbot rollout analyze '' tatbot rollout bench wire -- --help tatbot rollout contract '' tatbot sim list tatbot sim generate paper-draw -- --out-dir '' --num-episodes 8 tatbot sim sample --count 3 -- --output-dir '' tatbot sim compile config/inkmap/examples/forearm-placement-v6.json -- --pose reclined-left-arm-supported --output '' tatbot sim perception '' -- --output-dir '' tatbot sim perception-audit '' tatbot sim pilot-plan -- --output-dir '' --seed 42 tatbot sim pilot-audit '' tatbot sim parity -- --output '' tatbot sim materialize -- --help tatbot sim recipes -- --help tatbot sim recipes-status -- --help tatbot sim resolve 'a dbv3-orbit on the left forearm' -- --design-id dbv3-orbit --size-mm 30 30 --seed 42 --output-dir '' tatbot sim qualify-artwork -- --output-dir '' tatbot sim eval dataset '' -- --output-dir '' tatbot sim eval policy -- --client-mode hold-control --output-dir '' tatbot sim preview -- --help tatbot sim reach -- --help tatbot sim cinematic -- --help tatbot sim viewer '' '' tatbot sim audit -- --help tatbot sim samples '' -- --out '' tatbot sim showcase-artwork -- --output-dir '' tatbot travel preview -- --help tatbot travel generate -- --help tatbot travel trace -- scan tatbot calib register-fit --python '' --arm blue --capture '' --bundle '' --setup-id table-setup --out '' tatbot vision depth compare --capture capture-1.npz --settings filters.json tatbot vision board witness --python '' --capture capture.json --inventory fiducials.json --measurement measurement.json --color-sensor wrist_color --out '' tatbot vision stencil generate --seed 101 --output '' tatbot vision stencil reference --settings stencil/settings.json tatbot vision stencil print --seed 101 --output '' tatbot vision stencil replay --reference stencil/tracking.json --instance skin-a --frames frames.jsonl --output '' tatbot vision stencil observe --reference stencil/tracking.json --instance skin-a --socket '' --sensor rgb --output '' tatbot vision stencil bench --seed tatbot-42 --tracker sift tatbot vision tags print -- --help tatbot vision handeye d405 --self-test tatbot design generate 'a swallow carrying a rose' --out '' tatbot design trace tatbot design place '' --target cylinder --radius-mm 40 --canvas-mm 80 110 --out '' tatbot design check '' tatbot drawingbot generate '' --out '' --app '' tatbot drawingbot export '' --out '' --app '' tatbot drawingbot container build --out '' tatbot inkmap dev tatbot inkmap resolve --prompt 'left upper inner forearm' tatbot inkgen batch --output-dir '' --subject 'a heron' --count 4 tatbot inkgen batch-status --output-dir '' tatbot profile show tatbot profile list tatbot profile check ```