feat(routing): at-least-once guarantee for chair comments → CEO
The event-driven comment→CEO route (issue.comment.created) is best-effort: a failed/coalesced/cancelled CEO invoke, or a comment that lands while an agent is mid-run, can leave a chair comment unrouted with nothing to retry. This is exactly how a chair comment on CMP-190 (2026-06-30) was silently dropped — the host-native wake was cancelled (issue_execution_promoted / assignee_changed) and no plugin route fired. Adds a reconciliation sweep (route-pending-comments, every 2 min) that re-routes any active issue whose LAST comment is the chair's (no agent reply after it) and whose id ≠ the per-issue `last-routed-comment-id` marker. Both the fast path and the sweep stamp the marker → idempotent, no double-routing of healthy comments. "Last comment is user" precisely targets the failure (chair commented, no agent response) and skips historically answered comments, so first-run-after-deploy footprint is 0. - worker.ts: extract shared routeCommentToCeo() + markCommentRouted(); event handler stamps marker (incl. the native-handles-it branch); register route-pending-comments sweep with per-company/per-issue guards. - manifest.ts: declare route-pending-comments job (*/2 * * * *). Invariants: G12 (Paperclip touch only in the declared wrapper — plugin), G2 (extends the existing route, no parallel path). Refs legal-ai #164. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -178,6 +178,13 @@ export default {
|
||||
'מסכם פידבק יו"ר מהשבוע האחרון ומעדכן את decision-lessons.md',
|
||||
schedule: "0 19 * * 0",
|
||||
},
|
||||
{
|
||||
jobKey: "route-pending-comments",
|
||||
displayName: "ערובת מסירת-הערות (sweep)",
|
||||
description:
|
||||
"sweep פיוס: מנתב כל הערת-משתמש שטרם נותבה ל-CEO (at-least-once), כדי שהערה לא תיפול גם אם ה-wakeup התבטל/התלכד",
|
||||
schedule: "*/2 * * * *",
|
||||
},
|
||||
],
|
||||
webhooks: [
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user