diff --git a/.agents/upstream-review.md b/.agents/upstream-review.md index a59baa75b..71861360b 100644 --- a/.agents/upstream-review.md +++ b/.agents/upstream-review.md @@ -1,8 +1,8 @@ --- remote: t3code-upstream branch: main -reviewed-through: "921cb3c8bc772309ccab4c422b091d0a91497a49" -reviewed-through-date: "2026-10-01" +reviewed-through: "99e08526e5ec84f294940cba5929841518c52fec" +reviewed-through-date: "2026-10-03" --- # T3 upstream decision index @@ -15,7 +15,25 @@ The maintainer authorized compatible catch-up and routine adaptations that prese ## Active cycle -None. The next cycle opens a new issue whose frozen range starts at `921cb3c8bc772309ccab4c422b091d0a91497a49`. Oh My Pi remains explicitly excluded. +None. The next cycle opens a new issue whose frozen range starts at `99e08526e5ec84f294940cba5929841518c52fec`. Oh My Pi remains explicitly excluded. + +## Completed cycle #981 through `99e08526e5` + +[Cycle #981](https://github.com/pylon-code/pylon/issues/981) closed on 2026-10-03 with all 30 sources in `921cb3c8bc772309ccab4c422b091d0a91497a49..99e08526e5ec84f294940cba5929841518c52fec` decided. The maintainer chose "adopt all properly for Pylon" for the four product sources on 2026-10-03. Each landed PR passed an independent adversarial review at its final head and green final-head CI; none was run in a browser, desktop app or device. Orchestrator v2 (#987, #989) landed during this cycle; #990 fixed v2 Codex sessions left unusable after the app-server exits. + +| Group | Sources | Outcome and remaining scope | Pylon PR / verification | +| ----------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------ | +| Small web fixes | `71a90ae70e3ff880396363809bd9bfcfd520f30c`, `ced865c224ebb7dd2cbd0f2931d6e33559b9343a`, `fa6262db3107a4c95b6ff611113e6fa0753e5948`, `20012ebd80b06a4c10ab0e78893822e7f873b2a8`, `67f640093ffea1adaa585949d87e4bc2010b0810`, `5a574a77d1bef579b01d137b81888f68eabf7d4b` | Adopted; `5a574a77d1` adapted (only the true duplicate test removed). | [#982](https://github.com/pylon-code/pylon/pull/982) | +| Desktop preview | `5cc99e1c23980d7995a13c47f969b47cb68ed1be`, `3e60fecf39f37faaca9bdf37e64b7a58229ea547` | Adopted: agent clicks no longer open Save dialogs (captured downloads bounded by size, count and expiry, with explicit human/agent navigation origin); dark-mode markdown pages. Five review rounds. | [#983](https://github.com/pylon-code/pylon/pull/983) | +| Cloned project favicons | `6ea01f8d24419019588f2be589681929d8e26b0c` | Adapted across server, client-runtime, web and mobile. | [#984](https://github.com/pylon-code/pylon/pull/984) | +| Batched GitHub polling | `10ac2f2ba495508a2a2fd469e67eda5df73f0df1` | Adapted with a per-PR fallback; two P3 follow-ups recorded on the PR. | [#985](https://github.com/pylon-code/pylon/pull/985) | +| Mobile fixes without SDK 58 | `9962e6986db68cd5537d23153e7898d6b3696b85`, `09388bf2da51b958fe5c11fb5bade155fe575e58`, `438af295fefdd04cc38629f902d7faa07cf39712`, `bed69f6ea41dab13ec37afbaaa2c911a19865f7a`, `99e08526e5ec84f294940cba5929841518c52fec` | Adopted/adapted: scene display scale, stale Live Activities, APNs/FCM thread grouping and per-thread Android suppression with Pylon relay identity. `99e08526e5` skipped: Pylon still calls both debug helpers. Rebased onto v2; Android module and app Kotlin compiled and 108 Robolectric tests passed on CI runner (run 37130302631). Needs a native build to ship. | [#986](https://github.com/pylon-code/pylon/pull/986) | +| New project from a name | `148e6deea046658639aae9fef5b349781cec39d1` | Adapted: server side had arrived with v2 (`ManagedProjectFolders.createNamedProject`); PR adds the `newProjectsRoot` contract, client `projectId` idempotency with a shared attempt store, `ProjectCreateNewIdInUseError`, same-path orphan cleanup, Pylon-neutral starter files, optional private GitHub publishing, web palette step and mobile route. Retry protection does not survive a reload. | [#993](https://github.com/pylon-code/pylon/pull/993) | +| Working sidebar section | `b33eda13998b5b0571daaf266c87f6f31af41f7d` | Adapted as a default-off beta on web/Electron: folds working, waiting-on-background and monitoring threads; unread completions, approvals, input, plans and failures stay in the inbox; manual order suspended while enabled and restored on disable; device-local return order. Mobile and legacy sidebar unchanged. | [#991](https://github.com/pylon-code/pylon/pull/991) | +| Update all providers | `0a04cc50def48121b9ece038c7df8b7fa789074b` | Adapted by extending Pylon's grouped UI: reviewed target list across connected environments, per-environment outcomes and retry, interrupted and already-running reported as unfinished, Prime and manual-only excluded. Mobile unchanged. | [#992](https://github.com/pylon-code/pylon/pull/992) | +| Threads without a project (Scratch) | `6b286ae8a20ef2e18fa70b09e92f66edd859128b` (from cycle #967), `39405f1992b4d1264730138b0fe31e07d66df4f4` | Adapted as an ordinary persisted project under `/scratch` (hidden when the base dir is in a Git checkout); per-thread folders keyed by thread or command id, reused on retry; current machine kept, sole offering machine auto-picked; deletion keeps files and never offers worktree removal; mobile shows one No project row. Older clients see it as an ordinary project (worktree mode fails); a rejected create leaves an empty folder. Closes design review #963. | [#994](https://github.com/pylon-code/pylon/pull/994) | +| Expo SDK 58 / RN 0.88 RC | `8dc07f199c2e3a4d8ec1a3997a2b9c2edf12457e`, `1e9c36023c898bfcab6dce862e105441b85ec22e`, `e41755cf8a9b07a12fefee5134cadacb514d4ad9`, `ce920f2ac893051bff2108c03346bd35340fd988` | Deferred as DEF-22. | [Deferred register](#deferred-register) | +| Skipped or covered | `41a8239849d7e6523c08edb363efdeccfb150be5`, `b91e4668fa2b8e4ac0044e65a08dc6b5e51dfbcf`, `a97a4a9d189f145afe79c3a6f8533bbf9a6b40b1`, `a3fb5392e361f6a6160cb4a6996284dbf9c1d1b3`, `094fb230e90ffb0af303a318ca716fecefd66c80`, `2731929610ecb64617ff5e066980302da328f658`, `a3abb5266080c15b2a675d7f92b517b567c427e2` | Skipped: CLI smoke (EXC-2), T3 marketing and docs, Tiptap undo (EXC-6). `a3abb52660` already covered: Pylon pins eas-cli below 22. | [#981](https://github.com/pylon-code/pylon/issues/981) | ## Completed cycle #967 through `921cb3c8bc` @@ -257,13 +275,13 @@ All three sources in the range `d1d15c67f4a5fb82fd8d5e01e5e3b288296789c3..a43f9b ## Deferred register -DEF-18, DEF-21, the design-review deferrals and exclusions EXC-1 to EXC-11 are recorded below with their revisit triggers. DEF-20 (managed ChatGPT authentication) is recorded with cycle #865 above; former DEF-19 is now EXC-11. DEF-7 and DEF-16 are completed above; remaining exact native rollback compatibility limits are documented above. Revisit a limit when the native provider exposes the missing proof or fork behavior; do not substitute relative counts. Historical reasons and revisit conditions remain in the archive and earlier cycle records. Cycle [#414](https://github.com/pylon-code/pylon/issues/414) also used DEF-17 and DEF-18 for usage price-edit and refresh-feedback fixes, retired by [#418](https://github.com/pylon-code/pylon/pull/418); they are unrelated to the current DEF-18 and to the copy-priority DEF-17 closed in [#406](https://github.com/pylon-code/pylon/pull/406). +DEF-18, DEF-21, DEF-22, the design-review deferrals and exclusions EXC-1 to EXC-11 are recorded below with their revisit triggers. DEF-20 (managed ChatGPT authentication) is recorded with cycle #865 above; former DEF-19 is now EXC-11. DEF-7 and DEF-16 are completed above; remaining exact native rollback compatibility limits are documented above. Revisit a limit when the native provider exposes the missing proof or fork behavior; do not substitute relative counts. Historical reasons and revisit conditions remain in the archive and earlier cycle records. Cycle [#414](https://github.com/pylon-code/pylon/issues/414) also used DEF-17 and DEF-18 for usage price-edit and refresh-feedback fixes, retired by [#418](https://github.com/pylon-code/pylon/pull/418); they are unrelated to the current DEF-18 and to the copy-priority DEF-17 closed in [#406](https://github.com/pylon-code/pylon/pull/406). | Deferral | Sources | Remaining behavior and reason | Opened | Revisit trigger | | ------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | ---------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | | DEF-18: activity-group timeline refinements | `592021f008010ee947c326df0452d093ead8aeb1` (#12302), `fbc8b960026e408c163ea55db8075bbf1a42d628` (#12270), `dfbb11bdd7c3f1a5575cb55d3e3abb12be025727` (#12377) | The first two refine upstream's activity-group timeline: thoughts collapse inside a tool group behind their own disclosure, and a failed tool call stays in the same activity row instead of ending the live run. The third renders plain text in collapsed thought previews. These depend on provider reasoning and activity grouping that Pylon has not adopted; none is portable independently — Pylon has no `ActivityGroupTimelineRow`, `ReasoningTraceBlock`, `expandedReasoningMessageIds`, `onToggleReasoning`, `isActivityEntry` or `reasoningMessages`, and `packages/contracts/src/orchestration.ts` has no reasoning fields at all. Pylon's `ThinkingTimelineRow` is a transient indicator, not persisted provider reasoning. Adopting them first requires `052c7ae53e46c705d5fd5dfa995275bc3100744e` (#11784, 32 files / 1,923 insertions, including contracts, client-runtime and a settings toggle) and `22539f2a428947ab218589c984b2af44e434012e` (#12147, web + mobile) — a new full-stack capability, not a catch-up adaptation. **Parked behind the orchestration upgrade at the maintainer's decision on 2026-09-19**: orchestration v2 is unmerged on `t3code-upstream/t3code/codex-turn-mapping` (800 commits off `main` at the 2026-10-01 fetch, head `4ee6c32370`; active again in late September with commits through 2026-09-30, still unmerged) and will rewrite orchestration contracts, so main-line reasoning fields adopted now risk rework. There is no orchestration v3 upstream. | 2026-09-19 | Design review [#965](https://github.com/pylon-code/pylon/issues/965) records a decision. Its inputs: Pylon resolves the orchestration v2 adoption question, or that line merges upstream: `git merge-base --is-ancestor t3code-upstream/t3code/codex-turn-mapping t3code-upstream/main`. Also triggered if Pylon adopts the activity-group timeline independently — check for `ActivityGroupTimelineRow` in `apps/web/src/components/chat/MessagesTimeline.tsx`. Dependency-driven, not time-driven; no earliest date applies. | | DEF-21: provider compatibility ranges | `96c4bfa0a27f776f7cd17df7c7115c3de79ee399` (#13130), `d4cd7d5c33122473da22ae118c93477ef7e38310` (#13328), `bd89c1302026255c62cc09278207bfaf2664da4a` (#14486) | Remote per-driver compatibility ranges, their projection and maintenance UI, and upstream's later floor change. Upstream ranges need compatibility package >=0.0.42 (Pylon is 0.0.31), and Pylon needs its own version mapping with per-driver protocol evidence and Pylon-owned manifest publication. Held in [#736](https://github.com/pylon-code/pylon/issues/736) and [#865](https://github.com/pylon-code/pylon/issues/865). | 2026-10-01 | Pylon defines its own per-driver compatibility mapping and manifest publication. | -| Threads without a project | `6b286ae8a20ef2e18fa70b09e92f66edd859128b` (#13612) | Product decision, not a straight port; source is in cycle #967. | 2026-10-01 | Design review [#963](https://github.com/pylon-code/pylon/issues/963) records a decision. | +| DEF-22: Expo SDK 58 / React Native 0.88 | `8dc07f199c2e3a4d8ec1a3997a2b9c2edf12457e`, `1e9c36023c898bfcab6dce862e105441b85ec22e`, `e41755cf8a9b07a12fefee5134cadacb514d4ad9`, `ce920f2ac893051bff2108c03346bd35340fd988` | The series pins React Native `0.88.0-rc.3`, needs native rebuilds of Pylon's terminal, diff, notification and widget modules, and replaces Pylon's Android widget with a JS-dependent one. Pylon stays on Expo 57 / RN 0.86. | 2026-10-03 | Expo supports a stable React Native release with Pylon's native dependencies, or a concrete Pylon blocker justifies the RC. Decide the Android widget replacement separately. | | Multi-model new thread | `0150c6a53b409ba3bcb45645709b649cf8708354` (#12179) | One composer action starts separate worktree/provider threads per model; changes cost, concurrency and workspace ownership. Deferred as a product decision in #736. | 2026-10-01 | Design review [#964](https://github.com/pylon-code/pylon/issues/964) records a decision. | | GitHub multi-account routing | `db6e0531e4faac0fc5ac0e12088b01bed6e7b851` (#11367), `f26198d799bb81bf754985d457a60f8a851ea895` (#11542), `5e961d3d7fc07ff1ba998bfd20bb366c2ab8c9a9` (#11672); account-router parts of `f4600d77dd7c2fa9f10e8f4500882e427fcc7e26` and `d612d12b8bb278af97b0029f8d48b2403a5f9ee6` | Routing PR operations across matching accounts and the per-environment connections layout; needs a credential-authority and contract decision. Deferred in #736 and #865. | 2026-10-01 | Design review [#966](https://github.com/pylon-code/pylon/issues/966) records a decision. |