Skip to content

Physical AI agents: OWASP coverage gap for robotic/actuator systems #787

Description

@pshkv

The toolkit covers the software agent security surface well. Opening this to discuss a gap that the current seven packages don't address: physical AI agents — LLM-driven systems that actuate in the real world via ROS 2, MAVLink (drones), industrial controllers, or embedded hardware.

Why physical agents require additional governance primitives

Software agents that go wrong can be rolled back. Physical agents that go wrong cause irreversible harm — a drone that arms without authorization, a robot arm that exceeds safe velocity near a human, a welding robot that actuates without human sign-off.

The OWASP Agentic Top 10 framework covers these conceptually but the enforcement mechanism is different:

OWASP Category Software agent Physical agent
Tool Misuse (OAT-05) Block the API call Block the hardware command before it reaches the actuator
Cascading Failures (OAT-08) Rate limit HTTP calls Cap collective kinetic energy Σ(½mv²) across a drone fleet
Privilege Escalation (OAT-02) Scope check on API token Velocity/force constraint in signed capability token

Specific gaps in the current toolkit

  1. No physical constraint model — There's no equivalent of maxVelocityMps, maxForceNewtons, or geofence in the policy schema. Physical agents need these as first-class constraints, not just action allow/deny.

  2. No environment-adaptive constraints — Static policy rules can't adapt to real-time sensor state. An obstacle at 0.4m should automatically cap velocity to 0.1 m/s regardless of what the token says. This requires a plugin interface that runs on every action, not a static policy file.

  3. No tier-based irreversibility model — ARM + MISSION_START on a drone is categorically different from a sensor read. The governance layer needs to know that some actions are physically irreversible and require explicit human sign-off before execution (not audit after).

  4. No swarm collective constraints — Per-agent governance doesn't capture emergent collective risk. A fleet of individually-authorized drones can collectively exceed safe kinetic energy limits.

What we've built as a reference

SINT Protocol is an open-source physical AI authorization layer that covers exactly this surface:

  • Tier model: T0_observe → T1_prepare → T2_act → T3_commit mapped to reversibility + physical risk
  • MAVLink bridge: 15 tier rules (ARM → T3, TAKEOFF → T2, camera → T0)
  • ROS 2 bridge: topic-level capability token enforcement
  • DynamicEnvelopePlugin: min(token.maxVelocityMps, obstacle_distance × reaction_factor) per action
  • SwarmCoordinator: collective KE ceiling, minimum inter-agent distance, concurrent actor limit
  • Evidence ledger: SHA-256 hash chain with TEE attestation (SGX/TrustZone/SEV)

950 tests across 18 packages.

Proposal

Happy to collaborate on:

  1. Adding a physical agent profile to the OWASP coverage matrix
  2. A PhysicalConstraintPolicy schema extension for agent-os
  3. A reference integration between SINT's bridge-mavlink / bridge-ros2 and the AGT policy engine

Is physical AI in scope for the toolkit's roadmap? Would the team be open to an integration PR?

Activity

  1. github-actions commented on Apr 4, 2026

    @github-actions

    Welcome to the Agent Governance Toolkit! Thanks for opening your first issue.
    A maintainer will review this shortly. Check our Contributing Guide.
    For security issues, use private vulnerability reporting.

  2. github-actions commented on Apr 4, 2026

    @github-actions

    🤖 AI Agent: contributor-guide

    Hi Illia Pashkov (@pshkv), welcome to the microsoft/agent-governance-toolkit project! 🎉 We're thrilled to have you here, and thank you for opening such a thoughtful and detailed issue. It's always exciting to see first-time contributors bring fresh perspectives and expertise to the table!

    Analysis of Your Issue

    Your proposal highlights a critical and emerging area of AI governance: physical AI agents. The risks you outlined — irreversible harm, environment-adaptive constraints, and collective behavior — are indeed unique to systems that interact with the physical world. This is a fascinating and important topic, and your reference to the OWASP Agentic Top 10 framework provides a solid foundation for framing the problem.

    Based on your description, here’s how the existing packages in the toolkit might relate to your proposal:

    1. agent-os: This package seems like the most relevant starting point for your proposal. It handles the core policy engine and agent lifecycle, making it a natural fit for extending the policy schema to include physical constraints (e.g., PhysicalConstraintPolicy) and tier-based irreversibility models.

    2. agent-mesh: If your proposal involves swarm-level governance (e.g., collective kinetic energy limits, inter-agent distance), this package could be extended to support the discovery and coordination of physical agents in a trust mesh.

    3. agent-compliance: The evidence ledger you mentioned (e.g., SHA-256 hash chain with TEE attestation) aligns with this package's focus on audit logging and compliance frameworks. It could be a great place to integrate your work on evidentiary guarantees for physical agent actions.

    4. agent-sre: While not directly related to your proposal, this package might benefit from your insights into chaos testing and reliability for physical systems, especially in multi-agent swarms.

    Relevant Code and Resources

    To get started, here are some key directories and resources that might be helpful:

    • agent-os: The core policy engine is located in the /packages/agent-os directory. This is where you could explore extending the policy schema to include physical constraints.
    • agent-mesh: For swarm-level governance, check out the /packages/agent-mesh directory.
    • agent-compliance: The compliance and audit logging framework lives in the /packages/agent-compliance directory.
    • CONTRIBUTING.md: Please review our contribution guidelines to understand the process for proposing and submitting changes.
    • QUICKSTART.md: The quickstart guide will help you set up the project locally and get familiar with the codebase.
    • Code of Conduct: We value a welcoming and inclusive community. Please take a moment to review our Code of Conduct.

    Next Steps

    Here’s how you can move forward:

    1. Discuss Scope: Since this is a significant new area, it would be great to hear from the maintainers about whether physical AI governance fits into the toolkit's roadmap. You could also ask for their input on how best to structure your contributions (e.g., as extensions to existing packages or as a new package).

    2. Draft a Design Proposal: Based on the feedback from maintainers, you could draft a more detailed design document outlining the proposed changes. This could include:

      • A PhysicalConstraintPolicy schema for agent-os
      • A high-level architecture for integrating SINT's bridge-mavlink and bridge-ros2
      • A plan for implementing swarm-level governance in agent-mesh
      • Any additional test cases or compliance requirements
    3. Start Small: Consider starting with a smaller, self-contained PR — for example, adding a basic PhysicalConstraintPolicy schema to agent-os. This will help you get familiar with the contribution process and gather early feedback from the maintainers.

    4. Engage with the Community: Feel free to ask questions, share updates, or seek feedback in this issue or on the project's discussion forums (if available). Collaboration is key!

    We’re excited about the potential of your proposal and the expertise you bring to the table. Let us know how we can support you in moving this forward. 🚀

  3. imran-siddique commented on Apr 5, 2026

    @imran-siddique
    Collaborator

    Interesting gap analysis. Our current OWASP coverage focuses on software agents — physical AI (robotic actuators, sensor fusion, motor control) introduces unique governance requirements around safety boundaries, latency constraints, and hardware-software trust chains.

    We'd welcome a contribution exploring how AGT's policy engine could be extended for physical agent governance. The kill switch and real-time SLO monitoring in agent-sre are the closest existing primitives. Also see #748 (nono sandboxing) which addresses OS-level isolation for edge deployments.

    Labeling as enhancement.

  4. zeel2104 commented on Apr 5, 2026

    @zeel2104
    Contributor

    Is it open for contribution?

  5. imran-siddique commented on Apr 6, 2026

    @imran-siddique
    Collaborator

    Yes, contributions are welcome! This is a feature request — feel free to open a PR with your proposed approach. Please review CONTRIBUTING.md for guidelines.

  6. zeel2104 commented on Apr 6, 2026

    @zeel2104
    Contributor

    Got it. Thanks

  7. imran-siddique commented on Apr 8, 2026

    @imran-siddique
    Collaborator

    Interesting research direction! Physical AI agents (robotic/actuator systems) do represent a genuine OWASP coverage gap — our current threat model assumes software-only agents.

    This would be a significant scope expansion. For now, labeling as enhancement for future consideration. If you'd like to contribute a threat model document for physical AI agent governance, that would be a great starting point for the discussion.

  8. pshkv commented on Apr 10, 2026

    @pshkv
    Author

    Update on the SINT side since opening this — relevant to the physical AI governance gap.

    Since this issue was filed:

    Specifically relevant to the physical AI governance gaps flagged above:

    The DynamicEnvelopePlugin and SwarmCoordinator are stable now. The maxVelocityMps and maxForceNewtons physical constraints are enforced inline in gateway.intercept() — not as post-audit filters. The SintHardwareSafetyContext struct (permitState, interlockState, estopState) flows from the IoT/ROS2 bridges into the gateway's hardware safety handshake.

    The OWASP fixture pack includes physical-context cases (ASI09 with humanDetected: true forcing tier escalation) that AGT could adapt for its own physical agent coverage.

    On the collaboration offer: still open. A PhysicalConstraintPolicy schema extension and a reference SINT ↔ AGT integration bridge are the two highest-value touchpoints. The shared fixture format could be a starting point — our JSON schema is MIT-licensed and designed to be implementation-agnostic.

  9. aeoess commented on Apr 15, 2026

    @aeoess
    Contributor

    Illia Pashkov (@pshkv), big update. The hardware safety conformance KPIs (sub-10ms ROS2 inline, sub-40ms permit handshake, sub-20ms e-stop) are the kind of latency targets that put physical-AI governance in production-credible territory rather than theoretical-only.

    APS doesn't ship hardware safety primitives directly, and won't. That's SINT's lane and you've shipped it. Where APS composes cleanly with what you've built:

    Constitutional gate above SINT's hardware safety enforcement. APS's HumanEscalationFlag (shipped Apr 14 in v1.42.0, now in v1.43.0) gates per-action-class owner confirmation with three scope modes: per_action, per_session, time_window. For physical actuators, the per-action-class registration would name something like class: actuator_irreversible (welding strike, drone arm, robot-arm-near-human, valve-open-irreversibly), and the flag forces owner confirmation regardless of what the delegation chain otherwise allows. This sits above the SINT physical constraint check rather than replacing it: SINT enforces velocity/force/geofence inline; APS enforces "no actuation in this class without human signature" at action-time.

    Values Floor for irreversible-action prohibitions. APS's Values Floor carries immutable principles attached to a charter. The principle "no actuation that violates verified human safety state" is the kind of thing that belongs there, signed by the charter founders, attested by every agent operating under the charter. A floor violation fails before policy evaluation. SINT's SintHardwareSafetyContext (permitState, interlockState, estopState) becomes the input to floor evaluation: if humanDetected: true and the requested action class is in the floor-prohibited set, the action fails at the floor layer regardless of what the policy or delegation otherwise permits.

    On the joint contribution targets you named:

    • PhysicalConstraintPolicy schema extension: SINT owns the schema. APS could contribute the constitutional layer above it (HumanEscalationFlag + Values Floor evaluation as separate schema objects that compose with PhysicalConstraintPolicy rather than nest inside it). Two-layer composition rather than one schema doing both.
    • Reference SINT ↔ AGT integration bridge: APS could land in this picture as the constitutional and delegation layer between SINT (physical enforcement) and AGT (policy enforcement). Three-system layered: AGT GovernanceGate clears the action policy-wise → APS resolves the delegation chain and constitutional gates → SINT enforces hardware safety inline. Each layer's failure produces a distinct denial code. Each layer's success embeds in the receipt the next layer issues.

    Shared fixture format. APS just shipped fixtures/aps/v1/ to haroldmalikfrimpong-ops/agentid-aps-interop (PR #4) using the convention from TJF (@tomjwxf)'s PR #2 in the same repo. JSON fixtures, RFC 8032 deterministic keypairs for reproducibility, standalone verifier with zero deps, honest interop-gate self-assessment in the README. Same shape works for physical-context cases. If you want to mirror the SINT OWASP ASI conformance fixture pack into the same repo's fixtures/sint/v1/ directory, the layout convention is already established.

    Imran Siddique (@imran-siddique), happy to fold this into the AGT side as part of the AGT #850 / #934 / #1157 cluster of integration touchpoints if you're staging a "compose with peer protocols" set of ADRs.

  10. 1 remaining item

  11. tomjwxf commented on Apr 16, 2026

    @tomjwxf
    Contributor

    Quick update: PR #1168 (physical attestation governed example with 8 cold chain sensor scenarios) was merged today. It demonstrates the receipt format from #667/#1159 extending to physical sensor readings without any protocol changes.

    The example simulates a wine shipment from Barossa Valley to Tokyo with temperature excursions, shock events, and tamper detection. Same receipt envelope, same verifier, same chain structure as the software agent examples.

    Illia Pashkov (@pshkv), if there's interest in a joint example combining SINT's physical constraint enforcement (DynamicEnvelopePlugin, maxVelocityMps/maxForceNewtons) with ScopeBlind's receipt signing, happy to build one. The two layers compose naturally: SINT enforces the physical constraint, ScopeBlind signs the enforcement decision into a verifiable receipt.

  12. aeoess commented on Apr 18, 2026

    @aeoess
    Contributor

    This is the right composition and worth building. Adding a third layer would make the example complete as a reference for physical-AI audit trails:

    1. SINT (Illia Pashkov (@pshkv)) enforces the physical constraint (maxVelocityMps, maxForceNewtons, DynamicEnvelopePlugin). The constraint check either passes or refuses.
    2. ScopeBlind (TJF (@tomjwxf)) signs the enforcement decision into a verifiable receipt. Now the decision is non-repudiable.
    3. APS wraps the receipt with delegation-chain context — which principal (owner, operator) authorized this actuator scope, what the authority boundary was, whether the action stayed within it. The full chain-of-custody from human intent to physical effect becomes reconstructable.

    The wine shipment example from PR #1168 extends naturally: temperature excursion detected → SINT constraint check triggers a refusal → ScopeBlind signs the refusal with sensor evidence → APS delegation chain shows the operator's authority to make refusal decisions under the shipper's delegation. Auditor replaying the chain can answer not just "was the constraint enforced" but "who had the authority to enforce it, against which principal's delegation."

    If there's interest in a three-way joint example, APS can produce the delegation chain + principal identity wrapper side and wire the three signed artifacts into a single verifiable envelope. Happy to prototype against whatever physical scenario pshkv/tomjwxf pick.

    Imran Siddique (@imran-siddique) — the "physical/robotic dimensions beyond software agent taxonomies" gap you flagged earlier is exactly where this composition lands. Not a new risk model, but an audit trail format that covers the physical layer as a first-class primitive rather than retrofitting software-agent receipts.

  13. tomjwxf commented on Apr 18, 2026

    @tomjwxf
    Contributor

    Tymofii Pidlisnyi (@aeoess) +1 on the three-way composition, the split is clean and each layer handles a concern the others can't. Ready to build the ScopeBlind side against whatever physical scenario Illia Pashkov (@pshkv) picks.

    What I'd contribute for the worked example:

    • Receipt-signing wrapper around SINT's constraint-check output. When SINT's DynamicEnvelopePlugin produces a refusal (e.g., obstacle at 0.4m caps velocity below the token's maxVelocityMps), ScopeBlind signs a decision receipt for that refusal with SINT as the policy-evaluation source. Signer identity is separate from the agent runtime, same pattern as the cold-chain example merged in feat(examples): physical-attestation-governed — cold chain sensor receipts #1168 but with SINT as the sensor-side authority.
    • Chain linkage across physical + software receipts. The wine shipment example at examples/physical-attestation-governed/ already uses the parent_receipt_hash field to chain across sensor readings. Same chain primitive extends to SINT constraint refusals: each refusal receipt chains to the previous one, giving auditors a single chain covering the entire MicroVM run.
    • Cross-verification in the three-way example. Whatever signer key Illia Pashkov (@pshkv)'s SINT side uses, the receipt should verify at exit 0 against npx @veritasacta/verify, the same verifier the software examples use. This closes the loop that the format is not software-specific; physical-AI refusal evidence rides the same envelope as software-AI tool-call evidence.

    On the APS delegation wrapper you proposed. The third layer is exactly the piece that makes the chain interpretable in a multi-principal setting. For the wine shipment: the shipper delegates authority to the operator's cold-chain monitoring, which delegates to the SINT-enforced actuator, which signs constraint refusals. Without the delegation wrapper, an auditor sees a refusal signed by the device but can't confirm the device's authority to refuse (who delegated it that right?). With the wrapper, the chain resolves to a principal the shipper recognizes.

    Concrete scope proposal. Pick a physical scenario where all three layers land:

    1. Wine-shipment refusal on temperature excursion (extends feat(examples): physical-attestation-governed — cold chain sensor receipts #1168). Temperature sensor detects 22.4°C above 18°C limit. SINT constraint check refuses shipment release. ScopeBlind signs the refusal receipt. APS delegation chain shows the cold-chain operator's authority to refuse under the shipper's delegation. Three signatures, one chain, verifiable end-to-end.
    2. Drone arm refusal on collective kinetic energy (new). Three drones in a fleet, each individually within its token's maxVelocityMps. SINT SwarmCoordinator computes collective KE exceeds the fleet ceiling. SINT refuses ARM on one drone. ScopeBlind signs the refusal. APS delegation chain shows the swarm operator's authority to refuse under the mission owner's delegation.
    3. Welding-robot refusal on human-detected proximity (new, most compelling for OWASP ASI09). Vision system detects a human at 0.4m. SINT Physical HumanEscalationFlag fires, refuses actuation. ScopeBlind signs the refusal. APS delegation shows the safety officer's authority granted by the plant operator's delegation.

    Each of these exercises a different invariant (thermal, kinetic, proximity). The wine shipment is simplest and compatible with what's already merged. The welding-robot case is the most compelling for the OWASP physical-AI taxonomy gap Illia Pashkov (@pshkv) flagged originally.

    Illia Pashkov (@pshkv) which would you prefer? I can start with wine-shipment (shortest path, builds on merged code) unless you want to aim at one of the other two.

    On the cross-reference into tutorial material: microsoft/agent-governance-toolkit#1197 (Tutorial 33) now has a sidebar distinguishing operator-signed vs authority-chain-referenced receipts. The three-way composition fits the authority-chain-referenced mode naturally; the tutorial can link out to this example once built.

  14. pshkv commented on Apr 18, 2026

    @pshkv
    Author

    Wine-shipment refusal is the best first integration: it extends the already-merged example surface, and it exercises the exact invariant the toolkit can validate end-to-end (temperature excursion -> refusal -> receipt chain) without introducing extra simulation dependencies.

    Preference: start with the wine-shipment scenario, then follow with welding-robot proximity as the next most compelling physical safety case.

    Concrete next step I can take on my side: ship a minimal SINT-side “refusal receipt” artifact for the temperature excursion event that:

    • includes a stable action_ref
    • links via parent_receipt_hash
    • is verifiable by the existing verifier (npx @veritasacta/verify) as you described

    If you point me at the exact example folder / receipt schema you want to extend (sounds like examples/physical-attestation-governed/ + the receipt_v0_1 conventions), I’ll align the fields and keep the diff tight.

  15. tomjwxf commented on Apr 18, 2026

    @tomjwxf
    Contributor

    Illia Pashkov (@pshkv) wine-shipment is the right first integration for the same reason you gave (extends merged surface, no extra simulation dependencies). Aligning on shape so your diff can stay tight:

    Target folder: examples/physical-attestation-governed/ from PR #1168.

    Current file layout you are extending:

    examples/physical-attestation-governed/
    ├── README.md
    ├── getting_started.py      # current: sensor reading → policy → receipt
    └── policies/
        └── cold-chain-policy.yaml
    

    Proposed additions for the SINT-refusal scenario (your diff):

    examples/physical-attestation-governed/
    ├── README.md                                          # (update to name the three-way composition)
    ├── getting_started.py                                 # (unchanged)
    ├── sint_refusal_receipt.py                            # (new, your file) — minimal SINT-side refusal emitter
    ├── policies/
    │   ├── cold-chain-policy.yaml                         # (unchanged)
    │   └── sint-physical-constraint.yaml                  # (new) — maxTempC, geofence, etc.
    └── examples_output/
        └── wine-shipment-refusal-chain.jsonl              # (new) — example chain output
    

    Receipt payload schema to target (from merged getting_started.py:283, so your SINT refusal receipt slots into the same chain):

    payload = {
        "type": "scopeblind:physical_attestation",         # keep this exact string for chain compatibility
        "spec": "draft-farley-acta-signed-receipts-01",
        "device_id": "sint-refusal-gateway-001",           # your SINT gateway identity
        "sensor_reading": { ... },                          # the temperature reading that triggered refusal
        "location_label": "Barossa Valley → Tokyo, leg 3",
        "decision": "refuse",                               # was "allow" in original; "refuse" for SINT refusal
        "policy_id": "sint:physical-constraint:cold-chain-v1",
        "policy_reason": "temperature excursion 22.4C exceeds maxTempC=18C",
        "issued_at": "2026-04-18T...",                      # RFC 3339 UTC
        "issuer_id": "sint:gateway:<your-id>",              # SINT gateway signer identity (distinct from sensor)
        "sequence": <N>,                                    # monotonic within session
        "previousReceiptHash": "sha256:<hex>",              # SHA-256 of previous receipt's JCS canonical form
        "hardware": { ... },                                # same shape as existing; add SINT-specific entries
    
        # New fields specific to SINT refusal context:
        "physical_constraint": {
            "kind": "temperature_excursion",                 # or velocity / force / geofence / proximity
            "limit": { "maxTempC": 18 },
            "observed": { "temperatureC": 22.4 },
            "sint_plugin": "DynamicEnvelopePlugin"
        },
        "action_ref": {                                     # your stable reference back to the SINT action
            "ref_type": "sint:action",
            "uri": "sint://bridge-iot/temperature-sensor-42/reading-2026-04-18T12:34:56Z"
        }
    }

    Three boundaries to respect:

    1. type stays scopeblind:physical_attestation. That is how the chain links to the cold-chain sensor receipts merged in feat(examples): physical-attestation-governed — cold chain sensor receipts #1168. Changing it breaks chain continuity.
    2. previousReceiptHash is mandatory for sequence ≥ 2 and is the SHA-256 of the previous receipt's JCS-canonical payload (RFC 8785), not of the full envelope. The _jcs_canonicalize helper in getting_started.py:47 is the reference implementation.
    3. issuer_id distinguishes the signer. For SINT refusals, use a SINT-namespaced issuer string (e.g. sint:gateway:<id>) so auditors can see which layer produced which receipt when the chain has mixed sources (sensor readings signed by sensor, refusals signed by SINT gateway).

    On signing algorithm. The merged example uses HMAC-SHA256 as a demo signer (HS256-DEMO). The production path is Ed25519 + JCS, and npx @veritasacta/verify expects that. For your SINT refusal receipt:

    • If your SINT gateway already signs with Ed25519, use that directly. Keep signature.alg = "EdDSA".
    • If your SINT gateway signs with something else, the cleanest interim path is a sibling-signature pattern (primary algorithm + Ed25519 sibling over the same canonical payload), same shape @AlexanderLawson17 used for Revettr. @veritasacta/verify then exits 0 on the Ed25519 sibling without verifier-side changes.

    What I will contribute on the ScopeBlind side in parallel:

    • A reference sint_refusal_receipt.py skeleton matching the schema above, so your diff has a starting point rather than needing to reimplement JCS from scratch. Can push to a ScopeBlind-side fork branch and let you review before the PR against AGT lands.
    • Confirmation that sample refusal receipts verify at exit 0 via npx @veritasacta/verify locally before you open the AGT PR. Interop-gate-green before the maintainers see it.
    • An updated chain integrity test in the existing getting_started.py --smoke path that walks both the sensor readings and the SINT refusal receipts to confirm previousReceiptHash linkage holds across the mixed chain.

    Timing. I can have the skeleton + verifier-round-trip ready within 24-48 hours. You drive the SINT-side authoritative generator; I wire the ScopeBlind receipt envelope and the AGT chain-continuity test. Tymofii Pidlisnyi (@aeoess) picks up the APS delegation wrapper in parallel (a third commit, same PR or sibling PR).

    On the action_ref field: the ref_type + uri shape above matches what the in-toto Decision Receipt predicate PR uses for cross-attestation linkage. That gives the three-way composition (SINT + ScopeBlind + APS) a stable join key when downstream consumers want to fetch related artifacts. Not required for v1; worth adopting if you have no other ref convention yet.

    Standing by for your SINT-side skeleton. If any of the schema above is awkward for your code path, name the awkwardness and we can adjust before you start writing.

  16. aeoess commented on Apr 18, 2026

    @aeoess
    Contributor

    Illia Pashkov (@pshkv) TJF (@tomjwxf), wine-shipment-refusal-chain as the first artifact aligns with what APS can contribute without introducing extra dependencies.

    APS-side addition to the proposed layout:

    examples/physical-attestation-governed/
    ├── ...
    ├── aps_delegation_wrapper.py                          # (new), APS delegation check before SINT evaluation
    ├── policies/
    │   └── aps-delegation-constraint.yaml                 # (new), maxTempC mapping to delegation scope narrowing
    └── examples_output/
        ├── wine-shipment-refusal-chain.jsonl              # SINT refusal chain
        └── wine-shipment-delegation-chain.jsonl          # APS delegation chain (shows what was allowed before refusal)
    

    What the APS layer adds to the chain: Before SINT evaluates the physical constraint, the agent's operation request goes through verifyDelegation() against a scoped token whose maxTempC and geofence fields are explicitly narrowed from the parent delegation. SINT's refusal (temperature excursion) then produces a receipt whose parent_receipt_hash points to the APS delegation record, not just to the prior sensor reading. The auditor can trace: delegation granted with bounded physical constraints → constraint violated → refusal signed → receipt chained back to the original delegation.

    Receipt shape alignment: APS's v2 governance_attestation receipt shape has an attested_action_ref field and a parent_receipt_hash field. If SINT's refusal receipt uses the same parent_receipt_hash convention (as tomjwxf described), the chain is continuous: APS delegation → SINT constraint decision → ScopeBlind-signed refusal → verifiable end-to-end.

    Verification flow:

    1. apsVerify(delegation) → exit 0 (delegation was valid at time of refusal)
    2. npx @veritasacta/verify <refusal-chain.jsonl> → exit 0 (each receipt verifies + chain is intact)
    3. apsVerify(chain-root) → exit 0 (root hash of the chain is itself attested in the parent APS receipt)

    Happy to ship aps_delegation_wrapper.py and the YAML constraint as a PR against the same directory once your diff lands, so the three-layer composition is in-tree and reproducible from a single clone.

    Context note: SDK v2.0.0-beta.0 is on npm @next as of an hour ago (release notes agent-passport-system/agent-passport-system#16). The delegation-wrapper primitives used here are byte-identical to v1.46.0, so pinning either version produces the same chain output.

  17. tomjwxf commented on Apr 18, 2026

    @tomjwxf
    Contributor

    Illia Pashkov (@pshkv) skeleton ready for your SINT-side work to plug into. Ahead of schedule (promised 24-48h, this took an evening once the canonical form was nailed).

    What's in the skeleton:

    examples/physical-attestation-governed/sint_refusal_receipt.py — minimal Ed25519-signed SINT refusal emitter that:

    • Chains onto an upstream cold-chain reading receipt via previousReceiptHash (SHA-256 of the prior payload, JCS-canonical)
    • Produces a v2-envelope receipt @veritasacta/verify accepts natively (no verifier changes needed)
    • Uses distinct issuer keys per layer: scopeblind:seal:SB-SEAL-001 for the sensor, sint:gateway:refusal-gateway-001 for the gateway refusal — auditors can filter by issuer_id without introspecting payload
    • Deterministic (seeded key derivation + fixed timestamps) so fixtures are byte-reproducible

    examples/physical-attestation-governed/policies/sint-physical-constraint.yaml — the declarative constraint envelope. Covers temperature, geofence, shock, and human-proximity (with the DynamicEnvelopePlugin mapping you pointed at). Cedar-compatible rules noted inline so the future cedar-engine integration is a drop-in.

    examples/physical-attestation-governed/examples_output/wine-shipment-refusal-chain.bundle.json — reference output: 2-receipt chain (upstream reading + SINT refusal).

    Verifier round-trip, exit-0 gate-green:

    $ npx @veritasacta/verify wine-shipment-refusal-chain.bundle.json --bundle
    ✓ Bundle: VALID
      Total: 2  Passed: 2  Failed: 0
    
    # Tamper test: flip decision "refuse" -> "allow" in-place and re-verify
    $ npx @veritasacta/verify wine-shipment-refusal-chain.TAMPERED.bundle.json --bundle
    ✗ Bundle: INVALID
      Total: 2  Passed: 1  Failed: 1
      Errors: • Receipt 2: invalid_signature
    # exit 1
    

    Three things worth flagging for your SINT-side code:

    1. v2 envelope, signature over envelope-minus-signature. The original merged getting_started.py uses HS256-DEMO and signs only the payload — that's demo-only and does not verify via @veritasacta/verify. The production path signs the whole envelope (minus signature field), JCS-canonicalized, Ed25519. I followed the @veritasacta/artifacts reference implementation exactly. If your SINT runtime already emits a different shape (e.g. the Revettr-style {provider, subject, attestation, jws, sibling} wrapper AlexanderLawson17 is using), the cleanest path is a standalone v2 receipt alongside the full envelope — the verifier then exits 0 on the standalone without any wrapper-shape changes.

    2. RFC 8785 number serialization is load-bearing. Python's default json.dumps preserves trailing .0 on whole-number floats (38.0 stays "38.0"), but JS JSON.stringify strips it ("38"). If your SINT code emits floats, you need to collapse whole-number floats to integers before canonicalizing, or use an rfc8785 library. I added a one-function normalization helper inline (_normalize_numbers) so the demo needs only pynacl, no rfc8785 dep — worth copying or replacing with rfc8785 depending on your preference.

    3. Key derivation is seeded for fixture reproducibility, not for production. In a real SINT deployment the gateway key lives on an HSM or secure element — the derive_key() helper here is purely to make the example's receipts byte-identical across runs. Replace with your actual gateway key handling when wiring to the live SINT runtime.

    What this leaves for your diff:

    • Swap build_upstream_cold_chain_receipt() for your live SINT→upstream-receipt adapter (your gateway reads the real sensor receipt from the bridge-iot message path; my stub is just reading build(deps-dev): Bump underscore from 1.13.7 to 1.13.8 in /packages/agent-os/extensions/cursor #5 from the merged journey).
    • Wire build_sint_refusal_receipt() into the DynamicEnvelopePlugin.evaluate() path, so a refusal decision emits a receipt in-line with the plugin return value.
    • Replace the seeded SINT_GATEWAY_KEY with the gateway's real signing key.
    • (Optional) Add more constraint kinds beyond temperature_excursion — geofence_breach, shock_excursion, human_proximity are all scaffolded in the YAML policy.

    Tymofii Pidlisnyi (@aeoess) the external_receipts.aps slot convention from VeritasActa/verify#2 applies here too — an APS DecisionLineageReceipt for the delegation that authorized the wine-shipment release would chain cleanly into this bundle under the same ku_id-equivalent key. If you want to drop aps_delegation_wrapper.py into the same folder, the receipt envelope shape is compatible and the bundle's verification.signing_keys array takes your JWK without schema changes.

    Standing by on your SINT-side runtime integration. Happy to PR the skeleton into the AGT repo as a follow-up to #1168 once you confirm the shape works for your evaluation path — or you can absorb it into your own branch, whichever is cleaner for the MSFT review.

  18. aeoess commented on Apr 18, 2026

    @aeoess
    Contributor

    The skeleton is solid. Two-receipt chain with distinct issuer keys per layer (scopeblind:seal:SB-SEAL-001 for the sensor, sint:gateway:refusal-gateway-001 for the gateway refusal) is the right design — auditors can filter by issuer_id without introspecting payload, and the per-layer key rotation story stays clean.

    For the APS-side composition slot: the sint:gateway:refusal-gateway-001 layer is where an APS governance_attestation would naturally bind. The SINT gateway holds the enforcement capability; the APS attestation binds that enforcement capability to the upstream delegation chain (who authorized this SINT gateway to refuse on this principal's behalf, under what scope, with what skill_creation or actuator_class axes). That's the three-layer composition the APS-SINT-MCP handshake spec (now shipped at docs/specs/aps-sint-handshake-v1.md per sint-ai/sint-protocol#109) formalizes.

    Concrete: an APS Governance Attestation receipt chained into the upstream position in this bundle (before the cold-chain reading) would close the "authority to refuse" question. The bundle becomes a three-receipt chain (APS governance attestation → cold-chain reading → SINT refusal), each Ed25519-signed, each chaining via previousReceiptHash, each with a distinct issuer key. Happy to draft that third receipt as a drop-in once the SINT-side integration lands and the fixture has a stable shape. Flagging as available for pshkv's next iteration.

    Illia Pashkov (@pshkv) — the two-evening turnaround on this is impressive and the receipt shape maps cleanly to the SINT v2 physical constraint work you're doing elsewhere. The skeleton plus the AAIF submission tracking on sint-ai/sint-protocol#130 gives the three-vendor governance_attestation story (APS + SINT + MolTrust) a concrete physical-AI worked example to cite. Worth including this bundle as an evidence pointer in the AAIF submission packet.

  19. tomjwxf commented on Apr 19, 2026

    @tomjwxf
    Contributor

    Strong framing. The four gaps you identified (physical constraint model, environment-adaptive constraints, irreversibility tier system, swarm collective constraints) map cleanly onto work already underway in AGT-adjacent repos:

    • examples/physical-attestation-governed/ (feat(examples): physical-attestation-governed — cold chain sensor receipts #1168, merged) shows the decision-receipt half of this: a simulated cold-chain sensor emits Ed25519-signed readings that a governance policy evaluates and signs as a decision.
    • aeoess/agent-governance-vocabulary#34 (currently in review, signing it off shortly) introduces physical_environment_state as a canonical context dimension with explicit replay-class semantics for sensor-attested values.
    • SINT Protocol is cited in your issue as the reference execution layer for MAVLink / ROS 2 bridges.

    Proposing a three-piece contribution if the scope suits the maintainers:

    1. Tutorial 34: Physical Agent Attestation. Demonstrates sensor-derived policy context using ATECC608B and SE050 reference hardware examples. Pairs with Tutorial 33 (decision receipts) as the hardware-anchored variant. Would cover arming-tier decisions emitting verifiable receipts before execution rather than post-hoc audit.

    2. PhysicalConstraintPolicy Cedar schema extension. Velocity, force, geofence as first-class policy inputs rather than free-form attributes. Lives in packages/agent-hypervisor/. Interoperates with AGT's existing Cedar evaluator without modification.

    3. Irreversibility tier specification. Formalized as either an ADR or a proposal doc depending on maintainer preference. Distinguishes pre-action authorization (human-in-the-loop for Tier-4 actions like arming/movement) from post-action audit (Tier-1/2 logging-sufficient decisions), with the dividing line written into policy rather than each operator's convention.

    Illia Pashkov (@pshkv), happy to coordinate with the SINT side so the two codebases converge on shared policy schema rather than diverging. You're already collaborating on the vocabulary work; a natural next step might be a joint ADR or proposal covering both the PhysicalConstraintPolicy schema on AGT's side and the MAVLink/ROS 2 execution bridge SINT defines. That lets each codebase own its layer (policy vs execution) while the contract between them is written once.

    Happy to wait for maintainer feedback on scope before opening PRs. Cc Imran Siddique (@imran-siddique) for scoping input.

  20. imran-siddique commented on Apr 22, 2026

    @imran-siddique
    Collaborator

    Good news — we shipped a physical attestation example: \�xamples/physical-attestation-governed/\ with a cold-chain sensor scenario. It demonstrates AGT governance for physical agent actions (temperature monitoring, actuator controls).

    The OWASP coverage gap for robotics/actuator systems is real — our current mapping focuses on digital agents. We'd welcome a contributed mapping document under \docs/compliance/\ that extends the OWASP coverage to physical systems.

    Keeping open for the compliance mapping contribution.

  21. imran-siddique commented on Apr 26, 2026

    @imran-siddique
    Collaborator

    Good progress here. The physical attestation governed example (examples/physical-attestation-governed/) shipped and demonstrates AGT governance for physical agent actions. The OWASP compliance mapping for physical systems is a welcome contribution as a docs PR under docs/compliance/ if anyone wants to pick it up. Closing this out. Thanks Illia Pashkov (@pshkv) for raising the physical agent gap and the detailed SINT Protocol reference.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

enhancementNew feature or request

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions