6a49f25aef
SDD: docs/3-specs/jdd-dual-profile(draft → active,leo 2026-08-05 回「開工」)
範圍:總管指定的「防炸兩件 → Phase 0 → Phase 1」,Phase 2 以後未開工。
■ 防炸(排在所有 task 之前,因為它們炸的是既有的東西)
- check-no-instance-names.sh + instance-names.txt:框架範本不得混入實例專名
基線實測 22 行命中(非先前誤報的 20)→ 9 行無損泛化改寫、13 行檔級豁免記帳待 W3 搬走
拒絕假性清理(把專名換成模糊詞=資訊消失、分層問題還在)
- check-legacy-paths.sh:已發佈腳本引用的 35 條遠端路徑只增不移
舊實例跑的是舊腳本、路徑寫死;搬檔=整排 404 且不會有下一次更新來修它(1.16.0 前科)
■ Phase 0 地基
- template/manifest/{common,repo,orchestrator}.tsv:安裝清單單一真相源
修好 install/update 兩份硬編清單的既有漂移——install 從不裝 wiki-first-search /
subagent-wiki-guard / publish-lag-check / decisions-summary,但 update 會
⇒ 乾淨安裝反而拿不到 1.16/1.17/1.18 的招牌功能
- .claude/hooks/lib/role-lib.sh:scope×role 兩軸機械判定,零自陳
身分矩陣六組實測全通過,含「成員 repo × orchestrator」不存在的格子擋下
- .sdt-framework-dev:框架開發標記(官方沒有 --framework-dev 這個參數,實查非記憶)
■ Phase 1 雙 profile
- profiles/{repo,orchestrator}/CLAUDE.md 兩部憲法
- install.sh:--profile + 自動偵測+寫檔前確認、manifest 驅動、
CLAUDE.md 三段組裝(框架區/本地補充區界標+sha256)、.profile、.template-manifest、
settings.json 寫入 env.AGENT_ROLE 預設
- update.sh:漂移偵測(不覆蓋手改檔、另存 .new、白話清單)+ 基準快照隨更新前進
- template/CLAUDE.md 原路徑凍結留底(相容)
■ 順手修掉兩個舊 bug(都在本次要動的函式裡)
- add_if_missing 少了 mkdir -p ⇒ 新目錄的檔 curl 失敗但 VERSION 照升(2026-07 記「待回報」至今未修)
- 下載健全性只用 [ -s ]=非空即接受 ⇒ 404 頁面會無聲覆寫好檔
(SKILL.md 260→1 行的機制;同一支腳本的版本號那條路早就防了,檔案這條沒防)
■ 實測(非推論)
- G4 憲法分流:兩個乾淨環境各裝一次,orchestrator 版含 SDD 三件式關鍵字 0 次、
repo 版含上游指針 8 次;界標 4/4;sha 宣告與實算相符
- G7 CI 擋實例名:注入違規行 → fail 並指出 sdd-check.md:77,exit 1;還原後 exit 0
- 漂移偵測:手改兩支 hook → 正確報 2 支、手改內容保住、產 .new;
解掉後歸零;連跑三輪冪等
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
82 lines
4.5 KiB
Bash
Executable File
82 lines
4.5 KiB
Bash
Executable File
#!/bin/bash
|
||
# publish-lag-check.sh — SessionStart hook:偵測「公開 mirror 落後工作區」並出聲
|
||
#
|
||
# 病根(leo 2026-07-21 點名的真實風險):
|
||
# Gitea(草稿/工作現場)與 GitHub(正稿/成品櫥窗)是**手動同步**的
|
||
# (靠人跑 scripts/publish-github.sh --push,且需 D20 arm)。
|
||
# → 改了零件、重編 wasm 後若沒人記得發佈,**用戶抓到舊版且沒有任何錯誤訊息,
|
||
# 只是行為不對**——這種靜默失敗只有外部使用者會撞到,我們自己永遠測不到。
|
||
#
|
||
# 典型形狀:安裝器/前端從 CDN 懶載資源,網址長得像
|
||
# cdn.jsdelivr.net/gh/<帳號>/<repo>@main/<產物路徑>
|
||
# ——那個位址永遠指向公開 repo 的**最後一次發佈**,不是你本機的最新版。
|
||
# 本機改對了、CDN 還在吐三代前的東西,而且不會有任何錯誤訊息。
|
||
#
|
||
# 原理:比對「工作區 HEAD」與「.github-public 最後一個 release commit 記錄的 snapshot」。
|
||
# publish-github.sh 的 commit 訊息格式固定為:release: snapshot <短hash> (<日期>)
|
||
# → 從中取出 hash,看它是不是工作區 HEAD 的祖先/相同。
|
||
#
|
||
# 只提醒不阻擋(exit 0):發不發佈是人的決定(且 push GitHub 需 leo 親跑 arm),
|
||
# hook 的職責只是消滅「忘了」這個失敗模式。
|
||
set -euo pipefail
|
||
|
||
MIRROR_DIR=".github-public"
|
||
|
||
# 沒裝發佈管線的 repo 直接安靜退出
|
||
[ -d "$MIRROR_DIR/.git" ] || exit 0
|
||
[ -f "scripts/publish-github.sh" ] || exit 0
|
||
git rev-parse --git-dir >/dev/null 2>&1 || exit 0
|
||
|
||
HEAD_SHORT="$(git rev-parse --short HEAD 2>/dev/null || echo '')"
|
||
[ -z "$HEAD_SHORT" ] && exit 0
|
||
|
||
# 從 mirror 最後一個 commit 訊息取出它當初發佈的來源 hash
|
||
LAST_MSG="$(git -C "$MIRROR_DIR" log -1 --format=%s 2>/dev/null || echo '')"
|
||
PUBLISHED="$(printf '%s' "$LAST_MSG" | sed -n 's/.*snapshot \([0-9a-f]\{6,\}\).*/\1/p')"
|
||
|
||
if [ -z "$PUBLISHED" ]; then
|
||
# mirror 存在但沒有可辨識的 release commit(可能還沒發過)
|
||
echo "════════════════════════════════════════════════"
|
||
echo "📦 這個 repo 有公開發佈管線,但 mirror 還沒發過任何版本"
|
||
echo "════════════════════════════════════════════════"
|
||
echo " 若已有用戶依賴公開版(例如安裝器從 jsDelivr 抓 wasm),現在是空的。"
|
||
echo " 發佈:leo 在頂層跑 scripts/github-arm.sh,再於本 repo 跑"
|
||
echo " GITHUB_REMOTE=... bash scripts/publish-github.sh --push"
|
||
echo ""
|
||
exit 0
|
||
fi
|
||
|
||
# 已發佈的那個 commit 就是現在的 HEAD → 同步,安靜
|
||
if [ "$PUBLISHED" = "$HEAD_SHORT" ]; then
|
||
exit 0
|
||
fi
|
||
|
||
# 算出落後幾個 commit(發佈點 → HEAD)。取不到就不顯示數字。
|
||
BEHIND="$(git rev-list --count "${PUBLISHED}..HEAD" 2>/dev/null || echo '')"
|
||
|
||
# 落後 0 且 hash 不同 → 可能是 mirror 比工作區新(罕見,例如剛 rebase),一樣提醒
|
||
echo "════════════════════════════════════════════════"
|
||
if [ -n "$BEHIND" ] && [ "$BEHIND" != "0" ]; then
|
||
printf '📤 公開 mirror 落後工作區 %s 個 commit(最後發佈:%s,現在:%s)\n' \
|
||
"$BEHIND" "$PUBLISHED" "$HEAD_SHORT"
|
||
else
|
||
printf '📤 公開 mirror 與工作區不一致(最後發佈:%s,現在:%s)\n' "$PUBLISHED" "$HEAD_SHORT"
|
||
fi
|
||
echo "════════════════════════════════════════════════"
|
||
echo "⚠️ 外部使用者拿到的仍是舊版,而且**不會有任何錯誤訊息**——只是行為不對。"
|
||
echo " (安裝器的懶載直接從公開位址抓 wasm,落後=裝到舊零件。)"
|
||
echo ""
|
||
echo " 要發佈:① leo 在頂層跑 bash scripts/github-arm.sh \"<任務描述>\" 30"
|
||
echo " ② 本 repo 跑 GITHUB_REMOTE=https://github.com/<帳號>/<repo>.git \\"
|
||
echo " bash scripts/publish-github.sh --push"
|
||
echo " 不急著發也沒關係——這只是提醒,別讓它靜默漏掉。"
|
||
|
||
# 若這次落後的內容碰到 wasm,額外警告(那是用戶會直接抓的東西)
|
||
if git diff --name-only "${PUBLISHED}..HEAD" 2>/dev/null | grep -q '\.wasm$'; then
|
||
echo ""
|
||
echo " 🔴 這批改動**包含 .wasm 變更** → 用戶抓到的零件會跟你本機不同,優先發佈。"
|
||
fi
|
||
echo ""
|
||
|
||
exit 0
|