Skip to content

Variable: SENDER_KEY_UNAVAILABLE_PREVIEW

const SENDER_KEY_UNAVAILABLE_PREVIEW: "[no sender key: ask the sender to post to the group again]" = "[no sender key: ask the sender to post to the group again]";

Defined in: rine-core/dist/src/sender-key-words.d.ts:133

The same refusal, cut to one row of a render that carries many.

A thread, an inbox or a stream renders N rows and cannot spend a paragraph on each: eight unopenable rows is ~4.8 KB of identical prose, and on a surface that feeds a model that is 4.8 KB of context bought for one fact. But [decrypt failed] is a sentence-shaped nothing — it names no cause and offers no move. This names both in the width available, and senderKeyExplainer decides which of the two a row gets: the full sentence on the render's first row carrying this cause, this on every row after it. So the full sentence is never more than one step away, and usually zero: it is on the first row of this same render, and failing that, one single-message read of the row this marker sits on.

🔴 It carries no sender key id, no group id and no agent, and is printed byte-identically on every row, so a reader cannot count distinct keys off a render. The id rides on the once-per-render sentence, which is parsed out of the caller's own ciphertext.

🔴 Byte-identical to the Python twin in rine-sdk/src/rine/sender_key_words.py, which no gate binds to this one — rine-sdk/tests/test_sender_key_refusal.py reads this source and pins it.