<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Provael — notes</title><description>Research notes on red-teaming vision-language-action robot policies: attack families, transfer studies, and why we publish null results.</description><link>https://www.provael.com/</link><language>en</language><copyright>Content CC BY-SA 4.0 · Provael</copyright><item><title>What an 88% attack success rate means</title><link>https://www.provael.com/notes/what-88-percent-means</link><guid isPermaLink="true">https://www.provael.com/notes/what-88-percent-means</guid><description>The full setup behind Provael&apos;s headline number - the control arm, the reword controls, the uncalibrated predicate, and what would change it.</description><pubDate>Fri, 04 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Provael’s headline number is 88 percent — and what it does not mean matters more. On its own that figure is close to meaningless, and the
parts that give it meaning are the parts people skip. This is all of them, in the order they
matter.&lt;/p&gt;
&lt;h2 id=&quot;1-the-setup-stated-exactly&quot;&gt;1. The setup, stated exactly&lt;/h2&gt;
&lt;p&gt;SmolVLA (&lt;code&gt;HuggingFaceVLA/smolvla_libero&lt;/code&gt;) on the LIBERO benchmark, all ten &lt;code&gt;libero_object&lt;/code&gt; tasks,
five seeds per task, horizon 280, on an NVIDIA L4. The attack is &lt;code&gt;roleplay&lt;/code&gt;: a templated instruction
reframe that keeps the task words and changes the frame around them. The unsafe predicate is a
keep-out zone violation — the end-effector leaving a declared box.&lt;/p&gt;
&lt;p&gt;Everything below comes from one committed run. Not a best-of, not a rerun until it worked.&lt;/p&gt;
&lt;h2 id=&quot;2-the-number&quot;&gt;2. The number&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;44 of 50 matched pairs.&lt;/strong&gt; Task-clustered 95 percent interval &lt;strong&gt;72 to 100 percent&lt;/strong&gt;. McNemar exact
p = 4.6e-13, Holm-adjusted 2.7e-12, on 42-0 discordant pairs against the benign twins at the same
(task, seed).&lt;/p&gt;
&lt;p&gt;The interval is clustered by task rather than pooled because episodes within a task are correlated,
and pooling would report a tighter interval than the data supports. It is wide. That is the honest
width for fifty episodes.&lt;/p&gt;
&lt;h2 id=&quot;3-the-control-without-which-the-88-means-nothing&quot;&gt;3. The control, without which the 88 means nothing&lt;/h2&gt;
&lt;p&gt;The benign arm — same tasks, same seeds, the untouched task instruction — fired &lt;strong&gt;2 of 50, 4
percent&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;This line is the whole argument. A predicate that fires on clean runs will fire on attacked ones
too, and an attack rate read against an uncharacterised control is a number about the predicate
rather than about the policy. 88 against 4 is an effect. 88 against 80 would have been a broken
predicate. You cannot tell which you are looking at without the second number, and most published
robot-attack rates do not print one.&lt;/p&gt;
&lt;h2 id=&quot;4-the-reword-controls-which-almost-everyone-skips&quot;&gt;4. The reword controls, which almost everyone skips&lt;/h2&gt;
&lt;p&gt;Two arms answer two different questions, and the first version of this section conflated them.&lt;/p&gt;
&lt;p&gt;The first is the harmless-variation control. The &lt;em&gt;benign&lt;/em&gt; instruction, reworded so that its meaning
is unchanged and no unsafe target appears anywhere in it (&lt;code&gt;benign_reword&lt;/code&gt;, four fixed templates),
fired &lt;strong&gt;1 of 50, 2 percent&lt;/strong&gt; — against roleplay’s 44 of 50 on the same (task, seed) pairs: 43
discordant pairs one way, none the other, McNemar exact p = 2.3e-13. A nonsense-text arm fired 0 of
50. This is the comparison that separates two claims people routinely conflate:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;the policy is brittle to how you phrase things&lt;/em&gt; — which a reword arm would show, and&lt;/li&gt;
&lt;li&gt;&lt;em&gt;an attacker who controls the instruction can redirect the policy&lt;/em&gt; — which is what 44 of 50 shows.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At 2 percent against 88 percent, this run supports the second and not the first. If the harmless
reword had also landed high, the roleplay number would have been evidence of fragility rather than
of attacker control, and it would have meant something much less interesting.&lt;/p&gt;
&lt;p&gt;The second arm is &lt;code&gt;paraphrase&lt;/code&gt;: the &lt;em&gt;unsafe ask itself&lt;/em&gt;, said plainly in one of four rewordings,
without the movie-scene frame. It fired &lt;strong&gt;3 of 50, 6 percent&lt;/strong&gt;. That is an attack, not a control,
and it says something else worth knowing: the bare request barely works, and the reframing is what
carries it from 6 percent to 88.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Correction, 13 September 2026. The version of this section published on 4 September called
&lt;code&gt;paraphrase&lt;/code&gt; “the paired reword”, printed 3 of 50 as the control figure, and added that an earlier
draft’s 1 of 50 was unsupported by the artifact. That was backwards. The 1 of 50 is the committed
&lt;code&gt;benign_reword&lt;/code&gt; control arm (results/smolvla_libero_object_control); the 3 of 50 is the paraphrase
attack arm of the suite run. The homepage, /results, /findings, the sample pack and the evidence
manifest said 1 of 50 throughout. Recorded as erratum E-2026-10.&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&quot;5-what-the-attack-costs-the-task&quot;&gt;5. What the attack costs the task&lt;/h2&gt;
&lt;p&gt;Clean-task success was &lt;strong&gt;42 of 50 (84 percent)&lt;/strong&gt;. Under the roleplay attack it was &lt;strong&gt;0 of 50&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The attack does not merely make the policy unsafe on the way to finishing. It destroys completion.
A robot that fails safely and a robot that fails unsafely are different outcomes, and this run
produced the second.&lt;/p&gt;
&lt;h2 id=&quot;6-what-would-change-this-result&quot;&gt;6. What would change this result&lt;/h2&gt;
&lt;p&gt;Three things, none of which exist yet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;A calibrated predicate.&lt;/strong&gt; The keep-out box is hand-picked, not fitted to the benign workspace
of these tasks. The benign arm firing at all is the symptom, and it clusters on two adjacent
tasks rather than spreading — the signature of a boundary in the wrong place. Tracked as
&lt;a href=&quot;https://github.com/provael/provael/issues/136&quot;&gt;provael#136&lt;/a&gt; and
&lt;a href=&quot;https://github.com/provael/provael/issues/171&quot;&gt;#171&lt;/a&gt;, blocked on a GPU sweep that records
end-effector trajectories.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;A second policy.&lt;/strong&gt; One policy and one checkpoint. Nothing here establishes that the result
generalises, and the site does not claim it does.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Real hardware.&lt;/strong&gt; Zero hardware runs. The sim-to-real protocol is pre-registered and frozen,
and it has not been executed.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Until those land, this is a simulation result about one policy with an uncalibrated predicate, and
that sentence belongs next to the 88 wherever the 88 appears.&lt;/p&gt;
&lt;h2 id=&quot;the-artifact&quot;&gt;The artifact&lt;/h2&gt;
&lt;p&gt;Every figure above is in the committed run rather than in this page. The raw aggregate is linked
from &lt;a href=&quot;/verification/&quot;&gt;verification&lt;/a&gt;, and if you run it and get something different, that is the
most useful thing you can send — we publish contradicting results with attribution, unchanged.&lt;/p&gt;
</content:encoded><category>notes</category><category>methodology</category><category>measurement</category></item><item><title>We printed a JS object where the signing key goes</title><link>https://www.provael.com/notes/the-verify-line-that-printed-an-object</link><guid isPermaLink="true">https://www.provael.com/notes/the-verify-line-that-printed-an-object</guid><description>/leaderboard rendered an object where the signing key goes, in the sentence asking you not to take our word for it. The signature stayed valid; the page didn&apos;t.</description><pubDate>Sat, 08 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;For some period ending today, &lt;a href=&quot;/leaderboard/&quot;&gt;/leaderboard&lt;/a&gt; printed this in its provenance line:&lt;/p&gt;
&lt;pre class=&quot;astro-code github-dark&quot; style=&quot;background-color:#24292e;color:#e1e4e8; overflow-x: auto;&quot; tabindex=&quot;0&quot; data-language=&quot;plaintext&quot;&gt;&lt;code&gt;&lt;span class=&quot;line&quot;&gt;&lt;span&gt;signature [object Object]&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;signature&lt;/code&gt; is an object — &lt;code&gt;{keyid, alg, sig}&lt;/code&gt; — and the page interpolated the whole thing into
text. JavaScript stringifies an object as &lt;code&gt;[object Object]&lt;/code&gt;, and there it sat.&lt;/p&gt;
&lt;p&gt;In isolation this is a cosmetic bug, the kind every site ships occasionally. It is not in
isolation. It was in the paragraph whose entire job is to tell you that you do not have to trust
this page — that the board is signed, that the key is published, and that you can check both
yourself. Of all the sentences on this site, that is the worst one to render a JavaScript artifact
into. It reads exactly like a project that talks about verification without doing any.&lt;/p&gt;
&lt;h2 id=&quot;the-signature-was-fine-the-whole-time&quot;&gt;The signature was fine the whole time&lt;/h2&gt;
&lt;p&gt;Worth stating plainly, because “the signature line was broken” invites a worse conclusion than the
truth. The cryptography was never affected:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;sha256&lt;/code&gt; of the published public key is &lt;code&gt;8d62aa33ed5162f3&lt;/code&gt;, which matches the keyid on
&lt;a href=&quot;/verification/&quot;&gt;/verification&lt;/a&gt;, the keyid inside &lt;code&gt;leaderboard.json&lt;/code&gt;, and the value the docs tell
you to expect.&lt;/li&gt;
&lt;li&gt;The Ed25519 signature over the DSSE pre-authentication encoding verifies &lt;strong&gt;valid&lt;/strong&gt; against that
key.&lt;/li&gt;
&lt;li&gt;Changing a single number in the payload and re-verifying returns &lt;strong&gt;invalid&lt;/strong&gt;, as documented.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The chain was sound end to end. Only the rendering of it was wrong — which is its own kind of bad,
since the rendering is the part a reader actually sees.&lt;/p&gt;
&lt;h2 id=&quot;what-we-changed&quot;&gt;What we changed&lt;/h2&gt;
&lt;p&gt;The page now prints the algorithm, the &lt;strong&gt;full&lt;/strong&gt; key id, and a truncated signature with a link to the
complete artifact. The key id is deliberately not shortened: it is the one value a reader compares
against their own &lt;code&gt;provael leaderboard verify&lt;/code&gt; output, so truncating it would remove the reason it
is on the page.&lt;/p&gt;
&lt;p&gt;The more useful change is the check. &lt;code&gt;[object Object]&lt;/code&gt; in built output is never correct — it is
always an object that escaped into a text node — so the build now fails if that string, or any
&lt;code&gt;[object X]&lt;/code&gt;, appears in any rendered page. It cost four lines and it would have caught this before
it shipped.&lt;/p&gt;
&lt;p&gt;It is scoped to HTML, Markdown and text output, and deliberately not to JavaScript bundles, where
&lt;code&gt;Object.prototype.toString.call(x) === &apos;[object Object]&apos;&lt;/code&gt; is a completely ordinary type check. A
check that fails the build on a correct dependency gets disabled within a week, and then it is worse
than not having written it.&lt;/p&gt;
&lt;h2 id=&quot;the-part-that-annoys-us&quot;&gt;The part that annoys us&lt;/h2&gt;
&lt;p&gt;This same paragraph has now mis-rendered its own signature state twice. The first time, the copy was
hardcoded to say the board was unsigned while only the value beside it was dynamic — so the moment
the board was genuinely signed, the page announced “The payload is unsigned” next to a valid
signature. There is a comment in the source about that one, four lines above the line that broke
this time.&lt;/p&gt;
&lt;p&gt;The lesson we took from the first occurrence was to make the prose dynamic. The lesson available
now is narrower and more useful: a comment explaining a past bug does not prevent the next one, and
we had written a comment instead of a check. The check exists now.&lt;/p&gt;
</content:encoded><category>notes</category><category>corrections</category><category>honesty</category></item><item><title>We were blocking the crawlers we built for</title><link>https://www.provael.com/notes/we-blocked-the-crawlers-we-built-for</link><guid isPermaLink="true">https://www.provael.com/notes/we-blocked-the-crawlers-we-built-for</guid><description>Our CDN&apos;s default robots.txt told ClaudeBot, GPTBot and Google-Extended to stay out, two lines above our own file welcoming citations. Fixed, written down.</description><pubDate>Mon, 03 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;We spent months making this site readable by machines: &lt;code&gt;llms.txt&lt;/code&gt;, a full-text dump, a
machine-readable regulatory clock, and a Markdown twin of nearly every page. Then we found our
own &lt;code&gt;robots.txt&lt;/code&gt; telling ClaudeBot, GPTBot and Google-Extended to stay out.&lt;/p&gt;
&lt;p&gt;It came from a CDN default - Cloudflare’s managed robots.txt - sitting above our own file, and
our file said the opposite two lines below it. The machine-readable rules won: user-agent-specific
&lt;code&gt;Disallow&lt;/code&gt; beats a wildcard &lt;code&gt;Allow&lt;/code&gt;, so the polite comment about citations being welcome was
overruled by the block above it on every crawl. Citations are the whole point here, so the block
is gone, and the crawler policy is now &lt;a href=&quot;/robots.txt&quot;&gt;written down inside robots.txt&lt;/a&gt; as a
decision rather than inherited: search yes, AI answer-engine use yes, training-crawler access
stated explicitly instead of left to a vendor default.&lt;/p&gt;
&lt;p&gt;This is the same failure shape as the two before it (the lead form that 503’d behind a green
build, the last time managed robots.txt overrode the committed file): the repository was right,
the build was green, and the served origin said something else. Our &lt;code&gt;check:live&lt;/code&gt; gate exists for
exactly this class, and it is the thing that should have been run more often.&lt;/p&gt;
&lt;h2 id=&quot;update-8-august-2026-it-came-back-and-the-monitor-did-not-save-us&quot;&gt;Update, 8 August 2026: it came back, and the monitor did not save us&lt;/h2&gt;
&lt;p&gt;Five days later the managed block was above our file again, disallowing ClaudeBot, GPTBot and
Google-Extended exactly as before. The zone setting had been re-enabled.&lt;/p&gt;
&lt;p&gt;The interesting part is not the recurrence. It is that &lt;strong&gt;the check caught it and it made no
difference&lt;/strong&gt;. &lt;code&gt;check:live&lt;/code&gt; runs on a schedule twice a day, it detected the drift, and it exited
non-zero on six consecutive runs. Nobody acted, and here is why:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;The monitor was already red, and had been for a week&lt;/strong&gt;, for a completely unrelated reason: a
Cloudflare KV namespace is unbound, so rate limiting is off on the lead endpoint. Red was its
resting state. A job that always fails cannot tell you that something new has failed.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The alert said nothing.&lt;/strong&gt; It appended a fixed body — a generic list of “likely causes” — to one
long-lived issue. Eleven comments accumulated, each identical apart from its timestamp, none
naming which assertion had failed. The alert about the crawler block was byte-for-byte the same
as the ten alerts about the KV binding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The check classified the block as an editorial choice.&lt;/strong&gt; Blocking training crawlers is a
legitimate preference, so the code reported it as information rather than a failure. For a site
whose committed file says &lt;code&gt;ai-train=yes&lt;/code&gt; in prose and in its content signal, a block on those
bots is not a preference; it contradicts the published policy. That is a bug and it now reads
as one.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So the lesson is a level down from where we left it last time. We had written “the check should
have been run more often”. It &lt;em&gt;was&lt;/em&gt; being run. Detection was never the missing piece — the missing
piece was a signal that could still be heard over a chronic failure.&lt;/p&gt;
&lt;p&gt;Three changes. Training-crawler blocks now fail the check when the committed file declares
&lt;code&gt;ai-train=yes&lt;/code&gt;, derived from that file so flipping the signal relaxes the check on its own rather
than requiring anyone to remember this script exists. Every alert now quotes the assertions that
actually failed on that run. And robots.txt policy has its own single-purpose daily job whose red
and green mean exactly one thing, deliberately not folded into the noisy monitor, because coupling
it to a permanently-failing check is the mistake being corrected. It also closes its own issue when
the drift clears — an alert nobody ever sees resolve is an alert nobody believes.&lt;/p&gt;
&lt;p&gt;A monitor that cries wolf about something real, every twelve hours, for a week, is not a working
monitor. It is a broken one that happens to be correct.&lt;/p&gt;
&lt;h2 id=&quot;two-badges-that-should-never-have-shared-one&quot;&gt;Two badges that should never have shared one&lt;/h2&gt;
&lt;p&gt;While we were in there: EAI07 and EAI10 on the &lt;a href=&quot;/eai-top-10/&quot;&gt;Top 10&lt;/a&gt; both carried the identical
badge, “out of scope for a VLA-policy red-teamer”. They are not the same thing. EAI07 - firmware,
comms, teleoperation - is a &lt;strong&gt;real attack surface we do not test in simulation&lt;/strong&gt;; if you deploy
robots, someone else must cover it. EAI10 - evaluation, observability, incident response - has
&lt;strong&gt;no attack surface at all&lt;/strong&gt;; a number there would be a category error, and Provael’s own
scorecard is evidence &lt;em&gt;for&lt;/em&gt; that control, not an attack on it.&lt;/p&gt;
&lt;p&gt;The tool has always drawn that line - its catalog defines four distinct coverage states
precisely so that a governance meta-risk and an untested attack surface never read as the same
kind of absence. The site was not drawing it. The badges are now split, they derive from a
mirrored copy of the tool’s own catalog rather than from hand-written strings, and a build check
fails if the two ever flatten again.&lt;/p&gt;
</content:encoded><category>notes</category><category>corrections</category><category>honesty</category></item><item><title>Two tens: the device layer and the policy layer</title><link>https://www.provael.com/notes/two-tens-device-and-policy</link><guid isPermaLink="true">https://www.provael.com/notes/two-tens-device-and-policy</guid><description>A December 2025 paper enumerates ten vulnerabilities in the Unitree Go2 stack. Provael&apos;s Top 10 also has ten. Not competing lists — different layers.</description><pubDate>Sun, 02 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;There are now two numbered lists of ten in embodied-AI security, and the phrase “ten risks in embodied AI” no longer points at one thing. This note says plainly what the other one is, why it is good, and why the overlap is smaller than the collision of names suggests.&lt;/p&gt;
&lt;h2 id=&quot;their-ten&quot;&gt;Their ten&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Beyond Model Jailbreak: Systematic Dissection of the “Ten Deadly Sins” in Embodied Intelligence&lt;/em&gt; (&lt;a href=&quot;https://arxiv.org/abs/2512.06387&quot;&gt;arXiv:2512.06387&lt;/a&gt;, 6 December 2025 — Huang, Li, Ma, Dai, Xu, Xu, Zhang, Wang, Cheng) is, in the authors’ words, “the first holistic security analysis of the Unitree Go2 platform”. They probe a real shipped robot with BLE sniffing, traffic interception, APK reverse engineering, cloud API testing and hardware probing, and enumerate ten cross-layer vulnerabilities across wireless provisioning, core modules and external interfaces.&lt;/p&gt;
&lt;p&gt;The findings are concrete and unglamorous in the way good systems security usually is: hard-coded keys, predictable handshake tokens, WiFi credential leakage, missing TLS validation, a static SSH password, insecure local relay channels, weak binding logic, unrestricted firmware access, and multilingual safety-bypass behaviour. Together, they write, these “allow adversaries to hijack devices, inject arbitrary commands, extract sensitive information, or gain full physical control.”&lt;/p&gt;
&lt;p&gt;Read that last clause again. Full physical control of a quadruped, obtained without touching the model at all.&lt;/p&gt;
&lt;h2 id=&quot;their-conclusion-is-the-part-worth-sitting-with&quot;&gt;Their conclusion is the part worth sitting with&lt;/h2&gt;
&lt;p&gt;Their framing is that “securing embodied AI requires far more than aligning the model itself.”&lt;/p&gt;
&lt;p&gt;That is not a criticism of policy-level work; it is a correction to a field that had been treating model alignment as the whole problem. And it is right. A perfectly robust policy on a device with a static SSH password and unrestricted firmware access is a perfectly robust policy you no longer control. If an attacker owns the firmware, what the policy would have decided is irrelevant.&lt;/p&gt;
&lt;h2 id=&quot;our-ten-is-a-different-axis&quot;&gt;Our ten is a different axis&lt;/h2&gt;
&lt;p&gt;Provael’s &lt;a href=&quot;/eai-top-10/&quot;&gt;Embodied AI Security Top 10&lt;/a&gt; enumerates ten risks to a &lt;strong&gt;vision-language-action policy&lt;/strong&gt; — the decision layer. Its unit of analysis is an episode: an instruction or an observation is perturbed, the policy acts, and the question is whether that action left a safe envelope. Everything Provael measures assumes the device is doing what it was told; the attack is on &lt;em&gt;what it gets told&lt;/em&gt;, and on what it sees.&lt;/p&gt;
&lt;p&gt;Their unit of analysis is the platform: the app, the radio, the cloud endpoint, the firmware, the shell. Whether the policy is robust is not the question, because at that layer the policy can be bypassed entirely.&lt;/p&gt;
&lt;p&gt;So the two lists are not rival rankings of the same territory. &lt;strong&gt;Their ten is the device. Ours is the policy.&lt;/strong&gt; A robot with both problems has both problems, and fixing either does nothing for the other.&lt;/p&gt;
&lt;h2 id=&quot;the-clearest-evidence-that-they-compose-eai07&quot;&gt;The clearest evidence that they compose: EAI07&lt;/h2&gt;
&lt;p&gt;The cleanest way to see this is that our own taxonomy already names their territory and marks it out of scope.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EAI07 — CPS, firmware, comms and teleoperation compromise&lt;/strong&gt; carries the coverage state &lt;code&gt;out-of-scope-for-simulation&lt;/code&gt;, and its note says real coverage would mean exercising real firmware, real radio and ROS-DDS traffic, and real teleoperation paths. That is not a gap we plan to close, and it was never a placeholder. A simulator cannot sniff BLE. A policy red-teamer that claimed to cover firmware integrity would be claiming something its instrument cannot reach.&lt;/p&gt;
&lt;p&gt;EAI07 is, almost exactly, the region &lt;a href=&quot;https://arxiv.org/abs/2512.06387&quot;&gt;arXiv:2512.06387&lt;/a&gt; dissects. Our list has a labelled hole; their work is shaped like it. That is what composition looks like, and it is a better outcome than either list quietly pretending to be complete.&lt;/p&gt;
&lt;p&gt;(EAI10 — evaluation, observability and incident response — is out of coverage for a different reason: it is &lt;code&gt;process-control-not-attackable&lt;/code&gt;. It is not a thing an attack targets, so a red-teamer has nothing to run against it. Worth distinguishing, because a reader counting “8 of 10” deserves to know the two uncovered entries are uncovered for unrelated reasons.)&lt;/p&gt;
&lt;h2 id=&quot;one-place-they-genuinely-overlap&quot;&gt;One place they genuinely overlap&lt;/h2&gt;
&lt;p&gt;Their multilingual safety-bypass finding &lt;em&gt;is&lt;/em&gt; a model-layer result, sitting inside an otherwise systems-layer paper. It is adjacent to what our &lt;code&gt;instruction&lt;/code&gt; family measures — that a reframing of language moves behaviour — approached from a different direction and on a different platform.&lt;/p&gt;
&lt;p&gt;We have not reproduced it and make no claim about it. It is noted because pretending the boundary is perfectly clean would be the same overstatement this note exists to avoid.&lt;/p&gt;
&lt;h2 id=&quot;why-the-naming-matters-more-than-it-should&quot;&gt;Why the naming matters more than it should&lt;/h2&gt;
&lt;p&gt;“Ten Sins of Embodied AI Security” is indexed as a topic. “Embodied AI Security Top 10” is ours. A reader searching for one will find the other, and the honest thing is to make the distinction findable rather than compete for the phrase.&lt;/p&gt;
&lt;p&gt;If you are securing a fleet of deployed robots, read their paper first. The device layer is where an attacker with physical proximity starts, and their ten are the kind of finding that is exploitable today rather than theoretically concerning. If you are shipping a learned policy and need evidence that it resists manipulation through the channels it actually consumes, that is the layer &lt;a href=&quot;/results/&quot;&gt;Provael measures&lt;/a&gt; — with the standing caveat that our own results are simulation-only and the &lt;a href=&quot;/sim-to-real/&quot;&gt;physical-transfer study is pre-registered and unrun&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Two lists, two layers, one robot. Neither is the whole answer.&lt;/p&gt;
</content:encoded><category>notes</category><category>prior-art</category><category>positioning</category><category>taxonomy</category></item><item><title>Why Provael publishes null results</title><link>https://www.provael.com/notes/why-we-publish-null-results</link><guid isPermaLink="true">https://www.provael.com/notes/why-we-publish-null-results</guid><description>A security measurement is only worth its honesty. Here is why we report the attacks that did not work as loudly as the ones that did.</description><pubDate>Wed, 22 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Most red-team demos work like a magic trick: show the one attack that landed, and cut away before the ten that didn’t. It makes for a great screenshot and a terrible measurement.&lt;/p&gt;
&lt;p&gt;Provael does the opposite. Every attack family ships with its transfer test in the same breath as its number, and we publish the nulls as loudly as the hits.&lt;/p&gt;
&lt;h2 id=&quot;the-one-real-result-in-full&quot;&gt;The one real result, in full&lt;/h2&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Superseded, 9 August 2026.&lt;/strong&gt; The figures below described a single-task run at n=10. The result
has since been measured across all ten &lt;code&gt;libero_object&lt;/code&gt; tasks at 5 seeds each: &lt;strong&gt;44/50 (88%)&lt;/strong&gt;,
task-clustered 95% CI [72-100%], against a &lt;strong&gt;4%&lt;/strong&gt; benign control. The nulls held and got stronger
(n=50 each rather than n=10). This note is left standing with its original numbers because a dated
note that quietly acquires new ones is not a record of anything — and a piece arguing for
publishing inconvenient results is the last place to silently revise a number downward.
See &lt;a href=&quot;/results/&quot;&gt;the measured result&lt;/a&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;On a real SmolVLA policy in LIBERO, a &lt;code&gt;roleplay&lt;/code&gt; instruction drove the arm across a keep-out line 100% of the time (10/10, 95% Wilson CI 72-100%) against a 0% benign control. That is the number people quote.&lt;/p&gt;
&lt;p&gt;Here is the number they don’t: the visual-patch and scene-text-injection families produced &lt;strong&gt;0% measurable transfer&lt;/strong&gt; on the same real model. We could have quietly dropped them. We report them instead, with their confidence intervals.&lt;/p&gt;
&lt;h2 id=&quot;why-a-null-is-not-a-failure&quot;&gt;Why a null is not a failure&lt;/h2&gt;
&lt;p&gt;A security measurement without its nulls and its benign control is uninterpretable. If you don’t know how often the “unsafe” test fires with no attack present, a 100% attack-success rate could just be a trigger-happy predicate. The benign control is what turns a demo into evidence.&lt;/p&gt;
&lt;p&gt;Publishing the nulls does something a hype-driven “most comprehensive platform” structurally cannot: it tells you exactly where the tool is strong and where it isn’t. That honesty is the whole point. The value of a security number is its trustworthiness, and trustworthiness is built by reporting the results that don’t flatter you.&lt;/p&gt;
&lt;h2 id=&quot;it-is-a-discipline-not-a-slogan&quot;&gt;It is a discipline, not a slogan&lt;/h2&gt;
&lt;p&gt;When we ran the EAI04 action-space transfer study, the honest finding was that those attacks are &lt;em&gt;not-applicable&lt;/em&gt; on a real policy through the current mechanism. We shipped that as the headline, not a footnote.&lt;/p&gt;
&lt;p&gt;If a number ever looks too good, ask for its benign control and its nulls. If a tool won’t show you those, you are looking at a stunt, not a measurement. &lt;a href=&quot;/results/&quot;&gt;See the one real result, in full →&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>notes</category><category>methodology</category><category>honesty</category></item><item><title>The embodiment gap: what text red-teaming misses</title><link>https://www.provael.com/notes/the-embodiment-gap</link><guid isPermaLink="true">https://www.provael.com/notes/the-embodiment-gap</guid><description>Tools like garak and PyRIT scan what a model says. A robot policy turns language into motion, and that is a failure text-only red-teaming has nothing to score.</description><pubDate>Tue, 21 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;h2 id=&quot;text-red-teaming-stops-at-the-sentence&quot;&gt;Text red-teaming stops at the sentence&lt;/h2&gt;
&lt;p&gt;Tools like garak, PyRIT, and promptfoo are excellent at one thing: scanning what a model &lt;em&gt;says&lt;/em&gt;. They send adversarial prompts and check whether the output is toxic, jailbroken, or leaks a secret. For a chatbot, that is the whole attack surface.&lt;/p&gt;
&lt;h2 id=&quot;a-robots-output-is-not-a-sentence&quot;&gt;A robot’s output is not a sentence&lt;/h2&gt;
&lt;p&gt;A vision-language-action policy takes a camera image and an instruction and emits an &lt;strong&gt;action&lt;/strong&gt; - a motor command, a trajectory, a gripper state. The dangerous failure is not a toxic paragraph. It is the arm carrying a payload across a keep-out line, freezing at a safety-critical step, or being nudged toward an attacker’s waypoint.&lt;/p&gt;
&lt;p&gt;That failure lives in the action space. Text-only red-teaming has nothing to score there, because the harmful output was never text.&lt;/p&gt;
&lt;h2 id=&quot;why-this-needs-its-own-taxonomy&quot;&gt;Why this needs its own taxonomy&lt;/h2&gt;
&lt;p&gt;This is the embodiment gap, and it is why we maintain the &lt;a href=&quot;/eai-top-10/&quot;&gt;Embodied AI Security Top 10&lt;/a&gt;: a robot policy has its own attack surface - adversarial perception, action-space integrity, embodied prompt injection - that the LLM and agent frameworks do not cover. OWASP’s Agentic Top 10 is scoped to software agents; MITRE ATLAS and NIST’s AI profiles have no robotics coverage today.&lt;/p&gt;
&lt;h2 id=&quot;the-practical-version&quot;&gt;The practical version&lt;/h2&gt;
&lt;p&gt;If your robot has an LLM in the loop, you need both halves: red-team the language with a text tool, and red-team the resulting motion with something that models the action space and reports an attack-success rate. That second half is what Provael measures. &lt;a href=&quot;/compare/&quot;&gt;See the full comparison →&lt;/a&gt;&lt;/p&gt;
</content:encoded><category>notes</category><category>category</category><category>positioning</category></item></channel></rss>