Repository navigation
Upstream checkpoint cd8c2c593275 (452 commits, #20967..) + main 12c3dc37 - #161
Conversation
…y compatible (pingdotgg#18563) Signed-off-by: Pujitha Paladugu <10557236+pujitha24@users.noreply.github.com> Co-authored-by: Pujitha Paladugu <10557236+pujitha24@users.noreply.github.com>
…ice (pingdotgg#18664) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
… thread already got (pingdotgg#21155) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…#21200) Co-authored-by: Mnigos <56691628+Mnigos@users.noreply.github.com>
…20024) Co-authored-by: Sinan <sinan@Mac-mini-von-Sinan.local> Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
…ingdotgg#21103) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ile (pingdotgg#21062) Co-authored-by: yaacovcorcos <190350601+yaacovcorcos@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…g#21042) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ngdotgg#21191) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…extension (pingdotgg#18857) Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
…ge list (pingdotgg#21269) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…tgg#18393) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: GPT-6.1 Sol <noreply@openai.com>
…ngdotgg#19431) Co-authored-by: PR Batch Tester <agent@local.test> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
…ing upstream (pingdotgg#15393) Co-authored-by: abderbj <115119179+abderbj@users.noreply.github.com> Co-authored-by: Julius Marminge <51714798+juliusmarminge@users.noreply.github.com> Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com>
…gg#21893) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
…ex shells (pingdotgg#18301) Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com>
…dotgg#15710) Co-authored-by: Claude Fable 5.1 <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com>
… is on (pingdotgg#16015) Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Kalven Schraut <kalvens@rtvision.com>
Co-authored-by: Simone <185146821+Lucenx9@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com>
…overed space (pingdotgg#17910) Co-authored-by: Julius Marminge <julius0216@outlook.com>
…ches (pingdotgg#12291) Co-authored-by: Julius Marminge <julius0216@outlook.com>
Co-authored-by: Julius Marminge <julius0216@outlook.com>
…otgg#12583) Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com> Co-authored-by: Julius Marminge <julius0216@outlook.com>
…16662) Co-authored-by: Julius Marminge <julius0216@outlook.com>
…g#14954) Co-authored-by: SAPHID <saphid@users.noreply.github.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com> Co-authored-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com> Co-authored-by: Julius Marminge <julius0216@outlook.com>
pingdotgg#15818) Co-authored-by: Julius Marminge <julius0216@outlook.com>
True merge of pingdotgg/t3code through cd8c2c5 (452 upstream first-parent commits after 16918b5, pingdotgg#20967..) into Lecturn main 7ce4e26. Brings upstream's React Compiler adoption across the mobile app (Metro compiler, coverage ratchet, no-manual-memo and hookless-use lint), MCP apps that open full screen only after a tap, full-screen visual replies that keep a gap from the frame edge, html previews that say how their browser exited, PR sheet link/unlink/watch and badge work on mobile, Android fold and navigation fixes, provider update and Claude probe recovery fixes, MCP tool usage counting, Lecturn Connect link retries, sectioned orchestration instructions, storage cleanup reaching archived worktrees, the pull-request link input and list-line helpers moved into shared packages, and about 125 web fixes (sidebar subagent highlight, command palette focus and query retention, keybinding recording, composer fade, narrow-window questions). Lecturn keeps its identity (lecturn_ MCP tools, LECTURN_* env, PostHog delivery instead of upstream's ingest endpoint), its migration numbering (upstream 64 runs as fork 79), its sidebar drag shape, its Git sheet sections and its iOS system font. The resolution guide records the deliberate differences. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Brings main's Lecturn Apps (#159), relay renewal and retired-gateway DNS recovery (#155, #156), nightly quality shards (#157), the npm manifest fix (#158) and AGENTS.md (#160) onto the upstream-integrated tree. Lecturn Apps now runs on the upstream changes: MCP App cards in app threads and the embed keep the tap-only full-screen gate (pingdotgg#18548) through the one McpAppFrame; Apps mode highlights a subagent's parent row (pingdotgg#15163); app-thread notifications use the hashed tag (pingdotgg#12289); the mobile Apps code follows the React Compiler rules; Android split view reaches Apps through "Show <tab>" toolbar buttons now that upstream dropped the rail (pingdotgg#21071). Server: upstream migration 64 runs as fork 81 after Apps migrations 79/80; socket auth keeps the feature.used callback through AppRpcAuthorization; OpenCode v2 re-adds Lecturn MCP each turn and reports activation failures. The unused upstream useNowSecond hook is dropped with the working timer the fork did not take. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- storage cleanup treats Git 2.56's "gitfile does not point to a valid repository" as a checkout Git no longer recognizes, like the older wording (CI runners moved to Git 2.56; upstream's match failed there) - OpenCode v2 reports a failed Lecturn MCP add only while the server is not up yet, so a failed per-turn re-add no longer leaves a stale notice - release CLI single-executable builds stamp LECTURN_TELEMETRY_CHANNEL - the embed timeline's citation fold lookup passes keepLatestTurnOpen - upstream test fixtures use lecturn- temp prefixes and /lecturn/ paths - comments for the desktop single-instance lock and Android workspace navigation match the code; resolution guide entries for the above Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…iler Any focused screen with an inspector pane (Review with a diff, tablet Files, Thread with an inspector open) hit "Maximum update depth exceeded". The registration hook's useFocusEffect callback depended on a useEffectEvent result, which React recreates every render, and the provider's pane derivations could not be memoized, so each render deactivated and re-registered the inspector. Port upstream 325a7e2 (pingdotgg#21867), which memoizes the four pane derivations, and keep the inspector registration in a ref so the focus callback is constant. Owner-only deactivation and focus-scoped registration are unchanged. A new test compiles the real file with the React Compiler and fails on the old code. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
- web sidebar: upstream pingdotgg#11122's status slot reserved the hover actions' width at rest, and fork card rows put the title on that line, so every title lost about 42% of its width. SidebarRowStatusLine reserves only the visible status at rest; on pinned or Woke rows the hover actions open to the left of the markers, so the pin still stays put (pingdotgg#11122's intent) - mobile queue: QueueDragHandle's gesture was rebuilt on every render because the compiler memoized it on useEffectEvent results; it now comes from a builder held in useState (upstream's SettingsDragHandle pattern) and is rebuilt only when `disabled` changes - mobile ThreadFeed reads the content inset with `.get()` (upstream 80b48cc) - the compiler-backed mobile tests share one loader that inlines babel helpers, so they no longer depend on pnpm's hidden NODE_PATH hoist Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
With the Apps tab, the Android threads sidebar header had four buttons, and at tablet split-view width (280 dp sidebar) "Lecturn" wrapped onto two lines. The wordmark is now single-line, and below a 320 dp row "Show apps" and "Show pull requests" move into a "More actions" menu, the overflow pattern upstream's AndroidScreenHeader already uses for the other sidebars. Also port the ThreadNavigationSidebar half of upstream 325a7e2 (pingdotgg#21867): the sidebar's lookup maps are memoized again, so rows stop re-rendering on every sidebar render. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The inline-button cutoff in the threads sidebar header was a fixed 320 dp, but Android buttons grow with the app font, so from base font 18 "Lecturn" was shortened with an ellipsis. resolveSidebarHeaderButtons now uses the scaled button size and wordmark width: four inline buttons when the full wordmark fits, otherwise Show apps/Show pull requests move into "More actions", and at the largest fonts Settings joins them. Default-font behavior is unchanged. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
| yield* Fiber.join(notified); | ||
| // The reply is read with real file I/O after the clock moves, and its | ||
| // events reach the collector fiber after the frame counts as processed. | ||
| yield* awaitUntil(() => texts(2).at(-1) === "a2 found README.md", "a2 reply"); |
There was a problem hiding this comment.
The new reply check calls awaitUntil, which polls for at most 5,000 scheduler yields. AGENTS.md requires backend tests to await a specific event or Deferred and forbids polling. Slow file I/O can outlast those yields.
Signal a Deferred when the collector receives the expected reply and await it instead. Other new adapter tests also use this helper. This repository requirement must be satisfied before merging.
Context Used: AGENTS.md (source)
Note: If this suggestion doesn't match your team's coding style, reply to this and let me know. I'll remember it for next time!
There was a problem hiding this comment.
Confirmed: this breaks the AGENTS.md no-polling rule. We're not changing it in this PR. The awaitUntil helper is already used 178 times in this file on main, and this test came from upstream pingdotgg#21310. Upstream later deleted the test (pingdotgg#22557) and made the adapter harnesses event-driven with a polling lint rule (pingdotgg#22565). Those changes arrive with the next upstream checkpoint, and fixing this one call site would mean adding an event hook to the shared harness.
There was a problem hiding this comment.
That context makes sense. awaitUntil still violates the no-polling rule in this test, but replacing this one call would require an event hook in the shared harness, and the upcoming checkpoint removes the test while making the harness event-driven. I agree this is better handled there rather than expanding this PR’s scope. I’m withdrawing the “must be fixed before merge” framing; this remains a known follow-up, not a blocker for this PR.
- migration 81 (upstream 64) writes migrated pull request links' linkedAt as the unknown date, as main did, so a thread renamed after its PR merged still auto-settles (pingdotgg#18232's filter dropped it) - the pnpm-global update probe checks the pnpm the update actually runs (server environment), so a provider PATH with a newer pnpm no longer adds --allow-build to an older pnpm - Connect targets with an owning account report session-pending only while the platform reports unsynced accounts, so an expired mobile account gets the sign-in failure instead of retrying forever - delegated task analytics keep only the newest 1,000 reported task ids Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Upstream checkpoint cd8c2c5
True merge of
pingdotgg/t3codethroughcd8c2c593275147d7f253ca0fd93dbe6088237b1(452 upstream first-parent commits after accepted16918b57d675, pingdotgg#20967 onward) into Lecturn main7ce4e260b283(commitb32b5409), then a merge of current main12c3dc37(commit18f0d00a), then review and evidence fixes. 253 upstream conflicts and 31 main conflicts resolved into Lecturn's architecture and identity.What changes
reactCompilerCoverage.test.tsratchetsKNOWN_BAILOUTS, andlecturn/no-manual-memoplus the hookless-use rule apply toapps/mobile. Fork-only mobile files follow the same conversions. Also PR sheet link/unlink/watch and badges, Android fold and navigation fixes; the Android rail is gone, the phone bottom bar has Chats/Apps/Pulls, and split view switches lists from the sidebar header.lecturn_tools), Lecturn Connect link retries, sectioned orchestration instructions, storage cleanup reaching archived worktrees, pull-request link canonicalization (upstream migration 64, fork id 81).Regressions found during verification and fixed here
1d008797): under the React Compiler, any focused screen with an inspector pane (Review with a diff, tablet Files) hit "Maximum update depth exceeded". The same code is in upstream cd8c2c5; this ports upstream's later fix 325a7e2 (fix(mobile): the split-view sidebar no longer crashes in an update loop pingdotgg/t3code#21867) and keeps inspector registration in a ref. Found by the Android capture.8f8501ab): upstream fix(web): pinned thread marker stays put when hovering the row pingdotgg/t3code#11122's status slot reserved the hover actions' width at rest, and Lecturn's card rows put the title on that line, so titles lost 42% of their width (121 to 70 px). Titles are back to 121 px; a hovered pinned row keeps its pin in place, as fix(web): pinned thread marker stays put when hovering the row pingdotgg/t3code#11122 intends, at the cost of showing about 14 px of title while hovered.b9336fdf): with the Apps tab, "Lecturn" wrapped onto two lines in the 280 dp sidebar. The wordmark is single-line, and below a 320 dp row "Show apps"/"Show pull requests" move into a "More actions" menu.d34966da,8f8501ab): the queue drag gesture is no longer rebuilt every render; OpenCode reports a failed Lecturn MCP add only while MCP is not up yet; release CLI builds stamp the telemetry channel; upstream test fixtures use Lecturn names.d8ec6bc9): migrated pull request links keep the unknown link date, so threads edited after their PR merged still auto-settle; the pnpm update probe checks the pnpm the update runs; an expired mobile Connect account gets the sign-in error instead of reconnecting forever; delegated-task analytics keep a bounded dedupe set. The polling note on one upstream adapter test is left: upstream deletes that test and makes the harness event-driven in the next checkpoint.d34966da): runners moved to Git 2.56, which rewords "not a git repository"; storage cleanup now accepts both wordings. Main has the same latent failure.Lecturn decisions (recorded in
RESOLUTION_GUIDE.md)Checks
Review
d34966da. Fresh reviews of each later commit, including a sweep of both apps for the bug classes the captures exposed (effect events as dependencies, unmemoized providers, upstream row-layout assumptions): pass with nits, none open.d8ec6bc9, one left with the reason in its thread.Follow-ups (on main or upstream already, not changed here)
GitVcsDriverCore.ts:510,GitManager.ts:197) only know the pre-2.56 "not a git repository" wording.developer_instructions./draft/<id>directly crashes the composer on the dev server, on main too.Evidence heads
The final head is
d8ec6bc9; its last commit changes only server, provider-core and client-runtime code, none of it in a captured scene. Web images were captured on8f8501ab; nothing underapps/web,apps/server,apps/desktoporpackageschanged after it. Android images were captured onb9336fdf;3f7510adthen changed only the header cutoff for larger app fonts inThreadListToolbar.tsx, with identical default-font output (the showcase's font), covered by unit tests. The MCP App full-screen scene uses a real stub MCP App, not a test double.UI evidence: isolated synthetic fixture (web dev server, stub Codex, headless Chrome 1440x900 @1x dark)
Before = Lecturn main 12c3dc3; after = PR head 8f8501a (upstream checkpoint cd8c2c5 merged with main, plus review fixes). Every after image was captured on 8f8501a.
No regressions. The sidebar title-width regression found on 18f0d00 (pingdotgg#11122 status slot: 83 px slot, 70 px titles) is fixed on 8f8501a (rows 18 and 18h). Every other difference is an expected upstream change.
Penguin Lab draft, opened from the sidebar (a direct load of /draft/<id> crashes on both sides, see notes).
User message, expanded work log (reasoning, commentary, command row, file-change row), markdown answer.
README.md expanded (an uncommitted edit in the fixture repo).
Cmd+K over the thread.
Local environment card and Environments.
Stub Codex selected, Claude disabled.
30 days over synthetic Codex rollouts.
Same data, Tokens view.
#12-#14 linked by URL (GitHub disabled, rows unsynced).
GitHub disabled in the fixture, so it shows the could-not-load state.
Same thread at mobile width.
An html_render reply opened with Open full screen. The page has a full-bleed background.
560x330 crop of the same state around the frame's top-left corner.
Synthetic penguin-board MCP App, fresh page load with no tap. The app prints the host's answer.
Exit full screen if open, wait 6.5 s, then click the app's own button.
Synthetic connected app Colony Tracker. Sidebar in Apps mode, ChatHeader app breadcrumb.
Scout-north child of the app thread.
Scout-north child of a Penguin Lab thread.
Top of the page.
Scrolled to Search engine (after) or Open links in (before).
Typed "new thr", chose New thread in..., then Backspace back.
New thread in the Antarctic Field Station ... project.
Cmd+K New thread without a project, one stub turn. Header breadcrumb.
260x600 crop of the sidebar from a second run with the same steps as scene 1. Rows at rest, no hover.
"Make remote coding feel local" pinned from its context menu; pointer parked away. 260x600 crop.
Pointer on the pinned row. 260x160 crop.
Pointer on "Put the command center in your pocket". 260x160 crop.
The same scripted steps ran on both sides (
replay.sh). Each side used an isolated synthetic fixture home seeded by Lecturn main, with a stub Codex, Claude off and HOME pointed at the fixture. The github.com host was disabled and the host label is masked to "Fixture Mac". New fixture pieces for this checkpoint:Every after image was captured on 8f8501a; nothing is reused from 18f0d00. Scenes 1, 18 and 18h come from a second run of each side with the same short step list. A pixel diff (channel delta >40) backs every "same" verdict: what remains is relative times, the turn clock and the server port.
Fixed since 18f0d00: on 18f0d00 every sidebar row reserved the width of its hover actions at rest (t3code#11122), so titles shrank from 121 to 70 px. 8f8501a measures 121 px again.
Pinned rows: on hover, the pin and status now stay in place, as pingdotgg#11122 intends. The trade-off is that a hovered pinned row shows only about 14 px of title (row 18h).
Pre-existing, on both sides: loading or reloading
/draft/<id>directly (where/redirects) crashes the composer on the dev server with "[tiptap error]: The editor view is not available". Scene 1 therefore opens the draft from the sidebar.Not shown:
Android showcase (phone and 10-inch tablet, dark, Lecturn theme; GitHub-hosted ubuntu-24.04 capture-only harness)
Before = Lecturn main 12c3dc3 (run 40772717467). After = this PR at b9336fd (run 40786928438). Both runs are green, with 12/12 scenes per side. Synthetic showcase fixture only.
Phone (1080×1920)
10-inch tablet, split view (1440×2560, about 800 dp)
Sidebar header crop, top to bottom: main 12c3dc3 (rail layout), the intermediate 1d00879 (wordmark wrapped, fixed since), and this PR's b9336fd:
🤖 Generated with Claude Code