Skip to content

fix(server): recover stale Codex approval callbacks - #5195

Merged
t3dotgg merged 1 commit into
pingdotgg:mainfrom
luckyPipewrench:fix/stale-provider-approval-recovery
Aug 27, 2026
Merged

fix(server): recover stale Codex approval callbacks#5195
t3dotgg merged 1 commit into
pingdotgg:mainfrom
luckyPipewrench:fix/stale-provider-approval-recovery

Conversation

@luckyPipewrench

@luckyPipewrench luckyPipewrench commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

What Changed

Normalize Codex's provider-specific missing approval callback error into T3 Code's existing provider-neutral stale approval failure at the provider command reactor boundary.

This keeps web, desktop, mobile, projection counts, and thread settling on the existing shared recovery path without teaching clients about a Codex-specific error string.

Why

Approval cards are durable, but provider callbacks are in memory. After a Codex session restarts or is recovered, responding to an old card can return Unknown pending Codex approval request. That error was not recognized by the approval classifier, so T3 persisted the raw failure and left the impossible approval pending.

The normalized failure clears the stale request without emitting approval.resolved or executing the rejected command.

Checklist

  • This PR is small and focused
  • I explained what changed and why
  • No UI layout changes require screenshots
  • No animation or motion changes require video

Note

Low Risk
Small change to error-string classification in the approval response path; behavior aligns with existing stale-approval recovery and does not alter auth or data handling.

Overview
Extends the provider command reactor’s stale approval classifier so Codex’s in-memory callback errors are treated like existing “unknown pending approval” failures.

isUnknownPendingApprovalRequestError now matches unknown pending codex approval request (alongside the generic approval/permission strings), and Cause.pretty matching is case-insensitive so mixed-case provider details still classify correctly. When matched, failures still surface as the shared Stale pending approval request: … activity—not a fake approval.resolved and not executing the command.

The reactor test was updated to simulate Codex’s item/requestApproval/decision error shape and asserts that provider.approval.respond.failed carries the normalized stale detail and that no approval.resolved activity is emitted.

Reviewed by Cursor Bugbot for commit 80d72a4. Bugbot is set up for automated code reviews on this repo. Configure here.

Note

Fix isUnknownPendingApprovalRequestError to recover stale Codex approval callbacks

Extends the detection logic in isUnknownPendingApprovalRequestError in ProviderCommandReactor.ts to match the phrase 'unknown pending codex approval request' in addition to the existing phrase. The pretty-printed cause message is now lowercased before matching, making all checks case-insensitive.

Macroscope summarized 80d72a4.

@coderabbitai

coderabbitai Bot commented Aug 1, 2026

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on this repository. Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

⚙️ Run configuration

Configuration used: Repository UI

Review profile: CHILL

Plan: Pro Plus

Run ID: b1e6ac62-b104-4d1b-a23b-867deb848a08

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

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@github-actions github-actions Bot added vouch:unvouched PR author is not yet trusted in the VOUCHED list. size:XS 0-9 changed lines (additions + deletions). labels Aug 1, 2026
@macroscopeapp

macroscopeapp Bot commented Aug 1, 2026

Copy link
Copy Markdown
Contributor

Approvability

Verdict: Approved 80d72a4

This is a straightforward bug fix that extends error detection to recognize an additional error message pattern for Codex approval callbacks. The change is self-contained: it adds a new string pattern to an existing error detection function and normalizes case sensitivity. No new behavior paths are introduced.

You can customize Macroscope's approvability policy. Learn more.

@t3dotgg
t3dotgg merged commit 230c5d4 into pingdotgg:main Aug 27, 2026
16 checks passed
@luckyPipewrench
luckyPipewrench deleted the fix/stale-provider-approval-recovery branch August 27, 2026 10:20
frankdavidcorona pushed a commit to frankdavidcorona/t3code that referenced this pull request Aug 27, 2026
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 27, 2026
github-actions Bot added a commit to omarcresp/t3code-flake that referenced this pull request Aug 29, 2026
## What's Changed
* fix(grok): improve skills, plans, usage, and turn reliability by @t3dotgg in pingdotgg/t3code#8358
* fix(server): recover stale Codex approval callbacks by @luckyPipewrench in pingdotgg/t3code#5195
* test(server): remove duplicate missing worktree test by @t3-code[bot] in pingdotgg/t3code#8252
* fix(server): replay all un-applied events during projection bootstrap by @krutftw in pingdotgg/t3code#7538
* test: remove low-signal test files by @t3-code[bot] in pingdotgg/t3code#8397
* test: prune trivial error and layout tests by @t3-code[bot] in pingdotgg/t3code#8400
* Fix Android adaptive launcher icon by @colonelpanic8 in pingdotgg/t3code#4332
* feat(web): split provider settings into list and editor by @t3dotgg in pingdotgg/t3code#8380
* fix(codex): accept Codex 0.150 account plans by @gsimone in pingdotgg/t3code#8447
* fix(tooling): allow ignored-only staged changes by @juliusmarminge in pingdotgg/t3code#8468
* fix(mobile): keep iOS home header stable by @juliusmarminge in pingdotgg/t3code#8467
* fix(web): stop showing red x summaries for ordinary tool failures by @t3dotgg in pingdotgg/t3code#8395
* fix(mobile): refine Git action toast glass styling by @juliusmarminge in pingdotgg/t3code#8399
* fix(desktop): allow preview automation in agent-created threads by @t3dotgg in pingdotgg/t3code#8483
* test(web): remove redundant cache key test by @t3-code[bot] in pingdotgg/t3code#8484
* fix(release): move nightly schedule to minute 38 by @t3dotgg in pingdotgg/t3code#8509
* fix(web): stabilize the provider settings editor by @t3dotgg in pingdotgg/t3code#8472
* fix(web): open GitHub pull requests in browser when loading fails by @t3dotgg in pingdotgg/t3code#8507
* fix(codex): show sub-agent models by @t3dotgg in pingdotgg/t3code#8502
* feat(analytics): report connected client platforms by @t3dotgg in pingdotgg/t3code#8481
* feat(server): accept PDF, ZIP, and other file uploads up to 50MB by @t3dotgg in pingdotgg/t3code#8235
* feat(web): toggle a thread's pin from the keyboard by @ipanasenko in pingdotgg/t3code#8440
* fix(web): add back button to project settings by @StiensWout in pingdotgg/t3code#8168
* refactor(mobile): compile semantic themes for Uniwind by @juliusmarminge in pingdotgg/t3code#7327
* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times  by @ikifar2012 in pingdotgg/t3code#5769
* fix(mobile): show OpenCode model sources in picker by @juliusmarminge in pingdotgg/t3code#8573
* fix(clients): honor project default models in new threads by @anirudhsama in pingdotgg/t3code#6011
* fix(mobile): show file actions on Android by @none23 in pingdotgg/t3code#8215
* fix(connect): explain DPoP connection failures by @extoci in pingdotgg/t3code#8351
* feat(web): make the sidebar project filter a searchable combobox by @SunkenInTime in pingdotgg/t3code#5931
* fix(server): a draft can retry its first send after a failed bootstrap by @shivamhwp in pingdotgg/t3code#8226
* fix(desktop): stop hidden previews draining battery by @Bil0000 in pingdotgg/t3code#8567
* fix(desktop): oauth popups open from the browser preview by @walid-baharwal in pingdotgg/t3code#8435
* fix(web): keep long task drawers usable on small screens by @shivamhwp in pingdotgg/t3code#8313
* fix(opencode): handle child approvals, stops, and model catalogs by @t3dotgg in pingdotgg/t3code#8480
* fix: make thread auto-settling opt-in by @shivamhwp in pingdotgg/t3code#8321
* fix(web): stop session activity timing test from blocking releases by @t3dotgg in pingdotgg/t3code#8585
* fix(mobile): show composer menus when starting a task by @juliusmarminge in pingdotgg/t3code#8587
* fix(web): show the configured stash shortcut by @UtkarshUsername in pingdotgg/t3code#8437
* feat(web): add toggleable confirmation before unpinning a thread by @UtkarshUsername in pingdotgg/t3code#7313
* fix: restore automatic thread settling defaults by @t3dotgg in pingdotgg/t3code#8596
* fix(mobile): restore composer glass and rounded shadows by @juliusmarminge in pingdotgg/t3code#8597

## New Contributors
* @luckyPipewrench made their first contribution in pingdotgg/t3code#5195
* @krutftw made their first contribution in pingdotgg/t3code#7538
* @colonelpanic8 made their first contribution in pingdotgg/t3code#4332
* @ikifar2012 made their first contribution in pingdotgg/t3code#5769
* @walid-baharwal made their first contribution in pingdotgg/t3code#8435

**Full Changelog**: pingdotgg/t3code@v0.0.35...v0.0.36

Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.36
aorwall added a commit to aorwall/t3code that referenced this pull request Aug 29, 2026
Merges 58 upstream commits (`badae6a5c` → `6a9d9f988`, upstream v0.0.34
→ v0.0.36) through the `fork-upstream-merge` skill.

`merge-stats.mjs` reconciles exactly: **431 files landed** against **431
in the upstream range**, no gap to explain. Fork delta is 611 files.

## Conflicts

Three, plus one git resolved silently and wrongly.

- **`Sidebar.tsx`** — upstream replaced the project picker's
`Menu`/`MenuRadioGroup` with a searchable `Combobox` (pingdotgg#5931). Took
upstream's structure and re-applied only the
`FEATURES.projectManagement` gate on "New project", now carrying the `//
Fork:` marker it had been missing. Upstream has since grown the mobile
touch-target span itself, so the Mobile Touch Delta has nothing left to
re-apply here — one convergence, unprompted.
- **`ProviderSettingsPanel.tsx`** — upstream split provider settings
into list and editor (pingdotgg#8380, pingdotgg#8472), moving `ProviderLastChecked` and
the refresh button out of `headerAction` into the list footer. Took
upstream's and re-applied the gate as `!readOnly &&
FEATURES.serverAdministration`.
- **`pnpm-lock.yaml`** — took upstream's and re-ran `vp i`, which
restored the fork's `@t3tools/moatless-api` workspace edge.
- **`packages/contracts/src/orchestration.test.ts`** — auto-merged, no
marker, broken. Both sides appended `OrchestrationMessage` to the same
import list and the same `decodeOrchestrationMessage` const at different
offsets, so git took both. Surfaced as a parse error in lint, typecheck
and test at once. This is the case `merge-stats.mjs`'s
conflict-candidate list exists to catch.

`HostedBrowserFrame.tsx` (fork-only) also needed the `renderingActive`
prop pingdotgg#8567 made required. Upstream suspends a parked webview unless
background audio, PiP or a recording still needs it painted; a frame has
none of those to read and is the app's only copy of the preview page, so
it passes `true` and keeps today's behavior.

## Sweep

Five keyword hits, all false positives:

- `apps/web/src/connection/clientMetadata.ts` + test — reports the
client's OS/browser/device on connect (pingdotgg#8481). Auth-adjacent, but it
rides `ClientPresentation` on the relay and remote-bearer bootstraps;
the fork's primary environment sends none of it.
- `packages/client-runtime/src/relay/errorPresentation.ts` + test,
`connection/errors.test.ts` — explain DPoP failures (pingdotgg#8351). Relay only,
and T3 Connect is decided out.

## Feature classification

**Usable as-is**

- Searchable project-filter combobox in the sidebar (pingdotgg#5931).
- Long task drawers stay usable on small screens (pingdotgg#8313) — directly
relevant, the fork's phone story is `apps/web` in mobile Safari/Chrome.
- Toggleable confirmation before unpinning a thread (pingdotgg#7313); toggle
thread pin from the keyboard.
- Back button in project settings (pingdotgg#8168); the configured stash shortcut
is shown (pingdotgg#8437).
- No more red-x summaries for ordinary tool failures (pingdotgg#8395); PRs open
in the browser when loading fails (pingdotgg#8507).
- Project default models are honored in new threads (pingdotgg#6011).
- Provider settings split into list and editor (pingdotgg#8380, pingdotgg#8472) — landed,
though `/settings/providers` is itself gated behind
`serverAdministration`.

**Unsupported in Moatless / needs implementation**

- **Non-image file attachments** (pingdotgg#8235) — a turn may now carry any file
up to 50MB, advertised as `capabilities.fileAttachments.maxUploadBytes`
and sized by `PROVIDER_SEND_TURN_MAX_FILE_BYTES`. Moatless advertises
neither this nor `attachmentUploads`, so the composer's attach
affordance stays off. Costs nothing today (upstream's own web composer
offers images only; `ChatAttachment` widened just far enough to
typecheck), but it is the second capability key to report when uploads
land. Extends the existing **Attachment uploads** entry in
`docs/fork/gaps.md`.
- **Connected-client platform analytics** (pingdotgg#8481) and **DPoP failure
explanations** (pingdotgg#8351) — relay and T3 Connect surfaces, already decided
out of the fork.

No new WS methods entered the contract in this range, so no new
`UnsupportedMethodError` union entries. `unsupported-methods.mjs`
reports `ADD 0`, `DROP 1` (`scripts.run`), `KEEP 2`. The `scripts.run`
DROP is **not** actioned — it is the documented exception in the gaps
register: that union entry answers for `apps/server`, which still stubs
the method (verified surviving in `ws.ts`), not for Moatless.

**Backend behavior to consider reproducing in Moatless**

- **Replay all un-applied events during projection bootstrap** (pingdotgg#7538) —
a one-line pipeline fix upstream; Moatless runs its own projection and
the same class of bug applies.
- **A draft can retry its first send after a failed bootstrap** (pingdotgg#8226)
— Moatless owns turn start, and a draft wedged by a failed bootstrap is
the same dead end here.
- **Recover stale Codex approval callbacks** (pingdotgg#5195) — Moatless owns the
agent runtime in the sandbox.
- **Stop querying Claude context usage after turns** (pingdotgg#8610) — a cheap
correctness/cost fix in the same place Moatless polls.
- **Server-side accept and size-limit non-image uploads** (pingdotgg#8235), the
other half of the gap above.
- Auto-settling churn (pingdotgg#8321 made it opt-in, pingdotgg#8596 reverted) nets to no
change — noted so the next merge does not re-derive it.

## Verification

`verify.mjs`: `tripwires`, `fmt:check`, `lint`, `typecheck` pass. `test`
reports `@t3tools/web` **flaky, passed alone** — in the full run
`MessagesTimeline.test.tsx` skipped all 34 tests on a 30s module-import
timeout under `ChatMarkdown.tsx`; alone the package is 297 files / 3117
tests green. Load, not the merge. `inventory-check.mjs` clean.

Model: Claude Opus 5, via Claude Code in a Moatless sandbox.

---
Moatless task:
https://moatless.soaplabstest.com/tasks/a0c041bb-1426-4591-9296-6a4b0cfa2eff
aaditagrawal added a commit to aaditagrawal/t3code that referenced this pull request Aug 29, 2026
* fix(grok): improve skills, plans, usage, and turn reliability (pingdotgg#8358)

Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>

* fix(server): recover stale Codex approval callbacks (pingdotgg#5195)

* test(server): remove duplicate missing worktree test (pingdotgg#8252)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* fix(server): replay all un-applied events during projection bootstrap (pingdotgg#7538)

Co-authored-by: Theo Browne <me@t3.gg>

* test: remove low-signal test files (pingdotgg#8397)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>

* test: prune trivial error and layout tests (pingdotgg#8400)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>

* Fix Android adaptive launcher icon (pingdotgg#4332)

Co-authored-by: Yash Singh <saiansh2525@gmail.com>

* feat(web): split provider settings into list and editor (pingdotgg#8380)

* fix(codex): accept Codex 0.150 account plans (pingdotgg#8447)

* fix(tooling): allow ignored-only staged changes (pingdotgg#8468)

* fix(mobile): keep iOS home header stable (pingdotgg#8467)

Co-authored-by: Julius Marminge <julius@mac.lan>

* fix(web): stop showing red x summaries for ordinary tool failures (pingdotgg#8395)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(mobile): refine Git action toast glass styling (pingdotgg#8399)

* fix(desktop): allow preview automation in agent-created threads (pingdotgg#8483)

* test(web): remove redundant cache key test (pingdotgg#8484)

Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>

* fix(release): move nightly schedule to minute 38

Recent scheduled nightlies have been delayed or skipped.

Move the nightly cron from minute 7 to minute 38. Keep the existing three-hour interval. This tests a different point in each three-hour window without claiming it will fix GitHub schedule delivery.

Authored by GPT-5.6 Sol with the Codex harness.

* fix(web): stabilize the provider settings editor (pingdotgg#8472)

* fix(web): open GitHub pull requests in browser when loading fails (pingdotgg#8507)

* fix(codex): show sub-agent models (pingdotgg#8502)

* feat(analytics): report connected client platforms (pingdotgg#8481)

* feat(server): accept PDF, ZIP, and other file uploads up to 50MB (pingdotgg#8235)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* feat(web): toggle thread pin from the keyboard

Add a mod+shift+p shortcut that pins or unpins the active thread. Ignore the shortcut during terminal focus and when the server does not support thread pinning.

* fix(web): add back button to project settings (pingdotgg#8168)

* refactor(mobile): compile semantic themes for Uniwind (pingdotgg#7327)

Co-authored-by: codex <codex@users.noreply.github.com>

* fix(desktop): Cache Runtime locally on WSL Filesystem, dramatically improving launch times  (pingdotgg#5769)

Co-authored-by: Claude Opus 5 <noreply@anthropic.com>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>

* fix(mobile): show OpenCode model sources in picker (pingdotgg#8573)

Co-authored-by: Julius Marminge <julius@mac.lan>

* fix(clients): honor project default models in new threads (pingdotgg#6011)

Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>

* fix(mobile): show file actions on Android (pingdotgg#8215)

Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>

* fix(connect): explain DPoP connection failures (pingdotgg#8351)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* feat(web): make the sidebar project filter a searchable combobox (pingdotgg#5931)

* fix(server): a draft can retry its first send after a failed bootstrap (pingdotgg#8226)

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>

* fix(desktop): stop hidden previews draining battery (pingdotgg#8567)

* fix(desktop): oauth popups open from the browser preview (pingdotgg#8435)

Co-authored-by: Julius Marminge <julius0216@outlook.com>

* fix(web): keep long task drawers usable on small screens (pingdotgg#8313)

* fix(opencode): handle child approvals, stops, and model catalogs (pingdotgg#8480)

* fix: make thread auto-settling opt-in (pingdotgg#8321)

* fix(web): stop session activity timing test from blocking releases (pingdotgg#8585)

* fix(mobile): show composer menus when starting a task (pingdotgg#8587)

Co-authored-by: Julius Marminge <julius@mac.lan>

* fix(web): show the configured stash shortcut (pingdotgg#8437)

Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>

* feat(web): add toggleable confirmation before unpinning a thread (pingdotgg#7313)

Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>

* fix: restore automatic thread settling defaults (pingdotgg#8596)

* fix(mobile): restore composer glass and rounded shadows (pingdotgg#8597)

Co-authored-by: Julius Marminge <julius@mac.lan>

* Remove Messages Glass Lab experiment (pingdotgg#8599)

* chore(release): prepare v0.0.36

---------

Co-authored-by: Theo Browne <me@t3.gg>
Co-authored-by: Dara Adedeji <daraadedeji07@gmail.com>
Co-authored-by: Ahmed Besic <ahmed-besic@users.noreply.github.com>
Co-authored-by: Michael Brown <michaeltbrown.mtb@gmail.com>
Co-authored-by: Lars Nieuwenhuis <35393046+lnieuwenhuis@users.noreply.github.com>
Co-authored-by: Guilherme Barros <gbarros1095@gmail.com>
Co-authored-by: PC <pc@localhost>
Co-authored-by: 1xpixi <157762409+1xpixi@users.noreply.github.com>
Co-authored-by: Josh <gitlucky@pipelab.org>
Co-authored-by: t3-code[bot] <269035359+t3-code[bot]@users.noreply.github.com>
Co-authored-by: Tradi3 <56069280+krutftw@users.noreply.github.com>
Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com>
Co-authored-by: Ivan Malison <IvanMalison@gmail.com>
Co-authored-by: Yash Singh <saiansh2525@gmail.com>
Co-authored-by: Gianmarco <gianmarcosimone89@gmail.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <julius@mac.lan>
Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
Co-authored-by: Illia Panasenko <hello@ipanasenko.me>
Co-authored-by: Wout Stiens <71498452+StiensWout@users.noreply.github.com>
Co-authored-by: codex <codex@users.noreply.github.com>
Co-authored-by: Matheson Steplock <ikifar2012@users.noreply.github.com>
Co-authored-by: Utkarsh Patil <73941998+UtkarshUsername@users.noreply.github.com>
Co-authored-by: Anirudh Coontoor <anirudh@gosupernova.live>
Co-authored-by: Shivam Sharma <91240327+shivamhwp@users.noreply.github.com>
Co-authored-by: Nick Anisimov <n.anisimov.23@gmail.com>
Co-authored-by: Exotic <118054752+extoci@users.noreply.github.com>
Co-authored-by: Dara Adedeji <76637177+SunkenInTime@users.noreply.github.com>
Co-authored-by: Bilal Bakr <62337003+Bil0000@users.noreply.github.com>
Co-authored-by: Muhammad Waleed <114993336+walid-baharwal@users.noreply.github.com>
longtngo added a commit to longtngo/t3code that referenced this pull request Aug 29, 2026
Range: a3a8cbd..f6f2be3, 9 commits, 64 files, +4793/-625.
Shape: mostly one-sided. 13 files touched by both sides, 2 conflicts, both in
the same subsystem (ProviderCommandReactor). Upstream's bulk is the Grok ACP
work (pingdotgg#8358, ~1,700 lines across GrokAdapter/GrokProvider/GrokSkills/
AcpRuntimeModel/XAiAcpExtension), a usage contract widening for Grok (v4 -> v5),
and 15 deleted low-signal test files (pingdotgg#8397, pingdotgg#8400, pingdotgg#8252).

CONFLICTS AND RESOLUTIONS

1. apps/server/src/orchestration/Layers/ProviderCommandReactor.ts
   Upstream pingdotgg#5195 and the fork made the SAME fix independently, byte-identical:
   `detail.includes("unknown pending codex approval request")` plus lowercasing
   `Cause.pretty`. Only the fork's explanatory comment conflicted. Resolved to
   HEAD (comment kept); the shared code merged either way.

2. apps/server/src/orchestration/Layers/ProviderCommandReactor.test.ts
   A SPLICE, not a choice. Git paired upstream's retargeted test header with
   the fork's unrelated "continues as a new turn ... (user-input)" test header,
   over a shared `const harness = await createHarness(); const now = ...`
   preamble; the body below the markers is the fork's. Head and tail describe
   different subjects — the documented tell.

   Resolved to HEAD. Upstream did not add a test here: it RETARGETED its single
   "surfaces stale provider approval request failures" case from the permission
   phrasing to the Codex one. The fork had already turned that same test into an
   `it.each` over all three phrasings, INCLUDING upstream's exact new detail
   string. The fork's version is a strict superset, so nothing is owed.

INVARIANTS (docs/fork/README.md) — all 12 re-probed against the merged tree

 1  migrations   49 entries, ids unique + monotonic, max 50, 34 still burned
 2  fork patch   @effect/platform-node@4.0.0-beta.103 still pinned, 16 patches
 3  sidebar      Sidebar.tsx default, LegacySidebar behind useLegacySidebarEnabled
 4  deletions    ContextWindowMeter{.tsx,.test.tsx} absent; MessagesTimeline's
                 three dropped helpers absent (3 hits are the FORK comments);
                 ComposerPendingUserInputPanel has 0 Collapsible
 4b send state   4 `isSendBlocked=` in ChatComposer.tsx
 5  steer test   absent (the single grep hit is the FORK comment marking it)
 5b footer       SidebarLocalModels + SidebarResourceQueue inside SidebarUtilityMenu
 5c boot         BootTurnReconciler.ts present; reconcileProviderSessions absent
                 (FORK note at serverRuntimeStartup.ts:305)
 6  projects      4 `/projects/$projectKey` call sites, dialog intact
 7  stop ladder  STOP_INTERRUPT_GRACE + INTERRUPT_REQUEST_GRACE both live,
                 interruptTurn and stopSessionInternal still separate rungs
 8  interrupt    4 `hasLiveSessionForThread` in ProviderCommandReactor.ts
 9  entrypoint   test still realpaths the temp root
 10 meter logic  ContextWindowMeter.logic.ts present; both rejected exports absent
 11 markdown     ChatMarkdown.tsx carries both environmentId and fileEnvironmentId

Also verified by hand, since a clean automerge cannot: the fork's four edits to
GrokAdapter.ts survived upstream's 597-line rewrite intact — the identity-guarded
`sessions.delete`, the `!stopped` filter in `listSessions`, `refreshAccountUsage`
and `withdrawQueuedTurn`.

SWEEPS (union of both sides, 671 files, 13 two-sided)

  resurrected 0   fork-loss 0   both-kept 0   dropped 3

The 3 dropped are the deliberate rejection above: upstream's renamed `it(...)`
header, its `detail:` line (the fork carries the same string as an `it.each`
table row, so the text differs) and its `method: "item/requestApproval/decision"`
fixture field, which nothing in the matcher reads.

18 files reported ABSENT from the result: 15 are upstream's own test deletions,
3 are the fork's deliberate ones (ContextWindowMeter.tsx, its test, and
serverRuntimeStartup.reconcile.test.ts under invariant 5c).

`--upstream-deleted` run as well: 364 lines / 52 files, every one upstream
rewording or replacing its own text (0.0.34 -> 0.0.35 version bumps, usage v4
-> v5, the Grok expansions, doc rewrites). No fork reference to a removed thing.

GATE

  pnpm install: lockfile unchanged by the merge.
  pnpm run verify (fmt:check -> typecheck -> lint -> test): EXIT=0 (read from the log, not the task notification).
  14 test blocks, 10,201 passed, 10 skipped, 0 failed. Baseline at 5d4cd0b
  was 10,170, so +31.

  Arithmetic checked per file rather than by netting totals, because a netted
  total is exactly what hid four destroyed tests in a previous session. Test
  DECLARATIONS across all 2,526 fork test files: 18,268 -> 18,297 (+29), and
  every file that lost any is accounted for — upstream's 15 deletions plus
  GitVcsDriverCore.test.ts 76 -> 75, which is pingdotgg#8252 removing one duplicate.
  NO fork test file lost a declaration. The residual +2 between declarations
  and executed tests is `.each` expansion the declaration regex cannot see.
imsherrill pushed a commit to comprehensiveio/t3code that referenced this pull request Aug 30, 2026
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 PR author is not yet trusted in the VOUCHED list.

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants