<?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: xknk</title>
    <description>The latest articles on DEV Community by xknk (@xknk).</description>
    <link>https://dev.to/xknk</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%2F4074170%2F3ddc1309-658b-4240-9f00-6ac684d11198.png</url>
      <title>DEV Community: xknk</title>
      <link>https://dev.to/xknk</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/xknk"/>
    <language>en</language>
    <item>
      <title>My repo takes the lunch shift: I go eat, it does the chores</title>
      <dc:creator>xknk</dc:creator>
      <pubDate>Thu, 22 Oct 2026 06:26:45 +0000</pubDate>
      <link>https://dev.to/xknk/my-repo-takes-the-lunch-shift-i-go-eat-it-does-the-chores-3boe</link>
      <guid>https://dev.to/xknk/my-repo-takes-the-lunch-shift-i-go-eat-it-does-the-chores-3boe</guid>
      <description>&lt;p&gt;This is a submission for the Hacktoberfest Open-Source AI Challenge Week 3: Slow and Steady.&lt;/p&gt;

&lt;p&gt;Over the past couple of months I built myself a coding agent — &lt;a href="https://github.com/xknk/deepseeker-code" rel="noopener noreferrer"&gt;deepseeker-code&lt;/a&gt;, an open-source CLI + VSCode extension powered by open-weight DeepSeek models. It writes code, runs tools, passes tests. Naturally, I mostly used it to build more software.&lt;/p&gt;

&lt;p&gt;Then I noticed the laziest possible use of a coding agent had been staring at me the whole time: every repo I own carries a pile of chores I never do. Fix this TODO. Write the LICENSE. Add a test. None of them is worth a context switch. All of them together are why my repos feel untidy.&lt;/p&gt;

&lt;p&gt;So I built &lt;a href="https://github.com/xknk/lunchshift" rel="noopener noreferrer"&gt;lunchshift&lt;/a&gt; — a small CLI whose entire purpose is to let a repo work its own shift while I eat.&lt;/p&gt;

&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Three commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;lunchshift scan                     &lt;span class="c"&gt;# free, deterministic: find chores, write agent tickets&lt;/span&gt;
lunchshift run &lt;span class="nt"&gt;--window&lt;/span&gt; 12:00-14:00 &lt;span class="c"&gt;# hand them to the agent, go eat&lt;/span&gt;
lunchshift report                   &lt;span class="c"&gt;# what got done, and what it cost&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;scan&lt;/code&gt; is deliberately dumb: it globs source files for &lt;code&gt;TODO:&lt;/code&gt; / &lt;code&gt;FIXME:&lt;/code&gt; / &lt;code&gt;HACK:&lt;/code&gt; markers and checks three hygiene basics — README, LICENSE, test script. No API calls, no cost, no opinions. Each finding becomes a ticket, which is just markdown with frontmatter:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;span class="na"&gt;title&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Resolve&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;FIXME&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;in&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;src/report.js&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;(line&lt;/span&gt;&lt;span class="nv"&gt; &lt;/span&gt;&lt;span class="s"&gt;23)"&lt;/span&gt;
&lt;span class="na"&gt;accept&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="s"&gt;npm test&lt;/span&gt;
&lt;span class="na"&gt;budget-yuan&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0.3&lt;/span&gt;
&lt;span class="na"&gt;timeout-min&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;
&lt;span class="nn"&gt;---&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two fields carry the whole design. &lt;code&gt;accept&lt;/code&gt; is the shell command that proves the work actually happened — the agent's own claim is never the acceptance criterion. &lt;code&gt;budget-yuan&lt;/code&gt; is a hard spend cap: when a ticket burns past its budget, the run stops and says so.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;run&lt;/code&gt; hands the tickets to the deepseeker-code agent, which works through them serially in isolated git worktrees. Nothing touches your branch until a human looks at it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Today's actual shift
&lt;/h2&gt;

&lt;p&gt;Here is the unedited summary of the shift I ran earlier today, on the lunchshift repo itself:&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%2Fbroxn7oq65wjtdopmwiw.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%2Fbroxn7oq65wjtdopmwiw.png" alt="the run summary" width="800" height="437"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Three tickets: one TODO found by scan (it turned into a real CLI feature), one planted trap, one hand-written feature request. 5.8 minutes, completely unattended. When I came back:&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%2Fppt4u951hk9r8hqye3ox.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%2Fppt4u951hk9r8hqye3ox.png" alt="the report" width="800" height="242"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The lazy payoff, with receipts
&lt;/h2&gt;

&lt;p&gt;Every ticket settles with a receipt — rounds, cost, cache hit rate, wall time. Today's:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;ticket&lt;/th&gt;
&lt;th&gt;rounds&lt;/th&gt;
&lt;th&gt;cost&lt;/th&gt;
&lt;th&gt;cache hit&lt;/th&gt;
&lt;th&gt;time&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;
&lt;code&gt;--budget-yuan&lt;/code&gt; / &lt;code&gt;--timeout-min&lt;/code&gt; CLI flags&lt;/td&gt;
&lt;td&gt;22&lt;/td&gt;
&lt;td&gt;¥0.118&lt;/td&gt;
&lt;td&gt;97%&lt;/td&gt;
&lt;td&gt;1.7 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;fixture TODO (a trap — see below)&lt;/td&gt;
&lt;td&gt;30&lt;/td&gt;
&lt;td&gt;¥0.166&lt;/td&gt;
&lt;td&gt;89%&lt;/td&gt;
&lt;td&gt;3.9 min&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;pass/fail verdicts in &lt;code&gt;report&lt;/code&gt;
&lt;/td&gt;
&lt;td&gt;34&lt;/td&gt;
&lt;td&gt;¥0.277&lt;/td&gt;
&lt;td&gt;97%&lt;/td&gt;
&lt;td&gt;4.6 min&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That second shift cost &lt;strong&gt;¥0.56, about eight US cents&lt;/strong&gt;, most of it inside DeepSeek's off-peak discount window. Across two shifts today: five chores resolved, &lt;strong&gt;¥0.80 total — roughly eleven cents&lt;/strong&gt;, with a hard cap of ¥0.3 per ticket that the priciest ticket finished under at 92%.&lt;/p&gt;

&lt;p&gt;The economics are the point. Unattended agent work only makes sense if a "shift" costs less than the coffee you drink during it — and open-weight models are what get it there.&lt;/p&gt;

&lt;h2&gt;
  
  
  The ticket that lied
&lt;/h2&gt;

&lt;p&gt;One of today's TODOs was a trap. The file &lt;code&gt;test/fixtures/mini/sample.js&lt;/code&gt; contains &lt;code&gt;// TODO: nothing to see here&lt;/code&gt; — planted test data. If an agent "resolves" it by deleting the marker, the scanner's own test suite fails, and acceptance rejects the ticket.&lt;/p&gt;

&lt;p&gt;The agent read the test, read the scanner's regex, worked out that the marker must survive, and instead replaced the misleading comment with a self-documenting one — keeping the &lt;code&gt;TODO:&lt;/code&gt; prefix the test asserts on. One line changed, tests green. The ticket lied; the acceptance command didn't.&lt;/p&gt;

&lt;h2&gt;
  
  
  The claim it walked back
&lt;/h2&gt;

&lt;p&gt;The best part of today's run: in the first shift, the agent had left a note in &lt;code&gt;report.js&lt;/code&gt; explaining that per-ticket pass/fail verdicts &lt;em&gt;could not&lt;/em&gt; be surfaced, because done reports carry no machine-readable verdict field. That was wrong — the batch runner writes &lt;code&gt;status:&lt;/code&gt; into every report's frontmatter. So shift two got a hand-written ticket with that hint attached. It shipped the feature — plus 86 lines of tests — for ¥0.277, inside its budget.&lt;/p&gt;

&lt;p&gt;An agent that doubts something at 9 AM can be handed its own doubt as a ticket and retire it by lunch. That feedback loop is the whole product.&lt;/p&gt;

&lt;h2&gt;
  
  
  Why open-source AI is load-bearing here
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Open-weight models make the economics work.&lt;/strong&gt; Unattended micro-shifts only make sense at DeepSeek's price point; with pricier APIs the budget caps would dominate every run.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;The harness is inspectable.&lt;/strong&gt; Every safety gate — acceptance commands, budget truncation, worktree isolation, "nothing lands on your branch" — is code you can read in the &lt;a href="https://github.com/xknk/deepseeker-code" rel="noopener noreferrer"&gt;deepseeker-code&lt;/a&gt; repo, not a promise in a privacy policy.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Local-first by design.&lt;/strong&gt; lunchshift is a single-person local tool. Your code sits in a worktree on your disk; the only thing that leaves your machine is what any LLM call has to send.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Honest limits
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;The scanner only finds chores that are literally visible: comment markers and three hygiene checks. It will not invent work — which also means it will not find your architecture problems.&lt;/li&gt;
&lt;li&gt;The agent is good but not infallible. That is exactly why every ticket carries an acceptance command and a budget, and why worktree changes come back as proposals, not commits. (They genuinely arrive uncommitted — reviewing and merging them is the human's half of the shift. This post's demo changes were kept exactly that way.)&lt;/li&gt;
&lt;li&gt;v0.1 targets npm-flavored JavaScript/TypeScript repos, and the scanner speaks Windows and Unix paths unequally well. Early days.&lt;/li&gt;
&lt;/ul&gt;

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

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;lunchshift&lt;/strong&gt;: &lt;a href="https://github.com/xknk/lunchshift" rel="noopener noreferrer"&gt;github.com/xknk/lunchshift&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;the agent harness underneath&lt;/strong&gt;: &lt;a href="https://github.com/xknk/deepseeker-code" rel="noopener noreferrer"&gt;github.com/xknk/deepseeker-code&lt;/a&gt; (also on npm as &lt;code&gt;deepseeker-code&lt;/code&gt;)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The most honest thing I can say about it: today I watched an agent complete a shift in my repo for less than the cost of a bottle of water — and one of its three tickets was spent correcting the previous shift's agent. Slow, steady, and cheap enough to be lazy about it. 🦥&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>hf26challenge</category>
      <category>hacktoberfest</category>
      <category>productivity</category>
    </item>
  </channel>
</rss>
