Given only logged trajectories, what do this robot's action numbers mean?
ActionABI scores a finite declared grammar of candidate contracts on held-out episodes, retains a calibrated equivalence set instead of breaking ties, and emits a converter only when every required field is supported. Its defining discipline is calibrated abstention: it never certifies a unique answer the data does not support. C++20 evidence core, pybind11 Python fusion backend.
uvx --from cmake cmake -S . -B build # C++20 · CMake 3.26+ · Python 3.11+
One half of a pair
ActionABI is the offline forensic half of the hidden action-interface attack. Its sibling, ActionShift, is the online adaptation half: a benchmark measuring whether a policy can recover the same contract live, from bounded probes. Both speak one contract grammar — and this project's C++ scorer runs as a live backend inside ActionShift's belief loop, with verified numerical parity.
Evidence
| Honest abstention, real trace | On a ManiSkill bridge trace, 56 contracts stay observationally equivalent (true one retained) — ActionABI abstains, emits no converter |
|---|---|
| LeRobot hub audit | 35 datasets audited for action-convention contradictions: 0 found (audit dataset) |
| C++/Python parity | Held-out Huber residuals match to 5e-17 across the pybind11 fusion boundary |
| Per-channel resolution | Target resolves to 100% while scale, lag stay ambiguous and gripper/frame stay structurally unobservable — reported field by field, never averaged away |
| Open artifacts | DOI 10.5281/zenodo.21500715 · reports carry confidence intervals and disclosed anomalies |
Media




Build & run
uvx --from cmake cmake -S . -B build -DACTIONABI_BUILD_TESTS=ON -DCMAKE_BUILD_TYPE=Release
uvx --from cmake cmake --build build -j 8
uvx --from cmake ctest --test-dir build --output-on-failure
./build/actionabi infer --input tests/fixtures/simple.jsonl \
--contract tests/fixtures/absolute.json --contract tests/fixtures/delta.json \
--output build/evidence.json # scored contracts + evidence report
Limits
What this release does not claim (from Honest limits):
- Scale is not identifiable under pd_ee_delta_pose (controller under-tracks large deltas ~0.6x).
- Gripper is unobservable from tcp-pose response — labeled, excluded, reported unsupported.
- No hardware validation: all dynamics evidence is simulated; no hardware-safety claim.
- The grammar is finite (6-value scale grid, lag in {0,1,2}); synthetic gates don't imply arbitrary-contract recovery.
Family
| Sibling | ActionShift — online adaptation over the same contract grammar (repo: Archerkattri/actionshift) |
|---|---|
| Consumes | LeRobot-format trajectories · ManiSkill bridge traces |
| More | Research portfolio · code |
| External | LeRobot · LeRobot docs |