Shared decoder #
Bluesky and Slack use the same Speaker and core.respond. Jev 1.13 chooses
all reply content; adapters handle acknowledgement, access, hydration and delivery.
Decision rule #
The decoder separates stopping from choosing the next word. One request asks for the next-piece Choice and two Noul probabilities:
- f: has the answer addressed the human's request, including requested detail?
- u: does it end inside an unfinished phrase?
The stopping hazard is s = f(1-u). This product is a heuristic conjunction, not
an established joint probability or an assumption that these judgments are
independent. The boundary factor reduces stops on fragments such as he.
There are no threshold gates, continuation branches or candidate-quality critics.
A willingness-to-stop factor scales s by c(h) = 0.25 + 0.75 (g/300)^2, where g is the current grapheme count. Jev's "already answered" judgment is high for a terse non-answer, and ending there is the opposite of rambling; c lets the reply keep going after the request is addressed and makes stopping near the post cap likely so the cap is rarely hit mid-phrase. The comparison measured c=0.25 against c=1 on the same prompts.
For Choice probabilities p over continuation options, use
q(w) = p(w)^(1/T) / sum_v p(v)^(1/T), T = 0.7
P(END) = c(h) s
P(append w) = (1 - c(h) s) q(w).
The Noul scores are not temperature-sharpened. Changing word temperature or the number of word options does not renormalize the END mass. END is unavailable on a blank answer or while spelling a word. Sampling still permits both brief and longer replies. There is no minimum, target length, step budget, generation deadline or second draft. The API timeout remains 15 seconds with no provider retry.
Choice supplies probabilities over its alternatives; Noul supplies a yes/no probability. Neither establishes a native language-model token distribution. See the comparison for the measured tradeoffs.
Text support #
The existing 5,000 common words plus human/context/reference/profile words are scored in groups of 250, with the option order shuffled on every step from a separate seeded stream so the decision sampler stays replayable. Every option scoring at least 0.05 in its heat becomes a finalist, capped at the API's 254-option runoff bound by heat probability. Heat probabilities are not comparable across groups; the cap ordering is only a tiebreak, and the earlier four-per-band quota is kept as a fallback when fewer than two options score. Finalists then pass a syntactic filter: a word already used twice in the last sixteen words is dropped, and punctuation is dropped at the start or directly after punctuation. The filter supplies no content and is skipped if it would leave fewer than two options. The final Choice recomputes probabilities over the shuffled finalists.
A single fallback option spells a missing word character by character, using
printable ASCII and ellipsis. Spelling has its own word-end option after a
character is emitted. Characters no longer compete individually with ordinary
words. This avoids the previous 1%-probability capital L entering an ordinary
reply. Word and spelling paths still affect the distribution; arbitrary unseen
Unicode is not supported.
Context and output #
Adapters hydrate the current post and up to ten ancestors, or eleven Slack thread messages. The decoder retains the human messages from that window, attributed references/images, and the current human profile. Earlier bot replies are omitted from both state and vocabulary; this reduces feedback from its own invented labels. It also means references to details invented only in an earlier bot reply can be lost. There is no persistent conversation memory across threads. The bot's own profile is excluded. Every turn requires a fresh mention.
Bluesky retains up to four quoted images from the human thread, checking source versions before downloading. The latest attached image remains on its message. Slack retains its existing image recovery and attribution behavior.
All appends must fit 300 graphemes and 3,000 UTF-8 bytes. Reaching that boundary returns the current text, even if unfinished. API failures propagate through the existing adapter handling without publishing a partial draft. No persona, reply examples, task menus or response templates are supplied; the repetition filter above is the only syntactic rule.
Traces retain the actual requests, Choice/Noul responses, stopping hazard, sampled actions, timing and usage. Tests verify the probability factorization, RNG replay, spelling fallback, more than 48 steps, platform caps, image bytes through the SDK, and transport failure behavior.
The model can still be vague, repetitive or wrong. Longer output is not evidence of better character or successful instruction following.
Decoding math measures what the heats, runoff and hazard did across the recorded evaluation traces; the tuned comparison records the two paid rounds that produced the current settings.