<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: HYEONGSEOB JO</title>
    <description>The latest articles on DEV Community by HYEONGSEOB JO (@johyeongseob).</description>
    <link>https://dev.to/johyeongseob</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fthepracticaldev.s3.amazonaws.com%2Fi%2F99mvlsfu5tfj9m7ku25d.png</url>
      <title>DEV Community: HYEONGSEOB JO</title>
      <link>https://dev.to/johyeongseob</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/johyeongseob"/>
    <language>en</language>
    <item>
      <title>My Picnic Robot Memorized the Table, Not My Words</title>
      <dc:creator>HYEONGSEOB JO</dc:creator>
      <pubDate>Sun, 25 Oct 2026 15:27:22 +0000</pubDate>
      <link>https://dev.to/johyeongseob/my-picnic-robot-memorized-the-table-not-my-words-1dd5</link>
      <guid>https://dev.to/johyeongseob/my-picnic-robot-memorized-the-table-not-my-words-1dd5</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week3-2026-10-19"&gt;Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://dev.to/johyeongseob/for-the-price-of-a-coffee-my-picnic-robot-learned-how-i-talk-11n9"&gt;Week 2&lt;/a&gt;, fine-tuning worked: one demo per item, relabeled with the ways people actually ask, taught my open robot model (&lt;a href="https://huggingface.co/lerobot/smolvla_libero" rel="noopener noreferrer"&gt;SmolVLA&lt;/a&gt;) new phrasings (31% to 80%) for the price of a coffee. It still packed one item at a time.&lt;/p&gt;

&lt;p&gt;So this week I pushed the same idea toward the laziest picnic request of all: say one sentence, "grab the cream cheese and the salad dressing", and walk away while the robot puts both in the basket, in that order. If fine-tuning could teach it how I talk, could it teach it a two-item task?&lt;/p&gt;

&lt;p&gt;I built the pieces around the model to make that a single request:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Piece&lt;/th&gt;
&lt;th&gt;What it does&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Request splitter&lt;/td&gt;
&lt;td&gt;"grab the cream cheese and the salad dressing" becomes two steps, in the order named&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Step checker&lt;/td&gt;
&lt;td&gt;The simulator reports when an item is in the basket, and the instruction moves on to the next item&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SmolVLA&lt;/td&gt;
&lt;td&gt;Does one step at a time from two camera images and the arm state&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Scripted demo generator&lt;/td&gt;
&lt;td&gt;Writes training demos from the simulator's object positions, no teleoperation&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;It did not go to plan, and the reasons turned out to be the interesting part.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2q7hpt93twnqajsjdd25.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F2q7hpt93twnqajsjdd25.webp" alt="SmolVLA puts the cream cheese and then the salad dressing in the basket" width="360" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;"Pick up the cream cheese ..." then, once it is in, "pick up the salad dressing ...". Neither item is the one this scene was trained on (bbq sauce). The cream cheese lands at step 95, the dressing at step 371 (20 steps per second).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The honest number: this is 1 success in 80 two-item episodes.&lt;/strong&gt; The rest of this post is why.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 1: the robot memorized the table, not the sentence
&lt;/h2&gt;

&lt;p&gt;Every LIBERO-Object scene has six groceries, but the model only ever learned one task per scene: "pick up {that scene's item} and place it in the basket". It scores 96% on that benchmark. So I asked for each of the six items in each of the ten scenes.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Published SmolVLA&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;The scene's own item&lt;/td&gt;
&lt;td&gt;10/10&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Any other item on the same table&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1/50&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;When it failed on another item, it lifted the scene's own item instead in &lt;strong&gt;24 of 26&lt;/strong&gt; episodes. It was not reading the item name; it was recognizing the table. I am not the first to see this: &lt;a href="https://dev.to/fn8211/vla-or-il-a-controlled-dataset-for-testing-whether-finetuning-turns-your-vla-into-a-fancy-4m6i"&gt;VLA or IL?&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/fn8211"&gt;@fn8211&lt;/a&gt; shows the same with π0.5 and summarizes LIBERO-PRO and LIBERO-Plus, which found that fine-tuned models keep the same trajectory when the instruction changes. This is the same failure in a 450M model, measured on every item of every scene.&lt;/p&gt;

&lt;p&gt;A single sentence for two items ("put both the cream cheese and the butter in the basket") failed 0/3: the cream cheese, that scene's item, went in every time; the butter never did.&lt;/p&gt;

&lt;p&gt;This also explains Week 2. There, every new phrasing still named the scene's own item, so the table alone gave the right answer. Two items in one scene is the first time the item name has to matter.&lt;/p&gt;

&lt;h2&gt;
  
  
  Finding 2: breaking the shortcut is not the same as reading
&lt;/h2&gt;

&lt;p&gt;LIBERO-Object has no demos of "pick the other item", so I generated them. A short script reads the object positions from the simulator, moves the gripper over the asked item, grasps it, and places it in the basket. The training set had single picks of all six items in every scene (8 per item), chains of two to four items, and a few original demos; no teleoperation.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7atzr3knv73f3o9eobrv.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F7atzr3knv73f3o9eobrv.png" alt="Every item in every scene before and after fine-tuning" width="799" height="276"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Published&lt;/th&gt;
&lt;th&gt;Fine-tuned on the scripted demos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Scene's own item&lt;/td&gt;
&lt;td&gt;10/10&lt;/td&gt;
&lt;td&gt;3 to 5 of 10 (3k, 6k, 9k steps)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Other items&lt;/td&gt;
&lt;td&gt;1/50&lt;/td&gt;
&lt;td&gt;3 to 5 of 50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Wrong lifts that were the scene's own item&lt;/td&gt;
&lt;td&gt;24 of 26&lt;/td&gt;
&lt;td&gt;12 of 40 (3k), 16 of 41 (6k)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The fine-tune broke the habit: wrong picks mostly stopped going to the scene's own item. But they did not go to the asked item either. I checked whether a wrong pick at least shared the asked item's kind (box, carton, can, bottle): 6 of 40 and 10 of 41, against 7.6 expected by chance. When it is wrong, the item name plays no role.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Removing a shortcut did not create the skill it was standing in for.&lt;/strong&gt; The model stopped recognizing the table, and nothing took its place.&lt;/p&gt;

&lt;h2&gt;
  
  
  Two items, in order
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Model (same 80 episodes: 40 trained item orders, 2 table layouts)&lt;/th&gt;
&lt;th&gt;Both items, in order&lt;/th&gt;
&lt;th&gt;First item&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Fine-tuned on the first scripted chains (6k)&lt;/td&gt;
&lt;td&gt;3/80&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fine-tuned on the scripted demos above (9k)&lt;/td&gt;
&lt;td&gt;1/80&lt;/td&gt;
&lt;td&gt;15/80&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;With picking the right item at about 10%, two in a row is about 1%. The step checker and splitter work; the bottleneck is grounding one item at a time.&lt;/p&gt;

&lt;h2&gt;
  
  
  The lazy payoff
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Effort&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;What I wanted&lt;/td&gt;
&lt;td&gt;One sentence, then walk away&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What works today&lt;/td&gt;
&lt;td&gt;One sentence, then watch: the robot gets the order right about 1 time in 80&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;What the pipeline saves already&lt;/td&gt;
&lt;td&gt;No teleoperation: 657 training demos written by a script in under an hour on the rented machine's CPUs&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The data side is lazy in the good way. The robot side is not there yet, and I would rather show that than a cherry-picked clip.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://huggingface.co/lerobot/smolvla_libero" rel="noopener noreferrer"&gt;&lt;code&gt;lerobot/smolvla_libero&lt;/code&gt;&lt;/a&gt;, 450M parameters, LeRobot 0.6.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Simulation&lt;/td&gt;
&lt;td&gt;LIBERO-Object on robosuite and MuJoCo&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demos&lt;/td&gt;
&lt;td&gt;Scripted pick-and-place from simulator object poses, human pace, failed attempts discarded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Fine-tuning&lt;/td&gt;
&lt;td&gt;Whole model (vision encoder frozen), batch 32, lr 2.5e-5, 9,000 steps, about 75 minutes&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evaluation&lt;/td&gt;
&lt;td&gt;Every item in every scene (60 episodes), two-item chains (80 episodes), failure kinds from the lift height of every object&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware&lt;/td&gt;
&lt;td&gt;1x A100 80 GB on RunPod&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The request splitter is the smallest part:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;split_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;list&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="n"&gt;text&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;ITEMS&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;SHORT_NAMES&lt;/span&gt;
    &lt;span class="n"&gt;found&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;  &lt;span class="c1"&gt;# (start, end, item)
&lt;/span&gt;    &lt;span class="c1"&gt;# Longest names first, so "cream cheese" is taken before "cheese".
&lt;/span&gt;    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;reverse&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;True&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;finditer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;rf&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;escape&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s"&gt;\b&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="nf"&gt;any&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;end&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                &lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;start&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="k"&gt;match&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;end&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="n"&gt;items&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;_&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nf"&gt;sorted&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;found&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;item&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;items&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;item&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;items&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;p&gt;&lt;code&gt;split_request("grab the cream cheese and the salad dressing")&lt;/code&gt; returns &lt;code&gt;["cream cheese", "salad dressing"]&lt;/code&gt;; each item becomes "pick up the {item} and place it in the basket", the sentence the model was trained on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Limits:&lt;/strong&gt; all numbers are from one training layout per scene (state 46) or two (46 and 47); simulation only; one training run per setting.&lt;/p&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/johyeongseob" rel="noopener noreferrer"&gt;
        johyeongseob
      &lt;/a&gt; / &lt;a href="https://github.com/johyeongseob/hacktoberfest-2026" rel="noopener noreferrer"&gt;
        hacktoberfest-2026
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Hacktoberfest 2026 projects and experiments focused on open-weight AI, VLA, and Physical AI.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Hacktoberfest 2026&lt;/h1&gt;
&lt;/div&gt;

&lt;p&gt;A month-long exploration of open-weight AI, VLA, and Physical AI.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Goals&lt;/h2&gt;
&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Explore open-weight AI models&lt;/li&gt;
&lt;li&gt;Build VLA/Physical AI projects&lt;/li&gt;
&lt;li&gt;Participate in DEV Challenges&lt;/li&gt;
&lt;li&gt;Document experiments and learnings&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Projects&lt;/h2&gt;
&lt;/div&gt;

&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;hacktoberfest-2026/
├── dev-challenge/          # Hacktoberfest DEV Challenge entries
│   ├── weekend-challenge/  # Shared Workbench Reset Assistant (local open-weight VLM)
│   ├── week-1/             # Picnic Packing with SmolVLA (paraphrased instructions in LIBERO)
│   └── week-2/             # Teaching the Picnic Robot My Words (SmolVLA fine-tune on a rented GPU)
├── global-hack-week/       # Global Hack Week: Hacktoberfest challenge write-ups
│   ├── 01-registration.md  # Registration challenges
│   └── github/             # GitHub challenges (Codespaces, repo management, Copilot)
├── devrelay/               # DevRelay usage notes and reviewed agent session transcripts
└── models/                 # Shared local model weights; excluded from Git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h3 class="heading-element"&gt;DEV Challenge entries&lt;/h3&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Folder&lt;/th&gt;

&lt;th&gt;Theme&lt;/th&gt;

&lt;th&gt;Project&lt;/th&gt;

&lt;th&gt;Post&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;&lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/dev-challenge/weekend-challenge/" rel="noopener noreferrer"&gt;weekend-challenge&lt;/a&gt;&lt;/td&gt;

&lt;td&gt;Build for a Friend: solve a real problem for someone you know&lt;/td&gt;

&lt;td&gt;Shared Workbench Reset Assistant: a local open-weight&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;…&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/johyeongseob/hacktoberfest-2026" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/tree/main/dev-challenge/week-3/datagen" rel="noopener noreferrer"&gt;&lt;code&gt;week-3/datagen&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Scripted demo generator and recorder&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/tree/main/dev-challenge/week-3/eval" rel="noopener noreferrer"&gt;&lt;code&gt;week-3/eval&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Step-by-step rollout, request splitter, every-item-in-every-scene test&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/tree/main/dev-challenge/week-3/train" rel="noopener noreferrer"&gt;&lt;code&gt;week-3/train&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Training-set builder, normalization fix, training script&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Open piece&lt;/th&gt;
&lt;th&gt;What it made possible&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open weights&lt;/td&gt;
&lt;td&gt;I could fine-tune the model and inspect every checkpoint&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open simulator and benchmark&lt;/td&gt;
&lt;td&gt;The simulator knows where every object is, so a script could write demos no one recorded&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open data&lt;/td&gt;
&lt;td&gt;The original LIBERO demos are there to mix back in against forgetting&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open training code&lt;/td&gt;
&lt;td&gt;Reading LeRobot's training loop let me check what fine-tuning changes, down to the normalization statistics&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open discussion&lt;/td&gt;
&lt;td&gt;Others had already measured the same shortcut, so I knew what I was looking at&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;A closed model would have given me a success rate. Open pieces let me find out why the robot fails.&lt;/p&gt;

&lt;h2&gt;
  
  
  What's Next
&lt;/h2&gt;

&lt;p&gt;Grounding is the missing skill, and a detector already has it. Next I want to mark the asked item on the camera image (first with the simulator's own boxes, then with an open-vocabulary detector) and see whether SmolVLA learns to follow the mark.&lt;/p&gt;

&lt;h2&gt;
  
  
  Notes from the Bench
&lt;/h2&gt;

&lt;p&gt;Things I tried along the way that did not make the main story.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. My scripted demos had hidden pauses.&lt;/strong&gt; The script moved the gripper in proportion to the remaining distance, and some targets were out of reach: the fingers stopped against a tall bottle or the basket floor, and the script kept nudging until its step limit. The average pace still matched the human demos (about 146 steps per item), so success rates and episode lengths looked fine.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw1zvqr35j51re5ou9psj.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fw1zvqr35j51re5ou9psj.png" alt="Frame-to-frame motion in a scripted demo before and after the fix" width="800" height="440"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A "steady" version ends a move once the gripper stops getting closer. After retraining on it, "picked up nothing" dropped from 34 to 18 of 60 at 3,000 steps (Fisher's exact test, p ≈ 0.006; the published model: 22). The steady set also had more single picks (about 450 vs 168), so this is the likely cause, not an isolated one. &lt;a class="mentioned-user" href="https://dev.to/ankk98"&gt;@ankk98&lt;/a&gt; saw the same in teleop data: &lt;a href="https://dev.to/ankk98/teleoperation-data-quality-for-imitation-learning-what-actually-breaks-the-model-1abc"&gt;idle footage teaches a policy to linger&lt;/a&gt;. Slow and steady, it turns out, has to be steady.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built this with Claude Code over a week. The session below is a curated slice: the diagnosis, the scripted demos, the hidden pauses, the grounding check, and the one two-item success.&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Claude Code"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Two picnic items in one sentence: a shortcut, hidden pauses, and grounding (curated, translated)&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;[Note: condensed English translation of a Claude Code session held in Korean, October 19-26, 2026. Messages are selected and shortened; wording is translated, not verbatim.]&lt;/p&gt;

&lt;p&gt;Week 3 is Slow and Steady. The laziest picnic request: one sentence, two items, walk away. Can SmolVLA put two LIBERO-Object items in the basket, one after the other? I want the hardest version I can actually finish.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;First, what the published model does today. Two tests in one LIBERO-Object scene: one sentence for both items (LIBERO-10 style), and the item sentences one at a time, switching when the simulator says the first item is in the basket.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-chainrolloutpy"&gt;chain_rollout.py&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;scene 1: 'put both the cream cheese and the butter in the basket', then step ...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;scene 1: 'put both the cream cheese and the butter in the basket', then step by step&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;both modes 0/3: the cream cheese (that scene's item) goes in every time, the butter never&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Is it the butter, or is it the order?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Ask for every item in every scene, one at a time. If the model reads the item name, other items should work about as well as the scene's own.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-runcrossitemssh"&gt;run_cross_items.sh&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;10 scenes x 6 items, one episode each&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;10 scenes x 6 items, one episode each&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;own item 10/10, any other item 1/50&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;And when it fails on another item, it lifts the scene's own item in 24 of 26 episodes. It recognizes the table, not the sentence. LIBERO-Object pairs each scene with exactly one item, so the table alone always gave the right answer.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;There are no demos of picking the other item. Can we make them without teleoperation?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;The simulator knows every object's pose, so a short script can move the gripper over the asked item, grasp it, and place it in the basket. Fixes along the way: aim at the object center (small boxes were missed from 1 cm above), hold the gripper orientation, special settings for tall bottles, and separate spots in the basket so a second item does not land on the first.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-runscriptedallsh"&gt;run_scripted_all.sh&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;every item in every scene, 5 training states each&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;every item in every scene, 5 training states each&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;most items above 90%; ketchup 8 -&amp;gt; 25 of 30 after the tall-bottle settings&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Record chains of two to four items and fine-tune. Plan the item orders so some are only ever used for testing.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;The first fine-tune was worse than the published model. compare_demos.py showed why: the scripted demos took about 300 steps per item, twice the human demos' 146. A faster pace matched the human one, and after retraining: 3 of 80 two-item episodes in order. In the 10 episodes where the second item went in, the model had put the order's second item in first. The bottleneck is choosing the item, not chaining.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Then teach it to choose. Same table, every item.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Added single picks of all six items in every scene, so the table alone no longer gives the answer. Result: other items rose a little (1/50 -&amp;gt; 4-8/50), but the scene's own item fell from 10/10 to 0/10 at the first checkpoint.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Why would it get worse at what it already knew?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;First suspect: lerobot-train replaces the checkpoint's normalization statistics with the new dataset's. The scripted data had an action mean of -0.34 on z instead of -0.09 and a 20x narrower orientation spread.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-usebasestatspy"&gt;use_base_stats.py&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;keep smolvla_libero's mean and std, retrain&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;keep smolvla_libero's mean and std, retrain&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;own item 2/10 at 3k steps either way: not the cause&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Why does the second video stop in the middle?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Measured frame-to-frame change per second: the arm sits nearly still for about five seconds over a tall item and again over the basket. The script moves in proportion to the remaining distance, and some targets are out of reach (fingers against a bottle or the basket floor), so it nudged until its 120-step limit. The average pace still matched the human demos, so success rates and lengths never showed it.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-scriptedpickpypacesteady"&gt;scripted_pick.py --pace steady&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;end a move once the gripper stops getting 1 mm closer for 5 steps&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;end a move once the gripper stops getting 1 mm closer for 5 steps&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;longest pause in 15 samples: 0.2-0.5 s (was 5-6 s)&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Retrain on the steady demos.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Same normalization, steady data. 'Picked up nothing' dropped from 34 to 18 of 60 at 3,000 steps (Fisher p = 0.006), back to the published model's level (22). Caveat: this run also had more single picks, so it is the likely cause, not an isolated one.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;When it picks the wrong item, which item does it pick?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Every rollout now records how high every object on the table was lifted. Wrong lifts that were the scene's own item: 24 of 26 before fine-tuning, 12 of 40 after. The shortcut is broken. But does a wrong pick at least share the asked item's kind (box, carton, can, bottle)? 6 of 40 and 10 of 41, against 7.6 by chance. When it is wrong, the name plays no role.&lt;/p&gt;

                &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Breaking the shortcut did not create grounding.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Today's minimum goal: one real two-item success.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-runchainevalsh"&gt;run_chain_eval.sh&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;steady 9k checkpoint, 40 trained orders x 2 layouts, videos on&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;steady 9k checkpoint, 40 trained orders x 2 layouts, videos on&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;2 items: all in 1/80 (scene 3: cream cheese at step 95, then salad dressing at step 371)&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Neither item is the scene's own (bbq sauce). One honest success, with the instruction switching exactly when the first item landed.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Would mixing the original LIBERO demos back in stop the forgetting?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Co-training: all 457 original LIBERO-Object demos, the steady single picks, and two-item chains only.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-runchainevalsh"&gt;run_chain_eval.sh&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;3k, 6k, 9k checkpoints&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;3k, 6k, 9k checkpoints&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;two items in order 1/80, 3/80, 1/80; own item 2/10 at 3k&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;No gain within the noise. More of the old data did not bring back the old skill, and it did not add grounding.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;The pipeline sat idle for two hours. What happened?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;My bug: the wait loop used pgrep -f to wait until no data-preparation process was running, and its own command line contained that name, so it waited for itself. I had made the same mistake once before with the training process. Restarted the steps directly without the wait.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;What is the contribution this week?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Main story: the model memorized the table (1/50, 24 of 26 wrong lifts to the scene's own item), and breaking that shortcut did not make it read (wrong picks at chance). The two-item pipeline works, and the one success is real. The hidden pauses, the normalization check, and co-training go into a notes section at the end.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Write the post with DevRelay. Start from Week 2: fine-tuning worked there, so try a two-item task here.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Checked the Week 3 rules with get_challenges, searched DEV for related posts (a controlled LIBERO-Object dataset showing the same shortcut with pi0.5, and a teleop data-quality rubric that flags idle footage), staged an unpublished draft with create_article, and kept the Markdown source in the repo. This session is saved with submit_agent_session and embedded at the end of the post.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        28 of 28 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I worked with the agent in Korean. This is a condensed English translation of the key moments, not a verbatim transcript.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I set the goal, ran every training and evaluation command, and reviewed every result. An AI coding agent (Claude Code) wrote the scripts with me, analyzed the results, made the charts, and drafted this post.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>robotics</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>For the Price of a Coffee, My Picnic Robot Learned How I Talk</title>
      <dc:creator>HYEONGSEOB JO</dc:creator>
      <pubDate>Sun, 18 Oct 2026 16:05:17 +0000</pubDate>
      <link>https://dev.to/johyeongseob/for-the-price-of-a-coffee-my-picnic-robot-learned-how-i-talk-11n9</link>
      <guid>https://dev.to/johyeongseob/for-the-price-of-a-coffee-my-picnic-robot-learned-how-i-talk-11n9</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week2-2026-10-12"&gt;Hacktoberfest Open-Source AI Challenge Week 2: Side Hustle&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;In &lt;a href="https://dev.to/johyeongseob/can-i-ask-a-robot-to-pack-my-picnic-in-my-own-words-40f2"&gt;Week 1&lt;/a&gt;, an open robot model (&lt;a href="https://huggingface.co/lerobot/smolvla_libero" rel="noopener noreferrer"&gt;SmolVLA&lt;/a&gt;) packed my picnic only when I used its exact training sentence. This week I fine-tuned it on a few demos, each labeled with the ways people actually ask, and priced the fix.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;For the price of a coffee, the robot learned how I talk.&lt;/strong&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Before&lt;/th&gt;
&lt;th&gt;After 1 demo per item&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Phrasings I taught&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;80%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Phrasings it never saw&lt;/td&gt;
&lt;td&gt;29%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Demos needed&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;4 in total&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU cost&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;about $1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;strong&gt;Who would pay:&lt;/strong&gt; anyone whose robot meets people who did not write its training data.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Customer&lt;/th&gt;
&lt;th&gt;What they say&lt;/th&gt;
&lt;th&gt;What they get&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Café with a kitchen arm&lt;/td&gt;
&lt;td&gt;"grab me the oat milk"&lt;/td&gt;
&lt;td&gt;A model that understands the staff&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Care home&lt;/td&gt;
&lt;td&gt;"could you get my cup?"&lt;/td&gt;
&lt;td&gt;A robot that does not need exact commands&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Robot vendor abroad&lt;/td&gt;
&lt;td&gt;Their customers' dialect&lt;/td&gt;
&lt;td&gt;A fine-tune per market, priced per job&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6xtt3vtftkosagg4u1hf.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6xtt3vtftkosagg4u1hf.webp" alt="Four picnic items before and after fine-tuning with one demo per item" width="560" height="603"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Upper clip of each pair: the published model. Lower clip: after one demo per item, same scene.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Rows&lt;/th&gt;
&lt;th&gt;Request&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Top two&lt;/td&gt;
&lt;td&gt;"pack the {item} for our picnic" (taught)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Bottom two&lt;/td&gt;
&lt;td&gt;"the basket still needs the {item}" (never seen in training)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;

&lt;p&gt;Six fine-tuned models (1 to 40 demos per item) plus the published one, all tested on the same 420 episodes.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhu2p98mlul2aoz7i9g95.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhu2p98mlul2aoz7i9g95.png" alt="Test success against demos per item" width="800" height="503"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Demos per item&lt;/th&gt;
&lt;th&gt;Taught&lt;/th&gt;
&lt;th&gt;Never seen&lt;/th&gt;
&lt;th&gt;Original sentence&lt;/th&gt;
&lt;th&gt;6 untrained items&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0 (published)&lt;/td&gt;
&lt;td&gt;31%&lt;/td&gt;
&lt;td&gt;29%&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;1&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;80%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;78%&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;95%&lt;/td&gt;
&lt;td&gt;60%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;86%&lt;/td&gt;
&lt;td&gt;74%&lt;/td&gt;
&lt;td&gt;90%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;84%&lt;/td&gt;
&lt;td&gt;74%&lt;/td&gt;
&lt;td&gt;88%&lt;/td&gt;
&lt;td&gt;70%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;86%&lt;/td&gt;
&lt;td&gt;77%&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;td&gt;72%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;td&gt;79%&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;td&gt;68%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;40&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;td&gt;78%&lt;/td&gt;
&lt;td&gt;98%&lt;/td&gt;
&lt;td&gt;68%&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;
  
  
  1. One demo per item does most of the work
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F09acd0atw4uzjf0nutyy.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F09acd0atw4uzjf0nutyy.png" alt="Successes out of 40 per phrasing" width="800" height="526"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Phrasing&lt;/th&gt;
&lt;th&gt;0 demos&lt;/th&gt;
&lt;th&gt;1 demo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;A ●&lt;/td&gt;
&lt;td&gt;grab the {item} and put it in the basket&lt;/td&gt;
&lt;td&gt;23/40&lt;/td&gt;
&lt;td&gt;35/40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B ●&lt;/td&gt;
&lt;td&gt;{item} in the basket&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;3/40&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;29/40&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C ●&lt;/td&gt;
&lt;td&gt;pack the {item} for our picnic&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;1/40&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;31/40&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D ●&lt;/td&gt;
&lt;td&gt;could you put the {item} in the picnic basket?&lt;/td&gt;
&lt;td&gt;23/40&lt;/td&gt;
&lt;td&gt;33/40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;E ○&lt;/td&gt;
&lt;td&gt;toss the {item} into the basket&lt;/td&gt;
&lt;td&gt;8/40&lt;/td&gt;
&lt;td&gt;33/40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;F ○&lt;/td&gt;
&lt;td&gt;the basket still needs the {item}&lt;/td&gt;
&lt;td&gt;7/40&lt;/td&gt;
&lt;td&gt;25/40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;G ○&lt;/td&gt;
&lt;td&gt;can you get the {item} into the basket for me?&lt;/td&gt;
&lt;td&gt;18/40&lt;/td&gt;
&lt;td&gt;32/40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;H ○&lt;/td&gt;
&lt;td&gt;move the {item} over to the basket&lt;/td&gt;
&lt;td&gt;13/40&lt;/td&gt;
&lt;td&gt;34/40&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;E to H were frozen before training, under rules that ban the verbs and sentence shapes of A to D.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. The twist: more demos did not help with new words
&lt;/h3&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;1 demo&lt;/th&gt;
&lt;th&gt;40 demos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Taught phrasings&lt;/td&gt;
&lt;td&gt;80%&lt;/td&gt;
&lt;td&gt;92%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Never-seen phrasings&lt;/td&gt;
&lt;td&gt;78%&lt;/td&gt;
&lt;td&gt;78%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Orange juice, never-seen&lt;/td&gt;
&lt;td&gt;36/40&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;23/40&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu8i8y3bscy0bi8frurzv.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fu8i8y3bscy0bi8frurzv.webp" alt="Orange juice with a new phrasing at 1, 10, 20, and 40 demos per item" width="600" height="169"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Same scene, same request. Likely reason: every demo carried the same five sentences, so more demos taught more ways to move, not more ways to be asked. One training run per N and cream cheese went the other way, so this is a strong hint, not a proof (see also &lt;a href="https://dev.to/fn8211/vla-or-il-a-controlled-dataset-for-testing-whether-finetuning-turns-your-vla-into-a-fancy-4m6i"&gt;VLA or IL?&lt;/a&gt; by &lt;a class="mentioned-user" href="https://dev.to/fn8211"&gt;@fn8211&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lesson for the side hustle: collect more phrasings, not more demos.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  3. The fine print: it forgets what it was not taught
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff6zouj6h3tqu8n4hsfum.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff6zouj6h3tqu8n4hsfum.webp" alt="Butter (trained) and ketchup (not trained), before and after fine-tuning" width="720" height="225"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Original sentence&lt;/th&gt;
&lt;th&gt;0 demos&lt;/th&gt;
&lt;th&gt;1 to 40 demos&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;4 trained items&lt;/td&gt;
&lt;td&gt;100%&lt;/td&gt;
&lt;td&gt;88-98%&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6 untrained items&lt;/td&gt;
&lt;td&gt;87%&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;60-72%&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The fine-tune only saw four items, so the model drifted toward them. Ketchup, the first item my robot ever packed in Week 1, still works in 6 to 8 of 10 scenes, but loses this one. Next fix to try: mix in a few demos of every item.&lt;/p&gt;

&lt;h2&gt;
  
  
  What It Costs
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Time&lt;/th&gt;
&lt;th&gt;Money&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;One fine-tune (shared GPU, 3000 steps)&lt;/td&gt;
&lt;td&gt;48 min&lt;/td&gt;
&lt;td&gt;$1.50&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;One fine-tune (GPU alone, 1000 steps, estimated)&lt;/td&gt;
&lt;td&gt;10 min&lt;/td&gt;
&lt;td&gt;$0.30&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Whole experiment (6 models, about 4,400 evaluation episodes)&lt;/td&gt;
&lt;td&gt;6 h&lt;/td&gt;
&lt;td&gt;$11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Buying the GPU instead&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;$10,000+&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Validation stopped improving after step 1000 for 3+ demos per item (training chart below), so a real job can stop early.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Part&lt;/th&gt;
&lt;th&gt;Choice&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Model&lt;/td&gt;
&lt;td&gt;
&lt;a href="https://huggingface.co/lerobot/smolvla_libero" rel="noopener noreferrer"&gt;&lt;code&gt;lerobot/smolvla_libero&lt;/code&gt;&lt;/a&gt;, 450M parameters&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Data&lt;/td&gt;
&lt;td&gt;Public &lt;a href="https://huggingface.co/datasets/lerobot/libero" rel="noopener noreferrer"&gt;&lt;code&gt;lerobot/libero&lt;/code&gt;&lt;/a&gt; demos, first N per item, 4 items&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;The trick&lt;/td&gt;
&lt;td&gt;A wrapper around &lt;code&gt;lerobot-train&lt;/code&gt; relabels each sample with one of 5 sentences at random; no new recordings&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Training&lt;/td&gt;
&lt;td&gt;Whole model, 3000 steps, batch 32, lr 2.5e-5&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Checkpoint choice&lt;/td&gt;
&lt;td&gt;Best of steps 1000/2000/3000 on held-out scenes, taught phrasings only&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Test&lt;/td&gt;
&lt;td&gt;420 episodes per model, LIBERO-Object in MuJoCo, same scenes and seeds for all&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hardware&lt;/td&gt;
&lt;td&gt;1x A100 80 GB on RunPod, training and evaluation side by side in tmux&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbr70z4sl0fjh36xy3wpx.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fbr70z4sl0fjh36xy3wpx.png" alt="Training loss and validation success" width="800" height="320"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Gotcha: the pod showed 256 CPUs but had 16; evaluation threads starved training until I set &lt;code&gt;OMP_NUM_THREADS=1&lt;/code&gt; (&lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/blob/main/dev-challenge/week-2/setup.md" rel="noopener noreferrer"&gt;setup guide&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;Limits: one training run per N; simulation only; phrasing G turned out closer to D than my rules intended.&lt;/p&gt;

&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/johyeongseob" rel="noopener noreferrer"&gt;
        johyeongseob
      &lt;/a&gt; / &lt;a href="https://github.com/johyeongseob/hacktoberfest-2026" rel="noopener noreferrer"&gt;
        hacktoberfest-2026
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Hacktoberfest 2026 projects and experiments focused on open-weight AI, VLA, and Physical AI.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Hacktoberfest 2026&lt;/h1&gt;
&lt;/div&gt;
&lt;p&gt;A month-long exploration of open-weight AI, VLA, and Physical AI.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Goals&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;Explore open-weight AI models&lt;/li&gt;
&lt;li&gt;Build VLA/Physical AI projects&lt;/li&gt;
&lt;li&gt;Participate in DEV Challenges&lt;/li&gt;
&lt;li&gt;Document experiments and learnings&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Projects&lt;/h2&gt;
&lt;/div&gt;
&lt;div class="snippet-clipboard-content notranslate position-relative overflow-auto"&gt;&lt;pre class="notranslate"&gt;&lt;code&gt;hacktoberfest-2026/
├── dev-challenge/          # Hacktoberfest DEV Challenge entries
│   ├── weekend-challenge/  # Shared Workbench Reset Assistant (local open-weight VLM)
│   ├── week-1/             # Picnic Packing with SmolVLA (paraphrased instructions in LIBERO)
│   └── week-2/             # Teaching the Picnic Robot My Words (SmolVLA fine-tune on a rented GPU)
├── global-hack-week/       # Global Hack Week: Hacktoberfest challenge write-ups
│   ├── 01-registration.md  # Registration challenges
│   └── github/             # GitHub challenges (Codespaces, repo management, Copilot)
├── devrelay/               # DevRelay usage notes and reviewed agent session transcripts
└── models/                 # Shared local model weights; excluded from Git
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Development Environment&lt;/h2&gt;

&lt;/div&gt;
&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Component&lt;/th&gt;
&lt;th&gt;Configuration&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Host&lt;/td&gt;
&lt;td&gt;Windows&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CPU&lt;/td&gt;
&lt;td&gt;Intel Core Ultra X7 358H; 16 logical CPUs visible in WSL&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;GPU&lt;/td&gt;
&lt;td&gt;Intel Arc B390 GPU; Windows driver 32.0.101.8356&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;RAM&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;…&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/johyeongseob/hacktoberfest-2026" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Where&lt;/th&gt;
&lt;th&gt;What&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/tree/main/dev-challenge/week-2" rel="noopener noreferrer"&gt;&lt;code&gt;dev-challenge/week-2&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Relabeling wrapper, training and evaluation scripts, all tables, chart and video scripts&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://huggingface.co/johyeongseob725/smolvla-libero-picnic-wordings" rel="noopener noreferrer"&gt;Hugging Face Hub&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;All six fine-tuned models with a model card&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Open piece&lt;/th&gt;
&lt;th&gt;Why the business needs it&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Open weights&lt;/td&gt;
&lt;td&gt;You cannot fine-tune what you cannot download&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open data&lt;/td&gt;
&lt;td&gt;I relabeled public demos instead of recording any&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Open benchmark&lt;/td&gt;
&lt;td&gt;I could measure what one demo buys and what it breaks&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Hourly GPUs + small model&lt;/td&gt;
&lt;td&gt;The customer pays for minutes, not a GPU or a per-call API&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A model file&lt;/td&gt;
&lt;td&gt;The customer runs it offline on their own robot, free of anyone's pricing&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;No paying user yet. The first person I would show it to: anyone who has watched a robot arm ignore a perfectly reasonable request.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built this with Claude Code over a week. The session below is a curated slice: the experiment design, the GPU run and its one bug, the results, and the charts and videos.&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Claude Code"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Teaching a picnic robot new words: fine-tuning SmolVLA on a rented GPU (curated, translated)&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;[Note: condensed English translation of a Claude Code session held in Korean, October 12-18, 2026. Messages are selected and shortened; wording is translated, not verbatim.]&lt;/p&gt;

&lt;p&gt;Week 2 is Side Hustle. Can we go beyond Week 1's inference and actually fine-tune SmolVLA? I want Weeks 2 to 4 to continue the picnic robot story, and I'd rather pick something that shows real VLA work than something safe.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Proposal: teach lerobot/smolvla_libero the four Week 1 phrasings that failed, with N demos per item, and measure success against N. The curve is a price list for a "fit the robot to how your users talk" service.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Isn't smolvla_libero already fine-tuned on LIBERO-Object? Wouldn't training and testing be the same thing?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;It has seen every Object demo, but only with one sentence per task. What is new is the wording. Split: train on the first N demos per item relabeled with the original sentence and A to D; choose checkpoints on initial states 10 to 14; test on states 0 to 9; and add four unseen phrasings E to H that are only ever used in the test.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Write E to H.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Wrote E to H under fixed rules (none of the verbs pick, place, grab, put, pack; a sentence structure different from A to D; the basket stays the target) and froze them in data/wordings.json before any training.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Train on the four items with N = 1, 3, 5, 10, 20, 40. With the same number of steps, won't the small N runs overfit?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Every N gets the same 3000 steps (lr 2.5e-5, warmup 200, batch 32), and checkpoints are scored on the validation states while training runs, so overfitting would show up as a falling validation curve. The best checkpoint per N goes to the test.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Can one command run everything?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;run_all.sh starts one tmux session: the N = 0 test, the training chain, one watcher per run, and a final waiter. A dry run with stub scripts caught two bugs before any GPU time: parallel jobs appending to one results file corrupted it (now one file per job, merged at the end), and results depended on job grouping (now the RNG is reseeded per episode).&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;dry run of run_all.sh with stub training and evaluation scripts&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ dry run of run_all.sh with stub training and evaluation scripts&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;interleaved lines found in results.jsonl; after the fix, a clean rerun&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;DigitalOcean, the sponsor, won't let my new account create a GPU Droplet. What now?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;A new account needs a $250 prepay or a support ticket that takes one to two business days. RunPod rents an A100 SXM 80 GB by the hour with prepaid credit, so I rewrote setup.md for a RunPod pod. On the pod, the smoke test (butter, original sentence) succeeded, and a 200-step training probe used 28 GB of GPU memory at 0.46 s per step.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Training is stuck at step 0.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-top"&gt;top&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;CPU use on the pod&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;CPU use on the pod&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;evaluation processes at 400-600% CPU each&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;nproc reports the host's 256 CPUs, but the pod has 16 vCPU, so every evaluation process spawned hundreds of threads and starved training. Fix: OMP_NUM_THREADS=1 (and MKL, OpenBLAS) in the environment, then restart. To fit the time budget, validate at steps 1000, 2000, and 3000 only.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;I'm going to close everything and turn off my laptop. Will it keep running?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Yes, the jobs live in tmux on the pod. Before leaving, check that training passed step 1000, the first checkpoint exists, no process is far above 100% CPU, and there is disk and credit left.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;All six runs finished in about six hours and $11. Taught phrasings: 31% at N = 0, 80% at N = 1, 92% at N = 20 and 40. Unseen: 29% at N = 0, then 74-79% for every N. Six untrained items: 87% to 60-72%.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;So unseen phrasings don't scale with N?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;No. Per item it is mixed: cream cheese rises, orange juice falls from 36/40 to 23/40, and they cancel out. A likely reason: every demo carries the same five sentences, so more demos add ways to move, not ways to be asked. With one seed per N, it is a hypothesis.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;The original sentence was in the training mix. Why do the other items still fail?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;The original sentence was only there for the four trained items; the other six never appeared, so the whole model drifted toward the four. The checkpoint choice never looked at them, and even the step-1000 checkpoints forgot as much, so it happens early. Mixing in a few demos of every item is the fix to try next.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;What is the most important result?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;One demo per item does most of the work: that is the price, and the Side Hustle story. Then the twist (more demos do not help new phrasings) and the cost (forgetting).&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Make video grids: the four items, a taught and an unseen phrasing, before and after one demo.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-makegridpy"&gt;make_grid.py&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;items&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;items&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;4x4 grid: N = 0 fails in all 8 tiles, N = 1 succeeds in all 8&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Scenes chosen by a rule: N = 0 fails and every fine-tuned model succeeds. Also a 1x4 orange juice grid (N = 1, 10, 20, 40) and a butter-versus-ketchup grid for forgetting.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;In the line chart, use filled dots for what was taught and hollow dots for what wasn't, so it reads like the heatmap.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Filled now means "in the fine-tuning data" (the original sentence and A to D); hollow means not (E to H, and the six other items). Both charts use the same rule and legend.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Publish the models.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Wrote a short model card with the charts and the results table, uploaded it, and made the Hugging Face repo public with all six checkpoints.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Let's write the DEV post. Use DevRelay actively, and lean on figures, tables, and videos rather than text.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Pulled the Week 2 rules and judging criteria with get_challenge_details, checked another submission for the template, searched DEV for related posts (one on whether fine-tuning turns a VLA into an imitation learner), and staged the post as an unpublished draft. Rewrote it around tables, charts, and videos. This session is saved with submit_agent_session and embedded in the post.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        31 of 31 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I worked with the agent in Korean. This is a condensed English translation of the key moments, not a verbatim transcript.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I designed the experiment, ran the training and every test episode, and reviewed every result. An AI coding agent helped write the scripts, drafted phrasings E to H under rules I set (I reviewed and froze them before training), analyzed the results, made the charts and videos, and drafted this post.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>robotics</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Can I Ask a Robot to Pack My Picnic in My Own Words?</title>
      <dc:creator>HYEONGSEOB JO</dc:creator>
      <pubDate>Sun, 11 Oct 2026 16:49:25 +0000</pubDate>
      <link>https://dev.to/johyeongseob/can-i-ask-a-robot-to-pack-my-picnic-in-my-own-words-40f2</link>
      <guid>https://dev.to/johyeongseob/can-i-ask-a-robot-to-pack-my-picnic-in-my-own-words-40f2</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-week1-2026-10-05"&gt;Hacktoberfest Open-Source AI Challenge Week 1: Touch Grass&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;The plan was simple: before heading out for a picnic, you tell a robot what to pack, step away from the screen, and go. The robot does the rest.&lt;/p&gt;

&lt;p&gt;I built that loop in simulation with an open vision-language-action (VLA) model, &lt;a href="https://huggingface.co/lerobot/smolvla_libero" rel="noopener noreferrer"&gt;SmolVLA&lt;/a&gt;. It reads two camera images, the arm's state, and a sentence like "pick up the butter and place it in the basket", and outputs continuous arm actions. The picnic items are the ten groceries of the LIBERO-Object benchmark: alphabet soup, cream cheese, salad dressing, bbq sauce, ketchup, tomato sauce, butter, milk, chocolate pudding, and orange juice.&lt;/p&gt;

&lt;p&gt;Then I tested the part that decides whether you actually get to leave: &lt;strong&gt;can you ask in your own words?&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;Each row is one item. Left to right: Original (the exact training sentence), then A, B, C, and D, four ways a person might say it instead (listed in the table under Step 2). Each tile shows the first successful episode out of ten, or episode 0 when all ten failed. For a closer look at the videos, see the full-resolution versions on &lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/tree/main/dev-challenge/week-1/paraphrases" rel="noopener noreferrer"&gt;GitHub&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Alphabet soup&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm5eqo4qtzk2srshs4dva.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fm5eqo4qtzk2srshs4dva.webp" alt="Alphabet soup: original instruction and paraphrases A to D" width="600" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Cream cheese&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffv3gsl9yymbpqtow0jsa.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ffv3gsl9yymbpqtow0jsa.webp" alt="Cream cheese: original instruction and paraphrases A to D" width="600" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Butter&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdsts20okiwy2e1rsrsr4.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdsts20okiwy2e1rsrsr4.webp" alt="Butter: original instruction and paraphrases A to D" width="600" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Orange juice&lt;/strong&gt;&lt;br&gt;
&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuehql1mf4aaxhk1gc0l9.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fuehql1mf4aaxhk1gc0l9.webp" alt="Orange juice: original instruction and paraphrases A to D" width="600" height="120"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The training sentence worked every time. The paraphrases split in two: A and D, which keep "put ... in the basket", worked about half the time (22/40 and 26/40), while B and C almost never worked (2/40 each).&lt;/p&gt;
&lt;h2&gt;
  
  
  The results
&lt;/h2&gt;
&lt;h3&gt;
  
  
  Step 1: does it pack at all?
&lt;/h3&gt;

&lt;p&gt;First, the baseline: all ten items with their original instructions, 10 episodes each from slightly different starting layouts.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;89 of 100 episodes succeeded.&lt;/strong&gt; BBQ sauce was the weakest (6/10); four items were perfect (10/10). That matches a public run of the same checkpoint in &lt;a href="https://github.com/huggingface/lerobot/issues/4614" rel="noopener noreferrer"&gt;huggingface/lerobot#4614&lt;/a&gt; (42/50, 84%), so the setup reproduces what others see.&lt;/p&gt;
&lt;h3&gt;
  
  
  Step 2: can a person ask in their own words?
&lt;/h3&gt;

&lt;p&gt;I took the four items that scored 10/10, so any drop points at the wording and not the grasp, and gave each one four paraphrases:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Instruction&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;Original&lt;/td&gt;
&lt;td&gt;pick up the {item} and place it in the basket&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;40/40&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;A&lt;/td&gt;
&lt;td&gt;grab the {item} and put it in the basket&lt;/td&gt;
&lt;td&gt;22/40&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;B&lt;/td&gt;
&lt;td&gt;{item} in the basket&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2/40&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;C&lt;/td&gt;
&lt;td&gt;pack the {item} for our picnic&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;2/40&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;D&lt;/td&gt;
&lt;td&gt;could you put the {item} in the picnic basket?&lt;/td&gt;
&lt;td&gt;26/40&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Across all four paraphrases: &lt;strong&gt;52/160 (33%)&lt;/strong&gt;. Every failure ran to the 280-step limit without placing the item.&lt;/p&gt;

&lt;p&gt;Three things stood out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;The two most natural picnic requests fail almost completely.&lt;/strong&gt; "Butter in the basket" and "pack the butter for our picnic" are exactly what I would say on my way out the door. Across the four items, those two wordings worked 2 times out of 40 each.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Keeping "put ... in the basket" helps, but not reliably.&lt;/strong&gt; A and D land around half.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The same sentence can work for one item and mostly fail for another.&lt;/strong&gt; Butter was 10/10 on both A and D; cream cheese was 3/10 on both.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If only the exact template works, the person stays at the screen rephrasing instead of heading out. For a Touch Grass project, that is the result that matters.&lt;/p&gt;
&lt;h3&gt;
  
  
  Why do paraphrases fail?
&lt;/h3&gt;

&lt;p&gt;These are hypotheses; the runs cannot separate them.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;One fixed sentence per task.&lt;/strong&gt; Every LIBERO-Object task uses one template with only the item name changed. The model may treat the sentence as a task ID rather than as meaning.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The language model was fine-tuned too.&lt;/strong&gt; The checkpoint config has &lt;code&gt;train_expert_only: False&lt;/code&gt;, so the SmolVLM2 language layers were trained on those same template sentences and may have drifted from general English.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Small model.&lt;/strong&gt; The language part is about 252M parameters. A larger backbone might map "grab" or "pack" closer to "pick up". Running the same instructions on a bigger LIBERO checkpoint such as &lt;code&gt;lerobot/pi05_libero_finetuned&lt;/code&gt; would test this.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Unseen words and shifted positions.&lt;/strong&gt; B moves the item name to the front; C and D add words like "pack", "could you", and "picnic" that never appear in training.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;p&gt;Everything runs on one laptop CPU (Intel Core Ultra X7 358H, Windows 11, WSL Ubuntu 24.04). No GPU, no cloud.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;code&gt;lerobot/smolvla_libero&lt;/code&gt;, SmolVLA fine-tuned on LIBERO.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Runner:&lt;/strong&gt; &lt;a href="https://github.com/huggingface/lerobot" rel="noopener noreferrer"&gt;LeRobot&lt;/a&gt; 0.6.1. The baseline uses &lt;code&gt;lerobot-eval&lt;/code&gt;, wrapped to time every model call. The paraphrase runs use a small rollout loop that swaps in a new instruction while keeping the same initial states and seeds.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Simulation:&lt;/strong&gt; LIBERO-Object on robosuite and MuJoCo.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Two flags matter (excerpt of the full command): one keeps the run from failing, the other keeps the success rate from dropping.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;python baseline/benchmark_eval.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy&lt;/span&gt;.path&lt;span class="o"&gt;=&lt;/span&gt;lerobot/smolvla_libero &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy&lt;/span&gt;.device&lt;span class="o"&gt;=&lt;/span&gt;cpu &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--policy&lt;/span&gt;.n_action_steps&lt;span class="o"&gt;=&lt;/span&gt;10 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt;.type&lt;span class="o"&gt;=&lt;/span&gt;libero &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--env&lt;/span&gt;.task&lt;span class="o"&gt;=&lt;/span&gt;libero_object &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--rename_map&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;'{"observation.images.image": "observation.images.camera1", "observation.images.image2": "observation.images.camera2"}'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;


&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;--rename_map&lt;/code&gt;: the checkpoint expects cameras named &lt;code&gt;camera1&lt;/code&gt; and &lt;code&gt;camera2&lt;/code&gt;, but LeRobot 0.6.1 does not apply the saved mapping automatically (&lt;a href="https://github.com/huggingface/lerobot/pull/4578" rel="noopener noreferrer"&gt;huggingface/lerobot#4578&lt;/a&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;--policy.n_action_steps=10&lt;/code&gt;: the checkpoint ships with 50, which replays a whole action chunk before looking again. In lerobot#4614 that cost 20 points on LIBERO-Object (84% to 64%).&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  The robot is fast in simulation and slow in real life
&lt;/h3&gt;

&lt;p&gt;The simulator pauses while the model thinks. A real arm would not.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjohyeongseob%2Fhacktoberfest-2026%2Fmain%2Fdev-challenge%2Fweek-1%2Fassets%2Fsmoke_test%2Fketchup_stop_and_go_side_by_side.webp" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto/https%3A%2F%2Fraw.githubusercontent.com%2Fjohyeongseob%2Fhacktoberfest-2026%2Fmain%2Fdev-challenge%2Fweek-1%2Fassets%2Fsmoke_test%2Fketchup_stop_and_go_side_by_side.webp" alt="Simulation time versus real-robot time for the smoke-test episode" width="720" height="360"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Each SmolVLA call plans 0.5 s of motion but takes 1.15 s on this CPU. On a real arm, the ketchup episode above would stop and go: 8.8 s of motion becomes about 29.5 s. Success rates are unaffected because the simulator waits, but real-time control would need a GPU or asynchronous inference. I did not test either.&lt;/p&gt;
&lt;h3&gt;
  
  
  What I did not do
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;No real robot and no outdoor test.&lt;/strong&gt; I planned to pack a real picnic and dropped it. Everything here is simulation.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;No training.&lt;/strong&gt; The checkpoint is used as published.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;One item per episode.&lt;/strong&gt; Packing a whole basket in one go is outside the training distribution.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;
  
  
  Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/johyeongseob" rel="noopener noreferrer"&gt;
        johyeongseob
      &lt;/a&gt; / &lt;a href="https://github.com/johyeongseob/hacktoberfest-2026" rel="noopener noreferrer"&gt;
        hacktoberfest-2026
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      Hacktoberfest 2026 projects and experiments focused on open-weight AI, VLA, and Physical AI.
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;Hacktoberfest 2026&lt;/h1&gt;

&lt;/div&gt;

&lt;p&gt;A month-long exploration of open-weight AI, VLA, and Physical AI.&lt;/p&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Goals&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;Explore open-weight AI models&lt;/li&gt;
&lt;li&gt;Build VLA/Physical AI projects&lt;/li&gt;
&lt;li&gt;Participate in DEV Challenges&lt;/li&gt;
&lt;li&gt;Document experiments and learnings&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Projects&lt;/h2&gt;

&lt;/div&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;dev-challenge/weekend-challenge/&lt;/code&gt;: Weekend Challenge project workspace&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;devrelay/&lt;/code&gt;: DevRelay usage notes and reviewed agent session transcripts&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;models/&lt;/code&gt;: Shared local model weights for all projects; excluded from Git&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Development Environment&lt;/h2&gt;

&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;div class="table-wrapper-paragraph"&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;br&gt;&lt;table&gt;

&lt;thead&gt;

&lt;tr&gt;

&lt;th&gt;Component&lt;/th&gt;

&lt;th&gt;Configuration&lt;/th&gt;

&lt;/tr&gt;

&lt;/thead&gt;

&lt;tbody&gt;

&lt;tr&gt;

&lt;td&gt;Host&lt;/td&gt;

&lt;td&gt;Windows&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;CPU&lt;/td&gt;

&lt;td&gt;Intel Core Ultra X7 358H; 16 logical CPUs visible in WSL&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;GPU&lt;/td&gt;

&lt;td&gt;Intel Arc B390 GPU; Windows driver 32.0.101.8356&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;RAM&lt;/td&gt;

&lt;td&gt;32 GB&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Runtime&lt;/td&gt;

&lt;td&gt;WSL with Ubuntu 24.04 LTS&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Shell for project commands&lt;/td&gt;

&lt;td&gt;Bash in Ubuntu&lt;/td&gt;

&lt;/tr&gt;

&lt;tr&gt;

&lt;td&gt;Python&lt;/td&gt;

&lt;td&gt;3.12.3&lt;/td&gt;

&lt;/tr&gt;

&lt;/tbody&gt;

&lt;/table&gt;&lt;/div&gt;&lt;br&gt;
&lt;p&gt;&lt;/p&gt;&lt;/div&gt;
&lt;br&gt;
&lt;br&gt;
  &lt;/div&gt;
&lt;br&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/johyeongseob/hacktoberfest-2026" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;br&gt;
&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;The project lives in &lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/tree/main/dev-challenge/week-1" rel="noopener noreferrer"&gt;&lt;code&gt;dev-challenge/week-1&lt;/code&gt;&lt;/a&gt;, with run scripts and a results page for the baseline and for the paraphrase experiment, plus setup notes for WSL.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;This project would not exist with a closed model, because the interesting part was looking inside.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;I could read the checkpoint.&lt;/strong&gt; The &lt;code&gt;train_expert_only: False&lt;/code&gt; line in the published config is what turned "it fails on paraphrases" into a testable hypothesis about why. A closed API would have given me a success rate and nothing else.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;I could compare against strangers.&lt;/strong&gt; Because the model, benchmark, and evaluation code are all public, I could line my 89/100 up against a public run on different hardware and know my setup was sound before trusting the paraphrase results.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;It runs on my laptop for free.&lt;/strong&gt; About 300 episodes on a CPU, offline after the first 3.3 GB download, with no API bill and no account.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The next step is open too.&lt;/strong&gt; The fix most likely to help, fine-tuning on varied instructions or swapping in a larger open model, is something I can do myself rather than wait for a vendor.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The honest tradeoff: CPU inference is too slow to drive a real arm, and a small open model fine-tuned on one sentence per task does not understand casual English yet. But I can see exactly why, and that is what open gives me.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Agent Session
&lt;/h2&gt;

&lt;p&gt;I built this with Claude Code over four days. The session below is a curated slice: the decisions, the setup bug, the results, and the failure analysis.&lt;/p&gt;


&lt;div class="ltag-agent-session"&gt;
  &lt;div class="agent-session-header"&gt;
    
    &lt;span class="agent-session-tool-icon-badge" title="Claude Code"&gt;
&lt;/span&gt;
    &lt;span class="agent-session-title"&gt;Picnic-packing robot: testing SmolVLA with paraphrased instructions on a laptop CPU (curated, translated)&lt;/span&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-scroll"&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;[Note: condensed English translation of a Claude Code session held in Korean, October 8-12, 2026. Messages are selected and shortened; wording is translated, not verbatim.]&lt;/p&gt;

&lt;p&gt;Week 1 theme is Touch Grass: get people off the screen and outside. Let's do packing picnic items from the kitchen with a robot.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Good fit. A person tells the robot what to pack, then leaves. LIBERO-Object has ten grocery items (ketchup, butter, cream cheese, orange juice and more) and a basket, so it maps directly. The scene is a floor rather than a counter, so we frame it as a kitchen staging area and say so.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Rank SmolVLA, pi0, pi0.5, GR00T N1, and RLDX-1 by how hard they are to train and run. Is SmolVLA already trained on LIBERO-Object, or do we need to fine-tune?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;SmolVLA is the lightest and runs on CPU. lerobot/smolvla_libero is already fine-tuned on LIBERO, including the ten LIBERO-Object tasks, so Week 1 can be inference only.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Week 1 uses lerobot/smolvla_libero as published. Give me step-by-step milestones.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Plan, smoke test (one ketchup episode), baseline (all ten items, 10 episodes each), paraphrased instructions, then the write-up. A dedicated venv and a separate LIBERO config folder keep other projects untouched.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;The first smoke test stopped on an input name mismatch. The checkpoint expects cameras named camera1 and camera2, while the LIBERO environment emits image and image2.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-webfetch"&gt;WebFetch&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;lerobot/smolvla_libero train_config.json&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;lerobot/smolvla_libero train_config.json&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;rename_map: image to camera1, image2 to camera2. n_action_steps: 50&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Fix: pass the rename_map flag explicitly, because LeRobot 0.6.1 does not apply the saved mapping (lerobot#4578). I also found lerobot#4614: the shipped n_action_steps of 50 lowers success, so we set n_action_steps to 10.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Should I open an issue upstream for this?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;No need, both problems are already reported (lerobot#4517, #4578, #4614). We document the workarounds in setup.md.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;From now on, always report inference time when we run experiments.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Added benchmark_eval.py, a thin wrapper around lerobot-eval that times every SmolVLA call.&lt;/p&gt;

                &lt;/div&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;benchmark_eval.py on libero_object task 4 (ketchup), 1 episode, CPU, n_action...&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ benchmark_eval.py on libero_object task 4 (ketchup), 1 episode, CPU, n_action_steps 10&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;ketchup: 1/1 success, 176 of 280 steps. 18 SmolVLA calls, 1.15 s mean per call&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;I watched the video: it puts the ketchup in the basket. What does 1.15 s per call mean for a real robot?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Each call plans 10 actions, which is 0.5 s of motion at 20 Hz, but takes 1.15 s on this CPU, about 2.3x slower than real time. The simulator pauses while the model thinks, so success rates are unaffected, but a real arm would stop and go.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Do we need a GPU for Week 1?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;No. In simulation success rates do not depend on speed, so a laptop CPU is enough. The slowness goes into the write-up as a limitation.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Then no GPU in Week 1. Remove the GPU setup.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Baseline finished: 89/100 across the ten items (bbq sauce 6/10 weakest; alphabet soup, cream cheese, butter, orange juice 10/10). That is in line with the public 42/50 (84%) in lerobot#4614, so the setup reproduces.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;What is the point of the paraphrase experiment? Checking whether SmolVLA still works when I use my own instruction instead of the trained one?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Exactly: can a person ask in their own words? Use items that scored 10/10 so a drop points at the wording, not the grasp. Per item: the original sentence as a control plus four paraphrases, 10 episodes each with the same seeds. I wrote picnic_rollout.py, a small rollout loop that swaps in the instruction.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Start with two items, and add one or two more if there is time.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;My laptop battery is at 8% and I am outside. How far did it get? Is it OK to cancel now?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Each episode is written as it finishes, so stopping keeps completed runs. Restart later from the next run boundary with the same arguments and every cell still ends with exactly 10 episodes.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;All four items done (alphabet soup, cream cheese, butter, orange juice). Original 40/40. Paraphrases 52/160: A grab/put 22/40, B '{item} in the basket' 2/40, C 'pack the {item} for our picnic' 2/40, D 'could you put the {item} in the picnic basket?' 26/40.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Why does SmolVLA do so badly on B and C? Because they are abstract or have no verb? Is it like CLIP having a caption template?&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Similar idea. Every LIBERO-Object task uses one fixed sentence, so the model may treat it as a task ID. The checkpoint config also has train_expert_only False, so the language layers were fine-tuned on those same sentences.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Could the small model size also be a reason? With more parameters the transformer might understand better.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Plausible. The language part is about 252M parameters using 16 of SmolVLM2's 32 layers. Running the same instructions on a larger LIBERO checkpoint such as pi0.5 would test it. Four hypotheses total; the runs cannot separate them, so we label them as hypotheses.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;For each item, make a 1x5 grid: original, A, B, C, D, first successful episode each. And drop the real-picnic milestone: I have no robot.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
              &lt;div class="agent-session-tool-call"&gt;
                
                  &lt;span class="agent-session-chevron"&gt;▸&lt;/span&gt;
                  &lt;span class="tool-name tool-name-bash"&gt;Bash&lt;/span&gt;
                    &lt;span class="tool-input-preview"&gt;make_grid.py m3-row for task 6 (butter)&lt;/span&gt;
                
                &lt;div class="agent-session-tool-detail"&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Input&lt;/div&gt;
                      &lt;pre class="agent-session-pre agent-session-terminal"&gt;&lt;code&gt;$ make_grid.py m3-row for task 6 (butter)&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                    &lt;div class="tool-section"&gt;
                      &lt;div class="tool-section-label"&gt;Output&lt;/div&gt;
                      &lt;pre class="agent-session-pre"&gt;&lt;code&gt;m3_row_task6.mp4 written&lt;/code&gt;&lt;/pre&gt;
                    &lt;/div&gt;
                &lt;/div&gt;
              &lt;/div&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Done for all four items. The write-up will say clearly that everything is simulation and there was no outdoor test.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Review the whole README based on what we checked in the baseline and paraphrase results.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Found claims that no longer matched the results pages, an over-broad '20 points on LIBERO' that should say LIBERO-Object, and missing links to the run scripts. Fixed them and restructured the README around the paraphrase videos.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-user"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-user"&gt;
          You
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Let's move on to the DEV post. Use DevRelay actively.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class="agent-session-message agent-session-assistant"&gt;
        &lt;div class="agent-session-role-badge agent-session-role-assistant"&gt;
          Agent
        &lt;/div&gt;
        &lt;div class="agent-session-content"&gt;
                &lt;div class="agent-session-text"&gt;
                  &lt;p&gt;Pulled the Week 1 rules and judging criteria with get_challenges, checked another submission for the template, and staged the post as an unpublished draft with create_article. This session is saved with submit_agent_session and embedded in the post.&lt;/p&gt;

                &lt;/div&gt;
        &lt;/div&gt;
      &lt;/div&gt;
  &lt;/div&gt;

  &lt;div class="agent-session-footer"&gt;
    &lt;span class="agent-session-meta"&gt;
        33 of 33 messages
    &lt;/span&gt;
  &lt;/div&gt;
&lt;/div&gt;


&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; I worked with the agent in Korean. This is a condensed English translation of the key moments, not a verbatim transcript.&lt;/p&gt;
&lt;/blockquote&gt;




&lt;p&gt;&lt;strong&gt;Disclosure:&lt;/strong&gt; I designed the experiments, ran every episode, and reviewed every result. An AI coding agent helped write scripts, draft the paraphrased instructions (which I reviewed), and draft this post.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>robotics</category>
      <category>ai</category>
    </item>
    <item>
      <title>Where Does This Belong? An AI Workbench Reset Assistant for a Coworker</title>
      <dc:creator>HYEONGSEOB JO</dc:creator>
      <pubDate>Sun, 04 Oct 2026 20:05:34 +0000</pubDate>
      <link>https://dev.to/johyeongseob/where-did-this-go-a-local-ai-workbench-reset-assistant-for-a-coworker-42co</link>
      <guid>https://dev.to/johyeongseob/where-did-this-go-a-local-ai-workbench-reset-assistant-for-a-coworker-42co</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe5h6bzimxjlu5ljh6edi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fe5h6bzimxjlu5ljh6edi.png" alt="Shared Workbench Reset Assistant showing the reference and current demo layouts" width="800" height="719"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure: The demo interface before analysis. Left: the frame used as the reference layout. Right: the frame used as the current layout.&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;I built &lt;strong&gt;Shared Workbench Reset Assistant&lt;/strong&gt; for one coworker who has trouble remembering where objects originally belonged on our shared workbench.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The idea is simple&lt;/strong&gt;: &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Keep a reference photo of the intended layout, &lt;/li&gt;
&lt;li&gt;Compare it with a photo taken after use, and &lt;/li&gt;
&lt;li&gt;Prepare a short checklist for putting things back. &lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The reference photo provides a visual memory of the workspace.&lt;/p&gt;

&lt;p&gt;The prototype uses an &lt;strong&gt;open-weight vision-language model&lt;/strong&gt; to draft observations and a cleanup checklist. Both remain editable, and the user must review them against the photos before exporting a result.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;The three demo screenshots show &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;the photo inputs, &lt;/li&gt;
&lt;li&gt;reviewed observations, and &lt;/li&gt;
&lt;li&gt;final reviewed checklist.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;For a reproducible demonstration, I used public &lt;a href="https://github.com/rllab-snu/TTU-Dataset" rel="noopener noreferrer"&gt;Tabletop Tidying Up (TTU)&lt;/a&gt; dataset images.&lt;/p&gt;

&lt;p&gt;The sample shown below contains a red cup, a beverage can, and a remote control. I used the first frame as the reference layout and the last frame as the current layout. These roles were assigned for this prototype; they are not verified official tidy/untidy labels.&lt;/p&gt;

&lt;p&gt;The workflow is:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Analyze the two photos independently. (Screenshot 1)&lt;/li&gt;
&lt;li&gt;Correct and confirm the model's observations. (Screenshot 2)&lt;/li&gt;
&lt;li&gt;Generate a checklist from those reviewed observations. (Screenshot 3)&lt;/li&gt;
&lt;li&gt;Edit and confirm the final checklist, then download the result as JSON. (Screenshot 3)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg60vdahfvgcv4wqwldpi.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fg60vdahfvgcv4wqwldpi.png" alt="Reference and current layouts displayed side by side" width="800" height="436"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 1: Left: the frame used as the reference layout. Right: the frame used as the current layout.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwf8mgd8mcvjyjatnhrcd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fwf8mgd8mcvjyjatnhrcd.png" alt="Corrected reference and current observations with user confirmation" width="800" height="248"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 2: Observations corrected with coding-assistant help and checked against the photos.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1xxx18xuh7s3l1b3og2.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Ff1xxx18xuh7s3l1b3og2.png" alt="Edited checklist with user confirmation and result download" width="800" height="433"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Figure 3: Final checklist corrected with coding-assistant help and confirmed against the reference photo.&lt;/em&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Run the Local Demo
&lt;/h3&gt;

&lt;p&gt;Follow the &lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/blob/main/dev-challenge/weekend-challenge/README.md" rel="noopener noreferrer"&gt;project README&lt;/a&gt; to prepare the Python environment, download the Q8_0 model and vision projector, and build &lt;code&gt;llama-server&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Open two WSL terminals. Replace &lt;code&gt;/path/to/hacktoberfest-2026&lt;/code&gt; with the path to &lt;strong&gt;your local repository&lt;/strong&gt;. The commands below use the virtual environment path specified in the README.&lt;/p&gt;

&lt;p&gt;In terminal 1, start the model server:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/hacktoberfest-2026/dev-challenge/weekend-challenge
bash start_model_server.sh
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;After it reports that it is listening on port 8080, start the app in terminal 2:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;&lt;span class="nb"&gt;source&lt;/span&gt; ~/.venvs/hacktoberfest-2026/bin/activate
&lt;span class="nb"&gt;cd&lt;/span&gt; /path/to/hacktoberfest-2026/dev-challenge/weekend-challenge
python &lt;span class="nt"&gt;-m&lt;/span&gt; streamlit run app.py &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--server&lt;/span&gt;.address 127.0.0.1 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--server&lt;/span&gt;.port 8501 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;--browser&lt;/span&gt;.gatherUsageStats &lt;span class="nb"&gt;false&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;blockquote&gt;
&lt;p&gt;Replace &lt;code&gt;/path/to/hacktoberfest-2026&lt;/code&gt; with the path to your local repository.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Open &lt;code&gt;http://localhost:8501&lt;/code&gt; in your Windows browser and select the sample. Review and correct both observations and the checklist against the photos before exporting. This address works on the machine running the app; it is not a public demo link. No hosted inference API key is needed.&lt;/p&gt;

&lt;h2&gt;
  
  
  How I Built It
&lt;/h2&gt;

&lt;h3&gt;
  
  
  Code
&lt;/h3&gt;

&lt;p&gt;&lt;a href="https://github.com/johyeongseob/hacktoberfest-2026" rel="noopener noreferrer"&gt;Project repository&lt;/a&gt; · &lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/tree/main/dev-challenge/weekend-challenge" rel="noopener noreferrer"&gt;Weekend project and setup&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The main files are &lt;code&gt;app.py&lt;/code&gt; for the Streamlit interface, &lt;code&gt;workbench.py&lt;/code&gt; for local inference requests and image preparation, and &lt;code&gt;start_model_server.sh&lt;/code&gt; for starting llama.cpp. Model weights are downloaded separately and excluded from Git.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model and Runtime
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Model:&lt;/strong&gt; &lt;a href="https://huggingface.co/ggml-org/SmolVLM2-2.2B-Instruct-GGUF" rel="noopener noreferrer"&gt;SmolVLM2 2.2B Instruct&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Quantization:&lt;/strong&gt; Q8_0 for both the model and vision projector&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Inference server:&lt;/strong&gt; Local &lt;a href="https://github.com/ggml-org/llama.cpp" rel="noopener noreferrer"&gt;llama.cpp&lt;/a&gt; server&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Interface:&lt;/strong&gt; &lt;a href="https://github.com/streamlit/streamlit" rel="noopener noreferrer"&gt;Streamlit&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Environment:&lt;/strong&gt; WSL Ubuntu 24.04&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hardware:&lt;/strong&gt; Intel Core Ultra X7 358H laptop with 32 GB of RAM&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Execution:&lt;/strong&gt; CPU only; no GPU or model fine-tuning&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Why Does Open Innovation Matter?
&lt;/h2&gt;

&lt;p&gt;Open weights and open-source inference tools let me run the model on my own laptop without sending photos to a hosted model API. They also let me compare models, inspect failures, and adapt the workflow without relying on a hosted model provider.&lt;/p&gt;

&lt;h2&gt;
  
  
  What’s Next?
&lt;/h2&gt;

&lt;p&gt;This project is the starting point for my month-long exploration of VLA and Physical AI. It uses a VLM to draft text observations and instructions; it does not execute a VLA policy or control a robot.&lt;/p&gt;

&lt;h2&gt;
  
  
  AI Assistance Disclosure
&lt;/h2&gt;

&lt;p&gt;I used Codex to help implement the app, debug experiments, revise the demo observations and cleanup instructions, and draft this post. I checked the final observations and checklist against the photos. The original local SmolVLM2 outputs are preserved separately from the Codex-assisted revisions.&lt;/p&gt;

&lt;p&gt;Experiment results and the reviewed JSON export are stored locally and excluded from Git. The screenshots show the workflow after human review and correction. The prototype has not yet been tested by my coworker and needs broader evaluation.&lt;/p&gt;

&lt;h2&gt;
  
  
  Data Attribution
&lt;/h2&gt;

&lt;p&gt;The sample images are third-party demo data from TTU, created by Hogun Kee, Wooseok Oh, and Songhwai Oh (2024). See the &lt;a href="https://github.com/johyeongseob/hacktoberfest-2026/blob/main/dev-challenge/weekend-challenge/README.md" rel="noopener noreferrer"&gt;project README&lt;/a&gt; for the source, preserved upstream license notice, citation, and licensing caveat.&lt;/p&gt;

&lt;h2&gt;
  
  
  References
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt; — challenge prompt and submission instructions.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/rllab-snu/TTU-Dataset" rel="noopener noreferrer"&gt;Tabletop Tidying Up (TTU) Dataset&lt;/a&gt; — source of the tabletop demo images; see the project README for attribution and licensing details.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://huggingface.co/ggml-org/SmolVLM2-2.2B-Instruct-GGUF" rel="noopener noreferrer"&gt;SmolVLM2 2.2B Instruct GGUF&lt;/a&gt; — model and vision projector used for local Q8 inference.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/ggml-org/llama.cpp" rel="noopener noreferrer"&gt;llama.cpp&lt;/a&gt; — local multimodal inference runtime and server.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/streamlit/streamlit" rel="noopener noreferrer"&gt;Streamlit&lt;/a&gt; — framework used for the browser interface.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://devrelay.com/" rel="noopener noreferrer"&gt;DevRelay&lt;/a&gt; — tool used to update the DEV draft and publish the submission; no agent-session transcript was uploaded for this project.&lt;/li&gt;
&lt;li&gt;
&lt;a href="https://github.com/open-edge-platform/physical-ai-studio" rel="noopener noreferrer"&gt;Intel Physical AI Studio&lt;/a&gt; — context for my separate open-source contributions and longer-term Physical AI goals; not integrated into this prototype.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
  </channel>
</rss>
