|
1 | 1 | --- |
2 | 2 | remote: t3code-upstream |
3 | 3 | branch: main |
4 | | -reviewed-through: "bab4b6f02b8bdaf15fd32636a97f69ff657cec50" |
5 | | -reviewed-through-date: "2026-08-16" |
| 4 | +reviewed-through: "82b8a9380298509d68170961d9717be62836e490" |
| 5 | +reviewed-through-date: "2026-08-18" |
6 | 6 | --- |
7 | 7 |
|
8 | 8 | # T3 upstream review log |
@@ -1431,10 +1431,107 @@ dies with `no such column: continued_from_thread_id`. Pylon's own runtime home, |
1431 | 1431 | 40 PinOrderKey sequence. A fresh database built by this branch applied 37–44 cleanly with 36 |
1432 | 1432 | retired, so the renumbering holds end to end. |
1433 | 1433 |
|
| 1434 | +## 2026-08-18 — `bab4b6f02b8bdaf15fd32636a97f69ff657cec50..82b8a9380298509d68170961d9717be62836e490` |
| 1435 | + |
| 1436 | +Eleven upstream commits, eleven change sets, one PR each. **All eleven adopted** onto |
| 1437 | +`upstream/2026-08-18-batch`. `git cherry` reported every one absent from Pylon, so nothing |
| 1438 | +was patch-equivalent. The deferred register was empty going in and stays empty. |
| 1439 | + |
| 1440 | +**N1 (`#6466`) is the most valuable change here and applied without a single conflict.** |
| 1441 | +One GitHub pull request detail load was spending 104 GraphQL points: it asked for 100 |
| 1442 | +replies per review thread, followed every reply cursor, and refreshed every minute. The |
| 1443 | +commit adds an Effect cooldown service keyed by provider **plus host**, native rate-limit |
| 1444 | +detection for GitHub, GitLab, Bitbucket, and Azure DevOps, a GitHub GraphQL cost budget |
| 1445 | +that reserves the last 10% for interactive actions, and 10-reply pagination behind a **Load |
| 1446 | +more comments** button. Upstream measured 104 → 14 points on a 44-thread pull request. |
| 1447 | +Pylon shipped the multi-provider pull requests page in `9a886cc9d`, so this is quota |
| 1448 | +protection for a surface users already have. **Three behavior changes ride along and were |
| 1449 | +accepted deliberately:** long threads paginate instead of loading eagerly, live refresh |
| 1450 | +slows from 1 minute to 5, and the idle cutoff moves from 5 minutes to 6. |
| 1451 | + |
| 1452 | +**N3 (`#7209`) carried the only real integration cost.** It adds a |
| 1453 | +`t3code/no-native-title-tooltip` oxlint rule at **error** severity and migrates 33 native |
| 1454 | +`title` tooltips to `Tooltip`/`TooltipTrigger`/`TooltipPopup`. Because the rule lands at |
| 1455 | +error, upstream's migration is not sufficient on its own — the rule also fires on |
| 1456 | +Pylon-only surfaces upstream cannot see. Running it found **four sites in one Pylon-only |
| 1457 | +file**, `ProviderUsageMatrix.tsx`, fixed in `18fbcc8d5`. Three became styled tooltips; the |
| 1458 | +row-label cell carries `whitespace-nowrap` **without** truncation, so its `title` only |
| 1459 | +repeated text already fully visible, and it was dropped rather than converted. Predicting |
| 1460 | +the violation set by grep was unreliable — a naive scan over-reported by flagging type |
| 1461 | +annotations (`<void>`, `<typeof>`) and `title` props on custom components. Running the rule |
| 1462 | +is the only trustworthy count. |
| 1463 | + |
| 1464 | +**N5 (`#7083`) is stacked on N4 (`#7082`)** and its three conflicts against `origin/pylon` |
| 1465 | +all evaporated once N4 was applied first: they were only ever "this file does not exist |
| 1466 | +yet". Applying strictly in upstream chronological order also made N6 (`#7077`) clean, which |
| 1467 | +conflicts on two files when probed on its own because N3 rewrites them first. |
| 1468 | + |
| 1469 | +Conflicts and adaptations, all resolved Pylon-first: |
| 1470 | + |
| 1471 | +- **`ServerUpdateAction.tsx`** (N3) — upstream replaced the same span with a plain |
| 1472 | + destructive dot. Kept Pylon's `<DotMatrix state="error">`, took the tooltip wrapper. |
| 1473 | +- **`Sidebar.tsx`** (N3) — the "Dismiss Woke notification" pill. Upstream's version carries |
| 1474 | + `text-amber-700 dark:text-amber-300`; Pylon's themed `text-warning` token stays. Only the |
| 1475 | + tooltip was adopted. Verified no amber/warning drift landed elsewhere in the file. |
| 1476 | +- **`BrowserDeviceToolbar.tsx`** (N3) — Pylon's aspect-ratio lock button from `#6509`. |
| 1477 | + Upstream's `cn(aspectRatio !== null && …)` guards are constant inside each ternary branch, |
| 1478 | + so they say exactly what Pylon's direct classes say; Pylon's plainer form was kept. |
| 1479 | +- **`SettingsPanels.logic.test.ts`** (N4) — both sides append `describe` blocks at the file |
| 1480 | + tail, so the merge misaligned the closing braces. Both blocks kept. |
| 1481 | +- **`CodexSessionRuntime.test.ts`** (N5) — branding. Upstream turned the |
| 1482 | + `CODEX_DEFAULT_MODE_DEVELOPER_INSTRUCTIONS` constant into |
| 1483 | + `codexDefaultModeDeveloperInstructions(hasBrowserTools)`. Took the function, kept Pylon's |
| 1484 | + `/Pylon/` assertion. |
| 1485 | + |
| 1486 | +**Two Pylon-first fixes beyond conflict resolution** (`979d9558c`): |
| 1487 | + |
| 1488 | +1. `#7083` added `NodeAssert.doesNotMatch(instructions, /T3 Code collaborative browser/)`. |
| 1489 | + Pylon renamed that heading to "Pylon collaborative browser" long ago, so the assertion |
| 1490 | + passed **vacuously** — it proved the absence of a string that is never present on any |
| 1491 | + code path. Repointed at Pylon's actual heading, where it now has teeth. Note the sibling |
| 1492 | + `/t3-code/` assertion is correct as-is: that is the MCP **server name**, a compatibility |
| 1493 | + identifier, not product copy. |
| 1494 | +2. The new `IntegrationsSettings.tsx` module comment named T3 Code. Rebranded. |
| 1495 | + |
| 1496 | +`routeTree.gen.ts` is generated, so its diff was checked rather than trusted: the route |
| 1497 | +imports in the merged file match the route files on disk exactly, `settings.integrations` |
| 1498 | +included. `pnpm-lock.yaml` is untouched by this batch — no change set adds a dependency. |
| 1499 | + |
| 1500 | +| Change set | Upstream | Decision | Pylon reference | Rationale or revisit condition | |
| 1501 | +| ---------- | --------------------- | -------- | --------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | |
| 1502 | +| N1 | `ba46f922a` / `#6466` | adopted | `08c8b390d` | Shared per-provider/host rate-limit cooldown, GitHub GraphQL cost budget reserving the final 10% for user actions, and paginated review-thread replies. 104 → 14 GraphQL points on a 44-thread PR. Clean cherry-pick across 41 files. Contract change: new `pullRequests.threadComments` RPC. | |
| 1503 | +| N2 | `82b8a9380` / `#7172` | adopted | `5f5efc3fa` | A late `task.progress` carrying no `status` was re-adding an already-idle task to the live set, leaving the sidebar on **Working** with zero live agents. Status-free progress can now refresh a live task but never resurrect a dead one. | |
| 1504 | +| N3 | `fee10def1` / `#7209` | adopted | `3dde64f61` | New `no-native-title-tooltip` oxlint rule at error severity plus the migration of 33 sites. Three Pylon conflicts above; four Pylon-only violations fixed separately in `18fbcc8d5`. | |
| 1505 | +| N4 | `949feb61e` / `#7082` | adopted | `0e3fd4617` | New **Settings → Integrations** page: default preview viewport, zoom, appearance, and floating-preview auto-show. Renders disabled on web clients because these are desktop-local Chromium preferences — the correct multi-surface call, made upstream. | |
| 1506 | +| N5 | `cd096b9ad` / `#7083` | adopted | `cf36558bd` | **Agent browser access** toggle, on by default. Withholds the MCP credential in `prepareMcpSession`, the single place one is minted, so one branch covers all five providers. Takes effect on new sessions only; a running agent keeps its credential for up to 24h. | |
| 1507 | +| N6 | `c7e6d711d` / `#7077` | adopted | `9f208cab3` | A review verdict becomes a first-class timeline row with the reviewer's avatar instead of a grey lowercase word inside a collapsed comments group, and the empty markdown block beneath an approval is gone. `COMMENTED`-only reviews still group as conversation. | |
| 1508 | +| N7 | `cebac353d` / `#7321` | adopted | `03579737e` | Mobile rendered structured-input options as label-only chips while web and desktop showed descriptions the contract already carried. Closes a multi-surface gap. | |
| 1509 | +| N8 | `33a8b07dd` / `#7276` | adopted | `a6b9659a0` | `SymbolView` does not redraw when only the SF Symbol name changes, so the Snoozed and Settled shelf chevrons froze at first render pointing opposite directions. Now one `chevron.down` plus a state-driven 180° transform. No continuous animation. | |
| 1510 | +| N9 | `a4cc1367b` / `#7219` | adopted | `c9815194a` | The usage breakdown table was `.slice(0, 8)` over a window that can hold 90 periods, with nothing on screen saying so. Cap removed, newest first. | |
| 1511 | +| N10 | `13458e651` / `#7296` | adopted | `05c123968` | One `mx-0!` class centering the context usage meter's SVG. | |
| 1512 | +| N11 | `3723722f7` / `#7364` | adopted | `1d1851a91` | Bot cleanup removing a second `expect(only()).toBe(true)`. Verified genuinely redundant — `claimWorkspaceBasenameLookup` returns a pure comparison, so the repeat asserts nothing new. Adopted only to keep the file aligned with upstream and conflict-free later. | |
| 1513 | + |
| 1514 | +### Verification |
| 1515 | + |
| 1516 | +Typecheck clean across `contracts`, `shared`, `client-runtime`, `web`, `desktop`, `server` |
| 1517 | +(exit 0; remaining output is pre-existing Effect `suggestion` diagnostics) and `mobile` |
| 1518 | +separately. Targeted tests: **server 35 files / 707 tests**, **web 32 files / 245 tests**, |
| 1519 | +**desktop 1 / 7**, **oxlint plugin 1 / 11** — all passing. `vp lint` over the touched trees |
| 1520 | +reports **0 errors**; `vp fmt --check` clean over 2595 files. |
| 1521 | + |
| 1522 | +One new lint warning arrived with N5 and was removed in `4719407a6`: `#7083` imports |
| 1523 | +`EnvironmentId` into `ProviderService.test.ts` without using it. Confirmed dead upstream too, |
| 1524 | +so it is worth reporting rather than a merge artifact. |
| 1525 | + |
| 1526 | +**Not verified in a real client.** This batch was integrated and checked statically only. The |
| 1527 | +user-visible surfaces that would most repay a pass are the new Settings → Integrations panel |
| 1528 | +(N4/N5), the pull request detail (N1's Load more comments and N6's verdict rows), and the two |
| 1529 | +mobile changes (N7, N8). |
| 1530 | + |
1434 | 1531 | ## Deferred register |
1435 | 1532 |
|
1436 | 1533 | _The register is currently empty. DEF-1 and DEF-2 were adopted on 2026-08-11 |
1437 | | -(see the sixth batch above); every batch since, through 2026-08-16, deferred |
| 1534 | +(see the sixth batch above); every batch since, through 2026-08-18, deferred |
1438 | 1535 | nothing new. Entries are removed once adopted or skipped, so an |
1439 | 1536 | empty register means nothing is waiting._ |
1440 | 1537 |
|
|
0 commit comments