Severity: high | Category: correctness | Phase: P1.8
Problem
VerificationWrapper/plan Agent already persist a blocker before returning AgentResult(status="blocked"), then runtime.execute_agent creates a second one from result.blocker_question. blockers.create has no dedupe and fires the outbound webhook per call, so every blocked run produces two OPEN blockers + two blocker.created webhooks; a human must answer both.
Evidence
codeframe/core/runtime.py:825, codeframe/core/adapters/verification_wrapper.py:204
Acceptance criteria
- Blocker creation has a single owner; runtime creates one only when the result carries a question with no already-persisted blocker (or dedupe on
(task_id, question, OPEN)).
- Test: one escalation produces exactly one OPEN blocker and one webhook.
Dependencies
None
Filed from the SaaS launch-readiness audit. Atomic: one developer, one session. Work order: strictly P0.1 → P3.12 (no forward dependencies).
Severity: high | Category: correctness | Phase: P1.8
Problem
VerificationWrapper/planAgentalready persist a blocker before returningAgentResult(status="blocked"), thenruntime.execute_agentcreates a second one fromresult.blocker_question.blockers.createhas no dedupe and fires the outbound webhook per call, so every blocked run produces two OPEN blockers + twoblocker.createdwebhooks; a human must answer both.Evidence
codeframe/core/runtime.py:825,codeframe/core/adapters/verification_wrapper.py:204Acceptance criteria
(task_id, question, OPEN)).Dependencies
None
Filed from the SaaS launch-readiness audit. Atomic: one developer, one session. Work order: strictly P0.1 → P3.12 (no forward dependencies).