Conversation
Reviewer's GuideThe PR completes Issues integration by consolidating the standalone Issues surface into a lazy-loaded Repository tab, migrating persisted panel state, sharing validated project-scoped filters with the full Issues page, and normalizing search requests to the 200-character host limit. Sequence diagram for normalized Issues search requestssequenceDiagram
actor User
participant IssuesView
participant normalizeIssueSearchQuery
participant useDebouncedValue
participant IssueListHost
User->>IssuesView: enter search text
IssuesView->>normalizeIssueSearchQuery: normalizeIssueSearchQuery(query)
normalizeIssueSearchQuery-->>IssuesView: trimmed query capped at 200 characters
IssuesView->>useDebouncedValue: useDebouncedValue(searchQuery, 250)
useDebouncedValue-->>IssuesView: debounced query
IssuesView->>IssueListHost: list({query: debounced query})
alt whitespace-only query
IssuesView->>IssueListHost: list({query omitted})
end
State diagram for Repository issue selection and panel migrationstateDiagram-v2
[*] --> Repository
Repository --> RepositoryIssues: selectRepositoryView(issues)
RepositoryIssues --> RepositoryIssues: selectRepositoryIssue(target)
RepositoryIssues --> IssueDetail: open selected issue
IssueDetail --> RepositoryIssues: return to list
RepositoryIssues --> RepositoryHistory: selectRepositoryView(history)
RepositoryIssues --> RepositoryPullRequests: selectRepositoryView(pull-requests)
LegacyIssues --> RepositoryIssues: migratePersistedRightPanelState
RepositoryHistory --> RepositoryIssues: selectRepositoryView(issues)
RepositoryPullRequests --> RepositoryIssues: selectRepositoryView(issues)
Flow diagram for shared issue filter preferencesflowchart LR
FilterChange[Change state, involvement, label, sort, or order] --> issuePanelPreferencePatch
issuePanelPreferencePatch --> Preferences[(Environment and project storage key)]
Preferences --> resolveIssuePanelPreferences
resolveIssuePanelPreferences --> IssuesPanel
resolveIssuePanelPreferences --> IssuesPage
SearchChange[Change search text] --> TemporaryQuery[Temporary route or component state]
TemporaryQuery --> IssueListHost
File-Level Changes
Possibly linked issues
Tips and commandsInteracting with Sourcery
Customizing Your ExperienceAccess your dashboard to:
Getting Help
|
There was a problem hiding this comment.
Hey - I've found 1 issue
Prompt for AI Agents
Please address the comments from this code review:
## Individual Comments
### Comment 1
<location path="apps/web/src/rightPanelStore.ts" line_range="599-610" />
<code_context>
+ : rawActiveSurfaceId === "git-history"
+ ? "history"
+ : persistedRepositoryView;
+ const issueSelectionSource =
+ (persistedIssues?.kind === "issues" ? persistedIssues.selected : undefined) ??
+ (persistedRepository?.kind === "repository"
+ ? persistedRepository.selectedIssue
+ : undefined);
+ const repositorySurface: RightPanelSurface = {
+ id: "repository",
+ kind: "repository",
+ view: repositoryView,
+ ...(persistedIssues !== undefined || issueSelectionSource !== undefined
+ ? { selectedIssue: normalizeIssueSelection(issueSelectionSource) }
+ : {}),
+ };
let repositoryIncluded = false;
</code_context>
<issue_to_address>
**issue (broader_impact):** A malformed legacy Issues selection takes precedence over a valid repository `selectedIssue`: the nullish coalescing expression selects the malformed object, `normalizeIssueSelection` converts it to null, and the valid repository selection is discarded during migration.
**Triggers:** When persisted state contains both a legacy `issues` surface with a non-null malformed `selected` value and a repository surface with a valid `selectedIssue`.
**Suggested fix:** Decode each candidate before applying precedence, and fall back to the repository selection when the legacy selection fails `decodePersistedIssueSelection`.
</issue_to_address>| const issueSelectionSource = | ||
| (persistedIssues?.kind === "issues" ? persistedIssues.selected : undefined) ?? | ||
| (persistedRepository?.kind === "repository" | ||
| ? persistedRepository.selectedIssue | ||
| : undefined); | ||
| const repositorySurface: RightPanelSurface = { | ||
| id: "repository", | ||
| kind: "repository", | ||
| view: repositoryView, | ||
| ...(persistedIssues !== undefined || issueSelectionSource !== undefined | ||
| ? { selectedIssue: normalizeIssueSelection(issueSelectionSource) } | ||
| : {}), |
There was a problem hiding this comment.
issue (broader_impact): A malformed legacy Issues selection takes precedence over a valid repository selectedIssue: the nullish coalescing expression selects the malformed object, normalizeIssueSelection converts it to null, and the valid repository selection is discarded during migration.
Triggers: When persisted state contains both a legacy issues surface with a non-null malformed selected value and a repository surface with a valid selectedIssue.
Suggested fix: Decode each candidate before applying precedence, and fall back to the repository selection when the legacy selection fails decodePersistedIssueSelection.
823c2ff to
6b1c526
Compare
c4256db to
98c657c
Compare
6b1c526 to
7096f90
Compare
98c657c to
0de5387
Compare
Series and review order
feat/issues-pageThese are open review units for one proposal, stacked on pingdotgg/t3code#6315. Part 1 targets Bilal's fork; parts 2–4 target the preceding branch in our fork. The complete series is available at the final branch. The series is open for review; feedback on product direction and implementation is welcome.
Short demo: History paging, Pull Requests, Issues, and retained History state.
Prior discussion: the original proposal and Bilal's invitation to stack it. This records the invitation, not upstream acceptance of the design.
What changed
Adds Bilal's Issues view to Repository and shares saved filters with the full Issues page. Search text stays temporary and exact as typed; a shared helper trims and caps the value sent to the host at the existing 200-character limit.
Why
Users can move between History, Issues and Pull Requests in the same repository context without replacing the full-page workflows.
Dependency and review
Part 4 of 4, based on
stack/6315-series-repository. Review only this incremental Issues integration. This review PR lives in our fork because that is where the preceding branch exists.Verification
This exact cumulative layer passed dev-server checks on both Issues screens: 250 raw characters yielded a 200-character query; whitespace-only input omitted the query; spaced search text was trimmed for the request. Closed/Open filters carried between panel and page. Search text reset on panel remount. Real issue rows rendered and no page exceptions were captured.
The shared-helper change passed 19 focused tests, web typecheck and scoped lint with existing React warnings. These do not constitute verification of every tracker provider or connection mode.
UI
Before: Repository contains History and Pull Requests.

After: Issues joins the Repository tabs.

The full page remains available:

The original proposal's images and discussion are preserved. The standalone general fixes are not included.
Developed with Astra 6 in Codex/T3 Code and reviewed with Fable 5.1.
Summary by Sourcery
Integrate Issues into the Repository panel and share its saved filtering experience with the full Issues page.
New Features:
Bug Fixes:
Enhancements:
Documentation:
Tests:
Chores: