Posts
All the articles I've posted.
ffmpeg -loop 1 的預設輸入幀率是 25,zoompan 的 fps 救不回來
用 ffmpeg 把一組靜照剪成 30fps 的直式短影片,每一顆鏡頭指定停留秒數(hold),十二顆接起來應該是 30.0 秒。這又是同一個形狀:失敗的樣子跟成功的樣子一模一樣。
claude -p 子行程限制 Read 權限,只有 --settings 的 deny 有效
一個聊天機器人 shell 出去呼叫 claude -p 回話,原本只在「這一輪有新圖」時才給 Read 工具。改版後她要能回頭打開對話歷史裡任何一張舊照片,於是 Read 從「偶爾開」變成「常開」。單元測試驗不到這件事。
加了保護但保護不存在的三種形狀
一套會自動回覆 Threads 公開留言的產線,上線前補四道防護。四道都寫完、測試全綠、覆蓋率看起來很好,實際去打真的 API 才發現其中一道從來沒有生效過,另一道的測試把常數改成 999 照樣綠。「靜默失敗」的判準是:壞掉的樣子跟正常的樣子長得一模一樣。
Prompt 漏抓時先查「是不是被某條排除規則主動擋掉」,不要先調取捨強度
yuna 專案有一段抽取用的 prompt:讀一天的聊天記錄,把角色自己講過、而設定裡沒有的事實抽出來。漏抓有兩種完全不同的成因:模型「沒想到要收」,跟模型「有一條規則叫它不要收」。
Python sqlite3 的 with conn: 拿不到原子性——當 repo 函式自己 commit
Review 指出這不是原子操作:中途失敗(database is locked、process 被砍)會留下「事實寫進去了、但沒標記」,下一輪重跑就重複寫入同一批。with conn: 只在「區塊內沒有任何 commit」時才有原子性。
LLM 工具回傳要把關鍵參數念回去
一個角色扮演 bot 有 add_plan_event 工具,讓它把「跟人約好的事」寫進行程表。嘴上七點半,寫進 start_time 的卻是 18:30。工具回傳不要只回「已完成 #id」。
subprocess 讀 JSON 不能假設 stdout 只有 JSON
一個常駐 bot 要驗收「這張圖裡有沒有人臉」,但影像套件(insightface / onnxruntime)只裝在另一個專案的 venv 裡。「工具壞了」跟「我讀錯了」在 log 上長得一模一樣,而排除順序應該是後者優先。
bash 全形標點緊接變數會被吃進變數名,set -u 下讓整個函式靜默不執行
腳本沒有任何錯誤輸出、exit code 也不是 0 以外的值(因為 stderr 被 2>&1 | grep 過濾掉了),log 檔停在函式呼叫前的最後一行,看起來就像「函式沒被呼叫」。set -u + 管線過濾 stderr = 靜默失敗。
hyperframes render 多 worker 會在 worker 邊界掉幀
用 npx hyperframes render(預設 4 workers)渲染一支 109 秒的直式影片,成品在 27.3s 與 81.8s 各出現約 0.3 秒的黑閃——背景圖整片消失,但疊在上面的 HUD、對話框、角色立繪都還在。沒有 worker 邊界就沒有這個問題。
SQLite FTS5 trigram 搜不到兩個字的中文詞
一個中文聊天機器人用 FTS5 全文檢索翻歷史對話。不報錯、不拋例外,就是回空清單——跟「這件事從來沒被提過」長得一模一樣。測試資料剛好避開邊界,比沒有測試更危險。