tractor/ai/prompt-io/opencode/20260821T023537Z_ae6f2ac3_p...

1.4 KiB

Replace the actor-cancel timeout watcher/status experiment with one explicit absolute deadline threaded through the existing private call path. Do not use a ContextVar, shared result state, waiter coalescing, or polling tasks.

git diff HEAD~1..HEAD -- tractor/runtime/_portal.py

Portal.cancel_actor() computes one absolute deadline and uses it for both Start frame publication and the subsequent cancel-ack wait.

git diff HEAD~1..HEAD -- tractor/runtime/_runtime.py

git diff HEAD~1..HEAD -- tractor/ipc/_chan.py

The private RPC path forwards the operation-specific deadline. Lower layers preserve the ordinary infinite-deadline call shape.

git diff HEAD~1..HEAD -- tractor/ipc/_transport.py

MsgpackTransport.send() applies the deadline inside its complete-frame shield. If the deadline expires after partial publication, it closes the unusable stream before releasing the send lock.

git diff HEAD~1..HEAD -- tests/ipc/test_each_tpt.py

git diff HEAD~1..HEAD -- tests/test_to_actor.py

Focused regressions prove a partial-frame timeout closes the stream and that actor-cancel publication and acknowledgement share one budget.

The implementation removes the earlier _SendStatus, watcher task, coalescing, shared cancel result, and per-waiter state. Four focused transport and actor-cancel tests pass.