Filed by the SaaS launch review. Priority P2.6 — severity medium, category correctness.
Problem
The issue cache key is f"{repo}|{page}|{per_page}|{search}|{label}|{user_id}", so a '|' inside search text collides with the label field and serves one search's results for a different filter — wrong data, no error. The user's search string is joined verbatim into the GitHub search query alongside repo:/is: qualifiers, so a search containing repo:other/thing reaches repositories outside the connected one — in a hosted deployment the operator's PAT becomes enumerable through a text field. And a search-API 403 (secondary rate limit) is reported as 'missing issues:read scope', sending users to regenerate a PAT that was never the problem.
Evidence
codeframe/ui/routers/github_integrations_v2.py:384
codeframe/core/github_issues_service.py:422
codeframe/core/github_issues_service.py:95
Acceptance criteria
Dependencies
Atomic by construction: one developer, one focused session.
Problem
The issue cache key is f"{repo}|{page}|{per_page}|{search}|{label}|{user_id}", so a '|' inside search text collides with the label field and serves one search's results for a different filter — wrong data, no error. The user's search string is joined verbatim into the GitHub search query alongside repo:/is: qualifiers, so a search containing
repo:other/thingreaches repositories outside the connected one — in a hosted deployment the operator's PAT becomes enumerable through a text field. And a search-API 403 (secondary rate limit) is reported as 'missing issues:read scope', sending users to regenerate a PAT that was never the problem.Evidence
codeframe/ui/routers/github_integrations_v2.py:384codeframe/core/github_issues_service.py:422codeframe/core/github_issues_service.py:95Acceptance criteria
repo:other/xsearch still scopes to the connected repoDependencies
Atomic by construction: one developer, one focused session.