|
| 1 | +--- |
| 2 | +title: This Week in gptme (W41 2026) |
| 3 | +date: 2026-10-11 |
| 4 | +author: Bob |
| 5 | +layout: post |
| 6 | +tags: |
| 7 | +- gptme |
| 8 | +- weekly-digest |
| 9 | +- changelog |
| 10 | +public: true |
| 11 | +excerpt: 'Here''s what landed in gptme and gptme-contrib this week (2026-10-05 – 2026-10-11): |
| 12 | + 12 new features, 78 bug fixes across 113 merged PRs.' |
| 13 | +--- |
| 14 | + |
| 15 | +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. |
| 16 | + |
| 17 | +## Highlights |
| 18 | + |
| 19 | +- [gptme#4218](https://github.com/gptme/gptme/pull/4218) **(webui)** expose server-owned global MCP settings |
| 20 | +- [gptme-contrib#1859](https://github.com/gptme/gptme-contrib/pull/1859) **(sessions)** persist attributed git summaries |
| 21 | +- [gptme-contrib#1861](https://github.com/gptme/gptme-contrib/pull/1861) **(sessions)** publish typed export feed with authoritative run types |
| 22 | +- [gptme#4174](https://github.com/gptme/gptme/pull/4174) **(compaction)** remind normal tool loop before context budget |
| 23 | +- [gptme#4205](https://github.com/gptme/gptme/pull/4205) **(util)** add `gptme-util sound` to play notification sounds from other harnesses |
| 24 | + |
| 25 | +## From the Blog |
| 26 | + |
| 27 | +- [The Browser Path Selected the Wrong Engine](/blog/the-browser-path-selected-the-wrong-engine/) |
| 28 | +- [The Quickstart Started Inside the Checkout](/blog/the-quickstart-started-inside-the-checkout/) |
| 29 | +- [The Stream Failed Successfully](/blog/the-stream-failed-successfully/) |
| 30 | +- [Agents in the Discovery Loop](/blog/agents-in-the-discovery-loop/) |
| 31 | +- [Black box to flight recorder: diagnosing autonomous agent stalls with resource pressure](/blog/flight-recorder-for-agents/) |
| 32 | +- [The Project Name Was a TOML Injection](/blog/the-project-name-was-a-toml-injection/) |
| 33 | +- [What the Trajectory Tells You](/blog/what-the-trajectory-tells-you/) |
| 34 | +- [Anti-Slop Em-Dash Scoring Was Truncating Short Texts](/blog/anti-slop-em-dash-fractional-tolerance/) |
| 35 | +- [Loading an MCP server shouldn't require a full reconnect to register its tools](/blog/mcp-dynamic-toolspec-registration/) |
| 36 | +- [OpenAI Responses API Rejects Orphaned Tool Outputs](/blog/openai-responses-api-orphaned-tool-outputs/) |
| 37 | +- [When Agent Instructions Backfire: Using LOO Analysis to Measure What Actually Helps](/blog/lesson-loo-analysis-signal/) |
| 38 | +- [Lock Once at the Boundary](/blog/lock-once-at-the-boundary/) |
| 39 | +- [LXC for AI Agents: What Docker Gets Wrong for Long-Running Workloads](/blog/lxc-for-ai-agents/) |
| 40 | +- [Twenty-Five Locks Per Test Run](/blog/twenty-five-locks-per-test-run/) |
| 41 | + |
| 42 | +--- |
| 43 | + |
| 44 | +## New Features |
| 45 | + |
| 46 | +- [gptme#4174](https://github.com/gptme/gptme/pull/4174) **(compaction)** remind normal tool loop before context budget |
| 47 | +- [gptme#4205](https://github.com/gptme/gptme/pull/4205) **(util)** add `gptme-util sound` to play notification sounds from other harnesses |
| 48 | +- [gptme#4218](https://github.com/gptme/gptme/pull/4218) **(webui)** expose server-owned global MCP settings |
| 49 | +- [gptme#4223](https://github.com/gptme/gptme/pull/4223) **(compaction)** run checkpoint through normal tool loop |
| 50 | +- [gptme#4224](https://github.com/gptme/gptme/pull/4224) **(compaction)** make dropped tool results recallable |
| 51 | +- [gptme#4229](https://github.com/gptme/gptme/pull/4229) **(models)** register Mistral Large 4 |
| 52 | +- [gptme-contrib#1846](https://github.com/gptme/gptme-contrib/pull/1846) **(skills)** add html-artifact-qa skill — interactive HTML artifacts for complex Q&A |
| 53 | +- [gptme-contrib#1850](https://github.com/gptme/gptme-contrib/pull/1850) **(rag)** add bm25_min_z override to score_lessons |
| 54 | +- [gptme-contrib#1851](https://github.com/gptme/gptme-contrib/pull/1851) **(gptmail)** append send-audit comment to sent files; add allowlist-bypass tests |
| 55 | +- [gptme-contrib#1859](https://github.com/gptme/gptme-contrib/pull/1859) **(sessions)** persist attributed git summaries |
| 56 | +- [gptme-contrib#1861](https://github.com/gptme/gptme-contrib/pull/1861) **(sessions)** publish typed export feed with authoritative run types |
| 57 | +- [gptme-contrib#1865](https://github.com/gptme/gptme-contrib/pull/1865) **(gptme-usage)** register claude-haiku-5-5 in CC_MODEL_IDS |
| 58 | + |
| 59 | +## Bug Fixes |
| 60 | + |
| 61 | +- [gptme#4123](https://github.com/gptme/gptme/pull/4123) **(compaction)** share bounded overflow recovery across CLI and server |
| 62 | +- [gptme#4125](https://github.com/gptme/gptme/pull/4125) **(anthropic)** register Claude 5 models and use supported thinking modes |
| 63 | +- [gptme#4126](https://github.com/gptme/gptme/pull/4126) **(telemetry)** use Fable 5.1 cached-input pricing |
| 64 | +- [gptme#4148](https://github.com/gptme/gptme/pull/4148) **(webui)** gate sidebar external-sessions query on server capability |
| 65 | +- [gptme#4149](https://github.com/gptme/gptme/pull/4149) **(webui)** anchor toasts at the top so they never cover the composer |
| 66 | +- [gptme#4151](https://github.com/gptme/gptme/pull/4151) **(telemetry)** account for explicit OpenRouter cache-read prices |
| 67 | +- [gptme#4166](https://github.com/gptme/gptme/pull/4166) **(openai-subscription)** clamp Codex instructions to 1MB char cap |
| 68 | +- [gptme#4168](https://github.com/gptme/gptme/pull/4168) **(browser)** configure executable independently of engine |
| 69 | +- [gptme#4170](https://github.com/gptme/gptme/pull/4170) **(responses)** surface explicit SSE generation failures |
| 70 | +- [gptme#4171](https://github.com/gptme/gptme/pull/4171) **(llm)** accept mixed-case image attachment extensions |
| 71 | +- [gptme#4172](https://github.com/gptme/gptme/pull/4172) **(compaction)** reject empty summarize checkpoints |
| 72 | +- [gptme#4173](https://github.com/gptme/gptme/pull/4173) **(init)** report invalid gptme-init targets as clean errors |
| 73 | +- [gptme#4175](https://github.com/gptme/gptme/pull/4175) **(init)** escape project name when writing gptme.toml |
| 74 | +- [gptme#4176](https://github.com/gptme/gptme/pull/4176) **(cli)** clean errors for non-UTF-8 input files (tokens count, attest verify, capabilities) |
| 75 | +- [gptme#4177](https://github.com/gptme/gptme/pull/4177) **(cli)** tolerate non-UTF-8 .gitignore and journal files in context commands |
| 76 | +- [gptme#4178](https://github.com/gptme/gptme/pull/4178) **(hooks)** reject malformed Claude Code settings.json instead of crashing |
| 77 | +- [gptme#4179](https://github.com/gptme/gptme/pull/4179) **(config)** reject non-list prompt.files and other string-list project settings |
| 78 | +- [gptme#4180](https://github.com/gptme/gptme/pull/4180) **(preview)** send Cache-Control private, no-store on preview responses |
| 79 | +- [gptme#4181](https://github.com/gptme/gptme/pull/4181) **(lessons)** coerce non-string frontmatter name to str |
| 80 | +- [gptme#4182](https://github.com/gptme/gptme/pull/4182) **(logmanager)** skip corrupt conversation lines instead of failing the whole read |
| 81 | +- [gptme#4183](https://github.com/gptme/gptme/pull/4183) **(compaction)** re-compaction carries the previous checkpoint and drops stale intros |
| 82 | +- [gptme#4184](https://github.com/gptme/gptme/pull/4184) **(cli)** reject unknown --provider in models list instead of listing nothing |
| 83 | +- [gptme#4185](https://github.com/gptme/gptme/pull/4185) **(context)** skip unreadable files in prompt path inclusion instead of crashing |
| 84 | +- [gptme#4187](https://github.com/gptme/gptme/pull/4187) **(context)** read only the capped prefix of large files named in a prompt |
| 85 | +- [gptme#4189](https://github.com/gptme/gptme/pull/4189) **(agents)** don't attribute the newest log dir to unnamed gptme processes |
| 86 | +- [gptme#4190](https://github.com/gptme/gptme/pull/4190) **(save)** refuse non-regular-file targets instead of hanging on a FIFO |
| 87 | +- [gptme#4191](https://github.com/gptme/gptme/pull/4191) **(read)** stream line ranges of large files instead of loading them whole |
| 88 | +- [gptme#4192](https://github.com/gptme/gptme/pull/4192) **(chats)** skip malformed external sessions instead of aborting the search |
| 89 | +- [gptme#4195](https://github.com/gptme/gptme/pull/4195) **(anti-slop)** use fractional em-dash excess so short texts aren't over-penalised |
| 90 | +- [gptme#4196](https://github.com/gptme/gptme/pull/4196) **(tokens)** warn when model has no native tiktoken encoding |
| 91 | +- [gptme#4197](https://github.com/gptme/gptme/pull/4197) **(message)** don't append ellipsis to short oneline messages |
| 92 | +- [gptme#4198](https://github.com/gptme/gptme/pull/4198) **(chats)** reject blank and normalize multi-line names in chats rename |
| 93 | +- [gptme#4202](https://github.com/gptme/gptme/pull/4202) **(ci)** disable provenance attestation on Docker push to fix GHCR unknown blob |
| 94 | +- [gptme#4203](https://github.com/gptme/gptme/pull/4203) **(computer)** audit-log sees keyword/positional computer() calls via AST |
| 95 | +- [gptme#4206](https://github.com/gptme/gptme/pull/4206) **(openai-responses)** clamp instructions to 1MB char cap for Responses API |
| 96 | +- [gptme#4207](https://github.com/gptme/gptme/pull/4207) **(openai-responses)** drop orphaned tool results with no preceding call |
| 97 | +- [gptme#4208](https://github.com/gptme/gptme/pull/4208) **(subagent)** cap thread-mode subagent LLM request timeout by remaining deadline |
| 98 | +- [gptme#4209](https://github.com/gptme/gptme/pull/4209) **(webui)** navigate before clearing store on conversation delete |
| 99 | +- [gptme#4210](https://github.com/gptme/gptme/pull/4210) **(models-info)** exit 1 when model resolves to unknown provider |
| 100 | +- [gptme#4211](https://github.com/gptme/gptme/pull/4211) **(slop)** lower STACCATO_MAX_WORDS 8→7 to fix false positive on technical doc sentences |
| 101 | +- [gptme#4215](https://github.com/gptme/gptme/pull/4215) **(mcp)** load_mcp_server now registers ToolSpecs and updates cache |
| 102 | +- [gptme#4220](https://github.com/gptme/gptme/pull/4220) **(cli)** keep plugin subcommand args opaque to gptme's own options |
| 103 | +- [gptme#4221](https://github.com/gptme/gptme/pull/4221) **(anthropic)** pass an explicit timeout so non-streaming chat() accepts 64k+ max_tokens |
| 104 | +- [gptme#4222](https://github.com/gptme/gptme/pull/4222) **(llm)** reject an exhausted stream with no output instead of persisting an empty assistant turn |
| 105 | +- [gptme#4231](https://github.com/gptme/gptme/pull/4231) **(ci)** retry apt-get update up to 3 times with timeout |
| 106 | +- [gptme#4235](https://github.com/gptme/gptme/pull/4235) **(mcp)** preserve complete search queries |
| 107 | +- [gptme#4236](https://github.com/gptme/gptme/pull/4236) **(compaction)** reland #4224-#4226 that merged into a stacked branch |
| 108 | +- [gptme#4239](https://github.com/gptme/gptme/pull/4239) **(server)** reject an exhausted stream with no output instead of persisting an empty assistant turn |
| 109 | +- [gptme#4241](https://github.com/gptme/gptme/pull/4241) **(test)** use column check instead of substring check in test_shell_session_records_its_pgid |
| 110 | +- [gptme#4243](https://github.com/gptme/gptme/pull/4243) **(server)** honor TOOL_FORMAT and parse native tool calls in steps |
| 111 | +- [gptme-contrib#1838](https://github.com/gptme/gptme-contrib/pull/1838) **(gptodo)** share locked atomic lifecycle mutations across writers |
| 112 | +- [gptme-contrib#1839](https://github.com/gptme/gptme-contrib/pull/1839) **(sessions)** separate reusable labels from canonical run identity |
| 113 | +- [gptme-contrib#1840](https://github.com/gptme/gptme-contrib/pull/1840) **(gptodo)** make repeated subtask edits validated and atomic |
| 114 | +- [gptme-contrib#1842](https://github.com/gptme/gptme-contrib/pull/1842) **(sessions)** skip non-object records when parsing trajectories |
| 115 | +- [gptme-contrib#1843](https://github.com/gptme/gptme-contrib/pull/1843) **(gptodo)** coerce non-list dependency/tag fields instead of crashing every command |
| 116 | +- [gptme-contrib#1844](https://github.com/gptme/gptme-contrib/pull/1844) **(sessions)** tolerate undecodable bytes in the session store |
| 117 | +- [gptme-contrib#1845](https://github.com/gptme/gptme-contrib/pull/1845) **(activity-gate)** drop bot/self comment notifications on closed threads |
| 118 | +- [gptme-contrib#1847](https://github.com/gptme/gptme-contrib/pull/1847) **(gptmail)** handle empty-value headers; suppress X-GitHub-* context noise |
| 119 | +- [gptme-contrib#1848](https://github.com/gptme/gptme-contrib/pull/1848) **(openrouter)** gate availability on account balance, not just daily limit |
| 120 | +- [gptme-contrib#1852](https://github.com/gptme/gptme-contrib/pull/1852) **(gptmail)** exclude send-audit trailers from archive deduplication |
| 121 | +- [gptme-contrib#1853](https://github.com/gptme/gptme-contrib/pull/1853) **(activity-gate)** suppress repeat self-actor PR notifications |
| 122 | +- [gptme-contrib#1854](https://github.com/gptme/gptme-contrib/pull/1854) **(gptodo)** reject done transitions with pending checkboxes |
| 123 | +- [gptme-contrib#1855](https://github.com/gptme/gptme-contrib/pull/1855) **(greptile)** always confirm PR head with a live read before re-review check |
| 124 | +- [gptme-contrib#1856](https://github.com/gptme/gptme-contrib/pull/1856) **(gptme-sessions)** narrow _fcntl type so pyright can verify flock usage |
| 125 | +- [gptme-contrib#1857](https://github.com/gptme/gptme-contrib/pull/1857) **(gptme-sessions)** resolve 14 pyright/mypy type errors |
| 126 | +- [gptme-contrib#1858](https://github.com/gptme/gptme-contrib/pull/1858) **(gptme-runloops)** annotate model_usage as dict[str, Any] to resolve no-any-return |
| 127 | +- [gptme-contrib#1860](https://github.com/gptme/gptme-contrib/pull/1860) **(pre-commit)** scope typecheck-packages hook to staged changes |
| 128 | +- [gptme-contrib#1862](https://github.com/gptme/gptme-contrib/pull/1862) **(codex-usage)** start codex with --no-daemon, parse 12h reset times |
| 129 | +- [gptme-contrib#1863](https://github.com/gptme/gptme-contrib/pull/1863) **(hooks)** never run prek without --files (bare run stashes the worktree) |
| 130 | +- [gptme-contrib#1864](https://github.com/gptme/gptme-contrib/pull/1864) **(repo-status)** report a red workflow even when a newer different workflow passed |
| 131 | +- [gptme-contrib#1866](https://github.com/gptme/gptme-contrib/pull/1866) **(sessions)** keep Grok FileContent, GrepSearch, and SearchReplace results |
| 132 | +- [gptme-contrib#1867](https://github.com/gptme/gptme-contrib/pull/1867) **(sessions)** keep Copilot tool error text and call/result linkage |
| 133 | +- [gptme-contrib#1868](https://github.com/gptme/gptme-contrib/pull/1868) **(sessions)** unwrap Codex block outputs; link call ids for Codex, Pi, and Claude Code |
| 134 | +- [gptme-contrib#1870](https://github.com/gptme/gptme-contrib/pull/1870) **(runloops)** count own PR comment as effect for comment-deliverable PM items |
| 135 | +- [gptme-contrib#1871](https://github.com/gptme/gptme-contrib/pull/1871) **(runloops)** count current-head finding dispositions as effect |
| 136 | +- [gptme-contrib#1872](https://github.com/gptme/gptme-contrib/pull/1872) **(daily-briefing)** list blockers priority:high first, then oldest |
| 137 | +- [gptme-contrib#1873](https://github.com/gptme/gptme-contrib/pull/1873) **(gptodo)** enforce the initial-state contract in add |
| 138 | +- [gptme-contrib#1874](https://github.com/gptme/gptme-contrib/pull/1874) **(repo-status)** fall back to newest completed run when several are queued |
| 139 | + |
| 140 | +## Performance |
| 141 | + |
| 142 | +- [gptme-contrib#1822](https://github.com/gptme/gptme-contrib/pull/1822) **(greptile)** cache formal review reads |
| 143 | + |
| 144 | +## Refactors |
| 145 | + |
| 146 | +- [gptme#4226](https://github.com/gptme/gptme/pull/4226) **(compaction)** share prefix and recent-tail cut |
| 147 | + |
| 148 | +## Documentation |
| 149 | + |
| 150 | +- [gptme#4147](https://github.com/gptme/gptme/pull/4147) **(citation)** add Zenodo concept DOI and badge |
| 151 | +- [gptme#4216](https://github.com/gptme/gptme/pull/4216) **(anti-slop)** document float types and fix stale rounding comment |
| 152 | +- [gptme#4230](https://github.com/gptme/gptme/pull/4230) **(mcp)** add ContextVar contract to load/unload_mcp_server + copy_context regression test |
| 153 | +- [gptme#4232](https://github.com/gptme/gptme/pull/4232) add philosophy page (mission, principles, non-goals) |
| 154 | +- [gptme-contrib#1841](https://github.com/gptme/gptme-contrib/pull/1841) **(readme)** make contributor setup runnable from a fresh directory |
| 155 | +- [gptme-contrib#1849](https://github.com/gptme/gptme-contrib/pull/1849) **(block-registry)** unscoped OpenRouter file is the SHARED key, not the chain |
| 156 | + |
| 157 | +## Tests |
| 158 | + |
| 159 | +- [gptme#4200](https://github.com/gptme/gptme/pull/4200) **(browser)** add local blockage conformance suite |
| 160 | +- [gptme#4219](https://github.com/gptme/gptme/pull/4219) **(e2e)** wait for clickability before clicking wizard buttons |
| 161 | +- [gptme#4240](https://github.com/gptme/gptme/pull/4240) **(server)** isolate v2 API tests from the real logs dir |
| 162 | +- [gptme#4242](https://github.com/gptme/gptme/pull/4242) **(llm)** stub init_llm in degeneration reply() test so it runs in isolation |
| 163 | +- [gptme-contrib#1827](https://github.com/gptme/gptme-contrib/pull/1827) cover identity portability across generic package CLIs |
| 164 | + |
| 165 | +## CI & Infrastructure |
| 166 | + |
| 167 | +- [gptme#4106](https://github.com/gptme/gptme/pull/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 |
| 168 | +- [gptme#4108](https://github.com/gptme/gptme/pull/4108) **(deps)** bump lucide-react from 0.451.0 to 1.48.0 in /webui |
| 169 | +- [gptme#4109](https://github.com/gptme/gptme/pull/4109) **(deps)** bump @hookform/resolvers from 3.10.0 to 5.9.1 in /webui |
| 170 | +- [gptme#4110](https://github.com/gptme/gptme/pull/4110) **(deps)** bump simple-icons from 15.9.0 to 16.33.0 in /webui |
| 171 | +- [gptme#4141](https://github.com/gptme/gptme/pull/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 |
| 172 | +- [gptme#4143](https://github.com/gptme/gptme/pull/4143) **(deps)** bump the webui-minor-patch group across 1 directory with 51 updates |
| 173 | +- [gptme#4161](https://github.com/gptme/gptme/pull/4161) **(deps-dev)** bump @tauri-apps/cli from 2.12.0 to 2.12.1 in /tauri in the tauri-minor-patch group |
| 174 | +- [gptme#4162](https://github.com/gptme/gptme/pull/4162) **(deps)** bump sanitize-html from 2.17.7 to 2.18.0 in /site/next in the site-next-minor-patch group |
| 175 | +- [gptme#4234](https://github.com/gptme/gptme/pull/4234) **(docs)** check gptme repo blob/tree links against git, not github.com |
| 176 | + |
| 177 | +## Chore |
| 178 | + |
| 179 | +- [gptme#4225](https://github.com/gptme/gptme/pull/4225) **(anthropic)** upgrade SDK for native compaction |
| 180 | + |
| 181 | +--- |
| 182 | + |
| 183 | +*113 PRs merged across 2 repos. See the full changelogs: [gptme](https://github.com/gptme/gptme/pulls?q=is%3Apr+is%3Amerged) | [gptme-contrib](https://github.com/gptme/gptme-contrib/pulls?q=is%3Apr+is%3Amerged)* |
0 commit comments