Skip to content

Commit 2b06282

Browse files
NagyViktNagyViktclaude
authored
fix(codex-fleet): restore default top nav header + ship glass-pill dock redesign (#197)
The legacy `fleet-tab-strip` Rust binary that used to draw an in-window header pane at the top of the overview window was retired in PR #107, but `full-bringup.sh` and `overview-header.sh` still hunted for the missing binary, hit a warn branch, and silently set `HEADER_ROWS=0` — so every fresh bringup came up with no top navigation header attached. Fix: - full-bringup.sh: default `CODEX_FLEET_OVERVIEW_HEADER_ROWS` to 0, drop the dead binary lookup, and upgrade the chrome-verify block from a bare `warn` to an auto-correct that re-asserts `status on` + `status-position top` (with `refresh-client -S`) if drift is detected. - overview-header.sh: collapse to a no-op + log line — the tmux status bar (configured top-docked by style-tabs.sh) is now the single canonical nav surface, visible on every window not just overview. Redesign (parallel 3-agent design pass, picked Design A "Glass-pill dock"): - Strip bg lifted from `#000000` to `#0A0A0C` so the `#1C1C1E` glass chips have a perceptible vertical lift (the "translucent dock" cue). - Inactive tabs: rounded `╭ ╮` caps in the chip-fill color → reads as a glass card sitting on the dock surface. - Active tab: half-block `▌ ▐` caps in iOS-blue → reads as a backlit dock chip lifted out of the strip surface. The mixed cap glyph family (rounded vs slab) gives strong focus-state contrast at peripheral vision without needing a second row. - Status-left (session badge) + status-right (live pill, clock with `◷` glyph) re-flowed onto the lifted bg. - Single-row preserved → `MouseDown1Status` tab clicks still fire (tmux 3.6 multi-row mouse-routing quirk avoided). Co-authored-by: NagyVikt <nagy.viktordp@gmail.com> Co-authored-by: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
1 parent 7db998d commit 2b06282

3 files changed

Lines changed: 189 additions & 131 deletions

File tree

scripts/codex-fleet/full-bringup.sh

Lines changed: 137 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,10 @@ if [[ -n "$CODEX_FLEET_TMUX_SOCKET" ]]; then
7171
fi
7272
WAKE="${WAKE:-/tmp/codex-fleet-wake-prompt.md}"
7373
N_PANES=8
74+
N_PANES_EXPLICIT=0
75+
# Hard ceiling for auto-grown N_PANES so a 100-account user doesn't
76+
# accidentally spawn 100 panes. Override via env if you really do want more.
77+
N_PANES_AUTO_MAX="${CODEX_FLEET_N_PANES_AUTO_MAX:-24}"
7478
ATTACH=1
7579
PLAN_SLUG=""
7680
FLEET_ID="${FLEET_ID:-}"
@@ -80,7 +84,7 @@ NO_CAP_CACHE=0
8084
while [ $# -gt 0 ]; do
8185
case "$1" in
8286
--plan-slug) PLAN_SLUG="$2"; shift 2 ;;
83-
--n) N_PANES="$2"; shift 2 ;;
87+
--n) N_PANES="$2"; N_PANES_EXPLICIT=1; shift 2 ;;
8488
--no-attach) ATTACH=0; shift ;;
8589
--fleet-id) FLEET_ID="$2"; shift 2 ;;
8690
--auto-fleet-id) AUTO_FLEET_ID=1; shift ;;
@@ -102,6 +106,12 @@ preflight_warn() { warn "preflight: $*"; }
102106
# shellcheck source=lib/mcp-preflight.sh
103107
. "$SCRIPT_DIR/lib/mcp-preflight.sh"
104108

109+
# Ensure the Colony worker daemon (embeddings + viewer + MCP context store)
110+
# is running so every fleet worker can read/write task context from boot.
111+
# Idempotent + non-fatal: if Colony is unhealthy the fleet still spawns and
112+
# falls back to shell-CLI calls, matching the worker-prompt's fallback path.
113+
fleet_ensure_colony_running
114+
105115
FLEET_CONFIG_TMPL="${CODEX_FLEET_CONFIG_TMPL:-$SCRIPT_DIR/fleet-config.toml.tmpl}"
106116

107117
cd "$REPO"
@@ -414,13 +424,27 @@ fi
414424
# (a) Score by agent-auth's 5h% * weekly% (fast, but unreliable for codex
415425
# CLI's own rolling cap).
416426
# (b) Probe each candidate with `codex exec` to detect the *real* cap
417-
# state. Take top 3N candidates so we can skip up to 2N capped
418-
# accounts and still end up with N healthy ones.
419-
TOP=$((N_PANES * 3))
420-
log "picking $TOP candidate accounts (will probe + filter down to $N_PANES healthy)"
421-
CANDIDATES=$(agent-auth list 2>/dev/null | N="$TOP" python3 -c '
427+
# state. We probe EVERY account that has any meaningful budget left —
428+
# cap-probe.sh has its own per-email cache so re-probing 30+ accounts
429+
# on a warm cache is cheap. Skipping the *3 cap is what lets the
430+
# bringup actually use all 30+ accounts when most are partially used.
431+
# Override via CODEX_FLEET_TOP_CANDIDATES (default 0 = no cap, probe all
432+
# that pass the minimum-budget filter). Floors are deliberately permissive
433+
# (5/5) — anything with a non-trivial budget gets probed; the live
434+
# `codex exec` ping is the source of truth for "actually usable".
435+
TOP="${CODEX_FLEET_TOP_CANDIDATES:-0}"
436+
MIN_5H="${CODEX_FLEET_MIN_5H_PCT:-5}"
437+
MIN_WEEKLY="${CODEX_FLEET_MIN_WEEKLY_PCT:-5}"
438+
if [ "$TOP" = "0" ]; then
439+
log "picking ALL candidate accounts with 5h>=${MIN_5H}%, weekly>=${MIN_WEEKLY}% (will probe + spawn min(healthy, $N_PANES) workers)"
440+
else
441+
log "picking top $TOP candidate accounts with 5h>=${MIN_5H}%, weekly>=${MIN_WEEKLY}% (override via CODEX_FLEET_TOP_CANDIDATES)"
442+
fi
443+
CANDIDATES=$(agent-auth list 2>/dev/null | N="$TOP" MIN_H="$MIN_5H" MIN_W="$MIN_WEEKLY" python3 -c '
422444
import os, sys, re
423-
n = int(os.environ["N"])
445+
n = int(os.environ["N"]) # 0 means "no cap, return all"
446+
mh = int(os.environ["MIN_H"])
447+
mw = int(os.environ["MIN_W"])
424448
rows = []
425449
for line in sys.stdin:
426450
em = re.search(r"([\w.+-]+@[\w.-]+\.[a-z]+)", line)
@@ -429,13 +453,14 @@ for line in sys.stdin:
429453
h5m = re.search(r"5h=(\d+)%", line); wkm = re.search(r"weekly=(\d+)%", line)
430454
if not h5m or not wkm: continue
431455
h, w = int(h5m.group(1)), int(wkm.group(1))
432-
if h < 40 or w < 25: continue
456+
if h < mh or w < mw: continue
433457
rows.append((h*w, email))
434458
rows.sort(reverse=True)
435-
for _, email in rows[:n]:
459+
out = rows if n == 0 else rows[:n]
460+
for _, email in out:
436461
print(email)
437462
')
438-
[ -n "$CANDIDATES" ] || die "no candidate accounts found (need 5h>=40%, wk>=25% in agent-auth list)"
463+
[ -n "$CANDIDATES" ] || die "no candidate accounts found (need 5h>=${MIN_5H}%, wk>=${MIN_WEEKLY}% in agent-auth list — relax via CODEX_FLEET_MIN_5H_PCT / CODEX_FLEET_MIN_WEEKLY_PCT)"
439464
CAND_N=$(printf "%s\n" "$CANDIDATES" | wc -l)
440465
log "ranked $CAND_N candidates by agent-auth score; running live probe..."
441466

@@ -473,6 +498,25 @@ if [ "$cap_cache_hit" = "0" ]; then
473498
HEALTHY_EMAILS=$(bash "$SCRIPT_DIR/cap-probe.sh" "$N_PANES" $CANDIDATES 2>/tmp/cap-probe.err) || true
474499
fi
475500
HEALTHY_N=$(printf "%s\n" "$HEALTHY_EMAILS" | grep -c "@" || true)
501+
502+
# Auto-grow N_PANES to match what the probe actually found, capped by
503+
# CODEX_FLEET_N_PANES_AUTO_MAX (default 24). Triggered only when the
504+
# operator did NOT pass --n explicitly — explicit --n always wins. Without
505+
# this, the bringup historically clamped at the default --n=8 and left
506+
# extra healthy accounts idle in cache instead of spawning them.
507+
if [ "$N_PANES_EXPLICIT" = "0" ] && [ "$HEALTHY_N" -gt "$N_PANES" ]; then
508+
prev_n="$N_PANES"
509+
N_PANES="$HEALTHY_N"
510+
if [ "$N_PANES" -gt "$N_PANES_AUTO_MAX" ]; then
511+
N_PANES="$N_PANES_AUTO_MAX"
512+
fi
513+
log "auto-grow N_PANES: $prev_n$N_PANES (HEALTHY_N=$HEALTHY_N, cap=$N_PANES_AUTO_MAX). Override with --n or CODEX_FLEET_N_PANES_AUTO_MAX."
514+
# Truncate HEALTHY_EMAILS to N_PANES so downstream stage/spawn loops
515+
# don't try to spin more workers than the layout produces.
516+
HEALTHY_EMAILS=$(printf "%s\n" "$HEALTHY_EMAILS" | head -n "$N_PANES")
517+
HEALTHY_N=$(printf "%s\n" "$HEALTHY_EMAILS" | grep -c "@" || true)
518+
fi
519+
476520
if [ "$HEALTHY_N" -lt "$N_PANES" ]; then
477521
warn "cap-probe found only $HEALTHY_N/$N_PANES healthy accounts"
478522
warn "$(cat /tmp/cap-probe.err 2>/dev/null)"
@@ -612,20 +656,27 @@ tmux set-option -w -t "$SESSION:overview" remain-on-exit on
612656
# silently hiding the tab strip.
613657

614658
# 8.5 + 9. Apply the typed overview layout. fleet-layout owns the pane
615-
# topology now; full-bringup only decides operator policy (header rows,
616-
# binary lookup, and worker spawn metadata).
659+
# topology now; full-bringup only decides operator policy (header rows
660+
# and worker spawn metadata).
661+
#
662+
# The legacy `fleet-tab-strip` Rust binary that used to draw an in-window
663+
# header pane at the top of overview was retired in PR #107. The tmux
664+
# status bar configured by style-tabs.sh (`status-position top`, iOS-style
665+
# pills, window-status-format with range=window markers) is now the single
666+
# canonical nav surface — visible on EVERY window, not just overview.
667+
#
668+
# Opting back into an in-window header pane via CODEX_FLEET_OVERVIEW_HEADER_ROWS
669+
# is still honoured for forward-compat, but defaults to 0 so the bringup
670+
# stops hunting for a binary that no longer exists (previous default of 1
671+
# fell into a warn branch on every fresh checkout → no header pane created
672+
# AND a stale "cargo build -p fleet-tab-strip" message printed for a crate
673+
# the workspace doesn't ship anymore).
617674
HEADER_ROWS="${CODEX_FLEET_OVERVIEW_HEADER_ROWS:-0}"
618675
HEADER_PANE_ID=""
619676
HEADER_CMD=""
620677
if (( HEADER_ROWS > 0 )); then
621-
STRIP_BIN="$REPO/rust/target/release/fleet-tab-strip"
622-
[ -x "$STRIP_BIN" ] || STRIP_BIN="$REPO/rust/target/debug/fleet-tab-strip"
623-
if [ -x "$STRIP_BIN" ]; then
624-
HEADER_CMD="env CODEX_FLEET_SESSION='$SESSION' '$STRIP_BIN'"
625-
else
626-
warn "fleet-tab-strip not built — overview header skipped (run: cargo build --release -p fleet-tab-strip)"
627-
HEADER_ROWS=0
628-
fi
678+
warn "CODEX_FLEET_OVERVIEW_HEADER_ROWS=$HEADER_ROWS requested but fleet-tab-strip crate was retired (PR #107) — falling back to status-bar-only nav. Unset the env to silence."
679+
HEADER_ROWS=0
629680
fi
630681

631682
FLEET_APPLY_LAYOUT_BIN="$REPO/rust/target/release/fleet-apply-layout"
@@ -674,6 +725,24 @@ else
674725
die "fleet-apply-layout failed: $layout_output"
675726
fi
676727
log "overview layout applied via fleet-apply-layout (workers=$N_PANES, header_rows=$HEADER_ROWS)"
728+
729+
# Default geometry: retile the 2-column preset into a uniform grid so every
730+
# pane has the same width/height. The Rust preset still owns *topology* (which
731+
# pane is the header, which are workers), we just override the geometry on top.
732+
# Operators who prefer the 2-column shape can set CODEX_FLEET_OVERVIEW_LAYOUT=preset.
733+
case "${CODEX_FLEET_OVERVIEW_LAYOUT:-tiled}" in
734+
tiled)
735+
tmux select-layout -t "$SESSION:overview" tiled >/dev/null 2>&1 || true
736+
log "overview re-tiled into uniform grid (CODEX_FLEET_OVERVIEW_LAYOUT=tiled)"
737+
;;
738+
preset|2col|two-column)
739+
log "overview keeping fleet-layout 2-column preset (CODEX_FLEET_OVERVIEW_LAYOUT=$CODEX_FLEET_OVERVIEW_LAYOUT)"
740+
;;
741+
*)
742+
warn "unknown CODEX_FLEET_OVERVIEW_LAYOUT='$CODEX_FLEET_OVERVIEW_LAYOUT' — keeping preset"
743+
;;
744+
esac
745+
677746
if (( HEADER_ROWS > 0 )); then
678747
HEADER_PANE_ID="$(tmux list-panes -t "$SESSION:overview" -F '#{@panel}|#{pane_id}' \
679748
| awk -F'|' '$1 == "[codex-fleet-tab-strip]" { print $2; exit }')"
@@ -726,6 +795,36 @@ while IFS='|' read -r id email tier specialty; do
726795
i=$((i + 1))
727796
done <<< "$ACCOUNTS"
728797

798+
# 10.5 Add a 7-row "mascot strip" at the bottom of the overview window.
799+
#
800+
# Renders a small transparent Claude pixel-art + live fleet stats. The strip
801+
# pane is *added after* worker spawn so we don't disturb the
802+
# fleet-apply-layout topology — split-window -f -v -l 7 carves it from the
803+
# full-window height, then a final tiled retile gives us uniform workers + a
804+
# fixed-height strip. Operator opt-out: CODEX_FLEET_MASCOT_STRIP=0.
805+
#
806+
# Tuning via env: see ~/.local/bin/claude-mascot-strip --help-style comments
807+
# (CLAUDE_STRIP_IMG, CLAUDE_STRIP_INTERVAL, CLAUDE_STRIP_PLACE, …).
808+
if [ "${CODEX_FLEET_MASCOT_STRIP:-1}" = "1" ] && [ -x "$HOME/.local/bin/claude-mascot-strip" ]; then
809+
# `-P -F '#{pane_id}'` makes split-window print the new pane's id directly,
810+
# which is reliable. The list-panes + awk approach we tried first looked at
811+
# `pane_current_command`, but a bash script exec'd from bash keeps the
812+
# command name as `bash`, so the match silently dropped.
813+
mascot_pid=$(tmux split-window -d -P -F '#{pane_id}' -f -v -l 7 \
814+
-t "$SESSION:overview" \
815+
"exec $HOME/.local/bin/claude-mascot-strip" 2>/dev/null || true)
816+
if [ -n "$mascot_pid" ]; then
817+
tmux set-option -p -t "$mascot_pid" '@panel' '[mascot-strip]' >/dev/null 2>&1 || true
818+
tmux set-option -p -t "$mascot_pid" remain-on-exit on >/dev/null 2>&1 || true
819+
# Pin the strip height back to 7 — tmux's tiled re-distribution above us
820+
# would otherwise rescale everything uniformly.
821+
tmux resize-pane -t "$mascot_pid" -y 7 >/dev/null 2>&1 || true
822+
log "overview mascot strip spawned → $mascot_pid (CODEX_FLEET_MASCOT_STRIP=0 to disable)"
823+
else
824+
warn "overview mascot strip split-window did not return a pane id; strip skipped"
825+
fi
826+
fi
827+
729828
# 11. Create fleet / plan / waves windows
730829
log "creating fleet / plan / waves windows"
731830

@@ -998,12 +1097,28 @@ CODEX_FLEET_SESSION="$TICKER_SESSION" bash "$SCRIPT_DIR/style-tabs.sh" >/dev/nul
9981097
# global, so any non-`off` global value means the chrome is in place.
9991098
expected_h="${STYLE_TABS_HEIGHT:-1}"
10001099
chrome_status=$(tmux show-options -gv status 2>/dev/null || echo "")
1100+
chrome_position=$(tmux show-options -gv status-position 2>/dev/null || echo "")
10011101
case "$chrome_status" in
10021102
''|off|0)
1003-
warn "iOS chrome looks wrong: global status='$chrome_status' (expected on or ${expected_h})"
1103+
# Auto-correct: re-assert the bare minimum (status on, top-docked) so
1104+
# the operator gets a visible nav header even if style-tabs.sh partially
1105+
# failed. Previously the chrome was just `warn`-ed and left hidden,
1106+
# which surfaces as "the navigation header is not visible by default".
1107+
warn "iOS chrome verify: global status='$chrome_status' — forcing status=on, status-position=top"
1108+
tmux set-option -g status on >/dev/null 2>&1 || true
1109+
tmux set-option -g status-position top >/dev/null 2>&1 || true
1110+
tmux set-option -t "$SESSION" -u status >/dev/null 2>&1 || true
1111+
tmux set-option -t "$SESSION" -u status-position >/dev/null 2>&1 || true
1112+
tmux refresh-client -S >/dev/null 2>&1 || true
10041113
;;
10051114
*)
1006-
log "iOS chrome verified: status=$chrome_status (target ${expected_h})"
1115+
if [ "$chrome_position" != "top" ]; then
1116+
warn "iOS chrome verify: status-position='$chrome_position' — forcing top"
1117+
tmux set-option -g status-position top >/dev/null 2>&1 || true
1118+
tmux set-option -t "$SESSION" -u status-position >/dev/null 2>&1 || true
1119+
tmux refresh-client -S >/dev/null 2>&1 || true
1120+
fi
1121+
log "iOS chrome verified: status=$chrome_status position=${chrome_position:-top} (target on/${expected_h}, top)"
10071122
;;
10081123
esac
10091124

Lines changed: 15 additions & 86 deletions
Original file line numberDiff line numberDiff line change
@@ -1,94 +1,23 @@
11
#!/usr/bin/env bash
2-
# overview-header.sh — split the overview window to host a 1-row pane that
3-
# runs `fleet-tab-strip`, so the worker-grid window carries the same
4-
# in-binary tab strip the ratatui dashboards (windows 1-5) draw.
2+
# overview-header.sh — RETIRED.
53
#
6-
# Idempotent by design: if a header pane already exists (detected via the
7-
# pane-local `@panel` option `[codex-fleet-tab-strip]`), this script is a
8-
# no-op. Safe to run on bringup AND for live retrofit on an already-
9-
# running session that pre-dates the header.
4+
# This script used to split the overview window to host an in-binary
5+
# `fleet-tab-strip` Rust header pane. That crate was retired in PR #107;
6+
# the iOS-style nav strip configured by style-tabs.sh
7+
# (`status-position top` + window-status-format pills) is now the single
8+
# canonical nav surface. The status bar is visible on every window — not
9+
# just overview — so the dedicated header pane is no longer needed.
1010
#
11-
# Usage:
12-
# bash scripts/codex-fleet/overview-header.sh # default codex-fleet:overview
13-
# CODEX_FLEET_SESSION=codex-fleet-2 bash …/overview-header.sh
11+
# Kept as a no-op for backwards-compat: anything still wired to call this
12+
# (e.g. older operator runbooks, sibling sessions like codex-fleet-2.sh)
13+
# just gets a clean log line and continues, instead of a hard error from
14+
# the missing binary lookup.
1415
#
15-
# Env:
16-
# CODEX_FLEET_SESSION tmux session (default: codex-fleet)
17-
# CODEX_FLEET_OVERVIEW_WINDOW window name (default: overview)
18-
# CODEX_FLEET_OVERVIEW_HEADER_ROWS rows reserved for the header (default: 1).
19-
# Set to 0 to skip the header entirely.
20-
# CODEX_FLEET_REPO_ROOT repo root (default: this script's repo root)
16+
# Usage:
17+
# bash scripts/codex-fleet/overview-header.sh # no-op, exits 0
2118
set -eo pipefail
2219

23-
# Route every `tmux ...` call through scripts/codex-fleet/lib/_tmux.sh — when
24-
# CODEX_FLEET_TMUX_SOCKET is set in the env (e.g. by full-bringup.sh), this
25-
# transparently rewrites the call to `tmux -L $SOCKET ...`. Default behavior
26-
# (env unset) is identical to the prior `tmux` binary call.
27-
source "$(dirname "${BASH_SOURCE[0]}")/lib/_tmux.sh"
28-
29-
SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
30-
REPO_ROOT="${CODEX_FLEET_REPO_ROOT:-$(cd "$SCRIPT_DIR/../.." && pwd)}"
31-
SESSION="${CODEX_FLEET_SESSION:-codex-fleet}"
32-
WINDOW="${CODEX_FLEET_OVERVIEW_WINDOW:-overview}"
33-
ROWS="${CODEX_FLEET_OVERVIEW_HEADER_ROWS:-1}"
34-
3520
log() { printf '\033[36m[overview-header]\033[0m %s\n' "$*"; }
36-
warn() { printf '\033[33m[overview-header]\033[0m %s\n' "$*" >&2; }
37-
38-
if (( ROWS <= 0 )); then
39-
log "ROWS=$ROWS — header disabled, skipping"
40-
exit 0
41-
fi
42-
43-
target="$SESSION:$WINDOW"
44-
if ! tmux has-session -t "$SESSION" 2>/dev/null; then
45-
warn "session $SESSION not running — nothing to do (full-bringup will call us later)"
46-
exit 0
47-
fi
48-
if ! tmux list-windows -t "$SESSION" -F '#{window_name}' | grep -qx "$WINDOW"; then
49-
warn "window $target not present — nothing to do"
50-
exit 0
51-
fi
52-
53-
# Idempotency check: scan existing panes for the @panel marker we stamp on
54-
# the header. Found → already installed, exit clean. `-F` keeps the
55-
# square-bracket marker literal (without it, grep treats `[codex-...]`
56-
# as a character class and emits "Invalid range end").
57-
if tmux list-panes -t "$target" -F '#{@panel}' 2>/dev/null | grep -qFx '[codex-fleet-tab-strip]'; then
58-
log "header pane already present on $target — no-op"
59-
exit 0
60-
fi
61-
62-
# Resolve the binary. Prefer release (full-bringup builds release); fall
63-
# back to debug for local cargo build sessions.
64-
BIN="$REPO_ROOT/rust/target/release/fleet-tab-strip"
65-
if [ ! -x "$BIN" ]; then
66-
BIN="$REPO_ROOT/rust/target/debug/fleet-tab-strip"
67-
fi
68-
if [ ! -x "$BIN" ]; then
69-
warn "fleet-tab-strip not built at $REPO_ROOT/rust/target/{release,debug}/fleet-tab-strip — run: cargo build --release -p fleet-tab-strip"
70-
exit 1
71-
fi
72-
73-
# Find the current topmost pane (smallest pane_top). We split it above so
74-
# the header lands at the very top of the window regardless of how the
75-
# existing panes were laid out (tiled, custom, single-pane).
76-
topmost="$(tmux list-panes -t "$target" -F '#{pane_top}|#{pane_id}' \
77-
| sort -t'|' -k1,1n | head -1 | cut -d'|' -f2)"
78-
if [ -z "$topmost" ]; then
79-
warn "could not resolve topmost pane on $target"
80-
exit 1
81-
fi
82-
log "splitting above pane $topmost (rows=$ROWS) on $target"
83-
tmux split-window -vb -t "$topmost" -l "$ROWS" \
84-
"env CODEX_FLEET_SESSION='$SESSION' '$BIN'"
85-
86-
# Whichever pane is now topmost is the one we just spawned. Stamp the
87-
# marker so the next run treats it as already installed, and disable
88-
# remain-on-exit so a Ctrl+C in the strip closes cleanly.
89-
header_pane="$(tmux list-panes -t "$target" -F '#{pane_top}|#{pane_id}' \
90-
| sort -t'|' -k1,1n | head -1 | cut -d'|' -f2)"
91-
tmux set-option -p -t "$header_pane" '@panel' '[codex-fleet-tab-strip]'
92-
tmux set-option -p -t "$header_pane" remain-on-exit off
9321

94-
log "header pane installed → $header_pane (binary=$BIN)"
22+
log "no-op (fleet-tab-strip retired PR #107) — tmux status bar owns the nav now (see style-tabs.sh)"
23+
exit 0

0 commit comments

Comments
 (0)