redb.Route.Llm 3.1.1 — per-message audit fields for LLM compliance / replay Redb.Route.Llm 3.1.1 adds seven nullable audit fields to every persisted message, capturing effective sampling parameters, a SHA-256 hash of the tool set, and the provider's system fingerprint for compliance and replay purposes. The update records temperature, max tokens, top-p values, tool set hash, and provider fingerprint on assistant rows, plus prompt template name and version on every run. Bit-exact replay remains limited to self-hosted models, while closed providers receive best-effort logging of model ID, parameters, tool set hash, and prompt template. When an auditor asks "reproduce this exact answer" six months later, you need more than messages, model . You need the sampling parameters that were actually applied, the prompt template version, the tool set the model saw, and ideally the provider's backend fingerprint — because closed-source providers silently re-release weights. Just shipped this in redb.Route.Llm 3.1.1: 7 nullable audit fields on every persisted message. Set on assistant rows: Temperature, MaxTokens, TopP — effective values request override → factory default ToolSetHash — SHA-256 of canonical {name, description, InputSchema} set, sorted by name. Tool added/renamed/schema-changed → hash changes ProviderSystemFingerprint — system fingerprint from the response OpenAI / xAI / Together echo it; Anthropic / Gemini-compat / Ollama leave it null Set on every row of the run: PromptTemplateName, PromptTemplateVersion — when the caller used a managed template Honest limitation: bit-exact replay is only possible with self-hosted Ollama / vLLM / llama.cpp . Anthropic doesn't expose a fingerprint, OpenAI rotates them silently. For closed providers we record model id, params, tool set hash, prompt template and label it best-effort. Zero migration. REDB stores props schemalessly — added 7 fields to the C class, redeployed, done. No ALTER TABLE, no version bump on the storage layer. Code & details: CHANGELOG.md → 3.1.1 — section per-message audit fields on MessageProps. Triggered by feedback from a compliance auditor on Habr — turns out "we log conversations" doesn't cut it when the courtroom asks which exact prompt drove this.