ouroboros/skills
Ouroboros 6a78a8fe0b Accept a late owner quiz answer and deliver it as an owner message
A question card no longer dies with its author (owner decision В17a=A, which
explicitly retired 30=A). Expiry stays structural — the task-done seam still
flips an unanswered card to expired_terminal — but the answer ingress now
accepts an answer on that expired block, records it with
answered_after_terminal for audit, and keeps first-answer-wins exactly as it
was.

Because a finished task has no mailbox anyone will drain, the recorded answer
is delivered into the card's own chat as the owner's OWN message through the
named ingress accept_local_message: its canonical chat row is the acceptance
receipt and its client_message_id (quiz_late_answer:<task>:<quiz>) is the
idempotency key, so a retry after a failed delivery re-enters the same
delivery instead of enqueueing twice. The message text is the existing full
_quiz_answer_frame, untrimmed; provenance rides its own task_metadata field
so the real transport's client_surface is never substituted; and the owner
gets the same WS echo bubble their own typing produces.

The 2xx now says answered_after_terminal and forwarded, with a reason_code
when the card's chat is synthetic A2A traffic or the hidden partition — a
destination with no owner turn to start. 409 is left for a card that was
already answered, so the ingress stops fabricating an expiry on a bare
refusal. record_asked stores the card's chat_id (and a waiting asker's
max_wait_minutes) so the delivery addresses where the card was shown, with
address_task_event as the fallback for older blocks.

On the web the card stays answerable after its task finishes: the option
buttons and the free-answer field survive expired_terminal (only answered or
superseded turn the card into a record), the status reads "Task finished — you
can still answer", the project pointer reads "Answer still possible" and keeps
refreshing, and a bodyless 409 no longer invents an expiry the card obeys.
Telegram reports the same two outcomes honestly. Without the web half the
feature would have been reachable from Telegram alone.

Disclosed properties: in a project room with exactly one live steerable root
task the ordinary routing hands the late answer to THAT task's mailbox; and a
card evicted by the 16-block cap answers 404, because it is genuinely no
longer known.

Co-authored-by: Ouroboros <311266734+ouroboros-agent@users.noreply.github.com>
2026-09-16 05:19:22 +03:00
..
telegram Accept a late owner quiz answer and deliver it as an owner message 2026-09-16 05:19:22 +03:00
unix_computer_use fix: preserve review evidence and tool delivery semantics 2026-09-09 15:18:56 +03:00