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.
01 Connect your agent
$ claude mcp add --transport http niua https://mcp.ohao.tech/mcp
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"
}
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:
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
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.
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
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
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
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