How it works

Five steps from agent output to proof.

For people and for agents. The same five steps cover robots for simulation, game props and audio. Agents can read the flow as plain text at /llms.txt. What is live for robots, with its evidence, and what NIUA does not do are below the steps.

How a file your agent built becomes a signed pass, in five steps. For developers and for the agents they run.

  1. 01 Connect your agent

    claude mcp add --transport http niua https://mcp.ohao.tech/mcp
  2. 02 Check a robot against a contract

    niua-runner check arm.zip --contract urdf.sim-ready@1
  3. 03 Anyone re-checks the receipt ("valid": true)

    curl https://api.ohao.tech/api/v1/receipts/$RECEIPT_ID
MCP
the protocol agents such as Claude Code use to call tools. NIUA is an MCP server.
Contract
the published rules a file must meet, by name and version. Each rule has a threshold and a fix.
Gate
NIUA's checker. It runs a contract on your file and says pass or fail, with a fix for each fail.
Receipt
a signed note that this exact file passed this exact contract. Anyone can verify it, offline.

For agents: llms.txt · OpenAPI · example-session.json

  1. 01 Connect
  2. 02 Pick a contract
  3. 03 Build, then check
  4. 04 Fail means fix
  5. 05 Pass means proof

01

Connect your agent with one command

NIUA is a hosted MCP server. Sign in on first use; the agent gets the gate tools.

claude mcp add --transport http niua https://mcp.ohao.tech/mcp

Cursor, Codex, other MCP clients, or plain REST: connect another agent.

02

Pick a contract

A contract is versioned JSON that says what done means for one kind of file. Use a built-in or write your own.

  • articulated.sim-ready@1A URDF or MJCF robot or articulated object loads and runs in MuJoCo under simcheck with no errors: sound mass and inertia, working joints, and collision that matches the visible geometry.
  • urdf.sim-ready@1A URDF robot is one valid tree with real masses, joint limits, meshes that resolve and a collider on every visible link, checked statically without running a simulator.
  • motion.g1-safe@1A Unitree G1 motion clip stays inside its joint limits, its feet barely slide and stay out of the floor, and it stays upright when replayed in MuJoCo.
  • splat.sim-ready@1A Gaussian splat and its collision mesh share one frame, the floor is level, the collider covers the floor, and boxes dropped in MuJoCo come to rest on it.
  • glb.prop@1A 3D prop meets an engine's structural budget: named parts, assigned materials, collision, real-world scale, and at most 50,000 triangles and 2048 px textures.
  • glb.prop-strict@1The same prop checks on a mobile budget: at most 10,000 triangles and 1024 px textures.
  • wav.sfx@1A sound effect is 44.1 or 48 kHz, mono or stereo, 0.05 to 30 s long, never clips, and has no dead air at either end.
  • wav.voice@1A voice line is mono, 0.3 to 60 s long, between -23 and -16 LUFS, and never clips.

Robots and motion: simulation only, no hardware tested. Agents read the same list as JSON: /api/v1/contracts/builtin.

03

Your agent builds in real tools, then calls check_artifact

A robot description for a simulator, Blender, a DAW, an engine: NIUA does not model for it. The agent uploads the exported file (create_upload, finalize_upload) and checks it.

check_artifact {
  "key": "<asset_key from finalize_upload>",
  "contract": "urdf.sim-ready@1"
}

Same check over REST:

curl -X POST https://api.ohao.tech/api/v1/check \
  -H "Authorization: Bearer $NIUA_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"artifact": {"key": "<r2_key from /api/v1/upload>"}, "contract": "urdf.sim-ready@1"}'

04

A typed fail says what broke and how to fix it

Every failure carries the rule, where it broke, what was expected, what was found, and the fix. The agent repairs the file in its tool and checks again. Example response:

  1. errormaterials.glass_is_transmissive/materials/1glass
    expected
    KHR_materials_transmission.transmissionFactor > 0
    got
    baseColorFactor alpha 1.00, transmission 0.00
    fix
    Set the Principled BSDF Transmission Weight to 1.0 and export with glTF transmission enabled.
  2. errorbudget.triangles/nodes/0d1_lantern
    expected
    <= 20000 triangles per part
    got
    24792 triangles
    fix
    Decimate this part or remove hidden faces.
  3. errorcollision.present/nodesasset
    expected
    a collision mesh node in the scene (UCX_*, *-colonly, *-col, *_col, or extras.collision = true)
    got
    none
    fix
    Add a simple convex collision mesh named UCX_<part> (or <part>-colonly for Godot).

05

A pass is an Ed25519-signed receipt anyone can verify

The receipt binds this exact file hash to this exact contract and checker version. Verify it against the public key, online or offline.

# Anyone can verify a receipt. No key needed.
curl https://api.ohao.tech/api/v1/receipts/<receipt_id>
# -> { "receipt": { "verdict": "pass", "artifact_sha256": "...", "signature": "..." }, "valid": true }

# Or offline: Ed25519 public keys (JWKS), matched on the receipt's key_id
curl https://api.ohao.tech/.well-known/niua-receipt-keys.json

Robotics, sim-ready · live

What is live for robots, with the evidence

Each claim opens to its evidence: a demo you can run, the file we used, and a signed receipt you can verify. Simulation only, no hardware tested

  1. A robot is checked before a simulator sees it

    simulation only, no hardware tested

    NIUA reads a robot file (URDF) against its robot checklist, urdf.sim-ready@1: every part attached in one chain, a real weight on every moving part, a collision shape on every visible part, joint limits the right way round, 3D files that exist, sizes in meters, not millimeters. Each failure names the part, what was expected, what was found and the fix.

  2. It catches what other tools let through

    simulation only, no hardware tested

    We broke our arm 8 ways, one break per copy, and ran every copy through NIUA and two open-source tools. Those tools answer a different question (does the file load?), so they let most breaks through.

    • NIUA gate8/8
    • yourdfpy1/8
    • MuJoCo2/8compiled the other 6

    Broken copies flagged. Measured 2026-10-15. 13 URDF fixtures from our own desk arm (5 good, 8 broken). Gate: urdf.sim-ready@1. yourdfpy 0.0.60: URDF.load with meshes, then validate(). MuJoCo 3.16.0: MjModel.from_xml_path. Flagged means rejected or failed to load. result.json

  3. An agent repairs it until a simulator loads it

    simulation only, no hardware tested

    Claude Code read the failures NIUA named, edited the robot file (every guessed value marked as a guess) and checked again until it passed. The MuJoCo simulator refused the original file and loads the fixed one.

    Measured 2026-10-15. tools/auto-sim/run_auto_sim.mjs against production. MuJoCo 3.16.0 compiles each file, then runs 2 s under gravity from a bent pose with no actuation and checks the state stays finite. run.json

  4. A humanoid clip passes a physics replay

    simulation only, no hardware tested

    A real NVIDIA Unitree G1 humanoid clip passes motion.g1-safe@1 in a MuJoCo physics replay, run on CPU: every joint inside its range and speed limit, feet on the floor without sliding, upright the whole time. Four mistakes we planted were fixed first, each from a failure NIUA named.

    Measured 2026-10-15. tools/g1-motion/record_production.mjs: the production gate checked the published clips; MuJoCo 3.16.0, Menagerie unitree_g1, timestep 0.002 s, joint PD kp 500 kv 10.32, root unactuated, sampled at 50 Hz. Source: the first 3.5 s of NVIDIA GR00T-WholeBodyControl macarena_001__A545. production.json

What NIUA does not do

  • Simulation only, no hardware tested

    NIUA has no robot hardware. Every robot check and run on this site happens in software: the gate on our servers and the simulation in MuJoCo. Nothing here was tested on a physical robot.

  • Not sim-to-real

    A pass means the file is well formed for a simulator. It does not mean a physical robot would behave the same, and NIUA never runs a policy on hardware.

  • No physics fidelity score

    Mass, inertia and joint limits are checked for being present and physically possible, not for matching a physical robot. The auto-sim run checks that a model loads and stays finite, nothing more.

  • World models: not built yet

    The world-models track is planned. No contract, check or receipt exists for it today.

  • Our own test files

    The robot numbers on this site come from our own arm and test fixtures, each one linked. They are not customer results.

Two ways to run it for real

Use ohao.tech

Connect your agent to the hosted gate

Claude, Codex, Cursor or any MCP client. Your agent calls check_artifact after every export and keeps the receipt.

claude mcp add --transport http niua https://mcp.ohao.tech/mcp

Other agents · REST API

Self-host

Run the gate on your own infrastructure

The same checker and contracts inside your network, with receipts signed by your own key: one gateway container, Postgres and S3-compatible storage.

Self-host NIUA