You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Computed Issue status, status grouping and filters #29
Inputs: GitHub state and close reason, native blockers, task branch, linked PRs, review mark review/independent on the PR head counted only from a trusted account, and T3 thread activity ("working now", including subagents and Prism jobs).
Default grouping by status in table order, Done and Not planned collapsed; Status filter; Linked filter.
Issue rows show linked threads; clicking a linked Issue in a thread panel opens the Issues side panel.
GitHub read. The per-page GraphQL read from Browse Issues: list, filters, parent tree and side panel #27 now also returns viewer, open blockers (issueDependenciesSummary.blockedBy) and closing PRs. Each closing PR comes with state, draft, head SHA and the review/independent mark on its head. A mark counts only when the query's viewer posted it. The read makes no per-Issue calls. Cost is 3 points per 100 rows, up from 2.
Grouped by status, with Done and Not planned collapsed. Group by parent stays available.
Status and Linked filters.
Rows show linked threads; a click opens the thread.
Start thread is on rows and in the side panel, with title, URL and body.
Clicking a linked Issue in a thread's panel opens the Issues side panel, through the new issue route search parameter.
Docs. User docs updated. New feature map block issues-status, whose sharedFiles are the route and docs/user/source-control.md.
Commands and results
apps/server: T3CODE_ISSUES_LIVE=1 T3_LIVE_GITHUB=1 vp test run src/issues/IssueService.live.test.ts src/issues/issueStatus.live.test.ts src/issueLinks/IssueLinks.live.test.ts: 10 passed, 1 skipped (Browse Issues: list, filters, parent tree and side panel #27's write test, which needs its fixture).
They also cover trusted vs untrusted marks on real commits. The suite creates disposable orphan branches test-fixture/29-review-mark-*:
It posts a trusted mark as the connection's account.
GitHub Actions (github-actions[bot]) posts the untrusted mark from a fixture workflow on the second branch.
The branches are deleted afterwards. None remain.
apps/server: vp test run src/issues/ src/issueLinks/: 45 passed, 11 skipped (the live suites).
apps/web: vp test run src/components/issues/ src/components/SidebarChildActivity.logic.test.ts src/components/CommandPalette.logic.test.ts: 105 passed. This includes the table tests for every row and each precedence pair, and a "no review status without marks" sweep.
tsc --noEmit -p tsconfig.json: server, web, contracts, shared and client-runtime all have 0 errors.
vp lint on changed files: 0 errors, no new warnings. vp fmt --check: clean. vp run knip:check: pass. scripts/fork-check.sh: OK (13 features).
Decisions and deviations
An open draft PR counts as "PR open", so it can show Waiting for review. The table has no draft rule.
"Task branch" means a linked thread whose branch names the Issue. Branches pushed outside T3 are not seen.
GitHub keeps only the newest status per context. A later untrusted review/independent therefore hides a trusted one until the trusted account posts again.
A row's Start thread reads the Issue body on demand with one issues.detail call.
The side panel has no list of linked threads; rows show them.
Unverified
No integrated web-client pass, so no before/after screenshots.
PRs into non-default branches. Status now uses closing PRs plus the PRs of the Issue's linked threads, deduped by repository and number.
The page's GraphQL request reads this server's thread-linked PRs (open or unsynced, at most 50 per host) as resource(url:) aliases. There are no per-Issue calls. The cost stays at 3 per 100 rows, and a missing PR answers null instead of failing the page.
Multi-environment. Thread lookups go to every server with issueLinks, and the answers are merged. A mark is trusted when its creator is the viewer of any server that listed the Issue. The server returns the creator and its own viewer.
Merged PRs. They are still ignored while the Issue is open; a test documents this.
Draft PRs. An open draft with nobody working reads as Paused, and with a working thread as In progress. The function, tests and user docs are updated.
Performance. The view subscribes to a derived atom holding only the sorted working-thread keys.
Start thread. A row's button shows a spinner while the detail read runs and ignores repeat clicks.
The status table moved to packages/contracts/src/issueStatus.ts, so the live suite checks it as well.
Commands and results
apps/server: T3CODE_ISSUES_LIVE=1 T3_LIVE_GITHUB=1 vp test run src/issues/ src/issueLinks/: 55 passed, 1 skipped (Browse Issues: list, filters, parent tree and side panel #27's write test, which needs its fixture). No test-fixture/* branches remain.
apps/server: vp test run src/server.test.ts: 197/197. src/auth/RpcAuthorization.test.ts: pass. One subscribeServerConfig case failed once while running in parallel with that file; it passed alone and in the full file.
packages/contracts: vp test run src/issueStatus.test.ts src/issueLinks.test.ts: 45 passed.
apps/web: vp test run src/components/issues/ src/components/SidebarChildActivity.logic.test.ts src/components/CommandPalette.logic.test.ts: 81 passed.
Candidate selection. Thread-linked PR candidates now come only from threads that link to an Issue on the host: a stored non-dismissed row in fork_thread_issue_links, or a branch that issueNumberFromBranch parses. The new IssueLinks.pullRequestsOfIssueThreads selects them.
No snapshot-state pre-filter: the same GraphQL read returns GitHub's real state.
The cap of 50 per host (newest first) stays and logs a warning when it truncates.
A CI test covers inclusion, exclusion and dedupe.
Repository filter. A server with no matching search still reads its candidates and viewer in an aliases-only request, only when it has candidates. The live test covers it.
Start thread. While one row starts a thread, every row's Start button is disabled.
Commands and results
apps/server: T3CODE_ISSUES_LIVE=1 T3_LIVE_GITHUB=1 vp test run src/issues/ src/issueLinks/: 56 passed, 1 skipped (Browse Issues: list, filters, parent tree and side panel #27's write test, which needs its fixture). No test-fixture/* branches remain.
apps/server: src/server.test.ts 197/197. src/auth/RpcAuthorization.test.ts and src/mcp/McpHttpServer.test.ts 24/24.
packages/contracts: issueStatus.test.ts and issueLinks.test.ts 45 passed. apps/web issues, SidebarChildActivity and CommandPalette logic: 81 passed. packages/sharedchildThreadActivity.test.ts: 8 passed.
tsc --noEmit -p tsconfig.json in server, web, contracts, shared and client-runtime: 0 errors.
Lint on changed files: clean. vp fmt --check: clean. vp run knip:check: pass. scripts/fork-check.sh: OK.
Activity
lukemaj commentedon Sep 25, 2026
Handoff: PR #36 (not merged)
feat/25-issuesabda3460c757f0e45e7f74a2cb916bd4e68b47b0onfeat/29-issue-status(basec615cd99)Delivered
issueStatusOf(apps/web/src/components/issues/issueStatus.logic.ts) is a pure function that follows the Issues in Chromeria: an Issues view with computed status, linked to threads #25 table, first match wins. It writes nothing to GitHub.viewer, open blockers (issueDependenciesSummary.blockedBy) and closing PRs. Each closing PR comes with state, draft, head SHA and thereview/independentmark on its head. A mark counts only when the query's viewer posted it. The read makes no per-Issue calls. Cost is 3 points per 100 rows, up from 2.threadsForIssues: at most 100 rows per read, one read per server, and only to servers that advertiseissueLinks.issueroute search parameter.issues-status, whosesharedFilesare the route anddocs/user/source-control.md.Commands and results
apps/server:T3CODE_ISSUES_LIVE=1 T3_LIVE_GITHUB=1 vp test run src/issues/IssueService.live.test.ts src/issues/issueStatus.live.test.ts src/issueLinks/IssueLinks.live.test.ts: 10 passed, 1 skipped (Browse Issues: list, filters, parent tree and side panel #27's write test, which needs its fixture).ghand GitHub cover the extended read (Prism settings in the Providers layout: role list with toggles, lanes only for Worker #26 ← PR feat(web): Prism settings in the Providers layout, lanes only for Worker #35 with head SHA; open vs closed blockers on Computed Issue status, status grouping and filters #29 and model-router#17).test-fixture/29-review-mark-*:github-actions[bot]) posts the untrusted mark from a fixture workflow on the second branch.apps/server:vp test run src/issues/ src/issueLinks/: 45 passed, 11 skipped (the live suites).apps/web:vp test run src/components/issues/ src/components/SidebarChildActivity.logic.test.ts src/components/CommandPalette.logic.test.ts: 105 passed. This includes the table tests for every row and each precedence pair, and a "no review status without marks" sweep.packages/sharedchildThreadActivity.test.ts: 8 passed.packages/contractsissueLinks.test.ts: 5 passed.tsc --noEmit -p tsconfig.json: server, web, contracts, shared and client-runtime all have 0 errors.vp linton changed files: 0 errors, no new warnings.vp fmt --check: clean.vp run knip:check: pass.scripts/fork-check.sh: OK (13 features).Decisions and deviations
review/independenttherefore hides a trusted one until the trusted account posts again.issues.detailcall.Unverified
fix(web): count thread-linked PRs, trust marks across servers, drafts…
lukemaj commentedon Sep 25, 2026
Handoff update: review fixes on PR #36 (not merged)
feat/25-issues2cf84d90321d0b7caec2f497c5fa81b29dfef6b3(supersedesabda346)Review items
resource(url:)aliases. There are no per-Issue calls. The cost stays at 3 per 100 rows, and a missing PR answers null instead of failing the page.threadsForIssuesreturns each thread's PR keys.feat/25-issues.issueLinks, and the answers are merged. A mark is trusted when its creator is the viewer of any server that listed the Issue. The server returns the creator and its own viewer.The status table moved to
packages/contracts/src/issueStatus.ts, so the live suite checks it as well.Commands and results
apps/server:T3CODE_ISSUES_LIVE=1 T3_LIVE_GITHUB=1 vp test run src/issues/ src/issueLinks/: 55 passed, 1 skipped (Browse Issues: list, filters, parent tree and side panel #27's write test, which needs its fixture). Notest-fixture/*branches remain.apps/server:vp test run src/server.test.ts: 197/197.src/auth/RpcAuthorization.test.ts: pass. OnesubscribeServerConfigcase failed once while running in parallel with that file; it passed alone and in the full file.packages/contracts:vp test run src/issueStatus.test.ts src/issueLinks.test.ts: 45 passed.apps/web:vp test run src/components/issues/ src/components/SidebarChildActivity.logic.test.ts src/components/CommandPalette.logic.test.ts: 81 passed.packages/shared:childThreadActivity.test.ts: 8 passed.tsc --noEmit -p tsconfig.jsonin server, web, contracts, shared and client-runtime: 0 errors.vp linton changed files: clean.vp fmt --check: clean.vp run knip:check: pass.scripts/fork-check.sh: OK.Deviations
Unverified
fix(server): read only PRs of Issue-linked threads, also without a se…
lukemaj commentedon Sep 25, 2026
Handoff update: re-review fixes on PR #36 (not merged)
feat/25-issues2522c5de9fe57798a0bd22916a17b26d4b875dc1(supersedes2cf84d9)Re-review items
fork_thread_issue_links, or a branch thatissueNumberFromBranchparses. The newIssueLinks.pullRequestsOfIssueThreadsselects them.Commands and results
apps/server:T3CODE_ISSUES_LIVE=1 T3_LIVE_GITHUB=1 vp test run src/issues/ src/issueLinks/: 56 passed, 1 skipped (Browse Issues: list, filters, parent tree and side panel #27's write test, which needs its fixture). Notest-fixture/*branches remain.apps/server:src/server.test.ts197/197.src/auth/RpcAuthorization.test.tsandsrc/mcp/McpHttpServer.test.ts24/24.packages/contracts:issueStatus.test.tsandissueLinks.test.ts45 passed.apps/webissues,SidebarChildActivityandCommandPalettelogic: 81 passed.packages/sharedchildThreadActivity.test.ts: 8 passed.tsc --noEmit -p tsconfig.jsonin server, web, contracts, shared and client-runtime: 0 errors.vp fmt --check: clean.vp run knip:check: pass.scripts/fork-check.sh: OK.Unverified
feat(web): computed Issue status with grouping and filters (#29) (#36)
feat(web): computed Issue status with grouping and filters (#29) (#36)
feat(web): GitHub Issues next to PRs, linked to threads, with compute…