Skip to main content

Safety Harness for Physical AI

tests PyPI License: Apache 2.0

A perception-grounded safety harness for physical AI: a default-deny precondition gate for physical actuators. Every action a robot proposes — grasp, place, reach, anything else you register — must earn a PERMIT from measured, structured evidence before it executes. No evidence, or a failed check, or an adapter that raises: BLOCK. Permission, not detection.

Full design spec, architecture, worked examples, test/validation record, and roadmap: Perception-Grounded Safety Harness for Physical AI — design doc.

Status

Reference implementation, not yet independently assessed. Validated against two robots (a Franka Panda arm; an ANYmal-C quadruped) in one simulator (Isaac Lab), with 207 automated unit/fuzz/mutation/black-box/stress tests and 7 live hazard-scenario recordings. A third adapter (a Unitree G1 humanoid with a dexterous hand) ships with a trained block-stacking policy to gate — see examples/isaac_lab_g1_stack; gating that policy under injected hazards is in progress, not yet a validation result. It has not been reviewed by a functional-safety assessor against IEC 61508, ISO 13849, or ISO 10218/TS 15066 — see the design doc's Scope & Non-Goals section for what's out of scope today (joint-space kinematic checks, certified numeric thresholds, data-protection handling of logged human-position data). Treat this as engineering evidence, not a certification.

What's here

  • safety_harness/schema.py — the data contract (WorldState, Action, Decision, and friends). SCHEMA_VERSION tracks this contract specifically; bump it deliberately (see the design doc's Version History).
  • safety_harness/engine.py — ActuatorGate.gate(), the single decision entry point.
  • safety_harness/preconditions.py — the registered precondition checks (31 distinct checks; the registry also keeps balance_margin_maintained as a legacy alias of stability_margin_maintained): object/target safety, placement, agent proximity incl. ISO/TS 15066, vulnerable bystanders, robot self-limits, payload/grip force, stability, perception integrity (sensor freshness, swept-path coverage), decision deadline, command and configuration integrity, environmental signals.
  • safety_harness/watchdog.py — DecisionWatchdog, an actuator-side dead-man's switch: execute only a PERMIT that is still fresh and bit-identical to what was checked, otherwise freeze.
  • safety_harness/integrity.py / safety_harness/pin.py — action digests and configuration pinning (python -m safety_harness.pin configs/example_action_schema.yaml regenerates the .sha256).
  • safety_harness/action_schema.py — the YAML-driven registry mapping action types to the checks they must pass (configs/example_action_schema.yaml is the reference wiring).
  • tests/ — unit tests, mutation/random-fuzz tests, and reflection-driven black-box contract tests.

Robot-specific behavior lives entirely behind four adapter interfaces (PerceptionAdapter, DynamicsAdapter, FallbackController, Logger) so the engine and checks are robot-agnostic. Reference adapters exist for three Isaac Lab robots: Franka Panda (adapters/isaac_lab.py), ANYmal-C (adapters/isaac_lab_anymal.py) and Unitree G1 (adapters/isaac_lab_g1.py).

Not yet independently verified (deliberately flagged, not buried): the ISO/TS 15066 Table A.2 body-region force figures, the child clearance and the crowd factors in vulnerable_bystander_protected are placeholder values that need sign-off from a qualified safety engineer before being described as standards-aligned; and config_integrity_verified is a checksum unless you supply an HMAC key — it catches corruption and uncoordinated edits, not an attacker who can rewrite both the config and its pinned hash.

Install & test

pip install safety-harness

Or straight from GitHub (e.g. for an unreleased fix):

pip install git+https://github.com/naganumakr/safety-harness.git

Or for local development (editable, so edits to safety_harness/ take effect immediately):

git clone https://github.com/naganumakr/safety-harness.git
cd safety-harness
pip install -e .
python -m unittest discover -s tests -p "test_*.py"

Usage

from safety_harness import ActionSchemaRegistry, ActuatorGate, DecisionWatchdog
from safety_harness.adapters import FreezeInPlaceFallback, InMemoryLogger
from safety_harness.adapters.isaac_lab import (
    IsaacLabCubeStackPerceptionAdapter,
    IsaacLabCubeStackDynamicsAdapter,
)
from safety_harness.integrity import read_digest_file

cfg = "configs/example_action_schema.yaml"
# Pin the config to its known-good digest: a registry loaded without one blocks every action
# (config_integrity_verified), and one whose file doesn't match refuses to construct.
schema = ActionSchemaRegistry.from_yaml(cfg, expected_digest=read_digest_file(cfg + ".sha256"))
fallback = FreezeInPlaceFallback()
watchdog = DecisionWatchdog(fallback, deadline_s=0.2)  # set from your real control cycle
gate = ActuatorGate(
    perception=IsaacLabCubeStackPerceptionAdapter(...),   # swap for your own stack's adapter
    dynamics=IsaacLabCubeStackDynamicsAdapter(...),
    fallback=fallback,
    logger=InMemoryLogger(),
    action_schema=schema,
    watchdog=watchdog,
)

gate.gate(proposed_action)       # -> Decision(verdict=PERMIT|BLOCK, ...), also fed to the watchdog
robot.execute(watchdog.command())  # the permitted action only while fresh and bit-identical; else freeze

Nothing here is Isaac-Lab-specific except the two adapter classes — swap those for adapters targeting your own robot stack and the engine, checks, and tests are unchanged. See "Contributing an adapter" below.

License

Apache License 2.0 — see LICENSE and NOTICE. The engine, the adapter interfaces, and the conformance test suite are all open under this license: the goal is for any robot maker to implement the four adapters for their own stack and run the same conformance suite against it, not to license the core code per-implementation. See the design doc's Release & Distribution section for the reasoning and the certification model this enables.

Contributing an adapter

  1. Implement PerceptionAdapter, DynamicsAdapter, FallbackController, and Logger for your stack (see safety_harness/adapters/isaac_lab.py for the reference shape).
  2. Run the black-box and fuzz test suites against your adapter's WorldState/PredictedTrajectory output — they're written against the interfaces, not the Isaac Lab implementation, so they should run unmodified.
  3. Open an issue or PR with your results. Passing the conformance suite is what "compliant adapter" means here — there's no separate certification process yet, but that's the intent (see the design doc's Roadmap).

Metadata

Release files for safety-harness 0.3.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for safety-harness 0.3.0
File Size Uploaded
safety_harness-0.3.0.tar.gz 94.2 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for safety-harness 0.3.0
File Interpreter ABI Platform
safety_harness-0.3.0-py3-none-any.whl Python 3 none any Details

Total release size: 161.7 kB

Release files / safety_harness-0.3.0.tar.gz

Download URL safety_harness-0.3.0.tar.gz
Size 94.2 kB
Tags Source
SHA-256 checksum
How to use checksums
85604e31b58fb05162640a91b51ce1792a0378ba1170aff622c0a7aaceafada5
BLAKE2b-256 checksum
How to use checksums
e0050023ea02f0accd02ef0af39f9470b60e085e93ab3fa3ff2c4b6aa9aaabf8
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release files / safety_harness-0.3.0-py3-none-any.whl

Download URL safety_harness-0.3.0-py3-none-any.whl
Size 67.5 kB
Tags Python 3
SHA-256 checksum
How to use checksums
aca50f99f7cbfc6d904cd1abe2d8001e487969318598d3db2e22fde25d9f655f
BLAKE2b-256 checksum
How to use checksums
d161d377d335f6734339a6f1eaf21c5026c18f91be0c82737ecd6781ac35732e
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.14

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Sep 27, 2026.

Transparency log

Release history Release notifications | RSS feed

0.3.13

2 release files

0.3.6

2 release files

0.3.1

2 release files

This release

0.3.0 This release

2 release files

0.2.4

2 release files

0.2.3

2 release files

0.2.2

2 release files

0.2.1

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page