<?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: Xiaojia Yu</title>
    <description>The latest articles on DEV Community by Xiaojia Yu (@xiaojia-fermion).</description>
    <link>https://dev.to/xiaojia-fermion</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4097295%2Fbdbefb6f-fa6a-41eb-859b-eabecca4189f.png</url>
      <title>DEV Community: Xiaojia Yu</title>
      <link>https://dev.to/xiaojia-fermion</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xiaojia-fermion"/>
    <language>en</language>
    <item>
      <title>Dresser: my wife's private wardrobe, now picking today's outfit in one tap</title>
      <dc:creator>Xiaojia Yu</dc:creator>
      <pubDate>Sat, 03 Oct 2026 17:08:15 +0000</pubDate>
      <link>https://dev.to/xiaojia-fermion/a-wardrobe-first-outfit-planner-for-my-wife-it-remembers-what-you-wore-and-rotates-the-rest-5chl</link>
      <guid>https://dev.to/xiaojia-fermion/a-wardrobe-first-outfit-planner-for-my-wife-it-remembers-what-you-wore-and-rotates-the-rest-5chl</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;strong&gt;Dresser&lt;/strong&gt;, a private wardrobe that picks today's outfit so you don't have to think.&lt;/p&gt;

&lt;p&gt;My wife is an everyday user of the wardrobe app I built earlier and run on our NAS (it is called yichu). We designed it together: she asks for what she needs, I build it. Choosing what to wear takes thinking every morning, and you don't want to wear the same thing several days in a row. &lt;strong&gt;Dresser&lt;/strong&gt; is the version that takes that thinking away: open it, get one outfit from clothes you own, tap &lt;em&gt;Wear this&lt;/em&gt;. It is a new repository, written from scratch for this challenge; the original is its inspiration and the source of the requirements.&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%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F25z4vcpnf9yjk911bass.gif" 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%2F25z4vcpnf9yjk911bass.gif" alt="Screen recording from a real phone: the Today card, Show another, Wear this, the Wardrobe tab, Settings (example wardrobe, rule-based picks)" width="360" height="675"&gt;&lt;/a&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%2Fy88rr5p4klmw51st4kbg.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%2Fy88rr5p4klmw51st4kbg.png" alt="The Today tab on a phone: Shanghai 19-22 °C, rain 100%, Autumn, one outfit card with Wear this / Show another" width="720" height="1350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The same morning on the command line. It is raining in Shanghai (2026-10-04), and the example wardrobe is 21 drawings with a scripted two-week wear log:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;$ dresser --demo today --occasion casual
Today in Shanghai: 19-22 °C, rain 100%  -&amp;gt;  occasion: casual, room: autumn

  Top pick: white t-shirt + blue jeans + yellow rain boots
    Yellow rain boots keep your feet dry in the rain, while the white tee and blue jeans offer a relaxed, casual vibe perfect for the mild 20.5°C weather.
    Rotation: Nothing in it was worn in the last 3 days.

  Alternative 1: white t-shirt + blue jeans + brown ankle boots
    Right weight for 20.5 °C and within the casual dress code; no rain-sensitive shoes; tagged for this occasion (rule-based pick).
    Rotation: Nothing in it was worn in the last 3 days.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The weather is live, the reason is written by an open-weight model, and the &lt;em&gt;Rotation&lt;/em&gt; line is built by plain code from the wear log.&lt;/p&gt;

&lt;h2&gt;
  
  
  A day with it
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Morning.&lt;/strong&gt; You open the page. One quiet line says &lt;em&gt;Shanghai 19-22 °C, rain 100% · Autumn&lt;/em&gt;. Under it, four words: commute, casual, date, formal. Under those, one card: three pieces from your wardrobe and a sentence on why.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Not feeling it?&lt;/strong&gt; &lt;em&gt;Show another&lt;/em&gt; gives the next outfit, and the app remembers that you passed on that exact combination, so it is ranked lower from then on. There is no "do you like it?" question.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Wearing it.&lt;/strong&gt; &lt;em&gt;Wear this&lt;/em&gt; writes the day into a history on your own disk. Undo is one tap.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Tomorrow.&lt;/strong&gt; The history does the remembering. Pieces you wore yesterday are steered away from, and a piece that has been sitting there for a while gets brought back, with a line that says so: &lt;em&gt;Brings back white t-shirt (not worn for 14 days).&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;When it rains.&lt;/strong&gt; Suede, canvas and other rain-sensitive shoes are taken out of the running before the model sees anything. That is why a rainy day gives yellow rain boots instead of the brown pair.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Between seasons.&lt;/strong&gt; The wardrobe is split into four rooms, Spring, Summer, Autumn and Winter, as in the original app. You only see, and only get outfits from, the current room. The room follows the date and your city's hemisphere, and you can switch it by hand.&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%2Fyqlzkw25uqzef5vofalb.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%2Fyqlzkw25uqzef5vofalb.png" alt="The Wardrobe tab, Autumn room, grid of the example drawings" width="720" height="1350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Putting clothes in
&lt;/h2&gt;

&lt;p&gt;Take or choose photos, and a vision model fills in category, colour, material and warmth. You look it over and fix anything before it is saved.&lt;/p&gt;

&lt;p&gt;Or paste a link to a product page. On a shop page that exposes its picture, the item turns into a pre-filled form, here from a real Allbirds page:&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%2Fkl1oegmzw3s9n3xmj9ph.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%2Fkl1oegmzw3s9n3xmj9ph.png" alt="Add clothes, Paste a link: a product page read into a form for review" width="720" height="1350"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tags (&lt;code&gt;work&lt;/code&gt;, &lt;code&gt;casual&lt;/code&gt;, &lt;code&gt;rain-ready&lt;/code&gt;, &lt;code&gt;layering&lt;/code&gt;) are added automatically, and a button can ask the model for more ideas; you keep or remove each one. The app never suggests buying anything.&lt;/p&gt;

&lt;h2&gt;
  
  
  How it works
&lt;/h2&gt;

&lt;p&gt;Rules decide what is allowed, the history decides what is fresh, and the model only chooses among what is left and explains it. If the model is slow or down, you get the rule-based pick instead of an error.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;photo -&amp;gt; describe (vision model) -&amp;gt; filter by weather, occasion, season (rules)
      -&amp;gt; rotate by wear history (rules) -&amp;gt; choose + explain (text model)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Rotation, in one number
&lt;/h2&gt;

&lt;p&gt;I simulated two weeks of dressing on the example wardrobe, 50 runs. Without rotation, the same piece was worn two days in a row 17 times over the fortnight; with rotation, 0.2 (averages over the 50 runs). Details are in &lt;a href="https://github.com/wubian87/dresser/blob/main/docs/rotation_simulation.md" rel="noopener noreferrer"&gt;&lt;code&gt;docs/rotation_simulation.md&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open-weight models
&lt;/h2&gt;

&lt;p&gt;The photos are her wardrobe. With an open-weight model, where those photos go is a choice. Everything goes through one OpenAI-compatible client, so the same code can point at the cloud or at a server on your own machine, such as Ollama:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight toml"&gt;&lt;code&gt;&lt;span class="nn"&gt;[llm]&lt;/span&gt;
&lt;span class="py"&gt;preset&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"siliconflow"&lt;/span&gt;   &lt;span class="c"&gt;# cloud, open-weight Qwen models&lt;/span&gt;
&lt;span class="c"&gt;# preset = "local"       # Ollama or llama.cpp on your own machine, no key, nothing leaves it&lt;/span&gt;
&lt;span class="py"&gt;privacy&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"off"&lt;/span&gt;          &lt;span class="c"&gt;# or "images-local", or "local-only"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With &lt;code&gt;images-local&lt;/code&gt;, photos only go to &lt;code&gt;localhost&lt;/code&gt;. With &lt;code&gt;local-only&lt;/code&gt;, nothing leaves the machine, including the forecast and link fetching, and the app refuses before sending. In the default cloud mode a 512 px copy of each photo is sent once and cached; after that only text goes out, and the wear history stays on disk.&lt;/p&gt;

&lt;p&gt;For photos I use Qwen3-VL-30B-A3B, and for the pick Qwen3.6-35B-A3B, both open-weight and served by SiliconFlow. Swapping either is a one-line change.&lt;/p&gt;

&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;To try it with no account and no key (the rules choose; with a key, the model writes the reason too):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;git clone https://github.com/wubian87/dresser &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="nb"&gt;cd &lt;/span&gt;dresser
./demo.sh                        &lt;span class="c"&gt;# prints suggestions from the example wardrobe&lt;/span&gt;
python &lt;span class="nt"&gt;-m&lt;/span&gt; dresser &lt;span class="nt"&gt;--demo&lt;/span&gt; serve   &lt;span class="c"&gt;# the web page, on the example wardrobe&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Code (MIT): &lt;a href="https://github.com/wubian87/dresser" rel="noopener noreferrer"&gt;https://github.com/wubian87/dresser&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The demo uses an example wardrobe of 21 drawings and a scripted wear log; the rotation figure comes from a simulation, not from a person.&lt;/li&gt;
&lt;li&gt;Paste-a-link works on shop pages that expose their product picture, and says so plainly when it can't; then you upload a photo.&lt;/li&gt;
&lt;li&gt;The model's pick and wording differ from run to run. There is no login, so keep it on a network you trust.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;I built this with an AI coding agent, directing the design.&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
    </item>
    <item>
      <title>Fermion Fleet: When the Door Is Code, Not a Prompt</title>
      <dc:creator>Xiaojia Yu</dc:creator>
      <pubDate>Thu, 27 Aug 2026 11:55:44 +0000</pubDate>
      <link>https://dev.to/xiaojia-fermion/fermion-fleet-when-the-door-is-code-not-a-prompt-n2m</link>
      <guid>https://dev.to/xiaojia-fermion/fermion-fleet-when-the-door-is-code-not-a-prompt-n2m</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;This post was created for the Google All Things Agentic Hackathon.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Autonomous agents can sound certain while still being wrong. That is not a prompt-quality problem; it is a boundary problem.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Fermion Fleet&lt;/strong&gt; is a small multi-agent system built around one constraint: an order must not lock because a model says it is ready. It may lock only after code can read a structured boolean approval.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Demo: &lt;a href="https://youtu.be/6nPqy1AI2Kw" rel="noopener noreferrer"&gt;https://youtu.be/6nPqy1AI2Kw&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Code: &lt;a href="https://github.com/wubian87/fermion-fleet" rel="noopener noreferrer"&gt;https://github.com/wubian87/fermion-fleet&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Devpost: &lt;a href="https://devpost.com/software/fermion-fleet" rel="noopener noreferrer"&gt;https://devpost.com/software/fermion-fleet&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The problem: confident language is not a permission
&lt;/h2&gt;

&lt;p&gt;In the demo, a handler drafts an order confirmation. It misses required fields. An auditor sends it back. The handler rewrites. Only a valid review can release the order to the ledger.&lt;/p&gt;

&lt;p&gt;The important part is not that the auditor is asked to be careful. The important part is that the ledger accepts only a real boolean approval from a parseable result.&lt;/p&gt;

&lt;p&gt;The gate has a deliberately boring policy:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The handler prepares a draft.&lt;/li&gt;
&lt;li&gt;The auditor checks the required fields.&lt;/li&gt;
&lt;li&gt;The gate parses the auditor output.&lt;/li&gt;
&lt;li&gt;If the output is missing, malformed, false, or cannot be parsed, the order is held.&lt;/li&gt;
&lt;li&gt;Only a structured boolean approval can lock the order.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This is fail-closed by construction. Looks good, a persuasive explanation, an unexpected format, and a parser failure all resolve to &lt;strong&gt;stop&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;We tested that boundary by breaking the auditor’s output format. The auditor could still identify a real hallucination in natural language. It sounded professional. But code could not read a structured approval, so the door stayed shut.&lt;/p&gt;

&lt;p&gt;That is the project’s central idea: &lt;strong&gt;the door is code, not a prompt.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Context pressure, not a timer
&lt;/h2&gt;

&lt;p&gt;The other problem is context management. In a long-running system, context cannot expand forever. But forgetting should not mean permanently deleting facts that a later step may need.&lt;/p&gt;

&lt;p&gt;Fermion Fleet uses a small context window and a recoverable pool:&lt;/p&gt;

&lt;p&gt;customer&lt;br&gt;
  -&amp;gt; triage: writes the case file&lt;br&gt;
  -&amp;gt; gardener: select / evict / recall&lt;br&gt;
  -&amp;gt; gate: handler -&amp;gt; auditor -&amp;gt; parse, fail closed&lt;br&gt;
  -&amp;gt; ledger: locks only on boolean true&lt;/p&gt;

&lt;p&gt;When the window is full, the gardener evicts low-priority items into a recoverable pool. That eviction is driven by pressure, not by a timer. Later, when a new step needs an earlier detail, the system scores and recalls that item.&lt;/p&gt;

&lt;p&gt;In the recorded run, an after-sales commitment leaves the active window. A later customer question makes it relevant again; the system recalls it, and the handler can answer with details that were not present in the current conversation. Without recall, that answer would be impossible.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Google stack and the policy layer
&lt;/h2&gt;

&lt;p&gt;The runtime stack is Google’s:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Gemini 3.5 Flash&lt;/strong&gt; through &lt;strong&gt;Vertex AI&lt;/strong&gt; (global)&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Google ADK&lt;/strong&gt; for the agent structure&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Cloud Run&lt;/strong&gt; for deployment&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The policy layer is ours:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;which context is eligible at each step;&lt;/li&gt;
&lt;li&gt;when a full window must evict an item;&lt;/li&gt;
&lt;li&gt;how an evicted item can return;&lt;/li&gt;
&lt;li&gt;which role may act;&lt;/li&gt;
&lt;li&gt;and which handoff is allowed to become a durable ledger entry.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;That separation matters. A model can generate the next action; the system still needs explicit, inspectable rules for what that action is allowed to do.&lt;/p&gt;

&lt;h2&gt;
  
  
  An honest limit
&lt;/h2&gt;

&lt;p&gt;This hackathon build keeps context and the ledger in process memory. A Cloud Run restart loses them. We deliberately do &lt;strong&gt;not&lt;/strong&gt; claim Firestore, a managed memory service, Model Armor, or a background side-track as deployed components.&lt;/p&gt;

&lt;p&gt;Those are sensible next steps, but they are not part of this submission. The architecture and README draw only what runs now.&lt;/p&gt;

&lt;h2&gt;
  
  
  Run it yourself
&lt;/h2&gt;

&lt;p&gt;The repository contains reproducible instructions. The Cloud Run service is an API, rather than a browser UI. To run a complete shift against the public deployment:&lt;/p&gt;

&lt;p&gt;git clone &lt;a href="https://github.com/wubian87/fermion-fleet" rel="noopener noreferrer"&gt;https://github.com/wubian87/fermion-fleet&lt;/a&gt;&lt;br&gt;
cd fermion-fleet&lt;br&gt;
URL=&lt;a href="https://fleet-843303850287.us-central1.run.app" rel="noopener noreferrer"&gt;https://fleet-843303850287.us-central1.run.app&lt;/a&gt; ./跑班.sh&lt;/p&gt;

&lt;p&gt;A cold start can take roughly 15 seconds.&lt;/p&gt;

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

&lt;p&gt;A reliable agent system should make its important no decisions boring and mechanical. The model can be creative inside the workflow; the boundary that grants permission should remain readable by code.&lt;/p&gt;

&lt;p&gt;That is the experiment behind Fermion Fleet: make a rejection visible, make a retry auditable, and make the final lock depend on a value that cannot be talked into existence.``&lt;/p&gt;

</description>
      <category>ai</category>
      <category>python</category>
      <category>googlecloud</category>
    </item>
  </channel>
</rss>
