Skip to content

spritzer 0.4.1 -> 0.5.0, and the turn completes every time - #109

Merged
jhgaylor merged 1 commit into
mainfrom
spritzer-0.5.0
Aug 7, 2026
Merged

spritzer 0.4.1 -> 0.5.0, and the turn completes every time#109
jhgaylor merged 1 commit into
mainfrom
spritzer-0.5.0

Conversation

@jhgaylor

@jhgaylor jhgaylor commented Aug 7, 2026

Copy link
Copy Markdown
Contributor

spritzer:0.4.1 was released 2026-07-14. The two fixes this repo needed merged
on 08-03 and 08-04. latest and 0.4.1 were byte-identical manifests, and
the release workflow only fires on a v* tag — so nothing published carried
either fix, and every deployment kept reproducing a bug that was already fixed
on main. spritzer 0.5.0 is now
cut; this moves to it.

What closes

With fountain#603 already in the v0.6.1 pin, three fixes across two repos:

fountain#603 a lost stdin write crashed the ConversationServer; the restart found the sandbox ready, reattached, and orphaned the turn
spritzer#19 an unupgraded GET on the exec path answered 426 instead of the session list — the call fountain makes before deciding to reattach
spritzer#20 an unrecognised command now holds its exec session open until stdin EOF, so the prompt reaches a process that is still there

Measured

34 of 34 conversations completed at fountain v0.6.1 + spritzer 0.5.0,
including batches fired back to back — the pacing that used to fail most. Zero
crashes, zero reattaches, zero 426s, zero :command_exited.

0.4.1 0.5.0
completed 13 of 30 34 of 34
failed :command_exited 17 0

And the prompt now makes the round trip, which is more than an exit code:

event: output  claude --dangerously-skip-permissions --print --verbose …
event: output  Reply with the single word: fountain
event: stage   turn  done  {"exit_code":0}

The gate stops hedging

It asserted a result, then a pairing, then only observed which ending it saw.
Each retreat was right at the time — the ending was a race. It is not one now,
so both former outcomes become failures, and each names the pin that must have
moved:

✗ the turn was orphaned behind a reattach — fountain#603 or spritzer#19
  regressed, or the pin rolled back
✗ the runtime exited before the prompt was written — spritzer#20 regressed,
  or spritzerImage rolled back below 0.5.0

verify-conversation goes back to one assertion for both planes: exit 0 and
output streamed.

Docs

Completing a turn moves to Verified, and Does not work is now empty —
with a line saying why, so an empty section does not read as an oversight.

That the local turn is the echo rather than a model stays as a qualifier on the
Verified row and in data-plane.md's what it will never prove, where it
belongs. It is not a defect of this deployment: whether a model replies depends
on a real data plane and a tenant's own inference credentials, which is outside
what this repo deploys.

data-plane.md keeps the history in a collapsed note rather than deleting it.
This was described wrongly three times — as an arm64/amd64 split, then as a
dispatch race "decided by machine speed" from 5-of-5 and 2-of-2 samples, then
as "no turn finishes, by upstream design" while v0.6.0 was completing 13 of 30.
Every one was a small sample of a coin flip read as a property, and that is
worth leaving on the page.

Verification

just e2e green from nothing at these pins, with the strict gate:

✓ registered and verified e2e-1786080723@example.com
✓ e2e-1786080723@example.com is admin, audit-recorded
── the conversation gate ──
✓ the turn completed, prompt echoed back — the echo, not a model
✓ every seam validated
✓ e2e: every documented claim held, from nothing, and the cluster is gone.

just check and just site clean.

Supersedes #105, which described a race this makes historical — I will close it.

🤖 Generated with Claude Code

Both spritzer fixes this needed merged on 2026-08-03 and 08-04, three weeks
after v0.4.1 was tagged. `latest` and `0.4.1` were byte-identical manifests
and the release workflow only fires on a `v*` tag, so nothing published
carried either one and every deployment kept reproducing a bug that was
already fixed on main. spritzer 0.5.0 is now cut and this moves to it.

What that closes, with fountain#603 already in the v0.6.1 pin:

  #603  a lost stdin write crashed the ConversationServer, and its restart
        found the sandbox `ready`, reattached, and orphaned the turn
  #19   an unupgraded GET on the exec path answered 426 rather than the
        session list, which is what fountain asks for before reattaching
  #20   an unrecognised command now holds its exec session open until stdin
        EOF, so the prompt reaches a process that is still there

34 of 34 conversations completed at these pins, including batches fired back
to back — the pacing that used to fail most — with no crash, no reattach, no
426 and no :command_exited. The prompt is written as stdin and comes back on
stdout, so what is asserted is a round trip and not just an exit code.

So the gate stops hedging. It asserted a result, then a pairing, then only
observed which ending it saw, and each retreat was correct at the time
because the ending was a race. It is not one now, so both former outcomes
become failures, and each says which pin must have moved to produce it.

Completing a turn moves to Verified. `Does not work` keeps the claim that
was always the real one and never moved: nothing here talks to a model.

Verified: `just e2e` green from nothing at fountain v0.6.1 + spritzer 0.5.0.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@jhgaylor
jhgaylor merged commit 25497ec into main Aug 7, 2026
2 checks passed
@jhgaylor
jhgaylor deleted the spritzer-0.5.0 branch August 7, 2026 05:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant