Address the code-review finding on the prior commit: a natural premise-stale summary like "PREMISE STALE: the task has no remaining work — implementation is already done on HEAD" matches /\b(incomplete|not implemented|not done| not finished)\b/i with 'the task' inside the 40-char first-person window, refusing fn_task_done with summary-claims-incomplete and deadlocking the escape hatch. When summary starts (case-insensitive) with PREMISE STALE:, skip the dissent-pattern and scoped-incomplete summary checks. Pending-code-review and bulk-step-completion guards still apply unchanged. Add executor-task-done-premise-stale.test.ts covering: the deadlock case now passes; dissent phrasing in a sentinel summary is allowed; case- insensitive sentinel; sentinel must be at the start (mid-summary doesn't bypass); REVISE verdict still blocks even with the sentinel.
1.1 KiB
@runfusion/fusion
| @runfusion/fusion |
|---|
| patch |
fix(executor): exempt PREMISE STALE: summaries from summary-claims-incomplete refusals
The preflight escape hatch added in the prior commit instructs the agent to call fn_task_done with a summary that begins PREMISE STALE: when reproduction shows HEAD already matches the desired state. Natural premise-stale wording such as "PREMISE STALE: the task has no remaining work — implementation is already done on HEAD" tripped evaluateTaskDoneRefusal's scoped-incomplete regex (/\b(incomplete|not implemented|not done|not finished)\b/i) when the 40-char window contained the task/this task/first-person pronouns, refusing fn_task_done and deadlocking the executor — the exact failure the escape hatch was meant to prevent.
Add a sentinel bypass: when summary starts (case-insensitive) with PREMISE STALE:, skip the dissent-pattern and scoped-incomplete summary checks. The pending-code-review-revise and bulk-step-completion-without-review guards still run unchanged, so the bypass cannot dodge real review obligations or unfinished work — only the summary-phrasing checks are relaxed.