diff --git a/cmd/arcrun-app/.version-source.json b/cmd/arcrun-app/.version-source.json index 3cc4549..5aacbec 100644 --- a/cmd/arcrun-app/.version-source.json +++ b/cmd/arcrun-app/.version-source.json @@ -1,4 +1,5 @@ { "_algo": 2, - "v0.18.17": "cb6e53a052b87482" + "v0.18.17": "cb6e53a052b87482", + "v0.18.18": "a495451d9d9da78a" } diff --git a/direct.go b/direct.go index 12f1235..a4b9540 100644 --- a/direct.go +++ b/direct.go @@ -685,6 +685,17 @@ func RunDirectOnce(cfg *DirectConfig, dryRun bool) ([]DirectResult, int, *Trigge Path: r.Path, Error: shortError(r.Error), }) + case "skipped": + // 🔴 leo 2026-08-06:退避期間這個檔**不會**再產生 "failed", + // 於是 status.failures 是空的 ⇒ 畫面只剩「⚠ N 份失敗」沒有原因。 + // 退避訊息裡已經帶了上游真因(retrySkipReason),一併收進來, + // 使用者才看得到「為什麼」而不只是「幾份」。 + if strings.Contains(r.Error, "後重試") || strings.Contains(r.Error, "已暫停自動重試") { + st.Failures = append(st.Failures, ExtractFail{ + Path: r.Path, + Error: shortError(r.Error), + }) + } } } } @@ -711,12 +722,21 @@ func RunDirectOnce(cfg *DirectConfig, dryRun bool) ([]DirectResult, int, *Trigge } // shortError 把錯誤字串截為一句話(供 UI 顯示,不要超過 120 字)。 +// shortError 限制錯誤訊息長度。 +// +// 🔴 2026-08-06 放寬到 240:訊息現在會**帶上游真因** +// +// (「上次失敗(第 4 次),58m 後重試|原因:…Workers AI…4006: you have used up +// your daily free allocation of 10,000 neurons…」), +// 而真因在**後半段**——砍 120 會把它整段切掉,等於又回到「只說失敗不說原因」。 +// (leo 原則:別人的錯誤一律要顯示給用戶看。) func shortError(msg string) string { - if len([]rune(msg)) <= 120 { + const max = 240 + if len([]rune(msg)) <= max { return msg } runes := []rune(msg) - return string(runes[:120]) + "…" + return string(runes[:max]) + "…" } // CheckExtractor 預檢萃取器是否可用(不執行萃取、不打 API)。