Compiled entirely from public activity on meta.discourse.org, X, and GitHub.
💬 meta.discourse.org
Sam’s meta.discourse.org activity this week focused on follow-through and performance/edge-case fixes in editing workflows. He shipped a remembered fix for Discourse Shared Edits, prioritized an IME composition issue caused by word limits, and responded to long-post edit timeouts by pointing to prior work around handling overly complex diffs more gracefully.
🐦 On social
No X activity captured this week.
🛠️ GitHub — Sam’s Commits
samsaffron/term-llm
Sam Saffron spent the week hardening term-llm’s serve/web UI stack, especially session recovery, stale stream handling, routing edge cases, clipboard fallbacks, Telegram queues, and safer resume/persistence behavior. He also pushed forward hub and agent-control capabilities, adding per-session MCP controls, custom UI titles, base-path/deregister support, and more robust proxied asset/reverse-stream handling. A strong secondary theme was reliability around tools and providers: honoring retry-after headers, stabilizing shell/file tracking and approvals, preserving tool flush barriers, and improving error/status rendering with extensive test coverage.
Key commits:
8251b40— fix(serve): clear pending interjections on cancel0eadcf5— fix(tools): stabilize path and approval storage9b38446— fix(serve): harden streaming and telegram queues9ca0bf0— fix(serveui): show spawn agent routing args4507972— fix: harden persistence during resumes
discourse/discourse
Sam focused heavily on Discourse Workflows, landing a large sub-workflow/call feature with execution tracking, dependency handling, graph validation, UI updates, and broad test coverage. He also tightened security and privacy boundaries across bookmarks, click tracking, polls, and topic link metadata, addressing visibility leaks and resource-consumption risks. Smaller follow-up work included expanding post filtering to exclude topics, raising AI report/workflow limits, and updating/reverting/reapplying the mini_racer dependency.
Key commits:
35c6411— FEAT: Support excluding topics in posts filters (#41216)917adbf— DEV: bump limits for AI reports (#41214)73a990f— FEATURE: Add sub workflow call support (#41019)7f591bc— FEATURE: mini_racer gem update (#41112)df82183— SECURITY: Topic existence oracle in bookmark endpoints (#41152)
discourse/dv
Sam focused on making dv’s container removal flow more extensible and safer by adding preRemove and postRemove host hooks around container deletion. The work included wiring the hooks into the CLI, documenting them, and adding substantial test coverage for ordering, failure handling, and missing-container behavior.
Key commits:
c45c43e— feat(hooks): run hooks around container removal
discourse/discourse-shared-edits
Sam worked on making shared edits more configurable and permission-aware: sites can now choose which groups may enable or disable shared edits, rather than relying on a hardcoded staff/TL4 model. He also tightened related privileged endpoints with rate limits and expanded test coverage across guardian permissions, serializers, request specs, and acceptance flows to support the new permission model.
Key commits:
4e51a4e— FEATURE: allow shared edits to be enabled on any group (#163)
rubyjs/mini_racer
Sam focused on making mini_racer more measurable, reliable, and release-ready. He added a substantial benchmark suite, refined it with warmup support, fixed a V8 interrupt/termination edge case, then cut a new release. He also tightened code quality by adding linting and CI enforcement, applying broad cleanup across benchmarks, library code, and tests.
Key commits:
76568d3— lint and ensure stuff stays lintedda8e2b3— new releasef525168— improve bench, allow for warmup478c763— fix: avoid stale V8 termination on interrupts5f135ec— DEV: first pass of benchmark suite
discourse/safe_image
Sam focused on stabilizing and preparing safe_image for the 0.5.1 release, with a major refactor of the native/Vips path to route work through a helper and simplify the operation pipeline. He also cleaned up internal abstractions, improved metadata/transform handling, and tightened tests around native helper behavior and optimizer support. A significant thread was CI/release hardening: fixing workflow issues, sourcing oxipng, adding extconf coverage, and updating changelogs/versioning for release readiness.
Key commits:
18bc7a1— 0.5.1 (#2)6ff518f— version bump63a61d8— try to fix CI5bbf729— try to get oxipng from elsewhere190a0cd— code cleanup
SamSaffron/dotfiles
Sam focused on tightening his desktop/dev-environment dotfiles: fixing Waybar workspace behavior and ordering, updating Hyprland helper scripts toward Lua-based workflows, and refreshing Neovim plugin locks. The biggest theme was adding dv-hooks support for Discourse developer containers, including term-llm hub service installation, config sync, hook environment setup, and a more minimal agent prompt. Overall, the work looks aimed at making his local Discourse/agent development setup more automated, reliable, and ergonomic.
Key commits:
5d506c7— sorting by id is not what we want :)e2b7f8a— add title which was missinga8ec698— more minimal promptf3ab36c— add dv hooksb1d23c0— fix format
🤖 Jarvis — Public Repo Work
Agent-authored public commits, typically guided by Sam during implementation work.
SamSaffron/term-llm
In the last 7 days, Sam-directed Jarvis work focused on making term-llm’s web/session experience more reliable and informative: fixing response-stream gaps, preserving assistant turns when persistence fails, and improving scrollback handling across tool-only pages. It also expanded and polished the Hub UI so nodes surface session activity more clearly, with a substantial CSS/HTML refresh. A smaller thread added richer transcription support by exposing ElevenLabs timestamp data and documenting it.
Key commits:
7f65867— fix: ask response persistence lies to the engine after AddMessage fails, dropping assistant turns (#877)5b5a1c6— fix(web): repair response stream sequence gaps (#878)753c37a— fix: drain scrollback across tool-only pages (#870)1ed479c— polish hub quiet card UI (#862)08741df— feat: surface sessions on Hub nodes (#861)
⤴️ GitHub — Pull Requests
13 PRs this week:
- ✅ SamSaffron/term-llm#871 (diff) — fix: Response completion uses an unbounded context for durable-ID lookup and can closed
- replaced the unbounded
context.Background()durable response-id lookup on the response completion path with a short best-effort lookup that usescontext.WithTimeout(context.WithoutCancel(runCtx), 5*time.Second)- fall back to the ephemeral `res…
- replaced the unbounded
- ✅ SamSaffron/term-llm#874 (diff) — fix: jobs can remain permanently active if final status persistence fails after closed
- Reworked
finishRunWithRetryincmd/serve_jobs_v2.goto retry final run persistence for up to 30 seconds instead of only 3 short attempts. - Added bounded exponential backoff between retries, starting at 50ms and capping at 1s. - Stop retrying e…
- Reworked
- ✅ SamSaffron/term-llm#872 (diff) — fix: Response completion does an uncancellable session-store lookup and can leav closed
- Replaced both response-completion durable-response lookups with a bounded best-effort helper that uses
context.WithTimeout(context.WithoutCancel(ctx), 5*time.Second). - Kept existing behavior of preferring the durable response id when available, …
- Replaced both response-completion durable-response lookups with a bounded best-effort helper that uses
- ✅ SamSaffron/term-llm#875 (diff) — fix: serve HTTP server has no read/write/idle deadlines, so slow clients can pin closed
- Set
ReadHeaderTimeoutandIdleTimeouton the serve HTTP server incmd/serve.go. - Kept server-wideWriteTimeoutat zero so long-lived SSE endpoints do not get an artificial lifetime cap. - Added a smallstreamingResponseWriterwrapper tha…
- Set
- ✅ SamSaffron/term-llm#873 (diff) — fix: Telegram persistence queue backpressures the engine and can force stream wa closed
- Made the Telegram callback persistence queue fail fast instead of blocking the engine callback path when its 128-slot buffer is saturated. - Marked the queue as degraded on saturation/cancellation, stopped draining the remaining buffered callback w…
- 🟢 discourse/discourse#41237 (diff) — FEATURE: retry transient and rate-limited LLM completion requests opened
Adds automatic retries to the completions endpoint base so transient failures no longer surface immediately to callers. Rate limits (429) get their own backoff budget honoring Retry-After (capped at 60s), while 408/409/5xx and network errors (timeout…
- ✅ SamSaffron/term-llm#866 (diff) — fix: Telegram store-op queue stops serializing writes during close, so interrupt closed
- Stopped
telegramStoreOpQueue.enqueuefrom bypassing the queue once close begins. - If the queue is already closing orclosedChfires while an enqueue is blocked, the op now returns instead of callingrunStoreOpWithoutCancel(...)inline. - C…
- Stopped
- 🟢 discourse/discourse#41217 (diff) — FEAT: Add workflow canvas clipboard opened
Support cut, copy, and paste for workflow canvas selections, including nodes, connections, and sticky notes. Serialize selections to the system clipboard with an in-window fallback so workflows can be duplicated from keyboard shortcuts or the context…
- ✅ discourse/discourse#41216 (diff) — FEAT: Support excluding topics in posts filters merged
Allow posts filter queries to use -topic: to omit posts from one or more topic IDs. Expose the prefix in filter options and cover the behavior in posts filter and workflow specs.
- ✅ discourse/safe_image#2 (diff) — 0.5.1 opened
- fix(build): tolerate missing libvips helper - Update changlog
- ✅ SamSaffron/term-llm#864 (diff) — fix: Resuming a large session eagerly loads the entire transcript before first p closed
- Added
session.LoadInitialScrollbackWithBoundary, which resumes compacted sessions by loading only the persisted post-compaction tail viaGetMessagesFrom(...)instead of callingGetMessages(..., 0, 0)up front. - Kept the existing full `LoadSc…
- Added
- ✅ SamSaffron/term-llm#865 (diff) — fix: ChatGPT OAuth credential refresh overwrites the credential file in place, s closed
- replaced in-place credential writes in
internal/credentials/chatgpt.gowith an atomic temp-file-and-rename helper - reused the same helper forinternal/credentials/copilot.go, which had the same persisted-state corruption risk - added tests tha…
- replaced in-place credential writes in
- ✅ SamSaffron/term-llm#867 (diff) — fix: Telegram store-op queue deliberately runs fallback writes concurrently with closed
- Removed the Telegram store-op queue shutdown fallback that executed blocked or post-close store writes inline instead of through the per-session queue. - Kept in-flight enqueues blocked on the queue until space is available so they still run in FIF…
🐛 GitHub — Issues
No issue activity this week.
👀 GitHub — Reviews
1 reviews this week:
- discourse/discourse#41123 — FEATURE: Localizable /about page fields via its settings page commented