# fix(e2e): make vogon REPL ignore empty lines

`397280a`→[main](/content/gh/entireio/cli/commits/main/index.html)·

pfleidi·2w ago·2 files·+13 added/-8 removed

TmuxSession.Send may retry Enter when the pane does not visibly react
within its 2s window. Vogon treated an empty stdin line as session
termination, so on a slow runner a retried Enter could end the session
mid-test. Exit only on explicit exit/quit and update the comments that
described the pre-rewrite Send semantics.

## Sessions

ffcdd5a7efd3View transcript

[?\
Debug E2E Test Timing IssuesClaude Code·Opus 4.8[1m]·1 step](/content/gh/entireio/cli/session/58280a70-c670-4b2d-a1c8-80439ef7460d#timeline-ffcdd5a7efd3/index.html)

## Changes

2

- e2e

- agents

- Mtmux.go+3/-2

- vogon

- Mmain.go+10/-6

```
80 unmodified lines

81
82
83
84
85
84
85
86
87
88
89

80 unmodified lines

s.stableAtSend = stableContent(s.Capture())

// Verify the pane reacted to Enter; a swallowed Enter leaves the prompt
	 // sitting unsubmitted in the input box. Retry a couple of times — Enter
	 // on an already-submitted (empty) input box is a no-op.
	 // sitting unsubmitted in the input box. Retry a couple of times — TUIs
	 // treat Enter on an already-submitted (empty) input box as a no-op, and
	 // the vogon REPL ignores empty lines.
	 for range 3 {
	 	 preEnter := s.Capture()
	 	 if err := s.SendKeys("Enter"); err != nil {
```

Me2e/agents/tmux.go+3/-2

```
63 unmodified lines

64
65
66
67
67
68
69
70
71
72
73
74
70
71
72
73
74
75
76
77
78
79
80
81

63 unmodified lines

scanner := bufio.NewScanner(os.Stdin)
	 for scanner.Scan() {
	 	 line := strings.TrimSpace(scanner.Text())
	 	 if line == "" || line == "exit" || line == "quit" {
	 	 	 if line == "exit" || line == "quit" {
	 	 	 	 break
	 	 }
	 	 // Give tmux's Send() time to capture the echoed-input state
	 	 // before we produce any output. Send polls every 200ms; without
	 	 // this pause, vogon output appears in the same capture window
	 	 // as the echo, causing stableAtSend to include final output and
	 	 // preventing WaitFor's contentChanged detection.
	 	 // Ignore empty lines: tmux's Send() may retry Enter when the pane
	 	 // doesn't visibly react in time, and treating that as termination
	 	 // would end the session mid-test.
	 	 if line == "" {
	 	 	 continue
	 	 }
	 	 // Give tmux's Send() time to observe a distinct pre-output pane
	 	 // state, so its Enter verification and WaitFor's contentChanged
	 	 // detection see a clean echo -> output transition.
	 	 time.Sleep(700 * time.Millisecond)
	 	 fmt.Fprintln(os.Stdout, "Working...")
	 	 runTurn(dir, cfg.sessionID, transcriptPath, line)
```

Me2e/vogon/main.go+10/-6
