[PIX-13213] fix: применять явный итог successful-run handoff сразу, до исчерпания попыток #205
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "agent/devops/pix-13213-delivery"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
Восстановлена (re-derived, не cherry-pick) идея ветки
agent/devops/pix-11564поверх текущего master: если корректирующий (finish_successful_run_handoff) запуск явно указал итог задачи (done/cancelled/blocked) уже в первой попытке, и задача является безопасной для рутинного авто-закрытия (isSafeRoutineDispositionTarget), система применяет итог сразу — не дожидаясь исчерпания всех handoff-попыток (maxHandoffAttempts).isSafeRoutineDispositionTarget()переиспользует существующие guard'ыisManualOwnerActionIssue,isExplicitExternalBoundaryIssue,isContinuousOperatingLoopIssueи добавляет keyword-паттерн для approval-gate/mainnet/legal/compliance/social_media/audit — задачи такого рода никогда не получают ранний авто-disposition. Ранний путь переиспользует уже существующиеdeclaredSuccessfulRunHandoffTerminalDisposition(с regex-guard'ом от негации/continuation из PIX-13186) иresolveSuccessfulRunHandoffDeclaredDisposition— новой логики парсинга текста не добавлено.По второй части задачи (PIX-13213 включал ревью ветки
agent/devops/pix-13218, JOIN-условиеreconcileProcesslessRunsTargetingTerminalIssuesвserver/src/services/heartbeat.ts): проверено, чтоheartbeatRunsв текущей схеме (packages/db/src/schema/heartbeat_runs.ts) не имеет колонкиissueId— она нигде не объявлена. JOIN-условие ветки pix-13218 (eq(issues.id, heartbeatRuns.issueId)) ссылается на несуществующее поле и не может быть корректным в текущей схеме. Единственная реальная связь —issues.executionRunId → heartbeatRuns.id(см.packages/db/src/schema/issues.ts:39, а также PIX-13081, который явно поддерживает эту связь атомарно черезclaimQueuedRun). Текущий JOIN в master (eq(issues.executionRunId, heartbeatRuns.id)) корректен и не изменён; изменений вheartbeat.tsв этом PR нет.Зачем
Без этого фикса задача с уже готовым явным итогом (
done/cancelled/blocked) от корректирующего handoff-запуска ожидала нескольких раундов handoff-попыток прежде чем итог применялся — лишняя задержка закрытия для рутинных задач, при этом риск ложного авто-closure для manual/mainnet/legal/compliance/audit задач исключён явным guard'ом.План тестирования
server/src/__tests__/heartbeat-process-recovery.test.ts(PIX-13213: ...):doneна обычной задаче → немедленное применение (successfulRunHandoffResolved: 1, без ожидания exhaustion).skipped: 1).skipped: 1).npx vitest run src/__tests__/heartbeat-process-recovery.test.ts -t "PIX-13213"→ 3 passed.heartbeat-process-recovery.test.tsмассово падает (79/92) и на немодифицированном origin/master — подтверждённая pre-existing проблема окружения (embedded postgres/параллельные воркеры), не связанная с этим PR.pnpm run typecheck(полный monorepo, через husky pre-push hook) — прошёл успешно при push.server/src/__tests__/heartbeat-processless-run-reconciliation.test.ts(3 теста) прогнан отдельно и зелёный — подтверждает корректность текущего join, изменений не требовалось.Где могу ошибаться
isSafeRoutineDispositionTarget()keyword-паттерн (approval-gate/legal/compliance/social_media/mainnet/audit) — эвристический, как и остальные guard'ы в этом файле; теоретически может пропустить редкую формулировку без этих слов. Смягчается тем, что это лишь ускоряет момент применения итога — тот же итог всё равно был бы применён после exhaustion, просто позже.heartbeat-process-recovery.test.tsне удалось зафиксировать зелёным целиком в этой среде (окружение падает и на чистом master) — проверено целевым-tфильтром и явным baseline-сравнением, но не через полный CI-прогон в этой сессии.Верификация PIX-13213: PR содержит недостающий remainder из agent/devops/pix-11564 (isSafeRoutineDispositionTarget + раннее разрешение диспозиции), адаптированный под текущий master после PIX-13186. Локально прогнал 3 целевых теста (
vitest run -t "PIX-13213") — все зелёные. CI: security/pr-scan и Typecheck/Build — success; API Tests — ещё выполняются (долгий полный прогон).