apps/web/app/page.tsx:9-10已由 Worker 驗證const failedJobs = syncJobs.filter(job => job.status === "failed"); const failedEvents = syncEvents.filter(event => event.status === "failed");
首頁會統計同步工作與 Webhook 事件的失敗數量,表示兩種失敗都會觸發待處理提示。
所有內容來自真實 Task、Agent Run、測試、Evidence 與 Replay;不是預先寫死的成功畫面。
Notion 是內部任務來源;外部 GitHub Issue 先進 Inbox。未經人工接受或連結,不會污染 Notion,也不能啟動 Agent。
同步工作失敗時,使用者需要清楚知道原因與下一步操作。
Agent 先做 Hybrid Retrieval,索引綁定 commit。Embedding 失敗會降級 Keyword;Evaluation fixture 不允許進正式 Context。
apps/web/app/api/agent-runs/[id]/replay/route.tsapps/web/app/api/internal/sync-jobs/process/route.tsapps/web/app/api/sync-jobs/[id]/retry/route.tsapps/web/app/api/tasks/[id]/prepare-patch/route.tsapps/web/app/evaluations/cases/[id]/page.tsxapps/web/app/evaluations/page.tsxapps/web/app/page.tsxapps/web/app/runs/[id]/page.tsxapps/web/app/sync/page.tsxapps/web/lib/data.ts這不是單次 LLM 呼叫。Baseline 先通過,模型才可修改;Patch 後重新執行 lint、typecheck、test,最多修正三次。
目前沒有產生程式碼 Diff。
模型必須引用檔案、行號與原始片段。Worker 對照實際 Context 驗證,不相信模型自行宣稱『已確認』。
同步失敗提示目前只提供前往同步紀錄的入口;Webhook 失敗事件沒有重試操作,且現有重試 API 僅支援 sync_jobs。需要補上事件重試流程,才能完整符合「失敗摘要與重試入口」的驗收條件。
apps/web/app/page.tsx:9-10已由 Worker 驗證const failedJobs = syncJobs.filter(job => job.status === "failed"); const failedEvents = syncEvents.filter(event => event.status === "failed");
首頁會統計同步工作與 Webhook 事件的失敗數量,表示兩種失敗都會觸發待處理提示。
apps/web/app/page.tsx:31-31已由 Worker 驗證 {failedJobs.length + failedEvents.length > 0 && <section className="section card alert-card"><div><h2>同步需要處理</h2><p className="muted">有 {failedJobs.length} 筆回寫工作與 {failedEvents.length} 筆 Webhook 事件失敗。</p></div><Link className="button secondary" href="/sync">查看同步紀錄</Link></section>}首頁只提供查看同步紀錄的連結,沒有直接或明確的重試入口。
apps/web/app/sync/page.tsx:21-27引用無法驗證 <tbody>{jobs.map(job => <tr key={job.id}>
<td>{job.work_items?.title ?? "未知任務"}</td>
<td>{actionLabels[job.action] ?? job.action}</td>
<td><StatusBadge value={job.status} /></td>
<td>{job.attempt_count} / 3</td>
<td className="muted">{job.last_error ?? "—"}</td>
<td>{job.status === "failed" && <ActionButton endpoint={`/api/sync-jobs/${job.id}/retry`} label="重新同步" tone="secondary" />}</td>
</tr>)}</tbody>sync_jobs 已有錯誤摘要與重試按鈕,但目前只涵蓋 jobs。
apps/web/app/api/sync-jobs/[id]/retry/route.ts:6-17已由 Worker 驗證 const { data, error } = await adminDb()
.from("sync_jobs")
.update({ status: "queued", attempt_count: 0, last_error: null, available_at: new Date().toISOString() })
.eq("id", id)
.eq("status", "failed")
.select("id")
.maybeSingle();
if (error) return failure(error.message, 500);
if (!data) return failure("只有失敗的同步工作可以重新執行", 409);
scheduleSyncJobs();
return ok({ queued: true });現有重試端點只更新 sync_jobs,無法處理首頁同樣統計的 failed sync_events。
apps/web/app/page.tsxapps/web/app/sync/page.tsxapps/web/app/api/sync-jobs/[id]/retry/route.tsapps/web/lib/data.tsExact Replay 固定 Task snapshot、base commit、Context paths 與 SHA-256。這次 Prompt v2 並沒有更好,而是因錯誤行號被 Evidence Gate 阻擋。
困難 Retrieval corpus 中,Keyword 與 Hybrid 品質持平,但 Hybrid 明顯更慢。因此目前沒有證據支持全面取代 Keyword。