The assistant answers from the site's record, a sentence at a time, each one checked
Questions about Armen's work, answered only from what the site says: streamed a sentence at a time, each held to the sections it cites; pay and private life refused by rule.
Context
A recruiter's questions are often small and particular: has he led a team, what did he do on 3-D Secure, does he know Kafka. The site holds the answers, spread over cases, roles, decisions and experiments; a language model can find and phrase them in seconds, and can also invent an answer, be talked into one, or wander onto what is nobody's business. The fit check's lessons apply (ADR 0017, ADR 0018): narrow what the model may draw on, check what it says against it in code, and bound what visitors can spend.
Decision
- The record is the site's own. The assistant answers from the evidence catalogue the fit check reads: some sixty sections exported from the content the pages render, fewer than 6,000 tokens with the instructions, so the whole record goes into every prompt and nothing is retrieved or missed. It knows only what the site says, so whatever it says can be checked on the page it cites. A fact the owner wants it to know goes on the site first.
- Every fact cites its sections, and code checks each sentence. The model ends each factual sentence with the ids of the sections it comes from, in double brackets. On the server the answer passes a gate as it streams: it is cut into sentences, and a sentence is let through only when every technology or practice it names, by the lexicon's one rule (the fit check's), is one its citations or the answer's earlier ones mention; when it shares at least one word of substance with the sections it cites; and, if it cites nothing, only as a connective of six words or fewer ("Yes.", "In short, no."). Otherwise it is held back, and the visitor is told why. Nothing is let through before the answer has cited a section the record has, so an answer that cites nothing shows nothing, and a model talked out of its rules cannot write prose of its own around a real citation. Ids the record does not have are dropped. Nothing unchecked is ever shown, and the answer still streams, a sentence at a time.
- An answer policy, as a Strategy. The instructions the model reads, how a question reaches it (fenced, so that
nothing in it can close the fence), the questions refused by rule and the words for every refusal live in one
policy. Questions about pay or about private life are refused by rule, before any model is asked. A question the
record does not answer, or one that asks the model to break its rules, the model answers with
[[none]]alone, and the visitor reads the policy's words, not the model's. - The model port streams.
LanguageModelgainsstream, which hands each piece of the reply on as it comes; where a model cannot stream (a replay, the absent model) it answers whole, in one piece. The Anthropic adapter reads the Messages API's server-sent events as its documentation describes them. The decorators (metering, budget, bulkhead) share one Template Method, so each wraps a streamed call as it wraps a whole one. A reply refused, cut short or broken off is a failure that says what it was billed for, and the budget counts it: before this, such a reply cost money the budget never saw. - The fit check's guards, made shared. What visitors may spend is a package of its own,
spending: a factory makes each feature the site's model behind a budget of its own and a bulkhead outside it, and says why it is off. The assistant is off until the owner turns it on (app.assistant.enabled,ASSISTANT_PUBLICin the deploy), with a dollar a day unless set; a conversation needs a proof of work (purposeassistant); rate limits on everything. - Conversations in memory. A conversation is a random 128-bit token, sent in a request's body, never its address, and no cookie. Its questions, eight at most, and the answers let through are held in memory for thirty minutes so that a follow-up makes sense, and the last four turns go with a question; then they are forgotten, and a restart forgets them all. Nothing is written down, and nothing is logged. The token needs no signature: the server holds what it stands for, and one it does not hold is no conversation. Questions of 500 characters at most; answers of 700 tokens at most.
- Examples that are the evals. Six questions run on replies scripted to stand in for a model: three the record answers, one about pay, one it does not answer, and an attack that tells the model to claim Rust, whose reply obeys and whose sentence the gate holds back. The evals hold each to what it must come to, on the record as exported.
- A page,
/assistant/, prerendered, in the sitemap and linked from the contact section, and five operations in the public reference.
Consequences
- An answer can only be as good as the record: a question the site does not answer is refused, never guessed at. The price is recall, and the remedy is the content.
- The gate checks what a sentence names and that it draws on what it cites, not everything it says: "led a team of ten" where the record says he mentors engineers passes it, as an overstatement passes the fit check's claim check. And it holds back an honest sentence that cites nothing, such as "the site does not say how large", which the model is told not to write. The model is told never to round up, and the answer cites the sections a reader can check it against; the page says nobody reviewed it.
- A sentence can only be let through once the next has begun, so an answer streams a sentence behind the model; and a sentence before the answer's first citation waits for it.
- The rules that refuse by keyword refuse some questions they should not: "does he pay down technical debt" is refused as a question about pay. A rule that misses no question about pay is worth that.
- What visitors can spend on answers is bounded as for the fit check: the day's budget and two calls. A question costs between one and two cents at Sonnet's prices, as the whole record goes with it.
- A visitor's questions go to Anthropic, as a posting does (ADR 0007); they stay in this server's memory for thirty minutes at most.
- Startup is unchanged: the assistant and what it loads are made with the first call that needs them.