<?xml version="1.0" encoding="UTF-8" ?> <?xml-stylesheet type="text/xsl" href="rss.xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/"> <channel> <title>Shisso Robotics</title><description>Robot-learning papers re-tested on an SO-101 arm and a Jetson (≈ €1,350 of hardware): pre-registered bars, failures published.</description><link>https://shissorobotics.com/</link><atom:link href="https://shissorobotics.com/feed_rss_created.xml" rel="self" type="application/rss+xml" /> <language>en</language> <pubDate>Sun, 01 Nov 2026 06:18:15 -0000</pubDate> <lastBuildDate>Sun, 01 Nov 2026 06:18:15 -0000</lastBuildDate> <ttl>1440</ttl> <generator>MkDocs RSS plugin - v1.19.0</generator> <image> <url>None</url> <title>Shisso Robotics</title> <link>https://shissorobotics.com/</link> </image> <item> <title>REMORA</title> <description>&lt;h1 id=&#34;remora&#34;&gt;REMORA&lt;a class=&#34;headerlink&#34; href=&#34;#remora&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said reading progress at the peak nearest the last estimate keeps it steady and lets it fall after setbacks. On 34 of our recorded runs we compared it with simpler readouts of the same evidence. It did not hold: it cut changes to 0.70 of the simplest readout, not half, and missed most setbacks.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Stage flips per run, relative to argmax (lower is better): per-frame argmax 1.00×; REMORA readout 0.70×; bar: halved&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Stage flips per run, relative to argmax (lower is better): per-frame argmax 1.00×; REMORA readout 0.70×; bar: halved&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;158.3&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;per-frame argmax&lt;/text&gt;&lt;text x=&#34;280.3&#34; y=&#34;40&#34;&gt;1.00×&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;111.5&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;REMORA readout&lt;/text&gt;&lt;text x=&#34;233.5&#34; y=&#34;66&#34;&gt;0.70×&lt;/text&gt;&lt;line x1=&#34;197.2&#34; y1=&#34;20&#34; x2=&#34;197.2&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;197.2&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar: halved&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Nothing to change: keep a simple stage tracker. This readout needs a richer progress estimate than hand-written rules give.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Three progress levels from hand-written evidence, not a learned 201-bin distribution. Setbacks are a mechanical reversal criterion, not human labels. The memory and backbone are not tested.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 22 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Track task progress through errors and recovery: a progress distribution from a frozen-VLM backbone with a per-camera recurrent memory, trained against a target that falls inside error intervals, read out causally at the peak nearest the previous estimate; shown on ReSTEP (AgiBot G02, two logistics tasks).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Picking the supported peak nearest the previous estimate tracks progress through errors better than a per-frame readout. &lt;small&gt;(§3.3 (Eq. 3); Table 2 (A5))&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;A recurrent memory beats an explicit window of past frames. &lt;small&gt;(Table 2)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;li&gt;REMORA tracks progress better than SARM. &lt;small&gt;(Table 2)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; Reading a progress distribution out at the supported peak nearest the previous estimate steadies the estimate and lets it fall during real setbacks, with no worse detection of the stages. · &lt;strong&gt;Bar:&lt;/strong&gt; Against per-frame argmax: premature not higher and missed ≤ +2 points (P1); flips halved, CI upper ≤ 0.7 (P2); a decrease inside ≥ 50 % of the reversal windows with ≤ 20 % false regressions (P3). · &lt;strong&gt;n:&lt;/strong&gt; 34 test episodes of the 69 rollouts, 7 reversal windows&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; D2 (25 error episodes): peak selection vs the median readout MAE 6.04 → 3.31 (×10⁻²), Spearman 0.870 → 0.959 vs premature 0.22 vs 0.25, missed equal (P1 pass); flips 0.70 × argmax, CI 0.48–0.94 (P2 fail); setback recall 2/7, false 0.52 (P3 fail); MAE 0.184 vs median 0.218 · &lt;strong&gt;Not proven:&lt;/strong&gt; Three progress atoms from hand-written evidence, not a learned 201-bin distribution; the reversal windows are a mechanical criterion, not human error labels; the recurrent memory and the backbone are not tested.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2610.39125&#34;&gt;arXiv 2610.39125&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; no code link found&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-22&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; nearest-peak progress readout below per-frame progress readout on readout flips per episode — theirs MAE 6.04 → 3.31 (×10⁻²) vs the median readout · ours flips 0.70 × argmax (CI 0.48–0.94); setback recall 0.29 (2/7), false regressions 0.52 &lt;small&gt;(paper §3.3 and Table 2 (peak selection vs median readout on the error task))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;claim-untested&#34;&gt;&lt;span class=&#34;pill pill-not-tested&#34;&gt;not tested&lt;/span&gt; recurrent progress memory below explicit frame window on progress MAE — theirs MAE −3.3 %, curvature error −14 % &lt;small&gt;(paper Table 2 (MAE −3.3 %))&lt;/small&gt;&lt;/span&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;claim-untested&#34;&gt;&lt;span class=&#34;pill pill-not-tested&#34;&gt;not tested&lt;/span&gt; REMORA progress model below SARM reward model on progress MAE — theirs lower MAE and smoother on both tasks &lt;small&gt;(paper Table 2)&lt;/small&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no. Orin NX CPU (feature extraction in the lerobot-jetson container). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-31-paper-vs-hardware-remora-readout&#34;&gt;2026-10-31-paper-vs-hardware-remora-readout&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-31 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-31&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;&lt;em&gt;Tracking Task Progress Through Errors and Recovery&lt;/em&gt; (Wang, Niu, Zhu et al., arXiv 2610.39125) argues that a progress estimate should be able to go backwards: when the robot drops the object, progress should fall, then recover. Its model needs eight H200s. Its readout rule does not, so I tested the rule on the 69 rollouts this rig already has.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;REMORA predicts a distribution over progress at every frame, from a frozen VLM backbone with a recurrent memory per camera, and is trained against a target that falls inside labelled error intervals and climbs back after them. It reads the distribution out causally: among the peaks of the distribution, take the one closest to the previous estimate. On the task with real errors (25 error episodes in its ReSTEP test set, AgiBot G02), peak selection against the per-frame median cuts the error from 6.04 to 3.31 (×10⁻²) and lifts Spearman from 0.870 to 0.959. On the task with one error episode it gains nothing.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The model is out of reach; the readout rule and the error-aware target are model-free. The rig has G15&#39;s per-frame grasp and place evidence on 69 rollouts, a monotone stage machine that reads it (premature on 48.5 % of events, missed on 46.7 %), and G14&#39;s reversal windows (re-grasp loops, pan dithering) as its own error intervals.&lt;/p&gt; &lt;p&gt;I turned the evidence into a distribution over three progress values (reach, holding, placed) with two logistic regressions fitted on G15&#39;s development half, and read the same distribution four ways on the 34 test episodes: the stage machine, the per-frame argmax, the per-frame median (the paper&#39;s ablation), and the nearest peak. Bars frozen before any number, against the argmax:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;P1:&lt;/strong&gt; the nearest peak calls no more events too early, and misses at most 2 points more.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;P2:&lt;/strong&gt; it halves the flips per episode (CI upper bound ≤ 0.7).&lt;/li&gt; &lt;li&gt;&lt;strong&gt;P3:&lt;/strong&gt; it decreases inside at least half of the reversal windows, with at most 20 % of the other episodes showing a decrease.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;readout&lt;/th&gt; &lt;th&gt;premature&lt;/th&gt; &lt;th&gt;missed&lt;/th&gt; &lt;th&gt;flips / episode&lt;/th&gt; &lt;th&gt;setbacks caught (7)&lt;/th&gt; &lt;th&gt;false setbacks&lt;/th&gt; &lt;th&gt;error vs target&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;stage machine&lt;/td&gt; &lt;td&gt;0.485&lt;/td&gt; &lt;td&gt;0.467&lt;/td&gt; &lt;td&gt;1.00&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;td&gt;0.00&lt;/td&gt; &lt;td&gt;0.248&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;per-frame argmax&lt;/td&gt; &lt;td&gt;0.250&lt;/td&gt; &lt;td&gt;0.133&lt;/td&gt; &lt;td&gt;5.97&lt;/td&gt; &lt;td&gt;3&lt;/td&gt; &lt;td&gt;0.56&lt;/td&gt; &lt;td&gt;0.183&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;per-frame median&lt;/td&gt; &lt;td&gt;0.397&lt;/td&gt; &lt;td&gt;0.133&lt;/td&gt; &lt;td&gt;6.35&lt;/td&gt; &lt;td&gt;3&lt;/td&gt; &lt;td&gt;0.74&lt;/td&gt; &lt;td&gt;0.218&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;nearest peak&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0.221&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0.133&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;4.21&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;2&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0.52&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;0.184&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;P1 passes: premature −5.9 points (CI −17.6 to 0), missed unchanged. P2 fails: the nearest peak keeps 0.70 of the argmax&#39;s flips (CI 0.48–0.94), not half. P3 fails: it falls inside 2 of the 7 windows (0.29) and in 52 % of the episodes with none. Against the median, the paper&#39;s own comparison, it is closer to the target (0.184 vs 0.218) and steadier, the direction the paper reports, but that comparison had no bar here.&lt;/p&gt; &lt;p&gt;I checked the seven stalled or retried-grasp failures by eye: the nearest peak stays at &#34;reach&#34; for the whole episode, which is right, since none of them ever lifted a bowl. They have no progress to lose, so they cannot exercise the claim.&lt;/p&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The readout does what it says in the direction it says. What it selects between here is three values from hand-written predicates, and those predicates are noisy in exactly the places a setback would show. The rule cannot separate a real setback from evidence noise when the distribution itself cannot.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; P1 passes, P2 and P3 fail: not adopted; the progress slot stays on the stage machine.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; a learned, denser progress distribution (the paper&#39;s 201 bins) on this rig, and human-labelled error intervals instead of a mechanical reversal criterion.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no. Orin NX CPU (feature extraction in the lerobot-jetson container). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-31-paper-vs-hardware-remora-readout&#34;&gt;2026-10-31-paper-vs-hardware-remora-readout&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 22 of 22.&lt;/strong&gt; &lt;a href=&#34;../../30/paper-vs-hardware-horizon-depth/&#34;&gt;← Papers tested 21: Horizon × depth (Euler steps vs execution horizon)&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/31/paper-vs-hardware-remora/</link> <pubDate>Sat, 31 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/31/paper-vs-hardware-remora/</guid> </item> <item> <title>Adaptive Action Chunking (AAC)</title> <description>&lt;h1 id=&#34;adaptive-action-chunking-aac&#34;&gt;Adaptive Action Chunking (AAC)&lt;a class=&#34;headerlink&#34; href=&#34;#adaptive-action-chunking-aac&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a robot policy can pick each motion chunk&amp;#x27;s length from how much 20 samples disagree. On recorded runs and on the robot&amp;#x27;s computer we checked the chosen lengths and the cost. It did not hold: lengths mostly stayed at the minimum, and one decision took 4,751 ms.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;One 20-sample decision, ms (lower is better): paper (A800) 106 ms; Orin (sequential) 4,751 ms; bar 298 ms&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;One 20-sample decision, ms (lower is better): paper (A800) 106 ms; Orin (sequential) 4,751 ms; bar 298 ms&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;3.6&#34; height=&#34;14&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;paper (A800)&lt;/text&gt;&lt;text x=&#34;125.6&#34; y=&#34;40&#34;&gt;106 ms&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;161.2&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;Orin (sequential)&lt;/text&gt;&lt;text x=&#34;283.2&#34; y=&#34;66&#34;&gt;4,751 ms&lt;/text&gt;&lt;line x1=&#34;128.1&#34; y1=&#34;20&#34; x2=&#34;128.1&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;128.1&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 298 ms&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not sample many chunks per decision on a Jetson engine without batching. The cost grows with every sample.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;254 decisions on 20 recorded episodes; no arm run, as the task is at ceiling. A batched sampler would change the cost, not the entropy rule.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 19 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Choose each action chunk&amp;#x27;s length at inference from how much N sampled chunks disagree, so a VLA commits to long chunks where it is confident and short ones where it is not; shown on RoboCasa, LIBERO and three real tasks.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The entropy-chosen chunk length follows the task&amp;#x27;s phases: long in transport, short near the grasp. &lt;small&gt;(Fig. 3–4)&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Adaptive chunks raise success over fixed chunks in simulation and on a real arm. &lt;small&gt;(Tables 1–3; Table 5 (real world 67.0 → 82.0 %))&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Sampling N chunks in a batch adds little cost: negligible below N = 10, about 20 ms at N = 20. &lt;small&gt;(Table 4 (A800))&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; Chunk length chosen from the entropy of N sampled chunks follows the task&#39;s phases (long in transport, short at the grasp), lowers the boundary jump, and costs little with batched sampling. · &lt;strong&gt;Bar:&lt;/strong&gt; median h&lt;em&gt; in transport ≥ grasp window + 2; jump with AAC + overwrite ≤ fixed + overwrite at d = 8; an N = 20 decision ≤ 298 ms on the Orin. · &lt;/em&gt;&lt;em&gt;n:&lt;/em&gt;* 254 decisions on 20 recorded episodes; 10 timed decisions per N&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; h&lt;em&gt; follows the semantic phases (Fig. 3–4); real world 67.0 → 82.0 %; N = 20 costs 106 ms vs 83 ms on an A800 (&#34;about 20 ms inference delay&#34;; negligible below N = 10) vs h&lt;/em&gt; 2 in transport and 2 at the grasp (86 % of decisions at the floor); jump 0.973 vs 0.940; N = 20 decision 4,751 ms (sequential) on the Orin · &lt;strong&gt;Not proven:&lt;/strong&gt; No arm run (the bowls task is at ceiling for SmolVLA); vla.cpp has no batched sampler, which would change the cost but not the entropy rule.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2604.04161&#34;&gt;arXiv 2604.04161&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; no code link found&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-19&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; entropy-chosen chunk length above grasp-window chunk length on median chunk length h&lt;em&gt; in transport — theirs long in transport, short at the grasp · ours 2 vs 2 &lt;small&gt;(paper Fig. 3–4 (h&lt;/em&gt; follows the semantic phases))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; AAC with prefix overwrite at most fixed chunk with prefix overwrite on median boundary jump — theirs no boundary-jump measurement; real-world success 67.0 → 82.0 % (Table 5) · ours 0.973 vs 0.940 &lt;small&gt;(paper §1 and Fig. 6 (qualitative; no boundary metric))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; N-sample decision at most pass mark on ms per decision on the Orin NX — theirs 106 ms (A800, batched) · ours 4,751 ms &lt;small&gt;(paper Table 4 (N = 20: 106 ms vs 83 ms on an A800, &amp;quot;negligible&amp;quot;))&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no. Gate 0 on the Orin NX at 25 W (PyTorch, ~3 h); gate 1 on the Orin at MAXN_SUPER + jetson_clocks (vla.cpp). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-30-paper-vs-hardware-adaptive-chunking&#34;&gt;2026-10-30-paper-vs-hardware-adaptive-chunking&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-30 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-30&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;&lt;em&gt;Adaptive Action Chunking at Inference-time for VLA Models&lt;/em&gt; (AAC; Liang et al., CVPR 2026, arXiv 2604.04161) lets a flow-matching policy choose each chunk&#39;s length from how much N sampled chunks disagree. SmolVLA is a flow-matching policy, so the rule applies to my SO-101 as written.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Draw N = 20 chunks from the same observation; the step where their entropy jumps most sets the chunk length h&lt;em&gt;. Where the policy is confident (transport) chunks get long, where it is not (approach and grasp) they get short. The paper shows h&lt;/em&gt; following the task&#39;s phases (Fig. 3–4), gains on RoboCasa, LIBERO and three real tasks (67.0 → 82.0 % on a Realman arm with a Mycobot gripper), and calls the cost negligible: N = 20 takes 106 ms against 83 ms for one chunk, batched on an A800.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;SmolVLA (the checkpoint behind every vla.cpp number here) on the 20 recorded episodes of the bowls task I use for chunk-boundary tests: 254 decisions, N = 20 samples each, floor ξ = 2. Three bars, frozen before any number:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;A1:&lt;/strong&gt; median h&lt;em&gt; in transport ≥ median h&lt;/em&gt; in the grasp window + 2 (the phase claim).&lt;/li&gt; &lt;li&gt;&lt;strong&gt;A3:&lt;/strong&gt; with the prefix overwrite I already run, AAC&#39;s boundary jump ≤ the fixed chunk&#39;s, at a delay of 8 steps.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;A4:&lt;/strong&gt; on the Orin NX at full power, one N = 20 decision ≤ 298 ms (25 % over one 238 ms chunk).&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This rig&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;h* in transport vs at the grasp&lt;/td&gt; &lt;td&gt;long vs short&lt;/td&gt; &lt;td&gt;&lt;strong&gt;2 vs 2&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;jump, AAC + overwrite vs fixed + overwrite (d = 8)&lt;/td&gt; &lt;td&gt;—&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0.973 vs 0.940&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;N = 20 decision&lt;/td&gt; &lt;td&gt;106 ms (A800, batched)&lt;/td&gt; &lt;td&gt;&lt;strong&gt;4,751 ms&lt;/strong&gt; (Orin NX, sequential)&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;All three bars fail. h* sits at the floor in 219 of 254 decisions: SmolVLA&#39;s samples spread fastest at the very first step, so the largest entropy increase is always at h = 1 and the rule returns the minimum. AAC&#39;s earlier switch alone does lower the naive jump (3.42 → 2.28), because the new chunk is sampled closer in time, but the prefix overwrite already brings the jump to about one normal step (0.94), and AAC adds nothing on top. On the Orin, vla.cpp has no batched sampler, so 20 samples are 20 chunk inferences: 4.75 s per decision.&lt;/p&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The entropy rule needs a policy whose samples agree for a while and then diverge at hard moments. SmolVLA&#39;s samples diverge from the first step everywhere, so on this policy the rule degenerates to &#34;near-minimal chunks&#34;. And the paper&#39;s &#34;negligible&#34; cost is a property of batched sampling on a data-centre GPU, not of the method.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; fail on this rig.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; a policy whose sample spread grows late in the chunk, and a batched sampler on the edge device.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no. Gate 0 on the Orin NX at 25 W (PyTorch, ~3 h); gate 1 on the Orin at MAXN_SUPER + jetson_clocks (vla.cpp, ~5 min). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-30-paper-vs-hardware-adaptive-chunking&#34;&gt;2026-10-30-paper-vs-hardware-adaptive-chunking&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 19 of 22.&lt;/strong&gt; &lt;a href=&#34;../../29/paper-vs-hardware-surveyor/&#34;&gt;← Papers tested 18: SURVEYOR&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-pact-vla/&#34;&gt;Papers tested 20: PACT-VLA →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/30/paper-vs-hardware-adaptive-chunking/</link> <pubDate>Fri, 30 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/30/paper-vs-hardware-adaptive-chunking/</guid> </item> <item> <title>Horizon × depth (Euler steps vs execution horizon)</title> <description>&lt;h1 id=&#34;horizon-depth-euler-steps-vs-execution-horizon&#34;&gt;Horizon × depth (Euler steps vs execution horizon)&lt;a class=&#34;headerlink&#34; href=&#34;#horizon-depth-euler-steps-vs-execution-horizon&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a robot that commits to long motion chunks can use 2 sampling steps instead of 10. On our arm&amp;#x27;s computer we measured how tightly 2 steps group the planned motions, and the time saved. Not proven: on 20 frames, 2 steps kept 0.78 of the 10-step spread (paper: 0.51) and saved 41 ms.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Spread with 2 steps, as a share of 10 (lower = tighter): paper (π0) 0.51; this rig (SmolVLA) 0.78; bar 0.70&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Spread with 2 steps, as a share of 10 (lower = tighter): paper (π0) 0.51; this rig (SmolVLA) 0.78; bar 0.70&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;96.9&#34; height=&#34;14&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;paper (π0)&lt;/text&gt;&lt;text x=&#34;218.9&#34; y=&#34;40&#34;&gt;0.51&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;148.7&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;this rig (SmolVLA)&lt;/text&gt;&lt;text x=&#34;270.7&#34; y=&#34;66&#34;&gt;0.78&lt;/text&gt;&lt;line x1=&#34;251.0&#34; y1=&#34;20&#34; x2=&#34;251.0&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;251.0&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 0.70&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Keep 10 steps on a Jetson for now. Vision takes 151 ms of each chunk, so cutting steps saves only 41 ms of 237.5. The chip did not overheat at one chunk every 1.67 s, so heat is no reason to cut steps.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Tested on SmolVLA (450M) rather than π0, on 20 frames: the contraction is weaker (0.78, bar 0.70, fail above 0.85). The arm test of success at 2 versus 10 steps did not run, because the first test did not pass. Time is measured on the Jetson&amp;#x27;s graphics chip, where vision dominates, not on an A100.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 21 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Show that, for frozen flow-matching VLAs, the effect of cutting Euler steps depends on how long the robot commits to a chunk: fewer steps hurt under frequent replanning and help under long open-loop commitment; shown on LIBERO, RoboTwin 2.0 and a real Franka.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Few Euler steps contract the sampled action cloud around an unchanged centroid. &lt;small&gt;(Proposition 1; §III-D)&lt;/small&gt; &lt;span class=&#34;pill pill-not-proven&#34;&gt;not proven&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Under long open-loop commitment, two steps match or beat ten while cutting inference time. &lt;small&gt;(Table I; Fig. 3; latency figures)&lt;/small&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Two steps avoid thermal throttling on edge GPUs. &lt;small&gt;(§IV (end): 0.04 NFE per step; asserted, no thermal measurement)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-not-proven&#34;&gt;not proven&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; With long open-loop commitment, cutting a flow-matching VLA&#39;s Euler steps from 10 to 2 contracts the action cloud around an unchanged centroid, saves most of the inference time and avoids edge-GPU thermal throttling. · &lt;strong&gt;Bar:&lt;/strong&gt; median R(2)/R(10) ≤ 0.70 with the centroid within 0.05 relative and 3°; N = 2 latency ≤ 0.85 × N = 10 on the Orin, N = 10 within 5 % of 238 ms. · &lt;strong&gt;n:&lt;/strong&gt; 20 frames × 32 draws; 50 timed chunks per N; 2 × 10 min thermal per power mode&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; R(2)/R(10) 0.51, centroid shift 3.2 %; 14.3 → 2.6 ms per step (A100); &#34;eliminating edge GPU thermal throttling&#34; vs R(2)/R(10) 0.78 (CI 0.73–0.81), centroid 0.018 and 2.35°; 196.1 vs 237.5 ms per chunk (0.83, vision 151 ms); no throttling at N = 10 on the Orin, at MAXN_SUPER or 25 W · &lt;strong&gt;Not proven:&lt;/strong&gt; The contraction is between the bar and the fail line, so the arm gate (success at N = 2 vs 10) is not run; one policy, one task.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2610.32102&#34;&gt;arXiv 2610.32102&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; no code link found&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-21&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-not-proven&#34;&gt;not proven&lt;/span&gt; two Euler steps below ten Euler steps on action-cloud radius — theirs R(2)/R(10) 0.51 · ours R(2)/R(10) 0.78 &lt;small&gt;(paper Proposition 1; §III-D (R(2)/R(10) = 0.51 on π0))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; two Euler steps below ten Euler steps on ms per chunk on the Orin NX — theirs 14.3 → 2.6 ms per step · ours 196.1 vs 237.5 ms &lt;small&gt;(paper Table I (14.3 → 2.6 ms per control step, A100))&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no. A1 on the Orin NX at 25 W (PyTorch); A2 and A4 at MAXN_SUPER + jetson_clocks and at 25 W (vla.cpp). Cost: $0; A2 and the MAXN half of A4 re-run once. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-30-paper-vs-hardware-horizon-depth&#34;&gt;2026-10-30-paper-vs-hardware-horizon-depth&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-30 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-30&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;&lt;em&gt;Coupling Execution Horizon and Sampling Depth in Flow-Matching VLA Policies&lt;/em&gt; (Yang et al., arXiv 2610.32102) says that when a robot commits to a long chunk, two Euler steps are as good as ten and much cheaper. My SO-101 already runs SmolVLA with its whole 50-step chunk committed, so the claim lands on its default setting.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A flow-matching policy draws an action chunk by integrating from noise in N Euler steps. With few steps the samples cluster: the paper&#39;s Proposition 1 says the cloud contracts around an unchanged centroid, so under long open-loop commitment, where averaging out sample noise matters, N = 2 matches N = 10. On π0 the cloud&#39;s radius falls to 0.51 of N = 10&#39;s with a 3.2 % centroid shift, the per-step latency drops from 14.3 to 2.6 ms on an A100, and the authors add that N = 2 avoids thermal throttling on edge GPUs. Real-robot results are on a Franka Research 3.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;SmolVLA (10 Euler steps, H = 50, the checkpoint behind every vla.cpp number here) on 20 frames from the bowls episodes. Bars frozen before any number:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;A1, mechanism:&lt;/strong&gt; median R(2)/R(10) ≤ 0.70, with the centroid within 0.05 relative and 3°; fail above 0.85.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;A2, latency on the Orin:&lt;/strong&gt; N = 2 ≤ 0.85 × N = 10, with N = 10 within 5 % of the 238 ms reference.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;A4, thermal:&lt;/strong&gt; 10 minutes at N = 10, 10 idle, 10 at N = 2, at full power and at 25 W; throttling = the GPU clock 5 % below its first minute for 10 s.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The arm test (success at N = 2 vs 10) runs only if A1 and A2 pass.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This rig&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;cloud radius, N = 2 / N = 10&lt;/td&gt; &lt;td&gt;0.51&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0.78&lt;/strong&gt; (CI 0.73–0.81)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;centroid shift&lt;/td&gt; &lt;td&gt;3.2 %&lt;/td&gt; &lt;td&gt;1.8 %, 2.35°&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;inference saving with N = 2&lt;/td&gt; &lt;td&gt;14.3 → 2.6 ms per step (A100)&lt;/td&gt; &lt;td&gt;&lt;strong&gt;237.5 → 196.1 ms&lt;/strong&gt; per chunk (Orin NX)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;thermal throttling at N = 10&lt;/td&gt; &lt;td&gt;&#34;eliminated&#34; by N = 2&lt;/td&gt; &lt;td&gt;&lt;strong&gt;none&lt;/strong&gt; at full power or at 25 W&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;A1 is not proven: two steps do contract the cloud around a nearly unchanged centroid, but by 22 %, not 49 %, and the confidence interval sits between the bar and the fail line. A2 passes, barely, and for a reason the paper&#39;s A100 hides: on the Orin a chunk is 151 ms of vision, 15 ms of prefill and 5.3 ms per denoise step, so cutting 8 of 10 steps saves 41 ms. A4 has nothing to act on: one chunk every 1.67 s never throttled the Orin, the GPU staying at 1,173 MHz and under 69 °C.&lt;/p&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The mechanism is there but weaker on a 450M policy, and the cost it removes is a small slice of an edge chunk: the vision encoder dominates, so the denoising budget is not where the Orin&#39;s time goes. Because A1 did not pass, the arm test did not run and SmolVLA stays at ten steps.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; not proven.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; a policy whose denoising dominates the chunk (larger action expert, cheaper vision), or an arm test showing N = 2 keeps success, which the protocol only runs after A1 passes.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no. A1 on the Orin NX at 25 W (PyTorch); A2 and A4 at MAXN_SUPER + jetson_clocks and at 25 W. Cost: $0. A2 and the full-power A4 were re-run once (a root-owned results folder; a tegrastats format without the GPU clock).&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-30-paper-vs-hardware-horizon-depth&#34;&gt;2026-10-30-paper-vs-hardware-horizon-depth&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 21 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-pact-vla/&#34;&gt;← Papers tested 20: PACT-VLA&lt;/a&gt; · &lt;a href=&#34;../../31/paper-vs-hardware-remora/&#34;&gt;Papers tested 22: REMORA →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/30/paper-vs-hardware-horizon-depth/</link> <pubDate>Fri, 30 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/30/paper-vs-hardware-horizon-depth/</guid> </item> <item> <title>PACT-VLA</title> <description>&lt;h1 id=&#34;pact-vla&#34;&gt;PACT-VLA&lt;a class=&#34;headerlink&#34; href=&#34;#pact-vla&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said choosing among several motion chunks with the newest camera frame adds no delay. On recorded runs we tested the choice, and on the robot&amp;#x27;s computer the delay. The choice helped, but a full cycle took 1,200 ms, 37 control ticks instead of 8.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Delay in control ticks (lower is better): naive async 8 ticks; PACT 37 ticks; bar ≤ naive&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Delay in control ticks (lower is better): naive async 8 ticks; PACT 37 ticks; bar ≤ naive&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;33.8&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;naive async&lt;/text&gt;&lt;text x=&#34;155.8&#34; y=&#34;40&#34;&gt;8 ticks&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;156.2&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;PACT&lt;/text&gt;&lt;text x=&#34;278.2&#34; y=&#34;66&#34;&gt;37 ticks&lt;/text&gt;&lt;line x1=&#34;151.8&#34; y1=&#34;20&#34; x2=&#34;151.8&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;151.8&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar ≤ naive&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;On a Jetson, do not sample several chunks per decision: each costs a full chunk. Keep single-chunk execution until the engine batches samples.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Offline: −0.27° against a random pick, with the interval below zero. Verification time is projected, as vla.cpp has no velocity query; the transfer test was not computable; no arm run.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 20 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Under asynchronous execution, sample several candidate chunks and keep the one the frozen policy finds most consistent with the newest observation before the switch, with no verifier to train and no added control-step delay; shown on Kinetix, LIBERO and a bimanual PiperX.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Selecting by flow residual under the pre-commit observation picks better chunks than a random pick or the stale observation. &lt;small&gt;(Appendix D.2; Fig. 4)&lt;/small&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt;&lt;/li&gt; &lt;li&gt;The selection adds no control-step delay, because the extra pass overlaps with execution. &lt;small&gt;(§3 (pipelining), Table 4)&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; Picking among N sampled chunks by their flow residual under the pre-commit observation fits what happens next better than a random or stale pick, with no added control-step delay. · &lt;strong&gt;Bar:&lt;/strong&gt; PACT beats a random pick and the stale-observation residual at d = 8 (CIs &amp;lt; 0); its delay on the Orin ≤ the naive delay; at that delay it still beats a single sample. · &lt;strong&gt;n:&lt;/strong&gt; 20 episodes, 254 boundaries per delay&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; bimanual PiperX 82.0 % vs naive async 60.0 %; no added control-step delay on the evaluated GPUs (generation 35–49 ms, with verification 59–65 ms, both d = 2 at 30 Hz, Table 4) vs offline −0.27° vs random and vs the stale residual (both CIs &amp;lt; 0); on the Orin 1,200 ms per cycle, 37 control ticks vs 8 · &lt;strong&gt;Not proven:&lt;/strong&gt; The verification time is projected (vla.cpp has no velocity query); at the measured delay a 50-step chunk cannot fill the executed window, so the transfer clause is not computable; no arm run.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2610.28019&#34;&gt;arXiv 2610.28019&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; no code link found&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-20&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; PACT selection below random pick on executed-window error — theirs +0.44 points over random (Kinetix); 82.0 vs 60.0 % (PiperX) · ours −0.27° error vs a random pick (CI −0.44 to −0.09) &lt;small&gt;(paper Appendix D and Fig. 4)&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; PACT cycle equals naive async cycle on control-step delay — theirs no added delay · ours 37 ticks vs 8 &lt;small&gt;(paper (&amp;quot;no added control-step delay&amp;quot; on the evaluated hardware; Table 4: generation 35–49 ms, with verification 59–65 ms, both d = 2))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; PACT cycle above naive async cycle on control-step delay · ours 37 ticks vs 8 &lt;small&gt;(our measured comparison)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no. Gate B on the Orin NX at 25 W (PyTorch); gate A on the Orin at MAXN_SUPER + jetson_clocks. Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-30-paper-vs-hardware-pact&#34;&gt;2026-10-30-paper-vs-hardware-pact&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-30 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-30&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;&lt;em&gt;PACT-VLA: Speculative Action-Chunk Verification with Pre-Commit Observations&lt;/em&gt; (Zhu et al., arXiv 2610.28019) samples several chunks and keeps the one the policy itself finds most consistent with the latest frame before the switch, &#34;with no added control-step delay&#34;. The selection works on my recorded episodes. The delay is where it breaks on a Jetson.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Under asynchronous execution the robot keeps moving while the next chunk is computed, so the chunk is planned from a stale frame. PACT generates N = 4 candidates, then scores each with the policy&#39;s own flow residual (FlowRes) under the &lt;strong&gt;pre-commit&lt;/strong&gt; observation, the frame one control step before the switch, and keeps the lowest. On a bimanual AgileX PiperX with π0.5 it reaches 82.0 % against 60.0 % for naive async, at 35–49 ms per chunk on an RTX 5090 or H100, and the extra pass is hidden by overlap.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;SmolVLA on the same 20 recorded bowls episodes, 254 chunk boundaries per delay, four candidates per boundary. Bars frozen before any number:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;B-P1 / B-P2:&lt;/strong&gt; at a delay of 8 steps (238 ms at 30 Hz, this rig&#39;s real delay), PACT&#39;s chunk is closer to what was actually executed than a random pick, and than the same residual under the stale frame (episode bootstrap, CI entirely below 0).&lt;/li&gt; &lt;li&gt;&lt;strong&gt;A:&lt;/strong&gt; on the Orin at full power, PACT&#39;s cycle adds no control step: d_PACT ≤ d_naive (fail if two or more).&lt;/li&gt; &lt;li&gt;&lt;strong&gt;B-P3:&lt;/strong&gt; at the delay PACT actually costs on the Orin, it still beats a single sample.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Checks before reading any number: candidate 0 bit-identical to a single sample, the recorded future scored below the median candidate on 68 % of boundaries (bar 60 %), and a shuffled observation does not pass B-P1.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This rig&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;selection vs random pick&lt;/td&gt; &lt;td&gt;+0.44 points (Kinetix, one decision); 82.0 vs 60.0 % on the robot&lt;/td&gt; &lt;td&gt;&lt;strong&gt;−0.27°&lt;/strong&gt; error (CI −0.44 to −0.09)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;selection vs stale-frame residual&lt;/td&gt; &lt;td&gt;stale = random (Kinetix)&lt;/td&gt; &lt;td&gt;&lt;strong&gt;−0.27°&lt;/strong&gt; (CI −0.48 to −0.09); stale = random here too&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;cycle time&lt;/td&gt; &lt;td&gt;35–49 ms per chunk, extra pass overlapped&lt;/td&gt; &lt;td&gt;&lt;strong&gt;1,200 ms&lt;/strong&gt; vs 237 ms&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;control-step delay&lt;/td&gt; &lt;td&gt;none added&lt;/td&gt; &lt;td&gt;&lt;strong&gt;37 ticks vs 8&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;B-P1 and B-P2 pass: choosing with the fresher frame picks better chunks, and the residual under the stale frame is no better than chance, as the paper&#39;s own appendix found. The fresher observation does the work.&lt;/p&gt; &lt;p&gt;A fails by 29 ticks. vla.cpp has no batched sampler, so the four candidates are four chunk inferences (950 ms), plus a second vision and prefill pass on the pre-commit frame (166 ms) and the verification (85 ms, projected from a PyTorch ratio because vla.cpp has no velocity query). The Orin&#39;s GPU is already 94–98 % busy during a chunk, so nothing overlaps. B-P3 cannot be computed as written: at a 37-step delay, a 50-step chunk holds only 13 of the 25 steps PACT would have to execute.&lt;/p&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The idea is sound and the selection signal is real on a 450M policy and a ≈ €1,350 rig. &#34;No added delay&#34; is a property of a desktop GPU with spare capacity: on an edge GPU running at capacity, every candidate and the second pass are paid in sequence.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; the selection replicates offline; the paper&#39;s no-delay claim fails on the Orin, so PACT does not transfer to this rig.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; batched sampling and a velocity query in vla.cpp, which would make the cycle closer to one chunk plus a pass.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no. Gate B on the Orin NX at 25 W (PyTorch); gate A on the Orin at MAXN_SUPER + jetson_clocks. Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-30-paper-vs-hardware-pact&#34;&gt;2026-10-30-paper-vs-hardware-pact&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 20 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-adaptive-chunking/&#34;&gt;← Papers tested 19: Adaptive Action Chunking (AAC)&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-horizon-depth/&#34;&gt;Papers tested 21: Horizon × depth (Euler steps vs execution horizon) →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/30/paper-vs-hardware-pact-vla/</link> <pubDate>Fri, 30 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/30/paper-vs-hardware-pact-vla/</guid> </item> <item> <title>LeJEPA identifiability</title> <description>&lt;h1 id=&#34;lejepa-identifiability&#34;&gt;LeJEPA identifiability&lt;a class=&#34;headerlink&#34; href=&#34;#lejepa-identifiability&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a world model trained on goal-directed runs recovers the true robot state only partly and unevenly. On our arm we compared its internal numbers with the joint angles the arm logs. It held: it explained 0.565 of the joints&amp;#x27; variance on average, 0.91 at the shoulder, 0.27 at the wrist.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Joints read from the latent, mean R²: W1 (LeJEPA) 0.565; frozen DINOv2-S 0.867; bar &amp;lt; 0.80&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Joints read from the latent, mean R²: W1 (LeJEPA) 0.565; frozen DINOv2-S 0.867; bar &amp;lt; 0.80&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;107.4&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;W1 (LeJEPA)&lt;/text&gt;&lt;text x=&#34;229.4&#34; y=&#34;40&#34;&gt;0.565&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;164.8&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;frozen DINOv2-S&lt;/text&gt;&lt;text x=&#34;286.8&#34; y=&#34;66&#34;&gt;0.867&lt;/text&gt;&lt;line x1=&#34;270.0&#34; y1=&#34;20&#34; x2=&#34;270.0&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;270.0&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar &amp;lt; 0.80&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;If you read the arm&amp;#x27;s state from such a world model, check each joint before relying on it. Some joints are recovered poorly.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Measured on 8 447 validation frames from 25 episodes, two models. The random-walk side of the claim, with new data on the arm and a retrain, is not run.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 17 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Derive the conditions under which a JEPA trained with SIGReg recovers the true latent state of the system, and show where goal-directed data breaks that recovery.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;On goal-directed trajectory data, recovery of the true state is partial and anisotropic. &lt;small&gt;(§6.2, Table 2 (DMC Reacher trajectories))&lt;/small&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Under an isotropic random walk the latent recovers the state up to a linear map. &lt;small&gt;(§5.1, Theorem 1; §6.2, Table 2 (OU pairs R² = 0.95))&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A SIGReg JEPA trained on goal-directed data recovers the true latent state only partially and unevenly. · &lt;strong&gt;Bar:&lt;/strong&gt; W1&#39;s mean R² from latent to joints &amp;lt; 0.80; anisotropy (max − min per-joint R²) ≥ 0.20; the higher-R² model has the higher G1b top-1. · &lt;strong&gt;n:&lt;/strong&gt; 8 447 validation frames, 25 episodes; 2 models&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; anisotropic recovery on trajectory data, identifiable under isotropic random walks (simulation) vs W1 mean R² 0.565, anisotropy 0.639 (shoulder lift 0.91, wrist flex 0.27); frozen DINOv2-S 0.867 / 0.301 · &lt;strong&gt;Not proven:&lt;/strong&gt; The random-walk side (gate 1: random-walk data on the arm and a retrain) is not run; B3 compares two models.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2605.26379&#34;&gt;arXiv 2605.26379&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; no code link found&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-17&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; SIGReg JEPA latent below pass mark on latent-to-joints R² — theirs anisotropic recovery on trajectory data (simulation) · ours 0.565 &lt;small&gt;(paper §6.2, Table 2)&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; SIGReg JEPA latent at least pass mark on per-joint R² anisotropy — theirs anisotropic (simulation) · ours 0.639 &lt;small&gt;(paper §6.2, Table 2)&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;claim-untested&#34;&gt;&lt;span class=&#34;pill pill-not-tested&#34;&gt;not tested&lt;/span&gt; SIGReg JEPA latent equals pass mark on latent-to-joints R² — theirs identifiable (simulation) &lt;small&gt;(paper §5.1 Theorem 1; §7)&lt;/small&gt;&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0. One extraction redone after a red-channel bug. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-29-paper-vs-hardware-lejepa&#34;&gt;2026-10-29-paper-vs-hardware-lejepa&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-29 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-29 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#m-red-channel&#34;&gt;A one-timestamp indexing bug, found by a consistency check →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;&lt;em&gt;When Does LeJEPA Learn a World Model?&lt;/em&gt; (Klindt, LeCun, Balestriero; arXiv 2605.26379) asks when a SIGReg JEPA&#39;s latent recovers the true state of the system. A robot arm logs that state for free: the joint positions. So on my SO-101 I can measure directly what the paper could only measure in simulation.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The theory says a SIGReg-trained JEPA recovers the true latent up to a linear map when the data moves through state space like an isotropic random walk. When the data is goal-directed, as in demonstrations, recovery becomes anisotropic: the directions the task moves along a lot are recovered well, the rest poorly. The paper checks this in simulation (DMC Reacher), where the true state is known.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;W1 is my multi-view LeWM, trained with SIGReg on teleoperated bowls demonstrations: goal-directed data, the case the paper predicts goes anisotropic. I fitted a ridge regression from W1&#39;s latent to the six logged joints on 17,724 training frames and scored R² on 8,447 validation frames from 25 held-out episodes. The comparison is a frozen DINOv2-S encoder (W2′), which was never trained on this data.&lt;/p&gt; &lt;p&gt;Three bars, frozen before any latent was computed: &lt;strong&gt;B1&lt;/strong&gt; W1&#39;s mean R² stays below 0.80 (recovery is partial); &lt;strong&gt;B2&lt;/strong&gt; W1&#39;s anisotropy, the gap between its best and worst joint, is at least 0.20; &lt;strong&gt;B3&lt;/strong&gt; the model with the higher R² also ranks action chunks better (G1b top-1).&lt;/p&gt; &lt;p&gt;My first extraction fed both encoders the red channel only (a one-timestamp indexing bug). I found it on a later run, fixed it and re-extracted. The verdict didn&#39;t change; the numbers below are the corrected ones.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;W1 (SIGReg LeWM, teleop)&lt;/th&gt; &lt;th&gt;W2′ (frozen DINOv2-S)&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;mean R², latent → joints&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0.565&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;0.867&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;per joint: pan / lift / elbow / wrist flex / wrist roll / gripper&lt;/td&gt; &lt;td&gt;0.58 / 0.91 / 0.88 / 0.27 / 0.30 / 0.45&lt;/td&gt; &lt;td&gt;0.92 / 0.98 / 0.97 / 0.74 / 0.68 / 0.91&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;anisotropy (best − worst joint)&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0.639&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;0.301&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;G1b ranking top-1&lt;/td&gt; &lt;td&gt;0.605&lt;/td&gt; &lt;td&gt;0.646&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;B1, B2 and B3 are all met. W1 recovers the joints the task moves most (shoulder lift 0.91, elbow 0.88) and loses the ones it barely varies (wrist flex 0.27, wrist roll 0.30): the anisotropic recovery the paper predicts for trajectory data, on a real arm, with the true state logged.&lt;/p&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The direction of B3 holds, but it&#39;s two models, and both sit well below the action-only baseline on G1b (0.68–0.90). A 0.30 R² gap moved ranking by 0.04, so identifiability isn&#39;t what limits ranking here. The paper&#39;s other half, that an isotropic random walk would make W1&#39;s recovery even, needs new data on the arm and a retrain. That&#39;s gate 1, and it hasn&#39;t run.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; the anisotropic recovery reproduces on a real arm; the random-walk side is untested.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; a random-walk dataset of the same size on the arm, the same recipe retrained, and the same measurement.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0. One extraction redone after the red-channel bug.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-29-paper-vs-hardware-lejepa&#34;&gt;2026-10-29-paper-vs-hardware-lejepa&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 17 of 22.&lt;/strong&gt; &lt;a href=&#34;../../28/paper-vs-hardware-hwm/&#34;&gt;← Papers tested 16: HWM (hierarchical latent world models)&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-surveyor/&#34;&gt;Papers tested 18: SURVEYOR →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/29/paper-vs-hardware-lejepa/</link> <pubDate>Thu, 29 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/29/paper-vs-hardware-lejepa/</guid> </item> <item> <title>SURVEYOR</title> <description>&lt;h1 id=&#34;surveyor&#34;&gt;SURVEYOR&lt;a class=&#34;headerlink&#34; href=&#34;#surveyor&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a fixed distance threshold between imagined and reached states accepts good plans and rejects bad ones. On 69 real runs we measured that threshold in our world model. It did not hold: the threshold here is 1.249, not their 0.20, and it caught 3/8 failures.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Equivalence threshold τ (lower is better): paper 0.200; this rig 1.249; bar 0.40&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Equivalence threshold τ (lower is better): paper 0.200; this rig 1.249; bar 0.40&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;25.3&#34; height=&#34;14&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;paper&lt;/text&gt;&lt;text x=&#34;147.3&#34; y=&#34;40&#34;&gt;0.200&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;158.2&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;this rig&lt;/text&gt;&lt;text x=&#34;280.2&#34; y=&#34;66&#34;&gt;1.249&lt;/text&gt;&lt;line x1=&#34;168.7&#34; y1=&#34;20&#34; x2=&#34;168.7&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;168.7&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 0.40&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not copy a threshold tuned in simulation onto a real arm&amp;#x27;s world model. Measure it on your own runs: here it did not separate good from bad runs well enough.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Their drafter is not available, so the world model&amp;#x27;s own imagination stands in; no closed-loop planning. As a monitor: 3/8 at 6/42, against 0.560 with shuffled actions.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 18 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Let a latent-world-model planner consume drafted subgoals speculatively, accepting each step while the imagined and reached latents stay within a calibrated threshold; shown in simulation (PushT, Reacher, OGBench-Cube, Two-Room).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A threshold calibrated on task-equivalent state pairs (τ = 0.20) separates acceptable from unacceptable plan steps. &lt;small&gt;(method and experiments)&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;The accept rule keeps good drafted plans and rejects bad ones. &lt;small&gt;(experiments)&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A threshold on the imagined-vs-reached latent distance accepts good plans and rejects bad ones (τ = 0.20). · &lt;strong&gt;Bar:&lt;/strong&gt; τ below the 10th percentile of non-equivalent pairs and ≤ 0.40; as a monitor ≥ 5/8 failures at ≤ 2/42; ≥ 0.05 AUROC over a shuffled drafter. · &lt;strong&gt;n:&lt;/strong&gt; 69 rollouts (primary 50: 42 successes, 8 failures)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; τ = 0.20 in simulation (PushT, Reacher, OGBench-Cube, Two-Room) vs τ = 1.249 on W1 latents of 69 real rollouts; as a monitor 3/8 at 6/42 (S = 30), AUROC 0.756 vs shuffled 0.560 · &lt;strong&gt;Not proven:&lt;/strong&gt; FF-JEPA&#39;s diffusion drafter is not available (W1&#39;s own imagination stands in); no closed-loop planning.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://neurips.cc/virtual/2026/175857&#34;&gt;none (NeurIPS 2026 workshop)&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; no code link found&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-18&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; latent accept threshold at most pass mark on accept threshold τ — theirs τ = 0.20 · ours τ = 1.249 &lt;small&gt;(paper, τ = 0.20 (simulation))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; latent accept rule at least pass mark on failures caught — theirs simulation only · ours 3/8 at 6/42 &lt;small&gt;(paper (accepts good plans, rejects bad ones))&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-29-paper-vs-hardware-surveyor&#34;&gt;2026-10-29-paper-vs-hardware-surveyor&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-29 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-29&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;SURVEYOR (&lt;em&gt;Certified Speculative Plan Consumption for Latent World-Model Planning&lt;/em&gt;, a NeurIPS 2026 workshop paper) accepts a drafted plan step when the latent the world model imagined and the latent actually reached are close enough. Its encoder is the one released with LeWorldModel, the same recipe as my W1, so the accept rule can be tested on real rollouts.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A drafter proposes subgoals in latent space; the planner consumes them while the relative distance between imagined and reached latents stays below a threshold τ, calibrated on pairs of states that should count as equivalent. The paper&#39;s τ is 0.20. Everything is in simulation (PushT, Reacher, OGBench-Cube, Two-Room); there is no real robot.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Gate 0, τ.&lt;/strong&gt; On W1&#39;s latents of 69 real SO-101 rollouts, I calibrated τ the paper&#39;s way: the median relative distance between equivalent pairs (two at-rest success frames from different episodes). Bars: S1, τ must sit below the 10th percentile of non-equivalent pairs; S2, τ ≤ 0.40.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Gate 1, the accept rule as a failure monitor.&lt;/strong&gt; FF-JEPA&#39;s diffusion drafter isn&#39;t available, so W1&#39;s own imagination stands in for it, and a shuffled-drafter control checks whether the rule uses the plan at all. Bars: S3, at least 5 of 8 failures caught with at most 2 false interventions out of 42; S4, at least 0.05 AUROC above the shuffled drafter.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;τ&lt;/td&gt; &lt;td&gt;0.20&lt;/td&gt; &lt;td&gt;&lt;strong&gt;1.249&lt;/strong&gt; (non-equivalent pairs: p10 1.106)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;equivalent vs non-equivalent&lt;/td&gt; &lt;td&gt;separable&lt;/td&gt; &lt;td&gt;AUROC 0.71&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;monitor, S = 10 frames&lt;/td&gt; &lt;td&gt;—&lt;/td&gt; &lt;td&gt;1/8 caught at 1/42, AUROC 0.619 (shuffled 0.628)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;monitor, S = 30 frames&lt;/td&gt; &lt;td&gt;—&lt;/td&gt; &lt;td&gt;3/8 at 6/42, AUROC 0.756 (shuffled 0.560)&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;S1 and S2 fail: on real rollouts, two finished successes from different episodes are about as far apart in W1&#39;s latent as a success and a frame from mid-episode. The scene changes between episodes (bowl positions, lighting) dominate the distance. S3 fails at both step sizes. S4 is met at S = 30 only: over one second the discrepancy carries plan–execution signal beyond chance, but its warnings come after the failure onset.&lt;/p&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;In simulation, equivalent states look alike and τ can be small. On a real arm, the same latent puts &#34;done, in a different scene&#34; far from &#34;done&#34;: a threshold on latent distance has no operating point, and the accept rule becomes the seventh monitor here to miss the standing bar. The positive bit is S4 at one second: the discrepancy isn&#39;t noise, it just arrives late.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; fail on this arm.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; a latent where at-rest successes cluster across scenes (an object-centric or goal-conditioned one), and the real drafter.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-29-paper-vs-hardware-surveyor&#34;&gt;2026-10-29-paper-vs-hardware-surveyor&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 18 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-lejepa/&#34;&gt;← Papers tested 17: LeJEPA identifiability&lt;/a&gt; · &lt;a href=&#34;../../30/paper-vs-hardware-adaptive-chunking/&#34;&gt;Papers tested 19: Adaptive Action Chunking (AAC) →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/29/paper-vs-hardware-surveyor/</link> <pubDate>Thu, 29 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/29/paper-vs-hardware-surveyor/</guid> </item> <item> <title>How I re-test robot-learning papers: the gate protocol as it ran</title> <description>&lt;h1 id=&#34;how-i-re-test-robot-learning-papers-the-gate-protocol-as-it-ran&#34;&gt;How I re-test robot-learning papers: the gate protocol as it ran&lt;a class=&#34;headerlink&#34; href=&#34;#how-i-re-test-robot-learning-papers-the-gate-protocol-as-it-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know how our gate loop actually ran, not how it was meant to run. We went back over every gate in the log: bar committed, run, verdict, row, recompute folder. Of 74 gates, 20 failed their bar.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Write the pass rule down and commit it before any number. Apply the committed rule and nothing else. Log a row with bar, result, verdict and cost. Publish a folder that recomputes the number in seconds.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;A method post, covering only the parts that actually ran. The counts are as of 2026-10-29; the log has grown since. Verdicts use a fixed four-word vocabulary.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 13 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-method&#34;&gt;method&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; Bars committed before the run, a four-word verdict vocabulary, a judge at rest with 0 false positives, separate gos for money and arm time, costs with retries; the v1.5 harness has not run end to end. · &lt;strong&gt;n:&lt;/strong&gt; 74 gates, 16 papers, 55 work-stack items&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; That the protocol catches every error; the v1.5 harness, G24 and the data-engine fields have not run.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no; no new run. Every figure is recomputed from the experiment log, the register and the paper-vs-hardware folders. · &lt;strong&gt;Reproduce:&lt;/strong&gt; – · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-29 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-29&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;Every result on this site went through the same loop: write the pass rule down, commit it, run, apply the rule and nothing else, log the row, publish a folder that recomputes the number. That loop has produced 74 gates in the &lt;a href=&#34;../../../../../experiments/&#34;&gt;experiment log&lt;/a&gt;, and 20 failed their bar. This post is about the loop itself, and only about the parts of it that have actually run.&lt;/p&gt; &lt;!-- more --&gt; &lt;figure class=&#34;post-fig&#34; style=&#34;max-width:300px&#34;&gt; &lt;svg viewBox=&#34;0 0 300 300&#34; role=&#34;img&#34; aria-label=&#34;Gate lifecycle: bar committed, run, verdict, row in the log, folder with L0&#34; xmlns=&#34;http://www.w3.org/2000/svg&#34; style=&#34;font-family:inherit&#34;&gt; &lt;defs&gt;&lt;marker id=&#34;gp-a&#34; viewBox=&#34;0 0 10 10&#34; refX=&#34;5&#34; refY=&#34;9&#34; markerWidth=&#34;7&#34; markerHeight=&#34;7&#34; orient=&#34;0&#34;&gt;&lt;path d=&#34;M0 0 L10 0 L5 10 z&#34; fill=&#34;currentColor&#34;/&gt;&lt;/marker&gt;&lt;/defs&gt; &lt;g fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.2&#34;&gt; &lt;rect x=&#34;2&#34; y=&#34;4&#34; width=&#34;296&#34; height=&#34;44&#34; rx=&#34;6&#34;/&gt;&lt;rect x=&#34;2&#34; y=&#34;64&#34; width=&#34;296&#34; height=&#34;44&#34; rx=&#34;6&#34;/&gt; &lt;rect x=&#34;2&#34; y=&#34;124&#34; width=&#34;296&#34; height=&#34;44&#34; rx=&#34;6&#34;/&gt;&lt;rect x=&#34;2&#34; y=&#34;184&#34; width=&#34;296&#34; height=&#34;44&#34; rx=&#34;6&#34;/&gt; &lt;rect x=&#34;2&#34; y=&#34;244&#34; width=&#34;296&#34; height=&#34;44&#34; rx=&#34;6&#34;/&gt; &lt;/g&gt; &lt;g stroke=&#34;currentColor&#34; stroke-width=&#34;1.2&#34; marker-end=&#34;url(#gp-a)&#34;&gt; &lt;line x1=&#34;150&#34; y1=&#34;48&#34; x2=&#34;150&#34; y2=&#34;60&#34;/&gt;&lt;line x1=&#34;150&#34; y1=&#34;108&#34; x2=&#34;150&#34; y2=&#34;120&#34;/&gt; &lt;line x1=&#34;150&#34; y1=&#34;168&#34; x2=&#34;150&#34; y2=&#34;180&#34;/&gt;&lt;line x1=&#34;150&#34; y1=&#34;228&#34; x2=&#34;150&#34; y2=&#34;240&#34;/&gt; &lt;/g&gt; &lt;g fill=&#34;currentColor&#34; font-size=&#34;13&#34; text-anchor=&#34;middle&#34;&gt; &lt;text x=&#34;150&#34; y=&#34;23&#34; font-weight=&#34;700&#34;&gt;1 · bar committed&lt;/text&gt;&lt;text x=&#34;150&#34; y=&#34;40&#34; font-size=&#34;11.5&#34;&gt;protocol file, commit hash, before any number&lt;/text&gt; &lt;text x=&#34;150&#34; y=&#34;83&#34; font-weight=&#34;700&#34;&gt;2 · run&lt;/text&gt;&lt;text x=&#34;150&#34; y=&#34;100&#34; font-size=&#34;11.5&#34;&gt;only after the go for its money or its arm time&lt;/text&gt; &lt;text x=&#34;150&#34; y=&#34;143&#34; font-weight=&#34;700&#34;&gt;3 · verdict&lt;/text&gt;&lt;text x=&#34;150&#34; y=&#34;160&#34; font-size=&#34;11.5&#34;&gt;the committed rule applied, nothing else&lt;/text&gt; &lt;text x=&#34;150&#34; y=&#34;203&#34; font-weight=&#34;700&#34;&gt;4 · row in the log&lt;/text&gt;&lt;text x=&#34;150&#34; y=&#34;220&#34; font-size=&#34;11.5&#34;&gt;bar, result, verdict, cost, the commit it cites&lt;/text&gt; &lt;text x=&#34;150&#34; y=&#34;263&#34; font-weight=&#34;700&#34;&gt;5 · folder with L0&lt;/text&gt;&lt;text x=&#34;150&#34; y=&#34;280&#34; font-size=&#34;11.5&#34;&gt;recomputes the number in seconds&lt;/text&gt; &lt;/g&gt; &lt;/svg&gt; &lt;/figure&gt; &lt;h2 id=&#34;1-the-bar-goes-in-before-the-run&#34;&gt;1. The bar goes in before the run&lt;a class=&#34;headerlink&#34; href=&#34;#1-the-bar-goes-in-before-the-run&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A gate starts as a protocol file with the pass rule in it, committed before anything is computed, and the row in the log cites that commit. Three real ones:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;G-flora&lt;/strong&gt; (would a robot-trained reward model judge my rollouts?). The bar was committed at &lt;code&gt;1c50a5d&lt;/code&gt;: at the largest threshold that flags at most 2 of 42 successes, flag at least 6 of 8 failures. The image layout was amended at &lt;code&gt;179c1d6&lt;/code&gt;, also before the first call. Result: 8/8 failures at 2/42 successes, &lt;strong&gt;pass&lt;/strong&gt;. &lt;a href=&#34;../../../../../experiments/#exp-g-flora&#34;&gt;Row&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;AW-0 Phase 2&lt;/strong&gt; (a per-frame planner for task slices). The settings were fixed at &lt;code&gt;c8b8d96&lt;/code&gt; before any fit; the bar was 85 % per-frame accuracy and p95 ≤ 30 ms. Result: 75.7 % and 81.7 ms, &lt;strong&gt;fail&lt;/strong&gt; on both. &lt;a href=&#34;../../../../../experiments/#exp-aw-0-phase-2&#34;&gt;Row&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;HWM&lt;/strong&gt; (the hierarchical world-model crossover). Bars committed before training; the first run turned out to be fed red-only images, so a deviation note was added and the run redone. The bars stayed as they were. &lt;a href=&#34;../../28/paper-vs-hardware-hwm/&#34;&gt;Post&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The point of the hash is that anyone can check the bar&#39;s date against the result&#39;s date. When I change something after seeing data, it goes in its own file, and anything decided after the number is labelled exploratory or post-hoc.&lt;/p&gt; &lt;h2 id=&#34;2-four-verdicts-and-what-separates-fail-from-not-proven&#34;&gt;2. Four verdicts, and what separates fail from not proven&lt;a class=&#34;headerlink&#34; href=&#34;#2-four-verdicts-and-what-separates-fail-from-not-proven&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Each paper in the &lt;a href=&#34;../../../../../papers/&#34;&gt;register&lt;/a&gt; gets one of: &lt;strong&gt;reproduces&lt;/strong&gt;, &lt;strong&gt;fail&lt;/strong&gt;, &lt;strong&gt;not proven&lt;/strong&gt;, &lt;strong&gt;not tested&lt;/strong&gt; (plus withdrawn, for my own mistakes). The count of each verdict is on the register&#39;s scoreboard, generated from the same file as the table.&lt;/p&gt; &lt;p&gt;The line between fail and not proven is whether the miss could be explained by something the run did not control. RoboJEPA is a clean fail: the 300M model got 11.8 % below copy-last against a 15 % bar, on the setup the bar was written for, and nothing in the run argued for a different reading. HWM is not proven: its high-level model never beat the low level, but it was trained on about 0.6 h of one task against the paper&#39;s ~130 h, and its error sat barely below predicting the average latent. An open confound like that makes it not proven rather than fail, even though two of its three bars were missed.&lt;/p&gt; &lt;h2 id=&#34;3-the-judge-at-rest&#34;&gt;3. The judge at rest&lt;a class=&#34;headerlink&#34; href=&#34;#3-the-judge-at-rest&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Most gates need an outcome per trial. G9c-3 is the deterministic judge that gives it: top camera, arm at rest, a fixed rule. On the test split it scored &lt;strong&gt;94.3 %&lt;/strong&gt; on 87 judged episodes, with &lt;strong&gt;0 false positives&lt;/strong&gt; and 5 false negatives (&lt;a href=&#34;../../../../../experiments/#exp-g9c-3&#34;&gt;row&lt;/a&gt;, &lt;a href=&#34;../../16/judging-a-rollout-the-zero-false-positive-rule/&#34;&gt;post&lt;/a&gt;).&lt;/p&gt; &lt;p&gt;Its own bar was 95 %, so it missed by 0.7 points, and the row says so. It was still adopted, because the number that matters for anything that learns from rollouts is false positives: a failure judged as a success goes into the data as a demonstration. A false negative only costs a trial. Judged only at rest also means the verdict never depends on a frame where the arm is moving.&lt;/p&gt; &lt;p&gt;The same reasoning sets the rule for weaker judges (a VLM, a learned scorer): they never decide alone, they pair with a deterministic check, and they earn a place per task through a report card of false positives, false negatives and ambiguous calls against my labels.&lt;/p&gt; &lt;h2 id=&#34;4-what-is-recorded-per-trial&#34;&gt;4. What is recorded per trial&lt;a class=&#34;headerlink&#34; href=&#34;#4-what-is-recorded-per-trial&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;What has actually been recorded on robot days: per trial, the policy, the engine, latency (p50, p99, mean), control rate, VRAM, the condition, success and failure mode, plus video. Those CSVs sit in each folder&#39;s &lt;code&gt;expected/&lt;/code&gt; directory. The 69 rollouts behind most monitor gates are public with their outcome labels. One rule runs through all of it: nothing is trained on failed rollouts; failures only feed verifiers and the world model.&lt;/p&gt; &lt;h2 id=&#34;5-the-work-stack&#34;&gt;5. The work stack&lt;a class=&#34;headerlink&#34; href=&#34;#5-the-work-stack&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Gates run through a queue: one item per task, each with what it &lt;code&gt;needs&lt;/code&gt; (offline, vast, arm, rig), what it &lt;code&gt;depends&lt;/code&gt; on, a prompt file that is the whole brief, and a stop point. When this was written (29 October) it held 55 items: 37 done, and 8 waiting on the arm or the rig.&lt;/p&gt; &lt;p&gt;Nothing that costs money or moves the arm runs on its own. Each needs its own explicit go: &lt;code&gt;go vast WS-NNN&lt;/code&gt; with a cost cap per item, &lt;code&gt;go arm WS-NNN&lt;/code&gt; for arm time, &lt;code&gt;go rig&lt;/code&gt; for staging, &lt;code&gt;go&lt;/code&gt; for publishing. They are separate because they fail differently: a wrong spend is recoverable, a wrong arm motion may not be, and a publish can&#39;t be taken back.&lt;/p&gt; &lt;h2 id=&#34;6-cost-per-result-retries-included&#34;&gt;6. Cost per result, retries included&lt;a class=&#34;headerlink&#34; href=&#34;#6-cost-per-result-retries-included&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Every post ends with a compute block: external GPU yes or no, the dollar figure, and the retries. The register&#39;s tested papers add up to $45 of GPU and API. Across all published folders it is $46.3–47.3 on vast.ai and $4.9–5.9 of API. Those totals include the failed starts, the hosts that never connected and the runs I threw away, like HWM&#39;s red-only first run. That is the number a reader would pay to repeat the work, so it is the one I publish.&lt;/p&gt; &lt;h2 id=&#34;7-three-levels-of-replication&#34;&gt;7. Three levels of replication&lt;a class=&#34;headerlink&#34; href=&#34;#7-three-levels-of-replication&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Every result has a folder in &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware&#34;&gt;paper-vs-hardware&lt;/a&gt;:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;L0:&lt;/strong&gt; recompute the post&#39;s numbers from the small files in the folder, in seconds, on a CPU. There are 23 folders and all 23 pass their L0 check.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;L1:&lt;/strong&gt; rerun the analysis from the pinned inputs (checkpoints, datasets, scripts).&lt;/li&gt; &lt;li&gt;&lt;strong&gt;L2:&lt;/strong&gt; rerun on hardware. The protocol is in the post; the folder does not claim it is re-verified.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;what-it-does-not-have-yet&#34;&gt;What it does not have yet&lt;a class=&#34;headerlink&#34; href=&#34;#what-it-does-not-have-yet&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;The v1.5 harness has not run end to end on the arm.&lt;/strong&gt; It is specified and partly built, and tested on simulated hardware only. Nothing on this site describes it as working.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The adoption protocol (G24) has not run,&lt;/strong&gt; and there is no autonomous loop in service.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The data-engine fields (layout ids, executor per trial, a curated &lt;code&gt;demos/&lt;/code&gt; view) are proposed, not recorded.&lt;/strong&gt; The LEGO verdict now comes from camera masks, and its verifier card has not run either.&lt;/li&gt; &lt;li&gt;Gates from the v0.8–v1.1 era say so in their rows; the vocabulary and the judge above are the parts that carried through.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;That is the same discipline as the rest: the register lists what ran, at the bar it was given.&lt;/p&gt; &lt;p&gt;The &lt;a href=&#34;../../../../../experiments/&#34;&gt;experiment log&lt;/a&gt; has every row; the &lt;a href=&#34;../../../../../papers/&#34;&gt;register&lt;/a&gt; has every paper; the &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware&#34;&gt;folders&lt;/a&gt; recompute every number.&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 13 of 14.&lt;/strong&gt; &lt;a href=&#34;../../26/audit-your-labels-where-they-matter/&#34;&gt;← Evaluation and judges 12: Audit your labels where they matter: a VLM labeller that is right on average&lt;/a&gt; · &lt;a href=&#34;../vla-jepa-surprise-robot-day/&#34;&gt;Evaluation and judges 14: VLA-JEPA&#39;s surprise as a failure warning: a robot day with nothing to warn about →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/29/the-gate-protocol-as-it-ran/</link> <pubDate>Thu, 29 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/29/the-gate-protocol-as-it-ran/</guid> </item> <item> <title>VLA-JEPA&#39;s surprise as a failure warning: a robot day with nothing to warn about</title> <description>&lt;h1 id=&#34;vla-jepas-surprise-as-a-failure-warning-a-robot-day-with-nothing-to-warn-about&#34;&gt;VLA-JEPA&#39;s surprise as a failure warning: a robot day with nothing to warn about&lt;a class=&#34;headerlink&#34; href=&#34;#vla-jepas-surprise-as-a-failure-warning-a-robot-day-with-nothing-to-warn-about&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if a policy&amp;#x27;s own world model is surprised before it fails on the arm. We ran it on sealed layouts, some with the bowls moved, with the bar fixed first. It succeeded on 20 of 20, so there was no failure to warn about.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;This policy completes the bowls task even with both bowls moved 3–6 cm. The task is too easy to test a failure monitor. A harder layout set comes next, with its own bar.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Not proven: 0 failures, below the 6 the bar required before scoring. The owner stopped at 20 of 60 rollouts: 6 failures in the rest was about 1–2 % likely. No monitor was scored, so this says nothing about the surprise signal.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 14 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-method&#34;&gt;method&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; Not proven: VLA-JEPA completed 20 of 20 sealed layouts (9 off-nominal), so there was no failure for its surprise to warn about. · &lt;strong&gt;n:&lt;/strong&gt; 20 rollouts on the arm, 0 failures&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; Whether VLA-JEPA&#39;s surprise warns before a failure; a harder layout set is next.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX, arm). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-29-vla-jepa-surprise-robot-day&#34;&gt;2026-10-29-vla-jepa-surprise-robot-day&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-29 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-29&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;VLA-JEPA carries its own world model. If that model is surprised when a grasp goes wrong, the policy could warn about its own failures with no extra network. I set a robot day up to test it, and the policy didn&#39;t fail once.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;the-question&#34;&gt;The question&lt;a class=&#34;headerlink&#34; href=&#34;#the-question&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Does VLA-JEPA&#39;s own world-model surprise warn before a failure on the arm, earlier or more reliably than W1&#39;s surprise, a joint-stall rule, elapsed time and the REAP risk head? The bar was frozen on 2026-10-25, before the robot day, together with the scorer and a sealed list of 60 layouts across 30 strata, nominal (teleop positions) and off-nominal (each bowl shifted 3–6 cm). A warning only counts if it comes before the failure onset marked by the owner, and the bar needs &lt;strong&gt;at least 6 failures&lt;/strong&gt; before any monitor is scored.&lt;/p&gt; &lt;h2 id=&#34;what-happened&#34;&gt;What happened&lt;a class=&#34;headerlink&#34; href=&#34;#what-happened&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;On 2026-10-27 VLA-JEPA (checkpoint &lt;code&gt;c65c98b&lt;/code&gt;, Orin NX at MAXN_SUPER, sync loop) ran the sealed layouts in order, the owner placing the bowls and calling each outcome at rest.&lt;/p&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;rollouts&lt;/th&gt; &lt;th&gt;success&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;teleop positions&lt;/td&gt; &lt;td&gt;11&lt;/td&gt; &lt;td&gt;11&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;bowls shifted 3–6 cm&lt;/td&gt; &lt;td&gt;9&lt;/td&gt; &lt;td&gt;9&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;all&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;20&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;The owner stopped at rollout 20 instead of 60: with no failure in 13 (and one in 10 on the earlier gate), reaching 6 failures in the remaining 47 was about 1–2 % likely, and the bar&#39;s branch for fewer than 6 failures doesn&#39;t depend on the rollouts not run.&lt;/p&gt; &lt;h2 id=&#34;verdict&#34;&gt;Verdict&lt;a class=&#34;headerlink&#34; href=&#34;#verdict&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Not proven: too few failures (0 &amp;lt; 6).&lt;/strong&gt; No monitor was scored, so this says nothing yet about VLA-JEPA&#39;s surprise.&lt;/p&gt; &lt;p&gt;What the day does show: this VLA-JEPA completes the bowls task on 20 of 20 sealed layouts, including 9 with both bowls off their teleop positions. The task is too easy to produce the failures a monitor needs. The next step is a harder layout set, with its own bar written before the run, and we&#39;ll come back to it then.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX, arm). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-29-vla-jepa-surprise-robot-day&#34;&gt;2026-10-29-vla-jepa-surprise-robot-day&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 14 of 14.&lt;/strong&gt; &lt;a href=&#34;../the-gate-protocol-as-it-ran/&#34;&gt;← Evaluation and judges 13: How I re-test robot-learning papers: the gate protocol as it ran&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/29/vla-jepa-surprise-robot-day/</link> <pubDate>Thu, 29 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/29/vla-jepa-surprise-robot-day/</guid> </item> <item> <title>HWM (hierarchical latent world models)</title> <description>&lt;h1 id=&#34;hwm-hierarchical-latent-world-models&#34;&gt;HWM (hierarchical latent world models)&lt;a class=&#34;headerlink&#34; href=&#34;#hwm-hierarchical-latent-world-models&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a second, coarser world model predicts further ahead than the fine one beyond about one second. On our data we trained both levels and compared their errors up to 2 seconds. Not proven: the coarse level never beat the fine one, with error 0.759 against 0.563 at 2 seconds.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Prediction error at 2 s (lower is better): W1, step by step 0.563; high level, learned 0.759; bar 0.95 × W1&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Prediction error at 2 s (lower is better): W1, step by step 0.563; high level, learned 0.759; bar 0.95 × W1&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;106.9&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;W1, step by step&lt;/text&gt;&lt;text x=&#34;228.9&#34; y=&#34;40&#34;&gt;0.563&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;144.3&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;high level, learned&lt;/text&gt;&lt;text x=&#34;266.3&#34; y=&#34;66&#34;&gt;0.759&lt;/text&gt;&lt;line x1=&#34;219.6&#34; y1=&#34;20&#34; x2=&#34;219.6&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;219.6&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 0.95 × W1&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Nothing to change on a small arm: with under an hour of one task, the coarse model did not help. It may need far more data.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;About 0.6 h of one task against their ~130 h, so data scale is not separated from the method. The baselines and the overfitting reading are post-hoc.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 16 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Plan long manipulation tasks with a two-level world model: a high level over learned macro-actions proposes waypoints, a low level plans primitive actions toward them; shown on a real Franka trained on about 130 hours of DROID and RoboSet.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Beyond about one second, the high-level model predicts the future latent better than the low-level model. &lt;small&gt;(Fig. 6 (crossover near 1.25 s))&lt;/small&gt; &lt;span class=&#34;pill pill-not-proven&#34;&gt;not proven&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Learned macro-actions align with the true motion better than a handcrafted delta-pose summary. &lt;small&gt;(Table 4b (cosine 0.88 vs 0.80))&lt;/small&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Hierarchical planning succeeds on real pick-and-place where flat planning does not. &lt;small&gt;(§3.1, Table 1 (70 % vs 0 %))&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-not-proven&#34;&gt;not proven&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A high-level world model over learned macro-actions beats the low-level model beyond about 1 s (their Fig. 6 crossover). · &lt;strong&gt;Bar:&lt;/strong&gt; Crossover in [1.0, 2.0] s; at 2 s high-level error ≤ 0.95 × low-level; learned macro-actions ≥ net joint displacement on cosine. · &lt;strong&gt;n:&lt;/strong&gt; 700 val anchors, 25 episodes (157 train, ~0.6 h)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; low level better up to 1 s, high level from 1.5 s (Fig. 6; ≈ 0.367 vs 0.385 at 2 s, read off the plot); cosine 0.88 ± 0.03 vs 0.80 ± 0.02 vs no crossover: W1 0.382 ± 0.005 → 0.563 ± 0.007, high level 0.769 ± 0.009 → 0.759 ± 0.009 (0.73–2 s); cosine 0.608 ± 0.007 vs 0.551 ± 0.006 · &lt;strong&gt;Not proven:&lt;/strong&gt; Open confound: ~0.6 h of one task vs their ~130 h, so data scale is not separated from the method. Baselines and the overfitting reading are post-hoc.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2604.03208&#34;&gt;arXiv 2604.03208&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/kevinghst/HWM_PLDM&#34;&gt;kevinghst/HWM_PLDM&lt;/a&gt; (minimal implementation on PLDM, linked from the project page)&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-16&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-not-proven&#34;&gt;not proven&lt;/span&gt; high-level world model below low-level world model on latent error at 2 s — theirs 0.367 vs 0.385 at 2 s · ours 0.759 vs 0.563 at 2 s (ratio 1.35) &lt;small&gt;(paper §3.4, Fig. 6 (crossover between 1 s and 1.5 s; ≈ 0.367 vs 0.385 at 2 s, read off the plot))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; learned macro-actions at least net joint displacement on cosine to the true macro-action — theirs 0.88 vs 0.80 · ours 0.608 vs 0.551 &lt;small&gt;(paper §3.4, Table 4b (0.88 ± 0.03 vs 0.80 ± 0.02))&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai RTX 3090): ≈ $0.4, including the invalid first run. Latent extraction on the Orin NX: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-28-paper-vs-hardware-hwm&#34;&gt;2026-10-28-paper-vs-hardware-hwm&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-28 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-28 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#long-horizon&#34;&gt;I need a long-horizon latent predictor →&lt;/a&gt;, &lt;a href=&#34;../../../../../findings/#encode-chunk&#34;&gt;I need to encode an action chunk →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;HWM (Zhang, Terver, Zholus et al., FAIR at Meta / NYU / Mila / Brown; CoRL 2026, arXiv 2604.03208) stacks two latent world models: a low level over primitive actions, and a high level over learned macro-actions that jumps several seconds at once. The figure I could test offline is the one that says when each level wins. On my data the high level never wins, and I can&#39;t tell yet whether that is the method or the amount of data.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A transformer action encoder compresses the actions between two waypoints into one macro-action (its CLS token). The high-level predictor F⁽²⁾ takes (macro-action, waypoint latent) and predicts the next waypoint latent, trained with a teacher-forced ℓ1 loss on three waypoints sampled up to 4 s apart. At planning time the high level picks a subgoal and the low level plans primitive actions toward it.&lt;/p&gt; &lt;p&gt;The real-robot results are on a Franka Panda with a Robotiq gripper, trained on about 130 h of DROID and RoboSet: pick-and-place 70 % against 0 % for the flat planner. &lt;strong&gt;Figure 6&lt;/strong&gt; is the offline part: on held-out observations, the low-level model has the lower latent error up to about 1 s, the high level from about 1.5 s, and the curves cross near 1.25 s. Table 4b adds that learned macro-actions align better with the true motion than a handcrafted delta-pose summary (cosine 0.88 vs 0.80).&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Low level: W1, my multi-view LeWM, unchanged. High level: the paper&#39;s §2.1 recipe trained on W1&#39;s frozen latents, on my bowls data (182 episodes, 157 train / 25 val, about 0.6 h). Three versions that differ only in the action input: the learned encoder, the concatenated raw actions, and the net joint displacement over the chunk (my stand-in for delta-pose). Error is mean |ẑ − z| over W1&#39;s 192 latent dimensions on 700 val anchors.&lt;/p&gt; &lt;p&gt;Three bars, frozen before training: &lt;strong&gt;H1&lt;/strong&gt; a crossover between 1.0 and 2.0 s; &lt;strong&gt;H2&lt;/strong&gt; at 2 s, high-level error ≤ 0.95 × W1&#39;s; &lt;strong&gt;H3&lt;/strong&gt; learned macro-actions ≥ net displacement on cosine alignment.&lt;/p&gt; &lt;p&gt;The first run was wrong: my extraction script fed W1 the red channel only, three times. A check against my earlier W1 numbers caught it before scoring (W1 looked four times worse than copying the last frame, which it never was). I fixed it, checked that the new latents match the earlier W1 numbers, retrained, and scored only the second run.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;horizon&lt;/th&gt; &lt;th&gt;0.73 s&lt;/th&gt; &lt;th&gt;1.0 s&lt;/th&gt; &lt;th&gt;1.5 s&lt;/th&gt; &lt;th&gt;2.0 s&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;low level (W1 rollout)&lt;/td&gt; &lt;td&gt;0.382 ± 0.005&lt;/td&gt; &lt;td&gt;0.438 ± 0.006&lt;/td&gt; &lt;td&gt;0.511 ± 0.006&lt;/td&gt; &lt;td&gt;0.563 ± 0.007&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;high level, learned macro-actions&lt;/td&gt; &lt;td&gt;0.769 ± 0.009&lt;/td&gt; &lt;td&gt;0.766 ± 0.009&lt;/td&gt; &lt;td&gt;0.764 ± 0.009&lt;/td&gt; &lt;td&gt;0.759 ± 0.009&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;high level, net joint displacement&lt;/td&gt; &lt;td&gt;0.790 ± 0.005&lt;/td&gt; &lt;td&gt;0.793 ± 0.006&lt;/td&gt; &lt;td&gt;0.793 ± 0.006&lt;/td&gt; &lt;td&gt;0.799 ± 0.007&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Crossover (H1)&lt;/td&gt; &lt;td&gt;~1.25 s&lt;/td&gt; &lt;td&gt;none: the high level is above W1 at every horizon&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;2 s ratio, high / low (H2)&lt;/td&gt; &lt;td&gt;≈ 0.95&lt;/td&gt; &lt;td&gt;1.35&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Learned vs handcrafted cosine (H3)&lt;/td&gt; &lt;td&gt;0.88 ± 0.03 vs 0.80 ± 0.02&lt;/td&gt; &lt;td&gt;0.608 ± 0.007 vs 0.551 ± 0.006&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Training data&lt;/td&gt; &lt;td&gt;~130 h, DROID + RoboSet&lt;/td&gt; &lt;td&gt;~0.6 h, one task&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;H1 fails, H2 fails, H3 holds. The SEs are over anchors, and anchors from the same episode are correlated, so they are on the small side.&lt;/p&gt; &lt;h2 id=&#34;added-after-seeing-the-result&#34;&gt;Added after seeing the result&lt;a class=&#34;headerlink&#34; href=&#34;#added-after-seeing-the-result&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;None of this was in the protocol. I computed it to understand the numbers, and it should be read that way.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Copying the current latent gives 0.613 at 0.73 s and 0.954 at 2 s. Predicting the average training latent gives 0.81 at every horizon. The learned high level sits at 0.76, flat: barely better than the average, and better than copying only from about 1.3 s on.&lt;/li&gt; &lt;li&gt;Its last training loss was 0.15. That loss is not the same measurement as the val error, so the gap to 0.76 points to overfitting on 157 episodes without measuring it.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;My reading: the high level didn&#39;t learn anything that generalises from 0.6 h of one task, and W1, trained end to end on the same data, did. That fits &#34;the high level needs far more data than the low level&#34; just as well as &#34;there is no crossover on this arm&#34;, and this run can&#39;t tell them apart. So the verdict is &lt;strong&gt;not proven&lt;/strong&gt;, not fail. H3 is the part that holds even here: a learned summary of the actions beats the handcrafted one.&lt;/p&gt; &lt;p&gt;I had one reason to care beyond the paper. My G1b gate ranked action chunks at 0.17–1.0 s, which by Figure 6 is where the low level should win anyway. If the crossover had shown up here, G1b would have been measured in the wrong band for a hierarchy argument. It didn&#39;t show up, but not cleanly enough to close that question either.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; the same high level trained on a lot more data, or on top of a pretrained multi-task latent. Neither is planned.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai RTX 3090): ≈ $0.4, including the invalid first run. Latent extraction on the Orin NX: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-28-paper-vs-hardware-hwm&#34;&gt;2026-10-28-paper-vs-hardware-hwm&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 16 of 22.&lt;/strong&gt; &lt;a href=&#34;../../23/paper-vs-hardware-real-time-chunking/&#34;&gt;← Papers tested 15: Real-Time Chunking&lt;/a&gt; · &lt;a href=&#34;../../29/paper-vs-hardware-lejepa/&#34;&gt;Papers tested 17: LeJEPA identifiability →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/28/paper-vs-hardware-hwm/</link> <pubDate>Wed, 28 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/28/paper-vs-hardware-hwm/</guid> </item> <item> <title>Audit your labels where they matter: a VLM labeller that is right on average</title> <description>&lt;h1 id=&#34;audit-your-labels-where-they-matter-a-vlm-labeller-that-is-right-on-average&#34;&gt;Audit your labels where they matter: a VLM labeller that is right on average&lt;a class=&#34;headerlink&#34; href=&#34;#audit-your-labels-where-they-matter-a-vlm-labeller-that-is-right-on-average&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know whether labels that look fine on average are right where a metric needs them. We checked a vision-language labeller&amp;#x27;s failure onsets, frame by frame, on 5 episodes against the video. The median error was 6 frames, but on retried grasps it was up to +289 frames late.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Audit labels per failure type, not only on average. Late onsets flatter a failure monitor, because its warnings look early. A judge&amp;#x27;s errors can all share one cause: here, recordings that ran past the end of the task. Look at each error before trusting an aggregate.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Twenty-five failed rollouts labelled by Gemini 3.8 Flash, a protocol deviation logged before labelling. The spot check covers 5 of 25 episodes only. The monitor scored on these onsets went to not proven, with two episodes queued for hand relabelling.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 12 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-method&#34;&gt;method&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; VLM onsets are +6 frames on median but +110 / +289 on retries; all judge errors were recordings past the reset. · &lt;strong&gt;n:&lt;/strong&gt; 5-episode spot check; 88 rollouts&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; The spot check is n = 5.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no. External API: Gemini onset labels, cents; the judge ran on a Mac. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-reap&#34;&gt;2026-10-23-paper-vs-hardware-reap&lt;/a&gt; · &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-robometer&#34;&gt;2026-10-23-paper-vs-hardware-robometer&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-26 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-26 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#m-audit-labels&#34;&gt;Audit your labels where they matter →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;Two evaluation problems on my SO-101 rollouts had the same shape: the labels were fine on average and wrong exactly where the metric looked.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Failure onsets marked by a VLM.&lt;/strong&gt; The median error was 6 frames, but the error was 110 and 289 frames on the episodes a failure monitor most needed.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;A deterministic success judge.&lt;/strong&gt; It missed its accuracy bar, and every one of its errors was a recording that ran past the end of the task.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Neither showed in an aggregate number. Both showed when I looked per failure type and per error.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;labels-1-failure-onsets-from-gemini&#34;&gt;Labels 1: failure onsets from Gemini&lt;a class=&#34;headerlink&#34; href=&#34;#labels-1-failure-onsets-from-gemini&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A failure monitor is scored on &lt;em&gt;when&lt;/em&gt; it warns. For that it needs an onset frame per failed episode: the moment the attempt went wrong.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Setup.&lt;/strong&gt; I had 25 failed rollouts. By owner decision, logged as a protocol deviation before labelling, Gemini 3.8 Flash marked the onsets instead of a person.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;How it labelled.&lt;/strong&gt; A coarse-to-fine contact-sheet search, told that the attempt failed and given the operator&#39;s failure note. 52 calls, temperature 0, 25 of 25 labelled.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The check.&lt;/strong&gt; A spot check against the video, to the frame, on 5 episodes:&lt;/li&gt; &lt;/ul&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;episode&lt;/th&gt; &lt;th&gt;failure&lt;/th&gt; &lt;th&gt;Gemini&lt;/th&gt; &lt;th&gt;by eye&lt;/th&gt; &lt;th&gt;offset&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;2&lt;/td&gt; &lt;td&gt;missed grasp, retried&lt;/td&gt; &lt;td&gt;180&lt;/td&gt; &lt;td&gt;174&lt;/td&gt; &lt;td&gt;+6&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;18&lt;/td&gt; &lt;td&gt;missed grasp&lt;/td&gt; &lt;td&gt;349&lt;/td&gt; &lt;td&gt;239&lt;/td&gt; &lt;td&gt;&lt;strong&gt;+110&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;30&lt;/td&gt; &lt;td&gt;wrong object (released beside)&lt;/td&gt; &lt;td&gt;201&lt;/td&gt; &lt;td&gt;200&lt;/td&gt; &lt;td&gt;+1&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;36&lt;/td&gt; &lt;td&gt;missed grasp&lt;/td&gt; &lt;td&gt;418&lt;/td&gt; &lt;td&gt;129&lt;/td&gt; &lt;td&gt;&lt;strong&gt;+289&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;66&lt;/td&gt; &lt;td&gt;wrong object (went to pink)&lt;/td&gt; &lt;td&gt;7&lt;/td&gt; &lt;td&gt;10&lt;/td&gt; &lt;td&gt;−3&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;The median offset is +6 frames (0.2 s), which reads as &#34;good enough&#34;. It is not one error, though. Where the failure is a single event (release beside, wrong bowl from the start, one miss), Gemini is within 6 frames. Where the arm missed and &lt;em&gt;tried again&lt;/em&gt;, Gemini marked a later retry, not the first missed closure: 3.7 s and 9.6 s late.&lt;/p&gt; &lt;p&gt;That matters because of what the labels were for. A monitor that warns between the first miss and the retry looks &#34;early&#34; against a late onset. The bias moves every positive later, in the direction that flatters the monitor.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The REAP monitor scored on these onsets (AUROC 0.93) went into the register as &lt;strong&gt;not proven, pending the onset check&lt;/strong&gt;, with episodes 18 and 36 queued for hand relabelling.&lt;/li&gt; &lt;li&gt;The second version of that monitor removed onsets entirely: a ramp target, and every episode cut to a common horizon of 374 frames. It found no monitor at the bar either.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;labels-2-where-does-the-recording-end&#34;&gt;Labels 2: where does the recording end?&lt;a class=&#34;headerlink&#34; href=&#34;#labels-2-where-does-the-recording-end&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The second case is a deterministic judge for the bowls task. It uses colour masks on the top camera plus geometry, with no learning. On 88 labelled rollouts the pre-registered bar was accuracy ≥ 95 % and AUROC ≥ 0.95. It scored &lt;strong&gt;86.4 % [78.4, 93.2]&lt;/strong&gt;, AUROC 0.919.&lt;/p&gt; &lt;p&gt;The breakdown was strange in a useful way. &lt;strong&gt;All 12 errors were successes called failure; there were no false positives.&lt;/strong&gt; The error frames showed the scene being undone: bowls apart again, the operator&#39;s hands, the arm still moving.&lt;/p&gt; &lt;p&gt;The judge was looking at the last frame of the &lt;em&gt;recording&lt;/em&gt;. The protocol meant the end of the &lt;em&gt;task&lt;/em&gt;. For many successes, the operator had started resetting the scene before the recording stopped.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;On 2026-10-14, before this judge existed, 11 Orin episodes had been marked with a &lt;code&gt;reset_start&lt;/code&gt; by eye, all successes. &lt;strong&gt;9 of the 12 errors were among them.&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;Judged at the marked reset (exploratory, same frozen thresholds), the same judge scores &lt;strong&gt;95.5 % [90.9, 98.9]&lt;/strong&gt;, AUROC 0.967, still with 0 false positives.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The fix that went into the next pre-registered version (G9c-3) was a rule, not a label: judge at the first still moment after the last gripper release, or at the timeout. Coverage was 98.9 %, accuracy &lt;strong&gt;94.3 % [88.5, 98.9]&lt;/strong&gt;, 0 false positives, and every failure type caught. That is a narrow fail, 0.7 points under the bar, reported as such. The remaining errors are unmarked resets or labels to recheck.&lt;/p&gt; &lt;h2 id=&#34;what-is-not-proven&#34;&gt;What is not proven&lt;a class=&#34;headerlink&#34; href=&#34;#what-is-not-proven&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;The onset spot check is n = 5.&lt;/strong&gt; It shows the failure mode exists (retries) but not how often it happens across the 25. Episodes 18 and 36 are still waiting for hand labels.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The effect on monitor scores is not measured with corrected onsets.&lt;/strong&gt; The monitor that replaced the onsets also failed its bar, so no verdict depends on them today.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The reset marks are by eye&lt;/strong&gt; and exist for 11 Orin episodes only. M1 sessions have none.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The judge&#39;s last 0.7 points&lt;/strong&gt; are attributed to unmarked resets or label errors, not verified.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;the-reusable-check&#34;&gt;The reusable check&lt;a class=&#34;headerlink&#34; href=&#34;#the-reusable-check&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Spot-check machine labels per failure type, not by the median.&lt;/strong&gt; Pick at least one episode of each type, especially multi-attempt ones. A single median hides a bimodal error.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Ask which direction the label error moves your metric.&lt;/strong&gt; Late onsets flatter early-warning monitors. If the bias favours your method, treat the result as not proven until the labels are fixed.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;When a judge&#39;s errors are all one-sided, look at the frames it judged&lt;/strong&gt; before tuning a threshold. Here they all came from recording past the end of the task.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Judge at a defined task event,&lt;/strong&gt; not at the end of the file. The rule from the judge (&lt;code&gt;g9c3_test.py&lt;/code&gt;) is a few lines:&lt;/li&gt; &lt;/ol&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;opened&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;nonzero&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;st&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[:,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;5&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;g_open&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# gripper open frames&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t_rel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;opened&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;opened&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# last release&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;round&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;still_s&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;fps&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)))&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 0.5 s window&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;why&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;timeout&#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;range&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t_rel&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;T&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;abs&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;arm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;arm&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;w&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;max&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rule&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;still_tol_deg&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]:&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# 1.5 deg&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;jf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;why&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;still&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;break&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;h2 id=&#34;links&#34;&gt;Links&lt;a class=&#34;headerlink&#34; href=&#34;#links&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Rollouts: &lt;a href=&#34;https://huggingface.co/datasets/ravediamond/so101-bowls-policy-rollouts&#34;&gt;&lt;code&gt;ravediamond/so101-bowls-policy-rollouts&lt;/code&gt;&lt;/a&gt; (69 episodes, labelled).&lt;/li&gt; &lt;li&gt;Earlier posts:&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://shissorobotics.com/blog/2026/10/16/judging-a-rollout-the-zero-false-positive-rule/&#34;&gt;the zero-false-positive judge&lt;/a&gt;;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-reap/&#34;&gt;ReAP&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;Every test and verdict: the &lt;a href=&#34;https://shissorobotics.com/papers/&#34;&gt;paper vs hardware page&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no. External API: Gemini onset labels, cents; the judge ran on a Mac.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-reap&#34;&gt;2026-10-23-paper-vs-hardware-reap&lt;/a&gt; · &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-robometer&#34;&gt;2026-10-23-paper-vs-hardware-robometer&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 12 of 14.&lt;/strong&gt; &lt;a href=&#34;../../08/vla-jepa-for-10-dollars-and-why-reranking-is-a-no-go/&#34;&gt;← Evaluation and judges 11: VLA-JEPA on the Orin for $9.7, and why best-of-N reranking is a no-go&lt;/a&gt; · &lt;a href=&#34;../../29/the-gate-protocol-as-it-ran/&#34;&gt;Evaluation and judges 13: How I re-test robot-learning papers: the gate protocol as it ran →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/26/audit-your-labels-where-they-matter/</link> <pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/26/audit-your-labels-where-they-matter/</guid> </item> <item> <title>p99 is not a tail: latency numbers that lie about chunked policies</title> <description>&lt;h1 id=&#34;p99-is-not-a-tail-latency-numbers-that-lie-about-chunked-policies&#34;&gt;p99 is not a tail: latency numbers that lie about chunked policies&lt;a class=&#34;headerlink&#34; href=&#34;#p99-is-not-a-tail-latency-numbers-that-lie-about-chunked-policies&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know why our latency numbers showed a fast policy with occasional hiccups. We logged every call&amp;#x27;s latency and marked where each motion chunk began. Every slow call was a full chunk inference, and the SmolVLA loop was blocked 39 % of each trial.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Report chunk inference and queue pop separately, not p50 and p99. For a chunked policy they are two operations, not one distribution. Count the share of the loop spent blocked. At 974 ms per chunk, SmolVLA blocked a synchronous loop 39 % of the time.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Ten trials of 25 s per row at a 30 Hz loop, two policies, two machines. Of the slow calls, 98–100 % fell on chunk boundaries. Percentiles over mixed operations mislead whenever calls differ by design.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Engineering on the Orin · 7 of 8&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-method&#34;&gt;method&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; For chunked policies p99 is one chunk inference; SmolVLA&#39;s synchronous loop is blocked 39 % of each trial. · &lt;strong&gt;n:&lt;/strong&gt; 10 trials per row&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; Synchronous loop only.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX, M1 Mac, arm). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-09-29-three-policies-so101&#34;&gt;2026-09-29-three-policies-so101&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-26 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-26 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#m-p99-not-a-tail&#34;&gt;p99 is not a tail for chunked policies →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;My first gate runs reported &lt;code&gt;select_action&lt;/code&gt; latency the usual way: p50 and p99 per trial. For SmolVLA on a Jetson Orin NX, p50 was a few milliseconds and p99 was about a second. That reads like a fast policy with an occasional hiccup.&lt;/p&gt; &lt;p&gt;It is not. Every one of those slow calls was a full chunk inference, on a fixed schedule, and the control loop spent 39 % of every trial blocked on them. For chunked policies, p50 and p99 describe two different operations, not one distribution.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;the-symptom&#34;&gt;The symptom&lt;a class=&#34;headerlink&#34; href=&#34;#the-symptom&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A chunked policy predicts H actions at once (ACT: 100, SmolVLA: 50) and queues them. The next H − 1 calls to &lt;code&gt;select_action&lt;/code&gt; only pop the queue. When the queue is empty, the next call runs the model.&lt;/p&gt; &lt;p&gt;In a synchronous loop the robot waits for that call. On the arm this showed as a visible pause at every chunk, and the control-rate table looked inconsistent: - ACT on the Orin was twice as fast per inference as on the M1 Mac; - SmolVLA ran at about 19 Hz with about 130 ms of jitter on &lt;em&gt;both&lt;/em&gt; machines.&lt;/p&gt; &lt;h2 id=&#34;how-it-was-caught&#34;&gt;How it was caught&lt;a class=&#34;headerlink&#34; href=&#34;#how-it-was-caught&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The harness logs one tick file per trial, with the latency of every &lt;code&gt;select_action&lt;/code&gt; call and its timestamp. A short script (&lt;code&gt;shared/gate/chunk_latency.py&lt;/code&gt;) does three things: - flags calls slower than 10 × the trial&#39;s median; - checks whether each flagged call falls on a chunk boundary (call 0, H, 2H, …); - plots the first 300 calls of one trial with the boundaries drawn.&lt;/p&gt; &lt;p&gt;&lt;img alt=&#34;select_action latency per control tick, with chunk boundaries&#34; src=&#34;../../../../img/chunk_latency.png&#34; /&gt;&lt;/p&gt; &lt;p&gt;The spikes are not a tail. They are the boundaries:&lt;/p&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;policy&lt;/th&gt; &lt;th&gt;machine&lt;/th&gt; &lt;th&gt;chunk&lt;/th&gt; &lt;th&gt;spikes on a chunk boundary&lt;/th&gt; &lt;th&gt;chunk inference&lt;/th&gt; &lt;th&gt;queue pop&lt;/th&gt; &lt;th&gt;p99&lt;/th&gt; &lt;th&gt;chunk inferences / s&lt;/th&gt; &lt;th&gt;sync loop blocked&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;ACT&lt;/td&gt; &lt;td&gt;M1&lt;/td&gt; &lt;td&gt;100&lt;/td&gt; &lt;td&gt;100 %&lt;/td&gt; &lt;td&gt;122 ms&lt;/td&gt; &lt;td&gt;5.86 ms&lt;/td&gt; &lt;td&gt;118 ms&lt;/td&gt; &lt;td&gt;0.32&lt;/td&gt; &lt;td&gt;4 %&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;ACT&lt;/td&gt; &lt;td&gt;Orin NX&lt;/td&gt; &lt;td&gt;100&lt;/td&gt; &lt;td&gt;100 %&lt;/td&gt; &lt;td&gt;59 ms&lt;/td&gt; &lt;td&gt;0.92 ms&lt;/td&gt; &lt;td&gt;58 ms&lt;/td&gt; &lt;td&gt;0.32&lt;/td&gt; &lt;td&gt;2 %&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;SmolVLA&lt;/td&gt; &lt;td&gt;M1&lt;/td&gt; &lt;td&gt;50&lt;/td&gt; &lt;td&gt;98 %&lt;/td&gt; &lt;td&gt;954 ms&lt;/td&gt; &lt;td&gt;2.42 ms&lt;/td&gt; &lt;td&gt;954 ms&lt;/td&gt; &lt;td&gt;0.41&lt;/td&gt; &lt;td&gt;&lt;strong&gt;39 %&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;SmolVLA&lt;/td&gt; &lt;td&gt;Orin NX&lt;/td&gt; &lt;td&gt;50&lt;/td&gt; &lt;td&gt;100 %&lt;/td&gt; &lt;td&gt;974 ms&lt;/td&gt; &lt;td&gt;4.29 ms&lt;/td&gt; &lt;td&gt;975 ms&lt;/td&gt; &lt;td&gt;0.40&lt;/td&gt; &lt;td&gt;&lt;strong&gt;39 %&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;10 trials of 25 s per row, 30 Hz loop, 2026-09-29. The two off-boundary SmolVLA spikes on the M1 (2 of 102) are isolated outliers.&lt;/p&gt; &lt;h2 id=&#34;what-the-right-numbers-say&#34;&gt;What the right numbers say&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-right-numbers-say&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;p50 is the queue pop.&lt;/strong&gt; p99 is one chunk inference.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The useful numbers&lt;/strong&gt; are the &lt;em&gt;time per chunk inference&lt;/em&gt; and &lt;em&gt;how often it runs&lt;/em&gt;. Together they give how long the robot stalls and how often, and so the share of the trial the loop is blocked.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The control-rate puzzle resolves.&lt;/strong&gt; SmolVLA is bound by its own inference (about 0.95–0.97 s on both machines), so faster hardware did not help it. ACT, at 59 ms per 100 actions, barely blocks at all.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The lever was not &#34;more hardware&#34;.&lt;/strong&gt; It was the engine, then asynchronous inference.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Moving SmolVLA from PyTorch to vla.cpp on the same Orin and checkpoint (2026-10-01, 10 trials each), the metrics that matter moved:&lt;/p&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;SmolVLA PyTorch&lt;/th&gt; &lt;th&gt;vla.cpp defaults&lt;/th&gt; &lt;th&gt;vla.cpp &lt;code&gt;--flash-attn --mm-prec default&lt;/code&gt;&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;chunk inference&lt;/td&gt; &lt;td&gt;974 ms&lt;/td&gt; &lt;td&gt;390 ms&lt;/td&gt; &lt;td&gt;&lt;strong&gt;238 ms&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;sync loop blocked&lt;/td&gt; &lt;td&gt;39 %&lt;/td&gt; &lt;td&gt;20 %&lt;/td&gt; &lt;td&gt;&lt;strong&gt;14 %&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;control Hz achieved&lt;/td&gt; &lt;td&gt;19.32&lt;/td&gt; &lt;td&gt;24.59&lt;/td&gt; &lt;td&gt;&lt;strong&gt;26.56&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;control jitter&lt;/td&gt; &lt;td&gt;130.7 ms&lt;/td&gt; &lt;td&gt;51.0 ms&lt;/td&gt; &lt;td&gt;&lt;strong&gt;29.8 ms&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;success (n = 10)&lt;/td&gt; &lt;td&gt;9/10&lt;/td&gt; &lt;td&gt;9/10&lt;/td&gt; &lt;td&gt;8/10&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Spikes still sit on the boundaries (100 / 100 / 99 %). The stall is shorter, not gone. That is what led to running inference asynchronously, and to the &lt;a href=&#34;https://shissorobotics.com/blog/2026/10/25/vla-chunk-boundary-jumps/&#34;&gt;chunk-boundary post&lt;/a&gt;.&lt;/p&gt; &lt;h2 id=&#34;what-is-not-proven&#34;&gt;What is not proven&lt;a class=&#34;headerlink&#34; href=&#34;#what-is-not-proven&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Synchronous loop only.&lt;/strong&gt; The asynchronous loop on the arm, where inference overlaps execution, has not been timed end to end. That timing run (G13a) has not happened.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;n = 10 trials per row&lt;/strong&gt;, one task, two machines. The percentages are stable across trials here, but this is not a benchmark suite.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Success at n = 10 says nothing either way&lt;/strong&gt; about the engine change (9 vs 9 vs 8). The &lt;code&gt;_fa&lt;/code&gt; flags change numerics, and its two missed grasps are flagged, not explained.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;the-reusable-check&#34;&gt;The reusable check&lt;a class=&#34;headerlink&#34; href=&#34;#the-reusable-check&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;For any chunked policy, compute these from per-call logs instead of reporting p50 / p99:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;summarize&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;trials&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;],&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chunk&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;spikes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on_boundary&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;blocked&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wall&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[],&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;[],&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;0.0&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;t&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;trials&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;select_action_ms&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;where&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;&amp;gt;&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;10&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;median&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on_boundary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;int&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;%&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;chunk&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;))&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;spikes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tolist&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rest&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;delete&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;tolist&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ts&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;array&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;t&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;tick_ts&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wall&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;-&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ts&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;blocked&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;idx&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sum&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;mf&#34;&gt;1e3&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;return&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;{&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;spikes&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;spikes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;on_boundary_pct&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;on_boundary&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;spikes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;chunk_ms&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;median&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;spikes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;pop_ms&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;median&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;p99_ms&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;float&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;np&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;percentile&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;spikes&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rest&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;99&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;chunks_per_s&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;len&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;spikes&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wall&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;blocked_pct&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;100&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;*&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;blocked&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;/&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;wall&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;p&#34;&gt;}&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;If &lt;code&gt;on_boundary_pct&lt;/code&gt; is near 100, report &lt;code&gt;chunk_ms&lt;/code&gt;, &lt;code&gt;chunks_per_s&lt;/code&gt; and &lt;code&gt;blocked_pct&lt;/code&gt;. Treat p99 as what it is: one inference.&lt;/p&gt; &lt;h2 id=&#34;links&#34;&gt;Links&lt;a class=&#34;headerlink&#34; href=&#34;#links&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Earlier posts:&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://shissorobotics.com/blog/2026/09/29/three-policies-on-a-300-dollar-arm/&#34;&gt;three policies on a €350 arm kit&lt;/a&gt;;&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://shissorobotics.com/blog/2026/10/01/smolvla-4x-faster-on-jetson-with-vlacpp/&#34;&gt;SmolVLA four times faster with vla.cpp&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;Tick files and &lt;code&gt;chunk_latency.py&lt;/code&gt;: in my research repo, public with the replication repo.&lt;/li&gt; &lt;li&gt;Every test and verdict: the &lt;a href=&#34;https://shissorobotics.com/papers/&#34;&gt;paper vs hardware page&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX, M1 Mac, arm). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-09-29-three-policies-so101&#34;&gt;2026-09-29-three-policies-so101&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Engineering on the Orin, 7 of 8.&lt;/strong&gt; &lt;a href=&#34;../../25/vla-chunk-boundary-jumps/&#34;&gt;← Engineering on the Orin 6: Why your VLA&#39;s actions jump at every chunk boundary on real hardware, and a 0.4 ms fix&lt;/a&gt; · &lt;a href=&#34;../upstream-fix-checkpoint-47-percent-worse/&#34;&gt;Engineering on the Orin 8: A correctness fix upstream made my checkpoint 47 % worse →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/26/p99-is-not-a-tail/</link> <pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/26/p99-is-not-a-tail/</guid> </item> <item> <title>A correctness fix upstream made my checkpoint 47 % worse</title> <description>&lt;h1 id=&#34;a-correctness-fix-upstream-made-my-checkpoint-47-worse&#34;&gt;A correctness fix upstream made my checkpoint 47 % worse&lt;a class=&#34;headerlink&#34; href=&#34;#a-correctness-fix-upstream-made-my-checkpoint-47-worse&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if an upstream bug fix changed what our trained checkpoint computes. We ran its world predictor on its own validation data with the old and the fixed code, nothing else changed. Under the fix its loss was 47 % higher, worse on all 25 episodes.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Before upgrading, run your checkpoint under the old and the new code on its own data. A correct fix can still change what an old checkpoint computes. Keep the old code for fine-tunes that continue from an old checkpoint.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Protocol frozen before any number: 25 validation episodes, 200 windows, one change against fixed inputs. The old expansion was never a rotation: pair-norm error 2.19. The fix is right; the checkpoint was trained around the bug.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Engineering on the Orin · 8 of 8&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-engineering&#34;&gt;engineering&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; LeRobot&#39;s rotary fix raises a legacy checkpoint&#39;s world-model loss by 47 % (R = 1.473), worse on 25/25 episodes. · &lt;strong&gt;n:&lt;/strong&gt; 200 windows, 25 episodes&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; One checkpoint, in distribution.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX, ~10 min). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-26-vla-jepa-rope-compat&#34;&gt;2026-10-26-vla-jepa-rope-compat&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-26 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-26 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#m-upstream-fix&#34;&gt;An upstream correctness fix made a checkpoint 47 % worse →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;LeRobot fixed a real bug in VLA-JEPA&#39;s world predictor: its rotary position embedding was not a rotation. I had a checkpoint trained before the fix. Run under the fixed code, its world-model loss is 47 % higher on its own training distribution, worse on all 25 episodes. The fix is right. The checkpoint was trained around the bug, so the fix silently changes what the checkpoint computes. This post is about checking for that before you upgrade.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;the-symptom&#34;&gt;The symptom&lt;a class=&#34;headerlink&#34; href=&#34;#the-symptom&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;VLA-JEPA (LeRobot&#39;s port) has a world predictor next to the action head. It predicts future V-JEPA 2 latents and is trained with an L1 loss. LeRobot &lt;a href=&#34;https://github.com/huggingface/lerobot/pull/4835&#34;&gt;#4835&lt;/a&gt; changed how the predictor expands its rotary frequencies:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;c1&#34;&gt;# before #4835&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;emb_sin&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;freqs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;squeeze&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repeat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;emb_cos&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;freqs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;squeeze&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repeat&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# after #4835: each adjacent coordinate pair rotated by one frequency&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;emb_sin&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;freqs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;sin&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repeat_interleave&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;emb_cos&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;freqs&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;cos&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;()&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;repeat_interleave&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;2&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;dim&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;On random tensors the difference is easy to confirm. The fixed version rotates each pair by one angle: pair norms are preserved to 8.9e-16, and the angle equals position × frequency to 1.3e-15. The old version does not preserve pair norms (error 2.19): the two coordinates of a pair get the cos and sin of &lt;em&gt;different&lt;/em&gt; frequencies. So it was never a rotation.&lt;/p&gt; &lt;p&gt;My checkpoint, &lt;code&gt;ravediamond/vla_jepa_so101_bowls_trimmed&lt;/code&gt; (an SO-101 fine-tune), was trained with the world model on, on the old code. LeRobot&#39;s docs say pretrained world-model quality &#34;needs separate evaluation when continuing training&#34;. So I evaluated it.&lt;/p&gt; &lt;h2 id=&#34;how-it-was-caught-one-change-everything-else-held-fixed&#34;&gt;How it was caught: one change, everything else held fixed&lt;a class=&#34;headerlink&#34; href=&#34;#how-it-was-caught-one-change-everything-else-held-fixed&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The protocol was frozen and committed before any fixed-rotary number on real data existed:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Data:&lt;/strong&gt; the checkpoint&#39;s own 25 validation episodes, 8 windows each, start frames from a seeded generator per episode: &lt;strong&gt;200 windows&lt;/strong&gt;.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Sharing:&lt;/strong&gt; for each window the V-JEPA 2 encoder and Qwen run once. Only the predictor runs more than once, on the &lt;em&gt;same&lt;/em&gt; tensors.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Three arms:&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;&lt;code&gt;legacy&lt;/code&gt;: the old expansion patched in, checked bit-identical to the pre-fix commit &lt;code&gt;2e88044&lt;/code&gt; (max abs diff 0.0);&lt;/li&gt; &lt;li&gt;&lt;code&gt;fixed&lt;/code&gt;: LeRobot main &lt;code&gt;d3793b7&lt;/code&gt;;&lt;/li&gt; &lt;li&gt;&lt;code&gt;copy_last&lt;/code&gt;: predict each next position with the current one.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Loss:&lt;/strong&gt; exactly &lt;code&gt;_world_model_loss&lt;/code&gt;&#39;s L1.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Statistics:&lt;/strong&gt; paired bootstrap over episodes, 2,000 resamples.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Before the real comparison, three checks: 1. The legacy patch reproduces the pre-fix code exactly. 2. Two runs give identical losses. 3. The instrument separates a trained predictor from a random-init one. On 6 windows the trained predictor scored 1.14–1.26, random init 1.97–2.05, copy-last 2.20–2.28.&lt;/p&gt; &lt;p&gt;The bar had five labels: instrument fails, COLLAPSES, DEGRADES, SAFE, NOT PROVEN. DEGRADES needed R = fixed / legacy ≥ 1.10 with the CI of &lt;code&gt;fixed − legacy&lt;/code&gt; above 0, and the fixed predictor still beating copy-last.&lt;/p&gt; &lt;h2 id=&#34;the-measurement&#34;&gt;The measurement&lt;a class=&#34;headerlink&#34; href=&#34;#the-measurement&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;world-model L1 (mean over episodes)&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;legacy&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;1.175&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;fixed&lt;/code&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;1.731&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;code&gt;copy_last&lt;/code&gt;&lt;/td&gt; &lt;td&gt;2.235&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;statistic&lt;/th&gt; &lt;th&gt;value&lt;/th&gt; &lt;th&gt;95 % CI&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;R = fixed / legacy&lt;/td&gt; &lt;td&gt;&lt;strong&gt;1.473&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;[1.462, 1.484]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;fixed − legacy&lt;/td&gt; &lt;td&gt;+0.556&lt;/td&gt; &lt;td&gt;[0.547, 0.564]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;fixed − copy_last&lt;/td&gt; &lt;td&gt;−0.505&lt;/td&gt; &lt;td&gt;[−0.508, −0.501]&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;legacy − copy_last&lt;/td&gt; &lt;td&gt;−1.060&lt;/td&gt; &lt;td&gt;[−1.069, −1.051]&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Verdict: DEGRADES.&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Episodes:&lt;/strong&gt; fixed is worse on 25 of 25.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Position:&lt;/strong&gt; the gap does not grow with distance from the context. It costs 0.53–0.61 at each of the three predicted positions, and about the same at the start, middle and end of episodes.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Not a collapse:&lt;/strong&gt; the fixed predictor still beats copy-last, so it has not forgotten everything.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;What it means for fine-tuning:&lt;/strong&gt; continuing from this checkpoint on current main starts the world-model loss about half way back to the copy-last baseline.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;the-decision&#34;&gt;The decision&lt;a class=&#34;headerlink&#34; href=&#34;#the-decision&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The protocol fixed the consequence in advance: - My own fine-tunes from legacy checkpoints pin the old expansion, and say so in the model card. - I drafted an opt-in flag for upstream (&lt;code&gt;world_model_rope_legacy: bool = False&lt;/code&gt;). Old checkpoints set it in their config, new training keeps the fix, and nothing changes by default.&lt;/p&gt; &lt;p&gt;Upstream V-JEPA 2 made the same call for its released checkpoints (&lt;a href=&#34;https://github.com/facebookresearch/vjepa2/pull/75&#34;&gt;facebookresearch/vjepa2#75&lt;/a&gt; kept the old expansion). The draft is not posted yet.&lt;/p&gt; &lt;h2 id=&#34;what-is-not-proven&#34;&gt;What is not proven&lt;a class=&#34;headerlink&#34; href=&#34;#what-is-not-proven&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;One checkpoint, one small fine-tune.&lt;/strong&gt; The LIBERO checkpoint (&lt;code&gt;lerobot/VLA-JEPA-LIBERO&lt;/code&gt;) was not run: its files and dataset did not fit on the Orin&#39;s disk. The effect on the large pretrained model is unmeasured.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;In distribution only.&lt;/strong&gt; The windows come from the checkpoint&#39;s own training data. This is a compatibility test (does the predictor still do what it learned), not a generalisation test.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;No closed-loop effect.&lt;/strong&gt; My arm runs VLA-JEPA with the world model off at inference, so the robot&#39;s success rate is not affected. Fine-tuning is.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Recovery speed unmeasured.&lt;/strong&gt; I did not measure how many fine-tuning steps it takes to recover under the fixed rotary.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;the-reusable-check&#34;&gt;The reusable check&lt;a class=&#34;headerlink&#34; href=&#34;#the-reusable-check&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;When an upstream fix touches model code your checkpoint was trained with, run this before upgrading. It is an afternoon.&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Freeze the bar first.&lt;/strong&gt; What ratio counts as harmless, and what counts as degraded.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Re-create the old behaviour&lt;/strong&gt; as a patch, and prove it bit-identical to the old commit on a few inputs.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Share everything upstream of the change.&lt;/strong&gt; Run the unchanged parts once per sample and feed the same tensors to old and new. Then the only difference is the change.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Add a trivial baseline&lt;/strong&gt; (copy-last, mean prediction) and require the old code to beat it. Otherwise your instrument cannot see anything.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Pair by episode&lt;/strong&gt; and bootstrap over episodes, not windows.&lt;/li&gt; &lt;/ol&gt; &lt;p&gt;Steps 2 and 3 in the evaluation script (&lt;code&gt;eval_rope_compat.py&lt;/code&gt;): the old expansion is swapped in at module level, and each window is encoded once and predicted under both (excerpt; the per-position fields are trimmed).&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;k&#34;&gt;def&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nf&#34;&gt;set_mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;mode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt; &lt;span class=&#34;kn&#34;&gt;import&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;lerobot.policies.vla_jepa.world_model&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;k&#34;&gt;as&lt;/span&gt;&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nn&#34;&gt;W&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;not&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;hasattr&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;_rope_fixed&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;):&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_rope_fixed&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rotate_queries_or_keys&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;rotate_queries_or_keys&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rope_legacy&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;if&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;mode&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;legacy&#34;&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;else&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;W&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;_rope_fixed&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;for&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt; &lt;span class=&#34;ow&#34;&gt;in&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;windows&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;spans&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;val&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;a&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;windows_per_episode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;d&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;-&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]):&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ac&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;tpf&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;encode&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pol&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pre&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ds&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;spans&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;[&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;][&lt;/span&gt;&lt;span class=&#34;mi&#34;&gt;0&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;]&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;+&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;s&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# encoders + Qwen once&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;pf&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;predict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pred&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ac&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;legacy&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;predict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pred&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;ac&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;fixed&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;rows&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;append&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;({&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;episode&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;e&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;legacy&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pl&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;fixed&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;pf&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;),&lt;/span&gt; &lt;span class=&#34;s2&#34;&gt;&#34;copy_last&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;:&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;l1&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;i&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;g&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)})&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;h2 id=&#34;links&#34;&gt;Links&lt;a class=&#34;headerlink&#34; href=&#34;#links&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/huggingface/lerobot/pull/4835&#34;&gt;LeRobot #4835&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;&lt;a href=&#34;https://github.com/facebookresearch/vjepa2/pull/75&#34;&gt;vjepa2#75&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;Data: &lt;a href=&#34;https://huggingface.co/datasets/ravediamond/so101_bowls_all_trimmed&#34;&gt;&lt;code&gt;ravediamond/so101_bowls_all_trimmed&lt;/code&gt;&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;Code and checkpoint: in my research repo, which goes public with the replication repo.&lt;/li&gt; &lt;li&gt;Every test and verdict: the &lt;a href=&#34;https://shissorobotics.com/papers/&#34;&gt;paper vs hardware page&lt;/a&gt;.&lt;/li&gt; &lt;/ul&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX, ~10 min). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-26-vla-jepa-rope-compat&#34;&gt;2026-10-26-vla-jepa-rope-compat&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Engineering on the Orin, 8 of 8.&lt;/strong&gt; &lt;a href=&#34;../p99-is-not-a-tail/&#34;&gt;← Engineering on the Orin 7: p99 is not a tail: latency numbers that lie about chunked policies&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/26/upstream-fix-checkpoint-47-percent-worse/</link> <pubDate>Mon, 26 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/26/upstream-fix-checkpoint-47-percent-worse/</guid> </item> <item> <title>Why your VLA&#39;s actions jump at every chunk boundary on real hardware, and a 0.4 ms fix</title> <description>&lt;h1 id=&#34;why-your-vlas-actions-jump-at-every-chunk-boundary-on-real-hardware-and-a-04-ms-fix&#34;&gt;Why your VLA&#39;s actions jump at every chunk boundary on real hardware, and a 0.4 ms fix&lt;a class=&#34;headerlink&#34; href=&#34;#why-your-vlas-actions-jump-at-every-chunk-boundary-on-real-hardware-and-a-04-ms-fix&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know why the arm&amp;#x27;s commands jump each time a new motion chunk takes over. We measured the jump offline on 254 chunk boundaries, then tried overwriting the new chunk&amp;#x27;s start. The jump fell to the size of a normal step, at 0.4 ms per chunk on the Jetson.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 72&#34; role=&#34;img&#34; aria-label=&#34;Jump at the chunk seam cut vs naive async, %: prefix overwrite 71–73 %; bar 50 %&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Jump at the chunk seam cut vs naive async, %: prefix overwrite 71–73 %; bar 50 %&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;134.9&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;rect x=&#34;252.9&#34; y=&#34;29&#34; width=&#34;4.4&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.15&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;prefix overwrite&lt;/text&gt;&lt;text x=&#34;261.3&#34; y=&#34;40&#34;&gt;71–73 %&lt;/text&gt;&lt;line x1=&#34;213.0&#34; y1=&#34;20&#34; x2=&#34;213.0&#34; y2=&#34;56&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;213.0&#34; y=&#34;68&#34; text-anchor=&#34;middle&#34;&gt;bar 50 %&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Run chunked policies asynchronously with a prefix overwrite inside the denoising loop. It adds 0.4 ms per chunk and leaves the default path bit-identical. LeRobot&amp;#x27;s gradient-free mode, tuned, gets close on the jump but needs tuning. It is not yet tested for task success on the arm.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Twenty episodes, 254 boundaries per setting, inference delays of 8, 12 and 20 steps. Naive async jumps were 3.39 / 3.38 / 3.68 times a normal step. One boundary on the real server: 58.7° naive, 1.4° with the fix.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Engineering on the Orin · 6 of 8&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-engineering&#34;&gt;engineering&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; A prefix overwrite cuts the chunk-boundary jump 71–73 % against naive async at +0.4 ms; tuned LeRobot identity is close. · &lt;strong&gt;n:&lt;/strong&gt; 254 boundaries per delay, 20 episodes&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; Task success on the arm is not measured.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-25-vla-chunk-boundary-jumps&#34;&gt;2026-10-25-vla-chunk-boundary-jumps&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-25 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-26 (LeRobot RTC baselines added) · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#chunk-boundaries&#34;&gt;I need smoother chunk boundaries →&lt;/a&gt;, &lt;a href=&#34;../../../../../findings/#vlacpp-prefix-pr&#34;&gt;Prefix conditioning in vla.cpp →&lt;/a&gt;, &lt;a href=&#34;../../../../../findings/#prefix-overwrite&#34;&gt;Prefix overwrite at chunk boundaries (offline) →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;Run a chunked VLA asynchronously on a real arm and the command jumps every time a new chunk takes over. On my SO-101 with SmolVLA, the step at the switch was a median 3.4 times a normal step, and on a test boundary served by the real engine the jump was 58.7°. Against naive async, a gradient-free prefix overwrite inside the denoising loop brings the jump down to the size of a normal step, adds 0.4 ms per chunk on a Jetson Orin NX, and leaves the default path bit-identical. LeRobot&#39;s own gradient-free RTC mode, tuned, gets close on the jump; the overwrite&#39;s edge over it is no parameter to tune and an exact prefix. It has not been tested for task success on the arm yet. This post covers what I measured, and what I did not.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;the-symptom&#34;&gt;The symptom&lt;a class=&#34;headerlink&#34; href=&#34;#the-symptom&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;SmolVLA predicts a chunk of 50 actions at a time. Run synchronously, the arm waits for every chunk. Run asynchronously, the next chunk is computed while the current one is still executing, and the arm switches to it when it arrives.&lt;/p&gt; &lt;p&gt;I measured the switch offline on recorded episodes: 20 episodes of &lt;code&gt;ravediamond/so101_bowls_all&lt;/code&gt;, 254 boundaries per setting, inference delays of d = 8, 12 and 20 control steps. The metric is the jump ratio: the size of the joint step at the switch divided by the median step inside the chunk. 1.0 means the switch looks like any other step.&lt;/p&gt; &lt;p&gt;Naive asynchronous execution gave a median jump ratio of &lt;strong&gt;3.39 / 3.38 / 3.68&lt;/strong&gt; (d = 8 / 12 / 20) through vla.cpp, and 3.42 / 3.69 / 3.77 in PyTorch. On a test boundary served by the real &lt;code&gt;vla-server&lt;/code&gt; (episode 2, d = 8), the jump at the switch was &lt;strong&gt;58.7°&lt;/strong&gt;. With the fix it was &lt;strong&gt;1.4°&lt;/strong&gt;.&lt;/p&gt; &lt;h2 id=&#34;why-it-happens&#34;&gt;Why it happens&lt;a class=&#34;headerlink&#34; href=&#34;#why-it-happens&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The new chunk is sampled from the observation at request time. By the time it arrives, d steps have passed and the arm has executed d more actions of the old chunk. The new chunk also starts from fresh noise. Nothing in the sampling ties its first rows to the actions that are still executing, so its row d can pick a different trajectory from where the old chunk left the arm.&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;chunk k |== executed ==|-- d steps of inference --|-- leftover (not executed) --| ^ request (state at t) ^ chunk k+1 arrives chunk k+1 |-- rows 0..d-1 (skipped) -|-- row d onward executes ---&amp;gt; ^ switch: row d of k+1 vs last executed row of k &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;The leftover is the part of chunk k that would have run next. Naive execution throws it away and jumps to row d of chunk k+1.&lt;/p&gt; &lt;h2 id=&#34;budget-first&#34;&gt;Budget first&lt;a class=&#34;headerlink&#34; href=&#34;#budget-first&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;None of this matters if the chunk does not arrive in time. With 50-action chunks and a new chunk started after 30 actions, the next one has to arrive within H − s = 20 steps, about 667 ms at 30 Hz.&lt;/p&gt; &lt;p&gt;SmolVLA in PyTorch on the Orin NX took &lt;strong&gt;974 ms&lt;/strong&gt; per chunk, so it does not fit with any correction. In the offline study, naive PyTorch was 1028 ms, the gradient-free variants about 1032–1039 ms, and RTC&#39;s exact guidance 1962 ms. Served by vla.cpp with &lt;code&gt;--flash-attn --mm-prec default&lt;/code&gt;, the same checkpoint takes &lt;strong&gt;238 ms&lt;/strong&gt; per chunk, inside the budget with room to spare. So the fix had to live in the engine.&lt;/p&gt; &lt;h2 id=&#34;the-fix&#34;&gt;The fix&lt;a class=&#34;headerlink&#34; href=&#34;#the-fix&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Inside SmolVLA&#39;s Euler denoising loop, I correct the predicted clean chunk towards the leftover at every step. With x_t the current sample, v the velocity and t the flow time:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;x1 = x_t − t·v v ← v − W ⊙ (Y − x1) / t &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Y&lt;/strong&gt; is the leftover, normalised with the checkpoint&#39;s action stats.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;W&lt;/strong&gt; is Real-Time Chunking&#39;s soft prefix weight (Black, Galliker, Levine; arXiv &lt;a href=&#34;https://arxiv.org/abs/2506.07339&#34;&gt;2506.07339&lt;/a&gt;). It is 1 on the first d rows and decays as &lt;code&gt;c·expm1(c)/(e − 1)&lt;/code&gt; to 0 at the end of the leftover, over the real action dimensions.&lt;/li&gt; &lt;li&gt;Without a leftover, &lt;strong&gt;W = 0&lt;/strong&gt; and the update does nothing. With fixed inputs and noise, the default path is bit-identical to the existing build (max |Δ| = 0.0), and vla.cpp&#39;s 14 tests pass on the Orin.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;There are no gradients. &lt;code&gt;prev_actions&lt;/code&gt; (the not-yet-executed rest of the previous chunk) and &lt;code&gt;inference_delay&lt;/code&gt; are new fields in the engine inputs, the C API, the Python bindings and the server&#39;s request. The change is on my fork, branch &lt;a href=&#34;https://github.com/ravediamond/vla.cpp/tree/feat/smolvla-prefix-overwrite&#34;&gt;&lt;code&gt;feat/smolvla-prefix-overwrite&lt;/code&gt;&lt;/a&gt;, commit &lt;a href=&#34;https://github.com/ravediamond/vla.cpp/commit/805570d&#34;&gt;&lt;code&gt;805570d&lt;/code&gt;&lt;/a&gt;, on top of &lt;a href=&#34;https://github.com/VinRobotics/vla.cpp&#34;&gt;vla.cpp&lt;/a&gt;.&lt;/p&gt; &lt;h2 id=&#34;results&#34;&gt;Results&lt;a class=&#34;headerlink&#34; href=&#34;#results&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Medians over 254 boundaries per cell, 20 episodes, degrees, five arm joints. The vla.cpp rows go through the engine; the PyTorch rows are the same study in LeRobot, including its RTC modes: &lt;code&gt;identity&lt;/code&gt; (LeRobot&#39;s gradient-free guided mode) and &lt;code&gt;exact&lt;/code&gt; (vector-Jacobian product, RTC as published), at guidance weight β. Prefix error is how far the first d rows of the new chunk are from the leftover. Drift is the distance to the recorded actions, a check that the correction does not drag the chunk away from the demonstrations.&lt;/p&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;d&lt;/th&gt; &lt;th&gt;jump ratio&lt;/th&gt; &lt;th&gt;accel ratio&lt;/th&gt; &lt;th&gt;prefix error&lt;/th&gt; &lt;th&gt;drift&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;vla.cpp naive&lt;/td&gt; &lt;td&gt;8 / 12 / 20&lt;/td&gt; &lt;td&gt;3.39 / 3.38 / 3.68&lt;/td&gt; &lt;td&gt;3.63 / 3.91 / 4.63&lt;/td&gt; &lt;td&gt;1.60 / 1.69 / 1.88&lt;/td&gt; &lt;td&gt;1.51 / 1.55 / 1.51&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;vla.cpp overwrite&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;8 / 12 / 20&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0.98 / 0.90 / 1.05&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;1.21 / 1.19 / 1.29&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0 / 0 / 0&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;1.50 / 1.50 / 1.45&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;PyTorch naive&lt;/td&gt; &lt;td&gt;8 / 12 / 20&lt;/td&gt; &lt;td&gt;3.42 / 3.69 / 3.77&lt;/td&gt; &lt;td&gt;3.81 / 4.13 / 4.27&lt;/td&gt; &lt;td&gt;1.65 / 1.69 / 1.91&lt;/td&gt; &lt;td&gt;1.48 / 1.53 / 1.53&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;PyTorch overwrite&lt;/td&gt; &lt;td&gt;8 / 12 / 20&lt;/td&gt; &lt;td&gt;0.93 / 0.96 / 1.06&lt;/td&gt; &lt;td&gt;1.23 / 1.26 / 1.34&lt;/td&gt; &lt;td&gt;0 / 0 / 0&lt;/td&gt; &lt;td&gt;1.49 / 1.55 / 1.49&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;PyTorch identity, β = 5&lt;/td&gt; &lt;td&gt;8 / 12 / 20&lt;/td&gt; &lt;td&gt;1.26 / 1.19 / 1.34&lt;/td&gt; &lt;td&gt;1.50 / 1.54 / 1.67&lt;/td&gt; &lt;td&gt;0.48 / 0.45 / 0.42&lt;/td&gt; &lt;td&gt;1.47 / 1.50 / 1.57&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;PyTorch identity, β = 10&lt;/td&gt; &lt;td&gt;8 / 12 / 20&lt;/td&gt; &lt;td&gt;0.95 / 1.02 / 1.12&lt;/td&gt; &lt;td&gt;1.26 / 1.28 / 1.33&lt;/td&gt; &lt;td&gt;0.08 / 0.08 / 0.08&lt;/td&gt; &lt;td&gt;1.51 / 1.52 / 1.62&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;PyTorch exact RTC, β = 5&lt;/td&gt; &lt;td&gt;8 / 12 / 20&lt;/td&gt; &lt;td&gt;2.43 / 2.55 / 2.99&lt;/td&gt; &lt;td&gt;2.83 / 3.04 / 3.77&lt;/td&gt; &lt;td&gt;0.99 / 0.98 / 0.97&lt;/td&gt; &lt;td&gt;1.57 / 1.61 / 1.60&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Against naive async, the jump drops by 71.0 / 73.3 / 71.5 %&lt;/strong&gt; through vla.cpp (72.8 / 74.0 / 71.7 % in PyTorch). The switch now looks like an ordinary step.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Drift is unchanged.&lt;/strong&gt;&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The prefix matches the leftover exactly&lt;/strong&gt;: max prefix error 0.0 over 762 boundaries.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Cost: +0.4 ms per chunk&lt;/strong&gt;, measured as 371.0 → 371.4 ms wall per call from Python. That includes copying two 512² images; the engine&#39;s own inference is the 238 ms above.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Against the real server, the first 8 rows of the corrected chunk match the leftover to 1e-6°. The naive chunk was off by up to 47° on the same rows.&lt;/p&gt; &lt;h2 id=&#34;against-lerobots-rtc-modes&#34;&gt;Against LeRobot&#39;s RTC modes&lt;a class=&#34;headerlink&#34; href=&#34;#against-lerobots-rtc-modes&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The 72 % is against naive async. LeRobot already ships RTC, and its gradient-free &lt;code&gt;identity&lt;/code&gt; mode, tuned to β = 10, reaches jump ratios of 0.95 / 1.02 / 1.12 against the overwrite&#39;s 0.93 / 0.96 / 1.06 in PyTorch. On the jump alone the gain over a tuned identity mode is small. What the overwrite adds is no β to tune (at β = 5 identity is clearly worse: 1.26 / 1.19 / 1.34), an exact prefix (0 against 0.08), and no gradient, which is what made it portable into vla.cpp. Exact RTC cost 1.9x per chunk in PyTorch (1962 against 1028 ms) and did worse than both gradient-free modes here. That is the opposite of the RTC paper&#39;s ordering, and I have not ruled out a problem in my VJP path, so I do not read it as a verdict on RTC.&lt;/p&gt; &lt;h2 id=&#34;how-it-differs-from-rtc&#34;&gt;How it differs from RTC&lt;a class=&#34;headerlink&#34; href=&#34;#how-it-differs-from-rtc&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;RTC solves the same problem with guidance: one vector-Jacobian product through the policy per denoising step. On π0.5 it costs 14 → 35 ms for 5 denoising steps, 76 → 97 ms per chunk (RTC, App. A.3, Table 3). In vla.cpp that path is not available today, because ggml lacks backward rules for flash attention and concat.&lt;/p&gt; &lt;p&gt;RTC does test an inpainting variant in its appendix (A.4, Fig. 8). That variant overwrites the &lt;em&gt;noisy&lt;/em&gt; prefix with forward-noised committed actions under a hard mask on the first d rows. It ran in simulation only (Kinetix), gave &#34;some benefit&#34; over naive async, and was beaten by guided RTC on solve rate. RTC&#39;s real-robot runs compare guided RTC, synchronous, naive async and temporal ensembling only; no overwrite variant ran on hardware.&lt;/p&gt; &lt;p&gt;Mine is a different variant. It corrects the predicted &lt;em&gt;clean&lt;/em&gt; chunk with RTC&#39;s soft mask over the whole overlap, which amounts to guidance with an identity Jacobian at weight 1/t. So the Kinetix ranking does not transfer as is, in either direction.&lt;/p&gt; &lt;h2 id=&#34;what-is-not-proven&#34;&gt;What is not proven&lt;a class=&#34;headerlink&#34; href=&#34;#what-is-not-proven&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;This is smoothness, measured offline on recorded episodes through the real engine. &lt;strong&gt;Task success on the arm has not been measured for any of these modes&lt;/strong&gt;: not for the overwrite, not for LeRobot&#39;s identity or exact RTC. That test is registered as G13a and has not run. The comparison with identity and exact RTC is offline and in PyTorch only; neither runs in vla.cpp.&lt;/p&gt; &lt;p&gt;Forcing the new chunk to agree with the old one could hurt success: if the old chunk was heading the wrong way, the new one now follows it for d steps. If G13a shows that, the fallback is training-time action conditioning (arXiv 2512.05964), which fine-tunes the policy to take a clean prefix instead of correcting it at inference.&lt;/p&gt; &lt;h2 id=&#34;try-it&#34;&gt;Try it&lt;a class=&#34;headerlink&#34; href=&#34;#try-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The model is the SmolVLA checkpoint &lt;code&gt;ravediamond/smolvla_2026-09-24_14-34-40&lt;/code&gt; (step 20000), converted to GGUF with vla.cpp&#39;s &lt;code&gt;scripts/convert_smolvla_to_gguf.py&lt;/code&gt;. The data is &lt;a href=&#34;https://huggingface.co/datasets/ravediamond/so101_bowls_all&#34;&gt;&lt;code&gt;ravediamond/so101_bowls_all&lt;/code&gt;&lt;/a&gt;. Build the branch on the Orin with &lt;code&gt;-DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=87 -DCMAKE_BUILD_TYPE=Release -DVLA_SPM=OFF&lt;/code&gt;. The boundary study ran as:&lt;/p&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;nv&#34;&gt;VLA_LIBRARY&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;~/workspace/git/vla.cpp/build-orin/libvla.so&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;PYTHONPATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;~/workspace/git/vla.cpp/bindings/python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;python&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;scripts/check_vlacpp_prefix_overwrite.py&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--gguf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;~/vla-models/smolvla-so101-bowls-020000.gguf&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;&lt;span class=&#34;se&#34;&gt;\&lt;/span&gt; &lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--episodes-from&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;shared/gate/data/2026-10-19_g13b_offline/g13b_summary.json&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;--out&lt;span class=&#34;w&#34;&gt; &lt;/span&gt;outputs/vlacpp_overwrite &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;The check script and the per-boundary rows live in my research repo, which is not public yet.&lt;/p&gt; &lt;p&gt;Every paper I test this way, with its bar and verdict, is on the &lt;a href=&#34;https://shissorobotics.com/papers/&#34;&gt;paper vs hardware page&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;&lt;em&gt;Updated 2026-10-26: added LeRobot&#39;s identity and exact RTC modes as baselines.&lt;/em&gt;&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-25-vla-chunk-boundary-jumps&#34;&gt;2026-10-25-vla-chunk-boundary-jumps&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Engineering on the Orin, 6 of 8.&lt;/strong&gt; &lt;a href=&#34;../../12/porting-act-to-vlacpp/&#34;&gt;← Engineering on the Orin 5: Porting ACT to vla.cpp, so a Jetson can run it without PyTorch&lt;/a&gt; · &lt;a href=&#34;../../26/p99-is-not-a-tail/&#34;&gt;Engineering on the Orin 7: p99 is not a tail: latency numbers that lie about chunked policies →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/25/vla-chunk-boundary-jumps/</link> <pubDate>Sun, 25 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/25/vla-chunk-boundary-jumps/</guid> </item> <item> <title>ContactGuard</title> <description>&lt;h1 id=&#34;contactguard&#34;&gt;ContactGuard&lt;a class=&#34;headerlink&#34; href=&#34;#contactguard&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a world model can predict a failed grasp before contact by imagining the next moments. On our arm we built the same monitor and compared it with the current camera view. It did not hold: imagining scored 0.70, the plain current view 0.82.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;ContactGuard probe AUROC: imagined latent 0.70; current latent 0.82; bar 0.85&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;ContactGuard probe AUROC: imagined latent 0.70; current latent 0.82; bar 0.85&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;133.3&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;imagined latent&lt;/text&gt;&lt;text x=&#34;255.3&#34; y=&#34;40&#34;&gt;0.70&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;155.8&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;current latent&lt;/text&gt;&lt;text x=&#34;277.8&#34; y=&#34;66&#34;&gt;0.82&lt;/text&gt;&lt;line x1=&#34;279.5&#34; y1=&#34;20&#34; x2=&#34;279.5&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;279.5&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 0.85&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not add an imagine-ahead grasp monitor trained on demonstration data alone. On our runs the current camera view predicted failure better. Retrain the world model with the deployed policy&amp;#x27;s own runs first.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;65 scored rollouts with 21 failures, mixed policies and two views, against their single policy and three views. The paper reports 0.98–0.99 against 0.84–0.92 over four grasp tasks. A corruption control is pending.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 6 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Detect grasp failures before contact for a chunked policy, by rolling an action-conditioned latent world model forward under the chunk the policy already emitted and reading the imagined latent with a small probe; shown on a dual-arm AgileX Piper with ACT.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A probe on the imagined latent after the grasp predicts grasp failure better than a probe on the current latent. &lt;small&gt;(Table 2 (0.98 vs 0.84))&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;The monitor can abort a grasp before contact, without access to the policy. &lt;small&gt;(§3.5 (online pre-contact monitor), §1)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; An event-anchored probe on imagined latents predicts grasp failure better than the current latent. · &lt;strong&gt;Bar:&lt;/strong&gt; AUROC ≥ 0.85 and ≥ 0.05 above the current latent. · &lt;strong&gt;n:&lt;/strong&gt; 65 scored rollouts, 21 failures&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; AUROC 0.98–0.99 imagined vs 0.84–0.92 current over four grasp tasks (Cup 0.98 vs 0.84) vs 0.70 imagined vs 0.82 current · &lt;strong&gt;Not proven:&lt;/strong&gt; Mixed policies and two views against their single policy and three views; corruption control pending.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2608.13438&#34;&gt;arXiv 2608.13438&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; no code link found&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-6&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; imagined-latent probe above current-latent probe on failure AUROC — theirs AUROC 0.98–0.99 vs 0.84–0.92 over four grasp tasks (Cup 0.98 vs 0.84) · ours 0.70 vs 0.82 &lt;small&gt;(paper Table 2 (ROC AUC, Cup .982 vs .840))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; current-latent probe above imagined-latent probe on failure AUROC · ours 0.82 vs 0.70 &lt;small&gt;(our measured comparison)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-contactguard&#34;&gt;2026-10-23-paper-vs-hardware-contactguard&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#latent-probe&#34;&gt;I need a probe on a world model&#39;s latents →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;!-- register-figs:start --&gt; &lt;!-- register-figs:end --&gt; &lt;p&gt;ContactGuard (Zheng, Johnson-Roberson, Zhi; arXiv 2608.13438) is the closest paper to what I run: a LeWM-style world model used as a pre-contact failure monitor on a real arm. Their monitor works. Mine, built to the same protocol, does not, with the opposite sign.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Shared ViT-tiny per camera, &lt;strong&gt;mean-pool three views&lt;/strong&gt; then a linear projection → one latent; predictor of four AdaLN-zero blocks; LeWM loss trained teacher-forced on unlabelled rollouts &lt;em&gt;and&lt;/em&gt; teleop; then frozen. The probe: anchor 15 frames (0.5 s) before the first gripper-closure command, roll out &lt;strong&gt;K = 30 steps&lt;/strong&gt; under the policy&#39;s actual chunk, standardise the imagined latent, fit a class-balanced ℓ2 logistic regression on ~250 labelled grasp attempts per task, freeze one threshold per task on validation. Online: trigger on the first open→close in the upcoming chunk, abort before contact if P(fail) &amp;gt; τ.&lt;/p&gt; &lt;p&gt;Evaluation on an AgileX Piper with an ACT policy, four grasp settings, test episodes excluded from everything. &lt;strong&gt;Closed loop&lt;/strong&gt;: 50 monitored live rollouts per setting with a 5-s pause-and-resume so the would-be outcome is recorded; AUC 0.99 / 0.95 / 0.90 / 0.92 vs a single-view LeWM and a no-rollout probe. &lt;strong&gt;Offline pools&lt;/strong&gt; (n = 101–144, five seeded 5-fold CV): ContactGuard 0.98 vs &lt;strong&gt;current latent 0.84&lt;/strong&gt; — same encoder, labels, probe, pools, only the imagined future replaced by the present one — with paired bootstrap CIs excluding zero on every task. &lt;strong&gt;Action corruption&lt;/strong&gt; (Table 3): shuffled chunks from other episodes collapse the full model from 0.965 to 0.535; zero and mean actions to ~0.84. So the signal is the specific action&#39;s imagined consequence. A counterfactual action swap raises P(fail) by +0.25 to +0.65. Proprioception added to the probe &lt;em&gt;hurts&lt;/em&gt; on all four (small-data shortcut). Runtime 19 ms on a 5090.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;W1-C1 (2026-10-19).&lt;/strong&gt; The protocol as written: anchor 15 frames before the first close, 30-step imagination under the executed chunk, logistic probe, &lt;strong&gt;current latent as the matched baseline&lt;/strong&gt;, 5-fold × 5 seeds on the 69 published rollouts (65 scored; two stalls and two others never close). Bar: AUROC ≥ 0.85 and ≥ 0.05 above the current latent. Result: imagined &lt;strong&gt;0.70&lt;/strong&gt; (folds 0.72 ± 0.13), current &lt;strong&gt;0.82&lt;/strong&gt; (0.83 ± 0.11). Imagination is 0.12 worse. The fold threshold gives 27 % held-out false aborts.&lt;/p&gt; &lt;p&gt;W1 itself follows the multi-view ContactGuard recipe (mean-pooled views), which is why the comparison is as direct as it gets.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper (Piper, ACT)&lt;/th&gt; &lt;th&gt;This arm (SO-101, mixed policies)&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Imagined-latent probe&lt;/td&gt; &lt;td&gt;0.98&lt;/td&gt; &lt;td&gt;0.70&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Current-latent probe&lt;/td&gt; &lt;td&gt;0.84&lt;/td&gt; &lt;td&gt;0.82&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Difference&lt;/td&gt; &lt;td&gt;+0.14, CI excludes 0&lt;/td&gt; &lt;td&gt;&lt;strong&gt;−0.12&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Labelled attempts&lt;/td&gt; &lt;td&gt;~250 per task&lt;/td&gt; &lt;td&gt;65&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Views&lt;/td&gt; &lt;td&gt;3&lt;/td&gt; &lt;td&gt;2&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;World-model training data&lt;/td&gt; &lt;td&gt;rollouts + teleop&lt;/td&gt; &lt;td&gt;teleop only&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Arm&lt;/td&gt; &lt;td&gt;torque-controlled&lt;/td&gt; &lt;td&gt;position-controlled servos&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The current-latent probes agree (0.84 vs 0.82): the encoder reads &#34;this state looks risky&#34; about as well on both arms. The imagined-latent probes do not: theirs adds information, mine subtracts it. The candidates, none proven: their world model saw the deployed policy&#39;s own rollouts in training and mine saw only teleop, so my imagination is off-distribution exactly at the states the monitor is for; 65 labels vs 250; two views vs three; and a torque-controlled approach that carries contact information a position-controlled one does not. The paper gives the control that would say which: Table 3&#39;s action corruption. If shuffled chunks do not push my imagined-latent AUROC below 0.70, the rollout carries no action information on my data and the encoder, not the probe, is the gap. That test is offline and free and is now in the amendments.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; does not reproduce; the matched baseline wins on my arm; mechanism unknown.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; the corruption test, then W1 retrained with policy rollouts in the mix.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-contactguard&#34;&gt;2026-10-23-paper-vs-hardware-contactguard&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 6 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-d-jepa/&#34;&gt;← Papers tested 5: D-JEPA&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-fail-detect-and-safe/&#34;&gt;Papers tested 7: FAIL-Detect and SAFE →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-contactguard/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-contactguard/</guid> </item> <item> <title>D-JEPA</title> <description>&lt;h1 id=&#34;d-jepa&#34;&gt;D-JEPA&lt;a class=&#34;headerlink&#34; href=&#34;#d-jepa&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a small ranking add-on, trained on the outcome of every candidate, picks better motions than the world model. We trained it on our recorded runs with stand-in labels, not with real outcomes. Not tested: with those labels the regret stayed at 0.263, the same as the world model alone.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Ranking regret (lower is better): D-JEPA (W1R) 0.263; action only −0.007; bar 0.10&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Ranking regret (lower is better): D-JEPA (W1R) 0.263; action only −0.007; bar 0.10&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;142.8&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;D-JEPA (W1R)&lt;/text&gt;&lt;text x=&#34;264.8&#34; y=&#34;40&#34;&gt;0.263&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;1.5&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;action only&lt;/text&gt;&lt;text x=&#34;117.9&#34; y=&#34;66&#34;&gt;−0.007&lt;/text&gt;&lt;line x1=&#34;172.3&#34; y1=&#34;20&#34; x2=&#34;172.3&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;172.3&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 0.10&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Nothing to change yet. The method needs every candidate motion actually executed from the same start, which our data does not have.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Proxy labels (the executed chunk counts as the success) on 703 anchors. The paper&amp;#x27;s protocol needs executed outcomes on at least 25 held-out starts. The proxy version fails and is renamed; the real test is not run.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 5 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Close the gap between a world model&amp;#x27;s global predictive geometry and the decision among the few candidates that compete for execution, with a set operator that corrects each candidate&amp;#x27;s score, trained on counterfactual execution of every candidate.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Among the top few candidates, latent goal distance misorders successes and failures. &lt;small&gt;(§3, Fig. 2c–d)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;li&gt;A permutation-equivariant ranking operator on frozen world models raises planning success over the base models. &lt;small&gt;(§4 (operator), §6, Tables 1–2)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested&#34;&gt;not tested&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-not-tested&#34;&gt;not tested&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A decision-aligned ranking operator on a frozen world model picks better action chunks. · &lt;strong&gt;Bar:&lt;/strong&gt; G1b regret ≤ 0.10 and ≤ the action-only baseline + 0.05. · &lt;strong&gt;n:&lt;/strong&gt; 703 val anchors&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; +4 to +17 points vs regret 0.263 (W1 alone 0.263; action-only −0.007) · &lt;strong&gt;Not proven:&lt;/strong&gt; Proxy labels (executed chunk = success); the executed-candidate version is not run.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2609.24749&#34;&gt;arXiv 2609.24749&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/NEBULIS-Lab/D-JEPA&#34;&gt;NEBULIS-Lab/D-JEPA&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-5&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-not-tested&#34;&gt;not tested&lt;/span&gt; decision-aligned ranking operator below latent world-model ranking on G1b regret — theirs +4 to +17 points · ours regret 0.2631 (W1 alone 0.2630) &lt;small&gt;(paper §6, Tables 1, 2 and 4 (+4 to +17 points))&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-d-jepa&#34;&gt;2026-10-23-paper-vs-hardware-d-jepa&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;D-JEPA (Liu, Wu, Wen, You, Zhang, Hao, Lin, Su; arXiv 2609.24749) names my strongest negative result — latent distance misorders the few candidates that compete for execution — and proposes a fix. I ran the fix with the wrong labels. This post says what the paper&#39;s test needs and why mine was not it.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The &#34;decision-local prediction gap&#34;: a world model&#39;s latent geometry can be globally informative (Spearman 0.90 between predicted and realised cost over all 63 candidates on a Push-T start) and still misorder the top four (&lt;strong&gt;0.11&lt;/strong&gt;). The fix is &lt;strong&gt;not a training loss&lt;/strong&gt;. It is a permutation-equivariant set operator over the whole candidate set: per candidate, a descriptor from the terminal latent minus the goal and its native rank; a shared encoder, two Set-Transformer layers, and a bounded correction δ = ε·tanh(·) with &lt;strong&gt;ε = 0.2&lt;/strong&gt;, so the operator can only reorder within 2ε of the native minimum and can never overturn a confident choice (Prop. 2). Loss: success mass under a softmax over scores, a local ordering term near the boundary, and a trust penalty on unnecessary correction.&lt;/p&gt; &lt;p&gt;The supervision is the expensive part: &lt;strong&gt;every candidate in the set is executed from the restored start and labelled&lt;/strong&gt; — counterfactual execution. Evaluation: Push-T confirmation cohort of 256 starts (Reacher 128, Granular 64) with fitting, calibration and evaluation starts &lt;strong&gt;disjoint&lt;/strong&gt;, Wilson intervals in the figures, paired counts; Push-T 83.6 → 87.9, Reacher 86.7 → 93.8. Real PiPER with a V-JEPA 2-AC planner, &lt;strong&gt;50 paired starts per task&lt;/strong&gt;: Push-T 56 → 74, two-cube stack 72 → 88 (gains/losses 12/3 and 10/2).&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;W1-R (2026-10-22).&lt;/strong&gt; The operator exactly as App. A.2 describes it, on frozen W1&#39;s G1b candidates, five seeds, τ calibrated on 20 % of training episodes. Labels: &lt;strong&gt;proxy&lt;/strong&gt; — the executed expert chunk marked success, the seven decoys marked failure. Bar: mean regret ≤ 0.10 and ≤ action-only + 0.05. Result: W1-R regret &lt;strong&gt;0.2631 vs W1 0.2630&lt;/strong&gt;; the gate chose &#34;never replace&#34; in 24 of 25 operators because W1 ranks its own training episodes at 0.67–0.91 and validation at 0.45–0.61, so calibration found nothing to fix. An exploratory perfect rank-2 swap would reach 0.115–0.154: the bar is out of reach for a rank-local operator with K = 8 even with perfect labels.&lt;/p&gt; &lt;p&gt;An earlier draft of the angle (NEXT_ANGLES §1) described D-JEPA as a loss term on the world model. Claude Code caught the error when the protocol had to cite the section; the implementation is the operator, the write-up says plainly that it does not test the paper&#39;s claim.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Labels&lt;/td&gt; &lt;td&gt;executed outcomes of every candidate&lt;/td&gt; &lt;td&gt;proxy: expert = success, decoys = failure&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Candidate set&lt;/td&gt; &lt;td&gt;63 (sim), planner&#39;s pool (real)&lt;/td&gt; &lt;td&gt;8&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Fit / calibration / eval&lt;/td&gt; &lt;td&gt;disjoint starts, Wilson CIs&lt;/td&gt; &lt;td&gt;train / 20 % cal / held-out episodes&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Gain&lt;/td&gt; &lt;td&gt;+4 to +17 points&lt;/td&gt; &lt;td&gt;0.000 regret&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Nothing about D-JEPA was tested. Proxy labels are a tautology for the operator (the &#34;success&#34; is whichever candidate the expert took), so the operator has nothing to learn that the native rank does not already express. The paper&#39;s claim needs the labels the paper pays for: the outcome of actually executing each candidate from the same start. On my arm that is affordable only in one place — the G7 cube session, where the undo primitive restores the layout and G9c-3 labels at rest; four to eight executed candidates per start for a subset of starts is two hours of a robot day. The bounded-correction design, independently of the result, is the right safety property for any re-ranker on a physical arm.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; not tested; the proxy version fails and is renamed. The paper&#39;s protocol is written into the amendments for G7.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; executed outcomes on ≥ 25 held-out starts.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-d-jepa&#34;&gt;2026-10-23-paper-vs-hardware-d-jepa&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 5 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-h-jepa/&#34;&gt;← Papers tested 4: H-JEPA&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-contactguard/&#34;&gt;Papers tested 6: ContactGuard →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-d-jepa/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-d-jepa/</guid> </item> <item> <title>DINO-WM</title> <description>&lt;h1 id=&#34;dino-wm&#34;&gt;DINO-WM&lt;a class=&#34;headerlink&#34; href=&#34;#dino-wm&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a planner built on a large frozen image model plans to a goal image better than learned ones. On our arm we measured how well its features track the arm and rank candidate motions. Partly: it reads the arm&amp;#x27;s pose well (0.92 of the variance) but ranks motions worse than ignoring the camera.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Ranking 8 action chunks, top-1: DINO-WM (W2) 0.55–0.61; action only 0.68–0.90; bar 0.8&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Ranking 8 action chunks, top-1: DINO-WM (W2) 0.55–0.61; action only 0.68–0.90; bar 0.8&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;105.4&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;rect x=&#34;223.4&#34; y=&#34;29&#34; width=&#34;11.3&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.15&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;DINO-WM (W2)&lt;/text&gt;&lt;text x=&#34;238.8&#34; y=&#34;40&#34;&gt;0.55–0.61&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;130.0&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;rect x=&#34;248.0&#34; y=&#34;55&#34; width=&#34;41.9&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34; fill-opacity=&#34;0.15&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;action only&lt;/text&gt;&lt;text x=&#34;293.9&#34; y=&#34;66&#34;&gt;0.68–0.90&lt;/text&gt;&lt;line x1=&#34;270.0&#34; y1=&#34;20&#34; x2=&#34;270.0&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;270.0&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 0.8&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Use these frozen image features if you need to read the arm&amp;#x27;s pose from the camera. Do not rank motions with them on this arm: the joint commands alone did better. The encoder is also too slow for the planning loop on a Jetson.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;The paper compares against world models that learn their own images, never an action-only ranking. Here: 25 validation episodes, 703 anchors; ranking 0.55–0.61 against 0.68–0.90 without a model. One training per model; no closed-loop planning.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 2 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Plan for manipulation and navigation with a world model built on frozen DINOv2 patch features, so that no task-specific visual representation has to be learned; a transition model predicts the next patch features and CEM plans toward a goal image, in six simulated environments.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A transition model on frozen DINOv2 patches plans to goal images better than world models that learn their own representation. &lt;small&gt;(Table 1 (Push-T 0.90 vs DreamerV3 0.30))&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Patch features, not a pooled global vector, carry the spatial detail manipulation needs. &lt;small&gt;(Table 2 (encoder ablation))&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A predictor on frozen DINOv2 patches plans better than one on a learned latent. · &lt;strong&gt;Bar:&lt;/strong&gt; G1b top-1 ≥ 0.8 at some target distance. · &lt;strong&gt;n:&lt;/strong&gt; 25 val episodes, 703 anchors&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; Push-T planning success 0.90 vs arm-pose R² 0.92 (vs 0.57 for W1); G1b top-1 0.55–0.61; no-model baseline 0.68–0.90 · &lt;strong&gt;Not proven:&lt;/strong&gt; One training each (W2 lost, W2′ retrained); planning not run in closed loop.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2411.04983&#34;&gt;arXiv 2411.04983&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/gaoyuezhou/dino_wm&#34;&gt;gaoyuezhou/dino_wm&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-2&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; latent world-model ranking above action-only baseline on G1b top-1 — theirs Push-T planning success 0.90 · ours 0.61 vs 0.68–0.90 action-only &lt;small&gt;(paper §3.2 and §4.3, Table 1 (planning with DINO-WM))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; frozen-DINOv2 world model above JEPA world model on arm-pose R² — theirs not reported for an arm pose · ours 0.92 vs 0.57 &lt;small&gt;(paper §4.4, Table 2 (frozen pretrained features encode the scene))&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai): W2 &amp;lt; $1, W2′ ~$0.65, probes ~$0.06; ~$1.7. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-dino-wm&#34;&gt;2026-10-23-paper-vs-hardware-dino-wm&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;DINO-WM (Zhou, Pan, LeCun, Pinto; arXiv 2411.04983) is the recipe behind W2: frozen DINOv2 patches plus a learned dynamics model. It had the better representation and lost the same planning gate as W1, more slowly.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Three parts, one trained: a &lt;strong&gt;frozen&lt;/strong&gt; DINOv2 encoder gives N patch embeddings per 224×224 frame; a ViT transition model takes H frames of patches with the action MLP-embedded and concatenated to every patch, attends causally at the frame level, and predicts the whole next frame of patches at once; a transposed-conv decoder trained separately is for visualisation only (backpropagating its loss into the predictor hurt, their A.4.3). Loss: ‖p(enc(o), φ(a)) − enc(o_{t+1})‖², teacher-forced. Because the encoder is frozen, collapse is impossible by construction; the price is a representation that cannot adapt to the task. Planning: CEM in MPC to an image goal, cost ‖ẑ_T − z_g‖²; gradient descent through the model was tried and was worse (A.5.3).&lt;/p&gt; &lt;p&gt;Six simulated environments. Metric: success on &lt;strong&gt;50 sampled (start, goal) pairs&lt;/strong&gt; (Chamfer distance on 10 instances for the deformable ones). Table 1: Push-T 0.90 vs DreamerV3 0.30, IRIS 0.32, TD-MPC2 0.00. Table 2, the number that matters most for anyone picking a representation: Push-T with DINO &lt;strong&gt;CLS&lt;/strong&gt; 0.44, ResNet 0.20, R3M 0.42, DINO &lt;strong&gt;patches&lt;/strong&gt; 0.90. No standard errors, no real robot, no non-learned baseline.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;W2: frozen DINOv2-S patches, learned dynamics, trained on the same 182 episodes. Lost to a disk failure; &lt;strong&gt;W2′&lt;/strong&gt; retrained on 2026-10-23 (seed 3073, $0.65) reproduces its probes exactly.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G1 probes.&lt;/strong&gt; Arm-pose R² &lt;strong&gt;0.92&lt;/strong&gt; (W1: 0.57), gripper-open AUROC 0.999, grasp onset 0.995. The frozen patch representation encodes the arm far better than W1&#39;s end-to-end CLS latent, which is Table 2&#39;s CLS-vs-patch result on real frames.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G1b, ranking.&lt;/strong&gt; Bar: top-1 ≥ 0.8. Result: &lt;strong&gt;0.55–0.61&lt;/strong&gt; at every horizon. Fail. Open-loop error 0.62 of copy-last (W1: 0.36) — the better representation came with &lt;em&gt;worse&lt;/em&gt; dynamics; action-corruption ratio only 1.13 (reacts less to wrong actions than W1).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G2, latency.&lt;/strong&gt; A single decision (10 rollouts × 30 steps) on the Mac: W1 108 ms, &lt;strong&gt;W2 1 814 ms&lt;/strong&gt;. The DINOv2 encoder alone is hundreds of ms per frame on an Orin. W3 (bigger) was not run because the decision rule said it would not change the build.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G10 outcome readout.&lt;/strong&gt; AUROC 0.976 (W1 1.000).&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper (sim)&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Patch &amp;gt; CLS for state&lt;/td&gt; &lt;td&gt;0.90 vs 0.44 (Push-T success)&lt;/td&gt; &lt;td&gt;R² 0.92 vs 0.57 (arm pose)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Planning success&lt;/td&gt; &lt;td&gt;0.90 Push-T&lt;/td&gt; &lt;td&gt;top-1 0.55–0.61; no-model baseline 0.68–0.90&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Planning time&lt;/td&gt; &lt;td&gt;47 s/episode (LeWM&#39;s measurement)&lt;/td&gt; &lt;td&gt;1.8 s per decision on a Mac; off the Orin&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Pairwise accuracy&lt;/td&gt; &lt;td&gt;not reported&lt;/td&gt; &lt;td&gt;0.92–0.93; top-1 ≈ pairwise⁷&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The representation result transfers and the planning result does not, for the same reason as W1: nothing in the paper is compared to a planner with no model. The one new thing W2 taught: a better frozen encoder does not give better dynamics for free; the learned predictor on top of DINOv2 patches reacted &lt;em&gt;less&lt;/em&gt; to wrong actions than the small end-to-end model. And DINO-WM-style online planning is off the table on an Orin on latency alone; the role is offline ranking or verification, where W2′&#39;s patch tokens are the ones to use for anything object-level (G7).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; representation reproduces; planning fails the baseline; the encoder cost rules out the loop.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; an object-state test (G7) where the patch representation&#39;s spatial detail is the thing being measured, scored offline.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai): W2 &amp;lt; $1, W2′ ~$0.65, probes ~$0.06; ~$1.7.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-dino-wm&#34;&gt;2026-10-23-paper-vs-hardware-dino-wm&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 2 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-leworldmodel/&#34;&gt;← Papers tested 1: LeWorldModel&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-robojepa/&#34;&gt;Papers tested 3: RoboJEPA →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-dino-wm/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-dino-wm/</guid> </item> <item> <title>FAIL-Detect and SAFE</title> <description>&lt;h1 id=&#34;fail-detect-and-safe&#34;&gt;FAIL-Detect and SAFE&lt;a class=&#34;headerlink&#34; href=&#34;#fail-detect-and-safe&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a statistical band fitted on successful runs keeps false alarms at a chosen rate. On our arm we fitted it to a world model&amp;#x27;s surprise and set that rate to 5 %. It did not hold: it flagged 22.7 % of successful runs and caught 46 % of failures.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Successful runs flagged, % (lower is better): paper: at most α 5.0 %; this rig 22.7 %; bar 1/20&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Successful runs flagged, % (lower is better): paper: at most α 5.0 %; this rig 22.7 %; bar 1/20&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;31.7&#34; height=&#34;14&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;paper: at most α&lt;/text&gt;&lt;text x=&#34;153.7&#34; y=&#34;40&#34;&gt;5.0 %&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;144.0&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;this rig&lt;/text&gt;&lt;text x=&#34;266.0&#34; y=&#34;66&#34;&gt;22.7 %&lt;/text&gt;&lt;line x1=&#34;149.7&#34; y1=&#34;20&#34; x2=&#34;149.7&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;149.7&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 1/20&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not trust a band&amp;#x27;s promised false-alarm rate without checking it on your own runs. Here it flagged far more successful runs than promised.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;FAIL-Detect&amp;#x27;s band on one world model&amp;#x27;s surprise: 22 + 22 successes, 25 failures, 20 splits. Their own scores were not reimplemented, and SAFE&amp;#x27;s probe is not yet tested cleanly.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 7 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Detect policy failures at run time from scores built without failure data (FAIL-Detect) or from a probe on a VLA&amp;#x27;s own features trained on both outcomes (SAFE), with a conformal band that fixes the false-alarm rate.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A conformal band calibrated on successful rollouts keeps false alarms at or below the chosen rate α on in-distribution successes. &lt;small&gt;(FAIL-Detect §IV-B; SAFE §4.3)&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Learned scores flag failures early enough to matter, on simulated and real robots. &lt;small&gt;(FAIL-Detect Fig. 4–5; SAFE Table 1, Fig. 4 and 6)&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A conformal band on a learned failure score keeps false alarms at α while catching failures. · &lt;strong&gt;Bar:&lt;/strong&gt; Successes flagged ≤ 1/20; failures flagged ≥ 50 %. · &lt;strong&gt;n:&lt;/strong&gt; 22 + 22 successes, 25 failures, 20 splits&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; false alarms ≤ α on in-distribution successes (conformal coverage bound) vs 22.7 % of successes flagged at α = 5 %; 46 % of failures caught · &lt;strong&gt;Not proven:&lt;/strong&gt; One world model&#39;s surprise as the score; their own scores were not reimplemented.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2503.08558&#34;&gt;arXiv 2503.08558&lt;/a&gt;, &lt;a href=&#34;https://arxiv.org/abs/2506.09937&#34;&gt;arXiv 2506.09937&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/CXU-TRI/FAIL-Detect&#34;&gt;CXU-TRI/FAIL-Detect&lt;/a&gt;, &lt;a href=&#34;https://github.com/vla-safe/SAFE&#34;&gt;vla-safe/SAFE&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-7&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; conformal failure band equals conformal level α on successes flagged — theirs false alarms ≤ α · ours 22.7 % at α = 5 % &lt;small&gt;(FAIL-Detect §IV-B; SAFE §4.3 (coverage ≥ 1 − α))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; conformal failure band at least pass mark on failures caught — theirs high recall at the target α · ours 46 % &lt;small&gt;(FAIL-Detect Fig. 4–5; SAFE Table 1)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-contactguard&#34;&gt;2026-10-23-paper-vs-hardware-contactguard&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;Two papers, one experiment: both calibrate a &lt;strong&gt;time-varying conformal band&lt;/strong&gt; on successful rollouts and flag a run that leaves it. FAIL-Detect (Xu et al., TRI; arXiv 2503.08558) does it on learned OOD scores with no failure data; SAFE (Gu et al., UofT/TRI; arXiv 2506.09937) on a probe of the VLA&#39;s own features trained with failures. I ran the band on W1&#39;s surprise (W1-C2). It failed, and the way it failed is the way FAIL-Detect&#39;s own hardware section describes.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-papers-claim-and-how-they-measure-it&#34;&gt;What the papers claim, and how they measure it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-papers-claim-and-how-they-measure-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;FAIL-Detect&lt;/strong&gt;: a scalar score per step from the policy&#39;s observation embedding — logpZO (a flow from the embedding distribution to N(0, I); the score is the log-density), NatPN, RND — plus post-hoc baselines (STAC, which needs 256 policy samples per step; PCA-kmeans; smoothness). A band over time is fitted to the success distribution; a flag is raised when the score exceeds it. Sixteen simulated settings (four robomimic tasks × two policies × ID/OOD); summary is &lt;strong&gt;top-1 count across settings&lt;/strong&gt;: logpZO 10/16. Hardware: Franka bimanual, two tasks, fewer rollouts; logpZO top-1 on 8/12. The caveat is in §VI: with ID-only bands, OOD-but-successful rollouts are flagged, &#34;at times yielding low or close to zero TNR&#34;; the fix needs successes from every new setting. Detection time for STAC exceeds the average success duration.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;SAFE&lt;/strong&gt;: the VLA&#39;s last-layer features already separate success from failure across tasks (a shared &#34;failure zone&#34; in t-SNE). A tiny MLP or LSTM on them, trained on seen tasks with trajectory-level labels, generalises to unseen tasks. Threshold by &lt;strong&gt;functional conformal prediction&lt;/strong&gt; on successful calibration rollouts, FPR ≤ α at any time step. Three random seen/unseen splits; ROC-AUC on the &lt;strong&gt;max-so-far&lt;/strong&gt; score (a flag anywhere on a success is a false positive); 14 adapted baselines. Sim unseen AUROC ~0.78 vs best baseline ~0.74; real Franka 30 + 30 per task and WidowX 532 rollouts; &amp;lt; 1 ms overhead.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;W1-C2 (2026-10-19).&lt;/strong&gt; A time-varying functional CP band on W1&#39;s long surprise, fitted on 22 successes, tested on the other 22 successes and the 8 failures, 20 seeds. Bar (median): successes flagged ≤ 1/20, failures ≥ 50 %. Result: successes &lt;strong&gt;22.7 %&lt;/strong&gt; (IQR 13.6–27.3), failures 46 %, stalls 34 %. Fail. The band as registered fits μ, σ and the radius on the same successes: on synthetic exchangeable data its false-alarm rate is 0.14 at 20 anchors — about α only with separate μ/σ data. So the band was not conformal across time as written, and even a correct band sits on a surprise distribution that widens on fresh data (W1-A: the live reflex fitted on one session flagged 42/42 successes on the next).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;C1 probe (2026-10-11)&lt;/strong&gt;, the SAFE-shaped question — does the imagined latent predict failure better than simpler signals? — found &lt;strong&gt;policy identity alone at 0.76&lt;/strong&gt; beating every probe (current 0.68, imagined 0.72), because the failure set was dominated by one policy.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Papers&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;False alarms at the registered α&lt;/td&gt; &lt;td&gt;≈ α by construction&lt;/td&gt; &lt;td&gt;22.7 % (α = 5 %)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Failures caught&lt;/td&gt; &lt;td&gt;logpZO top-1 in 10/16 settings; SAFE unseen AUROC 0.78&lt;/td&gt; &lt;td&gt;46 %&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Transfer across sessions&lt;/td&gt; &lt;td&gt;&#34;close to zero TNR&#34; without new-setting successes (FAIL-Detect §VI)&lt;/td&gt; &lt;td&gt;42/42 successes flagged on the next session&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Policy-identity baseline&lt;/td&gt; &lt;td&gt;not run&lt;/td&gt; &lt;td&gt;0.76, beats every probe&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The unsupervised band fails on hardware the same way in Palo Alto and in Paris: the success distribution shifts with the setting and the band does not know. The supervised probe (SAFE&#39;s design) is the one that works on hardware in every paper I read, and the C1 result says my version of it is blocked on a confound the papers do not check — the failure labels came mostly from one policy. The register now requires a policy-identity and episode-length baseline under every monitor result, which neither paper runs.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; FAIL-Detect&#39;s band fails here as its authors warn it can; SAFE&#39;s probe is not yet tested cleanly.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; SAFE-MLP on SmolVLA&#39;s action-expert input features exported from vla.cpp, three random task splits, with episode length beside it.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-contactguard&#34;&gt;2026-10-23-paper-vs-hardware-contactguard&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 7 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-contactguard/&#34;&gt;← Papers tested 6: ContactGuard&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-reap/&#34;&gt;Papers tested 8: ReAP →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-fail-detect-and-safe/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-fail-detect-and-safe/</guid> </item> <item> <title>H-JEPA</title> <description>&lt;h1 id=&#34;h-jepa&#34;&gt;H-JEPA&lt;a class=&#34;headerlink&#34; href=&#34;#h-jepa&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a slow upper layer in a stacked world model tracks progress toward the goal. On our arm we checked whether its distance to the goal falls steadily along recorded runs. It did not hold: it signalled a stall that was not there 52 % of the time.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 72&#34; role=&#34;img&#34; aria-label=&#34;False stalls, % of runs (lower is better): H-JEPA level 2 52 %; bar 10 %&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;False stalls, % of runs (lower is better): H-JEPA level 2 52 %; bar 10 %&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;164.7&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;H-JEPA level 2&lt;/text&gt;&lt;text x=&#34;286.7&#34; y=&#34;40&#34;&gt;52 %&lt;/text&gt;&lt;line x1=&#34;149.7&#34; y1=&#34;20&#34; x2=&#34;149.7&#34; y2=&#34;56&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;149.7&#34; y=&#34;68&#34; text-anchor=&#34;middle&#34;&gt;bar 10 %&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not use this layer&amp;#x27;s distance as a progress meter on a short tabletop task. The paper itself predicts this: the method needs tasks with a clear gap between fast and slow changes.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;The paper&amp;#x27;s number is the lower level&amp;#x27;s cost to the subgoals handed down, not the upper level&amp;#x27;s distance tested here. Our task has no gap between fast and slow changes, which the paper says the method needs.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 4 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Stack JEPA world models into a hierarchy with a distinct latent space per level, so that upper levels plan in abstract states over longer horizons and hand subgoals down; shown in simulation, with an open-loop fidelity measure on DROID.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A hierarchy of distinct latent spaces plans long-horizon tasks with less planner compute than a flat model. &lt;small&gt;(Fig. 6 (AntMaze 18 % → 73 %))&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;li&gt;The lower level&amp;#x27;s cost to the subgoals handed down falls steadily along expert trajectories (Spearman 0.89–1.00), more consistently than its cost to the final goal (0.48–0.75). &lt;small&gt;(§4.2, Fig. 8; Table 10 (Spearman 0.89–1.00))&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Upper levels drop fast-varying entities when the data has an entity-frequency gap above about 2×. &lt;small&gt;(Fig. 4–5)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A slow second level makes latent distance track task progress. · &lt;strong&gt;Bar:&lt;/strong&gt; Progress monotonicity Spearman ρ ≤ −0.80; false stalls ≤ 10 %. · &lt;strong&gt;n:&lt;/strong&gt; teleop val episodes (monotonicity, stalls); 88 rollouts (sanity check)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; subgoal-tracking Spearman 0.89–1.00 vs level-2 ρ −0.73; false stalls 52 % · &lt;strong&gt;Not proven:&lt;/strong&gt; Outside the paper&#39;s regime (no entity-frequency gap on this task).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2610.06805&#34;&gt;arXiv 2610.06805&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; no code link found&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-4&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; second-level latent distance at most pass mark on progress Spearman ρ — theirs subgoal-tracking (level-1 cost to level-2 subgoals) Spearman 0.89–1.00; no level-2 distance-to-goal reported · ours ρ −0.73; false stalls 52 % &lt;small&gt;(paper, subgoal-tracking Spearman 0.89–1.00)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Mac). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-14-g6-progress-latents&#34;&gt;2026-10-14-g6-progress-latents&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;H-JEPA (Zhang, Terver, Rabbat, LeCun, Balestriero; arXiv 2610.06805) stacks LeWorldModels across timescales. I tested its level-2 slow feature as a progress signal (G6b) and it failed. Reading the paper afterwards, the paper&#39;s own Fig. 5 predicts that failure.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Level 1 is LeWM. Each level ℓ &amp;gt; 1 has its own state encoder (a pointwise MLP over the level below), its own action encoder pooling s_ℓ lower actions, and its own causal predictor, stride 2 per level, all trained end-to-end with a LeWM loss per level. On real data (DROID) an &lt;strong&gt;inverse-dynamics term&lt;/strong&gt; is required or the model collapses to &#34;encode the predictable background, drop the arm&#34; (their App. L). Planning is top-down by gradient descent: the top level plans macro-actions; its predicted states become subgoals for the level below.&lt;/p&gt; &lt;p&gt;Evaluation: four simulated environments; success rate; &lt;strong&gt;three paired model + planner seeds with SE&lt;/strong&gt;; planner compute swept and reported as &lt;strong&gt;TFLOPs per episode&lt;/strong&gt;; depth 1–4 at a fixed 100-TFLOP budget on 50 tasks per environment. Baseline HWM (same hierarchy, shared latent) separates &#34;temporal decomposition&#34; from &#34;distinct abstract spaces&#34;. AntMaze 18 → 73 % at three levels; two levels match LeWM on Push-T, three levels fail there because episodes are short. The mechanism figure: probe NMSE per entity vs level shows body pose becoming unrecoverable while position stays; the &lt;strong&gt;entity-frequency gap&lt;/strong&gt; (ratio of spectral centroids of fastest and slowest state components) predicts when this selective abstraction appears — above ~2× it does; &lt;strong&gt;Push-T, Cube and DROID have gaps below 2× and show none&lt;/strong&gt;. On DROID the metric is Fréchet fidelity of the planned end-effector path against the expert&#39;s (15 clips, three seeds). No closed-loop real robot.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;G6b.&lt;/strong&gt; A level-2 slow feature (stride 15, SIGReg loss) on W1, tested as a progress signal on the bowls task. Bars: T1 Spearman between latent distance and time ≤ −0.80; false-stall rate ≤ 10 %; sanity AUROC ≥ 0.95. Result: T1 &lt;strong&gt;−0.73&lt;/strong&gt; (fail), false stalls &lt;strong&gt;52 %&lt;/strong&gt; (fail), sanity 0.998 (pass). The hierarchy was dropped.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Where hierarchy helps&lt;/td&gt; &lt;td&gt;AntMaze (frequency gap &amp;gt; 2×): 18 → 73 %&lt;/td&gt; &lt;td&gt;bowls task: one arm, one object, ~1 Hz everything&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Where it does not&lt;/td&gt; &lt;td&gt;Push-T, Cube, DROID (gap &amp;lt; 2×)&lt;/td&gt; &lt;td&gt;same regime&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Progress monotonicity&lt;/td&gt; &lt;td&gt;subgoal-tracking Spearman 0.89–1.00 (Fig. 8)&lt;/td&gt; &lt;td&gt;level-2 distance vs time −0.73&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;I tested the hierarchy on data the paper says it should not change. There is no frequency gap on a single-arm pick-and-nest task; the paper&#39;s own prediction for that regime is &#34;no selective abstraction&#34;, and that is what G6b found. So the negative result and the paper&#39;s claim do not conflict; the gate was outside the claim. Two things do transfer: the inverse-dynamics term, which W1 does not need on single-scene data but W2′ on mixed lighting might; and &lt;strong&gt;Fréchet fidelity&lt;/strong&gt; as an offline, open-loop plan-quality metric against expert paths — it costs nothing on my 69 rollouts and would have told me before G1b that the plans do not follow the demos.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; fail, outside the paper&#39;s regime; the paper&#39;s mechanism test (Fig. 5) is the better reading than my gate.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; a task with a real timescale gap (a tidy loop with navigation-scale structure), which my bench does not have.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Mac). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-14-g6-progress-latents&#34;&gt;2026-10-14-g6-progress-latents&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 4 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-robojepa/&#34;&gt;← Papers tested 3: RoboJEPA&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-d-jepa/&#34;&gt;Papers tested 5: D-JEPA →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-h-jepa/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-h-jepa/</guid> </item> <item> <title>LeWorldModel</title> <description>&lt;h1 id=&#34;leworldmodel&#34;&gt;LeWorldModel&lt;a class=&#34;headerlink&#34; href=&#34;#leworldmodel&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a small world model, trained from camera images, learns a robot&amp;#x27;s motion well enough to plan with. On our arm we checked whether it ranks the motion actually taken first among 8 candidates. It did not hold: it was right 0.60 of the time, below a check that ignores the camera.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Ranking 8 action chunks, top-1: world model 0.60; action only 0.68–0.90; bar 0.8&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Ranking 8 action chunks, top-1: world model 0.60; action only 0.68–0.90; bar 0.8&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;114.9&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;world model&lt;/text&gt;&lt;text x=&#34;236.9&#34; y=&#34;40&#34;&gt;0.60&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;130.0&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;rect x=&#34;248.0&#34; y=&#34;55&#34; width=&#34;41.9&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34; fill-opacity=&#34;0.15&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;action only&lt;/text&gt;&lt;text x=&#34;293.9&#34; y=&#34;66&#34;&gt;0.68–0.90&lt;/text&gt;&lt;line x1=&#34;270.0&#34; y1=&#34;20&#34; x2=&#34;270.0&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;270.0&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 0.8&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not plan with this kind of model on a small position-controlled arm yet. Ranking motions by the joint commands alone did better. Its predictions still beat copying the last frame (0.31 against 0.89 error).&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;The paper plans in simulation and never runs an action-only ranking baseline. Here: 25 validation episodes, 703 anchors, 8 recorded candidates each, bar 0.8 for the top pick. Closed-loop planning on the arm was not run; one training seed.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 1 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Train a small world model end to end from pixels, with no frozen encoder and no EMA target, kept from collapse by SIGReg alone, and plan with it by sampling actions in its latent space; shown in simulation (Push-T, Two-Room, Reacher, OGBench Cube).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A 15M-parameter JEPA world model trained end to end with SIGReg learns dynamics stable enough to plan with. &lt;small&gt;(§3.1, Eq. (3); Fig. 6)&lt;/small&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt;&lt;/li&gt; &lt;li&gt;At a matched planning-compute budget it plans more successfully than DINO-WM and about 48× faster; without that match it leads on Push-T and Reacher only. &lt;small&gt;(Fig. 3 (Push-T at fixed FLOPs 90 % vs 13 %; 0.98 s vs 47 s per plan))&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;A linear readout of its latent recovers object state. &lt;small&gt;(Table 1 (Push-T probes))&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A small JEPA world model learns the arm&#39;s dynamics well enough to plan with it. · &lt;strong&gt;Bar:&lt;/strong&gt; Dynamics: beat copy-last, every corruption ≥ 1.3 at K = 30. Planning: rank the executed chunk first among 8 in ≥ 0.8 of anchors. · &lt;strong&gt;n:&lt;/strong&gt; 25 val episodes, 703 anchors&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; Push-T planning 90 % at matched FLOPs vs dynamics 0.31 vs 0.89 copy-last (reproduces); planning top-1 0.60 vs 0.68–0.90 for an action-only baseline (fail) · &lt;strong&gt;Not proven:&lt;/strong&gt; Closed-loop planning on the arm was never run; one training seed.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2603.19312&#34;&gt;arXiv 2603.19312&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/lucas-maes/le-wm&#34;&gt;lucas-maes/le-wm&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-1&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; JEPA world model below copy-last baseline on open-loop latent error at K = 30 — theirs Push-T planning 90 % at matched FLOPs · ours 0.31 vs 0.89 copy-last &lt;small&gt;(not stated: the premise of §3–4 (planning needs a usable dynamics model))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; latent world-model ranking above action-only baseline on G1b top-1 — theirs Push-T planning 90 % · ours 0.60 vs 0.68–0.90 action-only &lt;small&gt;(paper §4 (planning by ranking imagined outcomes))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; action-only baseline above latent world-model ranking on G1b top-1 · ours 0.68–0.90 vs 0.60 &lt;small&gt;(our measured comparison)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai): ~$6.60 incl. $2.96 of failed attempts. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-leworldmodel&#34;&gt;2026-10-23-paper-vs-hardware-leworldmodel&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#rank-chunks&#34;&gt;I need to rank candidate action chunks →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;!-- register-figs:start --&gt; &lt;figure class=&#34;post-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;LeWM open-loop error at 30 steps (lower is better): world model 0.31; copy last frame 0.89&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;LeWM open-loop error at 30 steps (lower is better): world model 0.31; copy last frame 0.89&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;59.5&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;world model&lt;/text&gt;&lt;text x=&#34;181.5&#34; y=&#34;40&#34;&gt;0.31&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;169.6&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;copy last frame&lt;/text&gt;&lt;text x=&#34;291.6&#34; y=&#34;66&#34;&gt;0.89&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;!-- register-figs:end --&gt; &lt;p&gt;&lt;em&gt;One paper, one arm. This series takes each paper I actually tested on a SO-101 + Jetson Orin NX, states what the paper claims and how its authors measured it, puts my number next to theirs, and says what the gap means. Numbers are from &lt;code&gt;journal/EXPERIMENTS.md&lt;/code&gt;; gate IDs are the register&#39;s.&lt;/em&gt;&lt;/p&gt; &lt;p&gt;LeWorldModel (Maes, Le Lidec, Scieur, LeCun, Balestriero; arXiv 2603.19312) is the recipe behind W1, the world model that runs on my arm. Four gates tested it: dynamics (G0), planning (G1b), progress (G6a), outcome readout (G10).&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A 15M-parameter JEPA trained end-to-end from pixels: a ViT-tiny encoder (patch 14, 12 layers, width 192, ~5M) whose CLS token becomes one 192-d latent per frame; a 6-layer predictor with AdaLN zero-init action conditioning (~10M); loss ‖ẑ_{t+1} − z_{t+1}‖² + 0.1 · SIGReg, where SIGReg pushes the batch of latents toward an isotropic Gaussian by testing 1024 random 1-d projections for normality. No EMA target, no stop-gradient; SIGReg alone prevents collapse. Planning is CEM with a terminal cost ‖ẑ_H − z_g‖² inside MPC.&lt;/p&gt; &lt;p&gt;Evaluation is simulation only: Push-T, Two-Room, Reacher, OGBench Cube. The headline is &lt;strong&gt;success at matched training FLOPs&lt;/strong&gt; (Fig. 6): Push-T 90 % vs DINO-WM&#39;s 13 % at the same compute, planning 48× faster (0.98 s vs 47 s). Table 1 is a linear-probe table: a linear readout of the latent predicts Push-T block location with r = 0.986 and block angle with r = 0.902. There is no real robot, no non-learned planner baseline, and the authors list &#34;short planning horizons&#34; as the limitation.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;W1 is LeWM&#39;s recipe on 182 teleop episodes from two webcams (multi-view variant, ContactGuard-style mean-pool), 100 epochs, $3.30 on vast.ai.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G0, dynamics.&lt;/strong&gt; Bar: beat copy-last; every action-corruption ratio ≥ 1.3 at K = 30; no collapse. Result: open-loop error at K = 30 &lt;strong&gt;0.31 vs copy-last 0.89&lt;/strong&gt;; timing-shift ratios 1.99 / 1.58; effective rank 24–30 of 192 (the 5-epoch run was 5.8). Pass. The model learns real action-conditioned dynamics.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G1b, planning as ranking.&lt;/strong&gt; Bar: rank the expert chunk first among 8 candidates at top-1 ≥ 0.8 at some horizon. Result: &lt;strong&gt;best 0.60&lt;/strong&gt; at d = 20–30. Fail. The diagnosis (G1 diagnosis row) found why: an action-only baseline with no model at all, ranking by commanded-joint distance, scores &lt;strong&gt;0.68–0.90&lt;/strong&gt;. On a position-controlled arm the commanded joints already determine the outcome of a 7-step chunk; the latent adds noise.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G6a, progress from latent distance.&lt;/strong&gt; Bar: Spearman ≤ −0.8 between latent distance to goal and time. Result: −0.32 to −0.50. Fail. Latent distance is not progress here (the TD-JEPA paper, 2607.25337, finds the same gap in simulation: Spearman 0.65 for LeWM&#39;s Euclidean distance vs step count).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G10, outcome readout at rest.&lt;/strong&gt; Bar: AUROC ≥ 0.90 on success/failure from the final latent. Result: &lt;strong&gt;1.000&lt;/strong&gt;. Pass. Table 1&#39;s probe result transfers: the latent contains the task outcome.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper (sim)&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Dynamics learned&lt;/td&gt; &lt;td&gt;yes (VoE test, qualitative)&lt;/td&gt; &lt;td&gt;yes: 0.31 vs 0.89 copy-last&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Linear probe of state&lt;/td&gt; &lt;td&gt;r 0.986 (block location)&lt;/td&gt; &lt;td&gt;arm-pose R² 0.57 (W1), outcome AUROC 1.00&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Planning success&lt;/td&gt; &lt;td&gt;Push-T 90 % at matched FLOPs&lt;/td&gt; &lt;td&gt;top-1 0.60 vs no-model 0.68–0.90&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Baseline without a world model&lt;/td&gt; &lt;td&gt;not run&lt;/td&gt; &lt;td&gt;run; it wins&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Not that the paper is wrong. The paper&#39;s planner is compared to other learned planners at equal compute; it is never compared to &#34;do nothing clever&#34;. On a cheap arm the clever-nothing baseline is strong because the commanded trajectory &lt;em&gt;is&lt;/em&gt; the plan, and the latent planner has to beat it, not DINO-WM. The honest role for the model here is the one G10 passed: a verifier at rest. The planning-limits paper (2609.39235) later showed with a real simulator as a perfect predictor that terminal-latent-distance scoring against a distant goal falls from 92 % to 41 %; G1b scored against a goal many chunks away, so it sat in exactly that regime. A subgoal inside the rollout is the fix the paper proves; it has not been tried here yet.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; dynamics and readout reproduce; planning does not survive the baseline the paper did not run.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; G7 (object-state ranking where the joints are blind), with a near subgoal. That gate is frozen and waiting for a cube-rollout session.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai): ~$6.60 incl. $2.96 of failed attempts.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-leworldmodel&#34;&gt;2026-10-23-paper-vs-hardware-leworldmodel&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 1 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-dino-wm/&#34;&gt;Papers tested 2: DINO-WM →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-leworldmodel/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-leworldmodel/</guid> </item> <item> <title>Real-Time Chunking</title> <description>&lt;h1 id=&#34;real-time-chunking&#34;&gt;Real-Time Chunking&lt;a class=&#34;headerlink&#34; href=&#34;#real-time-chunking&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said building each new motion chunk to match the one already running removes jumps at the joins. On recorded runs we compared a simple overwrite of the shared part with their method. Not proven on the arm: the overwrite removed most of the jump, adding 0.4 ms.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 72&#34; role=&#34;img&#34; aria-label=&#34;Jump at the chunk seam cut vs naive async, %: prefix overwrite 71–73 %; bar 50 %&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Jump at the chunk seam cut vs naive async, %: prefix overwrite 71–73 %; bar 50 %&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;134.9&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;rect x=&#34;252.9&#34; y=&#34;29&#34; width=&#34;4.4&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.15&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;prefix overwrite&lt;/text&gt;&lt;text x=&#34;261.3&#34; y=&#34;40&#34;&gt;71–73 %&lt;/text&gt;&lt;line x1=&#34;213.0&#34; y1=&#34;20&#34; x2=&#34;213.0&#34; y2=&#34;56&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;213.0&#34; y=&#34;68&#34; text-anchor=&#34;middle&#34;&gt;bar 50 %&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;If your policy runs asynchronously, turn on the simple prefix overwrite. It removes most of the jump for under a millisecond. Its effect on task success is untested.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Offline smoothness on 20 episodes, 254 boundaries per delay. Task success on the arm was not measured for any mode.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 15 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Let a flow-matching policy run asynchronously without jumps at chunk boundaries, by generating each new chunk as an inpainting of the actions already committed; shown on dynamic simulated tasks and a bimanual robot with added latency.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Conditioning the new chunk on the committed actions removes the discontinuity at chunk boundaries. &lt;small&gt;(§3.1–3.2 (ΠGDM guidance, Eq. 2–3); Fig. 3–4)&lt;/small&gt; &lt;span class=&#34;pill pill-not-proven&#34;&gt;not proven&lt;/span&gt;&lt;/li&gt; &lt;li&gt;With it, task throughput stays flat as inference latency grows, where synchronous execution falls. &lt;small&gt;(Fig. 6)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-not-proven&#34;&gt;not proven&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; Conditioning a new chunk on the executing one removes the jump at chunk boundaries. · &lt;strong&gt;Bar:&lt;/strong&gt; Best gradient-free method cuts the median jump ≥ 50 % against naive async, drift ≤ +10 %, within 667 ms. · &lt;strong&gt;n:&lt;/strong&gt; 254 boundaries per delay, 20 episodes&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; throughput flat across added latency (π0.5, real robot) vs prefix overwrite cuts the jump 71–73 % against naive async at +0.4 ms; tuned LeRobot identity mode is close · &lt;strong&gt;Not proven:&lt;/strong&gt; Offline smoothness only; task success on the arm not measured for any mode.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2506.07339&#34;&gt;arXiv 2506.07339&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/Physical-Intelligence/real-time-chunking-kinetix&#34;&gt;Physical-Intelligence/real-time-chunking-kinetix&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-15&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-not-proven&#34;&gt;not proven&lt;/span&gt; prefix overwrite at least pass mark on median boundary-jump cut — theirs throughput flat across added latency (π0.5, real robot) · ours 71–73 % at +0.4 ms &lt;small&gt;(paper §3.1–3.2, Fig. 4 (qualitative; no jump metric reported))&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-25-vla-chunk-boundary-jumps&#34;&gt;2026-10-25-vla-chunk-boundary-jumps&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-26 (soft-mask correction)&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;Real-Time Chunking (Black, Galliker, Levine, Physical Intelligence; arXiv 2506.07339) treats the next action chunk as an inpainting problem. My gradient-free prefix overwrite uses the paper&#39;s soft mask without its gradient, and the paper says where gradient-free inpainting should lose.&lt;/p&gt; &lt;!-- more --&gt; &lt;p&gt;&lt;em&gt;Corrected 2026-10-26: an earlier version called the overwrite RTC&#39;s hard mask. It uses RTC&#39;s soft prefix weights, without the gradient (see the &lt;a href=&#34;../../25/vla-chunk-boundary-jumps/&#34;&gt;chunk-boundary post&lt;/a&gt;).&lt;/em&gt;&lt;/p&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;With chunk length H, control period Δt and inference time δ, the delay is d = ⌊δ/Δt⌋ steps. Asynchronous inference must start the next chunk d steps early, and the junction is arbitrary: a new chunk from fresh noise may pick a different strategy (their bifurcation figure). Temporal ensembling averages across chunks and is not guaranteed valid when the distribution is multimodal. RTC: freeze the first d actions (they will be executed before the new chunk arrives), attend to the remaining overlap with an exponentially decaying weight, leave the rest free, and enforce it through ΠGDM guidance on the flow&#39;s velocity field with a clipped guidance weight — one vector-Jacobian product through the policy per Euler step. The soft mask (eq. 5): weight 1 for i &amp;lt; d, decaying over the overlap, 0 after.&lt;/p&gt; &lt;p&gt;Evaluation: twelve dynamic Kinetix tasks chosen because quasi-static benchmarks are saturated by open-loop chunking; &lt;strong&gt;2 048 rollouts per point with Wilson 95 % intervals&lt;/strong&gt;; delays 0–4; baselines naive async, BID, temporal ensembling. RTC is above every baseline at every delay; &lt;strong&gt;hard masking (freeze only d steps) is below soft masking at small d&lt;/strong&gt;; temporal ensembling is worst even at d = 0. Real: π0.5, bimanual, H = 50, Δt = 20 ms, 5 denoising steps, d ≈ 6, plus +100 / +200 ms injected latency; six tasks, &lt;strong&gt;10 trials per task per method per delay&lt;/strong&gt;, metric &lt;strong&gt;throughput&lt;/strong&gt; (task progress per minute). RTC is flat across added latency; synchronous falls linearly; both temporal-ensembling variants trip the protective stop at +100 ms and score zero. Cost: 97 vs 76 ms per chunk on their stack.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;G13b (2026-10-19, offline, Orin).&lt;/strong&gt; SmolVLA on 20 bowls episodes, 254 chunk boundaries, d = 8 / 12 / 20. Methods: naive, exact RTC guidance, and gradient-free prefix overwrite. Bars: propose the gradient-free method if it cuts the median jump ≥ 50 % vs naive and stays within 20 % of exact. Result: prefix overwrite cuts the median jump &lt;strong&gt;72–74 %&lt;/strong&gt; at every d, drift unchanged; &lt;strong&gt;exact RTC cut only 21–41 %&lt;/strong&gt; in this implementation (weaker than LeRobot&#39;s identity mode — flagged to check). Timing: naive 1 028 ms, overwrite 1 035 ms, exact 1 962 ms per chunk in PyTorch on the Orin; every method misses the 667 ms line because the policy itself is too slow in PyTorch.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;In vla.cpp (same day).&lt;/strong&gt; Ported as &lt;code&gt;prev_actions&lt;/code&gt; + &lt;code&gt;inference_delay&lt;/code&gt;; jump cut 71.0 / 73.3 / 71.5 % through the engine, prefix error 0.0, &lt;strong&gt;+0.4 ms&lt;/strong&gt; per chunk, default path bit-identical. Exact RTC is not possible in vla.cpp today: ggml lacks backward rules for flash attention and concat.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Hard vs soft mask&lt;/td&gt; &lt;td&gt;soft &amp;gt; hard at small d (Fig. 5)&lt;/td&gt; &lt;td&gt;soft only (RTC&#39;s prefix weights over the whole leftover); hard not run&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Cost&lt;/td&gt; &lt;td&gt;+21 ms (VJP per Euler step)&lt;/td&gt; &lt;td&gt;+0.4 ms (overwrite); exact +930 ms in PyTorch&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Metric&lt;/td&gt; &lt;td&gt;throughput, task progress/min&lt;/td&gt; &lt;td&gt;median boundary jump (instrument)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;n&lt;/td&gt; &lt;td&gt;2 048 rollouts/point; real 10/task/delay&lt;/td&gt; &lt;td&gt;254 boundaries, 20 episodes&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The overwrite already uses the paper&#39;s soft mask (weight 1 on the first d steps, decaying to 0 at the end of the leftover). What it drops is the gradient: it corrects the predicted clean chunk directly, which is guidance with an identity Jacobian at weight 1/t, instead of RTC&#39;s vector-Jacobian product. So the paper&#39;s hard-vs-soft result (Fig. 5) does not decide between the two; the paper&#39;s own gradient-free inpainting variant (App. A.4, simulation only) was beaten by guided RTC on solve rate. Only if guided RTC beats the overwrite by more than the pairing noise on the same 254 boundaries are ggml backward kernels worth writing. And the result metric should be theirs: a smoother junction is for throughput; the jump is the instrument check, not the claim.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; the gradient-free point reproduces in spirit; the paper predicts a better point I have not measured.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; the soft-mask comparison offline, then throughput on the robot day with sync / async / async + prefix.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-25-vla-chunk-boundary-jumps&#34;&gt;2026-10-25-vla-chunk-boundary-jumps&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 15 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-reki/&#34;&gt;← Papers tested 14: REKI&lt;/a&gt; · &lt;a href=&#34;../../28/paper-vs-hardware-hwm/&#34;&gt;Papers tested 16: HWM (hierarchical latent world models) →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-real-time-chunking/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-real-time-chunking/</guid> </item> <item> <title>ReAP</title> <description>&lt;h1 id=&#34;reap&#34;&gt;ReAP&lt;a class=&#34;headerlink&#34; href=&#34;#reap&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a risk score that looks at the next planned motions warns before a robot fails. On our arm we built that risk score and asked it to warn before 8 recorded failures. It did not hold: it caught 3/8 failures while flagging 5/42 good runs.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 124&#34; role=&#34;img&#34; aria-label=&#34;ReAP risk head AUROC: v1 (time leak) 0.929; v2 true actions 0.789; v2 shuffled 0.708&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;ReAP risk head AUROC: v1 (time leak) 0.929; v2 true actions 0.789; v2 shuffled 0.708&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;176.4&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;v1 (time leak)&lt;/text&gt;&lt;text x=&#34;298.4&#34; y=&#34;40&#34;&gt;0.929&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;149.9&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;v2 true actions&lt;/text&gt;&lt;text x=&#34;271.9&#34; y=&#34;66&#34;&gt;0.789&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;81&#34; width=&#34;134.6&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;92&#34; text-anchor=&#34;end&#34;&gt;v2 shuffled&lt;/text&gt;&lt;text x=&#34;256.6&#34; y=&#34;92&#34;&gt;0.708&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not deploy a mid-run failure warning trained like this one. A first version looked good only because it read elapsed time. Train it on the deployed policy&amp;#x27;s own runs first.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;The paper reports a time-weighted accuracy, not AUROC, and its predictor reads the next planned chunk. Our first AUROC of 0.93 came from time and length; the second is 0.789 against 0.708 shuffled. Only 8 failures.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 8 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Warn of a VLA&amp;#x27;s failure before it happens, with a detector on a compact visual state trained on a ramp target (no onset labels) and a predictor that rolls that state forward under the policy&amp;#x27;s next action chunk.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Conditioning the risk prediction on the policy&amp;#x27;s next action chunk improves warning over the same model with shuffled or zero actions. &lt;small&gt;(Table 3b)&lt;/small&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt;&lt;/li&gt; &lt;li&gt;The monitor warns earlier and more accurately than action-uncertainty, OOD and classifier baselines. &lt;small&gt;(Table 1, Table 2a)&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A risk head on an action-conditioned latent warns before failures. · &lt;strong&gt;Bar:&lt;/strong&gt; ≥ 5/8 failures caught at ≤ 1/20 false interventions; action-conditioned iff true ≥ shuffled + 0.05. · &lt;strong&gt;n:&lt;/strong&gt; 50 episodes, 8 failures (and all 69)&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; bTWA 0.65–0.78 in simulation (Table 1), 0.60–0.82 on the real robot (Table 2a) vs v1 AUROC 0.93 came from time and length; v2 0.789 vs 0.708 shuffled, 3/8 at 5/42 · &lt;strong&gt;Not proven:&lt;/strong&gt; 8 failures; v1 onsets VLM-labelled.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2610.16309&#34;&gt;arXiv 2610.16309&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; no code link found&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-8&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; action-conditioned risk head above shuffled-action risk head on failure AUROC — theirs bTWA 0.683 vs 0.618 shuffled (no AUROC reported) · ours 0.789 vs 0.708 shuffled &lt;small&gt;(paper Table 3b (action-conditioned 0.683 vs shuffled 0.618 bTWA; the next planned chunk))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; action-conditioned risk head at least pass mark on failures caught — theirs bTWA 0.70–0.78 · ours 3/8 at 5/42 &lt;small&gt;(paper Table 1 (detection time), Table 2a)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). External API: Gemini onset labels, cents. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-reap&#34;&gt;2026-10-23-paper-vs-hardware-reap&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#online-monitor&#34;&gt;I need an online failure monitor →&lt;/a&gt;, &lt;a href=&#34;../../../../../findings/#w1-monitor-gpu&#34;&gt;W1 as an online monitor next to the policy →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;!-- register-figs:start --&gt; &lt;!-- register-figs:end --&gt; &lt;p&gt;ReAP (Liu, Qing, Wei, Hou; arXiv 2610.16309) trains a failure-supervised visual space and an action-conditioned risk predictor on top of it. My &#34;ReAP-style risk head&#34; is the closest any monitor got to my bar — and it is a stripped version with two confounds the paper&#39;s own design removes.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Stage 1, a detector: frozen DINOv2 patches from each camera → Perceiver-style cross-attention from 32 learned queries → a compact state z_t → a risk head, trained with class-weighted BCE against a &lt;strong&gt;ramp target&lt;/strong&gt;: 0 on successes, t/(T−1) on failures. No onset labels. Stage 2, a predictor: the policy&#39;s action chunk cross-attends the frozen latent, a residual MLP predicts the latent H steps ahead, and the frozen head reads risk from it; loss is latent-transition error plus risk BCE. Alarm = detector OR predictor, each with its own conformal threshold on held-out successes.&lt;/p&gt; &lt;p&gt;Metric &lt;strong&gt;bTWA&lt;/strong&gt;: half earliness-weighted recall (a failure detected at t_i of T_i scores 1 − t_i/T_i) plus half specificity; averaged over five α; mean ± std over three seeds. Offline: LIBERO-10 and RoboTwin-8 with four policies; baselines from three families (action uncertainty, OOD, classifiers). ReAP 0.70–0.78 vs best baseline 0.58–0.76. Real: three π0.5 tasks, monitor live, alarms logged without acting. The ablations are the valuable part: a &lt;strong&gt;random, untrained&lt;/strong&gt; detector scores 0.650 vs the learned 0.683 and mean-pooled DINOv2 beats every baseline alone (Table 3a); &lt;strong&gt;shuffled chunks&lt;/strong&gt; from other episodes of the same task drop 0.683 → 0.618, zero actions → 0.52 (Table 3b). Detector latency 9.7 ms, no policy inference needed.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;REAP monitors (2026-10-23).&lt;/strong&gt; On W1-A&#39;s 50 episodes (42 ok / 8 fail), 5-fold × 5 seeds: W1 L2 surprise, a logistic or MLP risk head on [W1 latent, 30 commanded actions, step], elapsed time. Bar: ≥ 5/8 failures at ≤ 1/20 false interventions. Result: surprise 2/8 at 2/42 (AUROC 0.86); &lt;strong&gt;logistic head 6/8 at 7/42 (AUROC 0.93)&lt;/strong&gt;; MLP 7/8 at 13/42; elapsed 0/8. On all 69: logistic 23/25 at 4/44 (0.97), but 17 of the extra failures are TurboVLA&#39;s. Verdict: &lt;strong&gt;not proven&lt;/strong&gt;. Two confounds: the secondary set&#39;s failures are mostly one policy, and the onsets were labelled by Gemini with two misses of 110 and 289 frames. Latency on the Orin: W1 tick 17.6 ms, 25-step imagination 153 ms off the control thread, risk head 18 ms; the policy&#39;s chunk slows 238 → 304 ms with the monitor sharing the GPU.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Representation&lt;/td&gt; &lt;td&gt;failure-supervised Perceiver over DINOv2&lt;/td&gt; &lt;td&gt;W1&#39;s prediction-trained latent&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Target&lt;/td&gt; &lt;td&gt;ramp, no onsets&lt;/td&gt; &lt;td&gt;Gemini onsets + step feature&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Action control&lt;/td&gt; &lt;td&gt;shuffled chunk: 0.683 → 0.618&lt;/td&gt; &lt;td&gt;not run&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Best result, v1 (time feature, Gemini onsets)&lt;/td&gt; &lt;td&gt;bTWA 0.70–0.78&lt;/td&gt; &lt;td&gt;6/8 at 7/42, AUROC 0.93&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;v2 (ramp target, no time feature, common-horizon cut)&lt;/td&gt; &lt;td&gt;—&lt;/td&gt; &lt;td&gt;logistic 3/8 at 5/42, AUROC 0.789, bTWA 0.55; MLP 6/8 at 13/42&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;True vs shuffled chunk&lt;/td&gt; &lt;td&gt;Table 3b: 0.683 vs 0.618&lt;/td&gt; &lt;td&gt;0.789 vs 0.708 (+0.08)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Latency&lt;/td&gt; &lt;td&gt;9.7 ms detector&lt;/td&gt; &lt;td&gt;17.6 ms W1 + 18 ms head&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Table 3a says the encoder is not where my gap is: a random projection of DINOv2 is within 0.03 of their learned one, so W1&#39;s latent is probably fine. The two things their design has and mine lacks are exactly my two confounds. The &lt;strong&gt;ramp target&lt;/strong&gt; removes the onset labels from the verdict — the 25 hand labels I owe become a validation set instead of a prerequisite. The &lt;strong&gt;shuffled-chunk control&lt;/strong&gt; decides whether &#34;action-conditioned&#34; belongs in the name: train once, evaluate with other episodes&#39; chunks; if the number does not drop, the head is a state monitor. Both are offline and free and are in the amendments; bTWA goes beside my bar so the comparison is on their metric too.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;REAP v2 (2026-10-23, evening).&lt;/strong&gt; The paper&#39;s own fixes applied: ramp target (no onset labels), no time feature, every episode cut to the task&#39;s common horizon (374 frames), shuffled-chunk and zero-action controls, bTWA reported, VLA-Corrector&#39;s parameter-free GRU as the floor. Protocol committed before the run. Result on the primary 50, medians over 5 seeds: logistic head &lt;strong&gt;3/8 at 5/42, AUROC 0.789&lt;/strong&gt; (shuffled 0.708, zero 0.693); MLP 6/8 at 13/42; GRU floor 2/8 at 3/42, 0.589. So v1&#39;s 0.93 was the time feature and the episode length. The one thing that survives is the action-conditioning test: both W1 heads gain 0.07–0.08 over shuffled chunks, above the +0.05 line, so the head does read the commanded action — it just does not read enough.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; fail. No monitor meets the bar once the confounds are removed; the W1 risk head is action-conditioned but weak; the floor baseline is a state monitor.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; a world model trained on the deployed policy&#39;s own rollouts (ContactGuard&#39;s recipe), not teleop only; then the same v2 protocol.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). External API: Gemini onset labels, cents.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-reap&#34;&gt;2026-10-23-paper-vs-hardware-reap&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 8 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-fail-detect-and-safe/&#34;&gt;← Papers tested 7: FAIL-Detect and SAFE&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-vla-corrector/&#34;&gt;Papers tested 9: VLA-Corrector →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-reap/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-reap/</guid> </item> <item> <title>REKI</title> <description>&lt;h1 id=&#34;reki&#34;&gt;REKI&lt;a class=&#34;headerlink&#34; href=&#34;#reki&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said robot policies without memory get stuck going back and forth between poses. We measured that back-and-forth in our 69 recorded runs, then trained the memory version. It held: 24.0 % of failed runs oscillated; with memory, 1 run in 40 did.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 124&#34; role=&#34;img&#34; aria-label=&#34;Runs that oscillate, %: paper, all runs 18.6 %; this rig, all runs 20.3 %; this rig, failed runs 24.0 %; bar 10 %&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Runs that oscillate, %: paper, all runs 18.6 %; this rig, all runs 20.3 %; this rig, failed runs 24.0 %; bar 10 %&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;117.8&#34; height=&#34;14&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;paper, all runs&lt;/text&gt;&lt;text x=&#34;239.8&#34; y=&#34;40&#34;&gt;18.6 %&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;128.6&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;this rig, all runs&lt;/text&gt;&lt;text x=&#34;250.6&#34; y=&#34;66&#34;&gt;20.3 %&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;81&#34; width=&#34;152.0&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;92&#34; text-anchor=&#34;end&#34;&gt;this rig, failed runs&lt;/text&gt;&lt;text x=&#34;274.0&#34; y=&#34;92&#34;&gt;24.0 %&lt;/text&gt;&lt;line x1=&#34;181.3&#34; y1=&#34;20&#34; x2=&#34;181.3&#34; y2=&#34;108&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;181.3&#34; y=&#34;120&#34; text-anchor=&#34;middle&#34;&gt;bar 10 %&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;If your policy dithers between poses, a short memory of past frames may help. It succeeded 19/20 on both instructions here, but it does not run on the Jetson.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;The oscillation rate reproduces with the paper&amp;#x27;s own metric. The drop to 1/40 is not attributed to memory: the memory-off control is not run. Served from an RTX 3090.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 14 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Give a VLA a short memory of past frames with register tokens cached across steps, so it stops oscillating between visually aliased poses; trained on public data only and evaluated on LIBERO-Plus, RoboTwin, RoboCasa and real robots.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Policies without memory oscillate between poses in a measurable share of episodes; register memory cuts it. &lt;small&gt;(Fig. 5b (18.6 % without, 4.1 % with))&lt;/small&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Most of the gain comes from reading the first past frame at inference. &lt;small&gt;(Fig. 5a)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;li&gt;A 2.4B VLA pretrained only on public data matches larger in-house models. &lt;small&gt;(Fig. 4)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; Policies without memory oscillate between poses at a measurable rate. · &lt;strong&gt;Bar:&lt;/strong&gt; ≥ 10 % of failed episodes oscillate (their criterion). · &lt;strong&gt;n:&lt;/strong&gt; 69 published rollouts&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; 18.6 % without memory, 4.1 % with vs 20.3 % of all episodes, 24.0 % of failures; REKI trained on my data: 19/20 + 19/20 on the arm, oscillates in 1/40 · &lt;strong&gt;Not proven:&lt;/strong&gt; That memory causes the drop to 1/40: the K = 1 (memory off) control is not run. REKI does not build for the Orin (served from an RTX 3090).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2610.22178&#34;&gt;arXiv 2610.22178&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/kyutai-labs/reki&#34;&gt;kyutai-labs/reki&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-14&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; policy without memory at least pass mark on oscillating share of failures — theirs 18.6 % of all episodes and about half of the failed ones oscillate without memory (RoboTwin Clean, §6.2, Fig. 5b) · ours 24.0 % of failures, 20.3 % of all episodes &lt;small&gt;(paper, 18.6 % without memory, 4.1 % with)&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; REKI at least pass mark on success on the arm — theirs UR5 + WSG50 real-robot success · ours 19/20 + 19/20 &lt;small&gt;(paper §7, Fig. 8)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes for REKI (vast.ai): training $11.25 + smoke $0.60, serving $1.20, total $13.05. Oscillation audit on the Orin NX: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-reki&#34;&gt;2026-10-23-paper-vs-hardware-reki&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-28 (REKI trained and run on the arm) · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#reki-off-board&#34;&gt;REKI 2.4B on the Orin →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;REKI (Marrie, Pacaud, Ramanana Rahary, Chen, Böhle; Kyutai / Inria; arXiv 2610.22178) gives a VLA a memory through register tokens and measures the oscillation it removes. I voided my own latency measurement of it and then found the same oscillation in my policies with their metric.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A 2.4B VLA (Qwen3.5-2B + a flow-matching expert) with &lt;strong&gt;32 register tokens per frame&lt;/strong&gt; in the expert: they cross-attend the frame&#39;s context, self-attend the registers of the K − 1 previous frames (K = 3), never read the action tokens, and are cached as keys/values across chunks — so memory costs +0.1 ms. Pretrained on public data only; 21.8 ms per chunk on an H100. The augmentation detail that matters for a webcam rig: random camera dropout and shuffled camera order, worth &amp;gt; 20 points under viewpoint change.&lt;/p&gt; &lt;p&gt;Evaluation: LIBERO-Plus 90.4; RoboTwin Clean2Rand 65.8; RoboCasa365 38.4; baselines quoted from their papers. The memory ablation (Fig. 5a): a K = 3 model evaluated at K = 1 scores like a K = 1 model — the gain comes from &lt;em&gt;reading&lt;/em&gt; past frames at inference, mostly the first one. The oscillation result (Fig. 5b): an episode oscillates if an arm &lt;strong&gt;reverses direction at three or more consecutive chunks&lt;/strong&gt;; &lt;strong&gt;4.1 % with memory, 14.8 % when the same model is evaluated without it, 18.6 % trained without&lt;/strong&gt;; two-arm tasks 24.5 → 3.1; RoboTwin, 50 tasks, &lt;strong&gt;20 matched seeds each&lt;/strong&gt;. Mechanism offered: perceptual aliasing — two poses each look like demonstration states heading toward the other.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;G12 (2026-10-18), voided the same day.&lt;/strong&gt; The bar was memory ≤ 8 GB and chunk ≤ 250 ms on the Orin; the script reported 3.46 GB and 318 ms. The re-check found it timed a random-init Qwen2.5-1.5B with no vision tower and a hand-written random expert; the parts did not sum (135 + 230 ≠ 318). REKI&#39;s Orin latency is &lt;strong&gt;unmeasured&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G14 (2026-10-18).&lt;/strong&gt; REKI&#39;s oscillation criterion on my 69 published rollouts: reversal at ≥ 3 consecutive chunks, cosine &amp;lt; −0.5, &amp;gt; 3° per chunk. &lt;strong&gt;Failed episodes 6/25 = 24.0 %&lt;/strong&gt; (CI 11.5–43.4 %); succeeded 8/44; &lt;strong&gt;all episodes 14/69 = 20.3 %&lt;/strong&gt;, which is the number comparable with REKI&#39;s (theirs is over all episodes). Trajectory check: the flagged failures are real re-grasp loops and pan dithering; two unflagged loops were missed. All my policies are memoryless.&lt;/p&gt; &lt;h2 id=&#34;update-2026-10-28-reki-trained-and-run-on-my-arm&#34;&gt;Update 2026-10-28: REKI trained and run on my arm&lt;a class=&#34;headerlink&#34; href=&#34;#update-2026-10-28-reki-trained-and-run-on-my-arm&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Training.&lt;/strong&gt; REKI&#39;s frozen-VLM recipe (their repo at &lt;code&gt;cc16b94&lt;/code&gt;), 3,500 steps, batch 30 × 4, on my bowls data. One rented RTX PRO 5000, 16.1 GPU hours, &lt;strong&gt;$11.25&lt;/strong&gt; plus a $0.60 smoke test. Training loss 0.315 → 0.008. One seed.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Serving.&lt;/strong&gt; REKI doesn&#39;t run on the Orin at all: it needs flash-attn, FLA / Triton and causal-conv1d, which only build for x86 CUDA. So the policy ran on a rented RTX 3090 (~100 ms per chunk) and the Orin drove the arm as a client over an SSH tunnel. $1.20 over two sessions. Every chunk is a network round trip, so the arm pauses about 10 s of every 25 s trial.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Protocol.&lt;/strong&gt; Same as my SmolVLA gate: 25 s per trial, judged at rest by me, 20 trials per instruction. Bar, fixed before the first counted trial: not worse than SmolVLA (9/10) by more than 2 in 20.&lt;/p&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;instruction&lt;/th&gt; &lt;th&gt;REKI&lt;/th&gt; &lt;th&gt;failures&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;blue bowl in pink&lt;/td&gt; &lt;td&gt;&lt;strong&gt;19/20&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;one set down short (the pink bowl started outside the teleop area)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;pink bowl in blue&lt;/td&gt; &lt;td&gt;&lt;strong&gt;19/20&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;one missed grasp&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Four more trials were thrown out and replaced: after a network stall of 5 s or more the server cleared REKI&#39;s memory mid-trial. I wrote that rule before seeing the last affected trial&#39;s outcome, and applied it to all four (three were successes).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Oscillation.&lt;/strong&gt; With the metric above, &lt;strong&gt;1 of 40&lt;/strong&gt; REKI trials oscillates (2.5 %), against 20.3 % on my earlier policies. That&#39;s the direction the paper predicts, but it isn&#39;t their ablation: different policies, and I computed it on REKI&#39;s commanded trajectory rather than recorded states. The clean test is the same REKI model with memory switched off (K = 1) on the same setup. I haven&#39;t run it.&lt;/p&gt; &lt;video controls preload=&#34;metadata&#34; playsinline style=&#34;max-width:100%&#34;&gt;&lt;source src=&#34;/blog/img/reki_so101_highlights_2026-10-27.mp4&#34; type=&#34;video/mp4&#34;&gt;&lt;/video&gt; &lt;p&gt;&lt;em&gt;Two successes and the missed grasp, 47 s. Network pauses are cut, so it plays faster than real time.&lt;/em&gt;&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Oscillation, no memory&lt;/td&gt; &lt;td&gt;18.6 % (trained without), 14.8 % (evaluated without)&lt;/td&gt; &lt;td&gt;20.3 % of all episodes (24.0 % of failed)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;With memory&lt;/td&gt; &lt;td&gt;4.1 %&lt;/td&gt; &lt;td&gt;1/40 = 2.5 % (REKI on my arm; no memory-off control)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Task success&lt;/td&gt; &lt;td&gt;—&lt;/td&gt; &lt;td&gt;19/20 and 19/20 (SmolVLA 9/10, same protocol)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Criterion&lt;/td&gt; &lt;td&gt;reversal ≥ 3 consecutive chunks, 20 seeds/task&lt;/td&gt; &lt;td&gt;same criterion, 69 episodes&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Latency on Orin&lt;/td&gt; &lt;td&gt;—&lt;/td&gt; &lt;td&gt;void; REKI doesn&#39;t build for the Orin (served from an RTX 3090)&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;G14 is the cleanest external replication of a mechanism in my register: a memoryless policy on a SO-101 dithers at about the rate a memoryless 2.4B VLA dithers on RoboTwin, under the same definition. What I cannot yet say is whether memory fixes it here, because adding registers to SmolVLA means retraining. The paper&#39;s Fig. 5a points at the cheap half: for any policy that has a past-frame cache, the same checkpoint evaluated with and without it is a free experiment. SmolVLA has none, so the port is the only route, and it costs $5–10 plus a robot session; the amendments put the free comparison and the real latency measurement before it.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; the oscillation mechanism reproduces. REKI itself works on my arm (19/20 on both instructions) and oscillates in 1 of 40 trials, which points the paper&#39;s way but doesn&#39;t isolate the memory. It still can&#39;t run on the robot&#39;s own computer.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; the same REKI checkpoint at K = 1 (memory off) on the same 40-trial protocol.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes for REKI (vast.ai): training $11.25 + smoke $0.60, serving $1.20, total $13.05. Oscillation audit on the Orin NX: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-reki&#34;&gt;2026-10-23-paper-vs-hardware-reki&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 14 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-vla-jepa/&#34;&gt;← Papers tested 13: VLA-JEPA&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-real-time-chunking/&#34;&gt;Papers tested 15: Real-Time Chunking →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-reki/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-reki/</guid> </item> <item> <title>RoboJEPA</title> <description>&lt;h1 id=&#34;robojepa&#34;&gt;RoboJEPA&lt;a class=&#34;headerlink&#34; href=&#34;#robojepa&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a world model pretrained on 15 000 hours of robot video predicts what comes next from the actions. On our arm we tested its predictions on our clips and timed it on the robot&amp;#x27;s computer. It used our actions, but its image encoder alone took 526 ms, too slow to run on the robot.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;9-step error below copy-last, % (higher is better): 300M 11.8 %; 1B (30 clips) 15.8 %; bar 15 %&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;9-step error below copy-last, % (higher is better): 300M 11.8 %; 1B (30 clips) 15.8 %; bar 15 %&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;112.4&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;300M&lt;/text&gt;&lt;text x=&#34;234.4&#34; y=&#34;40&#34;&gt;11.8 %&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;149.6&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;1B (30 clips)&lt;/text&gt;&lt;text x=&#34;271.6&#34; y=&#34;66&#34;&gt;15.8 %&lt;/text&gt;&lt;line x1=&#34;260.5&#34; y1=&#34;20&#34; x2=&#34;260.5&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;260.5&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 15 %&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not run this model on a Jetson as released: the encoder alone takes 526 ms per call. It needs a distilled encoder near 100 ms first.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;The 300M model on 60 clips and the 1B on 30: 11.8 % below copy-last, 9–10 % below shuffled actions. The 1B result is on a partial sample; TensorRT was not tried.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 3 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Measure how an action-conditioned predictor on frozen V-JEPA 2.1 features scales with compute across 12 embodiments, fit a law that extrapolates to held-out model sizes, and plan with the large models on a real Franka.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Latent-rollout error on held-out scenes follows a compute law that extrapolates to 4B and 8B models. &lt;small&gt;(§3.1, Table 2)&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Planning capabilities emerge in order with compute: end-effector control, holding, scene geometry, object dynamics. &lt;small&gt;(Fig. 6–9)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;li&gt;The larger models plan grasp, lift and pick-and-place on a real Franka from a single image goal. &lt;small&gt;(Table 3)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; Pretrained RoboJEPA predicts our latents, uses the actions, and runs on the robot&#39;s computer. · &lt;strong&gt;Bar:&lt;/strong&gt; 9-step L1 ≥ 15 % below copy-last (300M) and ≥ 5 % below shuffled actions; 2-view encoder ≤ 200 ms on the Orin. · &lt;strong&gt;n:&lt;/strong&gt; 60 clips (30 for 1B), 25 episodes&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; rollout error frontier near E ≈ 0.22; latency not reported vs 11.8 % below copy-last (300M; 1B 15.8 % on 30 clips); 9–10 % below shuffled; encoder 526 ms on the Orin NX · &lt;strong&gt;Not proven:&lt;/strong&gt; 1B on a partial sample; TensorRT not tried.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2610.10515&#34;&gt;arXiv 2610.10515&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/facebookresearch/robo_jepa&#34;&gt;facebookresearch/robo_jepa&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-3&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; pretrained RoboJEPA below copy-last baseline on 9-step latent L1 — theirs rollout error frontier near E ≈ 0.22 · ours 11.8 % below copy-last &lt;small&gt;(paper §3.1, Table 2 (DROID holdout, E = 0.218))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; RoboJEPA encoder at most pass mark on ms per encoder call on the Orin NX — theirs latency not reported · ours 526 ms &lt;small&gt;(our measured comparison)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai, Gate A): ~$1.2. Gate B on the Orin NX: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-robojepa&#34;&gt;2026-10-23-paper-vs-hardware-robojepa&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#robojepa-encoder&#34;&gt;RoboJEPA&#39;s encoder on the Orin →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;RoboJEPA (Zholus, Assran et al., Meta FAIR; arXiv 2610.10515) is a scaling law for latent world models trained on 15 000 hours of robot video, including 21.5k LeRobot community episodes from arms like mine. Two gates: can the encoder run on the Orin, and does the pretrained predictor use my actions.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A deterministic next-feature predictor on a &lt;strong&gt;frozen V-JEPA 2.1-G&lt;/strong&gt; encoder (width 1664, patch 16). Per timestep the sequence is all views&#39; patches plus an action token and a proprio token; attention is joint space-time-view, timestep-causal, &lt;strong&gt;local to 8 timesteps&lt;/strong&gt; so it rolls out past its training length; QK-norm for stability. Loss is half teacher-forced L1, half autoregressive L1 from a prefix (the exposure-bias fix). 23 datasets, 12 embodiments, 26 action spaces; AdamW with a shared flat learning-rate stage and per-budget cool-downs.&lt;/p&gt; &lt;p&gt;The scaling law is of &lt;strong&gt;per-token L1 error over a 9-step latent rollout on held-out scenes&lt;/strong&gt; (DROID holdout and RoboCasa), compute counted in FLOPs, compute-optimal frontier across 22M–2B. The functional form was chosen by &lt;strong&gt;extrapolation error on 4B and 8B held out of the fit&lt;/strong&gt; (Table 2): a second-order law wins (0.6 / 1.4 ×10⁻³) over a plain power law (2.0 / 3.7). Downstream: closed-loop CEM planning in RoboCasa with capability emerging in order (end-effector control → holding → scene geometry → object dynamics, the last only at ~10²² FLOPs); a real Franka table (Table 3: 8B grasp 67 %, lift 50 %, pick-and-place 27 % success; π0.5 as a reference, not a baseline); &#34;over 50 000 evaluation episodes&#34; across both platforms, per-task n in an appendix. Planning is &#34;several seconds per step for 8B, not real-time&#34;.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Gate B, encoder on device.&lt;/strong&gt; Bar: 2-view encoder p50 ≤ 200 ms on the Orin NX. Result: &lt;strong&gt;526 ms&lt;/strong&gt; (one view 398 ms); the 100M predictor step 252 ms, 300M 487 ms. No-go on device. On the Mac (MPS) the encoder is 1 025 ms and the predictor&#39;s attention does not run. Any use is off-board on CUDA.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Gate A, does the pretrained predictor use my actions.&lt;/strong&gt; Two bars on 9-step rollouts of my bowls latents: (1) L1 ≥ 15 % below copy-last for the 300M model; (2) ≥ 5 % below shuffled actions. Result: (1) 300M &lt;strong&gt;11.8 %&lt;/strong&gt;, 100M 10.5 %, 1B 15.8 % [14.6, 17.0] on only 30 clips; (2) &lt;strong&gt;8.9–10.4 %&lt;/strong&gt; for every size. The primary bar fails; the 1B is borderline on a partial sample; &lt;strong&gt;action conditioning works on my arm&lt;/strong&gt; at every size.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G1b-RJ&lt;/strong&gt; (the 1B on the ranking gate) was cancelled as a gate on 2026-10-15: neither outcome would change the build, since the encoder cannot run in the loop.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Action use&lt;/td&gt; &lt;td&gt;implicit in the rollout error&lt;/td&gt; &lt;td&gt;9–10 % below shuffled, all sizes&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Rollout error vs model size&lt;/td&gt; &lt;td&gt;clean frontier, near irreducible E ≈ 0.22&lt;/td&gt; &lt;td&gt;100M 10.5 → 300M 11.8 → 1B 15.8 % below copy-last (30 clips)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Encoder latency&lt;/td&gt; &lt;td&gt;not reported (multi-GPU planning)&lt;/td&gt; &lt;td&gt;526 ms / 2 views, Orin NX&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Real-robot n&lt;/td&gt; &lt;td&gt;appendix&lt;/td&gt; &lt;td&gt;30 clips, no robot&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;My arm is in their training mix, and the pretrained model does read its actions — the Gate A shuffled-action margin is the far-left point of their scaling curve, at zero fine-tuning cost. What it cannot do is run where the arm is. The paper is explicit that planning is not real-time even on a GPU cluster; on an Orin the encoder alone eats sixteen control ticks. So the honest use is offline: feature extraction for a judge or a dataset-level probe. The method lesson is the one to keep: a scaling claim is an &lt;strong&gt;extrapolation test&lt;/strong&gt; — fit on some sizes, predict the held-out ones, report the error. My own scaling angle (50 / 100 / 182 / 362 episodes) is a plot until it does that.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; action conditioning reproduces at the small end; the encoder is off the robot.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; a distilled encoder at ≤ 100 ms, which is not my experiment to run.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai, Gate A): ~$1.2. Gate B on the Orin NX: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-robojepa&#34;&gt;2026-10-23-paper-vs-hardware-robojepa&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 3 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-dino-wm/&#34;&gt;← Papers tested 2: DINO-WM&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-h-jepa/&#34;&gt;Papers tested 4: H-JEPA →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-robojepa/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-robojepa/</guid> </item> <item> <title>Robometer</title> <description>&lt;h1 id=&#34;robometer&#34;&gt;Robometer&lt;a class=&#34;headerlink&#34; href=&#34;#robometer&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a large reward model, trained on a million robot videos, can judge runs on robots it never saw. We asked it, untrained, to tell failed from successful runs on 2 099 public SO-101 arm runs. It did not hold: 0.818 out of 1, under our 0.85 bar; on our runs a robot-trained judge, Flora, passed.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Failure judging, pooled AUROC: Robometer-4B 0.818; episode length 0.938; bar 0.85&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Failure judging, pooled AUROC: Robometer-4B 0.818; episode length 0.938; bar 0.85&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;155.5&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;Robometer-4B&lt;/text&gt;&lt;text x=&#34;277.5&#34; y=&#34;40&#34;&gt;0.818&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;178.3&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;episode length&lt;/text&gt;&lt;text x=&#34;300.3&#34; y=&#34;66&#34;&gt;0.938&lt;/text&gt;&lt;line x1=&#34;279.5&#34; y1=&#34;20&#34; x2=&#34;279.5&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;279.5&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 0.85&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not use this model as a pass or fail judge without a check on your own runs. Compare it first with how long each run lasted. On these arms, length alone separated failures better on every held-out task. Runs that grabbed the wrong object scored as the most successful.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;The paper reports progress ranking and a failure score on 100 DROID runs; it never computes an episode-length baseline. Here: zero-shot failure detection on 2 099 rollouts from 7 policies, bar fixed first, plus 88 own rollouts (0.577). The fine-tune on our data never trained, so only the zero-shot model is tested.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 10 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Train a general robot reward model on a vision-language backbone, from about a million trajectories across 21 embodiments with progress, preference and success heads, and use it zero-shot to score progress, rank trajectories and detect failures.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The reward model tracks task progress on embodiments it was not trained on. &lt;small&gt;(Table I (VOC 0.92 / 0.94))&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;It detects failures zero-shot better than other reward models and token-uncertainty baselines. &lt;small&gt;(Table IV (F1 0.81))&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;As a reward it improves online and offline RL, including on an SO-101. &lt;small&gt;(Q3, Fig. 7)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A 4B reward model judges SO-101 rollouts zero-shot. · &lt;strong&gt;Bar:&lt;/strong&gt; Pooled AUROC ≥ 0.85 and within-policy ≥ 0.8 on ≥ 5 of 7 policies. · &lt;strong&gt;n:&lt;/strong&gt; 2099 + 88 rollouts&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; VOC 0.94 on out-of-distribution evaluation sets (0.92 in-distribution) vs pooled AUROC 0.818 on 2099 ArmnetBench rollouts; episode length alone 0.938 · &lt;strong&gt;Not proven:&lt;/strong&gt; Zero-shot only; the LoRA run never trained.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2603.02115&#34;&gt;arXiv 2603.02115&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/robometer/robometer&#34;&gt;robometer/robometer&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-10&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; learned reward model at least pass mark on failure AUROC — theirs failure-detection F1 0.81 (no AUROC reported); VOC 0.94 OOD · ours 0.818 pooled &lt;small&gt;(paper Table IV (zero-shot failure detection))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; learned reward model above episode length on failure AUROC — theirs no episode-length baseline in the paper · ours 0.818 vs episode length 0.938 &lt;small&gt;(not a paper comparison: the paper&amp;#x27;s premise that a learned judge beats hand-made signals)&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; episode length above learned reward model on failure AUROC · ours 0.938 vs 0.818 &lt;small&gt;(our measured comparison)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai): ~$8.55–9.55 incl. a LoRA run that never trained and an OOM re-score. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-robometer&#34;&gt;2026-10-23-paper-vs-hardware-robometer&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#success-or-failure&#34;&gt;I need to tell success from failure in a rollout →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;!-- register-figs:start --&gt; &lt;!-- register-figs:end --&gt; &lt;p&gt;Robometer (Liang, Korkmaz, Zhang, Hwang et al.; arXiv 2603.02115) is a 4B reward model trained on a million trajectories. I tested it zero-shot as a judge on my own rollouts and on a 2 099-rollout public SO-101 benchmark. Episode length beat it on every held-out task. The paper never computes episode length.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Qwen3-VL-4B with learned tokens: a progress token after each frame (causal; progress in 10 bins, success at the last frame) and a preference token after two videos. Three losses: preference, progress, success. Pairs are built from expertise (expert vs failure), &lt;strong&gt;instruction negatives&lt;/strong&gt; (same frames, wrong instruction → progress 0), and video rewind. Data: RBM-1M, 21 embodiments; &lt;strong&gt;SO-101 is not in it&lt;/strong&gt;.&lt;/p&gt; &lt;p&gt;Evaluation on RBM-EVAL (976 OOD trajectories): &lt;strong&gt;VOC&lt;/strong&gt; (Pearson r between predicted reward and frame index on successes) 0.92 and &lt;strong&gt;Kendall τ&lt;/strong&gt; on the failed &amp;lt; suboptimal &amp;lt; successful ordering 0.64, vs RoboReward-8B 0.82 / 0.47. Zero-shot on RoboFAC, VOC 0.65. Ablations on LIBERO-90: adding failure data lifts τ from 0.74 to 0.92. Downstream: online RL on a DROID π0 base 20 → 85 % (&lt;strong&gt;20 trials&lt;/strong&gt;); offline IQL on SO-101 &#34;2.4× the best baseline&#34; (0.85 vs 0.50 on an oven task; 0.15 vs 0.05 on a plate task — 3 vs 1 successes in 20); failure detection on 100 DROID trajectories, F1 0.81 vs GPT-5-mini 0.33. The authors&#39; own limitation: no access to contact or grasp stability.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;G9a-AB (2026-10-15/16).&lt;/strong&gt; Zero-shot on ArmnetBench, 2 099 rollouts, 7 policies, top camera. Bar: pooled AUROC ≥ 0.85 and within-policy ≥ 0.8 on ≥ 5/7. Complete set: pooled &lt;strong&gt;0.818&lt;/strong&gt; [0.790, 0.843]; within-policy 5/7; &lt;strong&gt;episode length alone 0.938&lt;/strong&gt;; beyond length (quintile median 0.687, CV gain +0.016) both bars missed. Fail: not a zero-shot judge.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G9a-own (2026-10-16).&lt;/strong&gt; On my 88 labelled bowls rollouts: AUROC &lt;strong&gt;0.577&lt;/strong&gt; [0.44, 0.70]; TPR 0.25 at the calibrated threshold; policy identity 0.878; &lt;strong&gt;wrong-object failures scored highest&lt;/strong&gt;. Fail.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;G9b (written 2026-10-22).&lt;/strong&gt; The LoRA fine-tune on held-out-task folds never trained (the job died at preprocessing). The zero-shot baseline on policy rollouts only: stack 0.564, tool 0.616, cable 0.761, ring 0.933; &lt;strong&gt;length 0.903 / 0.855 / 0.946 / 0.965, better on 4/4&lt;/strong&gt;; CV gain over length +0.008 [−0.001, 0.017]. No verdict.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Ranking quality&lt;/td&gt; &lt;td&gt;VOC 0.92, τ 0.64 (OOD embodiments)&lt;/td&gt; &lt;td&gt;AUROC 0.82 on ArmnetBench, 0.58 on own bowls&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Episode-length baseline&lt;/td&gt; &lt;td&gt;not run&lt;/td&gt; &lt;td&gt;0.938 / 4-of-4 held-out tasks&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Wrong-object failures&lt;/td&gt; &lt;td&gt;not analysed&lt;/td&gt; &lt;td&gt;scored highest&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Downstream n&lt;/td&gt; &lt;td&gt;20 trials&lt;/td&gt; &lt;td&gt;—&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Robometer and my result agree once the question is phrased right. The model answers &#34;how far along does this look&#34; and does that well (VOC 0.92 is real). My failure mode is identity — the wrong bowl, nested — and a trajectory-comparison objective with instruction negatives at the dataset level has no reason to catch it at the frame level on an embodiment it never saw. The paper&#39;s own &#34;pull tissue&#34; and &#34;fold towel&#34; rows (F1 0.58, 0.76) are its version of the same gap. The number that should be in every reward-model paper and is in none of the ten I read: &lt;strong&gt;episode length&lt;/strong&gt;. On my tasks it is the judge every learned judge must beat first.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; fails as a zero-shot judge on this arm; the gap is the task&#39;s, not the model&#39;s.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; an instruction-negative test on my own frames (swap the instruction, fix the frames, does the score move?) before any LoRA; and labels for suboptimal-but-successful episodes, which τ needs and I do not have.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai): ~$8.55–9.55 incl. a LoRA run that never trained and an OOM re-score.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-robometer&#34;&gt;2026-10-23-paper-vs-hardware-robometer&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 10 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-vla-corrector/&#34;&gt;← Papers tested 9: VLA-Corrector&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-smolvla/&#34;&gt;Papers tested 11: SmolVLA →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-robometer/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-robometer/</guid> </item> <item> <title>SmolVLA</title> <description>&lt;h1 id=&#34;smolvla&#34;&gt;SmolVLA&lt;a class=&#34;headerlink&#34; href=&#34;#smolvla&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a small robot policy works on a low-cost arm and runs on cheap hardware. On our arm we ran it 10 times and timed it on the robot&amp;#x27;s computer. It held: 9 of 10 runs succeeded, and our engine cut each step to 238 ms.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 124&#34; role=&#34;img&#34; aria-label=&#34;SmolVLA chunk inference on the Orin NX, ms: PyTorch 974 ms; vla.cpp 390 ms; vla.cpp + FA 238 ms; async budget 667 ms&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;SmolVLA chunk inference on the Orin NX, ms: PyTorch 974 ms; vla.cpp 390 ms; vla.cpp + FA 238 ms; async budget 667 ms&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;168.2&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;PyTorch&lt;/text&gt;&lt;text x=&#34;290.2&#34; y=&#34;40&#34;&gt;974 ms&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;67.4&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;vla.cpp&lt;/text&gt;&lt;text x=&#34;189.4&#34; y=&#34;66&#34;&gt;390 ms&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;81&#34; width=&#34;41.1&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;92&#34; text-anchor=&#34;end&#34;&gt;vla.cpp + FA&lt;/text&gt;&lt;text x=&#34;163.1&#34; y=&#34;92&#34;&gt;238 ms&lt;/text&gt;&lt;line x1=&#34;233.2&#34; y1=&#34;20&#34; x2=&#34;233.2&#34; y2=&#34;108&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;233.2&#34; y=&#34;120&#34; text-anchor=&#34;middle&#34;&gt;async budget 667 ms&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Use it, through the vla.cpp engine rather than PyTorch on a Jetson: 238 ms per chunk instead of 974 ms.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;10 trials per engine on a task at ceiling for every policy, so success does not separate policies. Asynchronous execution was not timed on the arm.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 11 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Build a small, open vision-language-action model trained on community LeRobot data that matches much larger VLAs, runs on consumer hardware, and can run asynchronously; shown in simulation and on SO-100 / SO-101 arms.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A 450M VLA pretrained on community SO-100 data matches or beats much larger VLAs on real low-cost arms. &lt;small&gt;(Table 3–4 (SO-101 LEGO 90 %))&lt;/small&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Asynchronous inference keeps the arm moving while the next chunk is computed. &lt;small&gt;(Algorithm 1; Fig. 5)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Pretraining on community data raises real-arm success (51.7 → 78.3 % on SO-100, Table 5). &lt;small&gt;(Table 5)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A 450M VLA succeeds on an SO-101 task and can run on low-cost hardware. · &lt;strong&gt;Bar:&lt;/strong&gt; 10-trial operator-judged gate (no numeric pass mark registered); chunk inference within the async budget (667 ms). · &lt;strong&gt;n:&lt;/strong&gt; 10 trials per engine&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; SO-101 LEGO 90 % in distribution; latency not reported for Jetson vs 9/10 on bowls; 974 ms in PyTorch, 238 ms with vla.cpp on the Orin NX · &lt;strong&gt;Not proven:&lt;/strong&gt; The bowls task is at ceiling for every policy; asynchronous execution not timed on the arm.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2506.01844&#34;&gt;arXiv 2506.01844&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/huggingface/lerobot&#34;&gt;huggingface/lerobot&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-11&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; SmolVLA at least pass mark on success on the arm — theirs 90 % (SO-101 LEGO) · ours 9/10 &lt;small&gt;(paper Table 4 (SO-101 Pick-Place-Lego, 90 % in distribution))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; SmolVLA chunk inference below async budget on ms per action chunk on the Orin NX — theirs latency not reported for Jetson · ours 238 ms (vla.cpp + FA), 974 ms PyTorch &lt;small&gt;(our measured comparison)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX, arm). Cost: $0; SmolVLA training cost not recorded. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-smolvla&#34;&gt;2026-10-23-paper-vs-hardware-smolvla&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;!-- register-figs:start --&gt; &lt;!-- register-figs:end --&gt; &lt;p&gt;SmolVLA (Shukor, Aubakirova, Capuano et al., Hugging Face; arXiv 2506.01844) is the policy behind almost every number on this site. Its paper&#39;s ablation tables are the manual for running it on a Jetson; three of them predicted things I later measured.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A 450M VLA: SmolVLM-2 (SigLIP + SmolLM2) with the image at 512×512, no tiling, pixel-shuffled to &lt;strong&gt;64 visual tokens per frame&lt;/strong&gt;; the state projected to one token &lt;em&gt;into the VLM prefix&lt;/em&gt;; only the &lt;strong&gt;first 16 of 32 LLM layers&lt;/strong&gt; run; a ~100M action expert alternating cross-attention (to the VLM&#39;s keys/values) and causal self-attention over the chunk, trained by conditional flow matching with 10 Euler steps, chunk 50. Only the expert is trained. Pretraining: 481 community SO-100 datasets, 22.9k episodes, with task strings rewritten by a VLM and cameras manually mapped to a consistent order.&lt;/p&gt; &lt;p&gt;Evaluation: LIBERO and Meta-World at &lt;strong&gt;10 trials per task&lt;/strong&gt;; real SO-100 and SO-101 tasks with 50 demos each (10 per 5 start positions), scored by sub-steps; baselines π0 fine-tuned on the same data and ACT from scratch. Headline: LIBERO 87.3 for 0.45B vs π0 86.0; SO-100 real 78.3 vs π0 61.7 vs ACT 48.3; SO-101 LEGO 90 / 50 in-/out-of-distribution. The ablations: community pretraining is worth &lt;strong&gt;+27 points&lt;/strong&gt; on SO-100 (Table 5); cross+self attention 85.5 vs cross-only 79.0; flow matching 80.3 vs L1 75.3; &lt;strong&gt;state in the VLM prefix 80.3 vs in the expert 73.3&lt;/strong&gt; (Table 11); chunk 50 fine; and &lt;strong&gt;executing 1 / 10 / 30 / 50 actions before re-observing: 80.3 / 82.8 / 70.8 / 51.8&lt;/strong&gt; (Table 13). Asynchronous inference keeps success (73.3 vs 78.3) and doubles throughput (19 vs 9 cubes in fixed time). No seeds, no intervals.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;The bowls gate (10 trials, operator-judged).&lt;/strong&gt; SmolVLA PyTorch on the Orin: 9/10 at &lt;strong&gt;974 ms&lt;/strong&gt; per chunk. Through vla.cpp: 9/10 at 390 ms; with flash attention 8/10 at &lt;strong&gt;238 ms&lt;/strong&gt;. Same weights, 4× faster, same task success. The task is at ceiling (ACT 9–10/10, VLA-JEPA 9/10), so it separates engines, not policies.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Parity.&lt;/strong&gt; The GGUF against PyTorch on fixed frames and shared noise: median max |Δ| &lt;strong&gt;0.80°&lt;/strong&gt; against a 1° line (noise-to-noise spread in PyTorch itself 12.2°).&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Chunk boundaries (G13b, G13b-in-vla.cpp).&lt;/strong&gt; With a 238 ms chunk at 30 Hz the inference delay is d ≈ 7 steps; a fresh chunk from fresh noise jumps at the junction. Gradient-free prefix overwrite cuts the median jump &lt;strong&gt;72–74 %&lt;/strong&gt; offline and 71–73 % through the engine at +0.4 ms per chunk.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Oscillation (G14).&lt;/strong&gt; 24 % of failed episodes reverse direction at ≥ 3 consecutive chunks.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Real-arm success&lt;/td&gt; &lt;td&gt;SO-101 LEGO 90 % ID&lt;/td&gt; &lt;td&gt;bowls 8–9/10 (ceiling)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Latency&lt;/td&gt; &lt;td&gt;not reported for Jetson&lt;/td&gt; &lt;td&gt;974 ms → 238 ms (vla.cpp + FA)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Re-observe interval&lt;/td&gt; &lt;td&gt;Table 13: full chunk costs 29 pts&lt;/td&gt; &lt;td&gt;d ≈ 7, within the &#34;free&#34; band; boundary handled by prefix overwrite&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Pretraining value&lt;/td&gt; &lt;td&gt;+27 pts&lt;/td&gt; &lt;td&gt;not re-measured; every fine-tune here starts from it&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Nothing here contradicts the paper; the paper predicts the work. Table 13 is my boundary problem in the authors&#39; own numbers: executing a whole chunk before re-observing is ruinous, re-observing every ≤ 10 steps is nearly free — &lt;em&gt;if&lt;/em&gt; the junction is handled, which is what prefix overwrite and RTC are for. Table 11 is a checklist item for the plugin (state in the prefix, not the expert). Table 5 is the honest footnote under every fine-tune: the community pretraining is doing more than any architecture choice I could make. The one thing I measured that the paper does not is the engine: on an Orin the first 4× is engineering, and the control-loop research cannot start until it is done.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; reproduces; the ablation tables are the operating manual.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; nothing needs changing; the open question from this paper on my arm is the async stack&#39;s refill threshold g, which I run through vla.cpp and have not pre-registered.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX, arm). Cost: $0; SmolVLA training cost not recorded.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-smolvla&#34;&gt;2026-10-23-paper-vs-hardware-smolvla&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 11 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-robometer/&#34;&gt;← Papers tested 10: Robometer&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-turbovla/&#34;&gt;Papers tested 12: TurboVLA →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-smolvla/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-smolvla/</guid> </item> <item> <title>TurboVLA</title> <description>&lt;h1 id=&#34;turbovla&#34;&gt;TurboVLA&lt;a class=&#34;headerlink&#34; href=&#34;#turbovla&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a light policy without a large language model still follows its instruction. On our arm we trained it on our two tasks and swapped the instruction. Our claim that it ignored the instruction is withdrawn: the data caused the 0.020° change, not the model.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;TurboVLA task swap, degrees of pan: ours (path A) 0.020°; LIBERO control 5.525°; bar 5°&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;TurboVLA task swap, degrees of pan: ours (path A) 0.020°; LIBERO control 5.525°; bar 5°&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;1.5&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;ours (path A)&lt;/text&gt;&lt;text x=&#34;122.6&#34; y=&#34;40&#34;&gt;0.020°&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;161.5&#34; height=&#34;14&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;LIBERO control&lt;/text&gt;&lt;text x=&#34;283.5&#34; y=&#34;66&#34;&gt;5.525°&lt;/text&gt;&lt;line x1=&#34;264.2&#34; y1=&#34;20&#34; x2=&#34;264.2&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;264.2&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 5°&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;If your scenes already reveal the task, do not expect any policy to read the instruction. Record data where the instruction decides early and often.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Upstream&amp;#x27;s own trainer on our data moved the arm 0.020° on a task swap; their released checkpoint moved 0.105 here. One seed; the instruction is redundant on 94 % of frames.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 12 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Make a lightweight VLA without a full VLM backbone (DINOv3 vision and a BERT text encoder fused for an action decoder) that is fast enough for real-time control; shown on LIBERO and RoboTwin 2.0 in simulation and on an AgileX Piper.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A policy without a large VLM backbone still follows the language instruction. &lt;small&gt;(§4 ablations, Table 3 (LIBERO-Goal 97.4 → 11.6 without language))&lt;/small&gt; &lt;span class=&#34;pill pill-withdrawn&#34;&gt;withdrawn&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-withdrawn&#34;&gt;withdrawn&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; Our claim that the architecture made the policy ignore its instruction. · &lt;strong&gt;Bar:&lt;/strong&gt; Task swap ≥ 5° and per-layout ≥ 75 % → our port was the bug; &amp;lt; 1° with the control ≥ 0.095 → the data. · &lt;strong&gt;n:&lt;/strong&gt; 25 val episodes, 8 frames&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; LIBERO-Goal 97.4 → 11.6 without language (Table 3) vs upstream&#39;s own trainer on our data: task swap 0.020°, per-layout 38.9 %; control, their released LIBERO checkpoint run here: 0.105 (≈ 5.5° of pan) · &lt;strong&gt;Not proven:&lt;/strong&gt; One seed; two tasks only, instruction redundant on 94 % of frames.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2607.27205&#34;&gt;arXiv 2607.27205&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/H-EmbodVis/TurboVLA&#34;&gt;H-EmbodVis/TurboVLA&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-12&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-withdrawn&#34;&gt;withdrawn&lt;/span&gt; TurboVLA on our data at least pass mark on task-swap action change — theirs LIBERO control 5.5° of pan · ours 0.020° on our data; LIBERO control 5.5° &lt;small&gt;(our measured comparison)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai): path A ≈ $2.0 + ~$0.8 of failed starts. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-turbovla&#34;&gt;2026-10-23-paper-vs-hardware-turbovla&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;!-- register-figs:start --&gt; &lt;!-- register-figs:end --&gt; &lt;p&gt;TurboVLA (Xie, Yao, Wu et al.; arXiv 2607.27205) drops the language model from the VLA and binds vision to text with Grounding-DINO-style cross-attention. My port failed on a two-task dataset, I concluded it ignored the instruction, then I found my port differed from the paper in four places, then I ran the paper&#39;s own trainer on my data. The faithful model ignores the instruction too. The data was the whole story.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;V + L → A instead of V → L → A: DINOv3 patch features and BERT token features, each projected to 256-d, fused by &lt;strong&gt;six bidirectional cross-attention layers initialised from Grounding DINO&lt;/strong&gt; (&lt;code&gt;--pretrained_init_ckpt groundingdino_swint_ogc.pth&lt;/code&gt;), then an ACT-style decoder with 12 learnable action queries; the robot &lt;strong&gt;state enters the decoder memory only&lt;/strong&gt; (eq. 6/9), because &#34;it is required for translating task-conditioned scene features into executable actions but not necessary for visual-language correspondence&#34;. Plain ℓ1 on the chunk. 0.2B parameters, 31 ms per chunk on a 4090.&lt;/p&gt; &lt;p&gt;Evaluation: LIBERO with one mixed-suite model, &lt;strong&gt;50 rollouts per task&lt;/strong&gt;, 97.7 average (π0.5 96.9 at 3× the latency, SmolVLA 88.8); RoboTwin 2.0 multi-task 60.2; real Piper, four tasks, &lt;strong&gt;40 trials each&lt;/strong&gt;, against π0.5 on the same data. The ablation that matters here, Table 3: &lt;strong&gt;remove language, LIBERO average 97.7 → 70.8, LIBERO-Goal 97.4 → 11.6&lt;/strong&gt;. On data where the instruction is the only thing that distinguishes targets, this architecture uses it. One-way cross-attention costs 1.2–1.6 points (Table 5). The Grounding DINO initialisation is stated once and &lt;strong&gt;never ablated&lt;/strong&gt;.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Several variants, Sept 29 – Oct 8.&lt;/strong&gt; 0/3 on the last; a two-week diagnosis with six probes concluded the model ignored the instruction on the two-task bowls data. The data finding survived: on 94 % of frames the instruction is redundant with the arm state (&#34;fact 7&#34;: the side decision is visible in ~6 % of frames and the pose leaks it), so a copycat policy fits the data.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The port review (2026-10-22).&lt;/strong&gt; Against upstream &lt;code&gt;turbovla/models/&lt;/code&gt;: (1) the six fusion layers were &lt;strong&gt;random-init&lt;/strong&gt; in every variant — the checkpoint converter transferred DINOv3 only; (2) the fusion block is a different module — two independent cross-attentions instead of &lt;code&gt;BiAttentionBlock&lt;/code&gt; (shared affinity, layer-scale 1e-4, drop-path) plus a text self-attention layer; (3) the state token was &lt;strong&gt;prepended to vision before fusion&lt;/strong&gt; instead of entering the decoder memory; (4) decoder depth, head and normalisation differ. So &#34;TurboVLA ignores the instruction&#34; was never established; a port that ignores it was.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Faithful reproduction, step 1 (2026-10-22).&lt;/strong&gt; The free control: upstream code, released LIBERO checkpoint, task swap over the ten LIBERO-Goal instructions on 40 frames. Threshold 0.095 normalised (= 5° of SO-101 pan). Result &lt;strong&gt;0.105&lt;/strong&gt; — the real model moves its actions when the instruction changes; my port moved 0.1–0.25°, 20–55× less. Path A was frozen on that number: task swap ≥ 5° with per-layout ≥ 75 % → the port was the bug; task swap &amp;lt; 1° with the control ≥ 0.095 → fact 7.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Faithful reproduction, path A (2026-10-23).&lt;/strong&gt; Upstream&#39;s own trainer on the bowls data, full LIBERO init (666 of 672 tensors transferred; the 6 width-dependent ones re-initialised), 35k steps, batch 64 (128 OOM on 24 GB), ≈ $2.0 plus ~$0.8 of failed starts. Result: &lt;strong&gt;task swap 0.020°&lt;/strong&gt; (frames 0.006–0.053°), per-layout 38.9 %, start reach 26.7°; the control still 0.105. The paper&#39;s recipe, with the paper&#39;s initialisation and the paper&#39;s fusion block, moves its actions by two hundredths of a degree when the instruction changes on this data. Fact 7 is the full story.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Instruction sensitivity&lt;/td&gt; &lt;td&gt;LIBERO-Goal 97.4 → 11.6 without language&lt;/td&gt; &lt;td&gt;LIBERO control 0.105 (reads it); port 0.1–0.25° and &lt;strong&gt;faithful 0.020°&lt;/strong&gt; on bowls (neither does)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Fusion init&lt;/td&gt; &lt;td&gt;Grounding DINO, never ablated&lt;/td&gt; &lt;td&gt;port random vs faithful Grounding DINO: &lt;strong&gt;no effect on instruction use&lt;/strong&gt; on this data&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Real-arm success&lt;/td&gt; &lt;td&gt;80–92.5 %, 40 trials&lt;/td&gt; &lt;td&gt;0/3 on the last port&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Data&lt;/td&gt; &lt;td&gt;multi-task, instruction decisive&lt;/td&gt; &lt;td&gt;two tasks, instruction redundant on 94 % of frames&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Two claims, now both answered. The &lt;strong&gt;data&lt;/strong&gt; claim stands and is now the whole result: on frames where the instruction is redundant with the arm state 94 % of the time, the paper&#39;s architecture with the paper&#39;s weights learns the copycat too (0.020° vs 0.105 for the same model on LIBERO-Goal, where the instruction is decisive). The &lt;strong&gt;model&lt;/strong&gt; claim — that &lt;em&gt;my port&lt;/em&gt; was the reason — is false: the four divergences are real, documented, and made no difference to instruction use. Table 3 of the paper and path A together say the same thing from two sides: this architecture reads language exactly when the data makes language necessary, and not otherwise. A by-product: the Grounding DINO initialisation, never ablated in the paper, is ablated here on one dataset (random vs faithful) with no effect on the quantity that mattered.&lt;/p&gt; &lt;p&gt;The lesson I am keeping is about order, not architecture: parity against upstream should have come before the two-week diagnosis, and the diagnosis should have ended with a data-side control (train the paper&#39;s model on data where the instruction is decisive) before any sentence about the model. Both are now rules in the register.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; the data claim (fact 7) is the full story; the port claim is withdrawn; correction row written.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; nothing about this dataset. The next test is the paper&#39;s model on data where the instruction decides early and often (the tidy-loop sessions), which is the only way to learn whether it helps on this arm.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai): path A ≈ $2.0 + ~$0.8 of failed starts.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-turbovla&#34;&gt;2026-10-23-paper-vs-hardware-turbovla&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 12 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-smolvla/&#34;&gt;← Papers tested 11: SmolVLA&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-vla-jepa/&#34;&gt;Papers tested 13: VLA-JEPA →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-turbovla/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-turbovla/</guid> </item> <item> <title>VLA-Corrector</title> <description>&lt;h1 id=&#34;vla-corrector&#34;&gt;VLA-Corrector&lt;a class=&#34;headerlink&#34; href=&#34;#vla-corrector&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a small model watching camera statistics and actions flags a failing run early enough to fix it. On our arm we trained the same kind of watcher on 50 recorded runs. It did not hold: it caught 2/8 failures, below our bar.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Failed runs caught, of 8: verifier (GRU) 2/8; W1 latent drift 0/8; bar 5/8&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Failed runs caught, of 8: verifier (GRU) 2/8; W1 latent drift 0/8; bar 5/8&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;47.5&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;verifier (GRU)&lt;/text&gt;&lt;text x=&#34;169.5&#34; y=&#34;40&#34;&gt;2/8&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;1.5&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;W1 latent drift&lt;/text&gt;&lt;text x=&#34;122.0&#34; y=&#34;66&#34;&gt;0/8&lt;/text&gt;&lt;line x1=&#34;236.8&#34; y1=&#34;20&#34; x2=&#34;236.8&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;236.8&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 5/8&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not rely on such a watcher on this arm yet. Ours read pooled image statistics and actions; theirs adds the arm&amp;#x27;s joint readings, which we have not tried.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;The paper reports AUROC 0.902; ours is a simpler version on 50 episodes (0.59). An earlier test of latent drift, which the paper does not use, caught nothing.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 9 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Keep a frozen π0.5 on task by detecting deviations with a learned verifier on observable history (cheap visual statistics, state and action, a GRU) and prompting recovery when it fires; shown in LIBERO and LIBERO-Plus and on a physical arm.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;A verifier on observable history detects execution risk (AUROC 0.902) close to a privileged rule-based verifier. &lt;small&gt;(§ Failure Detection and Recovery Analysis (AUROC 0.902); Fig. 4)&lt;/small&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt;&lt;/li&gt; &lt;li&gt;Prompting recovery when the verifier fires raises success under perturbations. &lt;small&gt;(Fig. 3, Table 3; real-robot results)&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; A verifier on observable history flags a failing rollout early enough to correct it. · &lt;strong&gt;Bar:&lt;/strong&gt; ≥ 5/8 failures at ≤ 1/20 false interventions. · &lt;strong&gt;n:&lt;/strong&gt; 50 episodes, 8 failures&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; 54-feature GRU verifier AUROC 0.90 vs the paper&#39;s verifier family on our rollouts (a GRU on pooled RGB statistics and actions): 2/8 caught at 3/42 false interventions, AUROC 0.59; cosine drift of the W1 latent 0/8, AUROC 0.30 · &lt;strong&gt;Not proven:&lt;/strong&gt; Their exact 54-feature verifier (with proprioceptive state) and its recovery prompt were not run here; our GRU uses pooled RGB statistics and actions.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2609.06508&#34;&gt;arXiv 2609.06508&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; no code link found&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-9&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; observable-history verifier at least pass mark on failures caught — theirs AUROC 0.90 · ours 2/8 caught at 3/42, AUROC 0.59 &lt;small&gt;(§ Failure Detection and Recovery Analysis (AUROC 0.902); Fig. 4)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-19-six-monitors-w1&#34;&gt;2026-10-19-six-monitors-w1&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;VLA-Corrector (Song, Qian, Feng, Song; arXiv 2609.06508) wraps a frozen π0.5 in a tiny learned verifier that routes a recovery prompt. I borrowed one of its signals — cosine drift of the latent — as a monitor. It caught nothing. The part of the paper I should have borrowed is the verifier&#39;s design.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The policy is frozen (OpenPI &lt;code&gt;pi05_libero&lt;/code&gt;). The verifier reads only observable history: two 112×112 views → &lt;strong&gt;parameter-free spatial statistics&lt;/strong&gt; (3×4×4 pooled RGB plus mean and std, 54 features per view) → Linear 64; state and action → MLP 32; a GRU over an 8-step window; two heads, binary risk and a five-way stage. Teacher labels come from a rule-based state machine on simulator state (f = 1 within 10 steps of a failure event, 0 beyond 20). Gate: τ = 0.40, &lt;strong&gt;four consecutive positive windows&lt;/strong&gt;, 10-step cooldown; the stage selects a recovery prompt fragment appended to the instruction; up to 100 recovery actions, then the original instruction resumes. Verifier training: 120 episodes, 30 epochs, CPU; 0.46 ms inference.&lt;/p&gt; &lt;p&gt;Evaluation: LIBERO and LIBERO-Plus difficulty 4–5 under action noise, target shift, goal shift and all three, &lt;strong&gt;1 000 episodes per condition&lt;/strong&gt;; three configurations — no assistance, a &lt;strong&gt;privileged rule verifier&lt;/strong&gt; (the efficacy upper bound), the learned verifier. Combined perturbation 70.7 → 82.6 (rule) / 80.2 (learned): the learned verifier is within 2.4 points of the oracle. Verifier quality: accuracy 93.1 %, &lt;strong&gt;precision 61.1 %, recall 94.9 %&lt;/strong&gt;, AUROC 0.90; recovery success 75 %. Ablations: single frame −15 F1, state-action only −15.8. Real arm (unnamed), three tasks, &lt;strong&gt;40 trials each&lt;/strong&gt;, target moved after execution starts: 82.5 → 88.3 average, zero-shot from sim-trained features.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;W1-A (2026-10-19).&lt;/strong&gt; Cosine drift of W1&#39;s latent as a mid-rollout screener on 50 episodes, beside L2 surprise and the live reflex. Bar: ≥ 5/8 failures at ≤ 1/20 false interventions. Result: cosine drift &lt;strong&gt;0/8, AUROC 0.30&lt;/strong&gt; — below chance; L2 surprise 2/8 at 2/42; the live reflex flagged 42/42 successes. Fail.&lt;/p&gt; &lt;p&gt;I never built the paper&#39;s verifier itself.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Signal tested&lt;/td&gt; &lt;td&gt;54-feature GRU verifier, AUROC 0.90&lt;/td&gt; &lt;td&gt;cosine drift of W1 latent, AUROC 0.30&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Gate design&lt;/td&gt; &lt;td&gt;recall-tuned (95 %), 4-window confirm, cooldown&lt;/td&gt; &lt;td&gt;single threshold&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Cost of a false trigger&lt;/td&gt; &lt;td&gt;a recovery prompt, ~100 steps&lt;/td&gt; &lt;td&gt;a wasted trial (my bar: ≤ 1/20)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Upper bound&lt;/td&gt; &lt;td&gt;privileged verifier, within 2.4 pts&lt;/td&gt; &lt;td&gt;none&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Cosine drift was a wrong borrowing — the paper&#39;s verifier is not a drift threshold. Two things from the paper matter more than the result. First, the &lt;strong&gt;precision/recall split&lt;/strong&gt;: a 61 % / 95 % verifier is a usable gate when a false trigger costs a re-prompt rather than a trial. My monitor bar (≤ 1/20 false interventions) assumes the expensive kind; if the intervention is &#34;re-observe and re-prompt&#34;, the bar can relax and the 6/8-at-7/42 risk head from the ReAP post may already be a useful gate. Second, the &lt;strong&gt;parameter-free front end plus a GRU&lt;/strong&gt; reaches 0.90 on LIBERO at zero cost on the Orin; it is the right floor baseline to put under any W1-based monitor, and it is now in the amendments as one.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; the borrowed signal fails; the paper&#39;s verifier is untested here and is the next floor baseline.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; the 54-feature GRU on my 69 rollouts, beside the risk head, with the recovery cost stated in the bar.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Update 2026-10-31 (claims audit, WS-068).&lt;/strong&gt; The register now files this paper&#39;s claim under its own method, not under latent drift. The closest test this rig has run is the GRU &#34;floor&#34; of the &lt;a href=&#34;../../../../../experiments/#exp-reap-v2&#34;&gt;REAP v2 gate&lt;/a&gt;: a GRU on pooled RGB statistics and the commanded actions, the verifier&#39;s family without the proprioceptive features, on the same 50 episodes and bar. It caught &lt;strong&gt;2/8&lt;/strong&gt; failures at 3/42 false interventions (AUROC &lt;strong&gt;0.59&lt;/strong&gt;), below the bar; the verdict stays &lt;strong&gt;fail&lt;/strong&gt;. Their exact 54-feature verifier is still not run here.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-19-six-monitors-w1&#34;&gt;2026-10-19-six-monitors-w1&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 9 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-reap/&#34;&gt;← Papers tested 8: ReAP&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-robometer/&#34;&gt;Papers tested 10: Robometer →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-vla-corrector/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-vla-corrector/</guid> </item> <item> <title>VLA-JEPA</title> <description>&lt;h1 id=&#34;vla-jepa&#34;&gt;VLA-JEPA&lt;a class=&#34;headerlink&#34; href=&#34;#vla-jepa&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;They said a robot policy pretrained on human videos without actions trains cheaply and runs well. We trained it on our data for about $10 and ran it on the arm 10 times. It held: 9 of 10 runs succeeded, at 355 ms per chunk on the robot&amp;#x27;s computer.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Time per chunk, relative to 1 sample (lower is better): 1 sample 1.00×; 8 samples 1.84×; bar 1.5×&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Time per chunk, relative to 1 sample (lower is better): 1 sample 1.00×; 8 samples 1.84×; bar 1.5×&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;86.4&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;1 sample&lt;/text&gt;&lt;text x=&#34;208.4&#34; y=&#34;40&#34;&gt;1.00×&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;159.0&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;8 samples&lt;/text&gt;&lt;text x=&#34;281.0&#34; y=&#34;66&#34;&gt;1.84×&lt;/text&gt;&lt;line x1=&#34;247.5&#34; y1=&#34;20&#34; x2=&#34;247.5&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;247.5&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 1.5×&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;It trains for about $10 and runs on a Jetson. Choosing among its 8 samples is not worth the extra time it costs.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Their main claim, robustness to perturbations, is not tested here. Ten trials only; reranking failed its own bar (0.76 at 1.84× the time).&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Papers tested · 13 of 22&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Goal (the paper&#39;s):&lt;/strong&gt; Pretrain a VLA on human videos without actions through a latent world model, so that its latent action tokens carry state-transition structure without leaking future frames; evaluated on LIBERO, SimplerEnv, LIBERO-Plus and a real Franka.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Its hypotheses:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Pretraining on action-free human video through a leakage-free latent world model improves robustness to perturbations. &lt;small&gt;(Table 3 (LIBERO-Plus 79.5 vs 62.9 without human video))&lt;/small&gt; &lt;span class=&#34;pill pill-not-tested-here&#34;&gt;not tested here&lt;/span&gt;&lt;/li&gt; &lt;li&gt;The model reaches state-of-the-art success on LIBERO and transfers to a real arm with 100 demonstrations. &lt;small&gt;(Table 1; Fig. 4)&lt;/small&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; &lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; · &lt;strong&gt;Claim tested:&lt;/strong&gt; VLA-JEPA trains cheaply on SO-101 data and runs on the robot. · &lt;strong&gt;Bar:&lt;/strong&gt; 10-trial operator-judged gate (no numeric pass mark registered); for reranking (H0): oracle / mean error ≤ ~0.7 and N = 8 ≤ 1.5× the latency. · &lt;strong&gt;n:&lt;/strong&gt; 10 trials; H0 on the teleop val split&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Theirs vs ours:&lt;/strong&gt; +1.1 over no-human-video on LIBERO (Table 1); no latency reported vs 9/10 for ~$9.7; 355 ms per chunk on the Orin NX; reranking no-go (0.76, 1.84×) · &lt;strong&gt;Not proven:&lt;/strong&gt; Perturbation robustness (their main claim) not tested.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Paper:&lt;/strong&gt; &lt;a href=&#34;https://arxiv.org/abs/2602.10098&#34;&gt;arXiv 2602.10098&lt;/a&gt; · &lt;strong&gt;Code:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ginwind/VLA-JEPA&#34;&gt;ginwind/VLA-JEPA&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;span id=&#34;claims-13&#34;&gt;&lt;/span&gt;&lt;strong&gt;Claims:&lt;/strong&gt;&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;span class=&#34;pill pill-reproduces&#34;&gt;reproduces&lt;/span&gt; VLA-JEPA at least pass mark on success on the arm — theirs real Franka: ahead of π0 and π0.5 in-distribution and with object-layout changes, second on unseen tasks (Fig. 4) · ours 9/10 &lt;small&gt;(paper §4.4, Fig. 4 (real Franka))&lt;/small&gt;&lt;/li&gt; &lt;li&gt;&lt;span class=&#34;pill pill-fail&#34;&gt;fail&lt;/span&gt; best-of-N reranking at most pass mark on oracle-to-mean error ratio · ours 0.76, 1.84× latency &lt;small&gt;(our measured comparison)&lt;/small&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai): ~$9.7 for the fine-tune. Everything else on the Orin NX, $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-vla-jepa&#34;&gt;2026-10-23-paper-vs-hardware-vla-jepa&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-23 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;VLA-JEPA (Sun, Zhang, Qi et al.; arXiv 2602.10098) pretrains a VLA on human video through a latent world model. I trained it for $10, ran it on the arm at 9/10, and tested whether its eight samples were worth choosing between. The paper&#39;s honest ablation row says what to expect: robustness, not accuracy.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-the-paper-claims-and-how-it-measures-it&#34;&gt;What the paper claims, and how it measures it&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-paper-claims-and-how-it-measures-it&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A Qwen3-VL backbone with a flow-matching head. Latent-action tokens are read out of the VLM given the &lt;strong&gt;initial frame only&lt;/strong&gt; plus the instruction — no future frame ever enters the VLM, which is the leakage-free principle — and an autoregressive latent world model predicts frozen V-JEPA 2 state chunks from them; L_WM is the teacher-forced prediction error. Robot data adds action tokens after the latent ones and a flow-matching loss; the joint objective is L_FM + β L_WM. Pretrained on Something-Something-v2 (220k human videos) and DROID; fine-tuned per benchmark.&lt;/p&gt; &lt;p&gt;Evaluation: LIBERO at &lt;strong&gt;500 episodes per suite&lt;/strong&gt;, 97.2 vs π0.5 96.9 — and &lt;strong&gt;96.1 without human video&lt;/strong&gt; (+1.1). SimplerEnv: Google Robot 65.2 with human video, &lt;strong&gt;78.4 without&lt;/strong&gt; (the authors attribute the reversal to the real-to-sim gap). LIBERO-Plus, seven perturbation axes: 79.5 vs OpenVLA-OFT 69.6, and &lt;strong&gt;62.9 without human video&lt;/strong&gt; (+16.6, the number the paper is about). Real Franka, 100 demos, three tasks: 0.70 vs π0 0.57 in distribution. No intervals; ±1 on LIBERO is inside binomial noise at this n.&lt;/p&gt; &lt;h2 id=&#34;what-i-ran&#34;&gt;What I ran&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-ran&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;strong&gt;Training.&lt;/strong&gt; Qwen3-VL-2B + DiT-B, world model off at inference, ~$9.7 on vast.ai over two days.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;The bowls gate.&lt;/strong&gt; 9/10 on the Orin NX at 355 ms per chunk (PyTorch); in the twelve-VLA latency benchmark through vla.cpp, 177 ms minimum.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;H0 (2026-10-08).&lt;/strong&gt; The question the policy&#39;s design invites: do its 8 flow samples vary enough that picking one with a world model would help? Bars: oracle/mean error ≤ 0.7, latency at N = 8 ≤ 1.5×, baseline success &amp;lt; 85 %. Result: 0.76 (null 0.92); &lt;strong&gt;1.84×&lt;/strong&gt; (643 vs 349 ms); baseline &lt;strong&gt;90 %&lt;/strong&gt;. No-go. Averaging the eight chunks got 45 % of the oracle&#39;s gain with no model at all. Reranking was dropped the same day, and with it the first architecture version.&lt;/p&gt; &lt;h2 id=&#34;their-number-my-number&#34;&gt;Their number, my number&lt;a class=&#34;headerlink&#34; href=&#34;#their-number-my-number&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th&gt;Paper&lt;/th&gt; &lt;th&gt;This arm&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;In-distribution success&lt;/td&gt; &lt;td&gt;+1.1 over no-human-video (LIBERO)&lt;/td&gt; &lt;td&gt;9/10, same as ACT and SmolVLA (ceiling)&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Perturbation robustness&lt;/td&gt; &lt;td&gt;+16.6 (LIBERO-Plus)&lt;/td&gt; &lt;td&gt;not tested&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Sample diversity useful?&lt;/td&gt; &lt;td&gt;not asked&lt;/td&gt; &lt;td&gt;oracle/mean 0.76; mean-of-8 gets 45 % of it free&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Latency&lt;/td&gt; &lt;td&gt;108.7 ms (4090)&lt;/td&gt; &lt;td&gt;355 ms PyTorch / 177 ms vla.cpp on Orin NX&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;h2 id=&#34;what-the-gap-means&#34;&gt;What the gap means&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-gap-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The paper&#39;s own ablation rows say the human-video pretraining buys robustness to perturbation, not nominal accuracy, and sometimes costs accuracy (SimplerEnv). A nominal gate at ceiling, which is all I ran, cannot see that and did not. If I ever run a perturbation gate — lighting, background, camera — this paper predicts which policy survives and why; a nominal gate showing no difference would confirm it, not refute it. The H0 result is mine, not theirs: the samples do not differ enough to be worth a chooser, and the cheapest chooser (the mean) is half as good as an oracle for free. That one afternoon ended a design.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Verdict:&lt;/strong&gt; trains and runs as advertised; the robustness claim is untested here; sample reranking is a no-go.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;What would change it:&lt;/strong&gt; a perturbation gate against SmolVLA on the same layouts, after the camera question (SEVO) is settled.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai): ~$9.7 for the fine-tune. Everything else on the Orin NX, $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-vla-jepa&#34;&gt;2026-10-23-paper-vs-hardware-vla-jepa&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Papers tested, 13 of 22.&lt;/strong&gt; &lt;a href=&#34;../paper-vs-hardware-turbovla/&#34;&gt;← Papers tested 12: TurboVLA&lt;/a&gt; · &lt;a href=&#34;../paper-vs-hardware-reki/&#34;&gt;Papers tested 14: REKI →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-vla-jepa/</link> <pubDate>Fri, 23 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/23/paper-vs-hardware-vla-jepa/</guid> </item> <item> <title>v1.5: the station as a harness for a coding agent</title> <description>&lt;h1 id=&#34;v15-the-station-as-a-harness-for-a-coding-agent&#34;&gt;v1.5: the station as a harness for a coding agent&lt;a class=&#34;headerlink&#34; href=&#34;#v15-the-station-as-a-harness-for-a-coding-agent&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know what a one-person robot lab needs to run trials unattended and keep data clean. We specified a harness from nine recent papers on agent harnesses and self-improvement. It is a design: the agent stays outside the 33 ms control tick, and nothing has run end to end.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Keep the agent out of the control tick: it dispatches actions and batches only. Separate the executor&amp;#x27;s status from the verifier&amp;#x27;s verdict. Make every dispatch idempotent, so a retry never picks twice. Let only physical or deterministic checks admit trials to the demo set.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;No run behind it: a specification, partly built, not tested end to end on the arm. Its verifier tiers come from the judge results of 10-19 and 10-20. What it changes is measured only when the loop runs.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 7 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-design&#34;&gt;design&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; A station design where the coding agent dispatches unit actions and batches and never sits inside the 33 ms tick. · &lt;strong&gt;n:&lt;/strong&gt; —&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; Not run end to end on the arm.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; None; reads results from the folders above. · &lt;strong&gt;Reproduce:&lt;/strong&gt; no run behind this post · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-22 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-22&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;Three weeks of gates reduced the world-model stack to a verifier and a shadow signal. What remained was the actual bottleneck of a one-person robotics lab: deciding what to record next, running trials unattended, and keeping the training data clean. v1.5 is that loop, specified from nine recent papers on agent harnesses and self-improvement, and partly built. It has not run end to end on the arm yet; this post is a design note, not a result.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;the-shape&#34;&gt;The shape&lt;a class=&#34;headerlink&#34; href=&#34;#the-shape&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;Claude Code (operator) ── skills: use-case brief, station-session, failure-review │ MCP Run layer journal, budgets per failure class, resume, full trace Harness tools observe · do_action · run_batch · run_policy · undo · tickets · estop Executors scripted_pick_place | run_policy (SmolVLA 450M via vla.cpp) Task plugin catalogue · planner · perception · VERIFIER (tiered) · gates Robot SO-101 · cameras · scale · Jetson Orin NX · W1 in shadow mode &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;The agent dispatches unit actions and batches; it never sits inside the 33 ms tick (HexaShell&#39;s 739 s of agent time for 26 s of robot time is the number to avoid). A new task is a plugin: catalogue, planner, perception config, verifier, gates. The harness and the logging schema do not change.&lt;/p&gt; &lt;h2 id=&#34;three-contracts&#34;&gt;Three contracts&lt;a class=&#34;headerlink&#34; href=&#34;#three-contracts&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Two-field results.&lt;/strong&gt; &lt;code&gt;executor_status&lt;/code&gt; (done / timeout / clamped / error) and &lt;code&gt;verdict&lt;/code&gt; (satisfied / violated / ambiguous / stale) are separate; &lt;code&gt;ok&lt;/code&gt; is their conjunction. The executor never writes the verdict, the verifier never reads the agent&#39;s text. &lt;code&gt;ambiguous&lt;/code&gt; can only lead to a budgeted re-observe.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Idempotent dispatch.&lt;/strong&gt; Every call carries &lt;code&gt;(run, action_id, attempt)&lt;/code&gt;; a repeat returns the existing trial. This closes &#34;the agent retried after a lost tool response and the arm picked twice&#34;.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Verifier tiers.&lt;/strong&gt; 1 physical measurement (a scale, a count), 2 deterministic perception at rest (the G9c-3 judge), 3 learned or VLM judge, 4 owner label. Tiers 1–2 can pass a gate and admit trials to &lt;code&gt;demos/&lt;/code&gt; alone. Tier 3 only pairs with tier 2, and only after a report card on that task. The gate on tier 3 is the 10-19 and 10-20 results written as policy.&lt;/li&gt; &lt;/ol&gt; &lt;h2 id=&#34;the-flywheel&#34;&gt;The flywheel&lt;a class=&#34;headerlink&#34; href=&#34;#the-flywheel&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Every trial is a LeRobot v3 record with task string, layout id, executor and version, verdict and evidence. &lt;code&gt;demos/&lt;/code&gt; is a view over satisfied trials from tier-1/2 verifiers. The next teleop session is planned from the log: failed layouts first, at most a third of the budget, then farthest-point coverage of the workspace. A policy replaces a scripted executor only through an adoption protocol (G24): enough verified demos on the failing skill, a verification window with scripted fallback, per-call finish rate not below the incumbent, revert otherwise.&lt;/p&gt; &lt;h2 id=&#34;first-task&#34;&gt;First task&lt;a class=&#34;headerlink&#34; href=&#34;#first-task&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;LEGO kitting: pick bricks from bulk into a carousel, verify by weight. Chosen because it has a tier-1 verifier for free, and because a slow robot only caps volume on a product, where it would lose outright on a service. First teleop session: 60 episodes; harness code: 284 tests. The gates for it (H1, G22, K1, G24) are frozen and waiting for the arm.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; None; reads results from the folders above.&lt;br /&gt; No run behind this post; it reads results from: &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-robometer&#34;&gt;2026-10-23-paper-vs-hardware-robometer&lt;/a&gt; (the judge at rest).&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 7 of 14.&lt;/strong&gt; &lt;a href=&#34;../two-gates-i-voided/&#34;&gt;← Evaluation and judges 6: Two gates I voided, and the two-line check that would have caught them&lt;/a&gt; · &lt;a href=&#34;../../11/a-jepa-world-model-for-3-dollars-30/&#34;&gt;Evaluation and judges 8: Training a JEPA world model on SO-101 data for $3.30 →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/22/the-station-as-a-harness/</link> <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/22/the-station-as-a-harness/</guid> </item> <item> <title>Two gates I voided, and the two-line check that would have caught them</title> <description>&lt;h1 id=&#34;two-gates-i-voided-and-the-two-line-check-that-would-have-caught-them&#34;&gt;Two gates I voided, and the two-line check that would have caught them&lt;a class=&#34;headerlink&#34; href=&#34;#two-gates-i-voided-and-the-two-line-check-that-would-have-caught-them&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know whether two benchmark results on the Jetson measured what they claimed. We reloaded each script&amp;#x27;s model the strict way and checked whether its timing parts added up. One timed a random encoder, with 192 missing keys; the other timed the wrong model.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Load checkpoints strictly, and check the key set before any benchmark. Check that timing parts sum to the total. A library version change can rename layers silently. Unit tests on stand-in models will not catch it.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;No new result: the first gate&amp;#x27;s timing stands (12.78 ms), its latent values are void. The second gate timed a random text-only model, so REKI on the Orin is unmeasured. Both were caught by checking what the script had actually loaded.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 6 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-correction&#34;&gt;correction&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; G11-A timed a random encoder and G12 a stand-in model; both gates are void. · &lt;strong&gt;n:&lt;/strong&gt; two gates&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; The voided numbers support nothing.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-22-voided-gates&#34;&gt;2026-10-22-voided-gates&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-22 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-22 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#m-voided-gates&#34;&gt;Two gates voided by a two-line check →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;On 2026-10-18 two Jetson gates went into the register with bars frozen beforehand: G11-A passed, G12 failed. Both were voided the same day. G11-A timed the right model with the wrong weights; G12 timed the wrong model. Neither was a training or hardware problem. Both were caught by checking what the script had actually loaded.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;g11-a-1278-ms-of-a-random-encoder&#34;&gt;G11-A: 12.78 ms of a random encoder&lt;a class=&#34;headerlink&#34; href=&#34;#g11-a-1278-ms-of-a-random-encoder&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;G11 Phase A asked whether W1, the multi-view JEPA world model, can run its surprise check inside the 33.3 ms control tick on the Orin NX, motors off. Bar: under 20 ms per check. Result: mean 12.78 ms, p95 12.87, max 12.95. Pass, 20.5 ms of headroom.&lt;/p&gt; &lt;p&gt;The next Jetson run was meant to measure W1&#39;s error on a still scene. No camera was attached, so only the checkpoint load could run, through the live loader, which refuses &lt;code&gt;strict=False&lt;/code&gt;. It failed: &lt;strong&gt;192 missing keys, 192 unexpected&lt;/strong&gt;, all in the ViT encoder.&lt;/p&gt; &lt;p&gt;The checkpoint was saved under transformers 5.19.0, which names ViT layers &lt;code&gt;encoder.layers.N.attention.q_proj.*&lt;/code&gt;. The Docker image ships 5.5.4, which names the same tensor &lt;code&gt;encoder.encoder.layer.N.attention.attention.query.*&lt;/code&gt;. A key remap renamed &lt;code&gt;layers&lt;/code&gt; → &lt;code&gt;layer&lt;/code&gt; and &lt;code&gt;q_proj&lt;/code&gt; → &lt;code&gt;attention.query&lt;/code&gt;, but did not add the inner &lt;code&gt;encoder.&lt;/code&gt; level, so the remapped keys still missed. Under 5.19.0 all 279 checkpoint keys load verbatim, no remap.&lt;/p&gt; &lt;p&gt;G11-A&#39;s benchmark used the same remap with &lt;code&gt;strict=False&lt;/code&gt;. All 192 encoder tensors stayed at random initialisation. The timing stands, since the architecture and compute are the same, but no latent and no surprise value from that script came from the trained encoder. The unit tests passed throughout: they only exercised the &lt;code&gt;layers&lt;/code&gt; → &lt;code&gt;layer&lt;/code&gt; rename on a stand-in model.&lt;/p&gt; &lt;p&gt;Register: &lt;strong&gt;timing valid, latents void.&lt;/strong&gt;&lt;/p&gt; &lt;h2 id=&#34;g12-parts-that-dont-sum&#34;&gt;G12: parts that don&#39;t sum&lt;a class=&#34;headerlink&#34; href=&#34;#g12-parts-that-dont-sum&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;G12 asked whether REKI, a 2.4B VLA with register-token memory, fits the Orin: memory ≤ 8 GB, chunk ≤ 250 ms. Result: 3.46 GB, 318.2 ms. Fail, and a decision to port the registers into SmolVLA instead.&lt;/p&gt; &lt;p&gt;Re-reading the report: 135.4 + 230.3 is not 318.2. The expert time came from a separate loop. Then the benchmark itself: a randomly initialised Qwen2.5-1.5B, text only, 256 random tokens, no vision tower, none of Qwen3.5&#39;s Gated DeltaNet layers, followed by a hand-written random expert, in eager PyTorch. And 3.46 GB matches that 1.64B-parameter proxy, not REKI&#39;s 2.4B. So 318 ms is neither REKI&#39;s latency on the Orin nor a bound on it.&lt;/p&gt; &lt;p&gt;Register: &lt;strong&gt;G12 void; REKI on the Orin is unmeasured.&lt;/strong&gt;&lt;/p&gt; &lt;h2 id=&#34;the-two-line-check&#34;&gt;The two-line check&lt;a class=&#34;headerlink&#34; href=&#34;#the-two-line-check&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;div class=&#34;highlight&#34;&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class=&#34;n&#34;&gt;m&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;=&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;W1LiveMonitor&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;from_checkpoint&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ckpt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)&lt;/span&gt; &lt;span class=&#34;c1&#34;&gt;# load_state_dict(strict=True), never strict=False&lt;/span&gt; &lt;span class=&#34;k&#34;&gt;assert&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;m&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;model&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;state_dict&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;())&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;==&lt;/span&gt; &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;torch&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;.&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;load&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;(&lt;/span&gt;&lt;span class=&#34;n&#34;&gt;ckpt&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;map_location&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;cpu&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;,&lt;/span&gt; &lt;span class=&#34;n&#34;&gt;weights_only&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;kc&#34;&gt;False&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;)[&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&#34;state_dict&#34;&lt;/span&gt;&lt;span class=&#34;p&#34;&gt;])&lt;/span&gt; &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt; &lt;p&gt;The first line raises on any missing or unexpected key. The second confirms the checkpoint&#39;s keys were used verbatim, not through a remap that happened to fit. On G11-A&#39;s setup the first line stops at 192 keys before a single timing is taken.&lt;/p&gt; &lt;h2 id=&#34;parts-must-sum&#34;&gt;Parts must sum&lt;a class=&#34;headerlink&#34; href=&#34;#parts-must-sum&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;G12&#39;s check is arithmetic. If a report splits a latency into parts, the parts add up to the total, measured in the same loop. And the thing measured must be the thing named: parameter count, vision tower, layer types. A 2.4B model that peaks at the memory of a 1.64B one is a second sum that does not hold.&lt;/p&gt; &lt;h2 id=&#34;what-changed&#34;&gt;What changed&lt;a class=&#34;headerlink&#34; href=&#34;#what-changed&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Both gates had frozen bars, and both results were real measurements of something. Pre-registration stops the bar from moving after the number; it says nothing about what produced the number. So the checks now come before the number: a strict load with a key-set comparison for any checkpoint, and a sum over the parts for any latency breakdown.&lt;/p&gt; &lt;p&gt;G11-A&#39;s 12.78 ms survives. G12 is open again: the REKI decision now rests on the G14 oscillation audit and on a real measurement, with the vision tower and the real expert.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-22-voided-gates&#34;&gt;2026-10-22-voided-gates&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 6 of 14.&lt;/strong&gt; &lt;a href=&#34;../../17/what-the-world-model-is-actually-for/&#34;&gt;← Evaluation and judges 5: What the world model is actually for&lt;/a&gt; · &lt;a href=&#34;../the-station-as-a-harness/&#34;&gt;Evaluation and judges 7: v1.5: the station as a harness for a coding agent →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/22/two-gates-i-voided/</link> <pubDate>Thu, 22 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/22/two-gates-i-voided/</guid> </item> <item> <title>Judging, part 2: the input format did the work</title> <description>&lt;h1 id=&#34;judging-part-2-the-input-format-did-the-work&#34;&gt;Judging, part 2: the input format did the work&lt;a class=&#34;headerlink&#34; href=&#34;#judging-part-2-the-input-format-did-the-work&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know which judge could read a run&amp;#x27;s outcome from video, beyond our two-bowl rule. We gave a robot-trained judge and three general models the same clip and question, with a bar fixed first. The robot judge caught every failure at 2/42 false alarms, and its untrained base model nearly matched it.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;For a video judge, send the whole episode, both camera views, and one outcome question at the end. Model size matters: the 9B model flagged 16/42 successes. Pair a learned judge with the deterministic one, never replace it. Flora&amp;#x27;s licence is non-commercial.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Fifty episodes, 8 failures, bar frozen before any call. The ablation separates input format from robot fine-tuning: Qwen3.5-27B passes at 2/42 and 7/8. Gemini caught 0/8 with sliding windows the day before and 8/8 with the whole episode.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 3 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-method&#34;&gt;method&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; With Flora-Rewarder&#39;s input, a general Qwen3.5-27B passes too (7/8 at 2/42): the input format did the work. · &lt;strong&gt;n:&lt;/strong&gt; 50 episodes, 8 failures&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; One prompt per model; Flora&#39;s licence is noncommercial.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai, ≥ 80 GB): ~$2.2. External API: Gemini ~$2.75. Total ~$4.95. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-20-flora-rewarder-input-format&#34;&gt;2026-10-20-flora-rewarder-input-format&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-20 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-20 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#success-or-failure&#34;&gt;I need to tell success from failure in a rollout →&lt;/a&gt;, &lt;a href=&#34;../../../../../findings/#m-input-format&#34;&gt;The input format did the work, not the robot fine-tune →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;The deterministic judge is right but narrow: it knows about two coloured bowls. Any new task needs a judge that reads video. NVIDIA&#39;s Flora-Rewarder-27B, a robot-trained outcome scorer, passed where Gemini had failed the day before. The ablation says why, and it is not the robot training.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;g-flora&#34;&gt;G-flora&lt;a class=&#34;headerlink&#34; href=&#34;#g-flora&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Input exactly as NVIDIA&#39;s terminal prompt expects: 64 frames, top and wrist camera side by side, no telemetry, greedy decoding. 50 episodes, 42 successes and 8 failures, bar frozen before any call: at the largest score threshold flagging ≤ 2/42 successes, ≥ 6/8 failures must be flagged.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;8/8 failures, 2/42 successes, AUROC 1.00.&lt;/strong&gt; Successes score 4–5, failures 1–3, including both wrong-object cases and both nested-bowl successes that fooled Gemini.&lt;/li&gt; &lt;li&gt;Deterministic (5/5 identical), 0 unparseable, 6 s per episode on an A100, $0.70 total.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Flora&#39;s licence is non-commercial, so it is evidence, not a component.&lt;/p&gt; &lt;h2 id=&#34;g-flora-abl-fine-tune-or-format&#34;&gt;G-flora-abl: fine-tune or format?&lt;a class=&#34;headerlink&#34; href=&#34;#g-flora-abl-fine-tune-or-format&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Same clip, same prompt, three general models.&lt;/p&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;Model&lt;/th&gt; &lt;th&gt;Successes flagged&lt;/th&gt; &lt;th&gt;Failures flagged&lt;/th&gt; &lt;th&gt;AUROC&lt;/th&gt; &lt;th&gt;Verdict&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Qwen3.5-27B (Flora&#39;s base, no robot fine-tune)&lt;/td&gt; &lt;td&gt;2/42&lt;/td&gt; &lt;td&gt;7/8&lt;/td&gt; &lt;td&gt;0.91&lt;/td&gt; &lt;td&gt;pass&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Qwen3.5-9B&lt;/td&gt; &lt;td&gt;16/42&lt;/td&gt; &lt;td&gt;–&lt;/td&gt; &lt;td&gt;0.75&lt;/td&gt; &lt;td&gt;fail&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Gemini 3.8 Flash, 64 JPEGs&lt;/td&gt; &lt;td&gt;3/42&lt;/td&gt; &lt;td&gt;8/8&lt;/td&gt; &lt;td&gt;0.96&lt;/td&gt; &lt;td&gt;narrow fail&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Flora&#39;s base model, untouched, passes the same bar. The 9B does not. Gemini, which caught 0/8 with sliding windows the day before, catches 8/8 with the whole episode and a terminal question. The fine-tune added a little; the input format (whole episode, both views, one outcome question at the end) and model size did the work.&lt;/p&gt; &lt;h2 id=&#34;what-goes-into-the-stack&#34;&gt;What goes into the stack&lt;a class=&#34;headerlink&#34; href=&#34;#what-goes-into-the-stack&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A commercial rewarder fine-tuned from Qwen3.5 on own labels is the planned tier-3 verifier. It pairs with the deterministic judge, never replaces it, and it gets a report card (false positives and negatives against owner labels) on every new task before any of its verdicts enter a training set. That rule is written into v1.5.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai, ≥ 80 GB): ~$2.2. External API: Gemini ~$2.75. Total ~$4.95.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-20-flora-rewarder-input-format&#34;&gt;2026-10-20-flora-rewarder-input-format&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 3 of 14.&lt;/strong&gt; &lt;a href=&#34;../../19/verify-at-rest-six-monitors-fail-in-one-day/&#34;&gt;← Evaluation and judges 2: Verify at rest: six mid-episode monitors fail in one day&lt;/a&gt; · &lt;a href=&#34;../../14/latent-distance-is-not-progress/&#34;&gt;Evaluation and judges 4: Latent distance is not progress →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/20/the-input-format-did-the-work/</link> <pubDate>Tue, 20 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/20/the-input-format-did-the-work/</guid> </item> <item> <title>Verify at rest: six mid-episode monitors fail in one day</title> <description>&lt;h1 id=&#34;verify-at-rest-six-mid-episode-monitors-fail-in-one-day&#34;&gt;Verify at rest: six mid-episode monitors fail in one day&lt;a class=&#34;headerlink&#34; href=&#34;#verify-at-rest-six-mid-episode-monitors-fail-in-one-day&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if any monitor could catch a failing run before it ended. We ran every mid-run checker in the design on 50 fresh runs, with the bars fixed the night before. Every monitor failed; the world model&amp;#x27;s live reflex fired on 42/42 successful runs.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Verify at rest, not mid-run, on this arm. The world model now runs in shadow mode: scored and logged, never allowed to stop the arm. A grasp detector built on gripper aperture cannot fire here: holding a bowl rim reads 1.1°.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Fifty fresh rollouts, 8 failures, bars frozen the night before. Thresholds from the earlier retrospective gate did not transfer. Vision-language judges caught 0/8 failures with sliding windows, and flagged 41/42 successes with two checkpoint calls.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 2 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-method&#34;&gt;method&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; Six mid-episode monitors miss their bars; the best, L2 surprise, catches 2/8 at 2/42. · &lt;strong&gt;n:&lt;/strong&gt; 50 episodes, 8 failures&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; One world model; one prompt per VLM.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX). External API: Gemini 3.8 Flash, ~$2.1–3.1 (one figure estimated: the API did not report it). · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-19-six-monitors-w1&#34;&gt;2026-10-19-six-monitors-w1&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-19 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-19 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#online-monitor&#34;&gt;I need an online failure monitor →&lt;/a&gt;, &lt;a href=&#34;../../../../../findings/#m-verify-at-rest&#34;&gt;Mid-episode monitors miss; verify at rest instead →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;One Jetson day, no arm motion, every mid-episode verifier in the v1.0 design run against 50 fresh rollouts with the bars frozen the night before. Stage trackers, VLM judges and the world-model reflex all failed. One offline engine experiment passed. The architecture that came out of it (v1.1) verifies only at rest, and that rule has not moved since.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;the-world-model-on-fresh-data&#34;&gt;The world model, on fresh data&lt;a class=&#34;headerlink&#34; href=&#34;#the-world-model-on-fresh-data&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;Test&lt;/th&gt; &lt;th&gt;Bar&lt;/th&gt; &lt;th&gt;Result&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;W1-A: L2 surprise, cosine drift, live reflex (2.2 / 10.0) as screeners&lt;/td&gt; &lt;td&gt;one signal catches ≥ 5/8 failures at ≤ 1/20 false interventions&lt;/td&gt; &lt;td&gt;L2 2/8 (AUROC 0.86); drift 0/8; &lt;strong&gt;the live reflex fires on 42/42 successes&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;G11-B-cal: refit the reflex from episode maxima&lt;/td&gt; &lt;td&gt;recall ≥ 50 % on 25 failures&lt;/td&gt; &lt;td&gt;3/25 at 1/44 false alarms; success and failure maxima overlap&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;W1-C1: event-anchored grasp check from the imagined latent&lt;/td&gt; &lt;td&gt;AUROC ≥ 0.85, ≥ 0.05 above the current latent&lt;/td&gt; &lt;td&gt;imagined &lt;strong&gt;0.70&lt;/strong&gt;, current 0.82: imagination is worse&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;W1-C2: conformal band on the surprise trace (FAIL-Detect / SAFE)&lt;/td&gt; &lt;td&gt;successes flagged ≤ 1/20, failures ≥ 50 %&lt;/td&gt; &lt;td&gt;22.7 % / 46 %; the band is not conformal across time when μ and σ are fit on the same successes&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;G10&#39;s thresholds did not transfer. The world model went to &lt;strong&gt;shadow mode&lt;/strong&gt;: scored and logged on every trial, never allowed to stop the arm.&lt;/p&gt; &lt;h2 id=&#34;stage-trackers-and-vlm-judges&#34;&gt;Stage trackers and VLM judges&lt;a class=&#34;headerlink&#34; href=&#34;#stage-trackers-and-vlm-judges&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;G15 (proprio + masks): 48 % premature, 47 % missed. The gripper reads 1.1° when holding a bowl rim, below every &#34;closed on nothing&#34; threshold, so a grasp detector built on aperture cannot fire.&lt;/li&gt; &lt;li&gt;G15-v2 and the latent-prototype tracker W1-B: unusable on this gripper; 22 % / 31 %.&lt;/li&gt; &lt;li&gt;Gemini Flash with sliding-window FAIL probability: threshold fitted at 0.98, &lt;strong&gt;0/8 failures caught&lt;/strong&gt;, 10 s per call.&lt;/li&gt; &lt;li&gt;Gemini Flash with two checkpoint calls (after grasp, at rest): &lt;strong&gt;41/42 successes flagged&lt;/strong&gt;. Nested bowls read as &#34;blue alone on the mat&#34;; the post-grasp checkpoint comes before the lift.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;the-one-that-passed-g13b&#34;&gt;The one that passed: G13b&lt;a class=&#34;headerlink&#34; href=&#34;#the-one-that-passed-g13b&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Chunk boundaries are where SmolVLA jerks. Real-time chunking (RTC) does inference-time guidance; the gradient-free alternative overwrites the new chunk&#39;s prefix with the tail of the old one. On 20 episodes, 254 boundaries: prefix overwrite cuts the median boundary jump &lt;strong&gt;72–74 %&lt;/strong&gt;; exact RTC 21–41 % at twice the latency. Ported into vla.cpp the same day: 71–73 %, prefix error 0.0, &lt;strong&gt;+0.4 ms&lt;/strong&gt; per chunk, default path bit-identical, 14/14 tests.&lt;/p&gt; &lt;h2 id=&#34;v11&#34;&gt;v1.1&lt;a class=&#34;headerlink&#34; href=&#34;#v11&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Verification and repair at rest with the deterministic judge; prefix overwrite in the engine; world model in shadow mode; every trial recorded. The simplest design of the series, and the first one forced entirely by its own negative results.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX). External API: Gemini 3.8 Flash, ~$2.1–3.1 (one figure estimated: the API did not report it).&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-19-six-monitors-w1&#34;&gt;2026-10-19-six-monitors-w1&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 2 of 14.&lt;/strong&gt; &lt;a href=&#34;../../16/judging-a-rollout-the-zero-false-positive-rule/&#34;&gt;← Evaluation and judges 1: Judging robot rollouts automatically: a success detector with zero false positives&lt;/a&gt; · &lt;a href=&#34;../../20/the-input-format-did-the-work/&#34;&gt;Evaluation and judges 3: Judging, part 2: the input format did the work →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/19/verify-at-rest-six-monitors-fail-in-one-day/</link> <pubDate>Mon, 19 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/19/verify-at-rest-six-monitors-fail-in-one-day/</guid> </item> <item> <title>What the world model is actually for</title> <description>&lt;h1 id=&#34;what-the-world-model-is-actually-for&#34;&gt;What the world model is actually for&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-world-model-is-actually-for&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if a world model could read a run&amp;#x27;s outcome, and see it coming. We tested its latent at the moment of judgement and 30 steps earlier, against which policy ran. The outcome readout scored 1.000, but on runs it had seen in training.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Use the world model as a veto before a chunk and a surprise monitor, not a planner. Its check fits the control tick: 12.78 ms on the Orin NX. Do not trust thresholds fitted on training rollouts; test on fresh ones.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Retrospective: W1 was scored on the 69 rollouts it saw as unlabeled training video. Anticipation beat policy identity by +0.179. The timing run loaded a random encoder; the timing stands, its latent values are void.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 5 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-method&#34;&gt;method&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; The latent reads outcomes at rest (AUROC 1.00 vs the judge) and anticipates failures before execution (+0.18 over policy identity). · &lt;strong&gt;n:&lt;/strong&gt; 88 rollouts&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; Step 2 is compared against policy identity only.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Mac). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-17-g10-outcome-readout&#34;&gt;2026-10-17-g10-outcome-readout&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-17 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-17&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;With a judge that is right at rest, the world model finally had a fair question: can it read the judge&#39;s verdict from the latent, and can it see it coming? G10 ran on the Mac for free. It is the one world-model gate that passed cleanly, and the next post is about how much of it survived contact with fresh data.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;g10&#34;&gt;G10&lt;a class=&#34;headerlink&#34; href=&#34;#g10&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Bars: outcome readout at the judge&#39;s timestamp AUROC ≥ 0.90; anticipation 30 steps earlier must beat policy identity by +0.10.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;Step 1, readout at t_j:&lt;/strong&gt; W1 AUROC &lt;strong&gt;1.000&lt;/strong&gt;, W2 0.976. The latent at rest contains the outcome.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Step 2, anticipation at t_j − 30:&lt;/strong&gt; the imagined latent beats policy identity by &lt;strong&gt;+0.179&lt;/strong&gt; (0.993 against ground truth).&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Mid-chunk surprise&lt;/strong&gt; (prediction error of the next latent): &lt;strong&gt;1.82×&lt;/strong&gt; higher on missed grasps, &lt;strong&gt;2.58×&lt;/strong&gt; on stalls, from the first step.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Pass. The architecture of record changed the same day: no planning, no progress tracking. The world model is a &lt;strong&gt;pre-execution veto&lt;/strong&gt; (imagine the chunk, refuse it if the imagined outcome reads as failure) and a &lt;strong&gt;mid-chunk surprise monitor&lt;/strong&gt;.&lt;/p&gt; &lt;h2 id=&#34;g11-a-does-it-fit-in-the-tick&#34;&gt;G11-A: does it fit in the tick?&lt;a class=&#34;headerlink&#34; href=&#34;#g11-a-does-it-fit-in-the-tick&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Dual-camera surprise check on the Orin NX, FP16 CUDA: &lt;strong&gt;12.78 ms&lt;/strong&gt; mean, 12.95 ms max, inside a 33 ms control tick with 20 ms to spare. Pass.&lt;/p&gt; &lt;p&gt;A correction row was added the next day: the benchmark had loaded the checkpoint with &lt;code&gt;strict=False&lt;/code&gt; and a key remap that did not fit the image&#39;s transformers version, so its encoder was random. The timing stands (same architecture); the latent values from that run are void. A strict-load check now runs before every Jetson gate.&lt;/p&gt; &lt;h2 id=&#34;honest-reading-written-before-the-next-gates&#34;&gt;Honest reading, written before the next gates&lt;a class=&#34;headerlink&#34; href=&#34;#honest-reading-written-before-the-next-gates&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;G10 is retrospective: W1 was scored on the same 69 rollouts it had seen as unlabeled training video. The real test is a fresh rollout and a fixed threshold. That test came two days later.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Mac). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-17-g10-outcome-readout&#34;&gt;2026-10-17-g10-outcome-readout&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 5 of 14.&lt;/strong&gt; &lt;a href=&#34;../../14/latent-distance-is-not-progress/&#34;&gt;← Evaluation and judges 4: Latent distance is not progress&lt;/a&gt; · &lt;a href=&#34;../../22/two-gates-i-voided/&#34;&gt;Evaluation and judges 6: Two gates I voided, and the two-line check that would have caught them →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/17/what-the-world-model-is-actually-for/</link> <pubDate>Sat, 17 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/17/what-the-world-model-is-actually-for/</guid> </item> <item> <title>Judging robot rollouts automatically: a success detector with zero false positives</title> <description>&lt;h1 id=&#34;judging-robot-rollouts-automatically-a-success-detector-with-zero-false-positives&#34;&gt;Judging robot rollouts automatically: a success detector with zero false positives&lt;a class=&#34;headerlink&#34; href=&#34;#judging-robot-rollouts-automatically-a-success-detector-with-zero-false-positives&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if a robot run could be judged automatically without ever calling a failure a success. We wrote a fixed camera rule, with no learning, that checks the two bowls once the arm is still. On 88 runs it was right 94.3 % of the time and never called a failure a success.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Judge runs at rest, from the top camera, with a rule you can read. Count false positives first: a judge that calls a failure a success poisons training data. This one missed its 95 % bar by 0.7 points and was adopted anyway, with zero false positives. A 4B reward model scored 0.818 on public runs.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;One bowls task, 88 own runs, 26 failures; reset marks were set by eye. The rule is colour masks and centroid geometry for these two bowls, with no learning. All 12 errors of the last-frame version are successes recorded past the reset. Judged at the marked reset: 95.5 %.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 1 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-method&#34;&gt;method&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; A deterministic top-camera judge at rest: 0 false positives, 94.3 % on 88 rollouts. · &lt;strong&gt;n:&lt;/strong&gt; 88 rollouts, 26 failures&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; A narrow fail of its 95 % bar; reset marks set by eye.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai) for Robometer: ~$8.55–9.55 incl. a LoRA run that never trained and an OOM re-score. The deterministic judge: Mac, $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-robometer&#34;&gt;2026-10-23-paper-vs-hardware-robometer&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-16 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-16 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#success-or-failure&#34;&gt;I need to tell success from failure in a rollout →&lt;/a&gt;, &lt;a href=&#34;../../../../../findings/#judge-at-rest&#34;&gt;Deterministic top-camera judge at rest →&lt;/a&gt;, &lt;a href=&#34;../../../../../findings/#m-judge-at-rest&#34;&gt;A deterministic judge at rest, never a false positive →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;Ten operator-judged trials are fine. An autonomous loop that records hundreds of rollouts and fine-tunes on the good ones is not, because every success it mislabels trains the policy on a failure. This is the day the judge became the most important component in the stack, and the day a published 4B reward model lost to 40 lines of OpenCV.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;robometer-4b-zero-shot&#34;&gt;Robometer-4B, zero-shot&lt;a class=&#34;headerlink&#34; href=&#34;#robometer-4b-zero-shot&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;On ArmnetBench (2 099 SO-101 rollouts, 7 policies), a first run on the partial set gave a qualified pass at AUROC 0.861. Re-scoring the 462 episodes lost to one CUDA OOM (two whole tasks, the longest episodes) brought the complete set to &lt;strong&gt;0.818&lt;/strong&gt;: fail. Episode length alone scores 0.938. Missing data is not random, and a partial result is provisional until it covers every task.&lt;/p&gt; &lt;p&gt;On our own 88 rollouts: AUROC 0.58–0.62. The main failure mode (grasping the wrong bowl) is an object-identity question that a trajectory-comparison reward model has no reason to answer.&lt;/p&gt; &lt;h2 id=&#34;g9c-a-deterministic-judge&#34;&gt;G9c: a deterministic judge&lt;a class=&#34;headerlink&#34; href=&#34;#g9c-a-deterministic-judge&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Top camera, HSV masks for the two bowls, centroid geometry: is the blue blob inside the pink one at the end? No learning.&lt;/p&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;Version&lt;/th&gt; &lt;th&gt;End rule&lt;/th&gt; &lt;th&gt;Accuracy&lt;/th&gt; &lt;th&gt;False positives&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;G9c&lt;/td&gt; &lt;td&gt;last frame&lt;/td&gt; &lt;td&gt;86.4 %&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;G9c-2&lt;/td&gt; &lt;td&gt;arm back at rest&lt;/td&gt; &lt;td&gt;29/88 invalid (failing policies rarely return to rest)&lt;/td&gt; &lt;td&gt;0&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;G9c-3&lt;/td&gt; &lt;td&gt;stillness or timeout&lt;/td&gt; &lt;td&gt;&lt;strong&gt;94.3 %&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;0&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;All twelve G9c errors are successes whose recording continues past the operator&#39;s reset, so the final frame shows the bowls separated again. Judged at the marked reset instead: 95.5 %. G9c-3 misses its pre-registered 95 % bar by 0.7 points and is adopted anyway, because the one number that matters for a training loop is the false-positive count, and it is zero.&lt;/p&gt; &lt;h2 id=&#34;the-rule&#34;&gt;The rule&lt;a class=&#34;headerlink&#34; href=&#34;#the-rule&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A judge that never calls a failure a success can be slow, narrow and dumb. One that does, however clever, poisons the data. Everything later (the verifier tiers in v1.5) comes from this table.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai) for Robometer: ~$8.55–9.55 incl. a LoRA run that never trained and an OOM re-score. The deterministic judge: Mac, $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-robometer&#34;&gt;2026-10-23-paper-vs-hardware-robometer&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 1 of 14.&lt;/strong&gt; &lt;a href=&#34;../../19/verify-at-rest-six-monitors-fail-in-one-day/&#34;&gt;Evaluation and judges 2: Verify at rest: six mid-episode monitors fail in one day →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/16/judging-a-rollout-the-zero-false-positive-rule/</link> <pubDate>Fri, 16 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/16/judging-a-rollout-the-zero-false-positive-rule/</guid> </item> <item> <title>Latent distance is not progress</title> <description>&lt;h1 id=&#34;latent-distance-is-not-progress&#34;&gt;Latent distance is not progress&lt;a class=&#34;headerlink&#34; href=&#34;#latent-distance-is-not-progress&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if distance in a world model&amp;#x27;s latent space could measure progress toward the goal. We checked whether that distance falls steadily over successful runs, then tried a hierarchical version. It did not: the arm&amp;#x27;s path loops, and the hierarchical version still had 52 % false stalls.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 72&#34; role=&#34;img&#34; aria-label=&#34;False stalls, % of runs (lower is better): H-JEPA level 2 52 %; bar 10 %&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;False stalls, % of runs (lower is better): H-JEPA level 2 52 %; bar 10 %&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;164.7&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;H-JEPA level 2&lt;/text&gt;&lt;text x=&#34;286.7&#34; y=&#34;40&#34;&gt;52 %&lt;/text&gt;&lt;line x1=&#34;149.7&#34; y1=&#34;20&#34; x2=&#34;149.7&#34; y2=&#34;56&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;149.7&#34; y=&#34;68&#34; text-anchor=&#34;middle&#34;&gt;bar 10 %&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not use latent distance to the goal frame as a progress meter or stall detector. The arm&amp;#x27;s path loops in space, so distance rises and falls. A progress signal needs training on progress labels.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Bars: Spearman ≤ −0.8 between step and distance; done detector AUROC ≥ 0.95. Measured −0.32 to −0.50, and −0.73 for the hierarchy. The done detector&amp;#x27;s 0.97–1.00 used easy negatives, frames at rest before any grasp.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 4 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-method&#34;&gt;method&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; Distance to a goal latent does not track progress (ρ −0.32 to −0.50; a second level reaches −0.73 against a −0.80 bar). · &lt;strong&gt;n:&lt;/strong&gt; teleop val episodes&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; Monotonicity measured on teleop episodes only.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Mac). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-14-g6-progress-latents&#34;&gt;2026-10-14-g6-progress-latents&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-14 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-14 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#m-latent-distance&#34;&gt;Latent distance to the goal is not progress →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;If a world model cannot rank actions, maybe it can tell how far along a task is: distance in latent space to the goal frame should fall as the arm gets closer, and a stall is when it stops falling. Zero labels needed. G6a tested that; G6b tested a hierarchical version four days later. Both failed the same way.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;g6a&#34;&gt;G6a&lt;a class=&#34;headerlink&#34; href=&#34;#g6a&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Bars: Spearman correlation between step and distance-to-goal ≤ −0.8 over successful demos; done-detector AUROC ≥ 0.95.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Monotonicity: &lt;strong&gt;−0.32 to −0.50&lt;/strong&gt; for every variant. The arm&#39;s trajectory loops in physical space (approach, lift, swing, place), so distance to the final frame rises and falls on the way there.&lt;/li&gt; &lt;li&gt;Stall rule derived from it: 32 % false stalls on held-out successes.&lt;/li&gt; &lt;li&gt;Done detector: AUROC 0.97–1.00, but its negatives were at-rest frames before any grasp. An easy contrast proves little.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;g6b-the-hierarchy&#34;&gt;G6b: the hierarchy&lt;a class=&#34;headerlink&#34; href=&#34;#g6b-the-hierarchy&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;H-JEPA&#39;s level-2 slow features (coarse stride 15, SIGReg loss) were supposed to smooth the loops out. Monotonicity −0.73 against a −0.80 bar; &lt;strong&gt;52 % false stalls&lt;/strong&gt;. The hierarchy was dropped, and with it the last planning-shaped role in the stack.&lt;/p&gt; &lt;h2 id=&#34;what-the-papers-already-said&#34;&gt;What the papers already said&lt;a class=&#34;headerlink&#34; href=&#34;#what-the-papers-already-said&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;TD-JEPA reports ~0.65 for raw latent distance against 0.95 for a learned cost; the Planning-Limits paper shows rollouts shorter than the target distance rank below chance even with a perfect simulator. I had read both. Running the gate anyway cost nothing on the Mac and turned &#34;the papers say&#34; into &#34;on this arm, this number&#34;. A progress signal has to be trained on progress labels; nothing here produced one for free.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Mac). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-14-g6-progress-latents&#34;&gt;2026-10-14-g6-progress-latents&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 4 of 14.&lt;/strong&gt; &lt;a href=&#34;../../20/the-input-format-did-the-work/&#34;&gt;← Evaluation and judges 3: Judging, part 2: the input format did the work&lt;/a&gt; · &lt;a href=&#34;../../17/what-the-world-model-is-actually-for/&#34;&gt;Evaluation and judges 5: What the world model is actually for →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/14/latent-distance-is-not-progress/</link> <pubDate>Wed, 14 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/14/latent-distance-is-not-progress/</guid> </item> <item> <title>World-model planning on an SO-101: the commanded joints win (0.90 vs 0.60)</title> <description>&lt;h1 id=&#34;world-model-planning-on-an-so-101-the-commanded-joints-win-090-vs-060&#34;&gt;World-model planning on an SO-101: the commanded joints win (0.90 vs 0.60)&lt;a class=&#34;headerlink&#34; href=&#34;#world-model-planning-on-an-so-101-the-commanded-joints-win-090-vs-060&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if a world model could plan on our arm by ranking candidate motions. We asked it to pick the real motion among 8, against a check that reads only the commanded joints. The joints won, scoring up to 0.90 vs 0.60 for the best world model.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Ranking 8 action chunks, top-1: world model 0.60; action only 0.68–0.90; bar 0.8&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Ranking 8 action chunks, top-1: world model 0.60; action only 0.68–0.90; bar 0.8&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;114.9&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;world model&lt;/text&gt;&lt;text x=&#34;236.9&#34; y=&#34;40&#34;&gt;0.60&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;130.0&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;rect x=&#34;248.0&#34; y=&#34;55&#34; width=&#34;41.9&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34; fill-opacity=&#34;0.15&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;action only&lt;/text&gt;&lt;text x=&#34;293.9&#34; y=&#34;66&#34;&gt;0.68–0.90&lt;/text&gt;&lt;line x1=&#34;270.0&#34; y1=&#34;20&#34; x2=&#34;270.0&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;270.0&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 0.8&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not plan with a latent world model on a position-controlled arm like this one. The commanded joints already say where the arm will be. A world model can only add what the actions are blind to: objects, contact, failures.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Bar: top-1 ≥ 0.8 among 8 at some target distance; 182 training episodes. Top-1 among 8 compounds pairwise errors, 0.92^7 ≈ 0.56, so regret replaced it. Frozen DINOv2 features read the arm&amp;#x27;s pose far better, R² 0.92 vs 0.57, and still failed.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 9 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-method&#34;&gt;method&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; Ranking action chunks, the world model&#39;s top-1 is 0.60 against 0.68–0.90 for an action-only baseline. · &lt;strong&gt;n:&lt;/strong&gt; 703 val anchors&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; Closed-loop planning was not run.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no for these gates (Mac). The models: W1 ~$6.54 (see the $3.30 post), W2 &amp;lt; $1, probes ~$0.06. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-leworldmodel&#34;&gt;2026-10-23-paper-vs-hardware-leworldmodel&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-13 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-13&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;G1b asked the question that decides whether a latent world model can plan on this arm: given the expert chunk and seven decoys, does imagining each one rank the expert first? Two world models, one bigger pretrained one, and a baseline with no model at all. The baseline won.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;g1b-plannable-range&#34;&gt;G1b: plannable range&lt;a class=&#34;headerlink&#34; href=&#34;#g1b-plannable-range&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Bar: top-1 ≥ 0.8 at some target distance.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;W1&lt;/strong&gt; (192-d, trained here): best 0.60 at d = 20–30. Fail.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;W2&lt;/strong&gt; (frozen DINOv2-S patches + learned dynamics): arm-pose R² 0.92 vs W1&#39;s 0.57, so the representation is far better; on G1b, 0.55–0.61. Fail. A decision with W2 takes 1.8 s on the Mac anyway (G2), so a third, bigger model W3 was not run.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;RoboJEPA&lt;/strong&gt; (pretrained, V-JEPA 2.1 features): the encoder takes 526 ms for two views on the Orin NX and 1 025 ms on the Mac. Off the robot. Zero-shot on our latents, the 1B model is borderline on a partial sample and action conditioning does work on our arm (9–10 % below shuffled actions). Not enough to earn a role.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;the-diagnosis&#34;&gt;The diagnosis&lt;a class=&#34;headerlink&#34; href=&#34;#the-diagnosis&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Top-1 among 8 compounds pairwise errors: W2&#39;s pairwise accuracy is 0.92–0.93, and 0.92^7 ≈ 0.56, which is exactly its top-1. A 0.8 top-1 bar needs ~97 % per comparison. Regret replaced top-1 as the metric.&lt;/p&gt; &lt;p&gt;Then the control: score chunks with the &lt;strong&gt;commanded joint trajectory alone, no images, no model&lt;/strong&gt;. Top-1 0.68–0.90, regret ≈ 0. On a position-controlled arm, the actions already say where the arm will be. G1b was measuring kinematics, and the joints are a better kinematics model than any latent trained on 182 episodes.&lt;/p&gt; &lt;h2 id=&#34;what-it-means&#34;&gt;What it means&lt;a class=&#34;headerlink&#34; href=&#34;#what-it-means&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A world model only has something to add where the actions are blind: object state, contact, failures. Prediction quality (G0 passed) is not decision quality (G1b failed). The next gates test exactly that boundary, and the planning role is gone for good.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no for these gates (Mac). The models: W1 ~$6.54 (see the $3.30 post), W2 &amp;lt; $1, probes ~$0.06.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-leworldmodel&#34;&gt;2026-10-23-paper-vs-hardware-leworldmodel&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 9 of 14.&lt;/strong&gt; &lt;a href=&#34;../../11/a-jepa-world-model-for-3-dollars-30/&#34;&gt;← Evaluation and judges 8: Training a JEPA world model on SO-101 data for $3.30&lt;/a&gt; · &lt;a href=&#34;../../08/turbovla-a-policy-that-ignored-its-instruction/&#34;&gt;Evaluation and judges 10: TurboVLA: a policy that ignored its instruction →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/13/the-world-model-loses-to-the-commanded-joints/</link> <pubDate>Tue, 13 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/13/the-world-model-loses-to-the-commanded-joints/</guid> </item> <item> <title>Porting ACT to vla.cpp, so a Jetson can run it without PyTorch</title> <description>&lt;h1 id=&#34;porting-act-to-vlacpp-so-a-jetson-can-run-it-without-pytorch&#34;&gt;Porting ACT to vla.cpp, so a Jetson can run it without PyTorch&lt;a class=&#34;headerlink&#34; href=&#34;#porting-act-to-vlacpp-so-a-jetson-can-run-it-without-pytorch&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if the most common policy on this arm could run on a Jetson without PyTorch. We ported it into the vla.cpp engine and checked it against PyTorch on fixed inputs and on the arm. The port merged upstream; speed was never the point, since PyTorch already ran it at 59 ms per chunk.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Run this policy through vla.cpp if you want no PyTorch on the robot. That removes a 5.5-hour source build and a 12–24 GB image. CPU-only boards can run it too. The PyTorch checkpoint scores 9/10 on the Orin NX.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Parity was checked against PyTorch on fixed inputs for two checkpoints, ours and a bimanual one. The converter reads dimensions from the checkpoint config instead of hard-coding the SO-101. This post gives no on-arm success number for the vla.cpp path.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Engineering on the Orin · 5 of 8&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-engineering&#34;&gt;engineering&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; ACT added to vla.cpp (merged upstream as #38); the PyTorch checkpoint scores 9/10 on the Orin NX gate. · &lt;strong&gt;n:&lt;/strong&gt; 10 trials&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; The vla.cpp ACT path was not gated on the arm.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX + Mac). Cost: $0; ACT training cost not recorded. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-12-act-vlacpp-port&#34;&gt;2026-10-12-act-vlacpp-port&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-12 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-12 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#vlacpp-act&#34;&gt;ACT in vla.cpp →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;ACT is the most common SO-101 policy and vla.cpp did not have it. Merged as vla.cpp &lt;code&gt;#38&lt;/code&gt; after a scoping issue (&lt;code&gt;#37&lt;/code&gt;) the maintainer approved in a day. The pitch was never speed: PyTorch ACT already runs at 59 ms per 100-action chunk on the Orin. The pitch is &lt;strong&gt;no PyTorch at inference&lt;/strong&gt;: no 5.5-hour source build, no 12–24 GB image, and CPU-only boards can run it.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-a-port-involves&#34;&gt;What a port involves&lt;a class=&#34;headerlink&#34; href=&#34;#what-a-port-involves&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;code&gt;CONTRIBUTING.md&lt;/code&gt; lists the seven mechanical sites for a new architecture. Most of ACT&#39;s pieces already existed in-tree:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;An ACT-style transformer decoder with learned queries, from the TurboVLA implementation.&lt;/li&gt; &lt;li&gt;Conv + group norm via &lt;code&gt;im2col&lt;/code&gt;, from Octo. ACT&#39;s ResNet-18 uses frozen batch norm, which folds into the conv weights at conversion time.&lt;/li&gt; &lt;li&gt;No flow-matching steps: ACT goes on the &lt;code&gt;num_steps&lt;/code&gt; refusal list. The VAE encoder is training-only, so the latent is zeros at inference.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;The converter and &lt;code&gt;act.cpp&lt;/code&gt; read state and action dims, camera count and resolution from the checkpoint config rather than hard-coding the SO-101, because the maintainer asked for a parity check on &lt;code&gt;lerobot/act_aloha_sim_transfer_cube_human&lt;/code&gt; as well: bimanual, 14-dim, one 480×640 camera.&lt;/p&gt; &lt;h2 id=&#34;how-it-was-tested&#34;&gt;How it was tested&lt;a class=&#34;headerlink&#34; href=&#34;#how-it-was-tested&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;&lt;code&gt;vla_predict_check&lt;/code&gt; against PyTorch on fixed inputs for both checkpoints (ours and the ALOHA one).&lt;/li&gt; &lt;li&gt;The same gate harness as every other policy here, with an &lt;code&gt;--engine vlacpp&lt;/code&gt; path for ACT, on the real arm. The PyTorch checkpoint scores 9/10 on the Orin NX.&lt;/li&gt; &lt;li&gt;An &lt;code&gt;--arch act&lt;/code&gt; client preset in the LeRobot-side client fork, so the same client drives ACT and SmolVLA (no tokenizer, ImageNet normalization).&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;why-a-hobby-lab-should-do-ports&#34;&gt;Why a hobby lab should do ports&lt;a class=&#34;headerlink&#34; href=&#34;#why-a-hobby-lab-should-do-ports&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;A port is the one contribution nobody can casually redo without your hardware, and it forces you to read the model as code rather than as a paper. The same reading is what later turned up a silently wrong objective in another policy&#39;s training code (LeRobot &lt;code&gt;#4381&lt;/code&gt;) and the chunk-boundary fix that went into this engine a week after (&lt;code&gt;G13b&lt;/code&gt;).&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX + Mac). Cost: $0; ACT training cost not recorded.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-12-act-vlacpp-port&#34;&gt;2026-10-12-act-vlacpp-port&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Engineering on the Orin, 5 of 8.&lt;/strong&gt; &lt;a href=&#34;../../06/benchmarking-twelve-vlas-on-an-orin-nx/&#34;&gt;← Engineering on the Orin 4: Twelve VLAs on a Jetson Orin NX: latency and memory with vla.cpp&lt;/a&gt; · &lt;a href=&#34;../../25/vla-chunk-boundary-jumps/&#34;&gt;Engineering on the Orin 6: Why your VLA&#39;s actions jump at every chunk boundary on real hardware, and a 0.4 ms fix →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/12/porting-act-to-vlacpp/</link> <pubDate>Mon, 12 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/12/porting-act-to-vlacpp/</guid> </item> <item> <title>Training a JEPA world model on SO-101 data for $3.30</title> <description>&lt;h1 id=&#34;training-a-jepa-world-model-on-so-101-data-for-330&#34;&gt;Training a JEPA world model on SO-101 data for $3.30&lt;a class=&#34;headerlink&#34; href=&#34;#training-a-jepa-world-model-on-so-101-data-for-330&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if a small world model trained on our arm&amp;#x27;s videos was worth building on. We trained it for $3.30 and tested it against fixed bars before any use. Its error 30 steps ahead was 0.31 vs 0.89 for copying the last frame, so it passed.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;LeWM open-loop error at 30 steps (lower is better): world model 0.31; copy last frame 0.89&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;LeWM open-loop error at 30 steps (lower is better): world model 0.31; copy last frame 0.89&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;59.5&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;world model&lt;/text&gt;&lt;text x=&#34;181.5&#34; y=&#34;40&#34;&gt;0.31&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;169.6&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;copy last frame&lt;/text&gt;&lt;text x=&#34;291.6&#34; y=&#34;66&#34;&gt;0.89&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Check a world model against copying the last frame before using it. This one also reacts to timing shifts, so it reads the actions. Compute the cheap baseline first: which policy ran predicted failures better than any latent.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Bars fixed before the run: beat copy-last, every corruption ratio ≥ 1.3 at K = 30, no collapse. Effective rank 24–30; probes found grasp onset at AUROC 0.94. The failure test was confounded with policy: 0.76 for policy identity alone.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 8 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-engineering&#34;&gt;engineering&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; A multi-view LeWM (W1) trains for $3.30 and beats copy-last at every horizon (0.31 vs 0.89 at K = 30). · &lt;strong&gt;n:&lt;/strong&gt; 25 val episodes&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; One training seed; planning not shown here.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai): $3.30 for the run + $2.96 of failed attempts + ~$0.28 environment bring-up = ~$6.54. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-leworldmodel&#34;&gt;2026-10-23-paper-vs-hardware-leworldmodel&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-11 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-11&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;LeWM (the &lt;code&gt;stable-worldmodel&lt;/code&gt; recipe: a JEPA trained end to end from pixels, no reconstruction) on the 182 bowls episodes, two camera views, 100 epochs. Gate G0 asked whether the model is real before anything is built on it.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;getting-it-to-train&#34;&gt;Getting it to train&lt;a class=&#34;headerlink&#34; href=&#34;#getting-it-to-train&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Eleven setup problems between the paper&#39;s code and this data and hardware, on vast.ai x86 and on the Jetson GPU. $0.28 of smoke runs. A 5-epoch model reacted to gross action errors (episode swap, frozen action) but not to ±0.5 s timing shifts, and its latent had an effective rank of 5.8 out of 192: too short to judge.&lt;/p&gt; &lt;h2 id=&#34;g0-the-faithful-run&#34;&gt;G0, the faithful run&lt;a class=&#34;headerlink&#34; href=&#34;#g0-the-faithful-run&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Pre-registered bars: beat copy-last; every corruption ratio ≥ 1.3 at K = 30; no collapse.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Open-loop error at K = 30: &lt;strong&gt;0.31 vs 0.89&lt;/strong&gt; for copy-last.&lt;/li&gt; &lt;li&gt;Timing shifts: ratios 1.99 and 1.58. The model uses the actions.&lt;/li&gt; &lt;li&gt;Effective rank 24–30. No collapse.&lt;/li&gt; &lt;li&gt;Linear probes on the latent: grasp onset AUROC 0.94, holding 0.995.&lt;/li&gt; &lt;li&gt;Cost: $3.30, plus $2.96 of failed attempts before it.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Pass. This model, called &lt;strong&gt;W1&lt;/strong&gt; from here on, is the one every later gate tests.&lt;/p&gt; &lt;h2 id=&#34;c1-the-first-disappointment&#34;&gt;C1, the first disappointment&lt;a class=&#34;headerlink&#34; href=&#34;#c1-the-first-disappointment&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Does the imagined latent predict rollout failures better than the current one? On the 81 gate rollouts: current latent 0.68, imagined 0.72, and &lt;strong&gt;policy identity alone 0.76&lt;/strong&gt;. Most failures came from TurboVLA, so &#34;which policy ran&#34; explains more than any latent. Not proven, confounded. The lesson that stuck: compute the cheap baseline before the model, every time.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai): $3.30 for the run + $2.96 of failed attempts + ~$0.28 environment bring-up = ~$6.54.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-leworldmodel&#34;&gt;2026-10-23-paper-vs-hardware-leworldmodel&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 8 of 14.&lt;/strong&gt; &lt;a href=&#34;../../22/the-station-as-a-harness/&#34;&gt;← Evaluation and judges 7: v1.5: the station as a harness for a coding agent&lt;/a&gt; · &lt;a href=&#34;../../13/the-world-model-loses-to-the-commanded-joints/&#34;&gt;Evaluation and judges 9: World-model planning on an SO-101: the commanded joints win (0.90 vs 0.60) →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/11/a-jepa-world-model-for-3-dollars-30/</link> <pubDate>Sun, 11 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/11/a-jepa-world-model-for-3-dollars-30/</guid> </item> <item> <title>TurboVLA: a policy that ignored its instruction</title> <description>&lt;h1 id=&#34;turbovla-a-policy-that-ignored-its-instruction&#34;&gt;TurboVLA: a policy that ignored its instruction&lt;a class=&#34;headerlink&#34; href=&#34;#turbovla-a-policy-that-ignored-its-instruction&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know why a policy trained on two bowl tasks did the same motion for both instructions. We traced it to the data, then reran the original authors&amp;#x27; trainer on the same data. Only about 6 % of frames differ between the two tasks, so ignoring the instruction still fits the rest.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;TurboVLA task swap, degrees of pan: ours (path A) 0.020°; LIBERO control 5.525°; bar 5°&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;TurboVLA task swap, degrees of pan: ours (path A) 0.020°; LIBERO control 5.525°; bar 5°&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;1.5&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;ours (path A)&lt;/text&gt;&lt;text x=&#34;122.6&#34; y=&#34;40&#34;&gt;0.020°&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;161.5&#34; height=&#34;14&#34; fill=&#34;none&#34; stroke=&#34;currentColor&#34; stroke-width=&#34;1.5&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;LIBERO control&lt;/text&gt;&lt;text x=&#34;283.5&#34; y=&#34;66&#34;&gt;5.525°&lt;/text&gt;&lt;line x1=&#34;264.2&#34; y1=&#34;20&#34; x2=&#34;264.2&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;264.2&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 5°&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Record data where the instruction changes what the arm does, not only the words. Trim idle starts, or the policy learns to stay still. A copycat policy looks fine on one task and fails the swap test. The plugin stays on PyPI as a working policy.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;The first conclusion, about the model, was wrong: the paper&amp;#x27;s own trainer on this data also ignores the instruction. Task swap 0.020° here against 0.105 on LIBERO-Goal. The data finding is the result; rollouts were 0/3 on the last variant.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 10 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-correction&#34;&gt;correction&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; The policy ignored its instruction on the two-task bowls data (0/3 on the last port); the claim that our port caused it was withdrawn on 2026-10-23. · &lt;strong&gt;n:&lt;/strong&gt; 3 arm trials on the last port; 25 val episodes&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; Only two tasks; the instruction is redundant on 94 % of frames.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai). The port-era trainings behind this post: cost not recorded; the later path-A rerun: ~$2.8 incl. ~$0.8 of failed starts. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-turbovla&#34;&gt;2026-10-23-paper-vs-hardware-turbovla&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-08 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-23 (port claim withdrawn)&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;Ten days of work, several variants, a published PyPI package, and a closed project. TurboVLA fine-tuned on the two-task bowls data learned to perform whichever task it had seen last, whatever the instruction said. The failure taught me two things about data that the later datasets were built around.&lt;/p&gt; &lt;div class=&#34;admonition warning&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Corrected 2026-10-23&lt;/p&gt; &lt;p&gt;The conclusion below about the &lt;em&gt;model&lt;/em&gt; was wrong. My port differed from the paper in four places, and the paper&#39;s own trainer, run on the same data with the paper&#39;s initialisation, also ignores the instruction (task swap 0.020° vs 0.105 for the same model on LIBERO-Goal). The data finding (fact 7) is the whole story. Full account: &lt;a href=&#34;../../23/paper-vs-hardware-turbovla/&#34;&gt;TurboVLA&lt;/a&gt;.&lt;/p&gt; &lt;/div&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;what-happened&#34;&gt;What happened&lt;a class=&#34;headerlink&#34; href=&#34;#what-happened&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;Checkpoint conversion from the LIBERO warm start worked (verified 2026-09-08).&lt;/li&gt; &lt;li&gt;Trained on bowls, it rolled out at 0/3 on the last variant. On inspection it did the same motion for &#34;blue in pink&#34; and &#34;pink in blue&#34;: a copycat.&lt;/li&gt; &lt;li&gt;An upstream-port spec was written for the maintainers, and the honest estimate was about one chance in three of passing a 50-episode benchmark. I stopped.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;why&#34;&gt;Why&lt;a class=&#34;headerlink&#34; href=&#34;#why&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ol&gt; &lt;li&gt;&lt;strong&gt;Instruction-dependent behaviour needs data where the instruction matters.&lt;/strong&gt; In the bowls set, the frames where the two tasks differ (which bowl to grasp first) are about 6 % of all frames. The rest is identical reach, lift, place. A policy can fit 94 % of the data while ignoring the instruction entirely.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Idle frames teach freezing.&lt;/strong&gt; The earlier recordings started with the arm at rest for a second or two. TurboVLA learned &#34;stay&#34; as a valid action. Every dataset since has its idle starts trimmed with the same script.&lt;/li&gt; &lt;/ol&gt; &lt;h2 id=&#34;what-survived&#34;&gt;What survived&lt;a class=&#34;headerlink&#34; href=&#34;#what-survived&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;code&gt;lerobot-policy-turbovla-so101&lt;/code&gt; stays on PyPI as a working plugin policy; the bowls dataset was re-cut; the two lessons went into the recording guide. Not every project needs to end in a merge to be worth the time.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai). The port-era trainings behind this post: cost not recorded; the later path-A rerun: ~$2.8 incl. ~$0.8 of failed starts.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-turbovla&#34;&gt;2026-10-23-paper-vs-hardware-turbovla&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 10 of 14.&lt;/strong&gt; &lt;a href=&#34;../../13/the-world-model-loses-to-the-commanded-joints/&#34;&gt;← Evaluation and judges 9: World-model planning on an SO-101: the commanded joints win (0.90 vs 0.60)&lt;/a&gt; · &lt;a href=&#34;../vla-jepa-for-10-dollars-and-why-reranking-is-a-no-go/&#34;&gt;Evaluation and judges 11: VLA-JEPA on the Orin for $9.7, and why best-of-N reranking is a no-go →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/08/turbovla-a-policy-that-ignored-its-instruction/</link> <pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/08/turbovla-a-policy-that-ignored-its-instruction/</guid> </item> <item> <title>VLA-JEPA on the Orin for $9.7, and why best-of-N reranking is a no-go</title> <description>&lt;h1 id=&#34;vla-jepa-on-the-orin-for-97-and-why-best-of-n-reranking-is-a-no-go&#34;&gt;VLA-JEPA on the Orin for $9.7, and why best-of-N reranking is a no-go&lt;a class=&#34;headerlink&#34; href=&#34;#vla-jepa-on-the-orin-for-97-and-why-best-of-n-reranking-is-a-no-go&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if picking the best of several planned motions could improve a robot policy. We sampled 8 motion chunks per step and measured how much they differed and what they cost. They barely differed, took 1.84× the time, and their plain average captured 45 % of the possible gain.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 98&#34; role=&#34;img&#34; aria-label=&#34;Time per chunk, relative to 1 sample (lower is better): 1 sample 1.00×; 8 samples 1.84×; bar 1.5×&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;Time per chunk, relative to 1 sample (lower is better): 1 sample 1.00×; 8 samples 1.84×; bar 1.5×&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;86.4&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;1 sample&lt;/text&gt;&lt;text x=&#34;208.4&#34; y=&#34;40&#34;&gt;1.00×&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;159.0&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;8 samples&lt;/text&gt;&lt;text x=&#34;281.0&#34; y=&#34;66&#34;&gt;1.84×&lt;/text&gt;&lt;line x1=&#34;247.5&#34; y1=&#34;20&#34; x2=&#34;247.5&#34; y2=&#34;82&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;247.5&#34; y=&#34;94&#34; text-anchor=&#34;middle&#34;&gt;bar 1.5×&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Do not add best-of-N reranking to this policy on this task. Its samples share the same bias, so a reranker cannot fix it. Averaging the samples is the free competitor. Baseline success was already 90 %, above the bar where reranking could pay.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Bars were fixed before: oracle-to-mean error ≤ 0.7, 8-sample latency ≤ 1.5×, baseline below 85 %. All three failed: 0.76 (null 0.92), 1.84×, 90 %. The policy scored 9/10 at 355 ms per chunk after a $9.7 fine-tune.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Evaluation and judges · 11 of 14&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-engineering&#34;&gt;engineering&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; VLA-JEPA fine-tuned for ~$9.7 scores 9/10 on the arm; best-of-8 reranking is a no-go (0.76, 1.84×). · &lt;strong&gt;n:&lt;/strong&gt; 10 trials; H0 on the teleop val split&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; The paper&#39;s robustness claim is not tested.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: yes (vast.ai): ~$9.7 for the fine-tune (retries not itemised). H0 and the arm gate on the Orin NX: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-vla-jepa&#34;&gt;2026-10-23-paper-vs-hardware-vla-jepa&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-08 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-08&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;The first world-model idea was the obvious one: let the policy propose several action chunks, let a latent world model imagine each one, keep the best. Before building any of it, I checked whether the premise held. It did not.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;vla-jepa-on-the-arm&#34;&gt;VLA-JEPA on the arm&lt;a class=&#34;headerlink&#34; href=&#34;#vla-jepa-on-the-arm&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Fine-tuned on vast.ai for about $9.7 (over the $3.5–4.7 estimate: interruptible bids cost more than they save on long runs). On the Orin NX, world model off at inference: &lt;strong&gt;9/10 on bowls, 355 ms per chunk&lt;/strong&gt;. Same score as SmolVLA at three times the training cost. The task is at its ceiling and cannot tell them apart; that comparison waits for a harder primitive.&lt;/p&gt; &lt;h2 id=&#34;h0-do-the-samples-vary-enough-to-pick-from&#34;&gt;H0: do the samples vary enough to pick from?&lt;a class=&#34;headerlink&#34; href=&#34;#h0-do-the-samples-vary-enough-to-pick-from&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Pre-registered bars: oracle-to-mean error ratio ≤ 0.7, latency for 8 samples ≤ 1.5× one sample, baseline success below 85 %.&lt;/p&gt; &lt;ul&gt; &lt;li&gt;The 8 samples are bundled: 1.08° spread, oracle/mean ratio 0.76 (null 0.92).&lt;/li&gt; &lt;li&gt;Latency 1.84× (643 vs 349 ms).&lt;/li&gt; &lt;li&gt;Baseline success 90 %, already above the bar where reranking could pay.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;Averaging the 8 chunks, with no model at all, captures 45 % of the oracle gain.&lt;/strong&gt;&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Verdict: no-go. A reranker cannot fix a bias the samples share, and the cheapest competitor (the mean) takes half the available gain for free.&lt;/p&gt; &lt;h2 id=&#34;what-changed&#34;&gt;What changed&lt;a class=&#34;headerlink&#34; href=&#34;#what-changed&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Reranking left the architecture the same day. The question became whether a world model can &lt;em&gt;see&lt;/em&gt; a failure, not whether it can &lt;em&gt;choose&lt;/em&gt; an action. That turned out to be a much better question, with a much longer answer.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: yes (vast.ai): ~$9.7 for the fine-tune (retries not itemised). H0 and the arm gate on the Orin NX: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-vla-jepa&#34;&gt;2026-10-23-paper-vs-hardware-vla-jepa&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Evaluation and judges, 11 of 14.&lt;/strong&gt; &lt;a href=&#34;../turbovla-a-policy-that-ignored-its-instruction/&#34;&gt;← Evaluation and judges 10: TurboVLA: a policy that ignored its instruction&lt;/a&gt; · &lt;a href=&#34;../../26/audit-your-labels-where-they-matter/&#34;&gt;Evaluation and judges 12: Audit your labels where they matter: a VLM labeller that is right on average →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/08/vla-jepa-for-10-dollars-and-why-reranking-is-a-no-go/</link> <pubDate>Thu, 08 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/08/vla-jepa-for-10-dollars-and-why-reranking-is-a-no-go/</guid> </item> <item> <title>Twelve VLAs on a Jetson Orin NX: latency and memory with vla.cpp</title> <description>&lt;h1 id=&#34;twelve-vlas-on-a-jetson-orin-nx-latency-and-memory-with-vlacpp&#34;&gt;Twelve VLAs on a Jetson Orin NX: latency and memory with vla.cpp&lt;a class=&#34;headerlink&#34; href=&#34;#twelve-vlas-on-a-jetson-orin-nx-latency-and-memory-with-vlacpp&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know how fast twelve robot policies run on the Jetson board most hobby arms use. We ran the engine&amp;#x27;s own benchmark template on each, one evening, with every model file checked. SmolVLA took 411.2 ms per inference at the defaults; the fastest model took 27.4 ms.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;On an Orin NX 16 GB, expect latencies between the Nano Super and the AGX Orin. Engine numbers use fixed inputs; the full client on the arm saw 238–390 ms for SmolVLA. OpenVLA-OFT does not fit in memory. The board did not throttle during the sweep.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Twelve of thirteen models, 20 repetitions after 3 warm-ups, best of 3 processes, MAXN_SUPER power. Peak memory from getrusage misses the graphics buffers on this release, so the memory columns were dropped upstream. Latency only: no task success here.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Engineering on the Orin · 4 of 8&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-engineering&#34;&gt;engineering&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; Minimum ms per inference for twelve VLAs on an Orin NX, from Octo 27.4 to Evo-1 893.2. · &lt;strong&gt;n:&lt;/strong&gt; 20 repetitions, best of 3 processes per model&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; Engine latency on fixed inputs, not the robot loop.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX only). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-06-twelve-vlas-orin&#34;&gt;2026-10-06-twelve-vlas-orin&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-06 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-06&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;vla.cpp (the llama.cpp-style engine for vision-language-action models) had benchmark reports for the Orin Nano Super and the AGX Orin, and nothing in between. The Orin NX 16 GB is the board most hobby arms end up on. This report fills the gap and is merged upstream as vla.cpp &lt;code&gt;#36&lt;/code&gt;.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;protocol&#34;&gt;Protocol&lt;a class=&#34;headerlink&#34; href=&#34;#protocol&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The project&#39;s own template: 3 warm-ups, 20 repetitions, best of 3 processes, a flag screen, then a full re-run of the fastest flag set. JetPack 6.2, CUDA 12.6, &lt;code&gt;MAXN_SUPER&lt;/code&gt;, built on the board with &lt;code&gt;-DGGML_CUDA=ON -DCMAKE_CUDA_ARCHITECTURES=87&lt;/code&gt;. Twelve of thirteen models; OpenVLA-OFT does not fit in memory. Every GGUF&#39;s sha256 checked against the Hub. One evening, 18:10 to 20:57, no errors.&lt;/p&gt; &lt;h2 id=&#34;headline-minimum-ms-per-inference-at-the-defaults&#34;&gt;Headline, minimum ms per inference at the defaults&lt;a class=&#34;headerlink&#34; href=&#34;#headline-minimum-ms-per-inference-at-the-defaults&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;&lt;/th&gt; &lt;th style=&#34;text-align: right;&#34;&gt;Octo&lt;/th&gt; &lt;th style=&#34;text-align: right;&#34;&gt;TurboVLA&lt;/th&gt; &lt;th style=&#34;text-align: right;&#34;&gt;VLA-JEPA&lt;/th&gt; &lt;th style=&#34;text-align: right;&#34;&gt;GR00T N1.7&lt;/th&gt; &lt;th style=&#34;text-align: right;&#34;&gt;BitVLA&lt;/th&gt; &lt;th style=&#34;text-align: right;&#34;&gt;SmolVLA&lt;/th&gt; &lt;th style=&#34;text-align: right;&#34;&gt;π0&lt;/th&gt; &lt;th style=&#34;text-align: right;&#34;&gt;Evo-1&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;Orin Nano Super&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;31.9&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;89.3&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;193.9&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;271.7&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;335.0&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;462.8&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;845.2&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;1011.5&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Orin NX 16 GB&lt;/strong&gt;&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;&lt;strong&gt;27.4&lt;/strong&gt;&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;&lt;strong&gt;79.7&lt;/strong&gt;&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;&lt;strong&gt;176.7&lt;/strong&gt;&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;&lt;strong&gt;251.4&lt;/strong&gt;&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;&lt;strong&gt;269.1&lt;/strong&gt;&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;&lt;strong&gt;411.2&lt;/strong&gt;&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;&lt;strong&gt;739.6&lt;/strong&gt;&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;&lt;strong&gt;893.2&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;AGX Orin&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;17.5&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;36.0&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;94.6&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;132.7&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;133.0&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;218.3&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;350.3&lt;/td&gt; &lt;td style=&#34;text-align: right;&#34;&gt;434.6&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Every model lands between the two existing boards, as it should. The fastest flags match the Nano report except GR00T N1.6, where &lt;code&gt;--weight-dtype f16&lt;/code&gt; passes the 3 % rule on this board.&lt;/p&gt; &lt;h2 id=&#34;two-things-worth-knowing&#34;&gt;Two things worth knowing&lt;a class=&#34;headerlink&#34; href=&#34;#two-things-worth-knowing&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;On this L4T release, &lt;code&gt;getrusage&lt;/code&gt; peak RSS does not include CUDA buffers (π0 reports 483 MiB here against 5 961 MiB on the Nano). I kept the template column as measured and added a whole-board &lt;code&gt;tegrastats&lt;/code&gt; column with the idle baseline; the maintainer chose to drop the memory columns.&lt;/li&gt; &lt;li&gt;Throttling check: GPU clock stayed at 1 162–1 172 MHz, junction temperature ≤ 83 °C under the full sweep, so the numbers are not thermally capped.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;why-it-matters-here&#34;&gt;Why it matters here&lt;a class=&#34;headerlink&#34; href=&#34;#why-it-matters-here&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;These are engine latencies on fixed inputs. The same board running SmolVLA on a real SO-101 through the full client measured 238–390 ms per chunk, which is the number the control loop actually sees. Both numbers are on the issue tracker (&lt;code&gt;#31&lt;/code&gt;) so the next person with this board does not have to guess.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX only). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-06-twelve-vlas-orin&#34;&gt;2026-10-06-twelve-vlas-orin&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Engineering on the Orin, 4 of 8.&lt;/strong&gt; &lt;a href=&#34;../../01/smolvla-4x-faster-on-jetson-with-vlacpp/&#34;&gt;← Engineering on the Orin 3: SmolVLA on a Jetson Orin NX: 974 → 238 ms per chunk with vla.cpp&lt;/a&gt; · &lt;a href=&#34;../../12/porting-act-to-vlacpp/&#34;&gt;Engineering on the Orin 5: Porting ACT to vla.cpp, so a Jetson can run it without PyTorch →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/06/benchmarking-twelve-vlas-on-an-orin-nx/</link> <pubDate>Tue, 06 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/06/benchmarking-twelve-vlas-on-an-orin-nx/</guid> </item> <item> <title>SmolVLA on a Jetson Orin NX: 974 → 238 ms per chunk with vla.cpp</title> <description>&lt;h1 id=&#34;smolvla-on-a-jetson-orin-nx-974-238-ms-per-chunk-with-vlacpp&#34;&gt;SmolVLA on a Jetson Orin NX: 974 → 238 ms per chunk with vla.cpp&lt;a class=&#34;headerlink&#34; href=&#34;#smolvla-on-a-jetson-orin-nx-974-238-ms-per-chunk-with-vlacpp&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if SmolVLA could run fast enough on the Jetson to stop stuttering. We served the same trained policy through a lighter engine, vla.cpp, and ran 10 trials per engine. One motion chunk took 238 ms instead of 974 ms, and 8 or 9 of 10 trials succeeded.&lt;/p&gt; &lt;figure class=&#34;post-fig plain-fig&#34;&gt;&lt;svg xmlns=&#34;http://www.w3.org/2000/svg&#34; viewBox=&#34;0 0 360 124&#34; role=&#34;img&#34; aria-label=&#34;SmolVLA chunk inference on the Orin NX, ms: PyTorch 974 ms; vla.cpp 390 ms; vla.cpp + FA 238 ms; async budget 667 ms&#34; font-family=&#34;system-ui, sans-serif&#34; font-size=&#34;12&#34; fill=&#34;currentColor&#34; class=&#34;card-fig&#34;&gt;&lt;title&gt;SmolVLA chunk inference on the Orin NX, ms: PyTorch 974 ms; vla.cpp 390 ms; vla.cpp + FA 238 ms; async budget 667 ms&lt;/title&gt;&lt;rect x=&#34;118&#34; y=&#34;29&#34; width=&#34;168.2&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;40&#34; text-anchor=&#34;end&#34;&gt;PyTorch&lt;/text&gt;&lt;text x=&#34;290.2&#34; y=&#34;40&#34;&gt;974 ms&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;55&#34; width=&#34;67.4&#34; height=&#34;14&#34; fill=&#34;currentColor&#34; fill-opacity=&#34;0.35&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;66&#34; text-anchor=&#34;end&#34;&gt;vla.cpp&lt;/text&gt;&lt;text x=&#34;189.4&#34; y=&#34;66&#34;&gt;390 ms&lt;/text&gt;&lt;rect x=&#34;118&#34; y=&#34;81&#34; width=&#34;41.1&#34; height=&#34;14&#34; fill=&#34;currentColor&#34;/&gt;&lt;text x=&#34;112&#34; y=&#34;92&#34; text-anchor=&#34;end&#34;&gt;vla.cpp + FA&lt;/text&gt;&lt;text x=&#34;163.1&#34; y=&#34;92&#34;&gt;238 ms&lt;/text&gt;&lt;line x1=&#34;233.2&#34; y1=&#34;20&#34; x2=&#34;233.2&#34; y2=&#34;108&#34; stroke=&#34;currentColor&#34; stroke-dasharray=&#34;4 3&#34; stroke-width=&#34;1.2&#34;/&gt;&lt;text x=&#34;233.2&#34; y=&#34;120&#34; text-anchor=&#34;middle&#34;&gt;async budget 667 ms&lt;/text&gt;&lt;/svg&gt;&lt;/figure&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Serve SmolVLA through vla.cpp on a Jetson: the engine is the lever, not the model. Flash attention took a chunk from 390 to 238 ms. Its 8/10 against 9/10 is one trial, too few to call a regression. Inference now blocks the control loop 14 % of the time.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Ten trials per engine on one bowls task; success differences are within noise at that n. Times are per action chunk on the Orin NX, same checkpoint. The training cost of the checkpoint was not recorded.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Engineering on the Orin · 3 of 8&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-engineering&#34;&gt;engineering&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; SmolVLA 974 → 238 ms per chunk on the Orin NX with vla.cpp; 9/10 and 8/10 on the arm. · &lt;strong&gt;n:&lt;/strong&gt; 10 trials per engine&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; Success differences are within noise at n = 10.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX, 20 trials on the arm). Cost: $0; SmolVLA training cost not recorded. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-smolvla&#34;&gt;2026-10-23-paper-vs-hardware-smolvla&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-10-01 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-01 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#jetson-latency&#34;&gt;I need lower latency on a Jetson →&lt;/a&gt;, &lt;a href=&#34;../../../../../findings/#smolvla-vlacpp&#34;&gt;SmolVLA chunk inference on the Orin →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;974 ms per chunk made SmolVLA stutter on the Orin NX. Serving the same checkpoint through vla.cpp brought it to 238 ms with no loss in task success.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;numbers-same-bowls-task-10-trials&#34;&gt;Numbers, same bowls task, 10 trials&lt;a class=&#34;headerlink&#34; href=&#34;#numbers-same-bowls-task-10-trials&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;Engine&lt;/th&gt; &lt;th&gt;Success&lt;/th&gt; &lt;th&gt;Chunk inference&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;SmolVLA, PyTorch&lt;/td&gt; &lt;td&gt;9/10&lt;/td&gt; &lt;td&gt;974 ms&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;SmolVLA, vla.cpp&lt;/td&gt; &lt;td&gt;9/10&lt;/td&gt; &lt;td&gt;390 ms&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;SmolVLA, vla.cpp + flash attention&lt;/td&gt; &lt;td&gt;8/10&lt;/td&gt; &lt;td&gt;238 ms&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;The 8/10 on the flash-attention build is one failed trial out of ten; the gate is too small to say whether that is a regression or noise. Inference went from blocking the control loop most of the time to 14 % of the time at the 26.6 Hz tick.&lt;/p&gt; &lt;h2 id=&#34;what-it-took&#34;&gt;What it took&lt;a class=&#34;headerlink&#34; href=&#34;#what-it-took&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;A cppzmq workaround for Ubuntu 22.04 / JetPack 6, now documented upstream (vla.cpp &lt;code&gt;#47&lt;/code&gt;).&lt;/li&gt; &lt;li&gt;Real SO-101 latency numbers posted on the project&#39;s benchmark issue (&lt;code&gt;#31&lt;/code&gt;), which were the first on this hardware.&lt;/li&gt; &lt;li&gt;An &lt;code&gt;--arch act&lt;/code&gt; client preset so the same client drives ACT and SmolVLA.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;why-it-matters&#34;&gt;Why it matters&lt;a class=&#34;headerlink&#34; href=&#34;#why-it-matters&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;On GPU-poor hardware the engine is the lever, not the model. Everything that follows runs the policy through vla.cpp, and two weeks later the same engine is where the chunk-boundary fix lands at a cost of 0.4 ms.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX, 20 trials on the arm). Cost: $0; SmolVLA training cost not recorded.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-10-23-paper-vs-hardware-smolvla&#34;&gt;2026-10-23-paper-vs-hardware-smolvla&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Engineering on the Orin, 3 of 8.&lt;/strong&gt; &lt;a href=&#34;../../../09/29/three-policies-on-a-300-dollar-arm/&#34;&gt;← Engineering on the Orin 2: ACT and SmolVLA on an SO-101: a 10-trial evaluation harness on a €350 arm kit&lt;/a&gt; · &lt;a href=&#34;../../06/benchmarking-twelve-vlas-on-an-orin-nx/&#34;&gt;Engineering on the Orin 4: Twelve VLAs on a Jetson Orin NX: latency and memory with vla.cpp →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/10/01/smolvla-4x-faster-on-jetson-with-vlacpp/</link> <pubDate>Thu, 01 Oct 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/10/01/smolvla-4x-faster-on-jetson-with-vlacpp/</guid> </item> <item> <title>ACT and SmolVLA on an SO-101: a 10-trial evaluation harness on a €350 arm kit</title> <description>&lt;h1 id=&#34;act-and-smolvla-on-an-so-101-a-10-trial-evaluation-harness-on-a-350-arm-kit&#34;&gt;ACT and SmolVLA on an SO-101: a 10-trial evaluation harness on a €350 arm kit&lt;a class=&#34;headerlink&#34; href=&#34;#act-and-smolvla-on-an-so-101-a-10-trial-evaluation-harness-on-a-350-arm-kit&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know if a learned policy could run reliably on our arm, measured the same way each time. We built a harness that runs fixed trials and logs every motion, then tested two policies. Both worked, 9/10 or better, but one took 974 ms per motion chunk on the Jetson.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Build the evaluation harness before chasing a better model. Freeze the pass bar before each run. Ten operator-judged trials are fine; a hundred need an automatic judge. At 974 ms per chunk the arm pauses at every chunk boundary.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;Ten trials per policy and machine on one bowls task, judged by the operator at the end of each trial. The tasks are blue bowl in pink and the reverse, from 182 teleop demos. Checkpoint training cost was not recorded.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Engineering on the Orin · 2 of 8&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-engineering&#34;&gt;engineering&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; ACT 10/10 (M1) and 9/10 (Orin NX), SmolVLA 9/10 on both; SmolVLA takes 974 ms per chunk on the Orin. · &lt;strong&gt;n:&lt;/strong&gt; 10 trials per policy and machine&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; The task is at ceiling for every policy; success is operator-judged.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: none for the gates (Orin NX, M1 Mac, 40 trials of 25 s on the arm). Checkpoint training: cost not recorded. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-09-29-three-policies-so101&#34;&gt;2026-09-29-three-policies-so101&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-09-29 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-10-27 · &lt;strong&gt;Findings:&lt;/strong&gt; &lt;a href=&#34;../../../../../findings/#m-execution-gap&#34;&gt;The $200 arm executes what it is told →&lt;/a&gt;&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;div class=&#34;admonition note&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Correction, 2026-10-29&lt;/p&gt; &lt;p&gt;This post first said &#34;$300 arm&#34;, then (2026-10-27) &#34;$230 arm&#34;, the list price of the follower and leader. What I actually paid: €350 for the SO-101 pack (follower, leader and the wrist camera). The title now says €350 arm kit and the URL is unchanged. Every part with its price source is on the &lt;a href=&#34;../../../../../rig/&#34;&gt;rig page&lt;/a&gt;.&lt;/p&gt; &lt;/div&gt; &lt;p&gt;Before any research question, the arm had to run a learned policy reliably and I had to be able to measure it the same way every time. This post is the baseline everything else is compared against.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;setup&#34;&gt;Setup&lt;a class=&#34;headerlink&#34; href=&#34;#setup&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;SO-101 follower arm (6 DoF, STS3215 servos), SO-101 leader for teleop, Logitech C920 top camera, a wrist camera.&lt;/li&gt; &lt;li&gt;Jetson Orin NX 16 GB as the robot computer, headless, in a Docker image I published (the Dockerfile is merged upstream in LeRobot, &lt;code&gt;#4599&lt;/code&gt;).&lt;/li&gt; &lt;li&gt;A MacBook M1 for a second machine, and vast.ai for anything that needs a real GPU.&lt;/li&gt; &lt;li&gt;Task: &#34;put the blue bowl in the pink bowl&#34;, and the reverse. 182 teleop episodes, idle starts trimmed, public on the Hub as &lt;code&gt;ravediamond/so101_bowls_all_trimmed&lt;/code&gt;.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;the-harness&#34;&gt;The harness&lt;a class=&#34;headerlink&#34; href=&#34;#the-harness&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;&lt;code&gt;monitor_rollout.py&lt;/code&gt; runs a fixed number of trials, logs a tick file per trial (joint commands, chunk latency, timestamps), records video from both cameras, and takes one key press from the operator at the end of each trial: success or failure. Every trial since this day sits in one catalogue, 85 of them with video by mid-October. The rule that mattered later: freeze the pass bar before the run.&lt;/p&gt; &lt;h2 id=&#34;results-10-trials-each&#34;&gt;Results, 10 trials each&lt;a class=&#34;headerlink&#34; href=&#34;#results-10-trials-each&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;table&gt; &lt;thead&gt; &lt;tr&gt; &lt;th&gt;Policy&lt;/th&gt; &lt;th&gt;Machine&lt;/th&gt; &lt;th&gt;Success&lt;/th&gt; &lt;th&gt;Chunk inference&lt;/th&gt; &lt;/tr&gt; &lt;/thead&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td&gt;ACT&lt;/td&gt; &lt;td&gt;M1 Mac&lt;/td&gt; &lt;td&gt;10/10&lt;/td&gt; &lt;td&gt;–&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;SmolVLA 450M (PyTorch)&lt;/td&gt; &lt;td&gt;M1 Mac&lt;/td&gt; &lt;td&gt;9/10&lt;/td&gt; &lt;td&gt;–&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;ACT&lt;/td&gt; &lt;td&gt;Orin NX&lt;/td&gt; &lt;td&gt;9/10&lt;/td&gt; &lt;td&gt;59 ms&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;SmolVLA 450M (PyTorch)&lt;/td&gt; &lt;td&gt;Orin NX&lt;/td&gt; &lt;td&gt;9/10&lt;/td&gt; &lt;td&gt;974 ms&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt; &lt;p&gt;Both policies work. SmolVLA at 974 ms per 50-action chunk is a problem on the Orin: the arm visibly pauses at every chunk boundary. That number is the reason the next post exists.&lt;/p&gt; &lt;h2 id=&#34;what-i-learned&#34;&gt;What I learned&lt;a class=&#34;headerlink&#34; href=&#34;#what-i-learned&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The first thing a hobby setup needs is not a better model, it is a harness that produces the same number twice. Operator judgment is fine for 10 trials; it will not be fine for 100, which is a judging problem I only understood two weeks later.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: none for the gates (Orin NX, M1 Mac, 40 trials of 25 s on the arm). Checkpoint training: cost not recorded.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-09-29-three-policies-so101&#34;&gt;2026-09-29-three-policies-so101&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Engineering on the Orin, 2 of 8.&lt;/strong&gt; &lt;a href=&#34;../../09/lerobot-on-jetson-no-pip-install-torch/&#34;&gt;← Engineering on the Orin 1: LeRobot on a Jetson: why there is no pip install torch, and what it took&lt;/a&gt; · &lt;a href=&#34;../../../10/01/smolvla-4x-faster-on-jetson-with-vlacpp/&#34;&gt;Engineering on the Orin 3: SmolVLA on a Jetson Orin NX: 974 → 238 ms per chunk with vla.cpp →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/09/29/three-policies-on-a-300-dollar-arm/</link> <pubDate>Tue, 29 Sep 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/09/29/three-policies-on-a-300-dollar-arm/</guid> </item> <item> <title>LeRobot on a Jetson: why there is no pip install torch, and what it took</title> <description>&lt;h1 id=&#34;lerobot-on-a-jetson-why-there-is-no-pip-install-torch-and-what-it-took&#34;&gt;LeRobot on a Jetson: why there is no &lt;code&gt;pip install torch&lt;/code&gt;, and what it took&lt;a class=&#34;headerlink&#34; href=&#34;#lerobot-on-a-jetson-why-there-is-no-pip-install-torch-and-what-it-took&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h1&gt; &lt;!-- plain:start --&gt; &lt;div class=&#34;plain-layer&#34; markdown=&#34;0&#34;&gt; &lt;p class=&#34;plain-lede&#34;&gt;We wanted to know why LeRobot will not install on a Jetson with one command, and what fixes it. We built the whole software stack from source in a container image, now merged into LeRobot. The full build took 5 h 33 min, and the PyTorch compile alone was 92 % of it.&lt;/p&gt; &lt;div class=&#34;plain-boxes&#34;&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you build robots&lt;/h2&gt;&lt;p&gt;Use the published container image instead of pip on a Jetson. If you build it yourself, plan for about five and a half hours. Turn off NVSHMEM and flash attention explicitly, or the build fails late. Build torchvision from source against the same torch.&lt;/p&gt;&lt;/aside&gt;&lt;aside class=&#34;plain-box&#34;&gt;&lt;h2 class=&#34;plain-box-title&#34;&gt;If you do research&lt;/h2&gt;&lt;p&gt;An install, nothing measured beyond build time, on one 16 GB board. The fix is merged upstream as LeRobot #4599 and published on GHCR. The traps are listed so the next build does not repeat them.&lt;/p&gt;&lt;/aside&gt;&lt;/div&gt; &lt;/div&gt; &lt;!-- plain:end --&gt; &lt;!-- register-box:start --&gt; &lt;div class=&#34;admonition register&#34;&gt; &lt;p class=&#34;admonition-title&#34;&gt;Engineering on the Orin · 1 of 8&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Type:&lt;/strong&gt; &lt;span class=&#34;pill pill-engineering&#34;&gt;engineering&lt;/span&gt; · &lt;strong&gt;Result:&lt;/strong&gt; LeRobot runs on the Orin NX from a container with a JetPack-built torch and a source-built torchcodec. · &lt;strong&gt;n:&lt;/strong&gt; one board&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Not proven:&lt;/strong&gt; One JetPack release.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;Compute:&lt;/strong&gt; External GPU: no (Orin NX only). Cost: $0. · &lt;strong&gt;Reproduce:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-09-09-lerobot-jetson-container&#34;&gt;2026-09-09-lerobot-jetson-container&lt;/a&gt; · &lt;strong&gt;First published:&lt;/strong&gt; 2026-09-09 · &lt;strong&gt;Updated:&lt;/strong&gt; 2026-09-09&lt;/p&gt; &lt;/div&gt; &lt;!-- register-box:end --&gt; &lt;p&gt;&lt;code&gt;pip install lerobot&lt;/code&gt; fails on a Jetson Orin with an error that says almost nothing. The cause: LeRobot needs Python ≥ 3.12 and &lt;code&gt;torchcodec&lt;/code&gt; ≥ 0.11 on aarch64 with CUDA, and no channel (NVIDIA&#39;s redist, the community index) ships a cp312 CUDA torch wheel for Jetson. The fix is a Docker image that builds the stack from source; it is merged upstream as LeRobot &lt;code&gt;#4599&lt;/code&gt; and published on GHCR. This post is about the traps underneath it.&lt;/p&gt; &lt;!-- more --&gt; &lt;h2 id=&#34;why-not-jetson-containers&#34;&gt;Why not jetson-containers&lt;a class=&#34;headerlink&#34; href=&#34;#why-not-jetson-containers&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;The usual answer is &lt;code&gt;dusty-nv/jetson-containers&lt;/code&gt;. Its last human-merged PR was months old and its own issue thread says it is no longer maintained; its &lt;code&gt;lerobot&lt;/code&gt; package lacks &lt;code&gt;torchcodec&lt;/code&gt;, references a renamed extra and a CLI that no longer exists. Depending on it would mean waiting on a lane with zero throughput.&lt;/p&gt; &lt;h2 id=&#34;five-things-built-from-source&#34;&gt;Five things built from source&lt;a class=&#34;headerlink&#34; href=&#34;#five-things-built-from-source&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ol&gt; &lt;li&gt;PyTorch 2.11 for cp312, &lt;code&gt;TORCH_CUDA_ARCH_LIST=8.7&lt;/code&gt;.&lt;/li&gt; &lt;li&gt;torchcodec 0.11 with CUDA, against a local NVDEC ffmpeg.&lt;/li&gt; &lt;li&gt;torchvision 0.26.&lt;/li&gt; &lt;li&gt;FFmpeg with &lt;code&gt;--enable-cuda-nvcc --enable-nvdec --enable-cuvid&lt;/code&gt;.&lt;/li&gt; &lt;li&gt;dav1d, because ffmpeg 8.1 wants a newer one than Ubuntu 22.04 ships.&lt;/li&gt; &lt;/ol&gt; &lt;h2 id=&#34;the-traps&#34;&gt;The traps&lt;a class=&#34;headerlink&#34; href=&#34;#the-traps&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;ul&gt; &lt;li&gt;&lt;strong&gt;PyTorch auto-enables NVSHMEM&lt;/strong&gt; once &lt;code&gt;USE_DISTRIBUTED=1&lt;/code&gt; finds the &lt;code&gt;nvidia-nvshmem&lt;/code&gt; pip package, and the link fails after five hours of compiling. &lt;code&gt;USE_NVSHMEM=0&lt;/code&gt;, explicitly.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;&lt;code&gt;USE_FLASH_ATTENTION=0&lt;/code&gt; is ignored&lt;/strong&gt; if &lt;code&gt;build/CMakeCache.txt&lt;/code&gt; exists from an earlier attempt; the parallel template-heavy kernels then OOM-kill a 16 GB board. Force it with &lt;code&gt;cmake -DUSE_FLASH_ATTENTION=OFF .&lt;/code&gt;.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;&lt;code&gt;USE_DISTRIBUTED=0&lt;/code&gt;, the sensible choice for a single board, crashes &lt;code&gt;lerobot-train&lt;/code&gt;&lt;/strong&gt;: its &lt;code&gt;is_main_process()&lt;/code&gt; calls &lt;code&gt;torch.distributed.is_initialized()&lt;/code&gt; unconditionally, and the stub module has no such method. Build with distributed on and Gloo as the backend.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;The PyPI torchvision installs and imports fine&lt;/strong&gt; against a from-source torch and only fails on the first compiled op: &lt;code&gt;operator torchvision::nms does not exist&lt;/code&gt;. Build it from source, matched.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;ffmpeg&#39;s vendored NVENC code disagrees with the Video Codec SDK headers&lt;/strong&gt; on a struct field. Decode only is needed, so drop NVENC; note that &lt;code&gt;./configure&lt;/code&gt; auto-enables it when headers are present and only &lt;code&gt;--disable-nvenc&lt;/code&gt; is the off switch.&lt;/li&gt; &lt;li&gt;&lt;strong&gt;A dependency&#39;s install script swallows its own failure&lt;/strong&gt; (&lt;code&gt;|| echo FAILED&lt;/code&gt; without &lt;code&gt;exit 1&lt;/code&gt;), so the Docker layer builds and the missing binary surfaces two stages later.&lt;/li&gt; &lt;/ul&gt; &lt;h2 id=&#34;the-number-to-plan-around&#34;&gt;The number to plan around&lt;a class=&#34;headerlink&#34; href=&#34;#the-number-to-plan-around&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Full build: &lt;strong&gt;5 h 33 min&lt;/strong&gt;, of which PyTorch alone is 92 %. Everything else is under 15 minutes.&lt;/p&gt; &lt;h2 id=&#34;result&#34;&gt;Result&lt;a class=&#34;headerlink&#34; href=&#34;#result&#34; title=&#34;Permanent link&#34;&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt; &lt;p&gt;Verified on an Orin NX 16 GB: &lt;code&gt;torch.cuda.is_available()&lt;/code&gt;, a real &lt;code&gt;.cuda()&lt;/code&gt; tensor out of &lt;code&gt;torchcodec&lt;/code&gt;, &lt;code&gt;torch.distributed.is_gloo_available()&lt;/code&gt;, &lt;code&gt;import lerobot&lt;/code&gt;, a SmolVLA import. &lt;code&gt;docker pull ghcr.io/ravediamond/lerobot-jetson:latest&lt;/code&gt;. Source and full build log: &lt;code&gt;ravediamond/lerobot-jetson&lt;/code&gt;. The write-up reached about 49k people on LinkedIn, with a public thumbs-up from LeRobot&#39;s tech lead; it is also the image every Jetson gate on this site runs in.&lt;/p&gt; &lt;hr /&gt; &lt;p&gt;&lt;strong&gt;Compute.&lt;/strong&gt; External GPU: no (Orin NX only). Cost: $0.&lt;br /&gt; &lt;strong&gt;Reproduce this:&lt;/strong&gt; &lt;a href=&#34;https://github.com/ravediamond/paper-vs-hardware/tree/main/posts/2026-09-09-lerobot-jetson-container&#34;&gt;2026-09-09-lerobot-jetson-container&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:start --&gt; &lt;p&gt;&lt;strong&gt;Engineering on the Orin, 1 of 8.&lt;/strong&gt; &lt;a href=&#34;../../29/three-policies-on-a-300-dollar-arm/&#34;&gt;Engineering on the Orin 2: ACT and SmolVLA on an SO-101: a 10-trial evaluation harness on a €350 arm kit →&lt;/a&gt;&lt;/p&gt; &lt;!-- series-nav:end --&gt;</description> <link>https://shissorobotics.com/blog/2026/09/09/lerobot-on-jetson-no-pip-install-torch/</link> <pubDate>Wed, 09 Sep 2026 00:00:00 +0000</pubDate> <source url="https://shissorobotics.com/feed_rss_created.xml">Shisso Robotics</source><guid isPermaLink="true">https://shissorobotics.com/blog/2026/09/09/lerobot-on-jetson-no-pip-install-torch/</guid> </item> </channel> </rss>