mistakes:Workers AI 額度用完/掃描版 PDF——兩個「不是 bug 但要說清楚」的已知現象

This commit is contained in:
2026-08-06 20:48:01 +08:00
parent 9dc7cbc803
commit 6e0b65a2bb
3 changed files with 60 additions and 23 deletions
+31 -13
View File
@@ -49,6 +49,8 @@ LINE_FILE = ROOT / "DAEMON_LINE"
UNRELEASED = "## 下一版(未發佈)"
# 版本 → 當時原始碼指紋。用來擋「同一個版號、不同的執行檔」。
SOURCE_LOCK = HERE / ".version-source.json"
# 指紋演算法版本:改算法時 +1,帳本會自動作廢重記(見 check_or_record)。
FINGERPRINT_ALGO = 2
RELEASED_RE = re.compile(r"^## v(\d+)\.(\d+)\.(\d+)", re.M)
@@ -58,24 +60,33 @@ def die(msg):
def source_fingerprint():
"""會被編進執行檔的原始碼指紋(已提交的樹 + 未提交的差異)
"""會被編進執行檔的原始碼指紋——直接對**工作區檔案內容**取值
🔴 2026-08-06 補這道閘的由來
戳完版號後又改 code再打一次包,腳本判定「沒有未發佈段=重打同一版」
**兩個內容不同的執行檔都叫 v0.18.9**(實測 sha256 前 20 碼
63ec1077a29383b31379 vs 1ca73a5aef5bf4f90bd3
這正是 leo 08-05 點名的「版本號手寫=說謊溫床」換個形式復發——
機械產生版本號還不夠,還要保證**同一個版號只對應一份原始碼**。
為什麼要這道閘(2026-08-06
戳完版號後又改 code再打一次包,腳本判定「沒有未發佈段=重打同一版」
⇒ 兩個內容不同的執行檔都叫 v0.18.9
機械產生版本號還不夠,還要保證同一個版號只對應一份原始碼
二修(同日,閘擋錯自己人):
原本算「HEAD:collector 樹雜湊 + 未提交 diff」,但那在 commit 前後
會給出不同指紋、即使內容一模一樣——戳版號時檔案還沒提交(在 diff 裡),
提交後樹變了、diff 空了。結果只改 wiki 也被判「版號已對應另一份原始碼」。
改成對工作區檔案內容取值,與有沒有提交無關。
"""
def sh(*args):
return subprocess.check_output(args, cwd=ROOT, text=True).strip()
try:
tree = sh("git", "rev-parse", "HEAD:collector")
files = subprocess.check_output(
["git", "ls-files", "-co", "--exclude-standard", "collector"],
cwd=ROOT, text=True).split("\n")
except subprocess.CalledProcessError:
return "" # 不在 git 裡就不擋(例如從 tarball 解出來 build
diff = subprocess.run(["git", "diff", "HEAD", "--", "collector"],
cwd=ROOT, text=True, capture_output=True).stdout
return hashlib.sha256((tree + diff).encode()).hexdigest()[:16]
h = hashlib.sha256()
for rel in sorted(f for f in files if f.strip()):
fp = ROOT / rel
if not fp.is_file():
continue # 已刪除的檔案
h.update(rel.encode())
h.update(fp.read_bytes())
return h.hexdigest()[:16]
def artifacts_for(version):
@@ -93,6 +104,13 @@ def check_or_record(version, stamp):
if not fp:
return
lock = json.loads(SOURCE_LOCK.read_text()) if SOURCE_LOCK.exists() else {}
# 指紋演算法一改,舊紀錄就是「用不同單位量出來的數字」,比對沒有意義。
# 帳本自己記演算法版本,不合就整本作廢重記——比留著誤擋自己人好。
if lock.get("_algo") != FINGERPRINT_ALGO:
if lock:
print("i 指紋演算法已更新(v%s),舊紀錄作廢重記" % FINGERPRINT_ALGO,
file=sys.stderr)
lock = {"_algo": FINGERPRINT_ALGO}
known = lock.get(version)
# 🔴 2026-08-06:打包**失敗**時版號已被戳、產物卻沒生出來 ⇒ 那個版號被白白燒掉,
# 修完再打就被自己的閘擋下,只能去手改 JSON(爛示範,遲早有人順手改成「都放行」)。