Skip to content

fix(desktop): Stable switch no longer tells policy-blocked nightly apps to reinstall by hand - #32609

Merged
juliusmarminge merged 4 commits into
pingdotgg:mainfrom
only21mil:fix/desktop-update-state-channel-blocked
Nov 15, 2026
Merged

juliusmarminge merged 4 commits into
pingdotgg:mainfrom
only21mil:fix/desktop-update-state-channel-blocked

Conversation

@only21mil

@only21mil only21mil commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

Problem

A nightly desktop app under a managed update policy that rules out nightly (allowNightly: false) should offer a one-step switch to Stable. Instead the Stable switch dialog says "This app's updates are off here, so reinstall it yourself to switch.", which is false for this app: the channelBlockedByPolicy: true flag is dropped over IPC because DesktopUpdateStateSchema has no such key.

Change

Add channelBlockedByPolicy: Schema.optionalKey(Schema.Literal(true)) to DesktopUpdateStateSchema, matching the DesktopUpdateState interface field added in #27197. The existing test "holds a nightly install until its user switches to stable" in DesktopUpdates.test.ts now also encodes the held state through the schema and checks that the flag survives.

Scope

Bug fix: the dialog asks for a manual reinstall it does not need, because the schema was missing a field its interface already declares. A small fix of an obvious bug (one optional schema key), so it needs no issue. I found no issue or PR covering it; #32048, #32027, #27484 and #30804 touch the same dialog or updater for other causes.

Verification

To see it on Linux: in apps/desktop, run vp test run src/updates/DesktopUpdates.test.ts -t "holds a nightly install until its user switches to stable" with the new assertion on main. It fails (expected undefined to be true); with the fix it passes.

Re-checked against main 476fc9be66 on 2026-11-12: 32377ee merges cleanly with it (locally, not pushed), and the test file fails with that main's packages/contracts/src/ipc.ts (1 failed, 44 passed) and passes with this PR's (45 passed); output below. maria-rcks's run covers the dialog in packaged nightly AppImages; this re-check covers the test only.

The dialog itself: maria-rcks verified d30de5d8d4 against main 6c9adfb273 with real nightly AppImages and a managed policy (mode: "auto", allowNightly: false). On main the flag was lost over IPC and the dialog asked for a manual reinstall; on d30de5d IPC kept channelBlockedByPolicy: true, the dialog included this app, and confirming installed Stable. maria-rcks's captures: main, d30de5d8d4, the dialog. They predate this head: ipc.ts, DesktopUpdates.ts, UpdateTrackSwitchDialog.tsx, updateTrackSwitch.logic.ts and SettingsPanels.tsx all changed on main after 6c9adfb273.

Not checked on 32377ee: the dialog, because it only shows in a packaged nightly build with a managed policy file; and macOS and Windows.

Root cause, commands and output

IPC results are encoded through DesktopUpdateStateSchema (getUpdateState, and the state inside the check, download and install results), so the flag is dropped before it reaches the renderer. In that state no later update-state push arrives to put it back, so localUpdaterStaysPut sees enabled: false without the flag, and the Stable switch dialog prepares no local reinstall.

Compatibility: the key is optional. The IPC runs between the main and renderer processes of one app build. DesktopUpdateStatusReport reuses this schema for remote update status; older readers ignore the extra key, and newer readers accept reports without it.

  • cd apps/desktop && vp test run src/updates/DesktopUpdates.test.ts -t "holds a nightly install until its user switches to stable"
    • On main with the new assertion: fails at assert.isTrue((yield* encodeUpdateState(held)).channelBlockedByPolicy) (expected undefined to be true).
    • With the fix: passes.
  • node scripts/check-changed.ts 25bf84ab07f53f141c20239c63e383823a9d5ea0: format, lint, knip, typecheck (36 packages) and tests (2 files, 42 passed) all pass.

On 2026-11-12, on 32377ee merged locally with main 476fc9be66 (not pushed), cd apps/desktop && vp test run src/updates/DesktopUpdates.test.ts on Node 26.12.1 fails with packages/contracts/src/ipc.ts from that main and passes with this PR's version (selected lines, copied without changes):

ipc.ts from main 476fc9b:

     × holds a nightly install until its user switches to stable 11ms
AssertionError: expected undefined to be true
 ❯ src/updates/DesktopUpdates.test.ts:1236:16
 Test Files  1 failed (1)
      Tests  1 failed | 44 passed (45)

ipc.ts from this PR:

 Test Files  1 passed (1)
      Tests  45 passed (45)

The merge of main by maria-rcks (32377ee) resolved one conflict in the test file's imports; this PR's added schema line is unchanged.

On the same merge, node scripts/check-changed.ts 476fc9be66 passes format, lint, knip, typecheck (37 packages) and tests (2 files, 47 passed). The 2026-11-12 run above replaces earlier ones on main dbfbe3993f and b68aedfdb7. For the "main" leg, packages/contracts/src/ipc.ts was checked out from 476fc9b into the merge, then restored. The lines shown are those of the full output that match the failing test, the assertion, its location and the two totals.

Generated with Claude Opus 5.5 and GPT-6.1 Sol in T3 Code Nightly

DesktopUpdateStateSchema had no channelBlockedByPolicy key, so encoding the update state for IPC stripped it and the settings dialog told policy-blocked nightly installs to reinstall by hand instead of preparing the switch to stable.
Add the optional key to the schema so the flag reaches the renderer.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@github-actions github-actions Bot added vouch:unvouched Author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Nov 7, 2026
@macroscopeapp

macroscopeapp Bot commented Nov 7, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved at d30de5d

Macroscope's review found this PR approvable — Preserves an existing policy-blocked update flag across IPC so the Stable-switch flow can distinguish it from updates being disabled. The optional schema addition leaves update policy and product defaults unchanged.

You can add or adjust custom eligibility rules. Learn more.

@coderabbitai

coderabbitai Bot commented Nov 7, 2026 •

Copy link
Copy Markdown
Contributor

Explain Change →

Important

Review skipped

Review was skipped as selected files did not have any reviewable changes.

Run configuration

Commits

Reviewing files that changed from the base of the PR and between 9b4c1c8 and b612ad4.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Use the checkbox below for a quick retry:

  • Trigger review

No actionable comments were generated in the recent review.

Walkthrough

The update state schema now accepts an optional channelBlockedByPolicy field with the literal value true. A test checks that encoding a held update state preserves this field.

Changes: Update state contract

Layer / File(s) Summary
Schema field and encoding test
packages/contracts/src/ipc.ts, apps/desktop/src/updates/DesktopUpdates.test.ts
DesktopUpdateStateSchema accepts the optional channelBlockedByPolicy: true field. The test encodes the held update state and checks that the field remains true.

Estimated code review effort: 1 (Trivial) | ~4 minutes

Change: Bug fix

Suggested reviewers: juliusmarminge

Merge Risk: Minimal · previous review 9b4c1

This fix keeps the Stable-switch dialog from asking users with a policy-blocked nightly install to reinstall by hand. The change is small and additive, with a regression test, and no merge-blocking risk is evident.

Pre-merge checks: Passed 4

Check name Status Explanation
Title check Passed The title names the actual fix: the Stable switch no longer tells policy-blocked nightly apps to reinstall manually. The changeset adds the optional channelBlockedByPolicy key to DesktopUpdateStateSch…
Description check Passed The description follows the template well. It states the problem, the change, the scope (a bug fix with no issue needed, with reasons), and verification with concrete commands, outputs, and a manual e…
Linked Issues check Passed Check skipped because no linked issues were found for this pull request.
Out of Scope Changes check Passed Check skipped because no linked issues were found for this pull request.
Full details: Title check

Explanation

The title names the actual fix: the Stable switch no longer tells policy-blocked nightly apps to reinstall manually. The changeset adds the optional channelBlockedByPolicy key to DesktopUpdateStateSchema, which stops the flag from being dropped over IPC, and extends the held-state test. The title is specific and follows the conventional commit form. Its length (92 characters) is long but acceptable.

Full details: Description check

Explanation

The description follows the template well. It states the problem, the change, the scope (a bug fix with no issue needed, with reasons), and verification with concrete commands, outputs, and a manual end-to-end run. It notes what was not checked (macOS, Windows, and the dialog on the final head). The template's conventional commit title guidance is not in the description, but the PR title covers it. The description is long and includes a collapsible details block, which is more than the template asks for, but the required sections are all present and filled in.

Finishing Touches

Generate unit tests (beta)

  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts
Recent review info

Run configuration

Commits

Reviewing files that changed from the base of the PR and between 32377ee and 9b4c1c8.

Files selected for processing: 2

  • apps/desktop/src/updates/DesktopUpdates.test.ts
  • packages/contracts/src/ipc.ts

Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 1 remain after this review.

Wladefant

This comment was marked as spam.

@maria-rcks

maria-rcks commented Nov 10, 2026 •

Copy link
Copy Markdown
Collaborator

Note

Written by claude-opus-5-5 on behalf of Maria

Takeover update

merged current main into the head with a merge commit (32377ee91f). one conflict in apps/desktop/src/updates/DesktopUpdates.test.ts imports: kept this PR's DesktopUpdateStateSchema encoder and main's new release-feed helpers. no other changes. vp run check:changed passed on blacksmith (format, lint, knip, typecheck of 37 packages, 2 test files); DesktopUpdates.test.ts passed 43/43. no review-bot findings to address.

Verified in a real dev environment

verified as-is at d30de5d8d4f148078d4edf9347cbc74c63261e5b on linux.

  • reproduced on github/main at 6c9adfb2739205244b84e607736f6fd8b4611e69 in a separate worktree. built real nightly appimages from both sources with the production github update feed and installed an actual /etc/t3code/policy.json with mode: "auto", allowNightly: false.
  • drove the running apps with repo playwright dependencies. on main, initial renderer ipc dropped the flag and settings > about > update track > stable falsely requested manual reinstall. on this head, ipc retained channelBlockedByPolicy: true; the dialog included this app and omitted that message.
  • confirmed the switch. the real updater downloaded stable 0.1.8, invoked quitAndInstall, and replaced the appimage. the installed stable binary subsequently reported enabled: true, channel: "latest", currentVersion: "0.1.8"; the existing codex thread survived.
  • cancel preserved nightly. with a real mode: "off" policy, ipc omitted the channel-blocked flag and the managed-policy ui blocked update controls.
  • created projects and threads through the app. real codex gpt-6.1-sol turns completed on main desktop, this head's dev web client in /usr/bin/google-chrome, and this head's packaged desktop client. no mocks, fixtures, or replay provider.
  • blacksmith ran the existing desktop updater, remote updater, and track-switch logic suites: 3 files, 70 tests passed. no source changes or pushes were needed.

runtime commands, ipc results and install transcript

main: false manual-reinstall message under the nightly-blocking policy

pr: the same policy and release include this app in the stable-switch plan

pr: opening the real stable-switch dialog

installed stable 0.1.8 with the stable track selected

real codex gpt-6.1-sol response in the pr desktop app

updates fully off: managed policy blocks update controls

Not verified

automatic reopening past this vm's first-run linux keyring prompt. i left the keyring untouched and restarted the downloaded stable binary with --password-store=basic, also used for both verification builds. macos, windows, native mobile, and remote update-report transport were not exercised here.

@only21mil

Copy link
Copy Markdown
Contributor Author

Note

🤖 Opus 5.5 replying on behalf of Victor.

Thank you, Maria, for testing d30de5d against main with real nightly AppImages and a managed policy that allows updates but blocks nightly. Your run showed the fix end to end: on main the flag was lost over IPC and the Stable switch asked for a manual reinstall, while on this head IPC kept channelBlockedByPolicy: true, the dialog included this app, and confirming the switch let the real updater install stable 0.1.8 with the existing thread intact. It also confirmed that with updates fully off the flag stays absent and the update controls stay blocked, and that the 70 updater and track-switch tests pass.

Noted on what stays open: reopening after the update wasn't checked past the first-run keyring prompt, and macOS, Windows and the remote update report weren't exercised. The change only adds an optional field to the serialized update state, so those paths read it the same way, and we're glad to follow up if anyone sees different behavior there.

…ate-channel-blocked

# Conflicts:
#	apps/desktop/src/updates/DesktopUpdates.test.ts
brandonvincitore pushed a commit to brandonvincitore/t3code that referenced this pull request Nov 12, 2026
Adapt only the schema field and managed-policy encode regression from Victor Vogel's source. The desktop producer already emits the flag; the codec discarded it.

Source-PR: pingdotgg#32609
Source-Commit: d30de5d
Source-Head: 32377ee
Source-Author: Victor Vogel (only21mil)
Adapted-by: Codex (gpt-6.1-sol, xhigh) through the Codex harness
brandonvincitore pushed a commit to brandonvincitore/t3code that referenced this pull request Nov 12, 2026
Extend the original producer case through direct IPC encoding/decoding and a JSON round-trip of DesktopUpdateStatusReport. The regression loses the actual true-only flag on all six paths at e66d7fc; the schema adaptation preserves it.

Related-Source-PR: pingdotgg#32609
Fork-Adaptation: transport coverage, retaining existing auto/off policy, install admission and prepared retry behavior
Model: gpt-6.1-sol (xhigh)
Harness: Codex
@juliusmarminge juliusmarminge added the takeover:in-progress A takeover lead is working on this PR label Nov 15, 2026
@juliusmarminge

Copy link
Copy Markdown
Member

Evidence

Evidence: Linux x64 packaged Electron apps, light theme, 1280×900, fresh synthetic state. Applied the reported managed policy (updates.mode=auto, allowNightly=false), opened Settings → About, selected Stable, and confirmed on both commits. Both used the same local registry/feed and an actual Stable 0.1.9 AppImage supporting migration 94; public Stable metadata supports only migration 81 and would introduce an unrelated database compatibility block.

Before After
742a91209e b612ad435a
Before: manual reinstall warning and empty table After: this app included and restarts last
Before: still nightly after confirmation After: installed Stable artifact running version 0.1.9
Before confirmation recording After confirmation recording

Base only saved the track; head downloaded and installed Stable. The installed artifact's SHA-256 matched the served fixture. Automatic relaunch reached the splash screen; the installed artifact was then reopened separately to verify its version. Videos redact an unrelated CLI-path description and end with labelled result stills.

Desktop driver · Fixture registry/feed · Confirmation script · Reproduction details · Sanitized runtime transcript

Not shown:

  • Automatic relaunch completing beyond the splash screen was not verified under the debugger/Xvfb session. Installation completed, and the resulting installed artifact was reopened separately to verify Stable 0.1.9.

@juliusmarminge juliusmarminge added takeover:ready Takeover done; auto-lands when gates pass and removed takeover:in-progress A takeover lead is working on this PR labels Nov 15, 2026
@juliusmarminge
juliusmarminge merged commit ca0ca71 into pingdotgg:main Nov 15, 2026
49 checks passed
@juliusmarminge juliusmarminge removed the takeover:ready Takeover done; auto-lands when gates pass label Nov 15, 2026
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Nov 15, 2026
**v0.1.10-nightly.20261115.4736** · 95 changes from 43 contributors

- **Large terminal pastes.** Paste large amounts of text into the terminal without the paste being rejected.
- **Faster Codex skills.** Codex skills appear faster when opening or switching workspaces.
- **Faster long threads.** Long threads open about 2.5 times faster.
- **Image attachments.** Distinct pasted images with matching attachment details are no longer silently collapsed into one.
- **Selected-file commits.** Committing selected files preserves merge conflicts in other files.
- **Long-lived drafts.** Images in older drafts are recovered before sending if their uploads have expired.
- **Optional questions.** Submit agent questions without filling in optional text fields.

### Plus 82 more bug fixes and performance improvements.

<details>
<summary>Full changelog</summary>

## What's Changed
* fix(web): sidebar edge uses the same resize cursor as side panels by @tenyoru in pingdotgg/t3code#33083
* fix(web): attach command palette threads outside the sidebar by @Yash-Singh1 in pingdotgg/t3code#37054
* fix(server): status reports no branch while a clone has not checked out HEAD by @juliusmarminge in pingdotgg/t3code#37041
* perf(scripts): check:changed on Windows no longer spends minutes walking node_modules (2,500 s → 5.0 s) by @Pyseph in pingdotgg/t3code#32023
* perf(web): answering a question no longer re-renders the whole chat view by @OmarAlex24 in pingdotgg/t3code#32324
* perf(server): command palette status rows skip the Changes totals they never show by @Yuruzuu in pingdotgg/t3code#32351
* fix(web): PR file order follows alias imports of dotted modules by @jancuk in pingdotgg/t3code#32364
* fix(acp): a failed MCP-over-ACP disconnect can be retried by @notzenco in pingdotgg/t3code#33069
* fix(web): settle check lines up with row timestamps by @sergiiopm in pingdotgg/t3code#33053
* fix(provider-core): handoff work reserve fits small context windows by @MiaAI-Lab in pingdotgg/t3code#32598
* fix(mobile): video previews survive re-signed URLs and a late-attached player item by @bartlomiejbloniarz in pingdotgg/t3code#32196
* fix(mobile): honor Android clock format in message timestamps by @razzeee in pingdotgg/t3code#33078
* fix(shared): .localdomain hosts no longer leak to the favicon service by @mrlufepines in pingdotgg/t3code#32657
* fix(web): collapsing Electron main no longer hides the backend server by @thepradipvc in pingdotgg/t3code#32619
* test: remove duplicate client call-site coverage by @t3-code-bot[bot] in pingdotgg/t3code#36776
* fix(github): pull request activity reports a rate-limited review-thread read instead of hiding its threads by @only21mil in pingdotgg/t3code#32620
* fix(web): stacked composer banners no longer show dark seam bands by @Pulsar-Programmer in pingdotgg/t3code#32683
* fix(web): draft images keep their order after a reload by @only21mil in pingdotgg/t3code#32709
* fix(web): open PDF links in the file viewer by @Yash-Singh1 in pingdotgg/t3code#37064
* fix(server): a selected-file commit keeps other files' merge conflicts by @only21mil in pingdotgg/t3code#33115
* fix(web): a file opened from a diff in a project folder inside a repository opens that file by @Entrpi in pingdotgg/t3code#32684
* test(web): ACP project picker test waits for the popup to take focus by @seancarnahan in pingdotgg/t3code#33061
* fix(web): stop held dictation when shortcut modifiers are released by @mrlufepines in pingdotgg/t3code#32648
* perf(web): resting on a PR row also reads its activity, so the timeline shows on click by @Bil0000 in pingdotgg/t3code#32842
* fix(server): agents can see whether a thread is pinned by @shadizx in pingdotgg/t3code#32727
* fix(server): a pushed commit no longer reports failure when the final git status read fails by @only21mil in pingdotgg/t3code#32705
* test(web): the streaming render scenario gives the timeline stable props by @Entrpi in pingdotgg/t3code#32792
* fix(web): HTML file previews use the current canvas color by @Yash-Singh1 in pingdotgg/t3code#37072
* fix(web): an image-only send that fails behind a new draft now says so by @only21mil in pingdotgg/t3code#32732
* fix(assets): align app icons and retain a folder placeholder while loading by @Yash-Singh1 in pingdotgg/t3code#37067
* fix(github): pull request activity says when its comments were cut by @only21mil in pingdotgg/t3code#32707
* test(github): activity mock sets the new truncated flag by @juliusmarminge in pingdotgg/t3code#37078
* fix(server): a branch's own pull request shows past a hundred same-named fork pull requests by @only21mil in pingdotgg/t3code#32796
* fix(server): an effect this build can't read no longer blocks its thread's later work by @only21mil in pingdotgg/t3code#32746
* fix(acp-registry): a failed agent install no longer floods provider status with its whole log by @only21mil in pingdotgg/t3code#32800
* fix(web): terminal reports focus changes to programs that request them by @StiensWout in pingdotgg/t3code#37066
* fix(web): remove redundant subagent action from background row by @Yash-Singh1 in pingdotgg/t3code#37079
* fix(web): a side chat's subagent opens its parent as a side chat tab, not a bare page by @Yuruzuu in pingdotgg/t3code#32907
* fix(shared): inline code paths like `docker/Dockerfile` become file chips by @felixlaga in pingdotgg/t3code#32402
* fix(web): Esc in Clerk's account modal no longer closes Settings by @thepradipvc in pingdotgg/t3code#32859
* fix(mobile): show thread sync status in the header, not above the composer by @juliusmarminge in pingdotgg/t3code#37076
* fix(mobile): undo toast lines up with the folded Duo's tab bar by @juliusmarminge in pingdotgg/t3code#37081
* fix(desktop): Stable switch no longer tells policy-blocked nightly apps to reinstall by hand by @only21mil in pingdotgg/t3code#32609
* fix(web): live dictation transcript keeps the newest words in view by @SharoonRafeek in pingdotgg/t3code#32960
* fix(server): preserve shell paths containing spaces and dashes by @StiensWout in pingdotgg/t3code#37069
* perf(server): batch terminal output that arrives within 2 ms by @juliusmarminge in pingdotgg/t3code#37060
* perf(desktop): WSL preflight starts the staged runtime once instead of twice by @juliusmarminge in pingdotgg/t3code#37052
* fix(mobile): worktree setup shows in the chat from the first moment by @juliusmarminge in pingdotgg/t3code#37084
* fix(server): an MCP pin lands at the top of the Pinned section by @xwchen in pingdotgg/t3code#33978
* fix(mobile): keep Diagnostics and Client Storage content above floating tabs by @j-gaertig in pingdotgg/t3code#32821
* fix(acp-registry): observe delayed model discovery and avoid stale cache lock by @hxbib in pingdotgg/t3code#33170
* test(web): Settings Esc test waits for the modal's initial focus by @juliusmarminge in pingdotgg/t3code#37089
* fix(claude): keep monitor threads waiting between updates by @Yash-Singh1 in pingdotgg/t3code#37085
* fix(mobile): the iPhone Duo's sidebar list ends above its tab bar in portrait by @juliusmarminge in pingdotgg/t3code#37091
* fix(web): switching providers no longer drops the thread's stored effort by @only21mil in pingdotgg/t3code#33090
* fix(mobile): PR activity filter remembers bot and resolved visibility by @juliusmarminge in pingdotgg/t3code#37096
* fix(web): terminal links open bare compiler filenames by @StiensWout in pingdotgg/t3code#37071
* fix(acp): optional text questions can be left blank by @shivamhwp in pingdotgg/t3code#36997
* fix(shared): MCP apps that fall back to a blob: frame no longer render blank by @u9g in pingdotgg/t3code#32129
* fix(shared): keep coalescing workers alive when processors throw by @luke2x in pingdotgg/t3code#32178
* fix(server): an empty Antigravity MCP config still allows text generation by @saphid in pingdotgg/t3code#36496
* perf(server): active thread reads filter on the archived_at column by @mahirozdin in pingdotgg/t3code#28992
* perf(resource-monitor): look up external process identities by PID by @hieu-lee in pingdotgg/t3code#31202
* fix(server): accept ASCII whitespace in base64 image payloads by @darshmahadevia in pingdotgg/t3code#31798
* perf(server): Codex skills for four workspaces load in a median 138 ms instead of 1,657 ms (12x) by @Yuruzuu in pingdotgg/t3code#33972
* fix(web): recover expired composer uploads before sending by @Adamulek123 in pingdotgg/t3code#32910
* fix(server): content search recovers after a slow first index by @ItsThierry in pingdotgg/t3code#33138
* fix(terminal): show shell startup failures across attachments by @StiensWout in pingdotgg/t3code#37088
* perf(server): long threads open about 2.5x faster by @valuin in pingdotgg/t3code#34014
* fix(mobile): inline markdown images page through their message's images by @juliusmarminge in pingdotgg/t3code#37117
* fix(mobile): /model suggestion opens the model picker by @StiensWout in pingdotgg/t3code#37109
* fix(desktop): release cancelled Codex callback listeners during browser launch by @romil-bijarnia in pingdotgg/t3code#29734
* perf(server): skip compression for the desktop's local connection by @voltcrash in pingdotgg/t3code#30832
* fix(server): outside MCP clients stop being offered thread-bound tools by @RVZO6 in pingdotgg/t3code#32764
* fix(ssh): preserve literal home paths in Include expansion by @Lucenx9 in pingdotgg/t3code#33288
* fix(server): finish closed terminal kills before shutdown by @StiensWout in pingdotgg/t3code#37113
* fix(web): keep distinct images with matching attachment metadata by @StiensWout in pingdotgg/t3code#37116
* fix(web): large terminal pastes reach the program intact by @StiensWout in pingdotgg/t3code#37103
* fix(server): settling a thread keeps exec and foreground Bash terminals open by @juliusmarminge in pingdotgg/t3code#37125
* fix(codex): keep browser access prompts available in full access by @Yash-Singh1 in pingdotgg/t3code#37104
* fix(web): open terminal file links naming the server hostname by @StiensWout in pingdotgg/t3code#37133
* fix(mobile): recheck the current branch before selecting it by @StiensWout in pingdotgg/t3code#37121
* fix(acp): wait for session/load to reply before prompting by @shivamhwp in pingdotgg/t3code#37139
* fix(web): terminal mouse reports hit the drawn cell by @StiensWout in pingdotgg/t3code#37148
* fix(server): run_scheduled_task_now returns why a started run failed by @SouthCarpet in pingdotgg/t3code#37149
* fix(azure-devops): pull request titles like `@notes.txt` are saved as typed by @juliusmarminge in pingdotgg/t3code#37110
* fix(web): Sharing & access can select a desktop-local WSL backend by @juliusmarminge in pingdotgg/t3code#37151
* fix(mobile): pasted GIFs on iOS keep their animation by @StiensWout in pingdotgg/t3code#37143
* fix(acp): Copilot's reply after a background agent wakes it opens a continuation run by @juliusmarminge in pingdotgg/t3code#37159
* fix(shared): ß no longer splits words in generated folder and branch names by @lowlyleon in pingdotgg/t3code#37152
* fix(server): name the missing project when a change request's repository has none by @Sidreyas in pingdotgg/t3code#37161
* fix(server): an oversized provider request reads as too large, not raw 413 HTML by @Sidreyas in pingdotgg/t3code#37156
* fix(provider-acp): Grok early task completion no longer replaces the child's answer by @juliusmarminge in pingdotgg/t3code#37162
* fix(web): keypad navigation works with NumLock off by @StiensWout in pingdotgg/t3code#37175

## New Contributors
* @tenyoru made their first contribution in pingdotgg/t3code#33083
* @mrlufepines made their first contribution in pingdotgg/t3code#32657
* @thepradipvc made their first contribution in pingdotgg/t3code#32619
* @Pulsar-Programmer made their first contribution in pingdotgg/t3code#32683
* @seancarnahan made their first contribution in pingdotgg/t3code#33061
* @shadizx made their first contribution in pingdotgg/t3code#32727
* @SharoonRafeek made their first contribution in pingdotgg/t3code#32960
* @xwchen made their first contribution in pingdotgg/t3code#33978
* @j-gaertig made their first contribution in pingdotgg/t3code#32821
* @hxbib made their first contribution in pingdotgg/t3code#33170
* @ItsThierry made their first contribution in pingdotgg/t3code#33138
* @lowlyleon made their first contribution in pingdotgg/t3code#37152

**Full Changelog**: pingdotgg/t3code@v0.1.10-nightly.20261115.4723...v0.1.10-nightly.20261115.4736

</details>


Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.1.10-nightly.20261115.4736
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size:XS 0-9 changed lines (additions + deletions). vouch:unvouched Author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

4 participants