42cb1d7aa9
leo 2026-08-08:「已經發生過一次這個錯誤,把舊版界面上到 prod, 你要確定不可再犯。」 實測(repo 對線上,純文字資產比對): repo portal/index.html 343,969 bytes 線上 mira.uncle6.me 82,911 bytes(Songti 12 處,舊金色 serif 品牌) 線上 pages.dev 82,911 bytes(同上) 而e730b3f那版 verify-live 對這兩站**三項檢查全過**——因為它驗的是 組態(apiBase、profile 的 views/home),不是世代。 ⇒ 一個網址可以組態完全正確、卻對外展示一套早就被淘汰的介面, 而所有機械檢查都說它是綠的。這就是要消滅的狀態。 本次落地: 一、世代指紋(targets.mjs) 逐一取線上/產物的資產(index / portal / console / favicon.svg), 遮掉本來就該隨部署目標不同的那兩行(VIEWS/HOME),其餘按位元組比對。 刻意不用關鍵字清單——清單要人維護,而舊世代能無聲上線正是因為沒人記得維護它。 誠實 trade-off 寫在檔內:repo 改了沒部署就會判紅,那是正確的(那時線上確實不當代)。 二、宣告值真的寫進產物(收掉e730b3f標的 WIP) deploy.mjs 改為由 targets.mjs 產出 .staging/<目標> 再推: config.js 由宣告值即時產生、console 的 VIEWS/HOME 依 profile 覆寫, **覆寫沒命中就中止部署**;推之前回頭讀磁碟上那份驗一次(不看腳本印了什麼)。 public/config.js 刪除——它是產物不是原始碼。 三、修好一道從 08-03 起就在誤判的閘 t160 的世代閘比對 portal 全文含「登記新庫」即拒部,而 66f1b59(08-03) 加了一則**說明「已經把它拿掉了」的 HTML 註解** ⇒ 該閘自那天起每次誤判, npm run deploy:personal 連續五天推不出去。改成剝掉註解後只看可見內容, 並降級為輔助(主判準是指紋)。這正是「手工關鍵字閘會腐爛」的實例。 四、讓它在該跑的時候真的被跑到(不再生出沒人記得執行的腳本) · deploy.mjs 推完自動回頭驗線上,不過就算本次部署失敗 · .deploy-state.json 只在線上實測通過後才寫,且不進版控 (新 checkout 沒紀錄=狀態未知=該被提醒,而不是繼承別人的綠燈) · Stop hook 每回合離線比對「手上這一代 vs 最後一次驗過的部署」, 在要說「做完了」的那一刻出聲(實測 0.096s,不連網) 五、uncle6 邊界寫進工具本身(leo 08-08:「要看範例只在 youlin 網站,不要去碰 uncle6」) deploy.targets.json 的 enterprise 標 frozen:deploy 拒絕部署、verify 連抓都不抓。 目標本身保留不刪——刪掉就變成下一個 AI 眼中「從來沒有過這個站」的失憶。 同源清掉兩處還活著的舊記錄:README 的線上 demo 連結、public/index.html 的註解。 驗收證據見 commit 後的實測輸出(舊世代樣本取自 git 歷史 ad367e4,本機起站餵判準, 未碰任何線上資源)。 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
75 lines
2.9 KiB
Bash
Executable File
75 lines
2.9 KiB
Bash
Executable File
#!/bin/bash
|
||
# .claude/hooks/stop-check-sync.sh
|
||
# arcrun Stop hook
|
||
#
|
||
# 職責:session 結束前檢查 code 變動是否有對應的 SDD / tasks.md 更新
|
||
# 退出 code:不 block,只警告
|
||
|
||
set -o pipefail
|
||
|
||
# 檢查 docs/3-specs 下本次 session 是否有變動
|
||
SPECS_DIFF=$(git -C "$(pwd)" status --porcelain -- 'docs/3-specs/' 2>/dev/null | head -20)
|
||
CODE_DIFF=$(git -C "$(pwd)" status --porcelain -- '*.go' '*.ts' '*.tsx' '*.py' 'cypher-executor/' 'registry/' 'cli/' 2>/dev/null | head -20)
|
||
|
||
if [[ -n "$CODE_DIFF" && -z "$SPECS_DIFF" ]]; then
|
||
cat >&2 <<EOF
|
||
|
||
⚠️ Stop hook 警告(by arcrun hook)
|
||
|
||
偵測到本 session 有程式碼變動,但 docs/3-specs/ 下的 SDD 文件沒有任何變動。
|
||
|
||
未 commit 的程式碼變動:
|
||
$(echo "$CODE_DIFF" | head -10)
|
||
|
||
請在結束前確認:
|
||
1. 對應的 tasks.md 是否已更新 [x]?
|
||
2. 是否有架構變動需要更新 design.md?
|
||
3. 是否有 SDD 範圍外的 change 未標記?
|
||
|
||
SDD 協議要求:code 和 SDD 必須同步更新。
|
||
參考:.claude/rules/00-sdd-protocol.md
|
||
|
||
EOF
|
||
fi
|
||
|
||
# ── console-ui:對外網址上是不是還跑著舊世代?(2026-08-08)────────────────
|
||
#
|
||
# 病(leo:「已經發生過一次這個錯誤,把舊版界面上到 prod,你要確定不可再犯」):
|
||
# 前端改完、commit 了、甚至 wiki 都寫了,但**沒有人把它推上去**——
|
||
# 而線上不會報錯,只是繼續展示半個月前的介面。08-08 實測:三個對外網址的
|
||
# apiBase/profile 全綠,跑的卻是 07-22 那一代。**組態對 ≠ 世代對。**
|
||
#
|
||
# 為什麼掛在 Stop:這裡正是 CC 要說「做完了」的那一刻。
|
||
# 不連網(每回合都跑),只比對「手上這一代」與「最後一次**通過線上實測**的部署紀錄」
|
||
# (.deploy-state.json 只在 deploy.mjs 驗過線上後才寫,不是跑過指令就寫)。
|
||
# 要問線上真實現況:cd console-ui && npm run verify(那支才連網)。
|
||
if [ -d console-ui/scripts ] && command -v node >/dev/null 2>&1; then
|
||
LAG="$(cd console-ui && node scripts/verify-live.mjs --offline-lag 2>/dev/null)"
|
||
if [ -n "$LAG" ]; then
|
||
cat >&2 <<EOF
|
||
|
||
🕰️ console-ui:手上這一代**還沒送出去過**
|
||
$(echo "$LAG" | sed 's/^/ · /')
|
||
|
||
對外網址不會因此報錯——它只會繼續展示舊介面,而所有只驗組態的檢查都會說它是綠的。
|
||
要看線上現在真的在跑哪一代: cd console-ui && npm run verify
|
||
要送出去(含推完自動回頭驗線上):cd console-ui && npm run deploy:personal
|
||
|
||
EOF
|
||
fi
|
||
fi
|
||
|
||
# 若有暫存的 tasks.md 變動,提醒 commit
|
||
TASKS_DIFF=$(git -C "$(pwd)" status --porcelain -- 'docs/3-specs/**/tasks.md' 2>/dev/null | head -5)
|
||
if [[ -n "$TASKS_DIFF" ]]; then
|
||
cat >&2 <<EOF
|
||
|
||
📝 提醒:tasks.md 有未 commit 的變動
|
||
$(echo "$TASKS_DIFF")
|
||
記得在結束前 commit。
|
||
|
||
EOF
|
||
fi
|
||
|
||
exit 0
|