fix: prevent repeated task creation after failures

This commit is contained in:
2026-05-06 15:49:18 +08:00
parent 9cc8055020
commit c7d972e5cd
6 changed files with 56 additions and 18 deletions

View File

@@ -207,6 +207,17 @@ class Database:
).fetchall()
return self._task(rows[0]) if rows else None
def task_for_issue(self, repo_id: int, issue_number: int) -> TaskRecord | None:
row = self.conn.execute(
"""
SELECT * FROM tasks
WHERE repo_id = ? AND issue_number = ?
ORDER BY id DESC LIMIT 1
""",
(repo_id, issue_number),
).fetchone()
return self._task(row) if row else None
def create_task(self, repo_id: int, issue_number: int) -> TaskRecord:
now = dt_to_db(utcnow())
self.conn.execute(
@@ -322,13 +333,23 @@ class Database:
return updated
def retry_task(self, task_id: int) -> TaskRecord:
return self.transition(
task_id,
TaskState.DISCOVERED,
message="manual retry",
error_message="",
clear_lease=True,
task = self.get_task(task_id)
if task is None:
raise ValueError(f"task not found: {task_id}")
now = dt_to_db(utcnow())
self.conn.execute(
"""
UPDATE tasks
SET state = ?, lease_owner = NULL, lease_expires_at = NULL, error_message = NULL, updated_at = ?
WHERE id = ?
""",
(TaskState.DISCOVERED.value, now, task_id),
)
self.conn.commit()
self.add_event(task_id, task.state, TaskState.DISCOVERED, "manual retry")
updated = self.get_task(task_id)
assert updated is not None
return updated
def cancel_task(self, task_id: int) -> TaskRecord:
return self.transition(task_id, TaskState.CANCELLED, message="manual cancellation", clear_lease=True)

View File

@@ -31,7 +31,7 @@ def scan_eligible_issues(
for issue in db.list_open_issues(repo.id):
if not is_issue_eligible(issue, labels):
continue
if db.active_task_for_issue(repo.id, issue.issue_number):
if db.task_for_issue(repo.id, issue.issue_number):
continue
task = db.create_task(repo.id, issue.issue_number)
created.append(task.id)

View File

@@ -195,8 +195,8 @@ class TaskRunner:
write_prompt(prompt_path, prompt)
command = render_command(
self.config.agents.implementer.command,
workspace_path=workspace,
prompt_path=prompt_path,
workspace_path=workspace.resolve(),
prompt_path=prompt_path.resolve(),
issue_number=issue.issue_number,
issue_title=issue.title,
branch_name=branch_name,
@@ -230,8 +230,8 @@ class TaskRunner:
write_prompt(prompt_path, prompt)
command = render_command(
self.config.agents.reviewer.command,
workspace_path=workspace,
prompt_path=prompt_path,
workspace_path=workspace.resolve(),
prompt_path=prompt_path.resolve(),
issue_number=issue.issue_number,
issue_title=issue.title,
pr_number=pr_number,