Compiled entirely from public activity on meta.discourse.org, X, and GitHub.
💬 meta.discourse.org
No summary available.
🐦 On social
No X activity captured this week.
🛠️ GitHub — Sam’s Commits
samsaffron/term-llm
Key commits:
dde6f98— fix(contain): keep claude token in env5e2dc44— feat(contain): improve claude token setup6d43d0c— feat(contain): add claude-bin token support9bf5ca3— remove stray file7985107— All was moved into term-llm contain
discourse/discourse
Key commits:
adbb23f— FEATURE: Add category definition filters and AI filterTopics binding (#39478)d981b28— DEV: add a couple of notification types for suggested edits (#39441)83bed59— PERF: speed up chat channel and thread unread queries (#39398)e9a48a2— FIX: pass app events to notification items (#39438)3a45cd9— FIX: GETpreviewperforms state changes and can publish artifacts even when sharing is denied (#38224)
discourse/dv
Key commits:
783e6e9— fix(discourse): clobber assets on branch switch36608b4— feat(plugin): add plugin bootstrap commands
SamSaffron/dotfiles
Key commits:
71316c5— updates
🤖 Jarvis — Public Repo Work
Agent-authored public commits, typically guided by Sam during implementation work.
SamSaffron/term-llm
Key commits:
5ba0741— fix(serve): cancel active SSE streams on shutdown to prevent SIGTERM hang88e546b— fix: respect OLLAMA_HOST env var in Ollama provider when no base_url configured2cd7cb0— feat: add native Ollama chat provider with think/options support1f7eeae— docker: run jobs service with yolof5c019f— fix: treat io.ErrUnexpectedEOF as soft EOF in readSSELine
sam-saffron-jarvis/go-bench
Key commits:
199a8ec— Add remaining ChatGPT vague bench resultsc9c1e22— Add judged 9x9 vague bench and initial ChatGPT results
⤴️ GitHub — Pull Requests
20 PRs this week:
- ✅ SamSaffron/term-llm#442 (diff) — fix: use errors.Is for EOF checks in readSSELine to handle wrapped errors closed
Use
errors.Is()instead of==when checking forio.EOFandio.ErrUnexpectedEOFinreadSSELine(internal/llm/openai_compat.go). Go’snet/httpchunked transfer decoder can returnio.ErrUnexpectedEOFwrapped inside another error (e.g. vi… - ✅ SamSaffron/term-llm#445 (diff) — fix: use 127.0.0.1 instead of localhost for Ollama default URL closed
Replace
http://localhost:11434withhttp://127.0.0.1:11434as the default Ollama base URL in three places: -internal/llm/ollama.go—ollamaChatDefaultBaseURLconstant -internal/config/config.go— default value forembed.ollama.base_url… - ✅ SamSaffron/term-llm#448 (diff) — fix: OpenAI-compatible SSE parser treats malformed/truncated final chunks as suc closed
- treat invalid JSON
data:chunks in the OpenAI-compatible chat/completions SSE stream as terminal errors instead of skipping or breaking successfully - add a regression test covering a malformed final chunk after partial tool-call state has been a…
- treat invalid JSON
- ✅ SamSaffron/term-llm#449 (diff) — fix: Responses API streams can silently execute truncated or malformed tool call closed
- fail Responses API streaming as soon as a recognized SSE event cannot be decoded - fail the stream if it ends with unfinished tool calls instead of synthesizing fallback IDs/
{}arguments from partial state - add regression coverage for malformed …
- fail Responses API streaming as soon as a recognized SSE event cannot be decoded - fail the stream if it ends with unfinished tool calls instead of synthesizing fallback IDs/
- ✅ SamSaffron/term-llm#450 (diff) — fix: Responses API stream corruption can silently synthesize bogus tool calls closed
- fail the Responses API stream when tool-call SSE events cannot be decoded instead of silently skipping them - validate accumulated streamed tool calls before emitting them so incomplete, missing-ID, missing-arguments, or invalid-JSON calls do not g…
- ✅ SamSaffron/term-llm#451 (diff) — fix: Inline image uploads bypass the configured max attachment size limit closed
Reject inline image uploads when saving the original attachment fails, instead of logging and continuing. Added a regression test covering oversized inline images that exceed the configured per-file attachment limit. Inline native image parts were st…
- 🟢 discourse/discourse-kanban#36 (diff) — FEATURE: Add recency sort option for kanban columns opened
Introduces a per-column “default sort” setting with two modes: priority (existing position-based ordering) and recency (most recently updated first). Recency columns auto-sort cards by a new column_changed_at timestamp combined with topic bumped_at o…
- ✅ discourse/discourse#39478 (diff) — FEATURE: Add category definition filters and AI filterTopics binding merged
Adds
in:category-definitionandin:not-category-definitionoperators to the topics filter query syntax, letting callers include or exclude category about/definition topics. Exposes a newdiscourse.filterTopicsbinding in the discourse-ai tool r… - ✅ SamSaffron/term-llm#438 (diff) — fix: synchronous tool execution can panic and crash the entire server closed
Add panic recovery to the synchronous tool execution path in
handleSyncToolExecutionso panicking tools are converted into normal tool errors instead of crashing the stream goroutine/process. Also add a regression test covering a panicking synchron… - ✅ SamSaffron/term-llm#435 (diff) — fix: read_url redirect probing is vulnerable to DNS-rebinding SSRF closed
Pin redirect-probe connections in
read_urlto the already-validated IPs so the HTTP client does not perform a fresh DNS lookup at connect time. Also add a focused test covering the pinned dial behavior.normalizeReadURLTargetvalidated that each … - ✅ SamSaffron/term-llm#440 (diff) — fix: don’t retry on connection refused errors closed
Remove
"connection refused"from the list of retryable error strings inisRetryable(internal/llm/retry.go). When a local LLM provider (e.g.Qwen36localathttp://127.0.0.1:8001) is not running, the HTTP client returns a `connect: connectio… - ✅ SamSaffron/term-llm#432 (diff) — fix: Session pre-persistence reads runtime state without locking, causing real r closed
- snapshot the runtime fields used by
ensureSessionInStoreonly whilert.muis available - avoid readingsessionMetaand related runtime config directly when another run is active - fall back to store lookup when the runtime is busy, and add a …
- snapshot the runtime fields used by
- ✅ SamSaffron/term-llm#431 (diff) — fix: Anthropic mixed user/tool-result messages are reordered incorrectly when pa closed
Fix Anthropic user-message parsing so mixed text/tool_result content preserves the original block order. When a user message contains interleaved normal content and
tool_resultblocks, the parser now flushes contiguous runs into separateuserand… - ✅ SamSaffron/term-llm#428 (diff) — fix: Resetting a conversation leaves stale interjections and queued dynamic tool closed
Clear pending interjections and queued dynamic tool specs in
Engine.ResetConversation()so/clearand/newfully reset conversation-local engine state. Without clearing those queues, a fresh conversation can inherit a stale queued user interjec… - ✅ SamSaffron/term-llm#430 (diff) — fix: Oversized base64 attachments are fully decoded before size checks, enabling closed
- reject oversized base64 attachments before any full decode by checking decoded size from the base64 payload length - stream attachment decoding directly to disk in
saveUploadedFileinstead of allocating the entire decoded blob in memory first - a…
- reject oversized base64 attachments before any full decode by checking decoded size from the base64 payload length - stream attachment decoding directly to disk in
- ✅ SamSaffron/term-llm#426 (diff) — fix(web): persist streamed tool calls immediately closed
Persist streamed assistant tool calls in the web runtime as soon as
EventToolCallarrives instead of waiting for response/turn callbacks. Concretely this adds a provisional pending assistant message during streaming and snapshots it to the session … - ✅ SamSaffron/term-llm#425 (diff) — fix: recover stalled claude-bin tool turns and persist streamed tool calls closed
Fix two related failure modes behind session 1751: 1.
claude-binnow replays dangling Claude Codetool_useblocks when no MCP callback arrives, so malformed calls likemcp__term-llmstill produce a normal tool error and the outer loop resumes. … - ✅ SamSaffron/term-llm#423 (diff) — fix: Remote image_url inputs are silently discarded instead of being processed o closed
- reject non-
data:image_urlparts inparseUserMessageContentinstead of silently skipping them - keep the existing behavior for inline data URLs - add a regression test covering remoteimage_urlinputs Remotehttp/httpsimage URLs were p…
- reject non-
- ✅ SamSaffron/term-llm#421 (diff) — fix: OpenAI-compatible backends mis-handle trailing developer messages as user t closed
Preserve developer-role message ordering in
buildCompatMessages()for OpenAI-compatible backends. When a buffered developer message is not immediately followed by a user turn, the code now flushes it as a syntheticsystemmessage instead of delay… - ✅ SamSaffron/term-llm#420 (diff) — fix: previous_response_id continuations drop newly-added developer/system input closed
Preserve newly-added developer/system-style input items when trimming input for
previous_response_idcontinuations in the Responses client.filterToNewInput()previously started continuations at the latest user message, or at trailing `function_c…
🐛 GitHub — Issues
No issue activity this week.
👀 GitHub — Reviews
2 reviews this week:
- discourse/discourse#39518 — DEV: Increase job interval for localization approved
- discourse/discourse#39446 — DEV: Migrate default database first in multisite:migrate approved