diff --git a/proxmox/lxc102-docker/README.md b/proxmox/lxc102-docker/README.md
index 2cebbae..6766333 100644
--- a/proxmox/lxc102-docker/README.md
+++ b/proxmox/lxc102-docker/README.md
@@ -82,17 +82,19 @@ Trei scripturi în `/home/work/.local/bin/`, copii versionate în `scripts/` din
### `sbt` — tmux + sandbox + agent
+**Nu lansează niciun agent** — deschide shell-uri în sandbox, agentul îl pornești manual
+(`claude`, `opencode`, `jcode`…).
+
```bash
-sbt # sesiune 1, /home/workspace, claude în pane-ul stâng
-sbt 2 proiect-a # sesiune 2, /home/workspace/proiect-a
-sbt 1 proiect-a opencode # alt agent (orice binar din sandbox: opencode, jcode…)
-sbt 1 proiect-a shell # doar shell, fără agent
+sbt # sesiune 1, shell în /home/workspace
+sbt 2 proiect-a # sesiune 2, shell în /home/workspace/proiect-a
+sbt 1 proiect-a opencode # opțional: lansează explicit un agent în pane-ul stâng
sbt list | sbt kill 2 | sbt detach 2
```
-Sesiunile se numesc `sbx1`, `sbx2`, `sbx3`. Layout: 2 pane-uri pe orizontală — stânga cu
-agentul, dreapta shell. Când agentul se oprește, pane-ul rămâne cu un shell în sandbox
-(`exec bash -l`), deci sesiunea nu moare.
+Sesiunile se numesc `sbx1`, `sbx2`, `sbx3`. Layout: 2 pane-uri pe orizontală, ambele shell în
+sandbox, în directorul proiectului. Dacă ceri explicit un agent (argumentul 3), acesta rulează
+în pane-ul stâng și, la ieșire, pane-ul rămâne cu un shell (`exec bash -l`) — sesiunea nu moare.
**tmux rulează pe host (LXC 102), nu în sandbox** — în imaginea sandbox-ului nu există tmux
(și nici `git`). Fiecare pane e un `sbx exec -it -w
bash -l`. Consecința utilă:
@@ -101,6 +103,20 @@ deci sandbox-ul e pornit chiar dacă nu era.
Prefixul tmux e `Ctrl+A` (cu `Ctrl+B` ca secundar) — vezi `/home/work/.tmux.conf`.
+**`WARN: could not acquire docker hub refresh lock … context deadline exceeded`** — apare când
+două procese `sbx exec` pornesc simultan (cele două pane-uri) și se calcă pe lock-ul de refresh
+al credențialelor Docker Hub. E inofensiv (`proceeding without cross-process lock`), dar zgomotos.
+Reprodus determinist:
+
+```bash
+for i in 1 2 3; do sbx exec claude-workspace true & done; wait # 3 warning-uri
+sbx exec claude-workspace true # curat
+```
+
+De aceea `sbt` pornește al doilea pane cu 4 secunde întârziere (`SBT_PANE_DELAY`) — la ≥4s
+lock-ul e liber și warning-ul dispare. Atașarea nu e întârziată, doar intrarea în sandbox a
+pane-ului din dreapta.
+
### Statusline Claude Code în sandbox
Același statusline ca pe LXC 171 (model, context, cote 5h / weekly / sonnet din API-ul OAuth
diff --git a/proxmox/lxc102-docker/scripts/sbt b/proxmox/lxc102-docker/scripts/sbt
index 174c3ab..a43491c 100755
--- a/proxmox/lxc102-docker/scripts/sbt
+++ b/proxmox/lxc102-docker/scripts/sbt
@@ -5,15 +5,16 @@
# prin `sbx exec -it`. În sandbox nu există tmux, deci sesiunea supraviețuiește
# oricărei reporniri a agentului.
#
-# sbt sesiune 1, /home/workspace, claude în pane-ul stâng
-# sbt 2 proiect-a sesiune 2, /home/workspace/proiect-a
-# sbt 1 proiect-a opencode lansează opencode
-# sbt 1 proiect-a shell doar shell în sandbox, fără agent
+# NU lansează niciun agent — deschide shell-uri în sandbox, agentul îl pornești tu.
+#
+# sbt sesiune 1, shell în /home/workspace
+# sbt 2 proiect-a sesiune 2, shell în /home/workspace/proiect-a
+# sbt 1 proiect-a opencode opțional: lansează explicit un agent în pane-ul stâng
# sbt list listează sesiunile tmux
# sbt kill [N] omoară sesiunea N
# sbt detach [N] detașează clienții de la sesiunea N
#
-# Variabile: SANDBOX (implicit claude-workspace)
+# Variabile: SANDBOX (implicit claude-workspace), SBT_PANE_DELAY (implicit 4s)
set -euo pipefail
SANDBOX="${SANDBOX:-claude-workspace}"
@@ -33,7 +34,7 @@ session_name() {
}
# ---- Parsare argumente ----
-ACTION="start"; NUM="1"; PROJ=""; AGENT="claude"
+ACTION="start"; NUM="1"; PROJ=""; AGENT="shell"
case "${1:-}" in
list)
@@ -47,7 +48,7 @@ case "${1:-}" in
usage
;;
1|2|3)
- NUM="$1"; PROJ="${2:-}"; AGENT="${3:-claude}"
+ NUM="$1"; PROJ="${2:-}"; AGENT="${3:-shell}"
;;
"")
: # implicite
@@ -117,6 +118,11 @@ echo "Sesiune nouă: $SESSION (sandbox=$SANDBOX dir=$DIR agent=${AGENT:-shell
tmux new-session -d -s "$SESSION" -c "$ROOT" "$(sandbox_pane "$INNER")"
tmux set-option -t "$SESSION" -g mouse on
-tmux split-window -h -t "$SESSION:0" -c "$ROOT" "$(sandbox_pane "")"
+
+# Al doilea pane intră în sandbox cu întârziere: două `sbx exec` pornite simultan
+# se calcă pe lock-ul de refresh Docker Hub al lui sbx și scot
+# „could not acquire docker hub refresh lock". Warning inofensiv, dar zgomotos.
+tmux split-window -h -t "$SESSION:0" -c "$ROOT" \
+ "sh -c $(printf '%q' "sleep ${SBT_PANE_DELAY:-4}; exec $(sandbox_pane "")")"
tmux select-pane -t "$SESSION:0.0"
exec tmux attach-session -t "$SESSION"