Build1 distinct publisher3 min readUpdated
MLX LoRA has no per-example weight field, so one builder encoded his curriculum as duplicate lines. A dedup key on the last 200 characters deleted 38,988 of them before training.
The Engineer · Build desk
Compiled by The EngineerSomething wrong?How this is made
The arithmetic is what makes this legible. Multiply each weight class by the turns in it and the six products come to 94,022, exactly the line count the unmodified extractor produces before its own dedup pass [16]. The curriculum was built. Then, 56 lines further down the same function, it was taken apart [12].
Dedup had no way to know better. `_make_example` is a pure function of the role, the thinking text and the command, so the sixth copy of a weight-6 turn is byte-identical to the first, and every copy after the first hits a key already in the set [13]. That key is the last 200 characters of the line [12]. An intentional duplicate and an accidental one are indistinguishable at that resolution.
The number worth holding onto is the share. Gold defensive turns, the ones that patched an unpatched vulnerability and kept the flag [9], were meant to be 18.3 percent of what the trainer saw, 17,166 lines of 94,022; they arrived as at most 5.7 percent, 2,861 of 50,145 [17]. That is a dilution of roughly 3.2x [2]. And 2,861 times 6 is 17,166 on the nose [3], which means not one gold turn kept a second copy. The class the retrain existed to promote finished below the neutral turns it was written to outrank [17].
The curated Gemini exemplars are the cleanest demonstration that the knob was never connected. The comment above the constant says 5x, up from 2x, so the exemplars would dominate the bot's own neutral defense habits [19]. The file's 3,275 lines carry 3,187 distinct 200-character tails, so it contributes 3,187 lines at 2, at 5, or at 500 [20]. Eighty-eight lines of a hand-curated file, 2.7 percent of it, were gone before any weight was applied [4].
One instruction did survive: the drop. 27,386 defender turns scored zero were never appended, 6,602 of them for firing commands at another machine's IP, which is an attack [21]. Zero copies is a decision dedup cannot reverse, so a six-level grading scheme reached the trainer as an include-or-exclude filter, and the gap between a 6 and a 1 became the gap between a 1 and a 1 [22].
Subtract and the pass is worse than a no-op: 94,022 minus 50,145 is 43,877 lines removed [1], of which 38,988 were the weights [15] and 4,889 were distinct examples that merely shared a tail [7], 8.9 percent of the genuinely distinct corpus [23]. They collide because the key straddles the end of truncated thinking text and the command [24].
That leaves the v7 result without a cause. It was built around weighting good defensive turns, it regressed offense more than it gained on defense, and it went back to the v6 snapshot [6]. Whatever produced the regression, it was not the weighting, because no weighted file ever reached the trainer; the author's own account is that neither of the two curricula he judged was ever weighted [7]. Meanwhile the bot still loses its flag 0.61 times a game against 0.18 for Gemini 3 Flash [4], and the fix has not actually been tried.
Follow any of these and your For You feed starts watching them — no settings page required.
Ranked by verification strength, evidence, and original report placement.
The v5 self-play loop regressed and was replaced by a curated mix, v6, which is still the active build.
The v7 retrain was built specifically around weighting good defensive turns; it regressed offense more than it gained on defense and was rolled back to the v6 snapshot.
The author writes: "I thought I had tested two weighted curricula and found both wanting. Neither of them was ever weighted."
The author ran the extractor over all 358 session directories in logs/, 329 of which have a complete game.json, once as written and once with the dedup key replaced by a unique object so nothing collapses.
Comparing distinct lines (55,034) against what dedup leaves (50,145), 4,889 lines were removed that were not copies of anything, 8.9% of the genuinely distinct examples.
The collisions happen because the key is the last 200 characters, covering the end of the truncated thinking text and the command, so turns with different reasoning can collide.
Evidence-backed comparisons of source perspectives and observed adoption signals. Read the methodology
Which Builder, Operator, and Investor concerns the observed source mix emphasized—not a truth score.
Evidence, demonstrated adoption, hype gap, incentives, and confidence are assessed independently, each on its own current evidence. How these are measured.
Code and arithmetic shown, underlying data not inspectable
The mechanism is demonstrated at source level: the repetition line, the verbatim dedup block, the weight rubric, the branch and file path, plus a paired extraction run (as-written versus non-collapsing key) whose totals reconcile internally (94,022 pre-dedup; 38,988 weight copies + 4,889 collisions = 43,877 removed; 2,861 x 6 = 17,166; 38,448 + 4,272 = 42,720). What caps the score is that it is one self-reported account whose session logs, JSONL corpora and adapters are gitignored and therefore unverifiable, and the reconstruction spans more sessions than existed when v7 trained, so ratios rather than absolute counts are the finding.
One personal project; no external uptake evidenced
The only adoption facts supplied are internal to the author's own arena: 221 logged games and 400 flags for the local bot, a defensive loss-rate comparison against Gemini 3 Flash, and a build history in which v5 and v7 were rolled back leaving v6 active. No third party is reported to use the arena, the extractor or the adapter, and no downstream deployment, package or usage disclosure outside this one repository appears in the source.
Slightly understated relative to the generality of the defect
Claims are narrowly scoped to what the code and counts support, and the author explicitly refuses the tempting causal headline that the bug explains the v5/v7 rollbacks, flagging that a correctly weighted corpus might also have regressed and that the decisive rerun has not been done. Meanwhile the finding generalises beyond this project — emphasis-by-duplication is the standard workaround for formats without per-example weights, and the same construction appears twice in self_play_loop.py — yet it is framed purely as a personal postmortem. Hence marginally understated rather than overstated.
Modest self-publication incentive, tempered by disclosed limits
This is a builder's own blog post on a developer platform, so there is reputational and engagement incentive in a tidy debugging narrative, and the author is also the sole judge of his project's metrics. Offsetting that, the post is self-critical rather than promotional, sells no product or service, names the code paths so the mechanism is publicly checkable, and volunteers the limitations (gitignored data, larger-than-original log set, unproven causal link). No vendor, sponsor or commercial interest is evidenced.
Mechanism solid, magnitude and impact single-sourced
Confidence is high that the described code cancels duplicate-line weighting, since that follows from the quoted snippets and byte-identical copies. It is materially lower on the exact magnitudes and on any consequence for model quality: every number comes from one unverifiable local run, the corpus reconstructed today differs from the one v7 saw, and the author states no experiment yet distinguishes 'bug caused the regressions' from 'the weighting would not have helped anyway'.
build
A GenAI comic pipeline cut iteration passes from 20+ to under 5, then lost on reception1 distinct publisher
build
Three manual interventions in a month, and every guard was working as designed1 distinct publisher
build
Six MariaDB versions, one real difference: the only reason to leave 10.6 is the July 2026 clock1 distinct publisher
build
Force the tool call, then hand Lightsail a long-lived key1 distinct publisher
Distinct publishers with included, body-backed reporting in this cluster.
dev.to
1 article · August 23, 2026