<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <title>YY Ahn</title>
  <subtitle>YY Ahn - Recent updates</subtitle>
  <link href="https://yyahn.com/feed.xml" rel="self" type="application/atom+xml"/>
  <link href="https://yyahn.com/" rel="alternate" type="text/html"/>
  <id>https://yyahn.com/</id>
  <updated>2026-05-10T00:00:00Z</updated>
  
  <author>
    <name>Yong-Yeol (YY) Ahn</name>
  </author>
  
  <generator uri="https://github.com/yyahn/foliate" version="0.7.6">foliate</generator>

  
  <entry>
    <title>Coding agents with UVA RC GenAI</title>
    <link href="https://yyahn.com/wiki/Coding-agents-with-UVA-RC-GenAI/" rel="alternate" type="text/html"/>
    <id>https://yyahn.com/wiki/Coding-agents-with-UVA-RC-GenAI/</id>
    <published>2026-05-06T00:00:00Z</published>
    <updated>2026-05-10T00:00:00Z</updated>
    
    <content type="html"><![CDATA[<p>UVA Research Computing&rsquo;s <a href="https://www.rc.virginia.edu/userinfo/rcgenai-userguide/" rel="nofollow">RC GenAI</a> service exposes an OpenAI-compatible API at <code>https://open-webui.rc.virginia.edu/api</code> and currently serves Kimi K2.5.</p>
<p>The API is gated to HPC-internal traffic, so even on UVA Anywhere VPN you can&rsquo;t reach it directly. The fix is to route requests through a Rivanna login node with <code>sshuttle</code>. Once that&rsquo;s in place, your local CLI talks to RC GenAI like any other OpenAI-compatible endpoint.</p>
<p>Note that SSH to <code>login.hpc.virginia.edu</code> itself is gated to UVA networks, so you do need UVA Anywhere VPN connected on the host first—sshuttle then tunnels through that SSH session. UVA Anywhere requires a personal <a href="https://its.virginia.edu/its/?id=itsweb_kb_article&amp;sys_id=58aafbcfdbf6c744f032f1f51d961927" rel="nofollow">digital certificate</a>, which you can obtain for a personal machine via NetBadge.</p>
<h2 id="what-works-what-doesnt">What works, what doesn&rsquo;t<a class="header-anchor" href="#what-works-what-doesnt" title="Link to this section" rel="nofollow">#</a></h2>
<p>Coding-agent CLIs differ in which API they speak, and that matters more than it used to. RC GenAI exposes only OpenAI Chat Completions—not the newer OpenAI Responses API and not Anthropic&rsquo;s Messages API.</p>
<ul>
<li><strong>Works</strong>: anything speaking OpenAI Chat Completions: <code>kimi-cli</code>, <a href="https://github.com/badlogic/pi-mono" rel="nofollow">Pi</a>, <code>aichat</code>, <code>llm</code>, <code>mods</code>, <code>aider</code>. I&rsquo;ve only tested Pi and it seems to work well. Pi agent is one of the simplest and most customizable agent harness. </li>
<li><strong>Does not work natively</strong>: <strong>OpenAI Codex CLI</strong> (<a href="https://github.com/openai/codex/discussions/7782" rel="nofollow">deprecated chat-completions in Feb 2026</a>; requires the Responses API now) and <strong>Claude Code</strong> (Anthropic Messages API only). A <a href="https://github.com/BerriAI/litellm" rel="nofollow">LiteLLM</a> proxy in front would translate Responses/Messages to chat-completions and unlock both. Untested here.</li>
</ul>
<h2 id="recipe-pi-sshuttle-macos">Recipe: Pi + sshuttle (macOS)<a class="header-anchor" href="#recipe-pi-sshuttle-macos" title="Link to this section" rel="nofollow">#</a></h2>
<p>Type <code>pi-uva</code> in any terminal and get a coding agent talking to UVA Kimi.</p>
<h3 id="prerequisites">Prerequisites<a class="header-anchor" href="#prerequisites" title="Link to this section" rel="nofollow">#</a></h3>
<ul>
<li>UVA RC account with GenAI enabled, and your API key.</li>
<li>UVA Anywhere VPN installed and connected (requires a personal <a href="https://its.virginia.edu/its/?id=itsweb_kb_article&amp;sys_id=58aafbcfdbf6c744f032f1f51d961927" rel="nofollow">digital certificate</a>—works on personal computers).</li>
<li>SSH access to <code>login.hpc.virginia.edu</code> (NetBadge + Duo, or your SSH key uploaded to Rivanna).</li>
<li>Homebrew.</li>
</ul>
<div class="highlight"><pre><span></span><code>brew<span class="w"> </span>install<span class="w"> </span>pi-coding-agent<span class="w"> </span>sshuttle
<span class="nb">export</span><span class="w"> </span><span class="nv">UVARC_GenAI_API</span><span class="o">=</span><span class="s2">&quot;sk-...&quot;</span><span class="w">        </span><span class="c1"># put in ~/.env or shell rc; do not commit</span>
</code></pre></div>

<h3 id="1-configure-pi">1. Configure Pi<a class="header-anchor" href="#1-configure-pi" title="Link to this section" rel="nofollow">#</a></h3>
<p>Add the UVA provider to <code>~/.pi/agent/models.json</code>. If the file already exists, merge the <code>"uva"</code> block into the existing <code>"providers"</code> object.</p>
<div class="highlight"><pre><span></span><code><span class="p">{</span>
<span class="w">  </span><span class="nt">&quot;providers&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w">    </span><span class="nt">&quot;uva&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span>
<span class="w">      </span><span class="nt">&quot;api&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;openai-completions&quot;</span><span class="p">,</span>
<span class="w">      </span><span class="nt">&quot;apiKey&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;UVARC_GenAI_API&quot;</span><span class="p">,</span>
<span class="w">      </span><span class="nt">&quot;baseUrl&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;https://open-webui.rc.virginia.edu/api&quot;</span><span class="p">,</span>
<span class="w">      </span><span class="nt">&quot;models&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span>
<span class="w">        </span><span class="p">{</span>
<span class="w">          </span><span class="nt">&quot;id&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Kimi K2.5&quot;</span><span class="p">,</span>
<span class="w">          </span><span class="nt">&quot;name&quot;</span><span class="p">:</span><span class="w"> </span><span class="s2">&quot;Kimi K2.5 (UVA RC GenAI)&quot;</span><span class="p">,</span>
<span class="w">          </span><span class="nt">&quot;reasoning&quot;</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span>
<span class="w">          </span><span class="nt">&quot;input&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">[</span><span class="s2">&quot;text&quot;</span><span class="p">],</span>
<span class="w">          </span><span class="nt">&quot;contextWindow&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">65536</span><span class="p">,</span>
<span class="w">          </span><span class="nt">&quot;maxTokens&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">8192</span><span class="p">,</span>
<span class="w">          </span><span class="nt">&quot;cost&quot;</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w"> </span><span class="nt">&quot;input&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nt">&quot;output&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nt">&quot;cacheRead&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="p">,</span><span class="w"> </span><span class="nt">&quot;cacheWrite&quot;</span><span class="p">:</span><span class="w"> </span><span class="mi">0</span><span class="w"> </span><span class="p">}</span>
<span class="w">        </span><span class="p">}</span>
<span class="w">      </span><span class="p">]</span>
<span class="w">    </span><span class="p">}</span>
<span class="w">  </span><span class="p">}</span>
<span class="p">}</span>
</code></pre></div>

<p>The <code>apiKey</code> value here is the <em>name</em> of the env var, not the key itself—Pi looks up the value at runtime.</p>
<h3 id="2-add-the-launcher">2. Add the launcher<a class="header-anchor" href="#2-add-the-launcher" title="Link to this section" rel="nofollow">#</a></h3>
<p>Drop this into your shell rc (<code>~/.zshrc</code> or wherever you keep machine-specific functions). It assumes your macOS username matches your NetBadge ID; hardcode the Rivanna user if not.</p>
<div class="highlight"><pre><span></span><code><span class="nv">_UVA_SSHUTTLE_PID</span><span class="o">=</span>~/.pi/uva-sshuttle.pid
<span class="nv">_UVA_SSHUTTLE_HOST</span><span class="o">=</span><span class="s2">&quot;</span><span class="k">$(</span>whoami<span class="k">)</span><span class="s2">@login.hpc.virginia.edu&quot;</span>
<span class="nv">_UVA_SSHUTTLE_TARGETS</span><span class="o">=(</span>open-webui.rc.virginia.edu<span class="o">)</span>

_uva_tunnel_up<span class="o">()</span><span class="w"> </span><span class="o">{</span>
<span class="w">    </span>curl<span class="w"> </span>-sf<span class="w"> </span>-o<span class="w"> </span>/dev/null<span class="w"> </span>-m<span class="w"> </span><span class="m">3</span><span class="w"> </span><span class="se">\</span>
<span class="w">        </span>-H<span class="w"> </span><span class="s2">&quot;Authorization: Bearer </span><span class="nv">$UVARC_GenAI_API</span><span class="s2">&quot;</span><span class="w"> </span><span class="se">\</span>
<span class="w">        </span>https://open-webui.rc.virginia.edu/api/models
<span class="o">}</span>

pi-uva<span class="o">()</span><span class="w"> </span><span class="o">{</span>
<span class="w">    </span><span class="k">if</span><span class="w"> </span>_uva_tunnel_up<span class="p">;</span><span class="w"> </span><span class="k">then</span>
<span class="w">        </span>:<span class="w">  </span><span class="c1"># tunnel already up</span>
<span class="w">    </span><span class="k">else</span>
<span class="w">        </span><span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;→ Starting sshuttle to Rivanna (sudo required)...&quot;</span>
<span class="w">        </span>sudo<span class="w"> </span>-v<span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="m">1</span>
<span class="w">        </span>sudo<span class="w"> </span>sshuttle<span class="w"> </span>-D<span class="w"> </span>--pidfile<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$_UVA_SSHUTTLE_PID</span><span class="s2">&quot;</span><span class="w"> </span><span class="se">\</span>
<span class="w">            </span>-r<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$_UVA_SSHUTTLE_HOST</span><span class="s2">&quot;</span><span class="w"> </span><span class="s2">&quot;</span><span class="si">${</span><span class="nv">_UVA_SSHUTTLE_TARGETS</span><span class="p">[@]</span><span class="si">}</span><span class="s2">&quot;</span>
<span class="w">        </span><span class="nb">local</span><span class="w"> </span><span class="nv">i</span><span class="o">=</span><span class="m">0</span>
<span class="w">        </span><span class="k">until</span><span class="w"> </span>_uva_tunnel_up<span class="p">;</span><span class="w"> </span><span class="k">do</span>
<span class="w">            </span><span class="o">((</span>++i<span class="w"> </span>&gt;<span class="w"> </span><span class="m">15</span><span class="o">))</span><span class="w"> </span><span class="o">&amp;&amp;</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;✗ Tunnel didn&#39;t come up in 15s&quot;</span><span class="p">;</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="m">1</span><span class="p">;</span><span class="w"> </span><span class="o">}</span>
<span class="w">            </span>sleep<span class="w"> </span><span class="m">1</span>
<span class="w">        </span><span class="k">done</span>
<span class="w">        </span><span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;✓ Tunnel up&quot;</span>
<span class="w">    </span><span class="k">fi</span>
<span class="w">    </span>pi<span class="w"> </span>--provider<span class="w"> </span>uva<span class="w"> </span>--model<span class="w"> </span><span class="s2">&quot;Kimi K2.5&quot;</span><span class="w"> </span><span class="s2">&quot;</span><span class="nv">$@</span><span class="s2">&quot;</span>
<span class="o">}</span>

pi-uva-down<span class="o">()</span><span class="w"> </span><span class="o">{</span>
<span class="w">    </span><span class="o">[[</span><span class="w"> </span>-f<span class="w"> </span><span class="nv">$_UVA_SSHUTTLE_PID</span><span class="w"> </span><span class="o">]]</span><span class="w"> </span><span class="o">||</span><span class="w"> </span><span class="o">{</span><span class="w"> </span><span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;no tunnel&quot;</span><span class="p">;</span><span class="w"> </span><span class="k">return</span><span class="w"> </span><span class="m">0</span><span class="p">;</span><span class="w"> </span><span class="o">}</span>
<span class="w">    </span>sudo<span class="w"> </span><span class="nb">kill</span><span class="w"> </span><span class="s2">&quot;</span><span class="k">$(</span>&lt;<span class="nv">$_UVA_SSHUTTLE_PID</span><span class="k">)</span><span class="s2">&quot;</span><span class="w"> </span><span class="m">2</span>&gt;/dev/null
<span class="w">    </span>sudo<span class="w"> </span>rm<span class="w"> </span>-f<span class="w"> </span><span class="s2">&quot;</span><span class="nv">$_UVA_SSHUTTLE_PID</span><span class="s2">&quot;</span>
<span class="w">    </span><span class="nb">echo</span><span class="w"> </span><span class="s2">&quot;tunnel down&quot;</span>
<span class="o">}</span>
</code></pre></div>

<h3 id="3-use-it">3. Use it<a class="header-anchor" href="#3-use-it" title="Link to this section" rel="nofollow">#</a></h3>
<div class="highlight"><pre><span></span><code><span class="nb">source</span><span class="w"> </span>~/.zshrc<span class="w">        </span><span class="c1"># or open a new terminal</span>
pi-uva
</code></pre></div>

<p>First run prompts for sudo (sshuttle needs it for pf rules on macOS). The tunnel persists across <code>pi-uva</code> invocations until you run <code>pi-uva-down</code> or reboot. The launcher checks tunnel health by hitting the API rather than the pidfile (the pidfile is owned by root, so <code>kill -0</code> from your user fails with EPERM and would falsely report the tunnel down).</p>
<h2 id="notes">Notes<a class="header-anchor" href="#notes" title="Link to this section" rel="nofollow">#</a></h2>
<ul>
<li><strong>Bash users.</strong> Works with minor tweaks (replace <code>[[ ... ]]</code> and the zsh array syntax).</li>
<li><strong>Linux users.</strong> sshuttle uses iptables instead of pf automatically.</li>
<li><strong>Other CLIs.</strong> Any tool that takes a custom OpenAI-compatible base URL drops in. <code>aichat -m uva-kimi</code> once configured, <code>llm -m uva-kimi</code>, etc. Same env-var trick for the key.</li>
<li><strong>API-key hygiene.</strong> Do not commit your token. Put <code>export UVARC_GenAI_API=...</code> in <code>~/.env</code>, source it from your shell rc, and gitignore <code>~/.env</code> globally.</li>
<li><strong>If the network gating gets relaxed later.</strong> Skip the sshuttle step—pi will reach the endpoint directly (assuming you&rsquo;re still on UVA Anywhere VPN). The <code>models.json</code> block is unchanged.</li>
</ul>
<h2 id="see-also">See also<a class="header-anchor" href="#see-also" title="Link to this section" rel="nofollow">#</a></h2>
<ul>
<li><a href="https://www.rc.virginia.edu/userinfo/rcgenai-userguide/" rel="nofollow">UVA RC GenAI user guide</a></li>
<li><a class="wikilink" href="/wiki/Claude-Code/" rel="nofollow">Claude Code</a></li>
<li><a href="https://github.com/badlogic/pi-mono" rel="nofollow">Pi coding agent</a> (<code>badlogic/pi-mono</code>)</li>
<li><a href="https://github.com/sshuttle/sshuttle" rel="nofollow">sshuttle</a></li>
</ul>]]></content>
    
  </entry>
  
  <entry>
    <title>Rose Hill Drive: You get the traffic you design for</title>
    <link href="https://yyahn.com/wiki/blog/20260412-Rose-Hill-Drive/" rel="alternate" type="text/html"/>
    <id>https://yyahn.com/wiki/blog/20260412-Rose-Hill-Drive/</id>
    <published>2026-04-12T00:00:00Z</published>
    <updated>2026-04-12T21:06:42Z</updated>
    
    <content type="html"><![CDATA[<p>Rose Hill Drive is one of the key north-south corridors in Charlottesville, running between Preston Avenue and Rugby Road/Barracks Road. It sits between UVA and downtown, and provides access to Charlottesville High School, the YMCA, and the city center. How this road is designed matters for a lot of people.</p>
<p>The city is studying improvements ahead of a 2027 repaving. Here&rsquo;s the <a href="https://connect.charlottesville.gov/RoseHillRestriping" rel="nofollow">project page</a> with traffic data, crash history, and a timeline for community input—the next open house is tomorrow <strong>(April 13)</strong> at the <strong>Carver Rec Center from 5:30–7:30pm</strong>!</p>
<p>Looking at the project materials, many people noticed two concerns that I think deserve attention.</p>
<h2 id="safety-vs-volume-is-a-false-choice">&ldquo;Safety&rdquo; vs. &ldquo;volume&rdquo; is a false choice<a class="header-anchor" href="#safety-vs-volume-is-a-false-choice" title="Link to this section" rel="nofollow">#</a></h2>
<p>The page frames safety improvements and traffic volume as two separate considerations to balance. But they don&rsquo;t have to be, and in fact they can go hand in hand.</p>
<p>This framing quietly assumes that &ldquo;traffic volume&rdquo; means &ldquo;how many cars can move through&rdquo;—a textbook case of <em><a class="wikilink" href="/wiki/Motonormativity/" rel="nofollow">motonormativity</a></em>, the invisible bias that treats car traffic as the default and only kind of traffic that counts.</p>
<p>When we consider &ldquo;traffic volume&rdquo; we need to think about the number of <strong>people</strong>, not the number of cars! Personal vehicles are just one of the transportation options. A person on a bike takes a fraction of the space of a person in a car. A bus carries 40 people in the footprint of a few SUVs. Sidewalks and light-rails are supremely more space efficient and carry 10 times or more people if we dedicate the street space to them. </p>
<figure style="text-align: center;">
<img src="https://live.staticflickr.com/8456/7999510360_8e46299621_b.jpg" alt="69 people by bus, bike, and car" width="500">
<figcaption>69 people transported by bus, bike, and car. Four lanes of car traffic carries the same number of people as a single bus or half a lane of cyclists. Photo by <a href="https://www.flickr.com/photos/danielbowen/7999510360">Cycling Promotion Fund, Canberra</a> (CC BY-NC-SA 2.0).</figcaption>
</figure>

<p>When you measure volume in people rather than vehicles, safety improvements like bike lanes and transit priority <em>increase</em> the street&rsquo;s capacity while making the streets much safer. Furthermore, as streets get safer with other modes, the more people use those other options, reducing the traffic as a result. </p>
<p><strong>Safer streets are more efficient streets; safer streets can move much higher people-traffic volume.</strong></p>
<p>The real trade-off isn&rsquo;t safety vs. volume. It&rsquo;s safety vs. the speed and convenience of a single mode—driving. And when you make that trade-off explicit, the answer becomes obvious.</p>
<h2 id="the-projection-is-a-self-fulfilling-prophecy">The projection is a self-fulfilling prophecy<a class="header-anchor" href="#the-projection-is-a-self-fulfilling-prophecy" title="Link to this section" rel="nofollow">#</a></h2>
<p>The project page projects Rose Hill&rsquo;s traffic will grow from ~7,600 to ~9,900 vehicles per day by 2055—roughly 1% annual growth over 30 years. Where does this number come from? The methodology isn&rsquo;t documented on the project page, but it&rsquo;s consistent with a standard compound growth factor applied to current counts. </p>
<p>This is really problematic. And it is not about crude projection. There is a fundamental issue that cannot be addressed by sophisticated traffic modeling. </p>
<p>The projection implies that future traffic is something that <strong><em>happens to</em></strong> a road. But traffic demand is not weather. Future traffic depends overwhelmingly on how the road is designed. This is <a class="wikilink" href="/wiki/Induced-demand/" rel="nofollow">induced demand</a> at work: build for more cars, and more cars will come; build for people walking and biking, and people will walk and bike. </p>
<p>Although the projection is a <strong>self-fulfilling prophecy</strong>, it has been used as a <strong>justification</strong> to widen the road and buldoze low-income neighborhoods.</p>
<p>If you design Rose Hill Drive for 9,900 cars a day, you&rsquo;ll get 9,900 cars a day. If you design it for safe, comfortable cycling and walking, you&rsquo;ll get more people cycling and walking—and fewer cars. The projection doesn&rsquo;t tell us what <em>will</em> happen. It tells us what will happen <em>if we keep designing for cars</em>. That&rsquo;s not a forecast; it&rsquo;s <em>a choice disguised as a forecast</em>.</p>
<h3 id="the-double-standard">The double standard<a class="header-anchor" href="#the-double-standard" title="Link to this section" rel="nofollow">#</a></h3>
<p>And notice the asymmetry: some projections argue that the US <a class="wikilink" href="/wiki/Bike/Ebike/" rel="nofollow">ebike</a> market is growing at <a href="https://www.grandviewresearch.com/industry-analysis/us-e-bike-market-report" rel="nofollow">~15% CAGR</a>—far faster than the 1% car traffic growth projected here. Yet no one is using that projection to justify a massive expansion of bikeways. That&rsquo;s <a class="wikilink" href="/wiki/Motonormativity/" rel="nofollow">motonormativity</a> again: car traffic growth is treated as <em>inevitable</em>, <em>what will happen to us</em>, and worth planning for, while the explosive growth of other modes is completely ignored.</p>
<h2 id="what-rose-hill-drive-should-be">What Rose Hill Drive should be<a class="header-anchor" href="#what-rose-hill-drive-should-be" title="Link to this section" rel="nofollow">#</a></h2>
<p>Rose Hill currently carries 6,000–7,600 vehicles per day. With 35 crashes in the past 8 years—including incidents involving pedestrians and cyclists—the 2027 repaving is an opportunity to build for the future. The road that is most convenient for driving—wide, multi-lane, no traffic calming—is the least safe and least efficient option, and it will induce more traffic. The road where transit, cycling, and walking are prioritized is the safest and most efficient option, carrying far more people while reducing traffic and crashes everywhere. The choice should be clear.</p>
<p>If you&rsquo;re in Charlottesville, consider showing up tomorrow and communicating these messages. These decisions shape the neighborhood for decades.</p>
<p>yy</p>
<p><img src="https://hdp-us-prod-app-cville-engage-files.s3.us-west-2.amazonaws.com/1617/7489/5200/Rose_Hill___Planning_Pop-up_Flyer.jpg" alt="Rose Hill Drive Planning Pop-up Flyer" width="400"></p>
<p>I posted this on <a href="https://bsky.app/profile/yyahn.bsky.social/post/3mjdarlpegs2y" rel="nofollow">Bluesky</a> too, if you want to chime in.</p>]]></content>
    
  </entry>
  
  <entry>
    <title>XY problem</title>
    <link href="https://yyahn.com/wiki/XY-problem/" rel="alternate" type="text/html"/>
    <id>https://yyahn.com/wiki/XY-problem/</id>
    <published>2026-04-11T00:00:00Z</published>
    <updated>2026-04-11T20:28:30Z</updated>
    
    <content type="html"><![CDATA[<p>A communication/problem-solving anti-pattern: you have problem X, you guess that Y might solve it, and you ask about Y instead of X. The responder helps with Y, but Y is the wrong approach for X — so the real problem stays unsolved while everyone wastes time on the wrong question. </p>
<p>The fix: describe the underlying problem (X) before asking about a candidate solution (Y) and provide more context to your question. </p>
<ul>
<li><a href="https://en.wikipedia.org/wiki/XY_problem" rel="nofollow">https://en.wikipedia.org/wiki/XY_problem</a></li>
<li><a href="https://xyproblem.info/" rel="nofollow">https://xyproblem.info/</a></li>
<li><a href="https://www.threads.com/@nomad__surfer_97/post/DW2UvmQkuQE" rel="nofollow">https://www.threads.com/@nomad__surfer_97/post/DW2UvmQkuQE</a></li>
</ul>]]></content>
    
  </entry>
  

  
  <entry>
    <title>Recently Updated Pages</title>
    <link href="https://yyahn.com/wiki/" rel="alternate" type="text/html"/>
    <id>https://yyahn.com/feed/updates/2026-05-10</id>
    <published>2026-05-10T00:00:00Z</published>
    <updated>2026-05-10T00:00:00Z</updated>
    <content type="html"><![CDATA[<p>The following pages were recently updated:</p>
<ul>
  <li><a href="https://yyahn.com/wiki/Bike-parking-at-urban-grocery-stores/">Why urban grocery stores should prioritize bike parking over car parking</a> - 2026-05-10</li>
  <li><a href="https://yyahn.com/wiki/Software/foliate/">foliate</a> - 2026-05-07</li>
  <li><a href="https://yyahn.com/wiki/Paper/Kim2026uncovering/">Kim et al., &quot;Uncovering simultaneous breakthroughs with a robust measure of disruptiveness&quot; (2026)</a> - 2026-05-07</li>
  <li><a href="https://yyahn.com/wiki/OmniFocus/">OmniFocus</a> - 2026-05-04</li>
  <li><a href="https://yyahn.com/wiki/Claude-Code/">Claude Code</a> - 2026-04-29</li>
  <li><a href="https://yyahn.com/wiki/Cost-of-car-ownership/">Cost of car ownership: the million-dollar decision you&#x27;re not thinking about</a> - 2026-04-29</li>
  <li><a href="https://yyahn.com/wiki/LaTeX/Pet-peeves/">LaTeX Pet peeves</a> - 2026-04-27</li>
  <li><a href="https://yyahn.com/wiki/Bike/Ebike/">Ebike</a> - 2026-04-27</li>
  <li><a href="https://yyahn.com/wiki/Claude-Scholar/">Claude Scholar plugin</a> - 2026-04-26</li>
  <li><a href="https://yyahn.com/wiki/Claude-Code/Tips/">Claude Code: Tips</a> - 2026-04-21</li>
  <li><a href="https://yyahn.com/wiki/Claude-Code/Skills/">Claude Code: Skills</a> - 2026-04-19</li>
  <li><a href="https://yyahn.com/wiki/Software/Ghostty/">Ghostty</a> - 2026-04-19</li>
  <li><a href="https://yyahn.com/wiki/Software/cmux/">cmux</a> - 2026-04-19</li>
  <li><a href="https://yyahn.com/wiki/Traffic-evaporation/">Traffic evaporation</a> - 2026-04-12</li>
  <li><a href="https://yyahn.com/wiki/Traffic-calming/">Traffic calming</a> - 2026-04-11</li>
</ul>]]></content>
  </entry>
  
</feed>