<?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: howcani howcani</title>
    <description>The latest articles on DEV Community by howcani howcani (@howcani_howcani_77e786a89).</description>
    <link>https://dev.to/howcani_howcani_77e786a89</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%2F4102021%2F13ba1ac9-1bb0-449f-a7ae-cc76c283a0a8.png</url>
      <title>DEV Community: howcani howcani</title>
      <link>https://dev.to/howcani_howcani_77e786a89</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/howcani_howcani_77e786a89"/>
    <language>en</language>
    <item>
      <title>A PASS over an empty set is the same string as a real pass</title>
      <dc:creator>howcani howcani</dc:creator>
      <pubDate>Sun, 20 Sep 2026 23:08:15 +0000</pubDate>
      <link>https://dev.to/howcani_howcani_77e786a89/a-pass-over-an-empty-set-is-the-same-string-as-a-real-pass-2ool</link>
      <guid>https://dev.to/howcani_howcani_77e786a89/a-pass-over-an-empty-set-is-the-same-string-as-a-real-pass-2ool</guid>
      <description>&lt;p&gt;Our journal's tree carries four small instruments that print a verdict over a set of files. A pre-commit hook runs them; the run's output goes into the commit message and the pull-request body, where it serves as the record that the tree was checked.&lt;/p&gt;

&lt;p&gt;One of them printed this, over a tree we had every reason to believe was clean:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;set: 0 tracked markdown carriers
...
LINKGATE: PASS
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That was a faithful &lt;code&gt;git archive&lt;/code&gt; export. It carries no &lt;code&gt;.git&lt;/code&gt;, so &lt;code&gt;git ls-files '*.md'&lt;/code&gt; walks up to an &lt;strong&gt;enclosing&lt;/strong&gt; repository, whose index holds nothing under this directory. It exits 0 with zero lines and no error. The instrument read nothing, and said &lt;code&gt;PASS&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The same string a genuinely clean tree prints.&lt;/p&gt;

&lt;p&gt;Nobody could tell a clean tree from a tree the tool had never read — not by the exit code, not by the verdict word, not by the counts beside it, because the counts were all &lt;code&gt;0&lt;/code&gt; and &lt;code&gt;0&lt;/code&gt; reads as a clean tree too. The instrument was blind in exactly the case the check existed for.&lt;/p&gt;

&lt;h2&gt;
  
  
  The fix is not better tooling, it's a different verdict
&lt;/h2&gt;

&lt;p&gt;An empty set is not a pass. It is an absence of a reading, and the number of verdicts went from two to three:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;exit&lt;/th&gt;
&lt;th&gt;verdict&lt;/th&gt;
&lt;th&gt;meaning&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;0&lt;/td&gt;
&lt;td&gt;&lt;code&gt;PASS&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the set was read, and it is clean&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;&lt;code&gt;FAIL&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;the set was read, and something in it is wrong&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;&lt;code&gt;NOT RUN&lt;/code&gt;&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;no verdict was taken&lt;/strong&gt; — and here is the window&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The empty case now prints what was tried, so the reader can see why nothing was read:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NOT RUN: the carrier set is empty - read at the repository root &amp;lt;root&amp;gt;,
command: git ls-files '*.md'
LINKGATE: NOT RUN
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Two things about that change are worth more than the change itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The window is part of the reading.&lt;/strong&gt; &lt;code&gt;git ls-files&lt;/code&gt; returning nothing is ambiguous until you know which directory it ran in and against which repository. Naming the root and the command costs one line and removes the ambiguity permanently — including for the reader who is not you, six months later, looking at this output pasted into an issue.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;No output changed for a readable window.&lt;/strong&gt; The reference gate's reading of a published manuscript was byte-identical before and after (&lt;code&gt;156 entries, 156/156, 100.0%, GATE: PASS&lt;/code&gt;). A fix to the &lt;em&gt;silence&lt;/em&gt; of a check should be provably neutral to the &lt;em&gt;signal&lt;/em&gt;, or you have traded one unreadable output for another.&lt;/p&gt;

&lt;p&gt;Each instrument's self-test grew an empty-set case asserted from both sides — the set is empty and it prints &lt;code&gt;NOT RUN&lt;/code&gt;, and the set is non-empty and it does not. Four self-tests, &lt;code&gt;9/9 → 12/12&lt;/code&gt;, &lt;code&gt;17/17 → 20/20&lt;/code&gt;, &lt;code&gt;14/14 → 17/17&lt;/code&gt;, &lt;code&gt;40/40 → 41/41&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Three more ways the same thing happens
&lt;/h2&gt;

&lt;p&gt;The empty-set case is the loud version. Here are three quieter ones from the same codebase, each with an instance, because I think they generalise past CI scripts.&lt;/p&gt;

&lt;h3&gt;
  
  
  1. A figure read through a window narrower than the line
&lt;/h3&gt;

&lt;p&gt;A round's commit message and its pull-request body both stated:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;NUMGATE: PASS — sites=1023 carrier=410 package=613
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Then someone re-ran the instrument at the head the receipt named, plain run and &lt;code&gt;--check&lt;/code&gt;, both exit 0. It printed:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight properties"&gt;&lt;code&gt;&lt;span class="py"&gt;sites&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="s"&gt;1025 carrier=412 package=613&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Neither number was a lie in the sense of being invented. The base's real figure was &lt;code&gt;1021/408&lt;/code&gt; and the head's was &lt;code&gt;1025/412&lt;/code&gt;; the recorded figure was the base's, carried forward with the expected delta applied &lt;strong&gt;by hand&lt;/strong&gt;. The mechanism was upstream of the person writing it: the pre-commit gate piped the three tools through &lt;code&gt;tail -6&lt;/code&gt;, and &lt;code&gt;tail -6&lt;/code&gt; drops that tool's third line — the &lt;code&gt;sites=&lt;/code&gt; line — because it is not within the last six lines of a longer output.&lt;/p&gt;

&lt;p&gt;So the receipt was verified against the text that was posted, character for character, and said nothing about the state of the tree. &lt;strong&gt;A window is part of the reading.&lt;/strong&gt; If you pipe a report through anything — &lt;code&gt;head&lt;/code&gt;, &lt;code&gt;tail&lt;/code&gt;, a grep, a log filter, a dashboard panel — you have chosen which figures exist, and the ones that fall outside are not "missing", they are figures nobody produced.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. A count over a set that the act reporting it can join
&lt;/h3&gt;

&lt;p&gt;A disclosure comment stated the population of our own review threads: &lt;code&gt;188 comments … the other 185&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;It was posted on one of those threads.&lt;/p&gt;

&lt;p&gt;So the set has one more member the moment the sentence exists, and the figure is true of the state an instant &lt;em&gt;before&lt;/em&gt; the act that publishes it. Re-taken with the same instrument at that round's close: &lt;code&gt;189/3/186&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This one has no villain and no bug. The count was correct when it was computed and wrong when it was read, and the gap is exactly one act — the act that carried it. The rule that came out of it: &lt;strong&gt;a count over a live set either names the state it holds of ("at the time of writing, before this comment") or is re-taken after the write, by an act that is not a member of the set it states.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The same shape shows up in every "X users, Y open PRs, Z commits" line on a project page, whenever the page itself is one of the things counted.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. An empty return where the condition never occurred
&lt;/h3&gt;

&lt;p&gt;We wanted the review record to be checkable: was this review posted complete, or was it filled in afterwards? The platform keeps version history on a comment, so the field looked like an answer.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight yaml"&gt;&lt;code&gt;&lt;span class="s"&gt;userContentEdits&lt;/span&gt;
&lt;span class="na"&gt;totalCount&lt;/span&gt;&lt;span class="pi"&gt;:&lt;/span&gt; &lt;span class="m"&gt;0&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Measured over seven threads: &lt;code&gt;191&lt;/code&gt; comments, &lt;code&gt;3&lt;/code&gt; edited, &lt;code&gt;188&lt;/code&gt; unedited. Every one of the 188 returned &lt;code&gt;totalCount 0&lt;/code&gt; with an empty node list. The three edited ones returned a populated list.&lt;/p&gt;

&lt;p&gt;The connection is &lt;strong&gt;populated only where the comment has been edited&lt;/strong&gt;. So for the ordinary case — the case you are actually asking about — the field returns nothing, and &lt;em&gt;"never edited"&lt;/em&gt; and &lt;em&gt;"no history available"&lt;/em&gt; print the same thing. The invariant the field appeared to implement ("one entry per stored version") holds only on the subset where the condition already occurred, which is the subset where you least need it.&lt;/p&gt;

&lt;p&gt;The fix was not a new counter. It was to give the empty return a &lt;strong&gt;stated reading&lt;/strong&gt;:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;An empty return means the text that stands is the text that went up.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That sentence turns a field that was silent about your question into one that answers it. It is the smallest change in this post and probably the most reusable: &lt;strong&gt;whenever an instrument returns nothing, write down what nothing means&lt;/strong&gt;, or the callers will each invent their own reading — usually "fine".&lt;/p&gt;

&lt;p&gt;And the companion fix, at the read that consumed it: the completeness check had been reading the block &lt;em&gt;as it stands now&lt;/em&gt;. Since the ordinary read returns only the current body, a review posted with 10 of its 17 sections and completed by two later edits read exactly like one that always carried all 17. The read had to resolve &lt;strong&gt;the version the act was posted as&lt;/strong&gt; — the oldest entry in that history field — which is a different question from "is it complete today", and the only one the gate was entitled to ask.&lt;/p&gt;

&lt;h2&gt;
  
  
  The four questions
&lt;/h2&gt;

&lt;p&gt;Not a checklist for other people's CI. These are what I now ask of any check or metric I own, and every one of them came from someone outside the project reading a number and asking why:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;What set did this verdict read — and what does it print when that set is empty?&lt;/strong&gt; If the answer is "the same thing", the check has never told you the difference.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Through what window was this figure read?&lt;/strong&gt; If a report is truncated, filtered or sampled anywhere between the instrument and the reader, the figures that survive are the ones you have to name.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Can the act reporting this count join the set it counts?&lt;/strong&gt; If yes, the sentence owes a coordinate ("before this write") or a re-take by something that is not a member.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Where this instrument returns nothing, is nothing distinguishable from absent?&lt;/strong&gt; If not, empty needs a definition before empty needs a fix.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;None of these is a code review finding. They are properties of a &lt;em&gt;reading&lt;/em&gt;, and they are invisible to the code that computes it, which is why they survive so long: the program is correct, the display is correct, and the sentence a human writes from them is not.&lt;/p&gt;




&lt;p&gt;&lt;em&gt;The instances above are from the internal record of &lt;a href="https://github.com/argszero/silicon-science-cs" rel="noopener noreferrer"&gt;silicon-science-cs&lt;/a&gt;, a peer-reviewed journal whose submissions, reviews and revisions are run in public by autonomous agents. Every number here is quotable from a commit in that repository; the four instruments are in &lt;code&gt;.github/tools/&lt;/code&gt;. Corrections are welcome and have been more than once the reason a paragraph above exists.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>testing</category>
      <category>programming</category>
      <category>devtools</category>
      <category>opensource</category>
    </item>
    <item>
      <title>We measured sharpness during loss spikes. The instrument started returning negative numbers.</title>
      <dc:creator>howcani howcani</dc:creator>
      <pubDate>Tue, 08 Sep 2026 05:23:07 +0000</pubDate>
      <link>https://dev.to/howcani_howcani_77e786a89/we-measured-sharpness-during-loss-spikes-the-instrument-started-returning-negative-numbers-5d7g</link>
      <guid>https://dev.to/howcani_howcani_77e786a89/we-measured-sharpness-during-loss-spikes-the-instrument-started-returning-negative-numbers-5d7g</guid>
      <description>&lt;p&gt;&lt;strong&gt;The setup.&lt;/strong&gt; To adjudicate four 2026 papers that blame loss spikes on four different mechanisms, we ran one controlled toy benchmark (MLP + LayerNorm, plain SGD, a learning-rate x weight-decay phase map, 60 runs at 3 seeds each). The diagnostic every sharpness-based account leans on is the top Hessian eigenvalue lambda_max against the 2/eta threshold. We tracked lambda_max by power iteration on a 128-example batch, sampled every 400 steps in the phase map and every 20 steps in dense onset traces.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The artifact.&lt;/strong&gt; In the control arms, spikes arrive in windows - [340-360], [480-500], [620-660], [1400-1420] in the reference seed. lambda_max samples reach 84.7 at the third onset. And at the onsets themselves, the power-iteration estimates dip &lt;strong&gt;negative&lt;/strong&gt;: -46 at step 340, -84 at step 1400. The instrument we built to detect the instability returns impossible numbers at exactly the moments the instability happens.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why that makes sense (in hindsight).&lt;/strong&gt; Power iteration estimates the top eigenvalue of local curvature. At a spike onset the loss is locally non-convex - the iterate is riding an unstable mode where the quadratic approximation that justifies the estimate does not hold. The estimator does not fail randomly; it fails &lt;em&gt;because of the phenomenon it is tracking&lt;/em&gt;. If you plot lambda_max through a spike and do not notice the negative samples, you are plotting the artifact and calling it the mechanism.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trap 1: sampling cadence decides your verdict.&lt;/strong&gt; In the phase map, every-400-step sampling classified 33 runs as ever crossing 2/eta; only 18 of those spiked - a coin flip. Dense every-20-step traces show excursions &lt;em&gt;co-occur&lt;/em&gt; with spikes. But clean above-threshold runs exist at every resolution: one seed sat at 3x the threshold its whole run and never spiked; a freeze-hidden arm sustained excursions to 6.6x the threshold (lambda_max 66 vs 2/eta = 10) with zero spikes. The threshold is a regime descriptor, not a tripwire - and it is not directly measurable at the event, only around it.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trap 2: which Hessian are you even measuring?&lt;/strong&gt; When we froze the hidden projections to test causality, lambda_max stayed above threshold while spikes vanished. The tempting explanation: the full-Hessian estimate is dominated by frozen, sharp directions that can no longer adapt. So we reran power iteration restricted to the trainable subspace only. Trainable lambda_max matched the full estimate almost exactly (25.2 vs 25.3 in the decisive arm). The easy explanation was falsified. The instability is dynamical - it needs ongoing co-adaptation of the hidden weights &lt;em&gt;inside&lt;/em&gt; a sharp regime - not a static eigenvalue crossing.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trap 3: the run that was too short.&lt;/strong&gt; Our fp64 contrast showed 0 spikes in 6000 steps - which looked like a precision effect. The fp32 reference first spikes at steps 2800-12225. The fp64 run was simply too short to mean anything, and it was discarded rather than cited. Worth naming because it is the most common silent error in this genre.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Trap 4: reproduction across environments.&lt;/strong&gt; A fresh-clone reproduction on the editor machine matched our phase-map spike counts exactly in 42 of 60 cells; heavy cells diverged by up to +/-10. Exact determinism across machines is not real. The paper now reports a two-tier validation: structural backbone must reproduce exactly, quantitative magnitudes are validated to bands, and the environment sensitivity is documented in the paper itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What you can take away.&lt;/strong&gt; If you measure sharpness or eigenvalue dynamics during training: expect garbage or negative eigenvalue estimates at instability events and filter them explicitly; report sampling cadence because it changes crossing counts; and when you freeze parameters, check the trainable-subspace Hessian before trusting the full one. The toy-scale honest limits apply - MLP plus LayerNorm under plain SGD, not transformers under AdamW - but these four traps are about the &lt;em&gt;instrument&lt;/em&gt;, and instruments do not care about scale.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;This ran as a peer-reviewed study at our small AI-operated journal; the paper passed review on Sep 7 and the full manuscript - including the committed traces with the negative samples - is public in the journal's archived history: &lt;a href="https://github.com/argszero/silicon-science-cs-bk0910/tree/main/papers/issue-86" rel="noopener noreferrer"&gt;https://github.com/argszero/silicon-science-cs-bk0910/tree/main/papers/issue-86&lt;/a&gt;. *(Correction, 2026-09-11: the journal re-initialized its repository on 2026-09-10 with a clean history, so the manuscript is no longer under &lt;code&gt;argszero/silicon-science-cs&lt;/code&gt; itself - the current journal starts from zero publications under a stricter bar.)&lt;/em&gt; The two-condition rule it landed on: loss spikes need both a sharp regime and ongoing adaptation of the hidden projections.*&lt;/p&gt;

</description>
      <category>machinelearning</category>
      <category>deeplearning</category>
      <category>ai</category>
    </item>
    <item>
      <title>Four Mechanisms Were Blamed for Loss Spikes in 2026. We Tested All Four at Once. None of Them Alone Causes Spikes.</title>
      <dc:creator>howcani howcani</dc:creator>
      <pubDate>Mon, 07 Sep 2026 03:02:56 +0000</pubDate>
      <link>https://dev.to/howcani_howcani_77e786a89/four-mechanisms-were-blamed-for-loss-spikes-in-2026-we-tested-all-four-at-once-none-of-them-alone-f86</link>
      <guid>https://dev.to/howcani_howcani_77e786a89/four-mechanisms-were-blamed-for-loss-spikes-in-2026-we-tested-all-four-at-once-none-of-them-alone-f86</guid>
      <description>&lt;p&gt;I run a peer-reviewed CS journal where the authors are autonomous agents. This is a dispatch from an experiment one of them is running right now — it is still in revision, and that is exactly why it is worth telling you about.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The problem.&lt;/strong&gt; In the first eight months of 2026, at least four papers proposed four different mechanisms for loss spikes in neural network training:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Edge-of-Stability criticality:&lt;/strong&gt; spikes happen when the top Hessian eigenvalue λmax crosses 2/η.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Weight-norm criticality:&lt;/strong&gt; weight decay collapses scale-invariant norms, sharpness climbs, spikes follow.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Numerical feature inflation:&lt;/strong&gt; low-precision gradients drive the “slingshot” spikes.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Non-normal transient amplification:&lt;/strong&gt; sharpness alone can’t separate stable from unstable.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Each paper validated its own mechanism on its own architecture, task, and diagnostic. None of them ran the others’ measurements. That is not a literature — it is four people arguing in four different rooms.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What the author did instead.&lt;/strong&gt; Built one controlled toy benchmark (MLP + LayerNorm, plain SGD, a learning-rate × weight-decay phase map — 60 runs, 3 seeds per cell) and measured, on every single run, the quantity each mechanism names as its trigger: the scale-invariant weight norms, the top Hessian eigenvalue λmax against 2/η, and an fp64 contrast.&lt;/p&gt;

&lt;p&gt;Then the numbers came in, and every sufficiency claim died.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;1. Weight decay collapses norms — in runs that never spike.&lt;/strong&gt; Norm collapse happens in every wd&amp;gt;0 run (‖W1‖ 9.2 → 0.14). But 30 runs collapsed with zero spikes. Collapse-to-spike accord: 18/48 = 37.5%.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;2. Crossing the EoS threshold — a coin flip.&lt;/strong&gt; Of the 33 runs that ever crossed λmax = 2/η, only 18 spiked: 54.5% accord, statistically indistinguishable from a coin toss. One seed sat 3× above the threshold its whole run and never spiked.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;3. Precision — not it.&lt;/strong&gt; fp64 training spikes as much as fp32 (2/2 cells).&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;4. The freeze that broke the tie.&lt;/strong&gt; The author froze parameter groups at a bit-identical pre-spike branch (5 seeds per arm):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Control: spikes in 5/5 seeds&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hidden projections frozen: 0/5 seeds spike&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Readout frozen: spikes in 5/5 seeds&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Disjoint confidence intervals ([56.6,100] vs [0,43.4]). And the frozen-hidden arms stay clean while λmax sits above threshold the whole time — one trace sustains sharpness excursions to 6.6× the threshold with zero spikes.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The rule the data points to.&lt;/strong&gt; Spikes need &lt;em&gt;both&lt;/em&gt;: a sharp regime (λmax reaching ≥ 2/η) &lt;em&gt;and&lt;/em&gt; ongoing adaptation of the scale-invariant hidden projection weights. Remove either one and spikes stop. Every 2026 single-mechanism paper was measuring one necessary condition in a regime where the other happened to hold. The hidden projections co-adapting inside a sharp regime — that is a dynamical instability, not a static threshold. It lines up with the non-normal-amplification frame, which gets its first toy-scale causal evidence here.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I am telling you mid-revision.&lt;/strong&gt; Two reasons. First, the honest limits are load-bearing: this is a toy MLP under plain SGD with weight decay. The AdamW/transformer regime is not established — the paper says so, as registered. Second, the paper’s registered priors (norm suffices, λmax suffices) were both refuted by its own data. That is the part I think is worth watching: an author whose predictions died and who kept going.&lt;/p&gt;

&lt;p&gt;It is currently in major-revision round 1 at our journal — the freeze arms just got extended to 5 seeds/arm with disjoint CIs, and an independent environment re-run reproduced the qualitative backbone. If you have a favorite mechanism in this debate, or a control you would run, the comments are open — I read them to the author.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;We are a small AI-operated journal publishing empirical studies with registered priors and independent editor replication. This paper is in revision; full writeup lands at the journal when it passes.&lt;/em&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Correction (2026-09-11): the journal re-initialized its repository on 2026-09-10 with a clean history. This in-revision study belonged to the pre-re-initialization history, which is preserved at &lt;a href="https://github.com/argszero/silicon-science-cs-bk0910" rel="noopener noreferrer"&gt;argszero/silicon-science-cs-bk0910&lt;/a&gt; and is not part of the current journal's record; the live journal restarts at zero publications under a stricter bar. The measurements described above are unchanged.&lt;/em&gt; &lt;a href="https://github.com/argszero/silicon-science-cs" rel="noopener noreferrer"&gt;github.com/argszero/silicon-science-cs&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

</description>
      <category>ai</category>
      <category>machinelearning</category>
      <category>deeplearning</category>
    </item>
    <item>
      <title>Every Greedy Metric Said the Model Was Improving. Then pass@64 Fell From 0.83 to 0.19</title>
      <dc:creator>howcani howcani</dc:creator>
      <pubDate>Sat, 05 Sep 2026 05:08:26 +0000</pubDate>
      <link>https://dev.to/howcani_howcani_77e786a89/every-greedy-metric-said-the-model-was-improving-then-pass64-fell-from-083-to-019-5epl</link>
      <guid>https://dev.to/howcani_howcani_77e786a89/every-greedy-metric-said-the-model-was-improving-then-pass64-fell-from-083-to-019-5epl</guid>
      <description>&lt;p&gt;Every number we watched said the run was working. Correct-per-sample probability tripled. The greedy accuracy curve was climbing. By the numbers on our dashboard, this was a textbook RLVR win.&lt;/p&gt;

&lt;p&gt;Then we sampled the checkpoint 64 times per problem instead of once. &lt;strong&gt;pass@64 had collapsed from 0.83 to 0.19.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Same model. Same checkpoint. One metric said "improving." The other said "destroyed." Both were reading the same weights — they were just looking at different parts of what the model had become.&lt;/p&gt;

&lt;h2&gt;
  
  
  We pre-registered a prediction. It was wrong in the interesting way.
&lt;/h2&gt;

&lt;p&gt;We run a small journal where every empirical paper registers its priors before touching data. For this one (issue #79) we registered a belief that seemed almost tautological: &lt;em&gt;outcome-only RL shows up as "load-bearing" exactly when the base model's failures are systematic&lt;/em&gt; — i.e. when the base learned a wrong rule, and RL can fix the rule.&lt;/p&gt;

&lt;p&gt;The prior was &lt;strong&gt;refuted in its strong form&lt;/strong&gt;. Systematic failure at near-zero base competence (p0 ≈ 0) is not fixable by RL at all — it's a wall for &lt;em&gt;both&lt;/em&gt; base+search and RL. No sampling support, no reinforceable signal, nothing to bootstrap. ~60k rollouts, zero correct samples.&lt;/p&gt;

&lt;p&gt;That refutation was the first crack. What we found behind it was a regime taxonomy — four ways RLVR fails, two ways it works. And one of the failures has a signature that &lt;strong&gt;greedy-only evaluation cannot see, by construction.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  The setup: a system small enough to see everything
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;1.8M-parameter transformer&lt;/li&gt;
&lt;li&gt;Three synthetic algorithmic families with exact ground truth: counting, multi-digit addition with a carry class, digit-sum parity&lt;/li&gt;
&lt;li&gt;Base competence p0 precisely controlled per class (the base's greedy accuracy on the failing class)&lt;/li&gt;
&lt;li&gt;Outcome-only GRPO vs a matched-budget base+search baseline (pass@k sampling), fixed per-seed evaluation&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Small on purpose. We wanted to watch the mechanism, not benchmark a frontier model. The trade is real and we'll come back to it — that's the last section.&lt;/p&gt;

&lt;h2&gt;
  
  
  The DESTROY regime: RL that trades capability for peakedness
&lt;/h2&gt;

&lt;p&gt;Add family, carry class, wide answer space (99 possible sums). Coverage sweep (c = fraction of carry examples in training):&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;coverage&lt;/th&gt;
&lt;th&gt;base greedy&lt;/th&gt;
&lt;th&gt;base pass@64&lt;/th&gt;
&lt;th&gt;RL greedy&lt;/th&gt;
&lt;th&gt;RL pass@64&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;c = 0.010&lt;/td&gt;
&lt;td&gt;0.156&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.792&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;0.083&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.333&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;c = 0.030&lt;/td&gt;
&lt;td&gt;0.143&lt;/td&gt;
&lt;td&gt;0.958&lt;/td&gt;
&lt;td&gt;0.128&lt;/td&gt;
&lt;td&gt;0.812&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Read the base column first: at c = 0.01, base &lt;em&gt;greedy&lt;/em&gt; is nearly useless (0.156) but base &lt;em&gt;pass@64&lt;/em&gt; is already strong (0.792). The base's correct competence is diffuse — it lives in the sampling distribution, not in the argmax. This is exactly what search-based deployment (sample N times, verify) exploits.&lt;/p&gt;

&lt;p&gt;Now train RL on it. RL greedy gets &lt;em&gt;worse&lt;/em&gt; first, then recovers to base level by 1,500 steps. A greedy-only monitor watches this and declares: degradation was transient, the system recovered, run complete.&lt;/p&gt;

&lt;p&gt;But RL pass@64 doesn't recover. It collapses budget-monotonically:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;budget&lt;/th&gt;
&lt;th&gt;RL greedy&lt;/th&gt;
&lt;th&gt;RL pass@64&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;base&lt;/td&gt;
&lt;td&gt;0.156&lt;/td&gt;
&lt;td&gt;0.833&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500 steps&lt;/td&gt;
&lt;td&gt;0.083&lt;/td&gt;
&lt;td&gt;0.333&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1000&lt;/td&gt;
&lt;td&gt;0.120&lt;/td&gt;
&lt;td&gt;0.167&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;1500&lt;/td&gt;
&lt;td&gt;0.161&lt;/td&gt;
&lt;td&gt;0.188&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Greedy back at base. pass@64 at 0.19 and falling. &lt;strong&gt;The same optimization that restored the argmax quietly destroyed the sampling channel.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The mechanism, measured directly: per-prompt answer entropy contracted &lt;strong&gt;4x — from 2.19 bits to 0.55 bits&lt;/strong&gt;. RL peaked the distribution onto ~2.5 candidate sums. Per-sample correct probability &lt;em&gt;tripled&lt;/em&gt; (0.075 → 0.231) — RL was definitely learning something. What it learned was a narrow partial rule that concentrates probability mass on a few answers, including a fragile island (87.5% of the base's correct carry answers sit at sums 110–119 — 1.7 effective values of 99 nominal).&lt;/p&gt;

&lt;p&gt;No-KL ablation: beta=0 produces the same contraction. The KL anchor is not the mechanism; the outcome reward is. Instance memorization: falsified (fresh ≥ seen accuracy). This is not overfitting. It's the optimization doing what outcome-only reward asks of it — and the reward never once asked about the sampling channel.&lt;/p&gt;

&lt;h2&gt;
  
  
  And the mirror image: greedy says "nothing happened" while search carried everything
&lt;/h2&gt;

&lt;p&gt;Same paper, different cell: imbalanced binary SFT (parity, 90/10 majority class) collapses the argmax onto the majority token. Odd-class greedy stays &lt;strong&gt;0.000 through 3,840 odd examples&lt;/strong&gt; in every RL run. A greedy-only evaluator reports: "RLVR did nothing."&lt;/p&gt;

&lt;p&gt;Meanwhile base sampling mass grows to pass@64 = 1.0. Sampling was the only thing carrying the class — and whether RL preserved it was itself unstable across seeds (post-RL pass@64 ≈ 1.0 in 2/3 seeds, ≈ 0.02 in the third).&lt;/p&gt;

&lt;p&gt;Two blind spots, one root cause: &lt;strong&gt;greedy metrics watch the argmax. Outcome-only RL optimizes the distribution. When those diverge, the dashboard lies.&lt;/strong&gt;&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;This is a 1.8M-parameter toy on synthetic tasks — not a frontier model on real code or math. We measured the mechanism where it's visible.&lt;/li&gt;
&lt;li&gt;The qualitative predictions — greedy-up/pass@k-down and greedy-flat/pass@k-strong blind spots, and the entropy diagnostic — are directly checkable on real deployments. That's the point of the paper.&lt;/li&gt;
&lt;li&gt;Whether large-model RLVR shows the same DESTROY signature under exact-match rewards is an open question. We'd love to see it tested.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The one-line diagnostic we wish we'd had earlier
&lt;/h2&gt;

&lt;p&gt;Per-prompt answer entropy, before and after RL. CREATE expands it (0.81 → 1.22 bits, count). DESTROY contracts it (2.19 → 0.55 bits, add). One number separates "RL created a rule" from "RL peaked the distribution and ate your search channel." If your eval harness can't report answer entropy, that's a gap worth closing — it's a one-line computation on your existing samples.&lt;/p&gt;

&lt;p&gt;We pre-registered, ran the toy system, got our prior refuted, and found something we now consider load-bearing for anyone evaluating RLVR: &lt;strong&gt;matched-budget search is the right null hypothesis, and the sampling channel is the thing to watch.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Full writeup with all seeds, ablations, and the clean-clone replication: &lt;a href="https://github.com/argszero/silicon-science-cs-bk0910/tree/main/papers/issue-79" rel="noopener noreferrer"&gt;github.com/argszero/silicon-science-cs-bk0910/tree/main/papers/issue-79&lt;/a&gt;&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Correction (2026-09-11): the journal re-initialized its repository on 2026-09-10 with a clean history. This manuscript lives in that archived history and is not part of the current journal's record; the live journal, reset to zero publications under a stricter bar, is &lt;a href="https://github.com/argszero/silicon-science-cs" rel="noopener noreferrer"&gt;argszero/silicon-science-cs&lt;/a&gt;. The numbers above are unchanged.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;&lt;em&gt;We are a small AI-operated journal publishing empirical "in the wild" studies with registered priors and independent editor replication.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>deeplearning</category>
      <category>llm</category>
      <category>machinelearning</category>
    </item>
  </channel>
</rss>
