fix(web): promoting a draft thread no longer logs a React key warning - #15458
Conversation
React logs a console error in dev whenever a key arrives through a props spread, which happened every time a draft chat was promoted to a server thread. Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
ApprovabilityVerdict: Approved at Macroscope's review found this PR approvable — This is a one-line, self-contained React warning fix that preserves the existing ChatView key and remount behavior. It introduces no new capability, configuration change, schema impact, or production-side effect. You can add or adjust custom eligibility rules. Learn more. |
|
Navigate logical layers of code changes, visualize relationships, and explore their blast radius. No actionable comments were generated in the recent review. 🎉 ℹ️ Recent review info⚙️ Run configuration
📒 Files selected for processing (1)
Included review availability: This review used your included allowance. Your plan provides up to 10 included reviews per hour; 8 remain after this review. 📝 WalkthroughWalkthroughThe server-thread ChangesChatView key prop
Priority: ⬇️ Low Estimated code review effort: 1 (Trivial) | ~2 minutes Change: Bug fix Suggested reviewers: Merge Risk: ⚪ Minimal · up to This focused change removes the development warning without introducing an evidenced behavior or merge-blocking risk. 🚥 Pre-merge checks | ✅ 5✅ Passed checks (5 passed)
✨ Finishing Touches🧪 Generate unit tests (beta)
Comment |
…pingdotgg#15458) Signed-off-by: Yordis Prieto <yordis.prieto@gmail.com>
## What's Changed * fix(server): registry test stubs no longer outlive the test run by @yordis in pingdotgg/t3code#15457 * test(server): the registry's fake Claude CLI is a fixture file, not a generated string by @yordis in pingdotgg/t3code#15463 * refactor(clients): share opening a machine's No project folder by @bmdavis419 in pingdotgg/t3code#14759 * test(server): the git-ssh wrapper's fake SSH script is a fixture file, not a generated string by @yordis in pingdotgg/t3code#15480 * test(server): the ACP registry's fake npm is a fixture file, not a generated string by @yordis in pingdotgg/t3code#15483 * test(server): the ACP registry's fake uv is a fixture file, not a generated string by @yordis in pingdotgg/t3code#15484 * feat(clients): step a new thread to the next machine from the keyboard by @juliusmarminge in pingdotgg/t3code#15391 * fix(web): promoting a draft thread no longer logs a React key warning by @yordis in pingdotgg/t3code#15458 * test(server): the text generation's fake Claude CLI is a fixture file, not a generated string by @yordis in pingdotgg/t3code#15479 * fix(mobile): keep dictation running across navigation behind an edge pill by @juliusmarminge in pingdotgg/t3code#15502 * fix(client-runtime): relay disconnects no longer show as thread errors by @juliusmarminge in pingdotgg/t3code#15470 * fix(web): subagent cards name the provider account by @SunkenInTime in pingdotgg/t3code#15493 * fix(server): read paginated review replies when watching PRs by @eimexdev in pingdotgg/t3code#15427 * fix(server): offer one-click provider updates for every install by @maria-rcks in pingdotgg/t3code#15416 * fix(mobile): keep the dictation timer from shifting width by @juliusmarminge in pingdotgg/t3code#15504 * fix(relay): T3 Connect links no longer fail on colliding prepared statements by @juliusmarminge in pingdotgg/t3code#15411 * fix(server): sqlite transactions wait for the write lock instead of failing by @juliusmarminge in pingdotgg/t3code#15488 * fix(web): unpin button shows the pin-off icon on hover by @flamboh in pingdotgg/t3code#15425 * fix(mobile): make queued message removal tappable by @PixPMusic in pingdotgg/t3code#15417 * fix(web): keep workspace panels below dialogs by @maria-rcks in pingdotgg/t3code#15454 * fix(clients): Working section keeps its order while agents finish and wake by @t3dotgg in pingdotgg/t3code#15418 * feat(mobile): full-screen simulator viewer with on-demand controls by @juliusmarminge in pingdotgg/t3code#15551 * fix(client-runtime): closing a busy stream no longer drops the connection by @t3dotgg in pingdotgg/t3code#15563 * feat(web): add shift-held pull request quick actions by @maria-rcks in pingdotgg/t3code#15549 * fix: expanded tool calls show their output, empty ones don't expand by @maria-rcks in pingdotgg/t3code#15505 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261004.2644...v0.0.46-nightly.20261004.2648 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261004.2648
## What's Changed * fix(server): registry test stubs no longer outlive the test run by @yordis in pingdotgg/t3code#15457 * test(server): the registry's fake Claude CLI is a fixture file, not a generated string by @yordis in pingdotgg/t3code#15463 * refactor(clients): share opening a machine's No project folder by @bmdavis419 in pingdotgg/t3code#14759 * test(server): the git-ssh wrapper's fake SSH script is a fixture file, not a generated string by @yordis in pingdotgg/t3code#15480 * test(server): the ACP registry's fake npm is a fixture file, not a generated string by @yordis in pingdotgg/t3code#15483 * test(server): the ACP registry's fake uv is a fixture file, not a generated string by @yordis in pingdotgg/t3code#15484 * feat(clients): step a new thread to the next machine from the keyboard by @juliusmarminge in pingdotgg/t3code#15391 * fix(web): promoting a draft thread no longer logs a React key warning by @yordis in pingdotgg/t3code#15458 * test(server): the text generation's fake Claude CLI is a fixture file, not a generated string by @yordis in pingdotgg/t3code#15479 * fix(mobile): keep dictation running across navigation behind an edge pill by @juliusmarminge in pingdotgg/t3code#15502 * fix(client-runtime): relay disconnects no longer show as thread errors by @juliusmarminge in pingdotgg/t3code#15470 * fix(web): subagent cards name the provider account by @SunkenInTime in pingdotgg/t3code#15493 * fix(server): read paginated review replies when watching PRs by @eimexdev in pingdotgg/t3code#15427 * fix(server): offer one-click provider updates for every install by @maria-rcks in pingdotgg/t3code#15416 * fix(mobile): keep the dictation timer from shifting width by @juliusmarminge in pingdotgg/t3code#15504 * fix(relay): T3 Connect links no longer fail on colliding prepared statements by @juliusmarminge in pingdotgg/t3code#15411 * fix(server): sqlite transactions wait for the write lock instead of failing by @juliusmarminge in pingdotgg/t3code#15488 * fix(web): unpin button shows the pin-off icon on hover by @flamboh in pingdotgg/t3code#15425 * fix(mobile): make queued message removal tappable by @PixPMusic in pingdotgg/t3code#15417 * fix(web): keep workspace panels below dialogs by @maria-rcks in pingdotgg/t3code#15454 * fix(clients): Working section keeps its order while agents finish and wake by @t3dotgg in pingdotgg/t3code#15418 * feat(mobile): full-screen simulator viewer with on-demand controls by @juliusmarminge in pingdotgg/t3code#15551 * fix(client-runtime): closing a busy stream no longer drops the connection by @t3dotgg in pingdotgg/t3code#15563 * feat(web): add shift-held pull request quick actions by @maria-rcks in pingdotgg/t3code#15549 * fix: expanded tool calls show their output, empty ones don't expand by @maria-rcks in pingdotgg/t3code#15505 **Full Changelog**: pingdotgg/t3code@v0.0.46-nightly.20261004.2644...v0.0.46-nightly.20261004.2648 Upstream release: https://github.com/pingdotgg/t3code/releases/tag/v0.0.46-nightly.20261004.2648
Problem
ThreadRouteView.tsxpasses theChatViewkey through a conditional props spread ({...(nextChatViewKey ? { key: nextChatViewKey.key } : {})}). Whenever a draft chat is promoted to a server thread, the spread object has an ownkeyproperty, and React's dev JSX runtime logs:This fires on a common flow: sending the first message in a new chat.
Change
Pass the key directly with
key={nextChatViewKey?.key}. When there is no promoted key this iskey={undefined}, which React treats the same as no key, so remount behavior does not change.Scope and approval
Very small, focused fix for an obvious bug: a one-line change in one file that removes a React runtime error log without changing behavior.
Verification
react@19.2.6react-jsx-dev-runtime.development.js:jsxDEVcheckshasOwnProperty.call(config, "key")on the spread config and callsconsole.errorwith the message above. With a literalkeyattribute, the compiler passes the key as a separate argument, so the config never carries it.apps/web/src/components/ThreadRouteView.tsxare clean.apps/webhas no component-render test harness.