spark 1.37 . by forgewright-ai

Roadmap

What comes after v1.37, in the order it is likely to happen. Nothing here is a promise; a row in CHANGELOG.md is. docs/IDEAS.md is the field this is picked from.

The rule for this stretch: spark has one user, on one box, and what that use measures goes first. No new contract and no new verb until the first two items below are done -- fourteen contracts is more surface than one person lives in, and the two numbers that describe the daily experience have been sitting in the ideas file behind the test suite.

1. The wait for the first line is the model's own speed

Measured 2026-09-14 on the box's 12B with v1.32's instrument, a 14 kB source, the same question three times, a chat in between the second and the third:

So the prefix cache holds, the reading pass restates the same bytes, a chat in between does not evict it, and --cache-ram 0 costs nothing. Item 1 as first written (the rerun costs what the first run cost) was wrong: the rerun saves exactly the prefill, and what remains is generation -- 90 tokens at 4.9 tok/s -- plus the reading pass. The 9 s first line of the original note is a 12B writing thirty-odd tokens at that speed. Three levers, in order:

Measured 2026-09-14, the three rows that fit the box's 9 GB, one model in both roles, a 6 kB source that answers, the audition once each:

modeltg tok/sreading passfirst line cold / warmaudition
Gemma 3 12B5.57.6 s20.1 s / 8.0 s5/9
Qwen3 8B8.73.9 s19.8 s / 5.0 s7/9
Qwen3 4B16.22.3 srefused both5/9

The decision is the 8B: faster than the 12B and better grounded, and the 4B's speed buys nothing when the gate drops every line it writes. spark model qwen3-8b on the box, one command, and the first lever is pulled. What stays open, in order: the reading pass in-stream (3.9 s of every read on the 8B), then --warm (the cold first line is 20 s on either model and 5 s warm: the prefill and the pass are the cold cost, and typing hides them).

Not levers: the cache flag, the message order (the prefix already hits), a shorter brief (a few lines is already the ask). One note on the instrument: first_ms exists only on a kept answer -- a refusal has no first line, so a source cut where the answer is not (a man page's boilerplate, a wiki's navigation) measures the whole wait and records no first line; measure with a source that answers.

2. Grounding, graded on every row auto may pick

Three rows carry a _GROUND score (Qwen3 8B 21/27, Qwen3 4B 5/9, Gemma 3 12B 5/9 -- the two new ones from a single run, so plus or minus one). Three rows proven on the line carry none (1.7B, 14B, 30B-A3B), and auto prefers a grounded row when two fit the budget -- so the preference is still blind between those.

3. Live in it, and let the turn records pick

spark stats reads the turn records -- numbers only, never words. For the length of this stretch the roadmap is read from them, not written from the founder's chair:

4. The first other person

Before an issue tracker exists: one person, known, installs spark unattended on their own machine with nothing but the README, and says what broke. CI's container proves the one-liner on a clean image; it does not prove it on a laptop with a life on it. Issues open after that conversation, not before -- a founder is the worst reporter of their own product, and a public tracker with nobody behind it is worse than a closed one.

5. Chaos on a real box

What a fixture cannot reach is the maintainer's, by hand, as the WSL pass is:

Then the two shapes the suite still cannot express: a scenario whose remedy needs the network (a re-download after spark model rm), and one that must survive a reboot.

(A shared engine as a system service is parked in docs/IDEAS.md: only worth weighing once the group model has been lived with.)

source: ROADMAP.md on GitHub -- this page is that file at spark v1.37