Skip to content

docs(product): design ask-answer recovery — answer-as-message (RIG-2257) - #586

Open
rigel-mintaka wants to merge 1 commit into
mainfrom
compass-server/rig-2257-ask-answer-recovery-design
Open

docs(product): design ask-answer recovery — answer-as-message (RIG-2257)#586
rigel-mintaka wants to merge 1 commit into
mainfrom
compass-server/rig-2257-ask-answer-recovery-design

Conversation

@rigel-mintaka

@rigel-mintaka rigel-mintaka commented Aug 24, 2026

Copy link
Copy Markdown
Contributor

Rewrite of the RIG-2257 design record around answer-as-message on the existing durable delivery rail (Matt's ruling on RIG-2675, superseding the prior owed-marker + control-op-wake draft).

The change

The ask-answer wake is keyed on the session id live at RespondToAsk time, so an answer submitted while the asking agent has no live session (or after a reconnect/resume minted a new session id) is silently dropped and never redelivered — the sweep excludes the author (delivery_cursors.go:484) and the ask is agent-authored, so the "reads it next turn" fallback is false.

Fix at the root: make the answer a new message authored by the answerer (a participant, not the agent), carrying a server-owned ask_answer message-block variant that snapshots the answered ask. An answerer-authored message is not author-excluded, so it is swept, delivered, acked, and reconnect-redelivered by the one delivery rail that already exists — no new durability machinery, no new proto ack frame, no agent-side boot poll.

Why this shape

  • Net-smaller: deletes the entire bespoke wake rail (both ask_waker.go files, the AskAnswerControl proto op, the agent's PendingAsks registry + control arm) and replaces it with one MessageBlock oneof variant + one agent render arm.
  • Scales: the ask_answer block is framed as instance chore: scaffold Compass OSS monorepo — toolchain, workspace, compass.v1 pipeline, CI #1 of a general special-message-block pattern — every future structured interaction (approvals, status cards) is a block variant on the ONE rail, inheriting at-least-once + reconnect-resweep for free, instead of a bespoke control op per type.
  • Pre-GA nothing is frozen: the RIG-1509 agent half is reworked here (consumes an answer message by ask_id), not preserved.

Red-teamed by a design-critic (1 high / 2 medium / 1 low, all folded): dropped the client-namespace idempotency key that reintroduced silent-loss (answer-once guard is sole single-fire), corrected the live-unsubscribed-asker delivery arm (owed row + live dispatch are complements, not either/or), named the steer-lane as a second render-arm consumer, and stated the channel-wide audience.

Spec-impact: none. Refs RIG-2257 (successor to compass-ask-comms-roundtrip Decision 3).

Co-authored-by: Matt Wilkinson matt@rigel.build

@linear-code

linear-code Bot commented Aug 24, 2026

Copy link
Copy Markdown

RIG-2257

@github-actions

github-actions Bot commented Aug 24, 2026

Copy link
Copy Markdown

Compass engineering docs preview: https://compass-server-rig-2257-ask.compass-eng-docs.pages.dev

Deployed from compass-server/rig-2257-ask-answer-recovery-design at dd79769.

Changed pages:

@rigel-mintaka
rigel-mintaka force-pushed the compass-server/rig-2257-ask-answer-recovery-design branch from 9f936d7 to f64b3b3 Compare August 24, 2026 15:36
@rigel-mintaka rigel-mintaka changed the title docs(product): design ask-answer recovery — owed-to-handle delivery (RIG-2257) docs(product): design ask-answer recovery — answer-as-message (RIG-2257) Aug 24, 2026
@rigel-mintaka
rigel-mintaka force-pushed the compass-server/rig-2257-ask-answer-recovery-design branch from f64b3b3 to cb0f14e Compare August 24, 2026 19:09
Rewrite of the RIG-2257 design record around **answer-as-message on the existing durable delivery rail** (Matt's ruling on RIG-2675, superseding the prior owed-marker + control-op-wake draft).

## The change

The ask-answer wake is keyed on the session id live at `RespondToAsk` time, so an answer submitted while the asking agent has no live session (or after a reconnect/resume minted a new session id) is silently dropped and never redelivered — the sweep excludes the author (`delivery_cursors.go:484`) and the ask is agent-authored, so the "reads it next turn" fallback is false.

Fix at the root: make the answer a **new message authored by the answerer** (a participant, not the agent), carrying a server-owned `ask_answer` message-block variant that snapshots the answered ask. An answerer-authored message is not author-excluded, so it is swept, delivered, acked, and reconnect-redelivered by the one delivery rail that already exists — no new durability machinery, no new proto ack frame, no agent-side boot poll.

## Why this shape

- **Net-smaller:** deletes the entire bespoke wake rail (both `ask_waker.go` files, the `AskAnswerControl` proto op, the agent's `PendingAsks` registry + control arm) and replaces it with one `MessageBlock` oneof variant + one agent render arm.
- **Scales:** the `ask_answer` block is framed as instance #1 of a general **special-message-block** pattern — every future structured interaction (approvals, status cards) is a block variant on the ONE rail, inheriting at-least-once + reconnect-resweep for free, instead of a bespoke control op per type.
- **Pre-GA nothing is frozen:** the RIG-1509 agent half is reworked here (consumes an answer *message* by `ask_id`), not preserved.

Red-teamed by a design-critic (1 high / 2 medium / 1 low, all folded): dropped the client-namespace idempotency key that reintroduced silent-loss (answer-once guard is sole single-fire), corrected the live-unsubscribed-asker delivery arm (owed row + live dispatch are complements, not either/or), named the steer-lane as a second render-arm consumer, and stated the channel-wide audience.

Spec-impact: none. Refs RIG-2257 (successor to compass-ask-comms-roundtrip Decision 3).

Co-authored-by: Matt Wilkinson <matt@rigel.build>
@rigel-mintaka
rigel-mintaka force-pushed the compass-server/rig-2257-ask-answer-recovery-design branch from cb0f14e to dd79769 Compare August 24, 2026 19:35
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant