GeezerVison is showing github.com — feat: move a chat family between projects in chatd by ibetitsmike · Pull Request #30893 · coder/coder
Conversation
ibetitsmike
commented
Oct 16, 2026
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
chatd can now move a root chat, together with its subagent chats, into a project, to another project, or out of its project. Nothing calls this yet. #30894 adds the API.
Stack (moving chats between projects, bottom first):
- This PR: the move in chatd
- feat: move chats between projects through the chat update API #30894:
PATCH /api/v2/chats/{chat} takes project_id
- feat(site/src): move chats between projects from the chat menu #30895: Move to project in the chat menu
- feat(site): drag chats onto project folders in the sidebar #30795: drag a chat onto a project folder in the sidebar
Why: today a chat keeps the project it was created with. A move must follow the family rules of archiving, because a step that runs during a move would still have the memory tools of the old project.
chatstate.Tx.SetProject runs only from W, E0 and E1, like SetArchived. SetFamilyProject() locks the root row before its subagents, in the same order as archiving, so a busy family gets ErrTransitionNotAllowed and nothing changes.
- A move to the project the chat is already in changes nothing, even while the chat runs. The check reads the locked root row, so it waits for a move that is still in flight.
- Only the root row stores
project_id, and subagents use the project of the root. After the commit, chatd publishes a new project_change watch event for each chat of the family. The move keeps updated_at, so lists keep their order.
- A root chat outside a project now has an empty memory index. When a chat leaves its project, or its project is deleted, its next turn start commits one memory index update that removes the memories the model saw there.
What to scrutinize: the lock order and the same-project check under the lock in SetFamilyProject() (chatstate/family.go), the turn-start condition in memoryIndexMessage() (memory.go), and whether the ARCHITECTURE.md text matches them.
Generated (make gen): queries.sql.go, querier.go, dbmock and dbmetrics come from queries/chats.sql. coderd/apidoc, docs/reference/api/schemas.md and typesGenerated.ts come from the new watch event kind, which is also why two chats.test.ts fixtures gain project_change: false.
Architecture doc: coderd/x/chatd/ARCHITECTURE.md lists SetProject among the transitions and in the execution state diagram (W, E0 and E1 back to themselves). It also says that a root chat's project can change after creation, and that a moved chat's next turn starts with a memory index update from the old project to the new one.
Testing
make pre-commit passes. go test passes for coderd/x/chatd/chatstate, coderd/database/dbauthz (TestMethodTestSuite) and the chatd memory tests.
TestSetFamilyProjectLocksRootFirst fails with 55P03 when a subagent row is locked first. TestSetFamilyProjectKeepsTheCurrentProject covers the same-project move during a run. The transition matrix test gains SetProject cases for W, E0 and E1.
TestMovedChatUsesNewProject runs two real turns around a move: the second turn uses the instructions and memories of the new project, and OutOfProject fails without the memory index removal.
Xum opened this PR on behalf of @ibetitsmike.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
chatgpt-codex-connector[bot] reacted with thumbs up emoji
chatd gains MoveChatToProject, which sets the project of a root chat.
Its subagent chats follow because they use the project of the root.
The chatstate machine gets a SetProject transition, allowed only from
W, E0 and E1, like SetArchived. SetFamilyProject locks the root row
before its subagents, in the same order as archiving, so a busy family
gets ErrTransitionNotAllowed and a move never overlaps a step. A move to
the project the chat is already in changes nothing, even while the chat
runs. After the commit, chatd publishes a project_change watch event for
each chat of the family.
A root chat outside a project now has an empty memory index, so a chat
that leaves its project, or whose project is deleted, gets the memories
it saw removed at its next turn start.
ibetitsmike
changed the title
mike/move chats chatd
feat: move a chat family between projects in chatd
Oct 16, 2026
This was referenced Oct 16, 2026
Codex Review Summary
This comment shows the latest Codex review activity on this pull request.
| Review |
Status |
Commit |
Review trigger |
| 📝 Code Review |
✅ Completed 2026-10-16T20:59:27.792075Z |
b06cf6d |
Manual request |
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review" or "@codex security review".
Codex reacts with 👀 while any review is running, comments if it has suggestions, and reacts with 👍 once all reviews finish with no findings.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: b06cf6d4bd
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
Codex Review: Didn't find any major issues. 👍
Reviewed commit: b06cf6d4bd
ℹ️ About Codex in GitHub
Your team has set up Codex to review pull requests in this repo. Reviews are triggered when you
- Open a pull request for review
- Mark a draft as ready
- Comment "@codex review".
If Codex has suggestions, it will comment; otherwise it will react with 👍.
Codex can also answer questions or update the PR. Try commenting "@codex address that feedback".
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Add the SetProject transition to the transition list and the execution
state diagram, note that a root chat's project can change after
creation, and describe how a moved chat's memory index is brought up to
date at its next turn.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Milestone
No milestone
Development
Successfully merging this pull request may close these issues.
Uh oh!
There was an error while loading. Please reload this page.
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
|