← digital2win.ai
Digital2Win·Results note ·Runs 14 August and 2 September 2026 ·published 2 September 2026

The last hop

What it takes to get an AI agent's command safely onto a real machine — and what happens when nobody authorises it

An independent test report published in April concluded that the transport carrying today's AI-agent traffic could be replaced without touching the protocols above it — “keep the protocols, change the plumbing.” We tested that on a working system that operates real equipment. It holds. This is what it cost, and the four things worth acting on.

What we did

We run an AI agent that can operate physical equipment through a set of controlled tools. Until 14 August it reached those tools the ordinary way: over the public internet, through an address anyone can find by scanning. We replaced that path with atSign's transport, where neither end opens a port and the network carrying the traffic cannot read it.

Then we re-ran the safety test that decides whether the agent may move a machine — same test, same credential, recorded four days earlier over the old path.

What happened

Nothing above or below the change noticed. The reply came back identical to the byte, and the safety test gave the same answer word for word.

THE LAST HOP a person AI agent authorisation the machine asks decides commands NEMOCLAW ALONE the box NVIDIA sandbox confines the agent to its host nothing crosses Atelier the box NVIDIA sandbox no open port · nothing readable in the middle atSign transport carries a person's intent to a machine — decides which commands may run, and records them
What each layer reaches. NVIDIA's sandbox hardens the box the agent runs in. atSign's transport hardens the wire between the parties. Neither decides whether a particular command, from a particular identity, may reach a particular machine — so on their own, nothing crosses the last hop. Atelier is the layer they sit inside: it runs the length of the chain, from the person who asks to the machine that acts, and is the only one that gets there. The swap described above is what let the transport band exist without opening a port: it cost 610 milliseconds and changed nothing else.
The reply identical Same content, to the byte, over both paths.
The cost +610 ms Fine for an agent deciding what to do. Never in the loop that keeps a machine safe.
The safety test unchanged Permission to move the machine refused; the emergency stop still allowed.

Every figure here came from a scripted run that can be re-executed on request — including by you, on your own hardware, before you believe any of it.

How a command is authorised

Humanoperator AI agent YubiKey WebAuthnverifier (RP) atSign PolicyManager Station-sideatSign signer MQTTbroker Robot-celledge verifier Robot Mission Runrecord Deny by default — nothing below runs without a fresh human tap 1 PROPOSE action — scope, target, TTL 2 Challenge bound to THIS action 3 Physical tap — user-presence gesture 4 ES256 assertion 5 Verify assertion, challenge, origin, signCount ALT · TAP OK 6 createUserGroup time-boxed reachability grant — transport only: which atSign may open which host and port 7 ~1 s atSign's figure — unmeasured by us 8 Scoped, time-limited authorization 9 Sign command payload RSA-SHA256 10 publish 11 QoS store-and-forward 12 Verify signature against the sender's public key on their atServer, then check the allow-list ALT · VERIFIED 13 Actuate 14 Completion record — authenticated sender, hash-chained ELSE · VERIFICATION FAILS Refuse — denial record with reason code and signer 16 deleteUserGroup revoked after the action — a fresh tap per action, approval never accumulates ELSE · NO TAP, TIMEOUT OR BAD ASSERTION 17 DENIED — denial record with reason code Fail closed — no grant, so the control path never becomes reachable E-STOP and Stop are NEVER gated
How one command is authorised. The layer diagram above says which company's technology covers which span; this says what happens to a single instruction. The agent may propose, and nothing else. A challenge bound to that specific action is put in front of a human, and only a physical tap — a gesture an agent is structurally incapable of performing — creates a time-boxed grant. The grant is revoked when the action completes, so approval never accumulates. Every branch writes a record, including both refusal paths, because a refusal nobody can evidence is worth little to an auditor. ⚠ This diagram is the design of the authorisation path. On 14 August it was exercised with the equipment link simulated, not on the end of it. It was driven end to end, onto the machine, on 2 September — that run is the next section.

Two signatures, two different jobs — and this is the distinction most often collapsed. The diagram shows both, because neither can do the other's work.

 proveslivesscope
WebAuthn
key or phone
a human was physically here, for this action, now on the authenticator bound to one origin; anonymous by design; deliberately not a general signing oracle
atSign who — checkable against a published public key the .atKeys file, held by the local signer durable, publishable, independent of the browser session that produced it

⚠ atSign is not a token-issuing authorisation server, and reading it as one is the most common mistake made about this architecture. There is no central grant and no “approve command” verdict anywhere in the chain: verification happens at the receiver, against a public key the sender published. The signing plane is never the actuation path.

Both branches were exercised, and the refusal branch is the one that matters. With no tap there is no grant, no signed envelope and nothing for the cell to verify — so the machine stays still. That is not an absence of evidence. It is the outcome the whole construction exists to produce, and it is the branch an attacker has to beat. A deny-by-default system is proven by what it declines to do.

The stack on the other side of that decision drives real hardware today. The same tool surface walks an untethered quadruped over Bluetooth and reads live sensor data back on the same link — no tether, no third-party runtime in the path. The August run stopped at the equipment boundary because that is where the measurement stopped being about the transport. Three weeks later we closed that gap, and it is the next section.

Onto the machine — 2 September

The chain above, driven end to end: a human authorised one action, the payload was signed, and the quadruped moved — under a single sealed record. Then we withheld the authorisation and it did not.

The August run measured the transport and the decision. This one joined them to the equipment. One run identifier covers the authorisation, the signature and four actuated steps; the seal's hash is the head of the event chain it closes over, and the chain verifies. We then ran the same mission again and did not authorise it. No grant was issued, no envelope was signed, the cell had nothing to verify, and the machine stayed still — sealed and verified like any other run.

Both branches on the machine. The security key is pressed and the quadruped moves. The key is not pressed and, after 15 seconds, Atelier shows Refused. Presence denied. — and nothing moves.
The chain
one record
Authorisation, signature and four actuated steps under one run identifier, not two records stitched together afterwards.
The refusal
0 of 4 steps
No authorisation, so no grant, no envelope, nothing to verify. The denial carries a reason code and names the device that was asked.
The authenticator
either one
A hardware security key and a passkey on an ordinary phone. Same mission, same chain, same signer.
A security key a personat the laptop touch the keyUSB or NFC the gate transports · usb, nfc signature counter · yes biometric · no — a touch, not an identity check bound to the device it lives in A phone you already own a personat the laptop unlock their phoneholds the passkey nearby the gate transports · hybrid (Bluetooth proximity) signature counter · none biometric · yes — the person was verified may be synced across their account Identical from here time-boxed grant → signed envelope → verified at the robot cell → the machine moves → one sealed record and the record says which of the two answered
Only the front door differs. The gate does not care which device answers, and everything downstream of the decision is byte-for-byte the same construction. That matters commercially more than it matters technically: adoption does not have to wait on a hardware purchase. An operator who already carries a phone can be authorising physical actions this afternoon, and a deployment can add hardware keys later for the actions that warrant them, without rebuilding anything.

Neither device is simply better, and the record says which one answered

First, what changed and what did not: the phone replaced the security key, not the identity that signs. Both runs were signed by the same atSign. Presence and provenance are separate jobs, as the table above sets out, and only the presence half had a choice of device.

We intended to run this with a hardware key. On the day it would not enumerate — the fault was a charge-only adapter, which produces no error anywhere — so the first run was authorised by a phone instead. We then found the adapter and ran it again, unchanged, with the key. Two runs differing in one variable is a better result than the one we set out to get.

The hardware key carried a real signature counter, so a replayed assertion can be detected — but it proved only that someone touched it. The phone carried a verified biometric and no counter at all, and a phone passkey may be synced across a vendor's account, so it is not bound to one device the way a key is. Each is stronger where the other is weaker.

So the authenticator is a policy question, not a hardware one. What a deployment should decide is which class of device a given class of action requires — routine supervision and a high-consequence actuation are not the same ask. Every authorisation record carries what answered and how, so such a rule has something to rest on. ⚠ We have not built that rule, and we are not claiming it.

Choosing between them. The action decides the authenticator; where the work happens is a constraint on top, not the reason. ⚠ This is how we would advise choosing — it is reasoning from the two runs above, not a measurement, and it is not something the software enforces today.

Need to detect a replayed assertion, or prove the credential never left one device? → a security key. It is the only one of the two that carries a counter, and the only one that cannot be copied to a second device.

Need to prove which person, not merely that someone was present? → a phone, whose biometric verified the holder. A key can do this too, but only if user verification is required of it — which means its PIN, and that is a real trade rather than a setting to flip without thinking.

A phone cannot enter the area? → a key. In a cleanroom, an explosive atmosphere or a secure site this is not a preference, and no amount of architecture argues with the door.

A shared workstation with many operators? → a key each. A credential bound to the machine cannot tell you which of them was standing there.

Field or remote work with no fixed console? → a phone. It is the device that is already going to be there.

No human at the machine at all? → neither. That position wants a public key, not an authenticator: it verifies a signature before it acts, and the human who authorised the action was somewhere else, earlier. A security key installed at an unattended controller does not create presence — it relocates the appearance of it, which is the failure this whole construction exists to prevent.

What this run does not change

The records are still “authenticated sender.” Nothing here produced a detached signature an outsider could check offline from public information, so the wording does not move. The second of the two questions below we still do not pass, and we said so before we ran.

Confirmation is still not independent. The robot acknowledged each command and we recorded the acknowledgement. That is commanded and acknowledged, which is not the same as verified — real confirmation of a physical outcome comes from an observer that is not the robot.

One public address is still there. We know exactly what closes it: a documented way to trust the encryption on a private link between the sandbox and a service on its own host. A shortcut was available and we turned it down, because taking it would have cost the ability to inspect what the agent is asking for. That was the wrong trade, and it still is.

And it is still one agent at a time. Population remains the number we do not have, and it is the one a buyer with a floor full of them will ask for first.

Why it matters commercially

  1. It is an upgrade, not a migration. Because nothing on either side had to change, an existing deployment can adopt this without rewriting its applications or retraining its people. That is the difference between a project a customer has to fund and a change they can simply make — and it is the single biggest determinant of whether security technology actually gets adopted.
  2. The service can now sit inside the customer's own building. Neither relay accepts an incoming connection, so the half that touches the equipment no longer needs to be reachable from outside. A factory can keep its control systems entirely behind its own firewall and still be operated by an agent running elsewhere. For regulated sites, that is frequently the whole conversation.
  3. It composes with NVIDIA rather than competing with it. NVIDIA's sandbox confines what a misbehaving agent can do on the machine it runs on. atSign's transport removes the network exposure and the readable middle. Our layer decides which identity may issue which command. Three different companies' technology, one chain, ending at a physical machine — and none of it had to be modified to fit together.
  4. The published claim is now demonstrated rather than asserted. “Keep the protocols, change the plumbing” was a conclusion in a test report. It has now been done on an independent third party's working system, with the before-and-after recorded.

What this applies to

The construction is not specific to the hardware we built it on. It asks three things of a controller: that it can hold a public key, that it can verify a signature before it acts, and that it can refuse. Nothing else in it is ours — not the vendor, not the fieldbus, not the protocol above it. We built and measured on the controller that is on our bench.

We state that as scope, not as a hope. The alternative has no end: an answer for one controller invites “but not that one”, and that objection can be made indefinitely by anyone who would rather not decide. A construction either generalises or it does not. This one does, because the property it rests on — the ability to check a signature before acting — is not a point of difference between controllers.

The US authorities made exactly this move five days after we ran the test, and it is worth noting who made it. Having named specific Siemens S7 models as the subject of an active threat, the National Security Agency, CISA, the FBI, the Department of Energy and the Environmental Protection Agency wrote that “ongoing PLC targeting activity is broader than Siemens PLCs” and that “all PLC owners and operators should apply relevant mitigations.” The threat is not model-specific, and they said so while naming models. Neither is the answer.

What that advisory describes is the reason this paper exists. Attackers are using AI-generated scripts that mimic legitimate monitoring tools — which means the defence cannot be recognising a bad client. Every detection method the advisory recommends is an inference about whether a human authorised an action: writes outside change windows, activity out of hours, “patterns consistent with automated scripting rather than human operators”, changes with no matching work order. Against a tool built to look legitimate, each of those is a guess. A command that carries an identity, or does not run, is not a guess.

What to check when someone sells you “signed”

Two questions separate security that can be demonstrated from security that is merely asserted. We apply both to ourselves here, and we do not yet pass all of the second.

Can they prove they blocked it, or only block it?

The platform underneath us can silently reject an unauthorised request, or it can let the application see it and record a refusal — but not both at once. We chose the recordable option, because a refusal nobody can evidence is worth little to an auditor, and closed the resulting gap another way. Ask any vendor which of the two they do. A system that drops bad requests quietly cannot tell you afterwards what it stopped, and cannot let the caller tell refusal apart from an outage. That is the difference between “secure” and “demonstrably secure”, and the second is the one a regulated buyer is paying for.

Can an outsider verify the record, or only the recipient?

Our messages are encrypted and authenticated between the two parties, so the receiver knows who sent what. That is not the same as a signature an independent third party can check afterwards from public information, without trusting either side. Wherever someone outside has to adjudicate — an audit, a dispute, an insurance claim, a regulator asking what happened — that distinction is the difference between evidence and assertion. So we describe our records as “authenticated sender” and will not claim more until it is true. It is solvable and we are solving it. Anyone who cannot tell you which of the two they have should be assumed to have the weaker one.

What happens next

Partly up to you. Each gap named above has a known answer, and none of them is free. Which is worth closing first depends on where you sit — a regulated operator, a systems integrator and a robot vendor would not rank them the same way, and we would rather be told than guess.

If you have run into any of this, or you think we have the priorities wrong, say so: linkedin.com/company/digital2win. Every figure in this note came from a scripted run that can be re-executed on request — including by you, on your own hardware.