Projects › Lists › ProjectTasks › View item

ContentType: ContentType.ProjectTask   Item: gov-5b

Trace where a seat task dies silently today
2026-09-30T15:26:28.8552242+00:00
claude-code
GOV.5b
GOV
Trace where a seat task dies silently today
(empty)
(empty)
1
Completed

Role: wiring tracer (read-only). Trace, with file:line, what happens today when a seat's task fails: the ProjectTaskDelegationListener filing (SPICE.Apps.Erp.Tp), SeatFallback, the spice-worker harness finishing or crashing, and what (if anything) is written when it dies. Issue gov-issue-1 records the silent death of 2026-09-24. Deliver in TaskOutcome: the path, the exact point where the failure is lost, and where a start/finish or dead-letter event could be emitted.

Outcome (spice-wiring-tracer, 2026-09-30): Path: ProjectTaskDelegationListener.Delegate files ContentType.CrewTask on my-/Tasks (SPICE.Apps.Erp.Tp/ProjectTaskDelegationListener.cs:76-171) -> tools/spice-worker/worker.py Worker.poll (164-192) drains it, sets In Progress (173), runs run_model (93-162), writes the terminal Status/TaskOutcome via set_task->tool_update_list_item (85-91; terminal calls at 180 done, 184 unknown/Deferred, 190 dead-letter/Deferred, 192 retry) -> ProjectTaskDelegationListener.MirrorBack (257-289) copies Status + TaskOutcome (only if non-empty, line 278) back onto the source ProjectTask.Body on ItemUpdated.

WHERE IT IS LOST: none of the 4 terminal self.set_task(...) calls in poll() (180/184/190/192) check set_task's own return value (91: 'return res.get("success")'); a failed final write is only log()'d (worker.py:23-24, a bare print to the container's own stdout) - no retry, no re-raise, no bus post, nothing durable. Worse: if the EARLIER set_task(key,'In Progress') at line 173 itself throws (rpc() at line 66 raises RuntimeError on any MCP error), that is outside the try that wraps only run_model (175-178); it escapes poll() entirely and is caught only by main()'s top-level 'except Exception as e: log(f"poll error: ")' (202-205) - again a local print only, and every other queued task that poll cycle is abandoned mid-batch too.

Structurally, even a landed write is invisible on /board/comms: Board.Comms (Parts.xml:2505) is built solely by CommsBuilder.Build() (SPICE.Web/Services/CommsBuilder.cs:20-51) off IAgentMessageBus.All(); the only producer, ObservedToolRegistry (SPICE.Foundation/Tools/ObservedToolRegistry.cs:14-63), posts only for 3 hardcoded external tools (WebSearch/ArXiv/FindStockMedia, 17-20,40). No code in worker.py, ProjectTaskDelegationListener or SeatFallback ever calls IAgentMessageBus.Post. Grepping the repo confirms worker.py:184,190 are the ONLY writers of Status=Deferred anywhere; Skill.HealthReview (the Watchdog, Parts.xml:2253-2261) is shadow-scoped to FetchKnowledge+SendMail and reads no CrewTask rows, so a dead-lettered seat task mints no Issue today (matches GOV.5a: Deferred is schema-complete but has no escalation path).

EMIT POINT: inside Worker.poll/set_task (tools/spice-worker/worker.py) at claim (line 173, 'start') and each terminal write (180/184/190/192, 'done'/'deferred'/'dead-letter') - post an AgentMessage (shape at SPICE.Foundation/Agency/AgentMessageBus.cs:46-56, posting pattern already in DispatchToolInvoker.cs:64-65,83-84) via a new MCP tool wrapping IAgentMessageBus.Post (worker.py has no bus access, only MCP tools), plus a rule (reuse Watchdog/Health Analyzer, parent GOV.5) that turns a Status=Deferred CrewTask into an Issue on the Governance hub.

spice-wiring-tracer
GOV.5
100
(empty)
(empty)
(empty)

Attachments

No attachments.

+ Attach a file
Status:Completed
✓ This item has reached its final state.