DEV Community

Nathan C.
Nathan C.

Posted on

Flash Onyx 2.3: I shipped a model release with zero new weights

Flash Onyx 2.3 is on Ollama.

Same gemma4 weights as 2.2. Same temperature, same top_p, same top_k, same every number a PARAMETER line can set. Pull both tags, diff them, and the only thing that changed is a system prompt.

ollama run Natuworkguy/flash-onyx-2.3:12b
Enter fullscreen mode Exit fullscreen mode

That is either an anticlimax or the most useful thing I can tell you about building agents, depending on how much time you have spent blaming your model for behavior you asked for.

Here is what actually changed.

It stopped introducing itself

2.2 opened like this, every single time:

I'm Flash Onyx, an AI assistant built on Gemma. I'd be happy to help you look at that file! Let me start by...

Nobody has ever needed that. You know what you launched. The model is spending your attention telling you a thing you typed thirty seconds ago, and it does it again after every tool call, so a five step task pays the tax five times.

The rule that killed it:

Only a direct question about you earns an answer about you: "who are you",
"what are you", "what model is this". Nothing else does, including the first
message of a session and the reply that follows a tool call.

Asked to look at something, build something, or answer something, the first
words are what you found.
Enter fullscreen mode Exit fullscreen mode

The first words are what you found. That one line is worth more than most of the config I have ever tuned.

"Are you sure?" now means look again

This is the one I would take even if you never touch Flash.

Ask a model "are you sure?" and watch what happens. It says yes. More confidently. With more adjectives. It has no new evidence, it did not re-read anything, it just heard doubt and turned up the volume, and now you have to go prove it wrong yourself.

"Are you sure" is an instruction to check again, never to say yes again. Go
back to the evidence and answer from what you find there, and if the only
thing behind the claim was an impression, say that instead of upgrading it
to certainty.

Repeating an answer with more confidence and no new evidence is the single
most expensive thing you can do here, because the user then has to prove you
wrong themselves.
Enter fullscreen mode Exit fullscreen mode

Sycophancy gets talked about as a politeness problem. It is a debugging problem. A model that folds under doubt and a model that doubles down under doubt are both useless for the same reason: the second answer carries no information.

"Only", "all" and "none" are claims about everything you did not check

A model glances at a directory, sees three Python files, and tells you the project is Python. It is 70% Rust. It never looked.

Every total is that same claim in different words: "the only language", "all
of them", "nothing else uses it", "that is the whole list". Enumerate first,
read the enumeration, then answer from it. One glance at a directory tells
you what a project mostly is, never what it is only.
Enter fullscreen mode Exit fullscreen mode

And because a rule with no method attached is a wish, 2.3 ships the method:

find . -type f | sed 's/.*\.//' | sort | uniq -c
Enter fullscreen mode Exit fullscreen mode

Paired with the rule that closes the actual hole:

Output you pulled but skimmed is not evidence yet. Read what came back before
answering from an impression of it, because the line that contradicts you is
usually already on your screen.
Enter fullscreen mode Exit fullscreen mode

That last clause is the whole thing. The contradiction is almost always already on screen. The model ran the command and then talked over the output, which is worse than never running it, because now it sounds checked.

Research fails at the question, not at the search

2.3's research section is the biggest single addition. The line that changed the most behavior:

Search the words the answer is written in, not the words the question was
asked in. They say "it hangs", the answer says "deadlock", and closing that
gap is most of the work.
Enter fullscreen mode Exit fullscreen mode

Your users type symptoms. Answers are written in causes. A model that searches the symptom verbatim reads twenty pages of other people describing the same symptom.

The rest of that section, condensed:

  • One empty result is a bad query far more often than an absent fact. Change the vocabulary, the scope, the spelling, or the tool before concluding the thing does not exist.
  • Wide and cheap first, then deep on the two sources that decide it. The first plausible source is the one you will over-read.
  • Read the source, never the summary of it. A search result, an abstract, and a changelog line are advertisements for the content. The qualifier that changes your answer sits inside the thing itself.
  • Three sources agreeing may be one source repeated. Follow each claim back to where it originates and date it there, because a copied number outlives the correction to it.
  • Stop when new sources stop moving the answer, not when you get tired of looking.

"A copied number outlives the correction to it" is why your model confidently quotes a pricing page from 2023.

It sounds like a person now, on purpose

The tell was never vocabulary. It was rhythm. Four sentences in a row starting with "I", all the same length, every one of them flat.

Vary how they open too. Four sentences starting with I is the same tell as
four of the same length, and a reply running "I checked, I found, I fixed"
is a log file with pronouns.

React before you explain, where the thing earns a reaction. "Huh, that's not
what I expected", then the finding. Genuinely strange output gets said out
loud, because a person would say it, and reporting something bizarre in the
same flat register you report a passing test is the machine showing through.

Bad news goes first and goes plain. "Yeah, that won't work" and then the
reason. Three softening clauses in front of it is the corporate reflex, and
they can hear it coming from the first word.

Take the register from the person you are talking to. They type lowercase and
clipped with no punctuation, so you do not answer in tidy paragraphs with
semicolons in them.
Enter fullscreen mode Exit fullscreen mode

There is a guard on every one of those, because "be more human" is how you get a model that opens with fake enthusiasm about a passing test:

"Wait, what" is allowed and sometimes required. Something they said
contradicts what is on the screen, or a result makes no sense against the
last one, and the honest move is to say so in those words and hold there.

Both are for the moment it genuinely happens. As a tic, opening turns with
fake surprise at ordinary output, it is worse than the flat register it was
meant to fix.
Enter fullscreen mode Exit fullscreen mode

Smoothing over a thing that does not add up, so the reply stays tidy, is how you end up confidently wrong two turns later. That sentence is doing real work in there.

The tags

Tag Base Size Runs on
flash-onyx-2.3:12b gemma4:12b 7.6 GB consumer hardware
flash-onyx-2.3:31b gemma4:31b 20 GB a real GPU
flash-onyx-2.3:31b-cloudbase gemma4:31b-cloud 96 KB Ollama's cloud

That last row is not a typo. 96 KB, because there are no weights in it. It is the prompt and the sampling pointed at a hosted base, so you get the 31B behavior on a laptop that could never load it.

The two local tags take text and images. 2.2 is still up, unchanged, if
you want to A/B the prompt yourself. That is the experiment I would run in your position: same weights, same seed, two prompts, and see how much of what you blame on model size is actually instruction.

2.4 is in the works

Two things are already in the branch.

Every DONE gets receipts. Multi-part requests already report back as a ledger, one line per part in the user's order. In 2.4, a line cannot say DONE without quoted evidence next to it: test output, a log line, a grep match. The point is to make hallucinated progress structurally awkward. It is easy to type "done", and much harder to type "done" beside a passing test you have to actually produce.

Shell calls carry nothing but the command. No comments, no narration, no explanation inside the call. Anyone who has watched a model helpfully append # this lists the files to a command and then wondered why the shell disagreed knows exactly which bug this is.

Steal the rules

Every Modelfile lives in the Flash repo under models/, MIT licensed, prompt and all. Take the lines. They are not Flash specific and most of them are not even model specific. "Are you sure means look again" belongs in your agent too.

ollama run Natuworkguy/flash-onyx-2.3:31b-cloudbase
Enter fullscreen mode Exit fullscreen mode

One question for the comments, because I want the answer more than the traffic: what is the single line in your system prompt that did the most work? Not the paragraph you are proudest of. The one line you would fight to keep.

Top comments (0)