v0.2.0
support_desk 0.2.0 — the desk can write first
lucia.open_support_conversation_with!(alice, "We saw your refund bounced", about: order)- New verb, same seam.
agent.open_support_conversation_with!(requester, message, about:, topic:)overTicket.open!(…, by: agent);opened_byis a record likeclosed_by, withopened_by_requester?/opened_by_support?and scopes. - Atomic. The case, the opener's seat (
reason: opened, no announcement), the opening line and the first message are one savepoint — a refused message leaves nothing behind.reply!gets the same guarantee. - The limits are on asking, not on being asked.
open_rate_limit/max_open_ticketscount only requester-opened cases. config.opening_line/config.opening_line_from_support— the system line a thread opens with, posted inside the transaction and ordered before the first message by construction.config.find_requesterfor the console's "Write to someone".has_support_tickets if:— who may ask and be written to; eligibility is checked at every write.- Console:
new+open_conversation, GlobalID allow-lists, reuse authorization under the row lock, 303/422 with the draft preserved; the door in the mounted and generated consoles. - Schema: one additive migration (
rails g support_desk:upgrade),rake support_desk:backfill_opened_by, doctor checks. - Read the CHANGELOG's "Upgrading from 0.1": this is a drained cutover, not a rolling deploy — 0.1 processes reject the new
openedassignment reason. - Verified on Rails 7.2 / 8.0 / 8.1 (SQLite) and PostgreSQL; rubocop and brakeman clean.
What's Changed
Full Changelog: v0.1.3...v0.2.0