Proposal
An offer the agent made in passing — a fact it inferred, something it suggests tracking — with its actions while pending, settling into a quiet decided state. Unlike a request, it doesn't stop the work.
Inside a reply
Quieter than a card, so it doesn't read as the end of the reply.
Assistant said
Ana mentioned she's travelling, so I'd hold the nudge until she's back.
I'll remind you on the 19th.
<div class="mx-auto max-w-2xl">
<%= ai_chat_message role: :assistant do %>
<p>Ana mentioned she's travelling, so I'd hold the nudge until she's back.</p>
<%= ai_chat_proposal id: "inline_fact" do |offer| %>
<% offer.claim "Ana is travelling until the 18th" %>
<% offer.meta "About Ana Silva · 80% sure" %>
<% offer.accept { button_to "Remember", "#", class: button_classes(:primary, size: :small) } %>
<% offer.reject { button_to "Dismiss", "#", class: button_classes(size: :small) } %>
<% end %>
<%= ai_chat_proposal id: "inline_finder", icon: :list_checks do |offer| %>
<% offer.claim { safe_join [ "Track ", tag.strong("notice period"), " for everyone?" ] } %>
<% offer.meta "e.g. Ana Silva — one month" %>
<% offer.accept { button_to "Track this", "#", class: button_classes(:primary, size: :small) } %>
<% offer.reject { button_to "No thanks", "#", class: button_classes(size: :small) } %>
<% end %>
<p>I'll remind you on the 19th.</p>
<% end %>
</div>Decided
Accepted, and dismissed (dimmed).
<div class="mx-auto max-w-2xl">
<%= ai_chat_proposal state: :accepted do |offer| %>
<% offer.claim "Ana is travelling until the 18th" %>
<% offer.meta "About Ana Silva" %>
<% offer.outcome "Remembered" %>
<% end %>
<%= ai_chat_proposal state: :rejected, icon: :list_checks do |offer| %>
<% offer.claim "Track notice period for everyone?" %>
<% offer.meta "A new kind of detail worth keeping" %>
<% end %>
</div>