Compiled entirely from public activity on meta.discourse.org, X, and GitHub.
💬 meta.discourse.org
Sam was mainly triaging regressions and edge cases around unread tracking, including duplicate reports where unread counts and unread-thread lists disagreed. He also clarified behavior changes for small post actions, investigated plugin initialization concerns around suggested edits, and handled a site-move-related onebox/rebake issue affecting chat thumbnail discussion.
🐦 On social
No X activity captured this week.
🛠️ GitHub — Sam’s Commits
samsaffron/term-llm
Sam focused heavily on making term-llm more reliable for long-running, stateful agent sessions: compaction-aware session history, persisted tail hints, safer session state updates, and keeping serve/agent model history in sync. He also expanded provider/model intelligence with Copilot billing usage, provider-aware reasoning metadata, Venice inline “think” parsing, and model metadata caching. On the UX side, he improved chat/TUI controls such as effort cycling, deferred effort switches during streaming, help shortcuts, serve UI session tail loading, responsive provider chips, and immediate auto-scroll, while tightening tool/runtime behavior around containers, MCP cleanup, grep limits, image viewing, WebRTC bounds, and callback failure handling.
Key commits:
50e59be— fix(tui): defer effort switches during streaminge63153a— fix(session): persist compaction tail hints298ec85— fix(session): bound git and data channel workcd6ae12— fix(tools): remove exact image crop support6aef552— fix(session): avoid clobbering persisted session state
discourse/discourse
Sam focused on making post filtering a reusable core capability and wiring it into workflows, moving substantial filtering logic out of Discourse AI and into lib/posts_filter.rb. This enabled richer workflow nodes around posts/topics, autocomplete/filter-query support, and better serialization/execution behavior, with broad test coverage added across core and plugins. A follow-up fix tightened autocomplete behavior for the “list post” workflow node.
Key commits:
bf4614f— FIX: workflows - fix autocomplete for list post node (#40597)0bad05d— DEV: Extract reusable PostsFilter into core (#40436)
discourse/discourse-kanban
Sam focused on improving the Kanban plugin’s keyboard shortcut UX: first making Kanban shortcuts appear correctly in Discourse’s global ? help modal, with proper i18n namespacing and acceptance test coverage. He then tightened that help surface to avoid overwhelming users, collapsing/removing trivial entries so the modal highlights only the most useful Kanban navigation and card-moving shortcuts.
Key commits:
6d81d3b— UX: avoid shortcut overload8796b41— FIX: Show kanban shortcuts in the keyboard shortcuts help modal
discourse/dv
Sam focused on expanding dv’s AI and agent configuration capabilities, adding configurable BYO agents, Venice AI provider support, and a new file-based AI config mode with substantial tests. He also improved theme workflow support by adding install and PR handling, and tightened local proxy behavior around container port labels. Overall, the week looks like a push to make dv more flexible for AI-assisted development setups and smoother for Discourse theme/plugin workflows.
Key commits:
76f420a— feat(config): add AI file config mode7567810— feat(theme): add theme install and PR supportdc91343— feat(ai): add Venice AI provider support8ca5970— fix(localproxy): honor container port label206b834— feat(cli): support configurable BYO agents
discourse/discourse-mermaid-theme-component
Sam focused on maintenance and dependency freshness for the Mermaid theme component, updating the vendored Mermaid library from 11.12.2 to 11.15.0 and adding supporting automation/docs for future Mermaid updates. He also refreshed Ruby/Node dependency locks, keeping the component aligned with current upstream packages rather than shipping user-facing feature changes.
Key commits:
discourse/discourse-suggested-edits
Sam Saffron worked on improving the initialization flow for the suggested-edits plugin, moving composer setup work from a regular initializer into a pre-initializer. The intent appears to be making the plugin’s composer integration load earlier and more reliably, with a focused refactor rather than new feature work.
Key commits:
00194a4— FIX: move init work to pre-initializer
🤖 Jarvis — Public Repo Work
Agent-authored public commits, typically guided by Sam during implementation work.
SamSaffron/term-llm
Sam-directed Jarvis work in term-llm focused on smoothing the web UI experience around session loading, sidebar behavior, and message persistence. The changes made active sidebar sessions feel more stable by preserving cached messages, preventing unwanted scroll jumps, and keeping loading sessions visually blank until data is ready. There was also backend/runtime work to persist web input before the first stream event, reducing the chance of losing user text during early streaming startup.
Key commits:
86fb19f— fix: keep active sidebar session messages cached (#764)9838ef2— fix: keep web sidebar scroll stable (#763)268bbdb— fix: keep loading sessions blank in web UI (#761)efe3583— persist web input before first stream event (#760)
⤴️ GitHub — Pull Requests
9 PRs this week:
- ✅ SamSaffron/term-llm#770 (diff) — fix: WebRTC data-channel requests spawn unbounded handler goroutines closed
- Bounded WebRTC data-channel request handling to a fixed per-channel concurrency limit instead of spawning an unbounded goroutine for every incoming frame. - Added a request-slot gate in
runDataChannel()so once the per-channel limit is reached, t…
- Bounded WebRTC data-channel request handling to a fixed per-channel concurrency limit instead of spawning an unbounded goroutine for every incoming frame. - Added a request-slot gate in
- ✅ SamSaffron/term-llm#772 (diff) — fix: Prompt-template git probes can hang session startup because they use uncanc closed
- Added a shared
runGitOutputhelper ininternal/agents/template.gothat runs git probes withexec.CommandContextand a shortgitProbeTimeout. - RoutedgetGitInfo,getGitDiffStat, andfindGitRootthrough that timeout-bound helper. - Add…
- Added a shared
- ✅ SamSaffron/term-llm#771 (diff) — fix: Compaction-tail detection does quadratic work every time a compacted sessio closed
- Precompute display fingerprints once per
markCompactionDisplayTails()call instead of rebuilding them inside every duplicate-tail check. - Replace the length=1..N overlap search incompactionDuplicateTailRange()with a single prefix-function sc…
- Precompute display fingerprints once per
- ✅ discourse/discourse#40597 (diff) — FIX: workflows - fix autocomplete for list post node merged
Move post_type, status, and order value suggestions into server-supplied option entries so clients can show translated enum choices directly. Add translations for the new enum labels and update specs to cover the new option format.
- ✅ SamSaffron/term-llm#762 (diff) — fix: Every shell/custom-tool run scans all of /proc to reap descendants, adding closed
- Added a
sweepTaggedDescendantsOnSuccesspolicy knob toprepareToolCommand. - The shell tool now only keeps the old always-scan behavior for commands that actually use shell operators (&, pipes, redirects, subshells, etc.). - Simple foreground…
- Added a
- ✅ SamSaffron/term-llm#766 (diff) — fix: session Update clobbers user_turns from stale in-memory structs closed
- Removed
user_turnsfromSQLiteStore.Updateso metadata-only updates no longer write a caller-supplied turn count back intosessions. - Updated the method comment to treatuser_turnslike the other counters that must be mutated through atomi…
- Removed
- ✅ SamSaffron/term-llm#768 (diff) — fix: Concurrent Telegram session creation persists orphan sessions and can clobb closed
- Stopped
telegramSessionMgr.newSessionfrom eagerly persisting a Telegram session before it has actually won publication inm.sessions. - Added a smallpersistSessionhelper and now call it only after the session has been installed as the acti…
- Stopped
- ✅ SamSaffron/term-llm#767 (diff) — fix: Telegram stream watchdog can leak a blocked Recv goroutine on timeout/error closed
- Added a
sendStreamDonehelper guarded bysync.Onceso the Telegram stream watchdog and stream consumer can only publish one terminal result tostreamDone. - Switched the watchdog timeout path,RecvEOF/error path, andEventErrorpath to u…
- Added a
- ✅ SamSaffron/term-llm#765 (diff) — fix: ask persists every assistant turn twice because both engine callbacks appen closed
- Fixed
cmd/ask.goso the assistant message captured bySetResponseCompletedCallbackis not appended again whenSetTurnCompletedCallbackreceives the same assistant message as the first turn message. - Applied the same dedupe rule to `outputToo…
- Fixed
🐛 GitHub — Issues
No issue activity this week.
👀 GitHub — Reviews
No reviews this week.