#!/usr/bin/env bash # # verify-kv-retirement.sh — 把「換掉 KV,資產還在」真的做一次 # # KV 退休(Leo/Arcrun#16 + #17)。交辦的驗收條件逐字是: # 「證明『換掉/重建那個暫存層,資產還在』——不是說明它會在,是**真的弄一次給我看**」 # 「既有的東西要能搬過去,而且搬的過程不能弄丟任何一筆(搬之前先數,搬之後再數)」 # 這支腳本就是那一次。它做的事,照順序: # # 1. 開一台**全新的空**本機實例(local D1 + local KV,跑真的 migrations) # 2. 用平常那條路(POST /webhooks/named、POST /recipes、POST /auth-recipes) # 放進 9 支工作流 + 3 份 recipe——9 是照 2026-08-12 那天真的消失的數量 # 3. 數一次(KV 幾筆、KBDB 幾筆) # 4. **把整個 KV 層砍掉重建**(rm -rf 那顆 KV 的本機儲存 → 重開 worker) # =模擬 Arcrun#97 那天發生的事:worker 被綁到一顆全新的空 KV # 5. 再數一次,並且**真的觸發一支工作流**確認它還跑得動 # # 通過的定義(不通就 exit 1,不留模稜兩可): # 砍掉 KV 之後,列出來仍然是 9 支、recipe 仍在、工作流仍然跑得出結果。 # # ⚠️ 全程只碰本機(--local + --persist-to 到暫存目錄),**不碰任何線上實例**。 # 腳本裡沒有任何 --remote、沒有任何真實帳號憑證。 # # 用法: bash scripts/verify-kv-retirement.sh # 需要: node 22+、pnpm、可執行 npx wrangler / curl 的 shell set -euo pipefail REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" WORK="$(mktemp -d)" KBDB_PORT=8801 CYPHER_PORT=8802 TOKEN="e2e-local-token" TENANT="leo-e2e" WF_COUNT=9 KBDB="http://127.0.0.1:${KBDB_PORT}" CYPHER="http://127.0.0.1:${CYPHER_PORT}" kbdb_pid=""; cypher_pid="" cleanup() { [ -n "$kbdb_pid" ] && kill "$kbdb_pid" 2>/dev/null || true [ -n "$cypher_pid" ] && kill "$cypher_pid" 2>/dev/null || true rm -rf "$WORK" } trap cleanup EXIT say() { printf '\n\033[1m== %s\033[0m\n' "$*"; } fail() { printf '\n\033[31m❌ %s\033[0m\n' "$*"; exit 1; } wait_for() { # wait_for