Continue on non-fatal reactor errors and skip empty checkpoints - #892
Merged
Conversation
TheGreatAxios
commented
Sep 11, 2026
TheGreatAxios
left a comment
Collaborator
Author
There was a problem hiding this comment.
Review · Comment
Non-fatal reactor.error continues the run and empty checkpoints skip; the TUI mapper still clears hadTextDelta on that path.
Findings
src/tui/stream-event-map.ts:578— continue branch still setshadTextDelta = false, then returns an error event. After streamed text deltas, a laterconnector.replycan paint a second full assistant row. PreservehadTextDeltaon the non-fatal path.
Notes
- Fail-closed
fatal: falsegate is correct. Empty-checkpoint skip is load-bearing because isomorphic-git still mints a new oid on an unchanged tree.
TheGreatAxios
commented
Sep 11, 2026
TheGreatAxios
left a comment
Collaborator
Author
There was a problem hiding this comment.
Critic · Comment
isReactorErrorFatal is fail-closed; unique commit matches the title.
Findings
src/tui/stream-event-map.ts:578— non-fatal mapper clearshadTextDelta. Sequence: text deltas →{ fatal: false }after checkpoint →connector.replytreated as unpainted. Tests only assert “error without idle.”
Notes
stagedRewrite→liveTurnRefscopies the success path; skip test with junkpartial.jsonldoes not prove hash equality.
TheGreatAxios
force-pushed
the
cl-7641-fatal-checkpoint
branch
2 times, most recently
from
September 11, 2026 03:11
1bbf919 to
45b18f1
Compare
reactor.error with fatal:false is a recoverable stream signal; treating it as terminal idle/failed the TUI and run sink while the reactor kept going. Empty managed checkpoints were also creating new commits and risking session junk like partial.jsonl riding along — skip when no allowlisted path differs from HEAD.
TheGreatAxios
force-pushed
the
cl-7641-fatal-checkpoint
branch
from
September 11, 2026 03:23
45b18f1 to
8af755b
Compare
Empty managed checkpoints skip the git commit when no allowlisted path differs from HEAD. A staged rewrite is still unpublished on disk at that check, so skipping would publish it in memory without writing or committing. Only skip when nothing is staged to land.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
reactor.error(fatal: false) keeps the turn running:turnStateFromEventdoes not setstatus: "failed", the run sink does not sticky-fail, and the TUI paints the error without idling.partial.jsonl.Verification
bun run lintpasses (exit 0)bun run typecheckpasses (exit 0)bun run buildpasses (exit 0)bun run checkexits 1 on four tests that also fail onorigin/main(torn-base heal write, compact-commit hook, twoassembleChatAgentmocks)Fixes CL-7641