This Week in gptme (W41 2026)
Here's what landed in gptme and gptme-contrib this week (2026-10-05 – 2026-10-11): 12 new features, 78 bug fixes across 113 merged PRs.
Here’s what landed in gptme and gptme-contrib this week (2026-10-05 – 2026-10-11): 12 new features, 78 bug fixes across 113 merged PRs.
Highlights
- gptme#4218 (webui) expose server-owned global MCP settings
- gptme-contrib#1859 (sessions) persist attributed git summaries
- gptme-contrib#1861 (sessions) publish typed export feed with authoritative run types
- gptme#4174 (compaction) remind normal tool loop before context budget
- gptme#4205 (util) add
gptme-util soundto play notification sounds from other harnesses
From the Blog
- The Browser Path Selected the Wrong Engine
- The Quickstart Started Inside the Checkout
- The Stream Failed Successfully
- Agents in the Discovery Loop
- Black box to flight recorder: diagnosing autonomous agent stalls with resource pressure
- The Project Name Was a TOML Injection
- What the Trajectory Tells You
- Anti-Slop Em-Dash Scoring Was Truncating Short Texts
- Loading an MCP server shouldn’t require a full reconnect to register its tools
- OpenAI Responses API Rejects Orphaned Tool Outputs
- When Agent Instructions Backfire: Using LOO Analysis to Measure What Actually Helps
- Lock Once at the Boundary
- LXC for AI Agents: What Docker Gets Wrong for Long-Running Workloads
- Twenty-Five Locks Per Test Run
New Features
- gptme#4174 (compaction) remind normal tool loop before context budget
- gptme#4205 (util) add
gptme-util soundto play notification sounds from other harnesses - gptme#4218 (webui) expose server-owned global MCP settings
- gptme#4223 (compaction) run checkpoint through normal tool loop
- gptme#4224 (compaction) make dropped tool results recallable
- gptme#4229 (models) register Mistral Large 4
- gptme-contrib#1846 (skills) add html-artifact-qa skill — interactive HTML artifacts for complex Q&A
- gptme-contrib#1850 (rag) add bm25_min_z override to score_lessons
- gptme-contrib#1851 (gptmail) append send-audit comment to sent files; add allowlist-bypass tests
- gptme-contrib#1859 (sessions) persist attributed git summaries
- gptme-contrib#1861 (sessions) publish typed export feed with authoritative run types
- gptme-contrib#1865 (gptme-usage) register claude-haiku-5-5 in CC_MODEL_IDS
Bug Fixes
- gptme#4123 (compaction) share bounded overflow recovery across CLI and server
- gptme#4125 (anthropic) register Claude 5 models and use supported thinking modes
- gptme#4126 (telemetry) use Fable 5.1 cached-input pricing
- gptme#4148 (webui) gate sidebar external-sessions query on server capability
- gptme#4149 (webui) anchor toasts at the top so they never cover the composer
- gptme#4151 (telemetry) account for explicit OpenRouter cache-read prices
- gptme#4166 (openai-subscription) clamp Codex instructions to 1MB char cap
- gptme#4168 (browser) configure executable independently of engine
- gptme#4170 (responses) surface explicit SSE generation failures
- gptme#4171 (llm) accept mixed-case image attachment extensions
- gptme#4172 (compaction) reject empty summarize checkpoints
- gptme#4173 (init) report invalid gptme-init targets as clean errors
- gptme#4175 (init) escape project name when writing gptme.toml
- gptme#4176 (cli) clean errors for non-UTF-8 input files (tokens count, attest verify, capabilities)
- gptme#4177 (cli) tolerate non-UTF-8 .gitignore and journal files in context commands
- gptme#4178 (hooks) reject malformed Claude Code settings.json instead of crashing
- gptme#4179 (config) reject non-list prompt.files and other string-list project settings
- gptme#4180 (preview) send Cache-Control private, no-store on preview responses
- gptme#4181 (lessons) coerce non-string frontmatter name to str
- gptme#4182 (logmanager) skip corrupt conversation lines instead of failing the whole read
- gptme#4183 (compaction) re-compaction carries the previous checkpoint and drops stale intros
- gptme#4184 (cli) reject unknown –provider in models list instead of listing nothing
- gptme#4185 (context) skip unreadable files in prompt path inclusion instead of crashing
- gptme#4187 (context) read only the capped prefix of large files named in a prompt
- gptme#4189 (agents) don’t attribute the newest log dir to unnamed gptme processes
- gptme#4190 (save) refuse non-regular-file targets instead of hanging on a FIFO
- gptme#4191 (read) stream line ranges of large files instead of loading them whole
- gptme#4192 (chats) skip malformed external sessions instead of aborting the search
- gptme#4195 (anti-slop) use fractional em-dash excess so short texts aren’t over-penalised
- gptme#4196 (tokens) warn when model has no native tiktoken encoding
- gptme#4197 (message) don’t append ellipsis to short oneline messages
- gptme#4198 (chats) reject blank and normalize multi-line names in chats rename
- gptme#4202 (ci) disable provenance attestation on Docker push to fix GHCR unknown blob
- gptme#4203 (computer) audit-log sees keyword/positional computer() calls via AST
- gptme#4206 (openai-responses) clamp instructions to 1MB char cap for Responses API
- gptme#4207 (openai-responses) drop orphaned tool results with no preceding call
- gptme#4208 (subagent) cap thread-mode subagent LLM request timeout by remaining deadline
- gptme#4209 (webui) navigate before clearing store on conversation delete
- gptme#4210 (models-info) exit 1 when model resolves to unknown provider
- gptme#4211 (slop) lower STACCATO_MAX_WORDS 8→7 to fix false positive on technical doc sentences
- gptme#4215 (mcp) load_mcp_server now registers ToolSpecs and updates cache
- gptme#4220 (cli) keep plugin subcommand args opaque to gptme’s own options
- gptme#4221 (anthropic) pass an explicit timeout so non-streaming chat() accepts 64k+ max_tokens
- gptme#4222 (llm) reject an exhausted stream with no output instead of persisting an empty assistant turn
- gptme#4231 (ci) retry apt-get update up to 3 times with timeout
- gptme#4235 (mcp) preserve complete search queries
- gptme#4236 (compaction) reland #4224-#4226 that merged into a stacked branch
- gptme#4239 (server) reject an exhausted stream with no output instead of persisting an empty assistant turn
- gptme#4241 (test) use column check instead of substring check in test_shell_session_records_its_pgid
- gptme#4243 (server) honor TOOL_FORMAT and parse native tool calls in steps
- gptme-contrib#1838 (gptodo) share locked atomic lifecycle mutations across writers
- gptme-contrib#1839 (sessions) separate reusable labels from canonical run identity
- gptme-contrib#1840 (gptodo) make repeated subtask edits validated and atomic
- gptme-contrib#1842 (sessions) skip non-object records when parsing trajectories
- gptme-contrib#1843 (gptodo) coerce non-list dependency/tag fields instead of crashing every command
- gptme-contrib#1844 (sessions) tolerate undecodable bytes in the session store
- gptme-contrib#1845 (activity-gate) drop bot/self comment notifications on closed threads
- gptme-contrib#1847 (gptmail) handle empty-value headers; suppress X-GitHub-* context noise
- gptme-contrib#1848 (openrouter) gate availability on account balance, not just daily limit
- gptme-contrib#1852 (gptmail) exclude send-audit trailers from archive deduplication
- gptme-contrib#1853 (activity-gate) suppress repeat self-actor PR notifications
- gptme-contrib#1854 (gptodo) reject done transitions with pending checkboxes
- gptme-contrib#1855 (greptile) always confirm PR head with a live read before re-review check
- gptme-contrib#1856 (gptme-sessions) narrow _fcntl type so pyright can verify flock usage
- gptme-contrib#1857 (gptme-sessions) resolve 14 pyright/mypy type errors
- gptme-contrib#1858 (gptme-runloops) annotate model_usage as dict[str, Any] to resolve no-any-return
- gptme-contrib#1860 (pre-commit) scope typecheck-packages hook to staged changes
- gptme-contrib#1862 (codex-usage) start codex with –no-daemon, parse 12h reset times
- gptme-contrib#1863 (hooks) never run prek without –files (bare run stashes the worktree)
- gptme-contrib#1864 (repo-status) report a red workflow even when a newer different workflow passed
- gptme-contrib#1866 (sessions) keep Grok FileContent, GrepSearch, and SearchReplace results
- gptme-contrib#1867 (sessions) keep Copilot tool error text and call/result linkage
- gptme-contrib#1868 (sessions) unwrap Codex block outputs; link call ids for Codex, Pi, and Claude Code
- gptme-contrib#1870 (runloops) count own PR comment as effect for comment-deliverable PM items
- gptme-contrib#1871 (runloops) count current-head finding dispositions as effect
- gptme-contrib#1872 (daily-briefing) list blockers priority:high first, then oldest
- gptme-contrib#1873 (gptodo) enforce the initial-state contract in add
- gptme-contrib#1874 (repo-status) fall back to newest completed run when several are queued
Performance
- gptme-contrib#1822 (greptile) cache formal review reads
Refactors
- gptme#4226 (compaction) share prefix and recent-tail cut
Documentation
- gptme#4147 (citation) add Zenodo concept DOI and badge
- gptme#4216 (anti-slop) document float types and fix stale rounding comment
- gptme#4230 (mcp) add ContextVar contract to load/unload_mcp_server + copy_context regression test
- gptme#4232 add philosophy page (mission, principles, non-goals)
- gptme-contrib#1841 (readme) make contributor setup runnable from a fresh directory
- gptme-contrib#1849 (block-registry) unscoped OpenRouter file is the SHARED key, not the chain
Tests
- gptme#4200 (browser) add local blockage conformance suite
- gptme#4219 (e2e) wait for clickability before clicking wizard buttons
- gptme#4240 (server) isolate v2 API tests from the real logs dir
- gptme#4242 (llm) stub init_llm in degeneration reply() test so it runs in isolation
- gptme-contrib#1827 cover identity portability across generic package CLIs
CI & Infrastructure
- gptme#4106 (deps-dev) bump @wdio/spec-reporter from 9.27.2 to 9.32.0 in /tauri/e2e in the tauri-e2e-minor-patch group across 1 directory
- gptme#4108 (deps) bump lucide-react from 0.451.0 to 1.48.0 in /webui
- gptme#4109 (deps) bump @hookform/resolvers from 3.10.0 to 5.9.1 in /webui
- gptme#4110 (deps) bump simple-icons from 15.9.0 to 16.33.0 in /webui
- gptme#4141 (deps-dev) bump @types/chrome from 0.0.300 to 0.3.4 in /webui/extension in the webui-extension-minor-patch group across 1 directory
- gptme#4143 (deps) bump the webui-minor-patch group across 1 directory with 51 updates
- gptme#4161 (deps-dev) bump @tauri-apps/cli from 2.12.0 to 2.12.1 in /tauri in the tauri-minor-patch group
- gptme#4162 (deps) bump sanitize-html from 2.17.7 to 2.18.0 in /site/next in the site-next-minor-patch group
- gptme#4234 (docs) check gptme repo blob/tree links against git, not github.com
Chore
- gptme#4225 (anthropic) upgrade SDK for native compaction
| *113 PRs merged across 2 repos. See the full changelogs: gptme | gptme-contrib* |