GeezerVison is showing github.com — feat(site/src): add the chat project page by f0ssel · Pull Request #30379 · coder/coder
Conversation
f0ssel
commented
Oct 5, 2026
•
edited
Loading
Uh oh!
There was an error while loading. Please reload this page.
- Experiment (
chat-projects). Third of four stacked PRs split out of feat: add chat project folders to the sidebar #29583.
- Adds
/agents/projects/:projectId: the new-chat page framed by the project, with the form locked to the project's organization and created chats joining the project. An "Edit project" button opens the project dialog.
- The page remounts per project, so the create error, the pending state, and the edit dialog reset. A create still in flight opens its chat when it finishes, as it does from
/agents. Drafts are scoped to the project.
- New chat clears the plain
/agents draft only when clicked on /agents itself. Clicking it from any other route (a project, a chat, settings, automations, board) keeps that draft; settings, automations, and board previously cleared it.
- A project that isn't in the user's list shows "Project not found" once the list has refetched. A failed lookup shows a retryable error; a failed background refetch keeps the loaded project usable.
- Stories for the loading, error, not-found, and loaded states live in
AgentsPageLayout.stories.tsx.
Stack: #30377 → #30378 → this PR → #29583
Generated with Coder Agents on behalf of @f0ssel.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
This was referenced Oct 5, 2026
coder-agents-review[bot] reacted with rocket emoji
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
|
Chat: Review posted | View chat
Requested: 2026-10-05 21:54 UTC by @f0ssel
Review history
- R1 (2026-10-05): 9 reviewers, 4 Nit, 1 P2, 10 P3, 12 P4, COMMENT. Review
- R2 (2026-10-05), 4 Nit, 1 P2, 10 P3, 12 P4, COMMENT. Review
- R3 (2026-10-05): 9 reviewers, 6 Nit, 1 P1, 1 P2, 11 P3, 18 P4, REQUEST_CHANGES. Review
- R4 (2026-10-05): 9 reviewers, 7 Nit, 1 P1, 1 P2, 11 P3, 25 P4, COMMENT. Review
- R5 (2026-10-05): 9 reviewers, 8 Nit, 1 P1, 1 P2, 12 P3, 27 P4, COMMENT. Review
- R6 (2026-10-05): 7 reviewers, 9 Nit, 1 P1, 1 P2, 12 P3, 31 P4, COMMENT. Review
- R7 (2026-10-05): 8 reviewers, 9 Nit, 1 P1, 1 P2, 13 P3, 32 P4, COMMENT. Review
- R8 (2026-10-05): 6 reviewers, 9 Nit, 1 P1, 1 P2, 13 P3, 34 P4, COMMENT. Review
- R9 (2026-10-05): 5 reviewers, 9 Nit, 1 P1, 1 P2, 13 P3, 34 P4, APPROVE. Review
deep-review v0.13.0 | Round 9 | eb8a483..1277fc4
Last posted: Round 9, 58 findings (1 P1, 1 P2, 13 P3, 34 P4, 9 Nit), APPROVE. Review
Finding inventory
Finding inventory: PR #30379
Findings
| # |
Sev |
Status |
Location |
Summary |
Round |
Reviewer |
Posted |
| CRF-1 |
P2 |
Author fixed (30fd661) |
router.tsx:899 |
PR title scope does not contain site/src/router.tsx; title check fails |
R1 |
Netero |
Yes |
| CRF-2 |
P3 |
Author fixed (30fd661) |
AgentCreatePage.tsx:123 |
No test for project-scoped create error |
R1 |
Netero |
Yes |
| CRF-3 |
P3 |
Author fixed (b684e19) |
AgentCreatePage.tsx:112 |
No test for cached project surviving failed refetch |
R1 |
Netero |
Yes |
| CRF-4 |
P3 |
Author fixed (b684e19) |
AgentCreatePage.tsx:446 |
isCreating reads unscoped createMutation.isPending |
R1 |
Netero, Mafuuu R3 |
Yes |
| CRF-5 |
P3 |
Author fixed (b684e19) |
AgentCreatePage.tsx:402 |
New page states have no Storybook story |
R1 |
Netero |
Yes |
| CRF-6 |
P4 |
Author fixed (30fd661) |
AgentCreatePage.tsx:480 |
No test for updateProjectMutation.reset() on dialog open |
R1 |
Netero |
Yes |
| CRF-7 |
P4 |
Author fixed (30fd661) |
AgentCreatePage.test.tsx:179 |
Wrapper and file-level mocks duplicate renderWithAuth and leak into old tests |
R1 |
Netero |
Yes |
| CRF-8 |
Nit |
Author fixed (30fd661) |
AgentCreatePage.test.tsx:65 |
Deleted comment explaining AgentPageHeader mock |
R1 |
Netero |
Yes |
| CRF-9 |
Note |
Note (body) |
router.tsx:899 |
New route has no in-tree links until #29583 |
R1 |
Netero |
No |
| CRF-10 |
P3 |
Author fixed (30fd661) |
AgentCreatePage.tsx:108 |
Stale cached project list redirects an existing project to /agents |
R1 |
Nami, Mafuuu, Knov |
Yes |
| CRF-11 |
P3 |
Author fixed (30fd661) |
AgentCreatePage.tsx:247 |
Missing project redirects to /agents with no message |
R1 |
Leorio P3, Nami P4 |
Yes |
| CRF-12 |
P4 |
Author fixed (30fd661) |
AgentCreatePage.tsx:419 |
Loading project loader lacks flex-1, layout jumps |
R1 |
Nami |
Yes |
| CRF-13 |
P3 |
Author fixed (30fd661) |
AgentCreatePage.tsx:120 |
Per-value project scoping instead of remounting page per projectId |
R1 |
Pariston |
Yes |
| CRF-14 |
P3 |
Author fixed (30fd661) |
AgentCreatePage.test.tsx:584 |
No test asserts project header, saved edit, or dialog close |
R1 |
Bisky |
Yes |
| CRF-15 |
P4 |
Author fixed (30fd661) |
AgentCreatePage.test.tsx:332 |
Flag-disabled test passes regardless of the flag |
R1 |
Bisky |
Yes |
| CRF-16 |
P4 |
Author fixed (30fd661) |
AgentCreatePage.test.tsx:326 |
organization_id assertion only checks the stub |
R1 |
Bisky |
Yes |
| CRF-17 |
P4 |
Author fixed (30fd661) |
AgentCreatePage.test.tsx:488 |
History navigation test timed out once in 7 runs |
R1 |
Bisky |
Yes |
| CRF-18 |
P3 |
Author fixed (30fd661) |
AgentCreatePage.tsx:403 |
Lookup error alert title does not say the project failed to load |
R1 |
Leorio |
Yes |
| CRF-19 |
P4 |
Author fixed (30fd661) |
AgentCreatePage.test.tsx:425 |
Hand-rolled deferred promise instead of Promise.withResolvers |
R1 |
Ging-TS |
Yes |
| CRF-20 |
P3 |
Author fixed (30fd661) |
AgentCreatePage.test.tsx:83 |
AgentCreateForm mock comment out of date |
R1 |
Gon P2 |
Yes |
| CRF-21 |
P4 |
Author fixed (4d5db6e) |
AgentCreatePage.test.tsx:316 |
Test comment duplicates production comment |
R1 |
Gon P2 |
Yes |
| CRF-22 |
P4 |
Author fixed (30fd661) |
AgentCreatePage.tsx:106 |
isProjectMissing comment repeats chatProject doc |
R1 |
Gon P2 |
Yes |
| CRF-23 |
P4 |
Author fixed (30fd661) |
AgentCreatePage.tsx:109 |
projectLookupError comment restates condition |
R1 |
Gon P2 |
Yes |
| CRF-24 |
P4 |
Author fixed (30fd661) |
AgentCreatePage.tsx:118 |
createError comment restates ternary |
R1 |
Gon P2 |
Yes |
| CRF-25 |
P4 |
Author fixed (b684e19) |
AgentCreatePage.tsx:417 |
Loader comment states what before why |
R1 |
Gon P2 |
Yes |
| CRF-26 |
Nit |
Author fixed (30fd661) |
AgentCreatePage.test.tsx:69 |
realForm comment uses vague "composer" |
R1 |
Gon P2 |
Yes |
| CRF-27 |
Nit |
Author fixed (30fd661) |
AgentCreatePage.test.tsx:68 |
mountedLockedOrganizationIds records renders, not mounts |
R1 |
Gon |
Yes |
| CRF-28 |
Nit |
Author fixed (30fd661) |
AgentCreatePage.tsx:470 |
isEditing and closeDialog name one state two ways |
R1 |
Gon |
Yes |
| CRF-29 |
Note |
Author fixed (30fd661) |
AgentCreatePage.tsx:402 |
Form key="draft" carries draft text across projects |
R1 |
Nami |
No |
| CRF-30 |
P4 |
Author fixed (b684e19) |
AgentCreatePage.tsx:413 |
Stale list plus failed refetch shows Project not found instead of retryable error |
R3 |
Netero |
Yes |
| CRF-31 |
P4 |
Author fixed (4188f73, b684e19) |
AgentCreatePage.tsx:459 |
No test covers the page passing draftScope |
R3 |
Netero |
Yes |
| CRF-32 |
P1 |
Author fixed (b684e19) |
AgentCreatePage.tsx:125 |
isProjectMissing true on /agents when project list is cached; composer replaced by Project not found |
R3 |
Pariston |
Yes |
| CRF-33 |
P4 |
Author fixed (b684e19) |
AgentCreatePage.test.tsx:359 |
Prefill hold test never has the project pending |
R3 |
Bisky |
Yes |
| CRF-34 |
P3 |
Author fixed (b684e19) |
AgentCreatePage.tsx:94 |
Remount comment omits that the key re-locks the form's organization |
R3 |
Gon |
Yes |
| CRF-35 |
P4 |
Author fixed (b684e19) |
ProjectComposerFooter.tsx:13 |
Doc comment restates the component name |
R3 |
Gon P2 |
Yes |
| CRF-36 |
P4 |
Author fixed (b684e19) |
AgentCreatePage.test.tsx:68 |
Mock comment first clause restates the ternary |
R3 |
Gon P2 |
Yes |
| CRF-37 |
Nit |
Author fixed (b684e19) |
AgentCreatePage.tsx:122 |
selectedProject names a project nothing selects |
R3 |
Gon |
Yes |
| CRF-38 |
Nit |
Author fixed (b684e19) |
AgentCreatePage.test.tsx:141 |
renderProjectPage also renders the plain page |
R3 |
Gon |
Yes |
| CRF-39 |
Note |
Note (body) |
commit 4d5db6e |
Commit subject stops mid-phrase; disappears at squash merge |
R3 |
Leorio |
No |
| CRF-40 |
P4 |
Author fixed (b684e19) |
AgentCreatePage.tsx:98 |
Remount key "default" collides with /agents/projects/default |
R3 |
Knov |
Yes |
| CRF-41 |
OOS |
Out of scope (body) |
AgentCreateForm.tsx:602 |
lint:compiler fails on base branch file |
R3 |
Ging-React |
No |
| CRF-42 |
OOS |
Out of scope (body) |
coderd/chat_projects.go:148 |
No single-project lookup by ID alone; frontend infers missing from list |
R3 |
Pariston |
No |
| CRF-43 |
OOS |
Out of scope (body) |
AgentCreatePage.tsx:376 |
Plain /agents create in flight navigates after leaving; predates PR |
R3 |
Mafuuu |
No |
| CRF-44 |
P4 |
Author fixed (b9f3f88) |
AgentsPageLayout.stories.tsx:1110 |
New project page stories assert nothing; loaded project page has no story |
R4 |
Netero |
Yes |
| CRF-45 |
Note |
Note (body) |
ProjectComposerFooter.stories.tsx:17 |
EditDialogOpen clicks but asserts nothing about the dialog |
R4 |
Netero |
No |
| CRF-46 |
P4 |
Author fixed (8fa8a8b) |
AgentCreatePage.tsx:95 |
Create on A failing after switching to B drops the error and the draft; comment covers only success |
R4 |
Mafuuu |
Yes |
| CRF-47 |
P4 |
Author fixed (8fa8a8b) |
AgentCreatePage.tsx:94 |
Remount comment credits outer key with resetting the dialog, which the form's own key does |
R4 |
Gon P2 |
Yes |
| CRF-48 |
Nit |
Author fixed (8fa8a8b) |
AgentCreatePage.test.tsx:64 |
MockAgentCreateFormProps is the real form's props type |
R4 |
Gon |
Yes |
| CRF-49 |
P4 |
Author fixed (PR description edit) |
AgentCreatePage.tsx:94 |
PR description says no mutation state carries over, contradicting kept in-flight navigation |
R4 |
Leorio |
Yes |
| CRF-50 |
P4 |
Author fixed (8fa8a8b) |
ProjectComposerFooter.tsx:38 |
onOpenChange wrapper and closeDialog repeat a guard the dialog already applies |
R4 |
Zoro |
Yes |
| CRF-51 |
P4 |
Author fixed (8fa8a8b) |
AgentCreatePage.tsx:256 |
Flag-off redirect runs after all content hooks instead of in the wrapper |
R4 |
Zoro |
Yes |
| CRF-52 |
P4 |
Author fixed (8fa8a8b) |
AgentCreatePage.test.tsx:125 |
enableChatProjects duplicates enableExperiment |
R4 |
Zoro |
Yes |
| CRF-53 |
OOS |
Out of scope (body) |
AgentCreateForm.tsx:711 |
submitDraft deletes the stored draft before the create resolves |
R4 |
Mafuuu |
No |
| CRF-54 |
OOS |
Out of scope (body) |
ChatProjectDialog.tsx:58 |
onOpenChange typed boolean but only ever called with false |
R4 |
Zoro |
No |
| CRF-55 |
Note |
Dropped by orchestrator (subsumed by CRF-52, which renames enableExperiment) |
AgentCreatePage.test.tsx:155 |
enableExperiment name does not say which experiment |
R4 |
Gon |
No |
| CRF-56 |
Note |
Note (body) |
commit b684e19 |
Commit subject is 85 characters; disappears at squash merge |
R4 |
Leorio |
No |
| CRF-57 |
P3 |
Author fixed (b9f3f88) |
AgentCreatePage.test.tsx:95 |
Stub computes projectId itself, so no test checks the real form sends the project ID |
R5 |
Bisky |
Yes |
| CRF-58 |
P4 |
Author fixed (b9f3f88) |
AgentCreatePage.tsx:429 |
Retry gives no feedback on the stale-list error path |
R5 |
Chopper |
Yes |
| CRF-59 |
Note |
Note (body) |
AgentCreatePage.tsx:296 |
Create 404 for a deleted project leaves the page framed by it |
R5 |
Chopper |
No |
| CRF-60 |
P4 |
Author fixed (b9f3f88) |
AgentCreatePage.tsx:100 |
"its message" does not say the typed message is lost |
R5 |
Gon |
Yes |
| CRF-61 |
Nit |
Author fixed (b9f3f88) |
AgentCreatePage.tsx:268 |
chatProjectId alias adds a second name for the project ID |
R5 |
Gon |
Yes |
| CRF-62 |
Note |
Note (body) |
commit 8fa8a8b |
Two more commit subjects over 72 characters; disappear at squash merge |
R5 |
Leorio |
No |
| CRF-63 |
P4 |
Author fixed (b9f3f88..6e06900) |
AgentCreatePage.test.tsx:249 |
Plain-route test cannot fail since the stub no longer sets projectId |
R6 |
Netero |
Yes |
| CRF-64 |
P4 |
Author fixed (b9f3f88..6e06900) |
AgentCreatePage.test.tsx:393 |
Retry test does not assert the spinner |
R6 |
Bisky |
Yes |
| CRF-65 |
P4 |
Author fixed (b9f3f88..6e06900) |
AgentCreatePage.test.tsx:55 |
realForm comment lists users and is out of date again |
R6 |
Gon |
Yes |
| CRF-66 |
Nit |
Author fixed (b9f3f88..6e06900) |
AgentsPageLayout.stories.tsx:1110 |
"screenshot" is a second name for the Chromatic snapshot |
R6 |
Gon |
Yes |
| CRF-67 |
P4 |
Author fixed (6e06900) |
AgentCreatePage.tsx:129 |
!isFetching is false when the mount refetch is paused offline; existing project shows Project not found |
R6 |
Meruem |
Yes |
| CRF-68 |
P4 |
Author fixed (aae451f) |
AgentCreatePage.tsx:129 |
No test covers isFetchedAfterMount; reverting to !isFetching passes |
R7 |
Netero |
Yes |
| CRF-69 |
P3 |
Author fixed (aae451f) |
AgentsPageLayout.tsx:539 |
New chat draft-clear check excludes route params instead of matching /agents; still clears draft on automations and board |
R7 |
Meruem P3, Hisoka P4, Kite P4 |
Yes |
| CRF-70 |
Note |
Note (body) |
AgentCreatePage.tsx:129 |
isFetchedAfterMount relies on chatProjects() refetching on mount; a staleTime would leave the loader up |
R7 |
Hisoka, Kite |
No |
| CRF-71 |
P4 |
Author fixed (1277fc4) |
AgentsPageLayout.test.tsx:53 |
No test covers New chat from a conversation route keeping the draft |
R8 |
Netero |
Yes |
| CRF-72 |
P4 |
Author fixed (1277fc4) |
AgentsPageLayout.tsx:540 |
Hand-written trailing-slash regex untested; useMatch("/agents") does the match |
R8 |
Bisky, Zoro |
Yes |
| CRF-73 |
Note |
Note (body) |
AgentsPageLayout.tsx:540 |
New chat from settings now keeps the draft; PR description does not mention it |
R8 |
Kite |
No |
Downgrade gate notes (R1):
- CRF-20: keep-argument for P2: an inaccurate comment sends future test authors to the stub without explanation. Downgraded to P3 because the consequence is confusion while writing a test, not wrong product behavior.
- CRF-21 to CRF-25: keep-argument for P2: duplicated or restating comments drift from the code. Leorio rated the same comments as accurate and useful. Downgraded to P4: no behavior or reader is misled today; the cost is maintenance drift.
- CRF-26: keep-argument for P2: "composer" is ambiguous between stub and real form. Downgraded to Nit: wording only.
Downgrade gate notes (R3):
- CRF-25, CRF-35, CRF-36: keep-argument for P2: vague or restating comments mislead readers. Kept at P4 to match the R1 decision for the same class: no behavior or reader is misled into a bug.
- CRF-34: kept at P3. Keep-argument: the outer key is the only thing re-locking the form organization on project-to-project navigation (cache returns B at once), and the comment invites replacing it with a mutation reset. Leorio called the comment accurate; accuracy and completeness differ, higher wins.
- CRF-32: kept at P1. Pariston reproduced it; orchestrator confirmed
chatProject(undefined) shares the list key and selects null, and isProjectMissing has no projectId guard. Consequence: the default new-chat page is unusable while the list is cached with the experiment on.
Downgrade gate notes (R4):
- CRF-47: keep-argument for P2: the comment misstates what the outer key protects, so a reader may keep or remove it for the wrong reason. Downgraded to P4: orchestrator confirmed the footer renders inside AgentCreateFormContent keyed by project, so removing the dialog clause loses nothing and keeping it misleads no behavior; same class as R1 and R3 comment findings.
- CRF-55: keep-argument: the generic name hides the experiment it turns on. Dropped as a separate item because CRF-52's fix replaces both helpers with one
enableExperiments(...).
Downgrade gate notes (R5):
- CRF-60: Leorio judged the comment accurate (
message is the CreateChatOptions field). Keep-argument: a reader can read "its message" as the error message and miss that the typed text is lost. Kept at P4 (higher of the two).
- CRF-59: kept as Note. Keep-argument for a finding: every resend fails with 404 until the user leaves. Note because the error text is accurate and leaving recovers; Chopper asked for no required change.
Downgrade gate notes (R7):
- CRF-69: Hisoka and Kite rated P4, Kite also listed the unchanged routes as out of scope. Kept at P3 (higher wins): Meruem reproduced draft loss on two routes, the fix is on the line this PR changes and removes the class (structural alternative), and the PR adds one more exclusion to the list instead.
Contested and acknowledged
Round log
Round 1
Full panel (round 1). Netero first pass: 1 P2, 4 P3, 2 P4, 1 Nit, 1 Note; no P0, panel proceeded. Law not run (effective additions 596). Panel: ging-ts, ging-react, nami, pariston, mafuuu, bisky, gon, leorio, wildcard knov. Gon's agent lost the workspace connection while writing; resumed the same agent to write the file. Totals: 1 P2, 10 P3, 12 P4, 4 Nit, 2 Note. Reviewed against f9b5713..2bc038d.
Round 2 update
BLOCKED. CRF-21 silent (comment still duplicated at AgentCreatePage.test.tsx:241-242, thread resolved without reply). 26 findings claimed fixed in 30fd661, unverified by panel. No review panel. Reviewed against b2e7ea8..30fd661.
Round 3
Churn guard PROCEED (CRF-21 fixed in 4d5db6e). Restructure round (new ProjectComposerFooter.stories.tsx; page rewritten into a keyed wrapper), full panel: ging-ts, ging-react, nami, pariston, mafuuu, bisky, gon, leorio, wildcard knov. Netero advisory: re-raised CRF-3, CRF-5; new CRF-30, CRF-31. Panel: re-raised CRF-4 (Mafuuu), CRF-25 (Gon); new 1 P1, 1 P3, 4 P4, 2 Nit, 1 Note, 3 OOS. Netero verified CRF-2, 6, 10, 13 by mutation; Bisky verified CRF-14 to CRF-17. Reviewed against b2e7ea8..4d5db6e.
Round 4
Churn guard PROCEED (14 addressed in 4188f73, b684e19). Restructure round (ProjectComposerFooter.tsx and AgentsPageLayout.stories.tsx newly in the PR diff; form props changed to project), full panel: ging-ts, ging-react, nami, pariston, mafuuu, bisky, gon, leorio, wildcard zoro. Netero verified CRF-3, 4, 10, 30, 31, 32, 40 by mutation; Pariston verified CRF-32. New: 7 P4, 1 Nit, 2 Note, 2 OOS, 1 dropped. Reviewed against e140387..b684e19.
Round 5
Churn guard PROCEED (8 addressed in 8fa8a8b and a PR description edit; CRF-44 partly fixed, re-raised). Fix round (no files added, no exported signature changed since R4). Panel: zoro, gon, mafuuu, leorio (raised R4 findings touched), ging-ts, ging-react, nami, bisky (changed-file specialists), wildcard chopper. Netero re-raised CRF-44. New: 1 P3, 2 P4, 1 Nit, 2 Note. Ging-React observed lint:compiler now passes (CRF-41 no longer reproduces). Reviewed against 59355bb..8fa8a8b.
Round 6
Churn guard PROCEED (5 addressed in b9f3f88). Fix round. Panel: bisky, chopper, gon (raised R5 findings touched), ging-ts, ging-react, nami, wildcard meruem. Netero: CRF-63; verified CRF-44, 57, 58 by mutation. New: 4 P4, 1 Nit (plus CRF-63). Reviewed against 8da1221..b9f3f88.
Round 7
Churn guard PROCEED (5 addressed). Fix round; AgentsPageLayout.tsx and its test newly in the diff (6dfc393), so added nami, ging-react, hisoka for that file. Panel: bisky, gon, meruem, nami, ging-ts, ging-react, hisoka, wildcard kite. Netero: CRF-68. New: 1 P3 (convergent), 1 P4 (Netero), 1 Note. Reviewed against eb8a483..6e06900.
Round 8
Churn guard PROCEED (CRF-68, CRF-69 addressed in aae451f). Fix round. Panel: meruem, hisoka, kite (raised CRF-69), bisky, nami, wildcard zoro. Netero: CRF-71; verified CRF-68 and CRF-69 by mutation (Meruem, Hisoka, Kite, Zoro reproduced). New: 2 P4 (one convergent), 1 Note. Reviewed against eb8a483..aae451f.
Round 9
Churn guard PROCEED (CRF-71, CRF-72 addressed in 1277fc4). Fix round. Panel: bisky, zoro (raised CRF-72), nami, ging-react, wildcard knov. Netero: no findings; verified both fixes by mutation (Bisky, Nami also). No new findings. No open in-scope findings remain. Reviewed against eb8a483..1277fc4.
About deep-review
CRF = Coder Review Finding (P0-P4, Nit, Note)
| Reviewer |
Focus |
| Bisky |
tests |
| Chopper |
ops/errors |
| Churn-guard |
change verification |
| Ging |
language modernization |
| Gon |
naming |
| Hisoka |
edge cases |
| Killua |
perf |
| Kite |
change integrity |
| Knov |
contracts |
| Knuckle |
SQL |
| Komugi |
flake/determinism |
| Kurapika |
security |
| Law |
decomposition |
| Leorio |
docs |
| Luffy |
product |
| Mafu-san |
process |
| Mafuuu |
contracts |
| Melody |
dispatch/pairing |
| Meruem |
structural |
| Nami |
frontend |
| Netero |
mechanical checks |
| Pariston |
premise testing |
| Pen-botter |
product gaps |
| Razor |
verification |
| Robin |
duplication |
| Ryosuke |
Go arch |
| Takumi |
concurrency |
| Zoro |
shape |
🤖 Managed by Coder Agents.
|
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
…its own file
Keeps it next to ProjectComposerHeader instead of inside AgentCreatePage.
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.
This PR adds the /agents/projects/:projectId page, which locks the new-chat form to the project's organization and sends project_id on create. Findings: 1 P2, 10 P3, 12 P4, 4 Nit.
Six of the seven comments the PR adds or edits restate the code next to them or repeat a fact documented elsewhere, and one is out of date; the inline comments give rewrites.
Notes:
site/src/router.tsx:899: nothing in the tree links to the new route yet (buildAgentProjectPath has no callers), so it is reachable only by typed URL until #29583.
site/src/pages/AgentsPage/AgentCreatePage.tsx:402: AgentCreateForm keeps key="draft" on /agents and on every project page, so draft text typed under one project carries over to another project and to the plain new-chat page.
🤖 This review was automatically generated with Coder Agents.
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.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
Count project field limits in code points like the server, show save
errors with ErrorAlert and server field validations, disable Save for
an unchanged edit, fall back to the folder glyph when a project icon
fails to load, invalidate chat entities and searches when a project is
deleted, and add tests and stories for the dialog and icon.
…r lock
Scope text and attachment drafts per destination instead of per
organization, keep the lock fixed per mount, and never save choices made
while locked as the user's defaults.
Remount the page per project, show a not-found message instead of
redirecting, and move the page tests onto renderWithAuth.
f0ssel
changed the title
feat(site/src/pages/AgentsPage): add the chat project page
feat(site/src): add the chat project page
Oct 5, 2026
coder-agents-review[bot] reacted with rocket emoji
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.
Commit 30fd661 addresses 26 of the 27 findings from the first review. A review panel has not checked those fixes yet, because one finding has no fix and no reply: the test comment at AgentCreatePage.test.tsx:241-242 still repeats the production comment above the "Loading project" loader, and its thread was resolved without a reply. Delete the test comment, or reply on the thread explaining why it should stay. The full review resumes after that.
🤖 This review was automatically generated with Coder Agents.
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
coder-agents-review[bot] reacted with rocket emoji
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
Key the form on the project so its lock and drafts are fixed per mount,
derive the denial kind once, and keep MCP and reasoning choices made in
a project out of the user's defaults.
Save was disabled only by the caller's isSubmitting, which turns on after
Formik's async validation, so a double-click sent two saves (and would
create two projects). The dialog now also waits on its own pending submit,
and awaits a promise returned by onSubmit.
…to tmp-ui-form
# Conflicts:
# site/src/pages/AgentsPage/components/ChatsSidebar/dialogs/ChatProjectDialog.tsx
Sorry, something went wrong.
Uh oh!
There was an error while loading. Please reload this page.
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-06T08:35:26.239936Z |
1277fc4 |
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.
💡 Codex Review
Here are some automated review suggestions for this pull request.
Reviewed commit: 1277fc425b
ℹ️ 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.
…to the dialog
The dialog keeps Save disabled until the returned promise settles, so the
edit can't be sent twice.
…DOM in the project page tests
The project page tests asserted presence, absence, and attributes of
rendered elements, which FE1 leaves to the story screenshots. They now
check requests, navigation, and the props the page hands to the form. The
reopened-after-failed-save state moves to a ProjectComposerFooter story.
…to f0ssel/chat-projects-ui-data
…on for the organization selector
The ProjectComposer story covers the hidden selector visually; the test
keeps asserting the persisted organization and workspace values.
…d text in project page tests
The prefill tests read the stub form's rendered text, and the history test
read the edit dialog's input value. They now check the prefill prop handed
to the form and the name sent in the PATCH request.
…n while the form is locked
A project page cleared the user's saved organization when that
organization had been revoked. Gate the persistence effect on
isUserOrgSelectionActive so a lock neither writes nor removes it.
…ough the submit payload
Replace DOM-absence checks in the per-project draft test with the
onCreateChat message and file IDs, and query the Attach workspace
trigger by role instead of a non-null closest() lookup.
…stories, assert submits in tests
Move the project denial copy checks from Vitest into Pixel stories
(unlisted organization, product-wide, no permitted organization) and
drop the assertion-only play function. Assert the project draft, MCP,
and loading tests through the onCreateChat payload instead of
rendered output.
jaaydenh
added a commit
that referenced
this pull request
Oct 6, 2026
…30377)
- Experiment (`chat-projects`). First of four stacked PRs split out of
#29583, which is now the sidebar on top of this stack.
- API client and React Query factories for chat projects
(`chatProjects.ts`, keys colocated), `MockChatProject`,
`ChatProjectIcon`, the create/edit `ChatProjectDialog` (Formik; the
caller owns the mutation), and `buildAgentProjectPath`.
- `getDefaultOrganizationId` now returns `undefined` instead of `""`
when there is no default organization, so the sidebar in #29583 can tell
"no default organization" apart and fall back to another one. Its two
existing callers already fall back either way and behave the same.
- `getFormHelpers` accepts an optional `measureLength`, so the length
counter can count something other than UTF-16 units. Existing callers
keep the default `value.length`.
- Field limits count code points after trimming, matching the server,
with a live counter near the limit. Save stays disabled for an edit that
changes nothing once trimmed. The caller resets its mutation before
opening the dialog so an old save error doesn't reappear.
Stack: **this PR** → #30378 → #30379 → #29583
---
Generated with Coder Agents on behalf of @f0ssel.
---------
Co-authored-by: Jaayden Halko <[email protected]>
# Conflicts:
# site/src/pages/AgentsPage/components/ChatsSidebar/dialogs/ChatProjectDialog.stories.tsx
# site/src/pages/AgentsPage/components/ChatsSidebar/dialogs/ChatProjectDialog.test.tsx
# site/src/pages/AgentsPage/components/ChatsSidebar/dialogs/ChatProjectDialog.tsx
jaaydenh
added a commit
that referenced
this pull request
Oct 6, 2026
- Experiment (`chat-projects`). Second of four stacked PRs split out of
#29583.
- `AgentCreateForm` takes a `project` (its ID and organization) and
`header`/`footer` slots. The form remounts when the project changes.
- The organization is pinned to the project's and its selector is
hidden. The organization, workspace, and MCP servers chosen in a project
are never saved as the user's defaults. Submits carry `projectId` so the
caller can't forget it.
- Text and attachment drafts are kept per project, so a project's draft
never shows up in another project's composer or the plain one.
`useFileAttachments` takes an optional `storageKey` for this.
- When the project's organization isn't permitted, the form names it in
a project-specific denial, but only when chats are otherwise allowed;
otherwise the product-wide denial stays.
- `ProjectComposerHeader` shows the project's name and description above
the composer (stories: `ProjectComposer`,
`ProjectComposerOrganizationDenied`).
Stack: #30377 → **this PR** → #30379 → #29583
---
Generated with Coder Agents on behalf of @f0ssel.
---------
Co-authored-by: Jaayden Halko <[email protected]>
Uh oh!
There was an error while loading. Please reload this page.
Reviewers
jaaydenh
jaaydenh approved these changes
+1 more reviewer
Reviewers whose approvals may not affect merge requirements
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.
|