Pensenova

pip install pensenova-safety

01

# engine: processes the session and issues the seal
pip install pensenova-safety

# verifier (open, Apache-2.0): checks a seal
pip install pensenova-verify

import numpy as np
import pensenova_safety as ps

profile = ps.SafetyProfile.from_limits(
    "my_robot",
    joint_names=["j0", "j1", "j2"],
    lo=np.array([-1.0, -1.0, -1.0]),   # min angle per joint (rad)
    hi=np.array([ 1.0,  1.0,  1.0]),   # max angle per joint (rad)
    max_vel=np.array([2.0, 2.0, 2.0]),  # max speed per joint (rad/s)
)

02

from pensenova_safety import cloud

env = ps.protect(profile, operator="linha_A")   # opens the protected session

for step in range(n_steps):
    state = robot.get_state()
    cmd = policy(state)
    safe, report = env.filter(cmd, state, dt)   # the spine decides
    robot.send(safe)

env.stop()

submission = cloud.package_session(env, robot_id="my_robot")
seal = cloud.submit_session(submission)

payload = seal["payload"]
print(payload["verdict"])   # APROVADO / REPROVADO
print(payload["seal_id"])   # verify it at verify.html

03

reset()
get_state()
get_observation()
send(cmd)
close()

04

05

from pensenova_verify import verify_seal, fetch_jwks

jwks = fetch_jwks()                     # fetches Pensenova's public key
ok, reason = verify_seal(seal, jwks)
print("valid" if ok else f"invalid: {reason}")

pensenova-verify selo.json

06

/certifyPOST
/verify-sealGET POST
/.well-known/pensenova-jwks.jsonGET

{
  "seal_version": "pensenova-seal/1",
  "payload": {
    "seal_id":      "4e344c0255c14164a60b58942809113b",
    "verdict":      "APROVADO",   // or "REPROVADO"
    "robot_id":     "g1",
    "partner":      "...",
    "profile_hash": "...",   // fingerprint of the safety envelope
    "certified_at": "2026-09-08T19:09:24Z"
  },
  "authority_fp": "e9fb65a26b3bef20",  // kid in the JWKS
  "signature":    "..."                // Ed25519, base64
}

07