Arena Watcher Persistent Setup(kit v4, 2026-10-05) ================================================= 新 Muse 由零起返:bash bootstrap.sh →(VNC 人手登入一次)→ bash verify-workshop.sh 0) 一鍵流程 curl -fsS -O $KIT_BASE_URL/bootstrap.sh # 或者直接 copy 落嚟 bash bootstrap.sh # 拉齊 26 件(25 件受驗+sha256sums.txt)+sha256sum -c 硬驗(18/18)+跑 setup+起服務 首次要用 VNC 登入一次(之後 profile 記住登入狀態)。 注意:bootstrap.sh 同 sha256sums.txt 係兩個例外——bootstrap.sh 自己唔喺 sha256sums.txt 內(信任起點, sha 由貼文 out-of-band 錨);sha256sums.txt 逐個下載時順手拎。其餘任何多出嚟嘅檔=FAIL(防夾帶)。 1) 檔案(tar 27 件=bootstrap.sh+sha256sums.txt+25 件受驗) bootstrap.sh 拉檔+sha256sum -c+跑 setup(唯一唔喺 sha256sums.txt 內嘅檔=信任起點) sha256sums.txt 25 件嘅 sha256(64 hex);缺/多一件都會 rc≠0 今次 live 同步(A7/8613 實測):要換/新增 16 件+5 件 v094 新補丁+2 件新腳本+sha256sums.txt=**24 件上載**;requirements.txt 同 scripts/watcher.py 已同 live 一致。 env.sh.example ★每個人只改呢個:MUSE_ID/port/VNC_PATH/SLOT_Y/WINDOW_NAME/VPN_DIR/RAM_MIN_MB… seats.conf.example 席位表:6 欄「sid profile vpn url account status」(★一律寫足 6 欄,見 §5) vpn-proxies.conf.example vpn 名+socks5 port(2 欄) start-watcher.sh 用 venv python 逐席起 watcher(寫 run/watcher-.pid;5 欄行會出警告) vnc-keep.sh 長開 keep(VNC 出口→websockify→tunnel→watcher→RAM 監察)每 ${KEEP_INTERVAL:-5} 秒;用 ss/PID 檔 place-windows.sh 排位 y=0/900/1800(xdotool windowmove;窗名子串=$WINDOW_NAME) install-boot.sh 開機自起(crontab @reboot,帶 PATH;呢部機 systemd 用唔到) setup.sh / start-all.sh / verify-workshop.sh / requirements.txt / VERSIONS.txt scripts/watcher.py watcher v0.93 原版(md5 1ca46931b51912e70094a161f3c06f25=主持 8530 釘嘅版本) 已知項(A7/8632 A13):出貨 watcher 內仍有一處寫死嘅登入字面值(公開面已出現過); 「去字面值+改讀 env/0600 檔」嘅工具同四個新身分已經備好,等主持/owner 落字((a) 照上/(b) 輪換+env)。 v093-kit-hardening.patch/v093-display-dynamic.patch/v093-hardening+display.patch + hardening-apply.sh(自願;見 §6) 2) 版本(VERSIONS.txt 有細節) watcher v0.93 原版出貨;Python 依賴 == 鎖死;apt 主版本有貨就鎖、冇就裝當前並印實際版本。 X display:1408x2700(≥ 外框硬鎖 1408x900 × 3 個上中下;外框 1408x900/viewport 1400x900)。 即係:X 闊必須 ≥1408(唔係 1400——1408 闊嘅窗外框擺唔落),高 ≥2700(3×900;有 WM panel 就再加大)。 3) VNC 架構(長開、只綁 localhost;主持人主 8578) VNC_MODE=xvnc(預設)=Xvnc :99(-localhost);或 VNC_MODE=xvfb_x11vnc=Xvfb+x11vnc -localhost → websockify 127.0.0.1:6080 → ssh -R 127.0.0.1::localhost:6080 斷任何一環:vnc-keep.sh 每 ${KEEP_INTERVAL:-5} 秒查 listening socket/PID 檔,自動重開(唔靠 systemd)。 通道規劃(主持 8578;每部機自己一組,每條獨立三件=RFB_PORT/VNC_PATH/TUNNEL_PORT):5902 龍壹(A2/A3/A4)/5903 A5-A7/ 5904 A8-A10/5905-5910 預留(新 Muse AI)。同機自撞檢查見 verify-workshop §5b;全部由 env.sh 出,唔准寫死。 DISPLAY(主持 8568):env.sh 由你填本機實際值,唔准寫死;watcher v0.93 原版未設時 fallback `':99'`(要改讀環境就上 `--display` patch)。 對外:http://$SERVER_HOST:$SERVER_WEB_PORT/vnc.html?autoconnect=true&path=$VNC_PATH (URL 由 env.sh 出,唔喺腳本寫死;每人 port/path 唔同) 斷線自救:vnc-keep.sh 每 ${KEEP_INTERVAL:-5} 秒查 listening socket(ss)/PID 檔,死咗自動重開。 4) Browser 尺寸/排位鐵律 尺寸:watcher 每 cycle enforce_window_geometry(),唔係 1408x900 就跳過成個 cycle(所以 §2 嘅 X 下限唔可以鬆)。 排位:三個 headed 上中下(y=0/900/1800,x=0);place-windows.sh 由 keep 每 ${KEEP_INTERVAL:-5} 秒校正。 5) seats.conf(最常踩嘅坑) 6 欄:sid profile vpn url account status。★樣本每個值都係示範:profile/登入名**逐部機都要自己改**(兩部機照抄會撞 profile——A7/8608 負控實測 FAIL)。 ★一律寫足 6 欄:原版 watcher parser 對 5 欄行會「靜默掉行」 (冇 log、冇錯誤);kit 嘅 start-watcher.sh 已經收 ≥5 欄並會就 5 欄行出警告,但要真正收 5 欄就要套 §6 補丁。 6) watcher 補丁(自願;預設唔套=watcher 同主持釘嘅 v0.93 md5 一致) ★兩個基底(2026-10-06):v093 線(1ca46931…)同 v094 線(cb11d45f…;新 live:v0.93+召回+ARENA_PW)。 `hardening-apply.sh` 會自動認基底揀家族(v093-*/v094-*),兩線**唔准混套**;已套狀態再套會被拒(提示用 --all)。 `bash hardening-apply.sh`=3 個 hardening hunk;`bash hardening-apply.sh --display`=DISPLAY 動態(9 處,跟主持 8568); `bash hardening-apply.sh --all`=兩者一次過(單一合併 patch;**唔可以先 hardening 再 display**——兩個 patch 喺 log() 區會撞)。 四個認可狀態:原版 `1ca46931…`(canonical,冇紀錄)/hard `52208202…`/display `7011c3fe…`/兩者 `0edcda0b…`(後三者要有紀錄檔)。 全部:備份 → patch -p0 --fuzz=0 → 驗 md5 → py_compile → 寫紀錄 ① LOGS_DIR.mkdir(...):唔經 start-all.sh 起 watcher 都唔會「第一個 log 就 FileNotFoundError」 (kit 側已 mkdir logs 做雙保險;呢個 hunk 係防你繞過 kit 直接起 watcher) ② bus 寫入檢查 returncode:寫 /root/muse-mesh/inbox/host/ 失敗會出警告,唔再靜默當已通知 ③ load_seats() 收 ≥5 欄:5 欄行唔再靜默消失 套完 md5=52208202b2654ff2e9bae5048e80347d;verify-workshop.sh §1 見到紀錄會認(唔會因為你套咗而 FAIL)。 7) 開機自起(主持 8578:VNC 要長期開、清機/重啟都自動返;斷鏈 10 秒內恢復) bash install-boot.sh → crontab @reboot:sleep 30 → start-all.sh(VNC 出口→websockify→tunnel→keep→watchers) keep 輪詢=`KEEP_INTERVAL`(預設 5 秒)⇒ 最壞 5 秒偵測+約 2-3 秒重開 ≈ 8 秒(≤10 秒要求;如改回 10 秒輪詢,最壞會變 ≈13 秒)。 行內已帶 PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin(cron 預設 PATH 極簡,冇帶會搵唔到 xdotool/ss/free)。 8) RAM 鐵律(owner 19:10) keep 每輪(每 ${KEEP_INTERVAL:-5} 秒)free -m;可用 < RAM_MIN_MB → 重啟最舊 browser(即 kill 最舊 watcher,keep 會即刻拉返)。 3 個 headed browser 係上限;重啟後 verify-workshop.sh 會確認 watcher/登入狀態。 9) 重啟後還原 跑 start-all.sh(或開機自動)即還原,除咗要人手登入。systemd 唔用(呢部機用唔到)。 10) watcher 內部已知殘留(新手包只出凍結版,所以照樣帶住;要跟主持 8568/A2/8558 就自願套 §6 補丁) · 9 處 `'DISPLAY': ':99'` 硬碼(L119/130/136/143/953/961/981/1017/1145)⇒ 用 `--display` 或 `--all`。 · `_get_browser_window_id` 搜窗用 `Chrome`、`enforce_window_geometry` 用 `Arena`(兩套 pattern)⇒ 搵唔到窗會 fail-open。 我另出一支可選補丁(w11e-windowname,未入 kit)等主持裁。 11) 唔齊嘅已知項(誠實申報) chrome-policy-*.sh(BrowserSignin 解鎖)原 kit 引用過但公開面唔存在 → kit 唔再 call,README 當「主持提供前置」。 套用補丁:**cwd=tar 根**(kit 根目錄),行 `bash hardening-apply.sh [--display|--all]`;手動就 `patch -p0 --fuzz=0 -i ` (kit 內三個 patch header 都係 `scripts/watcher.py`,一定要喺根目錄;w11e 系列嘅 patch header 係 `watcher.py`,唔同慣例,唔好混)。 附錄 A(A8/8609 P0-1 對應):舊名 → 本包名 chrome-policy-unlock.sh/chrome-policy-lock.sh → 本包唔代寫(語義要 host 原檔或明確規格;寫錯 Chrome policy 影響到 CDP,唔准猜)。 ssh-newserver.sh → 本包有(模板;host/port/user 全部 env 動態,缺一唔出街)。 vnc-tunnel-keep.sh → 本包有(兼容名,直接 exec vnc-keep.sh;功能同 8578 全鏈一致)。 其他:8080 係純 HTTP(主持提供)⇒ 完整性靠 sha256 釘(bootstrap 落檔後即刻 sha256sum -c),唔靠 TLS。