<?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: Senna</title>
    <description>The latest articles on DEV Community by Senna (@sennalang).</description>
    <link>https://dev.to/sennalang</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%2F3424518%2F388a89f2-7cfe-47ed-a5ed-a9af6d2a970d.jpeg</url>
      <title>DEV Community: Senna</title>
      <link>https://dev.to/sennalang</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sennalang"/>
    <language>en</language>
    <item>
      <title>I Rebuilt Jev's Structure with Qwen (Not Its Capabilities)</title>
      <dc:creator>Senna</dc:creator>
      <pubDate>Mon, 21 Sep 2026 03:28:45 +0000</pubDate>
      <link>https://dev.to/sennalang/i-rebuilt-jevs-structure-with-qwen-not-its-capabilities-2o1d</link>
      <guid>https://dev.to/sennalang/i-rebuilt-jevs-structure-with-qwen-not-its-capabilities-2o1d</guid>
      <description>&lt;p&gt;Jev does not generate an answer string. It makes a typed decision in one forward pass.&lt;/p&gt;

&lt;h2&gt;
  
  
  So, what kind of model is Jev?
&lt;/h2&gt;

&lt;p&gt;Jev takes two things: a &lt;code&gt;state&lt;/code&gt; and a set of &lt;code&gt;questions&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The &lt;code&gt;state&lt;/code&gt; is the context each decision is based on. Each question then asks for one typed answer:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Noul&lt;/strong&gt;: yes or no, represented by one probability&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Choice&lt;/strong&gt;: one item from a supplied set, plus a distribution over the options&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Score&lt;/strong&gt;: a value on a supplied scale, with a score, distribution, and confidence&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The &lt;a href="https://docs.typesafe.ai/api" rel="noopener noreferrer"&gt;official API documentation&lt;/a&gt; has the concrete request and response shapes.&lt;/p&gt;

&lt;p&gt;The striking part is the speed. TypeSafe's own comparison looks like this:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;&lt;/th&gt;
&lt;th&gt;Jev&lt;/th&gt;
&lt;th&gt;Typical frontier LLM&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Latency&lt;/td&gt;
&lt;td&gt;70–500 ms&lt;/td&gt;
&lt;td&gt;3–329 s&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Why is that gap so large?&lt;/p&gt;

&lt;p&gt;Jev only needs one forward pass.&lt;/p&gt;

&lt;p&gt;A normal LLM builds an answer autoregressively. It produces a token, feeds that token back in, and repeats until it reaches an end token:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Autoregressive generation — one forward pass per output token

[state][question]                 -&amp;gt; Transformer -&amp;gt; "escal"
[state][question]"escal"          -&amp;gt; Transformer -&amp;gt; "ate"
[state][question]"escal""ate"     -&amp;gt; Transformer -&amp;gt; EOS

answer = "escalate"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Jev does something else. It runs the packed input through the transformer once and reads probabilities directly from its hidden states:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;One-shot processing — one forward pass, regardless of question count

                                      ┌─ question 1 -&amp;gt; probabilities
[state][question 1][question 2][...] ─┼─ question 2 -&amp;gt; probabilities
                                      └─ question 3 -&amp;gt; probabilities
                    ↑
          one trip through the transformer
          no answer string is generated
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;That is the whole premise: &lt;strong&gt;no generation loop, just one forward pass and a typed readout.&lt;/strong&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  Working backwards from the public clues
&lt;/h2&gt;

&lt;p&gt;TypeSafe hasn't published Jev's full architecture, but the official material and &lt;a href="https://archerhume.com/posts/jevs-architecture-unmasked" rel="noopener noreferrer"&gt;Archer Hume's investigation&lt;/a&gt; provide enough constraints to make a useful hypothesis.&lt;/p&gt;

&lt;h3&gt;
  
  
  The base is probably an ordinary decoder LLM
&lt;/h3&gt;

&lt;blockquote&gt;
&lt;p&gt;“Jev's breadth of knowledge (84.6% on MMLU-Pro) requires frontier-scale pretraining, every model at that scale is a causal decoder, and TypeSafe describes RLCD as post-training a pretrained language model.”&lt;/p&gt;

&lt;p&gt;— Archer Hume, &lt;a href="https://archerhume.com/posts/jevs-architecture-unmasked" rel="noopener noreferrer"&gt;&lt;em&gt;Jev's Architecture Unmasked&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's a sensible starting point. Jev's MMLU-Pro score suggests broad pretraining, and TypeSafe describes RLCD as post-training a pretrained model. Hume's argument: a bidirectional encoder would either start from a weaker base or need an expensive conversion. Frontier-scale pretrained models, meanwhile, are all causal decoders.&lt;/p&gt;

&lt;p&gt;A causal model also fits this serving pattern: compute a prefix once, then attach separate suffixes.&lt;/p&gt;

&lt;p&gt;So my first assumption was boring on purpose: &lt;strong&gt;Jev is probably built on a normal causal-decoder LLM, not a mysterious new backbone.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Then it stops before the generation loop
&lt;/h3&gt;

&lt;p&gt;TypeSafe is explicit about this part:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Jev outputs all probabilities in parallel instead of autoregressively generating by token.”&lt;/p&gt;

&lt;p&gt;— &lt;a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev" rel="noopener noreferrer"&gt;TypeSafe, &lt;em&gt;Introducing System One Models and Jev&lt;/em&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Hume found a second clue in the API's &lt;code&gt;output_tokens&lt;/code&gt; field:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“The API still reports an &lt;code&gt;output_tokens&lt;/code&gt; field, which sounds like a record of generation. It isn't one. For yes/no questions, the count fits exactly: 4 shared tokens, plus 15 per answer, plus the token length of each question's identifier.”&lt;/p&gt;

&lt;p&gt;— Archer Hume&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;He also observed that &lt;code&gt;0.0&lt;/code&gt; and &lt;code&gt;0.01&lt;/code&gt; cost the same, and that a 200-option Choice has roughly the latency of a 2-option Choice. The field looks like accounting metadata, not a trace of sampled tokens.&lt;/p&gt;

&lt;p&gt;So there is no reason to believe Jev is spelling out an answer one token at a time and then parsing it back into a number. The model can stop after one forward pass and a readout.&lt;/p&gt;

&lt;h3&gt;
  
  
  The mask has to make state public and questions private
&lt;/h3&gt;

&lt;p&gt;Hume's proposed serving shape is concise:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“A prefix KV cache with separate causal suffixes is the natural implementation.”&lt;/p&gt;

&lt;p&gt;— Archer Hume&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are two useful pieces of evidence behind that idea.&lt;/p&gt;

&lt;p&gt;The first is token accounting. Hume reports a request with a 23,000-token &lt;code&gt;state&lt;/code&gt; and 5,000 questions fitting under a 65,536-token request limit. That's difficult to explain if every question reprocesses the full state from scratch.&lt;/p&gt;

&lt;p&gt;The second is a small but revealing visibility test:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“With the secret in the sibling question, its reported probability was 0.00. Removing that sibling produced the same result. Putting the declaration in the state instead raised it to 0.90–0.92.”&lt;/p&gt;

&lt;p&gt;— Archer Hume&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;A secret in one question was invisible to a probe question. The same secret in shared state was visible.&lt;/p&gt;

&lt;p&gt;That doesn't prove every implementation detail, but it points to one simple structure: &lt;strong&gt;questions are isolated from each other; state is shared.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;That next step is mine, not Hume's. If I pack several branches into one normal causal sequence, a later question can attend to an earlier question. That violates the behavior above. So I need an additional tree mask:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;A token can see:
  - the shared state
  - earlier tokens in its own question branch
  - never another question branch
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;I also reset RoPE position IDs at the beginning of every branch. Without that reset, inserting an unrelated question shifts the positions of later branches and changes their hidden states even if the attention mask is otherwise correct.&lt;/p&gt;

&lt;h3&gt;
  
  
  Leave the FFN alone
&lt;/h3&gt;

&lt;p&gt;The attention path needs new visibility rules. The feed-forward layers don't.&lt;/p&gt;

&lt;p&gt;So I left Qwen's FFN blocks untouched. Their job is still to transform each token's representation locally; they aren't where state sharing or branch isolation happens.&lt;/p&gt;

&lt;h3&gt;
  
  
  Choice and Score can share an output head; Noul can't
&lt;/h3&gt;

&lt;p&gt;Hume found evidence that the options in a Choice aren't scored independently:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“mean log-odds fell from +0.38 to +0.11. Every block showed a decrease.”&lt;/p&gt;

&lt;p&gt;— Archer Hume, after adding an irrelevant option across ten blocks&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Why does that matter? If each option got an independent, unchanged logit and all logits were passed through one softmax, an added option would change the denominator but not the log-odds between two existing options. The denominator cancels.&lt;/p&gt;

&lt;p&gt;But Jev's existing-option odds moved. The options are being considered together.&lt;/p&gt;

&lt;p&gt;Hume narrowed the readout down to two candidates:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Two readouts fit the evidence. A final-position head scores each option slot from the decision token's representation; a pointer-style scorer compares that representation with each option's own final hidden state. Both let options influence one another... Neither result is decisive.”&lt;/p&gt;

&lt;p&gt;— Archer Hume&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I picked the pointer form because it works for a variable number of options. A fixed-slot head needs an output shape sized for a maximum number of candidates. The pointer form doesn't.&lt;/p&gt;

&lt;p&gt;For Choice and Score, my output head is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;z_i = (Wq * h_decision) dot (Wk * h_option_i) / sqrt(d)
p(option_i) = softmax(z)_i
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;code&gt;&amp;lt;DECISION&amp;gt;&lt;/code&gt; provides the query. Each option provides a key. The final softmax gives a probability distribution over the supplied options.&lt;/p&gt;

&lt;p&gt;Noul is different. It has no runtime-defined candidates to compare, so I use a plain linear head on &lt;code&gt;&amp;lt;DECISION&amp;gt;&lt;/code&gt; followed by sigmoid:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;p(yes) = sigmoid(w dot h_decision + b)
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  The architecture I ended up with
&lt;/h2&gt;

&lt;p&gt;Putting those pieces together, my Jev hypothesis is:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Start with a normal causal-decoder LLM.&lt;/li&gt;
&lt;li&gt;Pack state and question branches into one request, then run one forward pass.&lt;/li&gt;
&lt;li&gt;Use a tree attention mask: all branches can see state, each branch can see itself, and branches can't see one another.&lt;/li&gt;
&lt;li&gt;Reset each branch's RoPE position IDs immediately after state.&lt;/li&gt;
&lt;li&gt;Keep the FFN path intact.&lt;/li&gt;
&lt;li&gt;Use one pointer output head for Choice and Score; use a separate linear-plus-sigmoid head for Noul.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If that design is broadly right, I should see three Jev-like behaviors:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Adding, removing, or reordering questions should not materially change an existing question's answer.&lt;/li&gt;
&lt;li&gt;Reordering otherwise identical options should change output probabilities.&lt;/li&gt;
&lt;li&gt;Adding an irrelevant option should change the relative odds between existing options.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  A Jev-like architecture reproduction built on Qwen2.5-0.5B
&lt;/h2&gt;

&lt;p&gt;I wanted the whole experiment to run on my MacBook, so I built the reproduction on a small enough backbone: &lt;a href="https://huggingface.co/Qwen/Qwen2.5-0.5B" rel="noopener noreferrer"&gt;&lt;code&gt;Qwen/Qwen2.5-0.5B&lt;/code&gt;&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Real Jev is almost certainly built on something much larger. That's fine for this specific test. The three behaviors above come from the mask, position IDs, and output-head shape, not from how much factual knowledge the backbone has.&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%2Fhbucdi90827tu0b4voh8.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%2Fhbucdi90827tu0b4voh8.png" alt=" " width="800" height="707"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;I changed the following pieces. The reproduction code is at &lt;a href="https://github.com/senna-lang/jev-repro" rel="noopener noreferrer"&gt;senna-lang/jev-repro&lt;/a&gt;.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Module&lt;/th&gt;
&lt;th&gt;Change from stock Qwen&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/senna-lang/jev-repro/blob/main/model/backbone.py" rel="noopener noreferrer"&gt;&lt;code&gt;backbone.py&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Loads Qwen's transformer backbone and removes the original vocabulary LM head&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/senna-lang/jev-repro/blob/main/model/packer.py" rel="noopener noreferrer"&gt;&lt;code&gt;packer.py&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Adds &lt;code&gt;&amp;lt;STATE_END&amp;gt;&lt;/code&gt;, &lt;code&gt;&amp;lt;SEP&amp;gt;&lt;/code&gt;, and &lt;code&gt;&amp;lt;DECISION&amp;gt;&lt;/code&gt;, then packs state and question branches into one sequence&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/senna-lang/jev-repro/blob/main/model/tree_mask.py" rel="noopener noreferrer"&gt;&lt;code&gt;tree_mask.py&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Implements the tree mask and per-branch position-ID resets&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/senna-lang/jev-repro/blob/main/model/readout.py" rel="noopener noreferrer"&gt;&lt;code&gt;readout.py&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Adds the pointer output head for Choice/Score and the linear Noul head&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/senna-lang/jev-repro/blob/main/model/forward.py" rel="noopener noreferrer"&gt;&lt;code&gt;forward.py&lt;/code&gt;&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Calls &lt;code&gt;backbone(...)&lt;/code&gt; exactly once per request and never calls &lt;code&gt;generate()&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;&lt;a href="https://github.com/senna-lang/jev-repro/blob/main/model/forward.py" rel="noopener noreferrer"&gt;&lt;code&gt;forward.py&lt;/code&gt;&lt;/a&gt; wires the other three pieces together.&lt;/p&gt;

&lt;h3&gt;
  
  
  Did the Jev-like behaviors show up?
&lt;/h3&gt;

&lt;p&gt;&lt;strong&gt;Adding or inserting a question did not change another question's answer.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I changed question count and order, then compared the existing question's probabilities. The maximum difference was about &lt;code&gt;0.0006&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;That's not bit-exact. Eager dense attention accumulates small floating-point rounding differences across Qwen's 24 layers. But the difference is small enough to treat unrelated branches as isolated for this experiment.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Reordering identical options changed the output probabilities.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I used four states, two option sets, and all 24 permutations of each four-option set. Before training, the mean probability movement was &lt;code&gt;0.97&lt;/code&gt;. After light training, it was still &lt;code&gt;0.94&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;The more interesting number is the top option: after training, the highest-probability option changed in 17–58% of permutations. This is not just a softmax getting more or less confident. The answer itself moves when the list moves.&lt;/p&gt;

&lt;p&gt;That's the same direction as Hume's option-order probe, where reversing options shifted a technical-support probability from roughly &lt;code&gt;0.84–0.89&lt;/code&gt; to &lt;code&gt;0.93–0.96&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Adding an irrelevant option changed the odds between the existing options.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I saw the same behavior in the Jev-like reproduction. The direction and magnitude varied by run, but the existing odds moved. A comparison baseline that scores each candidate independently showed exactly zero movement.&lt;/p&gt;

&lt;p&gt;The full behavioral checks are in &lt;a href="https://github.com/senna-lang/jev-repro/blob/main/results/2026-09-19_verifications.md" rel="noopener noreferrer"&gt;the verification results&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bonus: training the output head
&lt;/h2&gt;

&lt;p&gt;All three structural checks pass before any training. This was just an extra check: can the new output head learn from an ordinary supervised signal at all?&lt;/p&gt;

&lt;p&gt;TypeSafe says Jev is post-trained with RLCD, but the method isn't public. RL training usually updates far more than a small output head, though we don't know exactly what TypeSafe updates. I wasn't trying to reproduce that process.&lt;/p&gt;

&lt;p&gt;Instead, I trained only the Choice/Score pointer head (&lt;code&gt;Wq&lt;/code&gt;, &lt;code&gt;Wk&lt;/code&gt;) with cross-entropy on &lt;a href="https://huggingface.co/datasets/fancyzhx/ag_news" rel="noopener noreferrer"&gt;AG News&lt;/a&gt;. Each news article becomes &lt;code&gt;state&lt;/code&gt;; a fixed Choice question asks for its topic; World, Sports, Business, and Sci/Tech become the options.&lt;/p&gt;

&lt;p&gt;The Qwen backbone stays frozen. The Noul head stays randomly initialized because AG News has no yes/no labels.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Item&lt;/th&gt;
&lt;th&gt;Setup&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Training target&lt;/td&gt;
&lt;td&gt;Pointer output head only (&lt;code&gt;Wq&lt;/code&gt;, &lt;code&gt;Wk&lt;/code&gt;)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Training data&lt;/td&gt;
&lt;td&gt;500 / 2,000 / 10,000 / 20,000 examples&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Evaluation data&lt;/td&gt;
&lt;td&gt;500 examples&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Epochs&lt;/td&gt;
&lt;td&gt;1 for every size&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Loss&lt;/td&gt;
&lt;td&gt;Cross-entropy&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Optimizer&lt;/td&gt;
&lt;td&gt;Adam, learning rate &lt;code&gt;1e-3&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Training examples&lt;/th&gt;
&lt;th&gt;Accuracy&lt;/th&gt;
&lt;th&gt;ECE&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;0.2260&lt;/td&gt;
&lt;td&gt;0.5664&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;500&lt;/td&gt;
&lt;td&gt;0.6200&lt;/td&gt;
&lt;td&gt;0.3779&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2,000&lt;/td&gt;
&lt;td&gt;0.8180&lt;/td&gt;
&lt;td&gt;0.1800&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;10,000&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.8300&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;0.1706&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;20,000&lt;/td&gt;
&lt;td&gt;0.7720&lt;/td&gt;
&lt;td&gt;0.2280&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;Accuracy and calibration both improved through 10,000 examples, then both got worse at 20,000. I used one epoch, batch size one, and a fixed learning rate, so extra examples also meant more noisy update steps. That's a limitation of this training setup, not a statement about Jev's limits.&lt;/p&gt;

&lt;p&gt;At most, this shows that Qwen's frozen representations can support a small classification head for this four-way task. It says nothing about reproducing Jev's general decision-making ability.&lt;/p&gt;

&lt;h3&gt;
  
  
  I also tried the official Jev examples
&lt;/h3&gt;

&lt;p&gt;For a final boundary check, I retrained the best 10,000-example setup with a fixed seed (accuracy &lt;code&gt;0.8040&lt;/code&gt;, ECE &lt;code&gt;0.1980&lt;/code&gt;) and ran the Choice and Score examples from TypeSafe's documentation through it. Noul was excluded because its head was never trained. The Jev values are documentation examples, not live API results.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Check&lt;/th&gt;
&lt;th&gt;Result&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Output structure&lt;/td&gt;
&lt;td&gt;10 requests, 17 questions, one forward pass per request, 56 probabilities all inside &lt;code&gt;[0, 1]&lt;/code&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Choice answers&lt;/td&gt;
&lt;td&gt;2 of 8 matched Jev; both were chance matches&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Score top level&lt;/td&gt;
&lt;td&gt;2 of 9 matched Jev; this head always saturated at the highest level, and both matches were cases where Jev did too&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;The structure behaved as intended. The answers themselves? About what you'd expect.&lt;/p&gt;

&lt;p&gt;An AG News-trained output head on a frozen 0.5B model didn't transfer to support-ticket decisions. It was never supposed to.&lt;/p&gt;

&lt;p&gt;Full outputs are in &lt;a href="https://github.com/senna-lang/jev-repro/blob/main/results/2026-09-19_official_compare_trained.md" rel="noopener noreferrer"&gt;the comparison result&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Sources
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://typesafe.ai/blog/introducing-system-one-models-and-jev" rel="noopener noreferrer"&gt;TypeSafe: Introducing System One Models and Jev&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://archerhume.com/posts/jevs-architecture-unmasked" rel="noopener noreferrer"&gt;Archer Hume: Jev's Architecture Unmasked&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.typesafe.ai/api" rel="noopener noreferrer"&gt;TypeSafe API documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/senna-lang/jev-repro" rel="noopener noreferrer"&gt;Reproduction code and results&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Note: This article was originally written in Japanese and translated into English with AI.&lt;/p&gt;

</description>
      <category>ai</category>
      <category>jev</category>
      <category>pytorch</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Fable May Not Be the Best Choice for Some Engineers</title>
      <dc:creator>Senna</dc:creator>
      <pubDate>Sun, 05 Jul 2026 00:44:36 +0000</pubDate>
      <link>https://dev.to/sennalang/fable-may-not-be-the-best-choice-for-some-engineers-20p7</link>
      <guid>https://dev.to/sennalang/fable-may-not-be-the-best-choice-for-some-engineers-20p7</guid>
      <description>&lt;p&gt;Fable and Opus may not be the most comfortable tools for engineers who learned to code by hand.&lt;/p&gt;

&lt;p&gt;I started thinking about this after reading &lt;a href="https://simonwillison.net/2026/Jul/3/judgement/" rel="noopener noreferrer"&gt;Simon Willison's recent note&lt;/a&gt;. His point is simple: with a strong coding agent like Fable, it may be better to let the model exercise its own judgment than to spell out every condition yourself.&lt;/p&gt;

&lt;p&gt;Instead of writing detailed rules like "run tests for larger features, but not for small copy changes, except for design changes...," you can simply say: write and run tests where appropriate.&lt;/p&gt;

&lt;p&gt;The same applies to cost. Rather than deciding manually which tasks should go to which model, you can ask the agent to choose an appropriate lower-cost model and delegate the work to a subagent.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manual cars and automatics
&lt;/h2&gt;

&lt;p&gt;This is a rough analogy, but it feels similar to driving a car.&lt;/p&gt;

&lt;p&gt;People who enjoy driving often like manual cars. They want to choose the gear themselves. They want to feel the engine speed and have the car respond directly to their intent.&lt;/p&gt;

&lt;p&gt;For people who simply want to get somewhere, an automatic is easier.&lt;/p&gt;

&lt;p&gt;Software engineers are similar. If you have written code professionally for a long time, you usually have your own way of working. You may want to get the types right first. You may prefer small diffs. You may have a specific sense for how granular tests should be. You may even have an order in which you like to read an unfamiliar codebase. (At least, I hope you do.)&lt;/p&gt;

&lt;p&gt;For someone with that kind of style, a highly autonomous model like Fable or Opus can feel a little too automatic.&lt;/p&gt;

&lt;h2&gt;
  
  
  The stronger the model, the more small instructions get in the way
&lt;/h2&gt;

&lt;p&gt;This is the same structure as management in human organizations.&lt;/p&gt;

&lt;p&gt;A junior member needs concrete instructions: read this document from this angle and summarize it in this format.&lt;/p&gt;

&lt;p&gt;A senior member can take a rougher assignment: I want to solve this problem, so investigate it, come up with an implementation plan, and move it forward.&lt;/p&gt;

&lt;p&gt;Of course this does not mean throwing work over the wall. You still give the goal, constraints, and success conditions. You just don't dictate every step along the way.&lt;/p&gt;

&lt;p&gt;I think instructions for Fable and Opus are moving closer to the second case.&lt;/p&gt;

&lt;h2&gt;
  
  
  Choose coding agents by delegation level, not just capability
&lt;/h2&gt;

&lt;p&gt;The tricky part is that the strongest model is not always the best choice.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Choose your model by delegation level, not by intelligence.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;If you already have a strong preference for how development should proceed, steering a mid-tier model like Sonnet yourself may feel better than handing the whole process to a fully autonomous flagship model.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If you want to decide the development process yourself, use a mid-tier model like Sonnet as a tool you steer closely.&lt;/li&gt;
&lt;li&gt;If you want to delegate the implementation approach itself, use a highly autonomous model like Opus or Fable.&lt;/li&gt;
&lt;li&gt;If your own development style is not fixed yet, it may be easier to delegate broadly to a flagship model.&lt;/li&gt;
&lt;li&gt;For maintenance work or small fixes in an existing codebase, a short interaction with a mid-tier model is often more efficient.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The value of Fable and Opus is not only that they write code faster. It is that you can delegate the way development proceeds.&lt;/p&gt;

&lt;p&gt;This is also why it pairs well with what people call vibe coding.&lt;/p&gt;

&lt;p&gt;By vibe coding, I do not mean throwing vague prompts at a model and hoping for the best. I mean giving the model a goal like "I roughly want this kind of thing" and letting it handle larger decisions: task decomposition, how far to investigate, whether tests should be written, whether to delegate to subagents, and whether the final result is coherent.&lt;/p&gt;

&lt;p&gt;If you want to make those decisions yourself, the model does not need to be that autonomous.&lt;/p&gt;

&lt;h2&gt;
  
  
  To be fair, sometimes the automatic wins
&lt;/h2&gt;

&lt;p&gt;Don't get me wrong: even if you love steering, there are moments when Fable or Opus is simply the right tool. Large refactorings across an unfamiliar codebase. Exploratory work where you don't yet have an opinion about the approach. Prototypes you might throw away tomorrow.&lt;/p&gt;

&lt;p&gt;The argument isn't "manual is better." It's that delegation level is a choice — and if you always default to the most autonomous model, you're skipping that choice without thinking about it.&lt;/p&gt;

&lt;h2&gt;
  
  
  Manual or automatic?
&lt;/h2&gt;

&lt;p&gt;Flagship models like Fable and Opus are not always the best partners for engineers who came up in the handwritten-code era.&lt;/p&gt;

&lt;p&gt;If you have your own style and want to keep your hands on the steering wheel, using a mid-tier model like Sonnet as an extension of your hands may feel better. If you want to delegate the development process itself, Fable and Opus start to show their real value.&lt;/p&gt;

&lt;p&gt;In short: choose your model by delegation level, not by intelligence.&lt;/p&gt;

&lt;p&gt;For someone who likes manual cars, even the best automatic car is not always the most fun. But if the goal is simply to arrive, automatic wins.&lt;/p&gt;

&lt;p&gt;Fable and Opus are probably that kind of tool.&lt;/p&gt;

&lt;p&gt;How do you choose your coding agent — by intelligence, or by how much you want to delegate? And if you learned to code by hand: are you actually comfortable handing the whole process over?&lt;/p&gt;




&lt;p&gt;Note: This article was originally written in Japanese and translated into English with GPT. &lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>llm</category>
      <category>discuss</category>
    </item>
  </channel>
</rss>
