用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/AzureFoxStudios/wabi --skill wabi-deploy-gates命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
正在显示 SKILL.md
| name | wabi-deploy-gates |
| description | Verify a Wabi binary before swap: addons, probes, locks. |
| version | 1.1.0 |
| author | Hermes Agent |
| license | MIT |
| metadata | {"hermes":{"tags":["wabi","deploy","verification","addons","wabidb"],"status":"active-2026-08-26"}} |
Companion to devops/wabi-deploy (user-owned; not editable by the agent). This skill captures the deploy-verification lessons that that skill's text does not yet carry. If wabi-deploy is ever adopted by the curator (hermes curator adopt wabi-deploy), merge this content into it and delete this skill.
A plain cargo build --release -p wabi-server silently drops the addons
feature (addons = ["wabi-webhooks", "wabi-lore"], default = [] in
core/crates/wabi-server/Cargo.toml). The build succeeds, SHA changes, all your
other string checks pass — and lore/webhooks routes are just gone from the
binary. Verified incident 2026-08-22: shipped a no-addons binary to Tim; every
pre-swap check was green because they tested wave-specific strings, not addon
strings.
Before ANY scp/swap:
strings target/release/wabi-server | grep -cF "Lore addon initialized"
# >= 1 required (fresh addon build shows ~3). 0 = plain build, STOP.
Never trust: the build command you ran, git history, or "it worked last time". Check the marker on the artifact bytes you are about to ship.
Compile-time vs runtime proof (verified 2026-08-26). The strings gate proves
COMPILE-TIME inclusion only. After the swap,
docker logs wabi-server | grep -cF "Lore addon initialized" can legitimately
return 0 — the init banner is not emitted at the default log level (shipped
artifact had strings=3, post-swap logs=0, addon fully live). A zero log count is
NOT evidence of a failed addon build. Prove RUNTIME presence with the API:
curl -fsS http://127.0.0.1:8088/api/addons
# expect a lore entry: "cargoFeature":"wabi-lore", "enabled":true
On the Tim HOST, container port 3001 is NOT reachable from the shell (only the caddy tunnel port is routed); probe through 8088. From off-host (LAN IP / Tailscale / public), :3001 works. Verified 2026-08-26: full suite green via 8088 during swap verification.
BASE=http://127.0.0.1:8088 # on Tim host; use :3001 (or public URL) from elsewhere
curl $BASE/health # {"status":"ok",...}
curl $BASE/livez # liveness (process up)
curl $BASE/readyz # engine canary — proves WabiDB readable (503 if degraded)
curl $BASE/metrics # Prometheus text; public unless gated
# admin gate check — MUST be 401 unauthenticated:
curl -o /dev/null -w "%{http_code}" $BASE/api/admin/jobs/dead-lettered
A 200 on an admin endpoint without a token means the auth gate broke.
.lock restart deadlock (kanban t_22c8e654)WabiDB open() (core/crates/wabidb/src/engine/mod.rs) writes
data/wabi-server/wabidb/.lock PID-stamped, then refuses boot if it exists.
Nothing ever removes it — not graceful shutdown, not crash paths. Any
container restart policy self-deadlocks: dying run leaves pid-1 lock → next
boot exits Error: engine already running in a loop forever.
Recovery sequence (verified live 2026-08-22):
docker compose stop wabi-server # FULL stop first, not just rm
rm -f data/wabi-server/wabidb/.lock data/wabi-server/.lock
docker compose up -d wabi-server
Removing the lock while the container is still restart-looping does NOT work — each crashed boot rewrites it. Stop → clear → start.
Proper fix (open card): remove own lock on shutdown + treat stale-PID locks as takeable instead of fatal. Existence alone is not liveness.
Checking only the strings for THIS wave's changes ("token reuse detected", "/livez") proves those features shipped — nothing else. A binary swap can gain your feature and silently LOSE another (see Gate 1). Keep a short standing marker list covering every capability the host is supposed to have, and grep all of them against the artifact before swap:
for m in "Lore addon initialized" "/livez" "token reuse detected"; do
printf '%s: %s\n' "$m" "$(strings target/release/wabi-server | grep -cF "$m")"
done
strings/sha256sum on the ~50MB release binary, and multi-part scp+ssh
chains over it, get rejected as "oversized/unparseable inline command payload"
— blocked even under YOLO. Do NOT retry inline and do not hand-type alternatives;
write the operation to a small script and execute it (verified end-to-end
2026-08-26: entire gates→ship→swap→verify chain ran as /tmp/wabi-*.sh
scripts, zero blocks). Keep each script single-purpose (gates / ship / swap /
verify) so a failure pinpoints its stage.
Tailscale SSH checkpoints expire periodically (seen again 2026-08-22, ~daily).
The ssh command hangs until timeout printing
https://login.tailscale.com/a/<hash>. Hand the raw URL to Ronin immediately,
then poll with ssh -o ConnectTimeout=10 tim@100.96.11.45 'echo ok' between
other work. Do not burn retries on long commands while blocked — do local-side
work (builds, kanban cards) during the wait.