Skip to content

feat!: remove the live-set restore; fix the frames-off width flap; the remote QA drive - #271

Merged
olliegilbey merged 33 commits into
mainfrom
fix/bar-separator-column
Sep 23, 2026
Merged

olliegilbey merged 33 commits into
mainfrom
fix/bar-separator-column

Conversation

@olliegilbey

Copy link
Copy Markdown
Owner

What changed

Three things. The first and third were measured on the devbox on 2026-09-22 and were not reproducible on the Mac.

  1. The width flap (frames off). With pane_frames false, zellij reserves one column of any tiled pane that is not at the viewport's right edge for the separator line. The bar is the left pane, so a 48-col pane paints at 47 and a 16-col one at 15. The bar compared painted width to declared width exactly, so every paint asked for a swap it did not need. Fix: RowHeight::mode_at judges a painted width by the nearest declared one, allowing exactly the one separator column. The card renderer tolerates it too. Zellij rule cited from zellij-server/src/panes/tiled_panes/mod.rs (pane_content_offset), identical in 0.44.3 and 0.45.1. Footgun entry added.

  2. The live-set restore is removed (BREAKING, A relaunch brings the live set back: every tab restored cold, one agent started, the rest on arrival #261). The restore relaunched every tab that was live in the previous session, sequenced by an elected bar. It never drove green: four shapes of the beacon re-anchor each lost a race the drive could see (Alt+c asked three times for two presses on the box, runs 24 to 30). The maintainer's decision (2026-09-22): remove the optimistic pre-launch entirely. A relaunch now bakes ONE tab for the most-recent row, as before 2d3f068. Every other row is an ordinary dormant row, and Alt+Enter opens it. Nothing is held, nothing is sequenced. Status::Exited and "SessionEnd keeps the tab" served only the restore and went with it: a SessionEnd again sets Idle and unbinds the tab. Kept: the launch-time clear of Working/NeedsYou (a launch starts no agent), the opening mark for Alt+Enter, baked_home (fix(spawn): a session that entered a worktree mid-conversation resumes at the next launch #267), and the shared ranking helpers in clave-types. The whole history is one FOOTGUNS entry, "The restore that sequenced tabs through the bar".

  3. The remote drive. just remote-qa syncs HEAD to a checkout on another machine and runs the full QA drive in that machine's environment, read back over ssh. Phase 4 asserts the width seam (zero asks across both walks). Phase 6c now verifies the relaunch: exactly one bound row, the expected most-recent one, no stale Working/NeedsYou, then two Alt+c presses with one ask each from the standing tab's bar. clave add records the row before it creates the tab, so the newborn's spawn registration finds it (the box lost that race every time). The bar logs every width ask, every paint width change, the cooldown's own asks, and why an ask is held.

Closes # (no issue was filed for the width flap or the add race; the restore removal reverses #261.)

Risk class(es) from the taxonomy (tick all that apply — they are cumulative):

  • Pure logic / model
  • Generated artifacts (config.kdl / layout.kdl / launch.kdl)
  • CLI surface (new subcommand or flag): clave open --restore-to is removed
  • Cross-process / IPC (pipes, plugin shellouts, multi-writer store paths)
  • Install / environment (release mechanics, dev-install, PATH, doctor) → label needs-live-validation
  • Visual / UX (glyphs, colours, widths, fonts) → label host-untestable

Verified automatically

Command Result
cargo test --workspace 802 passed; 0 failed (clave-bar 303)
cargo build -p clave-bar --target wasm32-wasip1 Finished, no warnings
cargo clippy --workspace --all-targets -- -D warnings Finished, no warnings

Class-specific evidence:

  • Tests added, red-first?
    • Width: a_painted_width_one_short_of_the_target_is_at_the_target fails with the exact comparison restored.
    • Add race: record_then_open in add.rs is covered by the mutants run below (every mutant caught); the order itself was proved live, phase 2 on the box, runs 30 and 32.
    • Restore removal: 39 bar tests and their fixtures that pinned the removed seams are deleted with them. The kept launch clear is pinned by clear_session_order_drops_the_status_left_by_the_previous_session. cargo mutants over the changed host functions (record_then_open, eager_row, clear_session_order, apply_hook_pane, open_is_live, bound_live_uuids): 24 caught, 0 missed, 2 unviable.
  • Proptests extended? n/a: the removal deletes branches and adds none.
  • Generated artifacts: launch.kdl bakes one row again; kdl_guardrail.rs covers the single-row layout, and the held one-shot layout and its guardrail are gone.
  • CLI: --restore-to removed; nothing in the scripts or docs referenced it (grep).
  • Cross-process: the removal takes the ordering problem away rather than solving it. No bar sequences opens, so there is no race between a bound snapshot and a birth announce to lose.

QA drive, live

Run Machine Result
31 box, Mac 5b red on both: the drive still expected exited after SessionEnd. Drive fixed (f14d40b), not the build.
32 box (zellij 0.45.1) 0-7 green, 242 checks. 6c: six rows bound before the quit, one after. Maintainer eyeballed the relaunch: one tab, rest dormant, Alt+Enter and Alt+c correct.
32 Mac (zellij 0.44.3) 0-7 green, 243 checks. 6c: exactly one row bound after the relaunch.

Review lanes run

Lane Ran? Findings
Vendored fugu review (.claude/commands/fugu-review.md) no —
Independent adversarial reviewer (Opus subagent, blind) width fix: yes. Removal: not yet Width fix: 1 should-fix taken (card renderer switched profile on the exact threshold), 2 should-fix taken (compile-time gap assert; stale doc comments), 1 nit taken.
CodeRabbit CLI (coderabbit review --committed --base main) width fix: yes. Removal: not yet Width fix: 0 findings over 5 files.
Swarm review (11 blind lanes + one verifier, 2026-09-23) yes, over this branch together with the standby branch stacked on it Verdict: merge with changes. The findings in this branch's code (dead width diagnostics, stale "every other row dormant" docs, a shared remote sandbox) are fixed on feat/standby-rows, the PR that follows this one.
Other (Codex, PR bots) on the PR —

Findings DECLINED, with reasoning:

  • mode_at need not be const: declined, the compile-time gap assert calls it.
  • Split the width test into four: declined, it reads as one scenario with per-assert messages.
  • SEPARATOR_COLS too public: declined, the card renderer consumes it.

Could NOT be verified, and why

  • The width fix is driven on the devbox (frames off). The drive has no Mac frames-off scenario; the Mac drive covers frames-on only.
  • An intermittent lost press in phase 5's rapid collapse burst: one Mac attempt in run 32 settled one flip short; the rerun passed, and the box passed phase 5 in every run. This is the known arrival-order race of rapid clave collapse writes (FOOTGUNS), not something the removal touched, but no run has proved that.
  • The Opus reviewer and CodeRabbit have not run over the removal itself; the swarm review above did.

Live steps for the maintainer

  1. Cut v0.5.3. On the devbox after box down: restore the release bar over the diagnostic one (cp ~/.local/share/clave/clave-bar-v0.5.2.wasm.orig ~/.local/share/clave/clave-bar-v0.5.2.wasm), install v0.5.3, ~/.cargo/bin/clave setup, box. Expected: one tab for the most recent agent, every other row dormant, the bar stays at one width, Alt+c toggles once per press.
  2. On the Mac: install, launch. Same expectation. Alt+Enter on a dormant row opens it.

Handoff and links

What was wrong: with `pane_frames false` zellij reserves one column of
every tiled pane that is not at the viewport's right edge, borderless or
not, for the separator line (zellij-server tiled_panes/mod.rs,
`pane_content_offset`, same in 0.44.3 and 0.45.1). The bar is the left
pane, so 48 paints as 47 and 16 as 15. The model compared the painted
width to the declared one exactly, asked for a swap it did not need on
every paint, and the swap walked the tab through the other width. The
walk budget reset on every focus change, and a six-tab restore changes
focus six times in three seconds: the devbox flap, measured 2026-09-22
with a diagnostic bar (sixteen asks in four seconds, every one cols=47
or cols=15 while wanting the width it had). It began with v0.5.1, when
#262 passed the user's pane_frames into clave's config.

The fix: `RowHeight::mode_at` names the mode a painted width is in,
allowing the separator column, and the birth guess, the at-target check
and the pre-hydration profile pick all use it.

How I know: the new test fails on the exact comparison and passes now.
Four tests that used 47 as "a width zellij cannot produce" now use 46.
446 host + 345 bar tests, wasm build, clippy -D warnings green.

Refs #262, #268.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
The mode_at helper landed above target_cols and swallowed its doc
comment, so target_cols was undocumented and mode_at carried two.
Comment move only; gates green.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
The model learned to judge a painted width by the nearest declared one,
but the card and double-card renderers still switched profile on an
exact threshold. A frames-off bar would have stopped flapping and then
sat at the expanded width drawing the collapsed card: no PR cell, no
model tail. Two states a person cannot tell apart, at full width.

Found by the blind review lane. Fixed test-first in card.rs: the card
and the double card one column under expanded draw the expanded
profile, and two under draw the collapsed one. Both tests were red
before the threshold moved.

Review hardening in the same change: a compile-time assert that each
mode's two widths sit further apart than the separator column, so a
retune cannot make collapsed unreachable; a types-crate test pinning
the tolerance as one-sided and exactly one column; and the two
model.rs doc comments that still called the comparison an equality now
name the footgun instead.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
…e width seam

The devbox surfaced regressions no Mac sandbox could reproduce: the
width flap needed pane_frames false, which the box has and the Mac does
not. Every one was diagnosed by reading the box's log over ssh. Now that
is the loop.

scripts/remote-qa.sh pushes HEAD to a plain checkout on the remote and
runs the SAME just qa there, in the remote's environment; just remote-qa,
remote-log, remote-drive-log, remote-kill wrap it. One code path: no
second drive. The launch stays the human's, over ssh -t from any
terminal, because ssh forwards no zellij identity. Verified: the stage
ran on the box from this branch and left its live fleet untouched.

The width seam gets an observable and an assertion. The shipped bar logs
one line per width ask; lib.sh reads it per LINE and per sandbox
instance (a flap is one instance asking sixteen times, which an instance
count reads as 1); phase 1 records the launch's asks, phase 4 asserts
zero across both ring-walk legs. Self-test covers the reader against a
fixture holding our flap and the maintainer's ask.

FOOTGUNS: a zellij action from the box's ssh shell lands on the remote
session; a worktree's .git is a file, so rsync lands a non-repo.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
…a-log

An attached ssh dies with the agent's shell-tool cap (ten minutes) and
takes the remote wait with it; the drive waits up to an hour for a
launch and then runs twenty minutes more. The remote owns the process
now; qa-log and qa-running read it.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
zellij-utils consts.rs ZELLIJ_SOCK_DIR: ZELLIJ_SOCKET_DIR, else the
project runtime dir (/run/user/<uid>/zellij on Linux, none on macOS),
else <tmp>/zellij-<uid>. The log dir is always the tmp one. The first
remote drive on the devbox read the log and refused every action:
no socket under /tmp/zellij-1000. Measured from the server's argv.

Also: remote-qa.sh drive, the drive alone against a sandbox already up.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
…e count

The devbox's baked first tab asks for the collapse three times per Alt+c
and never swaps (2026-09-22 14:40, bar id 5). The line logged only the
direction and the painted width, which cannot say whether the ask went to
an unfocused tab or to a tab whose tiled pane set the swap layouts cannot
map. Each ask now carries those three, read from the model's last frames.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
Measured on the devbox (2026-09-22 15:14): a CLI previous-swap-layout
lands on the restored tab whose own bar asked three times and moved
nothing. The tab and its layouts are sound; the requester is not. Zellij
routes a plugin's swap ask by the client id the plugin was loaded under
(plugins/zellij_exports.rs:120-140 -> screen.rs:10372), places a newly
connected client on the FIRST tab (screen.rs:1932), and hands out the
lowest free id (lib.rs:663-672). A tab minted by a short-lived CLI client
therefore carries an id any later CLI client reuses. The line now shows
that id so the next launch can confirm or refute it.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
… probes

Measured on the devbox (2026-09-22 15:27): with the store collapsed and
the restored tab focused, a CLI swap put its bar at 48 columns and the bar
sat there twelve seconds without asking. A bar that asks nothing writes
nothing, so the log could not say which gate held it. `width_deaf_reason`
walks the gates of `width_effects` in order and names the first one that
stops an ask while the paint disagrees with the mode; `render` logs it once
per (width, reason). The two probes drive the sandbox through `ct.sh` and
sample one tab's bar width every 150 ms across a toggle pair or a CLI swap
pair, so a swap that lands and is undone shows as a blip.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
The swap-width line lived in render, and render makes only the FIRST ask
of a walk: the cooldown expiry judges the last painted width and asks
again, silently. Measured on the devbox (2026-09-22 15:24): one logged
ask from the fresh tab's bar, then the focused restored tab went narrow
for one sample and wide again with no ask in the log. The cooldown leg
now logs its asks with source=cooldown, and render logs each width zellij
paints when it changes, so a swap that lands and is undone leaves a trace.
The QA counter matches both ask lines.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
Alt+c flapped on a restored fleet: the beacon rested on the LAST tab
the restore built while the human stood on the first, so the first
tab's bar read itself as unfocused and asked nothing, and the last
tab's bar asked for swaps zellij applied to the first tab. Measured on
the devbox 2026-09-22 (launch 15:46:35, presses 15:47:04-08).

The one-shot claim `restore_reanchor_owed` was spent by the focus-return
frame that landed between the bound snapshot and the newborn's birth
announce: no open was in flight, the beacon still named the owner, so
the claim was dropped, and the announce that followed stranded the
beacon with nothing left to answer it. The 2026-09-17 fix guarded the
other side of the same race and could not cover this one.

The flag is gone. `apply_tabs` now derives the trigger from state: the
owner's beacon is off its own tab AND either an open is in flight or
the beacon names a tab a sent row holds. Only bars pipe the beacon, so
that pair can only be the newborn's announce. There is no window to
lose, and the bound is the beacon itself: one re-anchor per stray, none
for a frame that brings no new beacon.

Test-first: the new test replays the measured order and failed on the
old code; the 2026-09-17 tests still pass; the walk test pins that a
beacon on a tab the restore never built is left alone. `cargo mutants`
over the predicate: 9 caught, 0 missed. Refs #261.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
… tab

The drive never pressed a key after the relaunch, so the beacon
stranded on the last restored tab (the devbox Alt+c flap, 2026-09-22)
passed every phase. Phase 5's presses cannot see it either: they pipe
the beacon to the focused tab before they press, which hides exactly
this defect.

After the relaunch verdict, 6c now reads where zellij left the focus,
presses `clave-toggle` twice with no anchor, and asserts one width ask
per press, both from the bar in that tab, both painted by that same
bar. A cooldown re-ask or an ask naming another tab is the flap. Two
presses, so `collapsed` is left where it was found.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
Review (2026-09-22) reproduced a hole in the derived trigger: it read
`restore_sent` and the owner's name, and both persist for the session.
Months in, the human walks to a restored tab, a stale frame flags the
owner's tab active (the #162 shape FOOTGUNS records), and the owner
drags the beacon off the tab the human stands in. The bar there then
reads unfocused and nothing re-derives it: the Alt+c flap mirrored, and
permanent until the next gesture that pipes a beacon.

The trigger now reads a per-row owed set: filled beside `restore_sent`
when the owner sends an open, drained only when a re-anchor EMITS for
the restore. Still derived, so there is no frame that can spend it
early; now bounded, so it cannot outlive the restore. The in-flight
clause is narrowed to owed opens, so a pick in flight never counts.

Test-first: `a_finished_restore_does_not_drag_the_beacon_off_a_tab_the_
human_walked_to` replays the review's probe and failed on the previous
commit. The at-home assert in the devbox-order test pins the own-tab
guard. `cargo mutants` over the predicate and `restore_effects`: 8
caught, 0 missed. Refs #261.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
… focus join

Review tidies over the beacon fix. FOOTGUNS gains the trap: a claim
armed by an event and spent by the next frame loses to a racing
announce, measured twice, and the shape that holds. Phase 6c's
paint-versus-ask line compared two id sets that could both be empty;
the asking set is now pinned non-empty first, and the label on the
tab-naming line says what it sees (the wrong bar, not a cooldown). The
focus reader's rank join was marked pending since its first draft; 6c
cross-checks it against the bar's own tab id on both hosts, so the note
now says so and names the join as the first suspect. The 6c table row
and the run ledger carry runs 24 and 25.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
Run 26 on the box went red on the new 6c check: three asks for two
presses, the last restored tab's bar asking, the first tab's bar
`unfocused`. The trace: the owner answered tab 3's steal AFTER it had
sent the open for tab 4, and the previous commit drained the whole owed
set on that emit. Tab 4's announce then found nothing owed. The Mac
never showed it because its opens land slower than the re-anchor.

The claim is now armed in the `clave-visited` entry, where the row is
exact: a beacon on a tab an owed row holds is that row's steal; a
beacon on a tab NO row holds while an owed open is in flight is that
open's. That row alone leaves the owed set, and the flag arms. A beacon
on any other tab is the human's and disarms it. Spent on emit. No frame
touches it in either direction.

Test-first: `answering_one_steal_leaves_the_next_open_owed` replays the
box order and failed on the previous commit. `a_walk_to_a_live_tab_
during_an_open_is_not_the_newborns_steal` kills the one mutant that
survived the first pass. The lifetime test and the devbox-order test
still pass. `cargo mutants` over the attribution and `restore_effects`:
7 caught, 0 missed. FOOTGUNS records both refuted shapes. Refs #261.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
Run 27 (2026-09-22) died in preflight on a healthy build: `remote-qa.sh
qa` printed the launch line, then detached `just qa` on the box, whose
stage was still building when the human launched. The launch at
17:15:22 baked one row into a half-staged sandbox; the scenario seed at
17:15:30 deleted the launch.kdl the launch had written, and preflight
read it missing.

The stage now runs attached and finishes before the launch line prints.
Only the drive is detached. A launch line the human can act on means
the sandbox is ready. Handoff status file rides along.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
…gistration finds it

`clave add` created the tab first and recorded the row after, with a
transcript probe of tens of MB between the two. The newborn pane's
`clave spawn` persists its pane id one line before it execs, and
`apply_register` answers None for a uuid it cannot find. On the box
(qa-fleet runs 28 and 29, 2026-09-22) the spawn won that race every
time: `pane_id` stayed null for the life of the row, the tab never
bound, and phase 2 rung 1 went red. The Mac won the race and passed.

The record and the open now run in that order inside
`record_then_open`, with the open injected so the sequence host-tests
without zellij. The test asks the store for the row from inside the
open and was red on the old order.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
…re its row

Runs 26 and 27 were the drive's: a wrong shape of the beacon fix and a
stage race. Runs 28 and 29 were the add race the box lost every time,
fixed in 02f30ae. The Mac 5b red is a sibling-sandbox fixture collision,
recorded so the next Mac run is read correctly.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
…d every other row is dormant

The staggered restore (#261, 2d3f068) never drove green. Four shapes of
the beacon re-anchor each lost a race the drive could see (Alt+c asked
three times for two presses on the box, runs 24 to 30), and every fix
added machinery to a design the maintainer judged wrong at the root:
an optimistic pre-launch of tabs nobody had asked for, sequenced by a
bar elected through a focus signal its own work destroyed.

The decision (2026-09-22): drop the optimistic pre-launch entirely. A
relaunch bakes ONE tab for the most-recent row, exactly as before
2d3f068. Every row that was live in the previous session is an ordinary
dormant row, and Alt+Enter opens it. Nothing is held, nothing is
sequenced, no bar is elected to restore anything.

Removed, host: `Store::last_live`, `restore_owner`,
`bound_since_launch` and the live-set write in `clear_session_order`;
`restore_rows`, `bakeable_rows` and the deferred/dropped launch logs;
`TabStart` and the held one-shot layout; `clave open --restore-to`;
the `relaunch-restore` scenario and `ScenarioAgent::bound_tab`.

Removed, bar: the owner election, the opening queue, the sent and
owed sets, the steal claim and its re-anchor trigger, `spawn_binds`,
the held-pane wake and its bind leg, `PaneMeta::is_held`, and every
test that pinned them (39 tests and their fixtures).

Removed with them, because they existed only to serve the restore:
`Status::Exited` and "SessionEnd keeps the tab". A SessionEnd once
again sets Idle and unbinds the tab, so the row goes dormant and the
tab is a terminal tab, as it was before 2d3f068 (`apply_hook_pane`,
`open_is_live`, `bound_live_uuids`, `conversation_evidenced`).

Kept: `Status`-clearing at launch for Working and NeedsYou (a launch
starts no agent, so those marks are false whatever the restore did);
the `opening` mark for Alt+Enter; `baked_home` (#267); the shared
`live_key`/`sort_live_block`/`is_clave_binary` in clave-types, which
the bar still uses.

`just gates` green: 426 + 11 + 16 + 8 host tests, 303 bar tests, 34
types tests. Scripts and docs follow in their own commits.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
… relaunch

The relaunch phase compared the live set before the quit with the set
the restore brought back. The restore is gone (9670fbf), so the phase
now records the expected eager row before the quit (the most-recent row
whose cwd exists, mirroring setup.rs `eager_row`) and, after the
relaunch, checks that exactly that row is bound, every other row is
unbound, and no row carries a working or needs_you mark. The two-press
Alt+c check at the end of the phase stays verbatim: it is the seam that
caught the flap, and a regression that opens a second tab would show
there.

Deleted `held_bound_uuids`, `close_candidate_tab`, `last_live_uuids`
and `scripts/qa/relaunch-verdict.sh`. `relaunch_checks` takes the
expected uuid and the after-status; `eager_candidate_uuid` is the new
reader. The selftest covers: one bound row passes; two bound rows,
the wrong row, zero rows, a stale working mark, and a dead read on
either side all fail. `script_hygiene.rs` lists the surviving readers.

`bash scripts/qa/lib-selftest.sh` 0 failures; `just gates` green.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
… entry

The vocabulary loses held tab, zellij held flag, live set, restore owner
and exited row, and gains eager tab. TESTING's taxonomy row for a
relaunch names the eager row and the session-scoped state the launch
clears; the #261 escape-record rows stay as history under a note.
QA-DRIVE's 6c row and section describe the new verdict (one bound row,
everything else dormant, no stale Working/NeedsYou, the two-press Alt+c
check kept), and the ledger gains run 30 and the decision. FOOTGUNS
folds eleven restore-only entries into "The restore that sequenced tabs
through the bar": the design, what was measured, why it was removed,
and the rule not to bring it back as a queue. README says what a
relaunch does now. The status handoff records the three commits.

Claude-Session: https://claude.ai/code/session_01VxbdvjsGZN9x4hYyGgdXHL
The drive still expected `exited` after SessionEnd. That status came
with the live-set restore (#261) and went out with it in 9670fbf, so
the build correctly reports `idle` and 5b failed on both machines
(run 31, box and Mac, measured=idle expected=exited). The check is
back to its pre-restore form (2d3f068^).
…and Mac

Run 31 failed 5b on a stale drive expectation, fixed in f14d40b. Run 32
passed every phase on both machines. One Mac attempt lost a press in the
rapid collapse burst; the rerun passed. Recorded as open.
@coderabbitai

coderabbitai Bot commented Sep 23, 2026

Copy link
Copy Markdown

Important

  • 🔍 Trigger review

This repository does not receive automatic reviews because it has fewer than 10 stars.

⚙️ Run configuration

Configuration used: Repository: olliegilbey/clave/.coderabbit.yaml

Review profile: ASSERTIVE

Plan: Advanced

Run ID: f039e5c6-dbdf-4dce-90ff-b90ffb145371


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@chatgpt-codex-connector chatgpt-codex-connector Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Codex Review

Here are some automated review suggestions for this pull request.

Reviewed commit: bb00812ff5

ℹ️ About Codex in GitHub

Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you

  • Open a pull request for review
  • Mark a draft as ready
  • Comment "@codex review".

If Codex has suggestions, it will comment; otherwise it will react with 👍.

Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".

Comment thread scripts/remote-qa.sh
@olliegilbey
olliegilbey merged commit 8644f11 into main Sep 23, 2026
10 checks passed
@olliegilbey
olliegilbey deleted the fix/bar-separator-column branch September 23, 2026 10:44
@olliegilbey olliegilbey mentioned this pull request Sep 23, 2026
1 of 6 tasks
olliegilbey added a commit that referenced this pull request Sep 23, 2026
Workspace version, lockfile, README checkout line.

The cut carries standby rows (#273): after a quit, the rows whose agent
was live come back as standby for 24 hours, and an arrival opens one in
place with no hop. It also carries the live-set restore removal (#271,
breaking): a relaunch bakes one tab for the most recent row, and every
other row waits dormant. Plus the frames-off width flap fix and the
remote QA drive, both from #271.

The tree under the bump is the one QA run 39 drove green on both
machines (84d9110; git diff --stat 84d9110 dd40505 is empty).
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