feat: add completion_reason to paired_tasks (done/escalated/stopped/arbiter_escalated)

- owner can summon arbiter via BLOCKED/NEEDS_CONTEXT verdict
- completion_reason tracks why task ended: done (success), escalated
  (reviewer gave up), stopped (/stop), arbiter_escalated
This commit is contained in:
Eyejoker
2026-03-31 04:10:33 +09:00
parent b02c509eb8
commit e1b9501e87
9 changed files with 43 additions and 3 deletions

View File

@@ -256,6 +256,7 @@ function createSchema(database: Database): void {
status TEXT NOT NULL DEFAULT 'active',
arbiter_verdict TEXT,
arbiter_requested_at TEXT,
completion_reason TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
CHECK (status IN ('active', 'review_ready', 'in_review', 'merge_ready', 'completed', 'arbiter_requested', 'in_arbitration'))
@@ -633,6 +634,7 @@ function createSchema(database: Database): void {
status TEXT NOT NULL DEFAULT 'active',
arbiter_verdict TEXT,
arbiter_requested_at TEXT,
completion_reason TEXT,
created_at TEXT NOT NULL,
updated_at TEXT NOT NULL,
CHECK (status IN ('active', 'review_ready', 'in_review', 'merge_ready', 'completed', 'arbiter_requested', 'in_arbitration'))
@@ -664,6 +666,15 @@ function createSchema(database: Database): void {
/* column already exists */
}
// Migration: add completion_reason column to paired_tasks if it doesn't exist
try {
database.exec(
`ALTER TABLE paired_tasks ADD COLUMN completion_reason TEXT`,
);
} catch {
/* column already exists */
}
// Drop legacy tables that are no longer used
for (const table of [
'paired_executions',
@@ -2035,6 +2046,7 @@ export function updatePairedTask(
| 'status'
| 'arbiter_verdict'
| 'arbiter_requested_at'
| 'completion_reason'
| 'updated_at'
>
>,
@@ -2074,6 +2086,10 @@ export function updatePairedTask(
fields.push('arbiter_requested_at = ?');
values.push(updates.arbiter_requested_at);
}
if (updates.completion_reason !== undefined) {
fields.push('completion_reason = ?');
values.push(updates.completion_reason);
}
if (updates.updated_at !== undefined) {
fields.push('updated_at = ?');
values.push(updates.updated_at);