Repository navigation
fix: bug-hunt round — lifecycle, client framing, TUI state, input and layout fixes - #156
Merged
Merged
Conversation
…okens A scheme-less --url (127.0.0.1:8080) reached client.Do with a nil request and panicked; localhost:8080 parsed as scheme "localhost" and waited out the ready timeout. Attach URLs now default to http:// and anything that is not http(s) with a host is refused up front. Stop returned before retiring the orphan watchdog when the child had already been reaped, leaving the exited guard as a zombie (one per TTY retry). --token no longer overrides the token a spawned odek prints. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The signal handler stayed registered when the user quit from inside the TUI, swallowing the first Ctrl+C of the shutdown countdown. Bubble Tea winning the SIGINT race exited 1 with "program was interrupted", and -h printed usage twice before exiting 1. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A +dirty build (v1.2.0+dirty) failed the numeric parse and never saw an available upgrade. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
sendPrompt reset the composer on every path, so a queue drain, a queue-strip send or alt+r erased whatever the user was typing (and persisted the empty draft). submit already clears it before sending. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the find bar, a drawer editor or the @ / slash popup on screen, a bare a/d/t meant for that field decided an approval that had just arrived (t trusts the whole risk class). Only Alt+A/D/T decide there. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
An unknown slash name erased the draft (a prompt like /etc/hosts … was lost unrecorded); /run + enter ran /runs because the popup kept registry order; the find bar dropped spaces (KeySpace); the palette discarded multi-rune reads and pastes. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A session frame inside a drained batch bumped jobsWatchSeq but its tick rode a dropped per-event cmd, silencing background completion notes. The armed ^L confirm wiped a wake turn that started meanwhile, along with the approval odek was waiting on. A failed shutdown left shutdownReq set, so a later real drop never reconnected; a successful one mid-turn now marks the turn interrupted and seals live sub-agents. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
A plan tool_call cancelled before its tool_result left planDirty set with no confirm ever issued, so every later reply was dropped and the never-written plan stayed on the strip. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
applyJobs only clamped panelSel, so a job reaped above the selected row shifted the detail header and the stop gate onto a different job while the output pane stayed on the old one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Restaging keyed on the base name, so attaching b/README.md after a/README.md silently replaced it; restage now matches the path and a colliding name is qualified by its parent directory. /run dropped a pending /model choice the header still showed for the next turn. A queue-strip click located controls by the first glyph, so a ✕ in the prompt text armed delete. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The stats sheet appended its body to a box whose lipgloss Height is a minimum, not a clip; opening or closing a drawer detail never re-ran layout; and the clarify question was painted in full. Each pushed View past the terminal and the header off-screen. The detail scroll limit used the terminal height instead of the sheet's, leaving the end of long config / fact / job details unreachable. Episode prompts counted bytes as chars. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
odek drops the connection on an inbound frame over 8 MiB, and bodek allowed 10 MiB of attachments that json.Marshal grew further (HTML escaping turns each < into six bytes): the prompt vanished behind "connection lost". Frames now go out unescaped and an oversized one is refused with a reason. Close moved no deadline, so it waited up to 60s behind a write stuck on a half-open link, freezing the TUI's update loop on reconnect. A "session not found" 404 read as a missing route, permanently switching off the jobs watcher. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
odek < v1.27 has no plan route: its session handler parses "{id}/plan"
as the id and answers "session not found", the same body as a deleted
session. Mapping it to ErrSessionNotFound left those engines polling the
plan every second (charging odek's session lookup limiter) behind a
forever "loading plan…". Only the jobs route distinguishes the two.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The attach URL error fell into the startup diagnosis card, whose "retry: ⏎" re-ran Connect with the same bad value forever. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The new text-field gate also refused bare a/d/t under a stale slash popup the approval composer never re-syncs, leaving Alt-less terminals without a binding. The gate now covers only the find bar and drawer editors, and swallows the letter (with a hint that esc closes the field) instead of letting it type into the draft. A click on the queue strip's overflow tail, which echoes a hidden prompt, still scanned it for controls and could delete a different prompt. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
At 40 columns the stats overflow marker and the clarify hint wrapped to two rows the budgets counted as one, and the clarify budget ignored the shelf chip and queue strip — each left View one or more rows taller than the terminal. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Deploying with
|
| Status | Name | Latest Commit | Preview URL | Updated (UTC) |
|---|---|---|---|---|
| ✅ Deployment successful! View logs |
bodek | 20b3936 | Commit Preview URL Branch Preview URL |
Oct 17 2026, 02:37 PM |
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.
Third bug-hunt round. Five parallel hunters covered client/stores, server/lifecycle/update, TUI event ingestion, input and rendering. Each confirmed finding has its own commit and a regression test. An adversarial review pass then found regressions and gaps in some of those fixes; they are fixed here too.
Server / CLI
--url:--url 127.0.0.1:8080panicked with a nil request. Barehost:portnow defaults tohttp://. Anything that is not http(s) with a host fails fast, with no retry-card loop.--tokenno longer overrides the token a spawned odek prints.-hprints usage once and exits 0.+dirtybuild version now sees available upgrades.Client
Closemoves the write deadline in, so it can't wedge the update loop for up to 60s behind a stuck write./api/jobsno longer switches the jobs watcher off permanently. The plan route keeps its permanent 404, because odek < v1.27 answers the missing route with that same body.TUI state
alt+r) no longer wipes the draft being typed.^Lconfirm refuses once a wake/remote turn has started.plancall cut off before itstool_resultconfirms or reverts its optimistic patch.TUI input
a/d/tis swallowed with a hint and never decides an approval. Esc then restores the bare keys, and Alt always works./run) selects it over longer prefixes (/runs)./run: it keeps a pending/modelchoice for the next turn.Layout
Alt+PgUp/Alt+PgDn.Not in this PR
CREATE_NEW_PROCESS_GROUPdisables console Ctrl+C for the child, and Windows has no watchdog. It needs a Job Object guard first.Checks
make fmt,make vet,make lint(0 issues) andmake test(race, all packages green).🤖 Generated with Claude Code