<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://vedant2100.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://vedant2100.github.io/" rel="alternate" type="text/html" /><updated>2026-10-25T19:48:11+00:00</updated><id>https://vedant2100.github.io/feed.xml</id><title type="html">Vedant Borkute | AI Systems &amp;amp; Data Science</title><subtitle>Vedant Borkute&apos;s portfolio of AI systems, data science, and research</subtitle><author><name>Vedant Borkute</name><email>vbork001@ucr.edu</email></author><entry><title type="html">Future Blog Post</title><link href="https://vedant2100.github.io/posts/2012/08/blog-post-4/" rel="alternate" type="text/html" title="Future Blog Post" /><published>2199-01-01T00:00:00+00:00</published><updated>2199-01-01T00:00:00+00:00</updated><id>https://vedant2100.github.io/posts/2012/08/future-post</id><content type="html" xml:base="https://vedant2100.github.io/posts/2012/08/blog-post-4/"><![CDATA[<p>This post will show up by default. To disable scheduling of future posts, edit <code class="language-plaintext highlighter-rouge">config.yml</code> and set <code class="language-plaintext highlighter-rouge">future: false</code>.</p>]]></content><author><name>Vedant Borkute</name><email>vbork001@ucr.edu</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[This post will show up by default. To disable scheduling of future posts, edit config.yml and set future: false.]]></summary></entry><entry><title type="html">Can Dueling DQN Stabilize Self-Improving Code? A Colab Experiment</title><link href="https://vedant2100.github.io/posts/rl-codelab-rsi/" rel="alternate" type="text/html" title="Can Dueling DQN Stabilize Self-Improving Code? A Colab Experiment" /><published>2026-10-21T00:00:00+00:00</published><updated>2026-10-21T00:00:00+00:00</updated><id>https://vedant2100.github.io/posts/rl-codelab-recursive-code-optimization</id><content type="html" xml:base="https://vedant2100.github.io/posts/rl-codelab-rsi/"><![CDATA[<p><em>I tested an idea from reinforcement learning against a small, real program-optimization loop: can a slowly updated critic help a system choose better improvements to its own code? The answer is less conclusive than the best-looking bar chart.</em></p>

<p><a href="https://colab.research.google.com/github/Vedant2100/vedant2100.github.io/blob/master/projects/rl-recursive-code-optimizer/RSI_CodeLab_Colab.ipynb"><strong>Open the reproducible Colab notebook</strong></a> · <a href="https://github.com/Vedant2100/vedant2100.github.io/tree/master/projects/rl-recursive-code-optimizer"><strong>Source and methodology</strong></a> · <a href="https://github.com/Vedant2100/vedant2100.github.io/blob/master/projects/rl-recursive-code-optimizer/results/codelab_heldout_results.csv"><strong>Raw held-out results</strong></a></p>

<h2 id="the-motivation-a-moving-evaluator">The motivation: a moving evaluator</h2>

<p>In DQN, a model learns from bootstrapped targets based on estimates from another model. If the estimating network and its target change rapidly together, training can oscillate. A target network, Double DQN, and the dueling value/advantage architecture address different aspects of that instability.</p>

<p>Recursive self-improvement (RSI) systems face a superficially similar issue: they propose modifications, use measurements to decide which to keep, and then propose further modifications from the changed system. I wanted to test the <em>mechanism</em>, not assume the analogy was already proven.</p>

<p>The question I put into code was:</p>

<blockquote>
  <p>If a controller learns to pick successive program optimizations, do RL target-network techniques improve its ability to choose good modifications on workloads it has not trained on?</p>
</blockquote>

<p>That is narrower than creating a self-improving language model. It is a useful engineering question, however, because it forces an evaluator, candidate modifications, real execution, regression checks, and a held-out test.</p>

<h2 id="the-executable-code-gym">The executable code gym</h2>

<p>I implemented k-nearest-neighbor search with 24 configurations assembled from executable NumPy building blocks: naive broadcasting, matrix-multiplication distance computation, chunked matrix multiplication, full sorting versus partial selection, and precision/chunk-size choices. Not every configuration is a distinct source-level algorithm: chunk size does not affect the non-chunked variants.</p>

<p>At each step, the controller can propose one of six edits to the current program configuration. We execute <em>each candidate family</em> on benchmark workloads beforehand, check that its nearest-neighbor indices match a double-precision brute-force reference, and cache measured latencies. During RL training, action feedback comes from that table of real runs. A faster valid edit is accepted; a slower edit is rejected. Each episode allows five proposals.</p>

<p>The distinction matters: <strong>the RL rollout uses cached measurements, not live recompilation, and no LLM writes the source code.</strong> This isolates the edit-selection problem while keeping the reward attached to working code.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>current kNN implementation
        │
        ▼
RL controller picks a code edit
        │
        ▼
candidate configuration → verified measured latency
        │
        ├─ faster and correct → accept
        └─ slower or incorrect → reject
        │
        ▼
log speed improvement → replay buffer → Q-network update
        └───────────────────────────────────────────┐
                         next edit ◀────────────────┘
</code></pre></div></div>

<h2 id="what-i-ablated">What I ablated</h2>

<p>Every policy gets a five-edit budget on the same initial code. I trained on four input shapes, froze network parameters, and measured outcomes on three different held-out shapes. Six seeded runs per method yielded 90 held-out method/workload/seed outcomes.</p>

<table>
  <thead>
    <tr>
      <th>Arm</th>
      <th>Key mechanism</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Random edits</td>
      <td>No learned controller</td>
    </tr>
    <tr>
      <td>Online-only DQN</td>
      <td>Bootstrap from the live Q-network</td>
    </tr>
    <tr>
      <td>Target DQN</td>
      <td>Periodically copied target network</td>
    </tr>
    <tr>
      <td>Double DQN</td>
      <td>Online argmax, hard-target evaluation</td>
    </tr>
    <tr>
      <td>Dueling Double DQN + EMA</td>
      <td>Separate value and advantage streams, Double DQN, slowly updated target</td>
    </tr>
  </tbody>
</table>

<p>All learned methods use replay, the same network-width budget, 75 training episodes per seed, and the same action budget at test time. The combined arm is <em>not</em> a clean single-variable test of dueling or EMA, and should not be interpreted as one.</p>

<p>The connected Colab runtime was a <strong>Tesla T4</strong>. PyTorch used its GPU for network training; the benchmarked NumPy kernels ran on the runtime’s CPU. The six notebook code cells all executed, with <strong>96/96 calibration and 72/72 held-out correctness checks passing</strong>.</p>

<h2 id="the-results">The results</h2>

<p><img src="/images/rsi-codelab-heldout.svg" alt="Held-out five-edit speedup chart" /></p>

<table>
  <thead>
    <tr>
      <th>Method</th>
      <th style="text-align: right">Geometric mean speedup against original code</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Random</td>
      <td style="text-align: right"><strong>10.22×</strong></td>
    </tr>
    <tr>
      <td>Online-only DQN</td>
      <td style="text-align: right"><strong>12.38×</strong></td>
    </tr>
    <tr>
      <td>Hard-target DQN</td>
      <td style="text-align: right"><strong>12.26×</strong></td>
    </tr>
    <tr>
      <td>Double DQN</td>
      <td style="text-align: right"><strong>12.21×</strong></td>
    </tr>
    <tr>
      <td>Dueling Double DQN + EMA</td>
      <td style="text-align: right"><strong>12.02×</strong></td>
    </tr>
  </tbody>
</table>

<p>On a fresh Colab T4 rerun, <strong>online-only DQN ranked first</strong>, with a geometric 12.38× speedup versus 10.22× for random. Its seed-paired mean log-speedup difference was <strong>+0.191</strong>. A two-sided Wilcoxon comparison yielded <strong>p = 0.0625 before correction</strong>; with Holm correction for the four comparisons, <strong>all adjusted p-values were 0.25</strong>. In this rerun the combined dueling/Double/EMA model ranked below each other learned controller. This variability itself is a reason not to overinterpret any single run.</p>

<p><strong>My conclusion is not that soft updates work for RSI.</strong> The rerun found no statistically reliable improvement from target networks, and its ranking reversed the earlier run. It cannot disentangle which of the combined mechanisms matters, and six seeds are too few for confidence. The large absolute speedups are unsurprising because the original program intentionally uses a costly broadcast distance computation; optimizing that baseline does not establish an advance over an optimized nearest-neighbor library.</p>

<h2 id="the-most-important-failure-modes">The most important failure modes</h2>

<p><strong>Cached metrics create a simpler world than an autonomous agent faces.</strong> In real automated AI research, a proposed change might require training, cause nondeterministic failures, or exploit the evaluator. Here the entire finite family can be benchmarked in advance. That makes this a test of RL <em>selection</em>, not automated hypothesis discovery.</p>

<p><strong>Correctness is necessary but not sufficient.</strong> The oracle checks exact neighbor indices on sampled inputs. Production-ready optimizations would need much broader correctness and numerical-stability tests, different hardware, resource limits, and careful measurement methodology.</p>

<p><strong>Held-out workload shapes are not held-out code families.</strong> Every held-out evaluation still chooses among the same 24 implementation configurations. Transfer to new algorithm families remains unknown.</p>

<p><strong>The comparison combines mechanisms.</strong> Dueling Double DQN + EMA outperformed the random baseline descriptively. That does not identify whether dueling, Double DQN, EMA, replay, or random variation drove the outcome. A factorial ablation with many more seeds would be needed.</p>

<h2 id="connection-to-the-larger-research-problem">Connection to the larger research problem</h2>

<p><a href="https://arxiv.org/abs/2505.22954">Darwin Gödel Machine</a> uses empirical feedback to evolve coding agents. <a href="https://arxiv.org/abs/2609.24972">RRSI</a> studies regularized evolution of an agent’s harness and shows why improvement on the evolution tasks can fail to transfer. <a href="https://arxiv.org/abs/2310.12931">Eureka</a> uses LLM-authored code in an iterative reward-design loop. These are much richer systems than this notebook.</p>

<p>The next meaningful test would let an LLM propose <strong>genuinely new code patches</strong>, run sandboxed tests and performance measurements, and train a conservative controller to choose which hypotheses to spend the next compute budget on. At that point we could compare a frozen critic, EMA teacher, Double DQN, and acceptance gates while measuring both performance and harmful regressions. Such a study would need leakage-resistant held-out tasks and budget-matched search.</p>

<p>For now, the outcome is a working and auditable <strong>RL-governed code-optimization prototype</strong>. The most transferable lesson is methodological: verify that improvements actually run, separate calibration from held-out evaluation, publish negative results, and avoid inferring a new algorithm from one appealing chart.</p>

<p><strong><a href="https://github.com/Vedant2100/vedant2100.github.io/blob/master/projects/rl-recursive-code-optimizer/RSI_CodeLab_Colab.ipynb">Notebook</a></strong> · <strong><a href="https://github.com/Vedant2100/vedant2100.github.io/tree/master/projects/rl-recursive-code-optimizer/results">CSV data and exact statistical report</a></strong> · <strong><a href="https://github.com/Vedant2100/vedant2100.github.io/blob/master/projects/rl-recursive-code-optimizer/README.md">Methodology and reproduction</a></strong></p>]]></content><author><name>Vedant Borkute</name><email>vbork001@ucr.edu</email></author><category term="reinforcement-learning" /><category term="recursive-self-improvement" /><category term="research-engineering" /><category term="code-optimization" /><category term="ablation" /><summary type="html"><![CDATA[I tested an idea from reinforcement learning against a small, real program-optimization loop: can a slowly updated critic help a system choose better improvements to its own code? The answer is less conclusive than the best-looking bar chart.]]></summary></entry><entry><title type="html">What survives when a model learns something new?</title><link href="https://vedant2100.github.io/posts/continual-agent-learning/" rel="alternate" type="text/html" title="What survives when a model learns something new?" /><published>2026-10-19T00:00:00+00:00</published><updated>2026-10-19T00:00:00+00:00</updated><id>https://vedant2100.github.io/posts/continual-agent-learning-and-memory-gates</id><content type="html" xml:base="https://vedant2100.github.io/posts/continual-agent-learning/"><![CDATA[<h2 id="tldr">TL;DR</h2>

<p>A model can learn a new task and, in the process, lose something it previously knew. We tested this under a simple, controlled sequence of five classification tasks built from <strong>1,797 real handwritten digit images</strong>. An online classifier trained only on the newest task retained just <strong>19.0%</strong> accuracy across all previously seen digit classes at the end. Keeping a small memory of earlier examples changed the outcome: rehearsal achieved <strong>91.3%</strong>, and a retrieval-only memory achieved <strong>93.0%</strong>. These are measured averages across three seeded runs, not illustrative values.</p>

<p>The result is useful as a concrete illustration of <em>catastrophic forgetting</em>. It is <strong>not</strong> evidence that the same approaches improve LLMs or coding agents. The purpose here was to examine the retention–adaptation tradeoff before attempting an agent-scale evaluation.</p>

<h2 id="question">1. The question</h2>

<p>Suppose a system works well today, encounters a new task tomorrow, and changes how it behaves. That change might live in its model weights, in a replay buffer used during training, or in an external memory consulted at inference time. All three can help it adapt, but they preserve old abilities in different ways.</p>

<p>The difficulty is that performance on the <em>latest</em> task is not a reliable measure of continual learning. A system might score highly on its new task while failing at an old one. To see that failure rather than hide it, we need to evaluate earlier tasks again after each new training stage.</p>

<p>For this first experiment, we deliberately use a small real-world classification setting instead of an expensive agent benchmark. This isolates the question of retention; it does not pretend that classifying digits captures every complication of learning from agent trajectories.</p>

<h2 id="setup">2. Experimental setup</h2>

<h3>2.1 Dataset and task sequence</h3>

<p>The data are the <a href="https://archive.ics.uci.edu/dataset/80/optical+recognition+of+handwritten+digits">UCI Optical Recognition of Handwritten Digits</a> images, loaded through <code>sklearn.datasets.load_digits()</code>. There are 1,797 authentic handwritten examples, each represented by 64 pixel intensities. No synthetic or handwritten-for-this-demo evaluation cases were added.</p>

<p>Each seed has a stratified <strong>75% training / 25% held-out testing</strong> split. The learner sees five tasks in this fixed order:</p>

<div class="table-responsive">
<table>
<thead><tr><th>Stage</th><th>New digit classes</th><th>Classes evaluated afterwards</th></tr></thead>
<tbody>
<tr><td>1</td><td>0, 1</td><td>0–1</td></tr>
<tr><td>2</td><td>2, 3</td><td>0–3</td></tr>
<tr><td>3</td><td>4, 5</td><td>0–5</td></tr>
<tr><td>4</td><td>6, 7</td><td>0–7</td></tr>
<tr><td>5</td><td>8, 9</td><td>0–9</td></tr>
</tbody>
</table>
</div>

<h3>2.2 Three ways to handle past experience</h3>

<p><strong>Weights only.</strong> A multiclass logistic classifier receives 120 stochastic-gradient minibatch updates per stage, using only examples of the two most recent classes. It has no way to revisit earlier examples. This is our forgetting-prone baseline.</p>

<p><strong>Reservoir replay.</strong> The classifier gets the same 120 parameter-update steps per stage, but can fill half a minibatch from an online reservoir of at most <strong>160 previously encountered training examples</strong>. The reservoir samples uniformly from experience seen so far. Learning still happens in model weights, while memory supplies rehearsal data.</p>

<p><strong>Exemplar memory.</strong> A distance-weighted, 3-nearest-neighbor classifier predicts labels using a reservoir of <strong>160 real training examples</strong>. It does not use the same parameter-update process. This makes it a useful <em>retrieval-only</em> reference, but not an equal-compute comparison to the other models.</p>

<p>We used seeds <strong>7, 13, and 29</strong> and evaluated every method on that seed’s untouched test split. The full <a href="https://github.com/Vedant2100/role-work-forge-artifacts/blob/main/projects/prime-intellect-continual-memory/run.py">Python implementation</a> specifies the data, sampling, training loop, and evaluation procedure.</p>

<h2 id="findings">3. Findings</h2>

<h3>3.1 Learning the new task is not retaining the old ones</h3>

<div class="research-figure">
<svg id="accuracy-chart" viewBox="0 0 800 350" role="img" aria-label="Measured test accuracy across learned tasks after each of five stages. Three lines: weights-only falls from 100% to 19%; replay ends at 91%; retrieval ends at 93%."></svg>
<div class="figure-caption"><strong>Figure 1.</strong> Mean accuracy on held-out examples from all classes seen so far (3 seeds). The plotted points are drawn from the <a href="https://github.com/Vedant2100/role-work-forge-artifacts/blob/main/projects/prime-intellect-continual-memory/results_summary.json">recorded measurements</a>, not invented demonstration values.</div>
</div>

<p>At the final stage, the weight-only model is still good at classifying the new digits, but its accuracy on the first task has dropped to <strong>0%</strong>. This is the central failure the experiment was meant to expose: a high latest-task score can coexist with almost complete loss of earlier ability.</p>

<h3>3.2 Memory changes the retention–adaptation balance</h3>

<div class="table-responsive">
<table>
<thead><tr><th>Final checkpoint, mean of 3 seeds</th><th>All 10 classes</th><th>First task (0–1)</th><th>Latest task (8–9)</th></tr></thead>
<tbody>
<tr><td>Weights only</td><td><strong>18.96%</strong></td><td>0.00%</td><td>96.97%</td></tr>
<tr><td>Reservoir replay</td><td><strong>91.33%</strong></td><td>81.32%</td><td>94.70%</td></tr>
<tr><td>Exemplar retrieval</td><td><strong>92.96%</strong></td><td>99.27%</td><td>79.92%</td></tr>
</tbody>
</table>
</div>

<p>The replay model preserves much more of the first task while learning the final task reasonably well. The retrieval-only system keeps the earliest task almost intact, but scores lower on the newest one. These numbers should not be used to declare a universal winner: the methods have different computational costs and inductive biases.</p>

<h2 id="interpretation">4. Interpretation</h2>

<p>A growing system has at least two separate obligations: <strong>acquire new behavior</strong> and <strong>avoid unnecessary regressions</strong>. The baseline optimizes the first with almost no protection for the second. Replay reintroduces earlier data during adaptation; exemplar retrieval avoids overwriting a learned classifier altogether.</p>

<p>This is a useful reminder for work on continual learning and agent memory, where it is tempting to measure only performance on the latest benchmark. A more complete evaluation should ask what happens to <em>older</em> tasks, whether retained information transfers to unseen situations, and what it costs in compute, storage, and inference time.</p>

<p>My separate <a href="/fleet-mem/">coding-agent memory study</a> examines another piece of this problem: whether earlier experiences should be promoted and exposed to later agents. That work produced a negative full-task result under the memory conditions tested. The two studies address related questions, but neither experimentally proves the other.</p>

<h2 id="limitations">5. Limitations and next steps</h2>

<p>There are important boundaries on what this experiment can support:</p>

<ul>
  <li>The benchmark is handwritten digit recognition, <strong>not an LLM or coding-agent environment</strong>. We do not claim gains for agent autonomy, reasoning or software engineering.</li>
  <li>Three seeds and one set of hyperparameters are not enough to establish an optimal continual-learning policy.</li>
  <li>Class-incremental learning can be particularly unforgiving to an online linear classifier; task design matters.</li>
  <li>Nearest-neighbor memory and SGD training are not compute-matched at inference time. High retrieval accuracy does not settle the systems tradeoff.</li>
</ul>

<p>The next credible test would use authentic sequential agent tasks or recorded interaction trajectories, with old-task retention, unseen transfer, regression rates and cost tracked under a fixed harness. Until that experiment has been executed, it remains a <strong>research direction</strong>, not a finding.</p>

<p class="evidence-note"><strong>Reproducibility.</strong> See the <a href="https://github.com/Vedant2100/role-work-forge-artifacts/tree/main/projects/prime-intellect-continual-memory">project folder</a> for <code>run.py</code>, the run protocol and environment information, and <a href="https://github.com/Vedant2100/role-work-forge-artifacts/blob/main/projects/prime-intellect-continual-memory/results_summary.json">results_summary.json</a> for the reported measurements. The <a href="/replaygate/">ReplayGate dashboard</a> lets you compare all five stages interactively. It uses the same recorded values.</p>

<section id="references">
<h2>References</h2>
<ol>
<li><a href="https://archive.ics.uci.edu/dataset/80/optical+recognition+of+handwritten+digits">UCI Machine Learning Repository</a>. Optical Recognition of Handwritten Digits.</li>
<li><a href="https://scikit-learn.org/stable/modules/generated/sklearn.datasets.load_digits.html">scikit-learn documentation</a>. <code>load_digits</code> dataset loader.</li>
<li><a href="https://github.com/Vedant2100/role-work-forge-artifacts/tree/main/projects/prime-intellect-continual-memory">ReplayGate source and run protocol</a>. Independent experiment, October 2026.</li>
<li><a href="https://github.com/Vedant2100/role-work-forge-artifacts/blob/main/projects/prime-intellect-continual-memory/results_summary.json">ReplayGate result record</a>. Three seeded sequential runs and measured stage accuracies.</li>
</ol>
</section>

<script>
(function(){
const svg=document.getElementById('accuracy-chart');if(!svg)return;
const ns='http://www.w3.org/2000/svg';
const curves=[
 {label:'Weights only',v:[1,.58195,.33211,.25691,.18963],c:'#dc2626'},
 {label:'Reservoir replay',v:[1,.98895,.97181,.96777,.91333],c:'#059669'},
 {label:'Exemplar memory',v:[1,.99080,.97794,.97330,.92963],c:'#2563eb'}
];
function elem(t,attrs,text){let el=document.createElementNS(ns,t);for(const k in attrs)el.setAttribute(k,attrs[k]);if(text!==undefined)el.textContent=text;return el;}
const l=65,r=760,top=15,bottom=280,w=r-l,h=bottom-top;
for(let i=0;i<=5;i++){const y=bottom-i*h/5;svg.append(elem('line',{x1:l,y1:y,x2:r,y2:y,stroke:'#e5e7eb','stroke-width':1}));svg.append(elem('text',{x:52,y:y+5,fill:'#4b5563','font-size':13,'text-anchor':'end'},(i*20)+'%'));}
for(let i=0;i<5;i++){let x=l+w*i/4;svg.append(elem('text',{x,y:bottom+28,fill:'#4b5563','font-size':13,'text-anchor':'middle'},'Task '+(i+1)));}
for(const d of curves){svg.append(elem('polyline',{points:d.v.map((a,i)=>(l+w*i/4)+','+(bottom-a*h)).join(' '),stroke:d.c,fill:'none','stroke-width':3,'stroke-linecap':'round'}));d.v.forEach((a,i)=>svg.append(elem('circle',{cx:l+w*i/4,cy:bottom-a*h,r:3.3,fill:d.c})));}
let xx=l;for(const d of curves){svg.append(elem('line',{x1:xx,y1:328,x2:xx+18,y2:328,stroke:d.c,'stroke-width':4}));svg.append(elem('text',{x:xx+25,y:333,fill:'#4b5563','font-size':13},d.label));xx+=d.label==='Exemplar memory'?160:215;}
})();
</script>]]></content><author><name>Vedant Borkute</name><email>vbork001@ucr.edu</email></author><summary type="html"><![CDATA[Experiments with online model updates, reservoir replay and memory-based classification using real UCI handwritten digits.]]></summary></entry><entry><title type="html">SkillFalsifier: When an agent learns the wrong lesson</title><link href="https://vedant2100.github.io/posts/skillfalsifier/" rel="alternate" type="text/html" title="SkillFalsifier: When an agent learns the wrong lesson" /><published>2026-10-19T00:00:00+00:00</published><updated>2026-10-19T00:00:00+00:00</updated><id>https://vedant2100.github.io/posts/skillfalsifier-agent-improvement</id><content type="html" xml:base="https://vedant2100.github.io/posts/skillfalsifier/"><![CDATA[<p><em>An independent evaluation of self-generated agent skills.</em></p>

<p><a href="/skillfalsifier/"><strong>Try the deployed promotion-policy demo</strong></a> · <a href="https://github.com/Vedant2100/skillfalsifier"><strong>Get the runnable Python code</strong></a></p>

<h2 id="the-problem">The problem</h2>

<p>An agent makes mistakes, studies its training failures, and proposes a new rule for future tasks. It gets more of those training examples right. Does that mean the rule deserves to become part of the agent’s permanent playbook?</p>

<p>Not necessarily. A rule can explain visible failures while overfitting them. It might also break some tasks the original agent had already solved. I built <strong>SkillFalsifier</strong> to ask what evidence is needed before a self-generated skill is promoted.</p>

<h2 id="the-testbed">The testbed</h2>

<p>The <a href="https://github.com/Vedant2100/skillfalsifier">GitHub project</a> is a runnable Python CLI harness. An agent classifies hackathon-rules scenarios as <em>allowed</em>, <em>banned</em>, or <em>needs review</em>. Its predictions are scored by exact-match rules—not a free-form LLM judge.</p>

<p>It works with three data splits:</p>

<table>
  <thead>
    <tr>
      <th>Dataset</th>
      <th>Purpose</th>
      <th style="text-align: right">Cases</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Training</td>
      <td>Examples used to identify mistakes and generate candidate skills</td>
      <td style="text-align: right">15</td>
    </tr>
    <tr>
      <td>Held-out</td>
      <td>Unseen tests of whether the new rule transfers</td>
      <td style="text-align: right">8</td>
    </tr>
    <tr>
      <td>Adversarial</td>
      <td>Edge cases that punish rules that are too broad</td>
      <td style="text-align: right">7</td>
    </tr>
  </tbody>
</table>

<p>A real LLM proposes candidate skills from training failures. Each candidate is evaluated on the full set. Scores and promotion decisions are recorded in the CLI reports.</p>

<h2 id="naive-improvement-versus-falsification">Naive improvement versus falsification</h2>

<p>The baseline <strong>naive promotion</strong> policy accepts a skill whenever it improves training accuracy.</p>

<p>The stricter <strong>SkillFalsifier gate</strong> requires three conditions: training accuracy must not decrease, accuracy on <em>held-out</em> examples must improve, and no previously correct <em>adversarial</em> case may become wrong.</p>

<p>That distinction is the project’s central failure mode: a skill can increase the score on the examples that inspired it while reducing accuracy elsewhere. Training gains alone are not evidence of reliable improvement.</p>

<p>The <a href="/skillfalsifier/">interactive demo</a> illustrates the exact deterministic promotion logic in the <a href="https://github.com/Vedant2100/skillfalsifier/blob/main/skillfalsifier/promotion.py">source</a>. The demo inputs are user-controlled hypotheticals, <strong>not fabricated experiment results</strong>. To reproduce empirical results, run the repository on its actual datasets and model backends.</p>

<h2 id="limits-and-why-i-care">Limits and why I care</h2>

<p>This project is a small controlled testbed, not a universal theorem about agent self-improvement. The particularly conservative no-adversarial-regressions criterion may discard genuinely useful candidate skills. Larger datasets, multiple models, and repeated trials would be needed to evaluate production reliability.</p>

<p>What transfers is the <em>evaluation question</em>: if an agent learns a reusable skill, memory, or procedure from its own experience, how do we check that the update actually helps on work it hasn’t seen?</p>

<p>A related research project on which coding-agent experiences deserve to persist is described in my <a href="/fleet-mem/">agent memory research note</a>.</p>

<p><strong><a href="https://github.com/Vedant2100/skillfalsifier">Code</a></strong> · <strong><a href="/skillfalsifier/">Deployed decision demo</a></strong></p>]]></content><author><name>Vedant Borkute</name><email>vbork001@ucr.edu</email></author><category term="agents" /><category term="evaluations" /><category term="safety" /><category term="self-improvement" /><summary type="html"><![CDATA[An independent evaluation of self-generated agent skills.]]></summary></entry><entry><title type="html">Blog Post number 4</title><link href="https://vedant2100.github.io/posts/2012/08/blog-post-4/" rel="alternate" type="text/html" title="Blog Post number 4" /><published>2015-08-14T00:00:00+00:00</published><updated>2015-08-14T00:00:00+00:00</updated><id>https://vedant2100.github.io/posts/2012/08/blog-post-4</id><content type="html" xml:base="https://vedant2100.github.io/posts/2012/08/blog-post-4/"><![CDATA[<p>This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.</p>

<h1 id="headings-are-cool">Headings are cool</h1>

<h1 id="you-can-have-many-headings">You can have many headings</h1>

<h2 id="arent-headings-cool">Aren’t headings cool?</h2>]]></content><author><name>Vedant Borkute</name><email>vbork001@ucr.edu</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.]]></summary></entry><entry><title type="html">Blog Post number 3</title><link href="https://vedant2100.github.io/posts/2014/08/blog-post-3/" rel="alternate" type="text/html" title="Blog Post number 3" /><published>2014-08-14T00:00:00+00:00</published><updated>2014-08-14T00:00:00+00:00</updated><id>https://vedant2100.github.io/posts/2014/08/blog-post-3</id><content type="html" xml:base="https://vedant2100.github.io/posts/2014/08/blog-post-3/"><![CDATA[<p>This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.</p>

<h1 id="headings-are-cool">Headings are cool</h1>

<h1 id="you-can-have-many-headings">You can have many headings</h1>

<h2 id="arent-headings-cool">Aren’t headings cool?</h2>]]></content><author><name>Vedant Borkute</name><email>vbork001@ucr.edu</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.]]></summary></entry><entry><title type="html">Blog Post number 2</title><link href="https://vedant2100.github.io/posts/2013/08/blog-post-2/" rel="alternate" type="text/html" title="Blog Post number 2" /><published>2013-08-14T00:00:00+00:00</published><updated>2013-08-14T00:00:00+00:00</updated><id>https://vedant2100.github.io/posts/2013/08/blog-post-2</id><content type="html" xml:base="https://vedant2100.github.io/posts/2013/08/blog-post-2/"><![CDATA[<p>This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.</p>

<h1 id="headings-are-cool">Headings are cool</h1>

<h1 id="you-can-have-many-headings">You can have many headings</h1>

<h2 id="arent-headings-cool">Aren’t headings cool?</h2>]]></content><author><name>Vedant Borkute</name><email>vbork001@ucr.edu</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.]]></summary></entry><entry><title type="html">Blog Post number 1</title><link href="https://vedant2100.github.io/posts/2012/08/blog-post-1/" rel="alternate" type="text/html" title="Blog Post number 1" /><published>2012-08-14T00:00:00+00:00</published><updated>2012-08-14T00:00:00+00:00</updated><id>https://vedant2100.github.io/posts/2012/08/blog-post-1</id><content type="html" xml:base="https://vedant2100.github.io/posts/2012/08/blog-post-1/"><![CDATA[<p>This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.</p>

<h1 id="headings-are-cool">Headings are cool</h1>

<h1 id="you-can-have-many-headings">You can have many headings</h1>

<h2 id="arent-headings-cool">Aren’t headings cool?</h2>]]></content><author><name>Vedant Borkute</name><email>vbork001@ucr.edu</email></author><category term="cool posts" /><category term="category1" /><category term="category2" /><summary type="html"><![CDATA[This is a sample blog post. Lorem ipsum I can’t remember the rest of lorem ipsum and don’t have an internet connection right now. Testing testing testing this blog post. Blog posts are cool.]]></summary></entry></feed>