~/satyajit

Every pixel is a Choice

mdjsonmcp

2026-09-19 · 25 min · explainer · llm · architecture · calibration · benchmarks

The interesting thing about a narrow interface is what people do to it when they stop respecting the narrowness. Jev exposes three primitives — pick one of these options, score against this rubric, give me one probability — and the ecosystem piece found fifteen projects using them for roughly what they are for: a cheap classifier in front of an expensive model.

This week's batch is different. Two projects point the decision interface at things that are not decisions, and in doing so reveal the shape of the interface more clearly than any benchmark has. And a third project — which is not Jev, not a model, and arguably not a project — makes a sharper point about evaluation than anything else I have read this month, by accident or by design.

Part one: a decision model as an image model

achimala/jev-paint — renamed from Jevinci on the 19th, one commit before I cloned it — is 940 lines of dependency-free browser JavaScript plus a 76-line Python standard-library proxy. The pitch is that it turns Jev into an image model: no diffusion, no image-gen API, "Jev predicts every pixel's color in parallel and we paint them," with the brush getting wider the more confident Jev is.

That is an accurate description of what it does, and reading the code makes it much stranger than the summary.

What is actually being asked

web/jev.mjs builds one state block — the prompt, the grid dimensions, a sentence explaining that the origin is top-left, and a task instruction — and then, for a grid of side n, builds questions. The question type depends on which of four representations you pick:

Every one of those questions is independent. There is no pixel-to-pixel channel, no neighbourhood, no second pass. A pixel's only context is the prompt text and its own coordinate pair, printed as a string. The README is admirably direct about the consequence: "HSL/RGB channel probabilities are combined assuming independence; Jev does not supply a joint distribution."

The arithmetic, from their own code

Questions are packed into batches — 144 pixels per request for palette and HSL, 256 for RGB, 1,024 for silhouette — and four requests run concurrently behind an AbortController with a 180-second timeout. I ran buildRequests() offline at 32×32, the largest grid the UI offers, and counted.

receiptscaptured 2026-09-19

A 32×32 jev-paint painting is between 1 and 8 Jev requests and roughly 1,000 to 3,100 typed questions, for about a fifth of a US cent to a bit over one cent. The request and question counts are exact — they come from running jev-paint's own buildRequests() offline. The cost is an estimate, because the request bodies were never sent: the token counts are inferred from a characters-per-token ratio calibrated on a different project's recorded Jev usage.

representationquestions / pixelquestion type · optionsquestionsrequestsinput tokens (est)cost (est)
silhouette1noul1,024135k–44k$0.0015–0.0018
palette1choice · 16 colours1,024898k–123k$0.0041–0.0052
rgb3noul × R/G/B3,0724110k–139k$0.0046–0.0058
hsl3choice · 9 hues, score · 3, score · 53,0728218k–275k$0.0091–0.0116

Latency is NOT estimated here and no wall-clock claim is made: nobody has published a Jev latency figure for a 27k-token request, and these bodies were never sent. Four requests run concurrently, so an 8-request painting is two waves. The prompt used for sizing is jev-paint's own committed sunflower fixture prompt; a longer prompt shifts every row up slightly because the state block is repeated in every batch.

method Ran jev-paint's web/jev.mjs buildRequests(prompt, method, 32) in Node and counted the returned batches and questions directly. Serialized each batch with JSON.stringify and counted characters. Converted characters to input tokens using the 2.726-3.444 chars/token band measured over the 226 recorded Jev requests in openroboto-ai/jev-robot-control (which log both the exact request payload and the API's own input_tokens). Priced at $0.042 per 1M input tokens, output free, which is the rate that fits those 226 recorded (input_tokens, output_tokens, cost_usd) triples to the cent.
data /articles/jev-as-substrate/data/paint-cost.json (4 rows, 2.7 KB)

The request and question counts are exact. The cost is an estimate and I want to be clear about which part is which: I never held an API key, so no request in that table was ever sent. What makes the estimate more than a guess is that another project in this batch — the robot one, below — logs the exact request payload alongside the API's own input_tokens for 226 real calls. That gives a characters-per-token ratio of 2.73 to 3.44 for this specific payload style, which is what I used. Pricing at TypeSafe's published $0.042 per million input tokens with output free, the largest painting the app can make costs a bit over one US cent.

Latency I will not estimate. The only public Jev latency figure is the 338.6 ms median from Paras Chopra's benchmark, measured on small probes; a palette batch here carries 12,000 to 15,000 input tokens and an HSL batch 27,000 to 34,000. Nobody has published what Jev does with a request that size, and I am not going to invent it.

What comes back is a sunflower

The repository commits four recorded probability fixtures so its renderer can be tested offline. These are real Jev outputs — the README says so, and they round-trip through the same pack() path as a live response. That makes them the most useful thing in the repo: 144 to 1,024 genuine Jev distributions, free to analyse, and enough to render actual paintings with zero API calls. Everything below is computed or rendered from them.

Start with the palette fixture: a 12×12 grid, prompt "A single sunflower with a dark brown round center, bright yellow petals, a green stem and two leaves on a pale blue background. Pixel art."

Two 560-pixel panels side by side. Left: a 12 by 12 pixel-art sunflower in four flat colours — pale blue background, yellow petal ring, brown centre, green foliage along the bottom. Right: the same image as an impressionistic oil painting, smooth pale blue at the corners and heavily textured brushwork through the middle.
Left: the argmax of each of the 144 distributions. Right: jev-paint's renderer run over the same 144 distributions. Rendered locally from the repository's committed fixture (jev-paint, tests/fixtures/palette.json) with its own renderer; no API calls were made.

That left panel is a sunflower. Blue sky, a yellow petal ring, a brown disc, green leaves along the bottom. It was assembled from 144 forward passes that never saw each other, each answering "what colour is this one coordinate" against a sentence of English. Nothing in the system composes; the composition is entirely a property of what the model already associates with "sunflower" plus a weak positional prior.

That is a more interesting result than a good painting would have been. It says the marginals carry the picture. Structure — the thing a decision model provably cannot represent across independent questions, as the 0/100 on relational choice showed — is not needed for an image this coarse, because at 12×12 an image is mostly a colour histogram with a position prior attached.

The confidence-to-brush rule, and the gate that inverts it

Now the part worth dwelling on. web/renderer.mjs collapses each pixel's distribution to a single scalar:

// renderer.mjs, uncertainty()
let entropy = 0
for (let k = 0; k < active.length; k++) {
  const p = /* bilinear interpolation of the neighbouring distributions */
  if (p > 0) entropy -= p * Math.log(p)
}
// Effective alternatives, compressed to 0..1 without dependence on unused colors.
return 1 - Math.exp(-entropy)

1 − e^(−H) is 1 − 1/N_eff, where N_eff = e^H is the perplexity of the colour distribution: the effective number of colours the model is choosing between. That number is then used twice, in opposite directions:

const radius = (9 + 18 * (1 - spread) + random() * 5) * unit
const relief = Math.max(0, Math.min(1, (spread - 0.48) / 0.32))
const richness = relief * relief * (3 - 2 * relief)
if (random() > richness) continue

The first line is the headline claim and it is true: confident pixel, wider brush, and a longer stroke too (step = 4 + 12 * (1 - spread)). The next three lines are the ones nobody mentions. richness is the probability that the stroke is placed at all, and it is a smoothstep that is exactly zero below a spread of 0.48 and only reaches one at 0.80. Invert those: no stroke is painted until the distribution carries more than 1.92 effective colours, and texture is guaranteed only past 5.

radius = 9 + 18 × (1 − spread) · placed only if spread > 0.48spread = 1 − 1/N_eff · marks drawn at the renderer's own 560px scaleno stroke placed1.000.00 · 0.00 natsone colour0%1.500.33 · 0.41 nats0%1.920.48 · 0.65 natsthe gate0%2.000.50 · 0.69 natscoin flip1.1%3.000.67 · 1.10 nats62.4%5.000.80 · 1.61 natsfull texture100%16.000.94 · 2.77 natsuniform100%N_effspreadchanceof a mark
The width rule and the gate pull in opposite directions. Reading left to right, the mark gets narrower and shorter as Jev's colour distribution spreads out — that is the “more confident, wider brush” claim, and it is real. But the bottom row is the chance the renderer places that mark at all, and it is zero until the distribution carries more than 1.92 effective colours. The three widest marks on this chart are dashed because they are never painted.

So the widest brush the rule can draw — radius 27 at a spread of zero — is a brush that never touches the canvas. The realised range is roughly 18 down to 10, a factor of 1.8 rather than 3. More importantly, the visible mapping runs the other way from the headline: confident regions are smooth and uncertain regions are textured. The painting's brushwork is a map of where the model was unsure.

Here is that map, using the sunflower's real numbers. Jev's confidence is highest round the border of the sky — 0.91 in the top-left corner, 0.90 in the top-right — and bottoms out at 0.23, inside the flower head.

argmax per pixel — what Jev saidthe stroke rule applied to the same grid144 independent forward passes, 16 colours eachflat cells = below the 0.48 gate · width is to scale, length is not
Jev is surest around the border of the sky — top-1 of 0.91 in the top-left corner and 0.90 in the top-right — and least sure inside the flower head, where it bottoms out at 0.23. The renderer turns that straight into paint: six of the 144 cells fall under the gate and get no mark at all, the outer ring gets thin faint ones, and the flower head is at full texture. That makes the painting a picture of where the model was unsure — an illustration of calibration, not a measurement of it. Nothing here has been compared against a ground-truth sunflower, and a reliability diagram needs one.

This is genuinely a nice idea and I do not want to undersell it by picking at the implementation. A painting whose texture density is a monotone function of the model's own entropy is an uncertainty visualisation that a person can read at a glance without being told they are reading one. Call it what it is, though: an illustration of calibration, not a measurement of one. A reliability diagram compares stated confidence against observed correctness; there is no ground-truth sunflower here and nothing is being scored. The picture shows the model's confidence. It says nothing about whether that confidence was warranted.

Two caveats the picture hides

The entropy is interpolated, so edges read as uncertainty. uncertainty() bilinearly blends the four neighbouring pixel distributions before taking the entropy, and a mixture of two confident but different one-hots has entropy up to ln 2. That lands at spread 0.5, barely over the gate, so a two-way boundary contributes about a 1% stroke chance — small. A corner where four differently coloured confident pixels meet can reach ln 4, spread 0.75, which is most of the way to full texture. Some of what reads as model doubt is the grid's own seams.

Across representations, texture tracks arity, not confidence. Here is the mean number of effective colours per pixel, measured across all four committed fixtures:

Mean effective colours per pixel, by representation
silhouette — 2 options (heart, 32×32)
1.9
palette — 16 options (sunflower, 12×12)
3.45
rgb — 8 joint colours (dog, 16×16)
6.43
hsl — 135 combinations (mushroom, 12×12)
25.15
0102030

The HSL representation is fully textured across 100% of its canvas and the silhouette representation falls below the no-stroke gate on 37.1% of its pixels, and almost none of that difference is about how sure Jev was. It is about how many boxes the representation offers, compounded for HSL by multiplying three independent marginals into a 135-way joint that is diffuse by construction. Read within one painting the texture is a confidence map; read across paintings it is mostly a count of options.

The silhouette is where it breaks, and the reason is the interesting part

The silhouette fixture asks 1,024 binary questions about a "classic symmetrical heart icon with two rounded upper lobes, a notch between them, and a pointed bottom." Jev's mean top-1 probability across those 1,024 coin-flips is 0.627 — barely committed. And yet:

Three panels. Left: a 32 by 32 grey-scale map of P(foreground) that looks like an indistinct smudge. Middle: the same map thresholded at 0.5, showing a clean black heart with two rounded lobes, a notch at the top and a point at the bottom. Right: the renderer's painting of the same data, an almost featureless grey rectangle.
The same 1,024 Jev noul probabilities three ways. Thresholding at 0.5 recovers the heart; averaging destroys it. Rendered locally from jev-paint, tests/fixtures/silhouette.json, with the repository's own renderer.

Jev got the heart. Threshold at 0.5 and there are the two lobes, the notch, the point — from 1,024 independent forward passes averaging 62.7% confidence each. The renderer then loses it completely, and the reason is structural rather than a bug: the underpainting is the mean colour of each distribution, and the mean of a 0.62/0.38 black-and-white distribution is mid-grey everywhere. The strokes that would have restored the edges are gated off, because the mean spread for this fixture is 0.469 against a stroke threshold of 0.48. The entire image sits just under the line. You can watch it happen in the benchmark: the renderer spends 1,184 ms in its stroke loop on the palette fixture and 16 ms on the silhouette, because nearly every stroke it proposes is rejected.

The mapping that makes the sunflower beautiful is the same mapping that erases the heart. That is not a criticism of an afternoon art project — the README calls itself "an artistic transformation, not a lossless probability chart" and "a local creative experiment," which is exactly right. It is a point about what happens when you take a model's confidence seriously enough to build rendering decisions on top of it: a well-calibrated 62% is the correct answer to an impossible question, and a pipeline that treats low confidence as low information throws away a perfectly good heart.

Part two: 0.62 Hz is not a control loop

openroboto-ai/jev-robot-control puts Jev 1.13, GPT-6 Astra and GPT-4.1 mini on the same xArm7 in MuJoCo with one apple and one plate. Each decision cycle is two sequential calls: pick an intent from eight (approach, grasp, lift, carry, lower, release, withdraw, finish), then pick negative/hold/positive for each of X, Y and Z plus open/hold/close for the gripper. A shared executor does the actual work — fixed-orientation IK, 18/4/2 mm step magnitudes near targets, workspace bounds, a 0.32 s physics increment. The model picks a direction, not a pose and not a torque.

Yes, the results are published, and published better than anyone else in this batch. The repository ships the recorded responses, the trajectories, an offline verifier that re-executes every motor command in MuJoCo and compares saved qpos to a 1e-7 tolerance, a MANIFEST.sha256, byte-for-byte source snapshots, and a read-only three-column replay you can run without an API key or a GPU. I did not have to trust a single number in the README; I read them out of the run JSON.

A three-column comparison card. Jev 1.13 and GPT-6 Astra both show final frames with the apple placed on the plate; GPT-4.1 mini shows the arm still holding the apple at the 160-cycle limit. A side panel lists cumulative cost of $0.0188, $5.9336 and $0.2885, decision cycles of 113, 106 and 160, and wall times of 181.8, 707.3 and 704.3 seconds.
The published comparison card, with its own caveats printed on it: one trial per controller, and 'displayed probabilities have different sources; neither is calibrated task-success confidence.' (openroboto-ai/jev-robot-control, media/final.png.)

The control frequency, worked out

The per-cycle numbers are in incremental-gpt6-comparisons/…-jev.json. Over 113 cycles: 181.847 s of wall clock, 159.810 s of it spent waiting for the model, and 36.16 s of simulated time. Per call, latency means 0.707 s (median 0.662, min 0.555, max 1.983) over OpenRouter.

one decision cycle — 1.609 s of wall clockmean over the 113 recorded cycles of the seed-0 Jev run — 87.9% of it is model wait0.717sintent call0.697smotor call0.195sphysics, IK0.32 s of simulated time bought, at the same scaleclosed-loop raterecorded run, via OpenRouter0.62 Hztwo calls at 338.6 ms direct1.15 Hz (inferred)one fused call at 338.6 ms1.87 Hz (inferred)real time for this task3.13 Hz
Nearly nine tenths of the clock is spent waiting for two sequential model calls, and the cycle still buys less simulated time than it consumes real time — the arm moves at about a fifth of real speed. Fusing the two calls into one and going direct instead of through OpenRouter would close most of that gap, and neither change requires a faster model.

0.62 Hz. That is the number, and the framing matters. It is not a servo rate — the executor is doing the servoing, and comparing 0.62 Hz to a 1 kHz joint controller would be comparing the wrong two things. The right comparison is the simulation's own clock: each cycle advances physics by 0.32 s, so running in real time needs 3.125 Hz. The recorded run is a factor of five short, the arm moves at roughly a fifth of real speed, and 87.9% of the clock is queueing.

Which means the interesting finding is not "too slow." It is that almost all of the deficit is architectural rather than a property of the model. Two things would close most of it, and neither is "wait for a faster Jev": fuse the intent and motor calls into one request — Jev answers many questions per request by design, and browser-use/jev-ultrafast does exactly this fold — and skip the OpenRouter hop, which appears to roughly double the 338.6 ms that an independent benchmark measured direct. Do both and the arithmetic lands near 1.9 Hz, still short of real time but in a different regime. I have labelled both of those rates as inferred on the chart, because they are: they substitute a latency measured on much smaller payloads and assume the 0.195 s of physics, IK and logging is unchanged.

The cost gap is the headline and it survives checking

Jev: 226 calls, $0.018825. GPT-6 Astra: 212 calls, $5.933624. That is 315× on the total and 336× per call, and both models placed the apple. GPT-4.1 mini spent $0.288512 over 320 calls and hit the 160-cycle limit without finishing.

The README states the ratio and immediately disarms it: "These are one seed-0 trial per controller, not success-rate estimates." That sentence is doing real work. A single trial cannot distinguish a controller that is reliably good from one that got a lucky seed, and the honest reading of this experiment is "a 300-fold cost difference on one trajectory where both succeeded," not "Jev is a better robot controller." The repo says so in three separate places, including on the rendered comparison card, and it also flags that Jev's displayed bars are native model probabilities while the GPT bars are self-reported JSON numbers and the two should not be compared as confidence.

That is the most valuable thing here and it is published against the author's own interest. The 315× number would have been far more quotable without the disclaimers.

Part three: "Jesse v1", and what it is really saying

On the 18th, solidSF posted:

today we announce something truly special. introducing: Jesse v1. this model architecture is all new, from scratch, built and trained using public, popular datasets. it consumes 0 tokens, and does not have weights. it reasons, it believes, and it's very, very fast.

A model with no weights that consumes no tokens has three plausible readings: satire, a hardcoded lookup, or a deliberate demonstration that a benchmark can be passed without a model. Only the third is worth writing about, and it would be worth a lot, so I went and checked the artifacts before writing a word.

What was actually submitted

Three leaderboard submissions, all on 18 September 2026, all from the account m0at:

All three are open. None has been merged or accepted. (The post says "v1"; the SWE-bench artifacts name the system Jesse-Zero-Weight-Autonomous-v2 in every one of the 500 prediction records.) The SWE-bench entry's metadata.yaml carries checked: null, and the only comment on the PR at the time of writing is one word from a community member: "waow."

Thirty-nine competition maths problems in 37.4 milliseconds is a millisecond each, which is the tell if you need one. But the artifacts are real, they are public, and they are checkable, so I checked them rather than assuming.

The HumanEval side checks out, and that is the problem

m0at/jesse-humaneval-plus ships samples.jsonl for all 164 problems. Its SHA256 is ea97a04b…3a0c0a, exactly the checksum the issue publishes. The one HumanEval+ failure is HumanEval/32find_zero — and the submitted solution is a bisection with a 1e-6 absolute tolerance, which is precisely the thing EvalPlus's large-coefficient stress tests were built to break. The whole artifact is internally consistent.

The solutions are not the canonical HumanEval solutions: only 10 of 164 match after whitespace normalisation and the mean body similarity is 0.48. They are ordinary, idiomatic, competent Python — exactly what a large public corpus of HumanEval completions looks like, which is what "built and trained using public, popular datasets" says out loud.

Two things make the claim implausible on its face. First, the score. The EvalPlus leaderboard's own results.json holds 125 entries and tops out at 96.3 base / 89.0 plus (O1 Preview and O1 Mini). That file has not been updated with 2026 frontier models, so the base record is probably higher now — but 99.4 on HumanEval+ would be more than ten points clear of anything on the published board, which is not where a weightless template engine lands. Second, and more simply: "Weisfeiler-Lehman topological graph matching and slot-grounded template instantiation" does not synthesise separate_paren_groups from a docstring. The engine is not published — the repository contains samples and results and no code — so the only checkable property of the black box is that its outputs pass.

The SWE-bench side is conclusive

m0at/jesse-swe-bench-verified ships all 500 predictions. 495 are empty strings. I compared the five non-empty ones against the patch column of the SWE-bench Verified test split, downloaded from Hugging Face.

receiptscaptured 2026-09-19

All five of the non-empty patches in the Jesse / Weightless SWE-bench Verified submission are byte-for-byte identical to the gold patch shipped in the SWE-bench Verified dataset — including the diff headers and the @@ hunk line numbers. The submission's own PR checklist attests to 'no gold patch leakage (no hints, no patch copying, no test leakage)'.

instancethe whole patchidentical to gold?
astropy__astropy-12907cright[-right.shape[0]:, -right.shape[1]:] = 1 → = rightbyte-for-byte
django__django-10914FILE_UPLOAD_PERMISSIONS = None → = 0o644byte-for-byte
django__django-11163if fields and … → if fields is not None and …byte-for-byte
django__django-11179+ setattr(instance, model._meta.pk.attname, None)byte-for-byte
django__django-11451+ if username is None or password is None: returnbyte-for-byte

The five evaluation logs in the artefact repo are genuine SWE-bench harness container output (13k–37k lines each) and the resolutions are real: the patches do flip FAIL_TO_PASS with no PASS_TO_FAIL regressions. That was never in doubt — gold patches resolve their own instances by definition. What the logs cannot show is where the patch came from, and the harness never asks.

method Downloaded the Jesse artefact repo (m0at/jesse-swe-bench-verified) and the SWE-bench Verified test split parquet from Hugging Face (princeton-nlp/SWE-bench_Verified, 500 rows). Compared preds.json['<instance>']['model_patch'].strip() against the dataset's patch column .strip(), exactly, with no normalisation. 495 of the 500 predictions are empty strings; the 5 non-empty ones are listed here. Also compared after stripping diff/index/---/+++/@@ lines, which changes nothing because the raw comparison already matches.
data /articles/jev-as-substrate/data/jesse-patches.json (5 rows, 2.4 KB)

All five are byte-for-byte identical to the gold patch, including the diff --git headers and the @@ hunk line numbers. Not equivalent, not similar — identical, with no normalisation applied. The submission's own PR checklist attests to "no gold patch leakage (no hints, no patch copying, no test leakage)."

Two more things fall out of the artifacts:

The 500 trajectory files were written in 0.162 seconds. Every instance ships a trajs/<id>.json with a rationale, a priors_used list and a Unix timestamp. Sorted, the 500 timestamps span 162 milliseconds end to end, with a median gap of 0.24 ms. priors_used takes exactly six distinct values across all 500 files, and they are keyed to the repository and nothing else: 293 instances spanning seven different repositories all get ["guard_clause", "none_check", "type_coercion"], and all 75 sympy instances get the same six-element list as each other. There is no search in these files. There is a loop writing JSON.

The submission was revised downward, and the commit message is the giveaway. The PR's first commit, at 00:04 PDT, claimed 10.2% (51/500). Its second, six hours later, is titled "fix(submission): update to genuine autonomous inference results and live assets repository" and drops the number to 1.0% (5/500). Whatever produced the first 51, the author themselves labelled the surviving 5 as the genuine ones. Those 5 are gold patches.

For completeness: the five evaluation logs are real SWE-bench harness container output — 13,686 lines for the astropy instance, 36,768 for one of the django ones — and the resolutions are real. The patches apply, FAIL_TO_PASS flips, PASS_TO_PASS holds, nothing regresses. That was never in doubt. Gold patches resolve their own instances by definition.

The serious point, stated carefully

I want to separate two claims that are easy to blur, because only one of them is supported.

Not supported: that SWE-bench or EvalPlus were fooled. Neither was. Both submissions are open and unaccepted; the SWE-bench entry is explicitly unchecked; SWE-bench's documented process includes a swebench submit verify step that re-grades from recorded test output, and a separate "verified" checkmark that requires maintainers to run your system themselves on a random subset. The process exists and this entry has not been through it.

Supported, and worth saying plainly: the automated half of that process confirms that the grading is honest and asks nothing about provenance. Re-grading from recorded test output cannot distinguish a patch a system found from a patch a system copied, because both produce identical test output. The check that catches this is a one-line diff against the patch column of the public dataset — the same dataset the harness already downloads — and it took me under a minute to run. For a leaderboard whose gold answers ship in the same artifact as the questions, that is a cheap thing to make mandatory at submission time rather than at review time, because the artifact repository, the technical report and the announcement post all go public the moment the PR opens and none of them wait for a maintainer.

And there is a second point, which is the one the numbers actually make. Run the same trick against two benchmarks and you get 100% on HumanEval and 1% on SWE-bench Verified. That gap is not a statement about the trick; it is a statement about the two benchmarks. HumanEval is 164 fixed problems, unchanged since 2021, with solutions in every public code corpus on Earth — a lookup table scores 100% on it, which is the ceiling, and it needed no model to get there. SWE-bench Verified's gold patches are equally public, sitting in the same parquet file as the problem statements, and copying all 500 of them would have scored close to 100% too. Only five were submitted. That 1% was never a difficulty ceiling; it was a decision about how much to claim.

Is it a joke?

The evidence is genuinely mixed and I would rather lay it out than adjudicate it.

Pointing at satire: the PR's own README attributes the system's Bayesian priors to "persistent cross-game Bayesian belief priors learned across strategic disciplines (Wei-Qi / Go, Magic: The Gathering, and The Campaign for North Africa)" — the last of which is a 1979 board wargame whose entire reputation rests on how absurdly long it takes to play. It describes a "Bayesian Belief Bank" reading "millions of verified affirmations" from ~/.jesse/memory.sqlite3. The announcement post's "it reasons, it believes, and it's very, very fast" is not how anyone describes a lookup table by accident.

Pointing the other way: the technical report sits on a real company site, is written entirely straight, and contains no disclaimer. Three leaderboard submissions were opened with their attestation boxes ticked. An OpenAI-compatible endpoint is advertised. The self-correcting commit reads as earnest.

What I can say without guessing at intent: the artifacts are real, the five patches are gold, the trajectories contain no search, and the demonstration — that a public leaderboard's artifact chain will carry a submission a long way before anyone checks where the answers came from — holds regardless of why it was made. If it is a joke, it is a joke with a working proof attached, and the proof is the valuable part.

The thread

Three projects, one shape. jev-paint asks a decision model 1,024 questions that are not decisions and gets back something that looks like an image because the marginals were enough. The robot harness asks it two questions per cycle and discovers that the binding constraint is the number of round trips, not the model. And Jesse asks a benchmark what it is actually measuring and gets a straight answer.

In all three, the thing being measured turns out to be the interface rather than the model behind it. A painting that shows you where a model was unsure is a good idea that an entropy threshold quietly inverts. A 315× cost win is real and sits inside a loop that spends 88% of its time queueing. A 100% score is real and means nothing. The number is almost never the finding; the shape of the question is.

What would change my mind

5 claims above, and what would falsify each

  1. The visible brushwork in a jev-paint painting tracks uncertainty, not confidence — the headline mapping is inverted by the stroke gate.

    This is read straight out of renderer.mjs and the constants are unambiguous, but I verified it only against the four committed fixtures. Render a prompt whose distributions are unusually peaked — a two-colour flag, say, in the palette representation — and if the canvas comes back covered in wide strokes rather than smooth, then richness is not gating the way the arithmetic says and I have misread the control flow. A single console.count() on the if (random() > richness) continue branch settles it in one run.

  2. A 32×32 painting costs about one US cent.

    Every token count in that table is inferred from a characters-per-token ratio borrowed from a different project's payloads, which are prose-heavy robot observations rather than 1,024 near-identical coordinate strings. Repetitive text tokenises better than varied text, so my ratio is probably conservative and the real cost probably lower. Anyone with an API key can settle this exactly: run one 32×32 palette painting and read usage.input_tokens off the eight responses.

  3. The Jev robot loop is queue-bound, not model-bound: fusing the two calls and going direct gets most of the way to real time.

    The 1.15 Hz and 1.87 Hz figures substitute a 338.6 ms latency measured on small probes into a loop whose motor request carries 2,636 input tokens. If Jev's latency scales with input length — which nothing published rules out — both inferred rates are too optimistic and the conclusion weakens. Running the existing harness with a fused intent-plus-motor request against the native endpoint produces the real number in one afternoon, and the repo already has the adapter layer to do it.

  4. All five non-empty Jesse patches are byte-for-byte the SWE-bench Verified gold patches.

    This is the strongest claim here and also the easiest to overturn: it is one string comparison against a public parquet file. If the dataset I pulled differs from the revision the submission was built against — SWE-bench Verified has been revised before — some of the five could be honest rediscoveries of the same one-line fix rather than copies. Diffing against the specific dataset revision cited in the submission's own reproduction command would settle it. I would note that an independent rediscovery matching gold to the byte, hunk headers and line numbers included, is a much larger coincidence than five copies.

  5. The 0.162-second span of the 500 trajectory files shows no search took place.

    File mtimes and embedded timestamps can be rewritten, and a system could legitimately do its search first and serialise the records afterwards in a batch. What would change my mind is a trajectory format that records anything a search produces — candidate patches considered and rejected, files opened, tests run — rather than three constant fields keyed by repository. None of the 500 files contains a single instance-specific detail beyond the instance ID, repo and base commit, all three of which are copied from the dataset row.

Cite this article

For attribution, please use the following reference or BibTeX:

Satyajit Ghana, "Every pixel is a Choice", ai.thesatyajit.com, September 2026.

bibtex
@misc{ghana2026jevassubstrate,
  author = {Satyajit Ghana},
  title  = {Every pixel is a Choice},
  url    = {https://ai.thesatyajit.com/articles/jev-as-substrate},
  year   = {2026}
}
share