You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
P1: a queued task whose snapshotted project was disabled or deleted
before execution is now REFUSED with a durable reply — ResolveProject
failure no longer falls back to the gateway default root, closing the
contradiction with the 'never helpfully run elsewhere' claim. All
refusal paths share one helper; regression test added.
P2 (TTS): voice replies are synthesized exactly ONCE, at job completion,
and the spool ID is persisted on the replied row — a delivery retry or a
restart re-sends the same file instead of re-billing TTS ('always') or
losing the in_kind decision (attachments aren't loaded by the replay).
P2 (Signal): the principal is now the account UUID — Signal's stable
identity — with the phone number only as fallback; numbers change hands.
Pairing keeps uuids painless to allow-list.
P2/P3 (email): the From-address identity caveat is now stated in the
package doc and both docs (allow-list strength depends on the provider's
SPF/DKIM/DMARC filtering; dedicated mainstream account advised);
explicit Authentication-Results enforcement is a tracked follow-up.
fmt.Fprintf(r.out, "gateway: recording voice-note refusal for %s: %v\n", it.Channel, serr)
455
-
return
456
-
}
457
-
r.deliverReply(ctx, it, msg)
446
+
r.refuse(ctx, it, "Voice note received, but no transcription provider is configured. Set OPENAI_API_KEY or GEMINI_API_KEY on the gateway machine, or send text.")
0 commit comments