@@ -207,9 +207,45 @@ See commit `e95356aec` for the full diff of these changes.
20720713 . Working directory display in footer fallback
20820814 . Mode toggle hint in footer hints area
209209
210+ ** Double left border** — upstream only has a single border. Add the execution mode inner border using a ** row layout** (not nested borders — see below):
211+
212+ ```tsx
213+ < box border= {[" left" ]} borderColor= {borderHighlight()} customBorderChars= {{... SplitBorder.customBorderChars, bottomLeft: " ╹" }}>
214+ < box flexDirection= " row" >
215+ < box
216+ width= {1 }
217+ alignSelf= " stretch"
218+ border= {[" left" ]}
219+ borderColor= {modePrefixColor()}
220+ customBorderChars= {{ ... SplitBorder.customBorderChars }}
221+ / >
222+ < box paddingLeft= {2 } paddingRight= {2 } paddingTop= {1 } flexShrink= {0 } backgroundColor= {theme.backgroundElement} flexGrow= {1 }>
223+ {/* textarea + footer */ }
224+ < / box>
225+ < / box>
226+ < / box>
227+ ```
228+
229+ > ** Why row layout?** Nesting ` border={["left"]} ` boxes causes the inner border to appear 1–2 rows shorter than the outer because Yoga sizes each box independently. Using ` width={1} ` + ` alignSelf="stretch" ` in a row container guarantees both bars span identical rows.
230+
231+ ---
232+
233+ ### 12. ` packages/opencode/src/config/keybinds.ts `
234+
235+ ** Pattern** : Upstream may reassign ` agent_cycle ` to ` tab ` . Lash remaps Tab to shell autocomplete.
236+
237+ ** Resolution** : Ensure ` agent_cycle ` is on ` shift+tab ` , NOT ` tab ` :
238+
239+ ``` typescript
240+ agent_cycle : keybind (" shift+tab" , " Next agent" ),
241+ agent_cycle_reverse : keybind (" none" , " Previous agent" ),
242+ ```
243+
244+ Tab is handled in ` onKeyDown ` in ` prompt/index.tsx ` via ` handleShellTabCompletion() ` .
245+
210246---
211247
212- # ## 11 . `bun.lock`
248+ ### 13 . ` bun.lock `
213249
214250** Resolution** : Always regenerate after resolving all ` package.json ` conflicts:
215251``` bash
@@ -219,6 +255,42 @@ git add bun.lock
219255
220256---
221257
258+ ## Post-Merge QA Checklist
259+
260+ Run through this visually after every merge commit, before closing the sync issue.
261+
262+ ### Prompt border
263+ - [ ] Two left border bars visible: outer bar = agent color, inner bar = execution mode color
264+ - [ ] Both bars are the ** same height** — no gap at top or bottom of the inner bar
265+ - [ ] Outer bar shows a ` ╹ ` connector at the bottom join
266+
267+ ### Keybinds
268+ - [ ] ** Tab** → triggers shell autocomplete (shows completions or cycles them)
269+ - [ ] ** Shift+Tab** → cycles agents (Build → Plan → …)
270+ - [ ] ** Ctrl+Space** → cycles execution modes (agent → shell → auto)
271+ - [ ] ** Enter** → submits prompt; ** Shift+Enter** → inserts newline
272+
273+ ### Execution mode indicator
274+ - [ ] Footer shows mode name in execution mode color (e.g. ` ctrl+space agent ` )
275+ - [ ] Switching modes updates both the inner border color and the footer label
276+
277+ ### Shell mode
278+ - [ ] Typing ` ! ` at start of prompt switches to shell mode (blue border)
279+ - [ ] Pressing Escape from shell mode returns to normal mode
280+ - [ ] Running a command in shell mode updates the working directory in the footer
281+
282+ ### Working directory
283+ - [ ] Footer left side shows shortened cwd (e.g. ` ~/repo/lash ` )
284+ - [ ] Running ` cd <dir> ` in shell mode updates the displayed cwd
285+
286+ ### Typecheck
287+ ``` bash
288+ cd packages/opencode && bun run typecheck
289+ ```
290+ Zero errors required before closing the sync issue.
291+
292+ ---
293+
222294## What Lash Preserves (invariants)
223295
224296These features must always be preserved through upstream merges:
@@ -234,6 +306,8 @@ These features must always be preserved through upstream merges:
234306| ` determineRouting() ` | ` plugin/tui-integration/hooks.ts ` | Shell vs agent routing |
235307| ` cwd sentinel ` in bash | ` src/session/prompt.ts ` | Cwd tracking after cd |
236308| ` mode_toggle ` keybind | ` src/config/config.ts ` | ctrl+space default |
309+ | ` agent_cycle ` keybind | ` src/config/keybinds.ts ` | shift+tab (NOT tab) |
310+ | Double left border | ` component/prompt/index.tsx ` | Row layout, not nested |
237311| ` EventCwdUpdated ` | ` sdk/js/src/v2/gen/types.gen.ts ` | SDK type for cwd event |
238312| cwd in ` path.* ` field | ` src/session/prompt.ts ` | Shows cwd in messages |
239313
@@ -282,3 +356,4 @@ For conflict-free or simple merges, this can be fully automated. Conflicted merg
282356| Date | Upstream commits merged | Conflicts | Notes |
283357|------|------------------------|-----------|-------|
284358| 2026-04-02 | 673 (cf7ca9b2f → 92e820fdc) | 28 files | Major Effect rewrite of prompt.ts |
359+ | 2026-04-28 | (QA only — no new merge) | — | LAC-163 : found 3 regressions post-merge: missing double border, wrong Tab keybind, border height mismatch. Fixed in commits bde00fa30, 85faf49fc, 9d7ac27c1. Added this QA checklist. |
0 commit comments