Compiled entirely from public activity on meta.discourse.org, X, and GitHub.
💬 meta.discourse.org
Sam focused on rollout and support work this week: shipping a change so “small action” posts no longer affect tracked/watched unread counts, and explaining that this should clear up phantom unread counters after deployment. He also responded to admin and integration issues, pointing people toward fixes or next steps for middleware depth errors, resource-related upgrade failures, Zulip integration PR rebasing, and future workflow/webhook capabilities in Discourse.
🐦 On social
No X activity captured this week.
🛠️ GitHub — Sam’s Commits
discourse/discourse
Sam focused on tightening Data Explorer privacy around bookmarks, fixing a leak where hidden queries could be exposed through bookmarkable records. The change hardens permission checks and adds substantial request coverage to prevent regressions, suggesting intent around security/privacy correctness rather than feature expansion.
Key commits:
ad96765— FIX: Prevent hidden Data Explorer queries leaking via bookmarks (#40327)
discourse/discourse-shared-edits
Sam worked on improving the shared-edits plugin’s initialization timing to avoid race conditions that could break extensibility. The change moves the composer service extension into a pre-initializer, suggesting the intent was to make plugin behavior more reliable during Discourse boot.
Key commits:
69d8684— FIX: move init to pre init so race conditions do not break extensibility (#162)
SamSaffron/discourse-game-compendium
Sam worked on a broad cleanup and modularization of the Discourse Game Compendium frontend, pulling autocomplete, card picking, card helpers, composer integration, and tooltip behavior out of the initializer into dedicated libraries. He also expanded asset/asset-group model support, improved styling and localization, and added request coverage for assets, suggesting the intent was to make the plugin’s card/asset experience more maintainable and polished.
Key commits:
4204428— code cleanup
SamSaffron/dotfiles
Sam spent the week simplifying his dotfiles by making the Hyprland screenshot countdown more robust and Wayland-friendly. The main change replaced a fragile Python/GTK/xrandr implementation with a lightweight Bash script that uses available notification tools (dunstify, notify-send, or hyprctl) and gracefully falls back when dependencies are missing. He also refreshed the Neovim plugin lockfile, suggesting routine maintenance alongside the dependency-reduction work.
Key commits:
a82065c— remove gdk which is a fragile dep
rubyjs/mini_racer
Sam focused on stabilizing MiniRacer’s single-threaded V8 execution path, specifically making V8 dispatch run on a reusable MiniRacer-owned native thread so Ruby-owned threads don’t trigger segfault-prone behavior. The work included native extension changes, new single-threaded tests, documentation updates, changelog notes, and a version bump—suggesting a targeted reliability fix intended for release.
Key commits:
fcfa4bf— FIX: reuse native runner across fork
🤖 Jarvis — Public Repo Work
Agent-authored public commits, typically guided by Sam during implementation work.
SamSaffron/term-llm
Over the last 7 days, Jarvis working under Sam’s direction focused on making term-llm’s job runner behave more like the main ask CLI, especially around cwd handling, skill/tool configuration, shell behavior, and parity test coverage. The work also hardened LLM integrations—particularly claude-bin prompt/environment isolation—and improved JSON event handling for ask completion hooks. On the UI side, the changes smoothed assistant stream rendering, fixed sidebar text clipping, and ensured server tools are included correctly in response runs.
Key commits:
101a282— feat(jobs): require cwd on the llm runner; drop the files toggledef807f— chore: drop SUMMARY build artifact (moved to PR description)2e269c9— test(jobs): cover job skills flag threading to SetupSkills7b71f84— docs: add SUMMARY.md for jobs llm runner parity1856398— feat(jobs): bring native llm runner to parity with ask CLI
sam-saffron-jarvis/ruby-minisql-activerecord-benchmark
In the last 7 days, Jarvis, under Sam’s direction, built out a Ruby MiniSql vs ActiveRecord benchmarking repo into a more complete performance study. The work added synthetic database setup, Docker/local runners, YJIT coverage, Sequel comparisons, and richer per-use-case benchmark outputs with CSV/JSON/SVG artifacts. The overall intent was to make the benchmark more reproducible, more representative, and easier to interpret rather than just producing a single aggregate result.
Key commits:
73ddf21— split benchmark into per-use-case resultsc33ee08— document benchmark index coverage142d895— fix benchmark chart layout0f85191— add sequel to benchmark matrixbbda59c— make benchmark runners use static database lifecycle
⤴️ GitHub — Pull Requests
16 PRs this week:
- ✅ SamSaffron/term-llm#750 (diff) — fix: config set rewrites config.yaml non-atomically and can corrupt the main con closed
- Replaced
term-llm config set’s directos.WriteFilerewrite with the existing temp-file +fsync+renameatomic write path frominternal/config. - Preserved the existing config file’s mode when replacing an existingconfig.yaml, while st…
- Replaced
- ✅ SamSaffron/term-llm#749 (diff) — fix: grep raw-output safety cap before full-line allocation closed
- replaced
runRipgrep’s raw stdout capture loop with a chunkedcaptureRipgrepOutputhelper built onbufio.Reader.ReadSlice('\n')- enforcergMaxBufferedBytesbefore assembling an entire ripgrep line in memory - keep only complete lines in the…
- replaced
- ✅ SamSaffron/term-llm#748 (diff) — fix: spawn_agent drops partial subagent output and child session ID on timeout/e closed
- Updated
SpawnAgentTool.Executeto preserverunResult.OutputandrunResult.SessionIDwhen the subagent runner returns an error. - Added a small helper so timeout, cancellation, max-turns, and generic execution-failure responses keep the existi…
- Updated
- ✅ SamSaffron/term-llm#751 (diff) — feat(jobs): bring native llm runner to parity with ask (model, cwd, tools, files closed
⚠️ Revised after review (commit
101a2821) > > Two changes from the original proposal below: > > 1.cwdis now REQUIRED forllmjobs (validated injobsV2LLMRunner.Run> before execution). Anllmjob must declare where its file/s… - ✅ SamSaffron/term-llm#752 (diff) — fix: cancel standalone web interrupts on fallback closed
Fix interrupt classification fallback so standalone replacement prompts sent while a web stream is active cancel the stale run instead of being injected into it. Tiny repros I used: - Session #2378 had the bad shape: Sam asked
kanazawa vs kyoto, bu… - ✅ SamSaffron/term-llm#746 (diff) — fix: Telegram restart carryover loads and converts the entire prior session just closed
- Reworked Telegram carryover restore to page backward from the end of the prior session instead of calling
GetMessages(..., 0, 0)and materializing the full transcript. - Added a reverse-order session-store read path (GetMessagesPageDescending) …
- Reworked Telegram carryover restore to page backward from the end of the prior session instead of calling
- ✅ SamSaffron/term-llm#745 (diff) — fix: Config saves are non-atomic and can corrupt config.yaml on interruption closed
- replaced the direct
os.WriteFilecalls used by config saves ininternal/config/config.gowith a smallwriteFileAtomicallyhelper - the helper writes to a temp file in the same directory,fsyncs it, applies the expected mode, and then atomic…
- replaced the direct
- ✅ SamSaffron/term-llm#744 (diff) — fix: Responses continuations do a full session DB scan before checking in-memory closed
- Updated
populateResponsesToolResultNamesto consultruntime.snapshotHistory()before touching the session store. - Only fall back tos.store.GetMessages(...)when some tool-call IDs are still unresolved after checking in-memory history. - Whe…
- Updated
- ✅ SamSaffron/term-llm#732 (diff) — fix: Crash recovery requeues already-started jobs and can rerun side effects aft closed
- Changed
jobsV2Manager.recoverRuns()so startup recovery no longer rewritesclaimedandrunningruns back toqueued. - Recovery now: - keepsqueuedruns untouched, - convertscancel_requestedruns tocancelled, and - marks abando…
- Changed
- ✅ SamSaffron/term-llm#734 (diff) — fix: Web/API sessions never persist user_turns, leaving serve-created session st closed
- fixed
cmd/serve_runtime.goso serve/web/API snapshot persistence now derives the exactuser_turnscount from the snapshot and persists it alongside any summary update - fixed incremental serve/web/API message appends so persisted user messages …
- fixed
- ✅ SamSaffron/term-llm#733 (diff) — fix: Crash recovery requeues already-started jobs, so restarts can duplicate sid closed
- Changed
jobsV2Manager.recoverRuns()so crash recovery no longer rewritesclaimedandrunningruns back toqueued. - Recovery now: - leaves existingqueuedruns alone, - convertscancel_requestedruns tocancelled, and - marks in…
- Changed
- ✅ SamSaffron/term-llm#731 (diff) — fix(tui): resolve symlinks on approved dirs in IsPathApproved closed
IsPathApproved canonicalised the file path with EvalSymlinks but only ran filepath.Abs on each approved directory. When the two sides differ through a symlink, the prefix check fails and the file is treated as unapproved. In practice this breaks per…
- ✅ SamSaffron/term-llm#725 (diff) — fix: Unlocked session metadata reads race with live serve runtime updates closed
- Wrapped
serveRuntime.SessionNumber()inrt.muso session-number reads follow the same lock discipline as live runtime writes tort.sessionMeta. - UpdatedsetSessionNumberHeaderto read viaSessionNumber()instead of dereferencing `rt.sess…
- Wrapped
- ✅ SamSaffron/term-llm#726 (diff) — fix: Widget shutdown only kills the parent PID and leaks child processes closed
- Start widget subprocesses with
exec.CommandContext(..., context.Background(), ...)plusprocutil.ConfigureCommandProcessGroup(cmd)so each widget runs in its own process group. - On widget startup timeout, kill the whole process group instead o…
- Start widget subprocesses with
- ✅ SamSaffron/term-llm#727 (diff) — fix: Failed jobs cleanup attempts are recorded as successful and skipped for a f closed
- updated
maybeRunCleanup()to recordlastCleanupCompletedonly afterpruneOldData()succeeds - preserved the existing cleanup interval semantics by storing the cleanup start time on success - added a regression test that forces cleanup to fail…
- updated
- ✅ discourse/discourse#40327 (diff) — FIX: Prevent hidden Data Explorer queries leaking via bookmarks merged
Bookmark list and ICS feed responses included the name and description of Data Explorer queries even when the underlying query was hidden or its query group association had been removed. Tighten
QueryGroupBookmarkable.can_see_bookmarkable?so non-a…
🐛 GitHub — Issues
No issue activity this week.
👀 GitHub — Reviews
1 reviews this week:
- rubyjs/mini_racer#418 — FEATURE: add Context#perform_microtask_checkpoint approved