This page lists what Gitsu can and cannot do next to github.com, one operation at a time. The tables below are built from Gitsu's parity audit when the site is built, so the counts on this page are the audit's counts. Most gaps are real, and many are large: github.com does much more than Gitsu does today.
What does the audit measure?
It measures, for every operation github.com offers on a project, an issue, or anything attached to them, whether a Gitsu user can do the same thing. An operation is a concrete action such as "add an assignee who is not already on the issue" or "set a milestone's due date", not a feature name. Labels, milestones, custom fields, views, sub-issues, comments and the project itself are each broken down into their create, read, update and delete actions.
Each operation gets one of three answers:
- Done: Gitsu does it, with a matching control a user can reach.
- Partial: Gitsu does some of it, such as fewer options than github.com, only some of the places github.com offers it, or a path that only works in some cases.
- Missing: Gitsu does not do it yet.
The note beside each row is the audit's one-line description of the gap, or where the control lives in Gitsu when it is done.
How was it run?
It was run on 5 August 2026, in three steps, against a demo repository and project on github.com.
First, the audit established what github.com offers from three sources: GitHub's GraphQL schema, which lists 258 mutations; a signed-in pass over github.com's own menus, settings pages and pickers; and Gitsu's product requirements, which record what Gitsu leaves out on purpose.
Second, an auditor per capability area checked each operation against Gitsu's source code. Every answer carries evidence: a file and line in Gitsu for a done row, or the search that proved a control is absent for a missing one.
Third, a verifier went over every area and tried to refute each claim. That pass overturned 70 claims, added 103 operations the auditors had missed, and struck 5 rows as false alarms. The verifier's corrections win over the auditor's answers, false alarms are left out of every count, and the rows it added are counted with the rest.
How should I read the counts?
Read them as a map of where Gitsu is thin, not as a score. The counts include only operations github.com offers, so an action github.com cannot do never counts as a gap. Every operation counts once, whether it is a rarely used setting or the main way people assign work, so a group with many missing rows may still cover the actions you use every day.
The audit has not been re-run since August 2026. Features Gitsu shipped after that date can still show as missing, so check the getting started guide and the Web App itself for what is there today.
Where does github.com win?
On most operations. github.com is the full product, and Gitsu is a faster client for part of it. Project workflows, insights, most project settings, many view options and much of issue administration are only on github.com, and the tables show each one.
Gitsu keeps your data in GitHub, so nothing is lost by using both: do the daily work in Gitsu and open github.com for the rest. The pricing page explains what the free Web App and a subscription include.
The audit, capability by capability
817 operations that github.com offers, across 14 capability groups.
- Done
- 209
- Partial
- 131
- Missing
- 475
- Unverified
- 2
Assignees, reviewers and people pickers
5 done · 7 partial · 26 missing · 1 unverified of 39
| Operation | Gitsu | Note |
|---|---|---|
| Add an assignee who is not already on the issue (detail rail)Issue assignees (write path) | Missing | The assignee dropdown is a list of the issue's current assignees. |
| Set assignees by node id over the wireIssue assignees (write path) | Missing | Every set-assignees write that carries a non-empty list sends logins into an [ID!] argument and is rejected by GitHub. |
| Unassign everyone (clear the list)Issue assignees (write path) | Done | Detail rail Assignee dropdown; BulkEditBar "Clear" |
| Unassign one person while others stay assignedIssue assignees (write path) | Missing | Partial unassign is unreachable; the user can only clear all. |
| Assign someone at issue-creation timeIssue assignees (write path) | Missing | The compose dialog shows an Assignee chip that cannot be clicked and always reads "Unassigned". |
| Assign to me / self-assign shortcutIssue assignees (write path) | Missing | No self-assign anywhere: not in the rail, the row menu, the board card, or the command palette. |
| Bulk assign across selected rowsIssue assignees (write path) | Partial | Candidate list is the selection's own assignees, not the repository's assignable users; it also replaces the whole list with a single person rather than… |
| Bulk assign from the command palette ("Assign to X")Issue assignees (write path) | Partial | Candidate list is whoever is already assigned somewhere in the loaded page of items; the id is a login so the write fails. |
| Bulk unassign ("Clear assignee")Issue assignees (write path) | Done | BulkEditBar; command palette "Clear assignee" (locales/en.json:84) |
| Assign several people in one interactionIssue assignees (write path) | Partial | Rail supports multi in principle but has nobody to choose from; bulk edit is structurally single-assignee. |
| Assign a pull-request itemIssue assignees (write path) | Missing | PR rows are read-only for assignees although GitHub allows the write. |
| Respect / surface GitHub's 10-assignee capIssue assignees (write path) | Missing | No cap and no message. |
| Assign the Copilot coding agent / a botIssue assignees (write path) | Missing | No agent/bot assignment path at all. |
| Candidate list = repository assignable usersAssignee candidate source (the people picker itself) | Missing | The correct candidate set is already in the codebase and already reaches the client; it is simply not connected to the assignee control. |
| Candidate list = suggestedActors(capabilities:[CAN_BE_ASSIGNED])Assignee candidate source (the people picker itself) | Missing | Gitsu has no equivalent of GitHub's "Suggestions" section ordering. |
| Candidate list = repository collaborators (with permission level)Assignee candidate source (the people picker itself) | Missing | Gitsu cannot distinguish or display permission level. |
| Server-side typeahead / search inside the pickerAssignee candidate source (the people picker itself) | Missing | No typeahead, and a hard 100-user ceiling on the only assignable-user read the app makes. |
| Multi-repository scoping of the candidate listAssignee candidate source (the people picker itself) | Unverified | Not determinable — no candidate list exists to scope. |
| List an item's assignees on rows, cards and the railIssue assignees (read path) | Done | ListView row, BoardCard, detail rail |
| Show the assignee's avatar imageIssue assignees (read path) | Missing | Assignees are shown as two-letter initials derived from the login everywhere except the comment @-mention list. |
| Show the assignee's display nameIssue assignees (read path) | Missing | Only logins are ever shown. |
| Show bot / Copilot / Mannequin / Organization assigneesIssue assignees (read path) | Missing | An issue assigned to Copilot or to a migrated Mannequin renders as unassigned in Gitsu. |
| Show assignees on sub-issue / linked-item / dependency rowsIssue assignees (read path) | Partial | Only the first assignee is fetched and shown; a two-person sub-issue looks single-assigned. |
| Filter items by assigneeIssue assignees (read path) | Partial | Filtering by assignee works only if the user already knows and types the login; no suggestion list, and no @me token (grep for '@me' across src/domain and… |
| Group items by assigneeIssue assignees (read path) | Done | ListView / BoardView grouping |
| Read the Reviewers column value on a project itemReviewers (ProjectV2 REVIEWERS field) | Missing | The Reviewers column is invisible in Gitsu: not in the table, not in the rail, not in the field-settings drawer. |
| Request / remove a PR reviewerReviewers (ProjectV2 REVIEWERS field) | Missing | |
| List who has access to a project, and at what roleProject collaborators / access list | Missing | No access list. |
| Add a collaborator to a project / change their roleProject collaborators / access list | Missing | The mutation exists upstream and nothing in the app calls it. |
| Remove a collaborator from a projectProject collaborators / access list | Missing | |
| Assign a draft issueDraft-issue assignees | Missing | GitHub does allow assigning drafts. |
| Read a draft issue's assigneesDraft-issue assignees | Missing | A draft that is assigned on github.com renders as unassigned in Gitsu, and is invisible to assignee filters and grouping. |
| Group items by assigneeAssignee as a grouping key | Partial | github.com's project table has a 'Group by' menu that lists Assignees. |
| Sort items by assigneeAssignee as a sort key | Missing | github.com's project table 'Sort by' menu lists Assignees. |
| Show who opened an issueIssue author / opened-by | Missing | Issue.author is a core people surface on github.com — the issue header reads '<login> opened this issue', and the author avatar appears on list rows and… |
| Disable the assignee control when the viewer cannot assignAssignee write permission | Missing | Introspection of the Issue type returns [assignedActors, assignees, viewerCanAssign] for assignment-related fields — GitHub exposes viewerCanAssign precisely… |
| @-mention a person in a commentMention people picker (comment editor) | Partial | This is the cluster's one working people picker and the auditor cited it only as evidence, never scored it. |
| Show assigned / unassigned events in the activity timelineAssignment history | Done | Listed because a thorough audit should record the cluster's one clean pass. |
| Edit assignees inline from a table rowAssignees cell in the list view | Missing | On github.com the project table's Assignees cell is directly editable — click the cell, pick people, without leaving the table. |
Auth, accounts, repositories, and app configuration
11 done · 13 partial · 25 missing of 49
| Operation | Gitsu | Note |
|---|---|---|
| Sign in on desktop via OAuth device flowGitHub session (sign-in / sign-out) | Done | Onboarding step 1 (desktop) - device code + copy button |
| Sign in on web via OAuth redirect flowGitHub session (sign-in / sign-out) | Done | Onboarding step 1 (web) - "Continue with GitHub" |
| Sign in with a Personal Access Token (classic or fine-grained)GitHub session (sign-in / sign-out) | Missing | A user whose org blocks OAuth apps, or who wants a scoped fine-grained token, has no way to sign in at all. |
| See whether a credential is stored (connected / not connected)GitHub session (sign-in / sign-out) | Done | Settings > Account > GitHub token badge |
| Re-authenticate after a 401 (revoked token)GitHub session (sign-in / sign-out) | Partial | FR-005 asks for a persistent re-auth banner with writes disabled and cached data readable. |
| Sign out on this device (clear token + persisted cache)GitHub session (sign-in / sign-out) | Done | Settings > Account > Sign out |
| Revoke the OAuth authorization at GitHubGitHub session (sign-in / sign-out) | Missing | After "Sign out" the access token is still live on GitHub's side. |
| Authorize the token for a SAML-SSO-protected organizationGitHub session (sign-in / sign-out) | Missing | A project owned by a SAML-enforced org fails with an unactionable "GitHub returned HTTP 403" and no link to authorize the token. |
| Sign in against GitHub Enterprise ServerGitHub session (sign-in / sign-out) | Missing | No enterprise host field. |
| Read the signed-in identity (login, name, avatar)Account (viewer) | Done | Settings > Account > Signed in as |
| See the signed-in identity outside the settings screenAccount (viewer) | Missing | Nothing in the app chrome says which account you are looking at - relevant precisely because the app supports only one account at a time. |
| List the organizations you belong toAccount (viewer) | Partial | Org membership is read but never shown, so a user cannot tell why an org's board is or is not in the picker. |
| Switch to a different signed-in accountAccount (viewer) | Missing | Switching accounts requires Sign out then Sign in, which also wipes the persisted cache (useSignOut.ts:37-44). |
| Read the rest of the viewer profile (email, company, bio, plan)Account (viewer) | Missing | Deliberate narrowing; nothing in the product needs it. |
| See which scopes the stored token actually hasOAuth token and scopes | Missing | If the `project` scope is missing or was stripped by an org policy, the user sees generic HTTP errors instead of "this token lacks the project scope". |
| Choose which scopes to request at sign-inOAuth token and scopes | Missing | |
| See the GraphQL rate-limit budget and when it resetsOAuth token and scopes | Done | App-wide banner (app.rate-limit-banner) |
| Store the token securely on each platformOAuth token and scopes | Done | none (invisible) |
| Export the config to a fileApp configuration document (.gh-proj.json) | Done | Settings > Config > Save to repo |
| Designate a config repo and write config into it (FR-011, FR-012)App configuration document (.gh-proj.json) | Missing | FR-011/FR-012 (config repo, .gh-projects/config.json via the Contents API, desktop<->web sync) are unimplemented and the design was reversed to local-first. |
| Store saved views as .gh-projects/views/<id>.json in the config repo (FR-013)App configuration document (.gh-proj.json) | Missing | Same reversal as FR-012. |
| Delete a saved viewApp configuration document (.gh-proj.json) | Done | Saved views sidebar row menu |
| Map a project field onto Status / Priority / Estimate / CycleField mapping onto canonical concepts | Missing | FR-014 promises a skippable mapping step. |
| See the current mapping (which field is Status, which is Priority)Field mapping onto canonical concepts | Missing | When the alias table guesses wrong, the user has no way to see that it guessed at all. |
| Change the themePreferences (theme, density, language, shortcut) | Partial | Three options against GitHub's eight. |
| Change the interface languagePreferences (theme, density, language, shortcut) | Partial | On web the Preferences dialog cannot be opened at all, so language cannot be changed. |
| Preferences panes free of placeholder controlsPreferences (theme, density, language, shortcut) | Missing | Users are shown four settings that do nothing and forget their value on close. |
| List the projects the token can see, to pick oneOnboarding and active project | Partial | A board owned by another user with no linked repository is undiscoverable through the API. |
| Create a new projectOnboarding and active project | Missing | Consistent with BR-004 (never a dead end), but a user with no board must leave the app. |
| Switch the active project laterOnboarding and active project | Done | App sidebar project header; command palette |
| Work on more than one project at a timeOnboarding and active project | Missing | |
| List the repositories the account can accessRepository | Partial | No general repository list exists, so nothing can offer a repo outside the current project. |
| Choose which repository a new issue is created inRepository | Missing | In a project spanning several repositories the new issue lands in whichever repo the first selected (or first loaded) item happens to belong to, with no… |
| See which repository an item belongs toRepository | Partial | The dense list view - the product's primary surface - cannot tell two identically titled issues from different repositories apart. |
| Filter or group by repositoryRepository | Missing | In a multi-repo project there is no way to narrow the view to one repository - neither by filter chip nor by typed query. |
| Scope of the issue-search picker (add existing issue / sub-issue)Repository | Partial | By default only the viewer's own repositories are searched, so issues in org-owned repositories - the common case for a work project - do not appear unless… |
| Create a repositoryRepository | Missing | Only matters because FR-011 wanted the app to create a private gh-projects-config repository. |
| Link or unlink a repository to the projectRepository | Missing | The set of repositories a project spans is read-only in Gitsu, which also means the milestone and label catalogues cannot be widened from inside the app. |
| Force a refresh of cached project dataLocal caches and device state | Done | Command palette > Refresh data |
| Open the command palette and run commands that have no other surfaceCommand palette and keyboard shortcuts | Missing | github.com ships a Cmd/Ctrl+K command palette on every page. |
| Refresh cached project data on demandLocal caches and device state | Partial | Two refresh affordances exist and both are desktop-only: src/lib/menu.ts:96-104 (View > Refresh, Cmd+R -> queryClient.refetchQueries({queryKey:['github']… |
| Move an issue to a different repositoryRepository | Missing | GraphQL `transferIssue` is present in live introspection of `{ __type(name:"Mutation"){ fields{ name } } }`, and github.com offers "Transfer issue" in the… |
| Close, make public/private, or delete the active projectOnboarding and active project | Partial | Live introspection of UpdateProjectV2Input returns inputFields projectId, title, shortDescription, readme, closed, public, and `deleteProjectV2` is present in… |
| Stay signed in on web, and know when the session endsGitHub session (sign-in / sign-out) | Partial | api/auth/session-config.ts:27-33 builds the iron-session cookie with httpOnly/secure/sameSite/path and NO `ttl` and NO `maxAge`, so the browser session lives… |
| Choose which field drives board columns / grouping (GitHub's "Column field" and "Group by")Field mapping onto canonical concepts | Missing | Stronger than the alias-table gap the auditor filed. |
| Read or write the project's own saved views (Board/Table/Roadmap tabs)Project view configuration (ProjectV2.views) | Missing | GitHub exposes this as a full public API, not only in the web UI. |
| Stay signed in for as long as the GitHub token is valid (web session lifetime, token refresh)GitHub session (sign-in / sign-out) | Partial | GitHub OAuth user tokens do not expire by default, and an app that opts into expiring tokens receives a refresh_token on exchange. |
| Know whether the token may actually write to this project or repositoryAccount (viewer) | Missing | GitHub publishes this per object: ProjectV2.viewerCanUpdate, and Repository.viewerPermission, Repository.viewerCanCreateIssues and Repository.isArchived (all… |
| See the remaining API rate-limit budgetOAuth token and scopes | Partial | GitHub exposes the budget through the rateLimit GraphQL field and the X-RateLimit-* headers (verified: X-Ratelimit-Limit: 5000 on gh api -i /user). |
Comments and reactions
16 done · 9 partial · 40 missing of 65
| Operation | Gitsu | Note |
|---|---|---|
| Post a comment on an issueIssue comment | Done | Detail view > Comments > composer (src/features/detail/components/CommentList.tsx:352-378) |
| Post a comment on a pull-request itemIssue comment | Done | Detail view > Comments |
| Submit a comment with Cmd/Ctrl+EnterIssue comment | Missing | Posting always needs the mouse or a Tab to the button; no keyboard submit. |
| List comments with paginationIssue comment | Done | Detail view > Comments |
| Comment author login and avatarIssue comment | Done | Detail view > Comments > group header |
| Comment created timestamp (relative + absolute)Issue comment | Done | Detail view > Comments > comment header |
| Edited marker and edit historyIssue comment | Missing | A reader cannot tell an edited comment from an original one, nor see what changed. |
| Author association badge (Owner / Member / Collaborator / Contributor)Issue comment | Missing | No way to tell a maintainer's comment from a drive-by one. |
| Viewer permission flags on a comment (viewerCanUpdate / viewerCanDelete / viewerDidAuthor)Issue comment | Missing | Gitsu offers Edit and Delete on other people's comments. |
| Comment count on list / board rowsIssue comment | Missing | A triager cannot see which issues have discussion without opening each one. |
| Render comment body (markdown, images, task lists, mentions, emoji)Issue comment | Done | Detail view > Comments |
| Copy a permalink to one commentIssue comment | Partial | Sharing a comment requires a round trip through the browser address bar. |
| Edit a comment bodyIssue comment | Done | Detail view > Comments > Edit |
| Delete a comment (with confirmation)Issue comment | Done | Detail view > Comments > Delete |
| Quote reply to a commentIssue comment | Missing | Replying to a specific point means retyping or hand-writing the `>` block; the composer's toolbar has no blockquote button either. |
| Preserve an unposted draft commentIssue comment | Done | Detail view > Comments > composer |
| Lock the conversationIssue comment | Missing | Maintainer moderation must be done on github.com. |
| Write the body of a new issueIssue body (as distinct from a comment) | Done | Compose dialog |
| Render the issue body from GitHub's own HTMLIssue body (as distinct from a comment) | Done | Detail view > body |
| Edit the issue bodyIssue body (as distinct from a comment) | Done | Detail view > body > Edit |
| Issue-body edited marker and revision historyIssue body (as distinct from a comment) | Missing | No indication that a body was rewritten after posting. |
| Toggle a task-list checkbox in the rendered body or commentIssue body (as distinct from a comment) | Missing | Ticking a checklist item needs a full body edit in the markdown source, or a trip to github.com. |
| Add a reaction to an issueReaction (issue and comment) | Missing | The lightest-weight signal on GitHub (a 👍 instead of a '+1' comment) cannot be given at all. |
| Remove the viewer's reaction from an issueReaction (issue and comment) | Missing | |
| Add a reaction to a commentReaction (issue and comment) | Missing | |
| Remove the viewer's reaction from a commentReaction (issue and comment) | Missing | |
| Offer the full 8-emoji vocabularyReaction (issue and comment) | Missing | |
| Read reaction counts per emoji on an issue or commentReaction (issue and comment) | Missing | Reactions added on github.com are invisible in Gitsu, so consensus recorded as 👍 is lost to a Gitsu-only triager. |
| Read whether the viewer has already reactedReaction (issue and comment) | Missing | |
| Read who reacted (reactor list behind each emoji)Reaction (issue and comment) | Missing | |
| Filter or sort items by reaction countReaction (issue and comment) | Missing | Overlaps the filtering cluster; noted here because the data is never fetched, so it could not be filtered on locally even if the grammar allowed it. |
| Minimize (hide) a comment with a classifierComment moderation (minimize / pin / report) | Missing | |
| Unminimize (show) a hidden commentComment moderation (minimize / pin / report) | Missing | |
| Show a minimized comment collapsed, with its reasonComment moderation (minimize / pin / report) | Missing | Spam, abuse and off-topic comments that GitHub deliberately hides are shown in full in Gitsu. |
| Pin / unpin an issue commentComment moderation (minimize / pin / report) | Missing | A pinned answer set on github.com is neither shown nor settable. |
| Report abusive content / block the authorComment moderation (minimize / pin / report) | Missing | Escape hatch is BR-004's open-on-GitHub button. |
| Markdown formatting toolbarComment composer (markdown editor) | Partial | No heading, blockquote, ordered list, task list, table, strikethrough, mention or reference button. |
| Markdown previewComment composer (markdown editor) | Partial | Tables, task lists, strikethrough, images, bare-URL autolinks, @mention and #ref rendering, emoji shortcodes and footnotes all fall through as plain text in… |
| Auto-continue list markers on EnterComment composer (markdown editor) | Missing | |
| Paste rich text as markdownComment composer (markdown editor) | Partial | A pasted table arrives as run-together text rather than a markdown table. |
| Paste a URL over a selection to make a markdown linkComment composer (markdown editor) | Missing | |
| Emoji autocomplete on `:`Comment composer (markdown editor) | Missing | Shortcodes must be typed from memory; there is no picker and the preview will not render them either. |
| Slash-command menu in the composerComment composer (markdown editor) | Missing | |
| Composer parity between compose dialog, body editor and comment boxComment composer (markdown editor) | Done | all four surfaces |
| @ user candidate sourceMention and reference suggestions | Partial | Wrong axis and wrong set. |
| @ organisation-team mentions (@org/team)Mention and reference suggestions | Missing | Notifying a whole team, the normal escalation move, is unassisted. |
| @ suggestion ordering by relevanceMention and reference suggestions | Partial | On a large repo the person being replied to is not near the top. |
| # issue/PR candidate sourceMention and reference suggestions | Partial | An issue that lives in the repository but is not on the board cannot be suggested at all — exactly the backlog item a triager most often references. |
| # suggests pull requests as well as issuesMention and reference suggestions | Missing | |
| Insert a cross-repository reference correctlyMention and reference suggestions | Missing | On a multi-repository project, picking an issue from repo B while commenting on an issue in repo A writes `#<number>`, which GitHub resolves against repo A. |
| Mention suggestions available in every composerMention and reference suggestions | Done | all composer surfaces |
| Mention suggestions outside a project routeMention and reference suggestions | Partial | Any future composer mounted off a project route silently gets an empty popover rather than repository-scoped candidates. |
| Upload an image or file into a comment (drag-drop or file picker)Attachments and uploads | Missing | Attaching a screenshot — the most common thing added to a bug comment — requires leaving for github.com. |
| Paste an image from the clipboard into a commentAttachments and uploads | Missing | A pasted screenshot vanishes with no feedback at all — the paste appears to have been swallowed. |
| Display images and attachments already in a body or commentAttachments and uploads | Done | Detail view > body and comments |
| List the viewer's saved repliesSaved replies | Missing | |
| Insert a saved reply into the composerSaved replies | Missing | |
| Create / edit / delete a saved replySaved replies | Missing | Not a parity gap: no API client can do this. |
| Composer is offered on a locked conversationIssue comment | Missing | Same class of defect as the viewerCan* row, and not covered by it. |
| Comments and events are two separate sections, not one timelineIssue comment | Partial | GitHub side: Issue.timelineItems interleaves IssueComment bodies with AssignedEvent, LabeledEvent, ClosedEvent and the rest in one chronological stream. |
| Comment and close (close with comment) in one actionIssue comment | Missing | github.com puts a second button next to Comment that posts the body and changes the issue state together. |
| Comment author name and avatar link to the GitHub profileIssue comment | Missing | github.com links the avatar and the login of every comment author to the profile page. |
| Create, read, update and delete comments on a pull-request itemIssue comment | Done | Recorded because it is easy to assume the opposite and the auditor never tested it. |
| Body and title edit affordance is not gated on viewerCanUpdateIssue body (as distinct from a comment) | Missing | The auditor covered this for comments but not for the issue body, although the body is one of its two declared entities. |
| Subscribe or unsubscribe from the threadComment moderation (minimize / pin / report) | Missing | github.com puts Subscribe/Unsubscribe in the issue sidebar, next to Lock conversation. |
Everything else github.com offers that has no obvious Gitsu home
19 done · 7 partial · 62 missing of 88
| Operation | Gitsu | Note |
|---|---|---|
| List the project's workflows and their enabled stateProject workflow (built-in automation) | Missing | A user cannot tell that 7 automations are mutating their project behind Gitsu's back. |
| Create a workflow / add an automation ruleProject workflow (built-in automation) | Missing | Unreachable for both, but GitHub's UI can and Gitsu offers no link to it. |
| Enable or disable a workflowProject workflow (built-in automation) | Missing | The single most common workflow action, and Gitsu has neither the control nor a deep link to it. |
| Delete a workflowProject workflow (built-in automation) | Missing | API-capable on GitHub's side, nothing in Gitsu. |
| View the project's Insights chartsProject insights / chart | Missing | No API to build on; Gitsu offers no link to the Insights tab either. |
| Create a chartProject insights / chart | Missing | |
| Edit a chart (filter, X axis, grouping, type)Project insights / chart | Missing | |
| Delete a chartProject insights / chart | Missing | |
| Post a status update (status + body + start/target date)Project status update | Missing | The project-header feature GitHub pushes hardest right now has no Gitsu home at all. |
| Read the status-update historyProject status update | Missing | |
| Edit an existing status updateProject status update | Missing | |
| Delete a status updateProject status update | Missing | |
| Distinguish archived items from live onesProject item archive | Missing | Archived items are indistinguishable in Gitsu's snapshot; the app has no way to hide or filter them. |
| Archive an itemProject item archive | Missing | Archiving is GitHub's standard way to retire a project row without deleting the issue. |
| Unarchive an itemProject item archive | Missing | |
| See the project's server-side viewsProject view (server-side, shared) | Missing | Views a team already agreed on upstream do not appear in Gitsu, and Gitsu's own views never reach the team. |
| Create a shared project viewProject view (server-side, shared) | Missing | Gitsu's saved view is private to one machine; locales/en.json:320 says so to the user. |
| Rename / reconfigure a shared project viewProject view (server-side, shared) | Missing | |
| Delete a shared project viewProject view (server-side, shared) | Missing | |
| Roadmap and Table layoutsProject view (server-side, shared) | Partial | No roadmap/timeline at all; the dense list is not a spreadsheet-style table with per-field columns. |
| Edit project titleProject lifecycle and settings | Done | ProjectSettingsDrawer |
| Edit project short descriptionProject lifecycle and settings | Done | ProjectSettingsDrawer |
| Edit the project READMEProject lifecycle and settings | Missing | One of five fields on the same input, omitted. |
| Close / reopen the projectProject lifecycle and settings | Missing | Gitsu cannot even show that a project is closed. |
| Change project visibility (public/private)Project lifecycle and settings | Missing | A privacy-relevant setting with no indicator and no control. |
| Create a new projectProject lifecycle and settings | Missing | Escape hatch exists, so this is a soft gap consistent with BR-004. |
| Delete a projectProject lifecycle and settings | Missing | |
| Copy a project / mark as templateProject lifecycle and settings | Missing | |
| Manage project access / collaborators, link to repo or teamProject lifecycle and settings | Missing | Covered by the deep link, in the spirit of BR-004. |
| Export the current view to CSV/TSVProject data export | Missing | Would have to be built client-side from the cached snapshot, which Gitsu already holds in memory (FR-020). |
| Read the GitHub notification inboxNotifications and subscriptions | Missing | |
| Subscribe / unsubscribe from an issueNotifications and subscriptions | Missing | |
| See whether you are subscribed to an issueNotifications and subscriptions | Missing | |
| Watch / unwatch a repositoryNotifications and subscriptions | Missing | |
| Close an issue with a reason (Completed / Not planned / Duplicate)Issue lifecycle extras | Partial | Every Gitsu close is an unqualified close; Not planned vs Completed, which drives GitHub's own reporting, is unreachable. |
| See why an issue was closedIssue lifecycle extras | Missing | Reasons set on github.com are invisible in Gitsu. |
| Mark an issue as a duplicate of anotherIssue lifecycle extras | Missing | A core triage verb, absent even as a read. |
| Transfer an issue to another repositoryIssue lifecycle extras | Missing | |
| Pin / unpin an issue on the repositoryIssue lifecycle extras | Missing | |
| Lock / unlock the conversationIssue lifecycle extras | Missing | Gitsu will happily show a comment box on a locked issue, since it never reads Issue.locked. |
| Delete an issueIssue lifecycle extras | Missing | Destructive and rare; a reasonable omission, but not a documented one. |
| Set the issue type (Bug / Feature / Task)Issue lifecycle extras | Missing | A first-class native issue attribute that FR-031's 'native tier' does not model at all. |
| React to an issue or comment (emoji reactions)Issue lifecycle extras | Missing | Reactions on github.com are invisible in Gitsu's comment list. |
| Pick an issue template or form when creatingIssue body: templates, attachments, task lists | Missing | On any repo that uses templates, issues created from Gitsu bypass them silently. |
| Attach a file or image to a body or commentIssue body: templates, attachments, task lists | Missing | Screenshots are the normal currency of issue triage and cannot be added from Gitsu at all. |
| Tick a task-list checkbox in a rendered bodyIssue body: templates, attachments, task lists | Missing | Reachable with the existing update-issue op (src/github/mutations.ts:56-60) — it just has no handler. |
| See linked branches / the Development sectionIssue body: templates, attachments, task lists | Missing | |
| See which other projects an issue belongs toIssue body: templates, attachments, task lists | Missing | Consistent with one-active-project. |
| Render the issue activity timelineTimeline and cross-references | Partial | 41 event types are dropped, including MarkedAsDuplicate, Transferred, Locked, Pinned, Referenced, Mentioned, Subscribed, ConvertedFromDraft, AddedToProjectV2… |
| See cross-references from other issues/PRsTimeline and cross-references | Done | DetailView -> IssueRelationships |
| See which PRs will close this issueTimeline and cross-references | Done | DetailView -> LinkedItemsEditor / IssueRelationships |
| Render a PR row with its own state (draft/open/merged/closed)Pull request as a project item | Done | ListView IssueRow, BoardCard |
| Edit a PR's project field values (Status, Priority, custom)Pull request as a project item | Partial | FR-032 explicitly permits project-field edits on PRs; the implementation blocks them. |
| Set a PR's assignees, labels, milestone, reviewersPull request as a project item | Missing | |
| Comment on a PRPull request as a project item | Done | DetailView -> CommentList |
| Review a PR, read files/commits/checks, mergePull request as a project item | Missing | |
| Create a draft item directly in the projectDraft project item | Missing | The fastest capture path on github.com's board has no Gitsu equivalent. |
| Render a draft itemDraft project item | Done | ListView, BoardView, DetailView |
| Edit a draft's title or bodyDraft project item | Missing | FR-033 requires drafts to be editable. |
| Convert a draft into a real issueDraft project item | Missing | FR-033 states drafts 'can be converted to real issues'. |
| Open the command paletteCommand palette and keyboard | Done | CommandPalette |
| Palette covers every mutation operation (FR-080)Command palette and keyboard | Partial | No palette command for labels, milestone, close/reopen, title/body, comments, sub-issues, dependencies, linked items, field settings, or… |
| Advertised shortcuts G L / G B / G S / C / D / T / Cmd+R actually fireCommand palette and keyboard | Partial | The palette tells the user a shortcut exists and pressing it does nothing (FR-082). |
| List keyboard model (j/k/Enter/x/Escape)Command palette and keyboard | Done | ListView |
| Keyboard drag on the boardCommand palette and keyboard | Done | BoardView |
| Discover keyboard shortcuts (cheat sheet)Command palette and keyboard | Partial | And the hints it does show are partly false (row above). |
| Poll for upstream changesSync, real-time and offline | Done | implicit |
| Live / real-time collaborative updatesSync, real-time and offline | Missing | Up to 60 s of staleness versus github.com's instant update. |
| Manual refreshSync, real-time and offline | Done | CommandPalette |
| Surface rate-limit stateSync, real-time and offline | Done | banner |
| Open an item on github.com from the detail viewPermalinks and escape hatches (BR-004) | Done | DetailView header |
| Open an item on github.com from a list row or board cardPermalinks and escape hatches (BR-004) | Missing | BR-004 says 'every item offers a one-click escape'. |
| Copy a link to an itemPermalinks and escape hatches (BR-004) | Missing | No way to hand a colleague a link to the row you are looking at without opening github.com first. |
| Deep-link to an item inside the appPermalinks and escape hatches (BR-004) | Done | router |
| Share a filtered view by URLPermalinks and escape hatches (BR-004) | Done | FilterBar / QueryInput |
| Open project settings on github.comPermalinks and escape hatches (BR-004) | Done | ProjectSettingsDrawer header |
| Choose the repository the issue lands inIssue creation options | Missing | On a multi-repo project the new issue silently lands in whichever repo happened to be first. |
| Set title and body at creationIssue creation options | Done | ComposeDialog |
| Set assignees and labels at creationIssue creation options | Done | ComposeDialog property chips |
| Set milestone at creationIssue creation options | Missing | Milestone is a first-class native field everywhere else in Gitsu (FR-031) but is missing from the composer. |
| Set issue type at creationIssue creation options | Missing | |
| Choose which project(s) to add the new issue toIssue creation options | Missing | |
| Add an existing issue to the project (by search or URL)Issue creation options | Missing | Textbook 'API-capable but no UI': the mutation, the URL resolver and the issue search all exist, and nothing joins them into an 'Add item' affordance. |
| Remove an item from the projectIssue creation options | Missing | Items can be added but never removed, so Gitsu is a one-way door for project membership. |
| Manually reorder an item within the projectIssue creation options | Missing | FR-031 names 'position' as a Projects v2 built-in that the model should carry, and no write reaches it. |
| Hide (minimize) a comment, and see that a comment was hiddenIssue comment | Missing | minimizeComment and unminimizeComment are both in the Mutation field list (introspected, not deprecated); github.com's comment kebab menu offers Hide as… |
| Respect ProjectV2.viewerCanUpdate — hide or disable writes the token cannot performProject write permission | Missing | ProjectV2 exposes viewerCanUpdate, viewerCanClose and viewerCanReopen (introspection; viewerCanUpdate returned true on PVT_kwHOAEOMRc4BfGWG). |
| Pick an iteration for an itemIteration field value | Missing | github.com's project offers an iteration picker listing current, upcoming and completed iterations. |
Filtering, sorting, grouping and search
18 done · 21 partial · 36 missing of 75
| Operation | Gitsu | Note |
|---|---|---|
| Filter by assignee loginProject filter qualifier language | Partial | Different spelling from github.com, and the chip value step offers no picker for a users-kind field — freeform text only. |
| Assignee value picker offers repo collaborators / suggested actorsProject filter qualifier language | Missing | User must know and type the exact login; no discovery of who can be filtered on. |
| Filter by assignee = me (assignee:@me)Project filter qualifier language | Missing | The single most common project filter cannot be expressed, and a saved view is device-local so it cannot stand in. |
| Filter by labelProject filter qualifier language | Partial | Qualifier spelled `Labels:` not `label:`. |
| Filter by Status / any custom single-select fieldProject filter qualifier language | Done | FilterBar chip editor + query bar |
| Filter by open/closed state (is:open / is:closed)Project filter qualifier language | Done | FilterBar; also the route default filter src/routes/project-search.ts:24 pre-applies State not-in CLOSED,MERGED |
| Filter by item type (is:issue / is:pr / is:draft)Project filter qualifier language | Missing | Cannot separate issues from pull requests or drafts in a mixed project. |
| Filter for unset field (no:label, no:assignee, no:milestone, no:<custom>)Project filter qualifier language | Partial | Spelled `<Field>:empty` not `no:<field>`. |
| Filter for set field (has:label, has:<custom>)Project filter qualifier language | Partial | Spelled `-<Field>:empty` not `has:<field>`. |
| Wildcard 'any value' (status:*)Project filter qualifier language | Missing | Functionally covered by `-<Field>:empty`, so this is a syntax gap only. |
| Negate any qualifier with -Project filter qualifier language | Done | query bar; chips expose is-not / is none of (FilterBar.tsx:38-45) |
| Comma = OR within one qualifierProject filter qualifier language | Done | query bar only |
| Quoted values (spaces, commas, colons)Project filter qualifier language | Done | query bar |
| Explicit OR keyword and parentheses, nested arbitrarilyProject filter qualifier language | Done | query bar (full); chips support one flat level of OR groups (FilterBar.tsx:121) |
| Filter by close reason (reason:completed / "not planned")Project filter qualifier language | Missing | Cannot separate 'done' from 'won't do' — a core triage distinction. |
| Filter by date columns (updated:, created:, closed:, last-updated:)Project filter qualifier language | Missing | 'What changed this week' and 'what is stale' are unaskable. |
| Range and relative-date operands (>, <, .., @today-1w)Project filter qualifier language | Missing | Numeric and date custom fields can only be matched exactly. |
| Iteration relative qualifiers (@current / @previous / @next)Project filter qualifier language | Missing | An iteration filter must name the sprint literally and be rewritten every cycle. |
| Filter by iteration nameProject filter qualifier language | Done | FilterBar / query bar |
| Filter by repositoryProject filter qualifier language | Partial | Spelled `Repository:`; freeform text where github.com offers the project's linked repositories. |
| Filter by parent issue (parent-issue:owner/repo#n)Project filter qualifier language | Missing | Cannot narrow a list to one epic's children, although the detail view renders the hierarchy. |
| Free-text search across itemsProject filter qualifier language | Partial | Title substring only. |
| Show archived itemsProject filter qualifier language | Missing | Archived items are invisible and unrecoverable from Gitsu. |
| Paste a github.com filter string and have it workProject filter qualifier language | Partial | No alias table maps GitHub's qualifier vocabulary onto the field names. |
| Add a filter condition via chipsFilter authoring, application and sharing | Done | FilterBar 'Filter' popover, list view only |
| Add a multi-value `in` condition via chipsFilter authoring, application and sharing | Partial | 'is any of' produces a one-element condition. |
| Add a nested OR group via chipsFilter authoring, application and sharing | Partial | Chips cannot express OR-of-ANDs or any second nesting level; the query bar can. |
| Add a `contains` (substring) condition via chipsFilter authoring, application and sharing | Missing | Deliberate per filter.ts:36 ('the chip UI is free to ignore them'), but it means the commonest search is chip-inaccessible. |
| Read a filter back from a shared URLFilter authoring, application and sharing | Done | router search param `filter` (src/routes/project-search.ts:41) |
| Edit an existing condition (field / operator / value)Filter authoring, application and sharing | Done | click a chip's label |
| Remove one conditionFilter authoring, application and sharing | Done | chip 'x' button (FilterChip.tsx:73) |
| Clear all filtersFilter authoring, application and sharing | Done | 'Clear all' button + list empty-state action |
| Filter the board viewFilter authoring, application and sharing | Missing | The board always shows every non-archived item, including closed and merged ones, with no way to narrow it. |
| Persist / share the typed query textFilter authoring, application and sharing | Missing | Reload, navigate to detail and back, or open a shared link, and the query box is empty even though its chips are still applied. |
| Combine chips and typed queryFilter authoring, application and sharing | Partial | Typing in the query bar silently discards the chips, and closing/reopening the query bar leaves a stale-looking empty box that will clear the filter on the… |
| Server-side filtering (one round trip, exact counts)Filter authoring, application and sharing | Missing | Deliberate, and the right call — but it makes the next two rows load-bearing. |
| Warn that a filter ran over a capped/partial snapshotFilter authoring, application and sharing | Missing | FR-024 says projects above ~2000 items 'warn and cap'. |
| Show matched / total item countsFilter authoring, application and sharing | Missing | No way to tell how much a filter removed. |
| Filter commands in the command paletteFilter authoring, application and sharing | Partial | FR-080 says the palette covers 'navigation, filtering, and every mutation operation'; filtering is represented only by applying a saved view. |
| Sort the list by a chosen fieldSorting | Missing | Items appear in project position order only. |
| Choose sort direction (ascending / descending)Sorting | Missing | |
| Multi-level sortSorting | Missing | |
| Read a project view's configured sort from GitHubSorting | Missing | Gitsu could import the sort a team already configured on github.com and apply it locally; it does not look. |
| Persist a sort choice in the URL / a saved viewSorting | Missing | Dead schema. |
| Manual drag-to-reorder items, persistedSorting | Missing | Dragging a card to a specific slot in a column appears to work and then snaps back on refetch — position is never sent. |
| Group the list by any fieldGrouping | Partial | FR-041 requires 'group by any mapped concept or custom field'. |
| Group by a multi-valued field (labels, assignees, multi-select)Grouping | Done | none (reachable only by hand-editing ?group=) |
| Per-group item countsGrouping | Done | list group headers, board column headers |
| Collapse / expand a groupGrouping | Done | list group header chevron |
| Group order follows the field's declared option orderGrouping | Done | list |
| Trailing group for items with no valueGrouping | Done | list group header, board last column |
| Choose the board's column fieldGrouping | Missing | FR-050 scopes the board to the mapped Status field, so this is arguably in-spec — but github.com's ability to board by Priority, Milestone or Iteration is a… |
| Swimlanes / secondary vertical groupingGrouping | Missing | |
| Roadmap / timeline layoutGrouping | Missing | |
| Create a saved viewSaved view | Partial | API-capable and UI-complete, but dead code in the shipped tree. |
| List saved viewsSaved view | Partial | No visible list. |
| Rename a saved viewSaved view | Partial | |
| Delete a saved viewSaved view | Partial | |
| Apply a saved viewSaved view | Done | command palette |
| Sidebar navigation to a saved viewSaved view | Missing | A permanently broken link: it always lands on the router.savedViews.openError placeholder (screens.tsx:189-197). |
| Store a view's layout (table / board / roadmap)Saved view | Partial | No roadmap layout to store. |
| Store per-view visible columnsSaved view | Missing | Column choice is neither configurable nor savable. |
| Store a view's grouping and sortingSaved view | Partial | locales/en.json 'router.savedViews.saveDescription' promises 'Filters, grouping, sorting, and view mode are saved' — two of the four cannot be set. |
| Share a saved view with the teamSaved view | Missing | Deviates from FR-047: views are device-local, not repo-backed, so they do not follow the user between machines and cannot be shared. |
| Full-text issue search across repositoriesIssue search (global) | Partial | No global search. |
| Use search qualifiers (author:, is:, in:, involves:, mentions:, linked:, project:, sort:)Issue search (global) | Partial | Every GitHub qualifier works, but nothing says so: the placeholder is a plain 'search' string and there is no syntax hint, no completion and no error feedback. |
| Search pull requestsIssue search (global) | Missing | |
| Page beyond the first resultsIssue search (global) | Missing | A term with more than 20 matches silently truncates with no indication. |
| Import a project view's filter string from GitHub (ProjectV2View.filter), and write one backSaved view | Missing | The auditor checked whether Gitsu reads a view's sortByFields but never checked the one view property GitHub actually lets the API both READ and WRITE. |
| Keyboard shortcut to open or focus the filter / query barFilter authoring, application and sharing | Missing | github.com binds `/` to focus the project filter box. |
| Qualifier and value autocomplete in the query barFilter authoring, application and sharing | Missing | github.com's filter box completes qualifier names and then their values as you type — that is how a user discovers the vocabulary at all. |
| Choose which fields the list row showsList column configuration | Missing | The auditor only asked whether a saved view STORES visible columns; it never asked whether the app lets you pick them. |
| Filter survives a view switch or a sidebar navigationFilter authoring, application and sharing | Missing | Distinct from 'the board cannot filter': the URL state is discarded at the door, so even the list loses it. |
| Iteration value picker offers the project's iterationsProject filter qualifier language | Missing | The auditor found this for users-kind fields but not for iteration, where it is worse. |
| Group-collapse state persistsGrouping | Partial | FR-041 requires 'per-group counts and collapse'. |
Issue core lifecycle
7 done · 5 partial · 53 missing of 65
| Operation | Gitsu | Note |
|---|---|---|
| Create an issue with a titleIssue | Done | ComposeDialog, opened from AppSidebar.tsx:319 and the command palette (product-commands.ts:191-199) |
| Create an issue with a markdown bodyIssue | Done | ComposeDialog body editor |
| Choose which repository the new issue is created inIssue | Missing | The user cannot pick the target repository; a multi-repo project silently files every new issue into whichever repo the first row happens to belong to, and an… |
| Set assignees at creation timeIssue | Missing | FR-070 asks for "a composer with a property chip row"; the chip row exists visually but none of the four chips is interactive, so nothing but title and body… |
| Set labels at creation timeIssue | Missing | Same as assignees — the Labels chip is inert. |
| Set milestone at creation timeIssue | Missing | No milestone affordance at all in the composer, not even a decorative chip. |
| Set the project Status / Priority at creation timeIssue | Missing | The Status and Priority chips promise a setting they do not make, and there is no per-column create on the board either. |
| Add the created issue to the project in the same callIssue | Partial | Two writes instead of one, with a real partial-failure state ("created but not added") that the user has to resolve by resubmitting. |
| Create an issue from an issue template or issue formIssue | Missing | A repo with issue templates or forms gets no template chooser and no prefilled body/labels/assignees. |
| Set the issue type at creation timeIssue | Missing | See the Issue Type entity. |
| Create an issue already parented to another issueIssue | Partial | Works, but as two writes with a manual undo path where GitHub offers one atomic input. |
| Read title, body, number, url, stateIssue | Done | ListView, BoardCard, DetailView |
| Read the close reason (completed / not planned / duplicate)Issue | Missing | An issue closed as NOT_PLANNED is indistinguishable from one closed as COMPLETED anywhere in Gitsu — list, board, detail header and activity feed all render… |
| Read lock state and lock reasonIssue | Missing | A locked conversation still shows a live comment composer in CommentList, so the user only learns it is locked when the write fails. |
| Read whether the issue is pinnedIssue | Missing | |
| Read what this issue is a duplicate ofIssue | Missing | |
| Read the edit history of the title/body ("edited" marker)Issue | Missing | |
| Update the titleIssue | Done | DetailView title (click-to-edit, Enter/blur commits, Escape discards) |
| Rename an issue inline from a list row or board cardIssue | Missing | Renaming costs a navigation into the detail route where github.com does it in place. |
| Update the bodyIssue | Done | DetailView "Edit issue description" |
| Close an issueIssue | Done | DetailView header toggle button (locales/en.json:205) |
| Close with a state reason (COMPLETED / NOT_PLANNED / DUPLICATE)Issue | Missing | Gitsu can only close as COMPLETED (GitHub's default). |
| Reopen an issueIssue | Done | DetailView header toggle (locales/en.json:206) |
| Close or reopen from a list row or board cardIssue | Missing | Closing an issue always costs a round trip into the detail route. |
| Bulk close / reopen the selected issuesIssue | Missing | FR-074 says "bulk-edit any settable field", and state is settable — but the bulk union omits it. |
| Mark an issue as a duplicate of anotherIssue | Missing | |
| Unmark an issue as a duplicateIssue | Missing | |
| Lock the conversation, with a reasonIssue | Missing | |
| Unlock the conversationIssue | Missing | |
| Pin the issue to the repositoryIssue | Missing | |
| Unpin the issueIssue | Missing | |
| Transfer the issue to another repositoryIssue | Missing | Not merely missing: the codebase records a false reason for its absence, so the gap is invisible to anyone reading the module that owns writes. |
| React to the issue with an emojiIssue | Missing | |
| Delete the issueIssue | Missing | BR-004 ("never a dead end") is served by the Open-on-GitHub button, but deletion is a genuinely absent verb. |
| Convert the issue to a discussionIssue | Missing | Not a parity gap Gitsu could close — GitHub offers no API for it. |
| Read an issue's typeIssue Type | Missing | Org repos using issue types (Bug/Feature/Task) show nothing in Gitsu; the type is also unavailable to the filter language (src/domain/query-parser.ts) and to… |
| List the issue types available to a repositoryIssue Type | Missing | No catalogue read, so a picker could not be populated even if one existed. |
| Set or change an issue's typeIssue Type | Missing | |
| Clear an issue's typeIssue Type | Missing | |
| Create / update / delete the org's issue types themselvesIssue Type | Missing | Arguably out of scope — Gitsu is a project client, not an org-admin tool — but it is not written down as a non-goal anywhere in docs/PRD.md §3. |
| List a repository's issue templates and formsIssue Template / Form | Missing | |
| Create an issue from a chosen template (prefilled title/body/labels/assignees)Issue Template / Form | Missing | A repo whose contribution process depends on issue forms cannot be served from Gitsu's composer — the user has to leave for github.com. |
| Read whether the viewer is subscribed / ignoringIssue Subscription (notifications) | Missing | |
| Subscribe, unsubscribe or ignore an issueIssue Subscription (notifications) | Missing | |
| Read the issue activity feedIssue Timeline / Activity | Partial | Recognised: Assigned, Closed, CrossReferenced, IssueComment, Labeled, Milestoned, Reopened, RenamedTitle, Unassigned, Unlabeled, Demilestoned. |
| Show why an issue was closed in the activity feedIssue Timeline / Activity | Missing | The reason is dropped on the read side as well as the write side. |
| Page beyond the first 100 timeline eventsIssue Timeline / Activity | Missing | A long-running issue's older history is unreachable in-app. |
| Assign a person who is not already assigned to something in the projectIssue | Partial | The brief names this exact class of gap ('the source and scope of choices'), and the auditor did not test it. |
| See who opened the issue and whenIssue | Missing | github.com's issue header always reads '<author> opened this issue on <date> · N comments'. |
| Create a draft item on the board, and convert a draft to a real issueDraft issue | Missing | Gitsu reads and partly edits drafts — `item.type === 'draft'` gates behaviour at src/features/board/components/BoardCard.tsx:259 and :313… |
| Remove the issue from the project, or archive itIssue | Missing | `MutationOp` carries `add-item-to-project` (src/github/mutations.ts:79) with no counterpart. |
| Read and set GitHub's repository-level issue fieldsIssue Field (repo-level custom issue field) | Missing | A whole sibling concept to Issue Type, entirely uncovered by the audit. |
| Attach an image or file to the body or a commentIssue | Missing | Recording it so the audit does not chase it, exactly as the auditor did for 'convert to discussion'. |
| Assign the issue to Copilot / a coding agentIssue | Missing | Verified by introspection: `CreateIssueInput.agentAssignment` is documented as 'Configuration for assigning Copilot to this issue'… |
| Read who opened the issue and whenIssue | Missing | github.com's issue header is 'X opened this issue on <date>' and the repo issue list sorts by newest/recently updated. |
| Read whether the viewer may edit, close or delete this issueIssue | Missing | GitHub answers this per issue: Issue.viewerCanUpdate, viewerCanClose, viewerCanReopen, viewerCanDelete, viewerCanAssign, viewerCanLabel… |
| Pick an assignee from the repository's assignable usersIssue | Missing | Overlaps an assignee-focused cluster, but it decides whether Gitsu can assign at all, so it belongs in any audit that includes 'set assignees'. |
| Bulk-set labels and assignees from the selection bar / command paletteIssue | Partial | The auditor checked which *kinds* bulk edit supports but not what it sends. |
| Create a draft issue, edit it, or convert it to a real issueDraft issue | Missing | github.com's '+ Add item' on a board or table creates a draft, the row menu converts it, and the title/body stay editable meanwhile: addProjectV2DraftIssue… |
| Remove an issue from the project, or archive itProject item | Missing | The auditor covered `add-item-to-project` (create side) but not its inverse. |
| Reorder an item manually within a column or the tableProject item | Missing | github.com persists manual card/row order via updateProjectV2ItemPosition (confirmed in the Mutation field list). |
| Read reaction counts on the issue and its commentsIssue | Missing | The auditor filed the write (addReaction/removeReaction) but not the read. |
| Attach an image or file to the issue bodyIssue | Missing | Worth recording so nobody chases it. |
| Read linked branches, or create a branch for the issueIssue | Missing | github.com's issue sidebar has a Development section: 'Create a branch for this issue'. |
| Read or set GitHub's new repository-level issue fieldsIssue Field (repo-level) | Missing | The schema now carries a whole issue-field system the auditor did not consider: Repository.issueFields, Repository.viewerCanSeeIssueFields… |
Labels
12 done · 6 partial · 20 missing of 38
| Operation | Gitsu | Note |
|---|---|---|
| Create a repository label (name + colour + description)Repository label (the catalogue) | Missing | A Gitsu user cannot create a label at all; they must leave the app and use github.com. |
| Rename a repository labelRepository label (the catalogue) | Missing | No rename path. |
| Recolour a repository labelRepository label (the catalogue) | Missing | Colour is read-only. |
| Change a repository label's descriptionRepository label (the catalogue) | Missing | No way to add or correct a label description. |
| Delete a repository labelRepository label (the catalogue) | Missing | No delete path. |
| List every label a repository declares, past the first 100Repository label (the catalogue) | Done | detail rail label popover; board card label popover |
| Search the label catalogue by name AND descriptionRepository label (the catalogue) | Partial | Filtering matches names only, and uses cmdk fuzzy scoring rather than GitHub's substring match. |
| See a label's description in the pickerRepository label (the catalogue) | Missing | The user cannot tell `type:bug` from `bug` by their descriptions inside Gitsu. |
| See a label's colour on the picker rows and triggerRepository label (the catalogue) | Partial | Colour is present but at lower fidelity (dot, not fill), and absent entirely from the filter-bar catalogue. |
| Distinguish GitHub's 9 default labels from custom onesRepository label (the catalogue) | Missing | Informational only; matters if label management is ever added, because github.com blocks nothing but does mark defaults. |
| See how many issues carry a labelRepository label (the catalogue) | Missing | No usage count, so no way to judge which labels are dead before deleting them (and no delete anyway). |
| Reach a label-management screen from the picker footerRepository label (the catalogue) | Partial | The affordance is visible and dead — worse than absent, because it advertises a capability that does not exist. |
| Scope the label choices to the item's own repository in a multi-repo projectRepository label (the catalogue) | Done | label popover; filter bar |
| Perform label writes from the web build (feasibility)Repository label (the catalogue) | Missing | If label CRUD is added the REST route (the one src/github/milestones.ts uses for the sibling entity) is blocked on web; GraphQL is the only cross-platform… |
| Add a label to an issue from the detail railLabel assignment on an issue | Done | Detail view -> MetadataRail -> Labels row -> popover |
| Remove a label from an issue from the detail railLabel assignment on an issue | Done | Detail view -> MetadataRail -> Labels row -> popover |
| Add / remove labels from a board card without opening the itemLabel assignment on an issue | Done | Board -> card -> label chips |
| Write label changes as deltas rather than as a whole-set replaceLabel assignment on an issue | Missing | Lost-update race: a label added by a teammate (or a bot, or an Action) between Gitsu's last read and the user's next toggle is silently stripped. |
| Preserve labels beyond the 20 the item query readsLabel assignment on an issue | Missing | An issue with 21+ labels loses labels 21..n the moment the user toggles any label. |
| Preserve an applied label whose id the catalogue cannot resolveLabel assignment on an issue | Missing | Any name/id mismatch (stale catalogue, partial page, transferred issue) removes the label without telling the user, and the optimistic UI hides it until the… |
| Set labels while creating an issueLabel assignment on an issue | Missing | Labels must be applied in a second step after the issue exists. |
| Bulk-apply a label to the selected itemsLabel assignment on an issue | Missing | Bulk label apply is broken, not merely limited. |
| Choose from the full repository label set when bulk-editingLabel assignment on an issue | Missing | A label no selected row carries cannot be applied in bulk, so bulk edit can never introduce a new label to a selection. |
| Bulk-apply more than one label, or add without removingLabel assignment on an issue | Missing | Even if the id bug were fixed, a bulk apply would erase every other label on every selected row. |
| Bulk-clear all labels from the selected itemsLabel assignment on an issue | Done | ListView -> BulkEditBar -> Labels select -> "Clear Labels" |
| Clear all labels on one issue in a single actionLabel assignment on an issue | Partial | At parity with github.com's UI; behind GitHub's API. |
| Apply labels to a pull-request item in the projectLabel assignment on an issue | Missing | A user can tick a label on a PR card and see it appear optimistically; GitHub rejects it and the value reverts on the next refetch. |
| See an issue's labels in list, board and detailLabel assignment on an issue | Done | ListView rows; BoardCard; MetadataRail |
| See label colours on list rows and board cardsLabel assignment on an issue | Partial | Colour is the primary way people scan labels on github.com. |
| See every label on a board cardLabel assignment on an issue | Partial | Only two labels are visible per card; the rest are behind a count. |
| Filter items by labelLabel assignment on an issue | Done | FilterBar; QueryInput |
| Group items by labelLabel assignment on an issue | Done | ListView grouping; BoardView columns |
| See label add/remove events in the issue timelineLabel assignment on an issue | Done | Detail view -> activity feed |
| Apply or remove a label from the keyboard or the command paletteLabel assignment on an issue | Missing | github.com binds `l` on an issue/PR page to open the Labels dropdown, and `l` on the issue list applies the label menu to the selected rows. |
| Edit an item's labels in place from a list rowLabel assignment on an issue | Missing | github.com's Projects v2 table has a Labels column whose cell opens the label picker in place, and the issue list has the bulk Label menu. |
| Learn why the label picker will not writeLabel assignment on an issue | Missing | src/features/shared/components/LabelPicker.tsx:268-269 sets `editingDisabled` when `labels.length === 0` or `issueId === null` — i.e. |
| Filter items by labelLabel assignment on an issue | Done | Supported and reasonably complete. |
| Read labelled/unlabelled events in the item's activity feedLabel assignment on an issue | Done | locales/en.json:258 `detail.activity.event.labeled` ('{{actor}} added the {{detail}} label') and :264 `detail.activity.event.unlabeled` — the timeline renders… |
Milestones
24 done · 10 partial · 19 missing · 1 unverified of 54
| Operation | Gitsu | Note |
|---|---|---|
| Create a milestone with a titleMilestone (the object itself) | Done | Settings -> Milestones -> "New milestone" (src/features/settings/MilestonesScreen.tsx:133-142) |
| Set the description while creatingMilestone (the object itself) | Partial | Plain textarea: no markdown Write/Preview tabs, no mention autocomplete, unlike github.com's description editor. |
| Set the due date while creatingMilestone (the object itself) | Done | Settings -> Milestones -> New milestone dialog |
| Choose which repository the milestone is created inMilestone (the object itself) | Partial | Candidate source is only the repositories LINKED to the project (GraphQL description of ProjectV2.repositories: "The repositories the project is linked to."). |
| Create a milestone already in the closed stateMilestone (the object itself) | Missing | REST-only capability that github.com's UI does not expose either; parity with the UI, not with the API. |
| List open milestones with title, state and due dateMilestone (the object itself) | Done | Settings -> Milestones |
| List closed milestonesMilestone (the object itself) | Partial | Open and closed are interleaved in one list. |
| Milestone progress bar and completion percentageMilestone (the object itself) | Partial | The bar renders but the numeric "N% complete" is never printed — the percentage is only conveyed by bar width and by an aria-label of "Completion". |
| Open and closed issue counts per milestoneMilestone (the object itself) | Done | Settings -> Milestones, each row |
| Milestone description shown when reading the listMilestone (the object itself) | Missing | A user must open Edit to read a milestone's description. |
| Overdue / relative due-date wordingMilestone (the object itself) | Missing | No overdue signal at all; an overdue milestone looks identical to a future one. |
| Milestone creator, created-at, closed-atMilestone (the object itself) | Missing | |
| Open a milestone on github.comMilestone (the object itself) | Missing | The data is already in hand. |
| See the issues that belong to one milestoneMilestone (the object itself) | Partial | No click-through from a milestone row to its items. |
| Sort or reorder the milestone listMilestone (the object itself) | Missing | Always due-date ascending. |
| Read more than 100 milestones, or a project with more than 100 linked repositoriesMilestone (the object itself) | Missing | Silent truncation past 100. |
| Rename a milestoneMilestone (the object itself) | Done | Settings -> Milestones -> row "Edit" |
| Edit a milestone's descriptionMilestone (the object itself) | Done | Settings -> Milestones -> row "Edit" |
| Change a milestone's due dateMilestone (the object itself) | Done | Settings -> Milestones -> row "Edit" |
| Clear a milestone's due dateMilestone (the object itself) | Unverified | Could NOT determine whether GitHub's REST API accepts `due_on: null` — proving it requires a PATCH against the demo repo, which this audit is forbidden from… |
| Close a milestoneMilestone (the object itself) | Done | Settings -> Milestones -> row "Close" |
| Reopen a closed milestoneMilestone (the object itself) | Done | Settings -> Milestones -> row "Reopen" |
| Delete a milestoneMilestone (the object itself) | Done | Settings -> Milestones -> row "Delete" |
| Hide Edit and Delete from a viewer who may not writeMilestone (the object itself) | Missing | Inconsistent with the row's own close/reopen gating, which already reads viewerCanClose/viewerCanReopen. |
| Reach the Milestones screenMilestone (the object itself) | Partial | Buried two levels inside project field settings; not reachable from the command palette, the project header, or a milestone chip. |
| Transport: which API the writes use, and whether that costs anythingMilestone (the object itself) | Done | n/a |
| Set an issue's milestoneIssue milestone assignment | Done | Detail view -> metadata rail -> Milestone (src/features/detail/components/MetadataRail.tsx:381-392) |
| Clear an issue's milestoneIssue milestone assignment | Done | Detail view -> rail -> Milestone -> first (empty) entry |
| Picker candidate source is the issue's own repositoryIssue milestone assignment | Done | Detail view -> rail -> Milestone dropdown |
| Closed milestones are distinguishable in the pickerIssue milestone assignment | Missing | Open and closed milestones are interleaved alphabetically-by-due-date with no badge. |
| Filter/search inside the milestone pickerIssue milestone assignment | Missing | A repository with dozens of milestones becomes a long unsearchable scroll. |
| Display the current milestone's title while the catalogue is still loadingIssue milestone assignment | Missing | The rail shows the raw GraphQL node id (MI_kwDO...) instead of the milestone title on every detail open until the milestone query lands, and permanently for… |
| Set a milestone on many selected items at onceIssue milestone assignment | Done | List/board -> select rows -> BulkEditBar "Milestone" |
| Bulk-edit picker's candidate sourceIssue milestone assignment | Partial | A milestone that no currently-loaded item already carries cannot be bulk-applied at all — which is exactly the common case (a milestone just created in the… |
| Bulk-edit milestone is scoped to each row's repositoryIssue milestone assignment | Missing | In a multi-repo project, applying a repo-A milestone to selected repo-B issues fails per row and is reported only as a count of failures, with no explanation… |
| Bulk clear the milestone on selected itemsIssue milestone assignment | Done | BulkEditBar -> Milestone -> Clear |
| Set a milestone on a pull requestIssue milestone assignment | Missing | PRs in a project can be read but their milestone can never be changed from the app. |
| Set a milestone inline from a list rowIssue milestone assignment | Missing | Triage from the list requires opening the detail view for every item, or using the bulk bar with its restricted option list. |
| Set a milestone from a board cardIssue milestone assignment | Missing | |
| Milestone shown on a board cardIssue milestone assignment | Missing | The list row shows a milestone chip; the board card shows nothing. |
| Milestoned / demilestoned events in the item timelineIssue milestone assignment | Done | Detail view -> activity timeline |
| Filter items by milestone nameMilestone as a view dimension (filter / group / sort) | Done | Filter bar -> field "Milestone"; QueryInput text syntax |
| Filter items that have no milestoneMilestone as a view dimension (filter / group / sort) | Done | Filter bar / QueryInput |
| Group items by milestoneMilestone as a view dimension (filter / group / sort) | Partial | The capability exists end-to-end but no control exposes it, so in practice a user cannot group by milestone. |
| Sort items by milestone or by milestone due dateMilestone as a view dimension (filter / group / sort) | Missing | No sorting of any kind exists in the item views; the `sort` search param is dead. |
| Milestone as a visible column/field in the item viewsMilestone as a view dimension (filter / group / sort) | Partial | Visibility of the milestone chip cannot be toggled per view the way GitHub's column can, and the board does not render it at all. |
| Set the milestone while creating an issueIssue milestone assignment | Missing | github.com's new-issue form has a Milestone picker in the sidebar, and the API agrees: CreateIssueInput exposes `milestoneId` (introspected, alongside… |
| Hide 'New milestone' from a viewer who may not writeMilestone (the object itself) | Missing | Same defect as the auditor's Edit/Delete row but on the create side, and it is not covered by it. |
| Milestone counts and progress stay current after an item's milestone changesMilestone (the object itself) | Partial | Invalidation runs one way only. |
| Clear the milestone from an item (single and bulk)Issue milestone assignment | Done | Parity, and worth recording because the cluster's other clear paths are broken. |
| Filter items by milestoneMilestone as a view dimension (filter / group / sort) | Done | Parity, and the auditor never listed it even though it is the cluster's one strong view-dimension. |
| Close and reopen a milestoneMilestone (the object itself) | Done | Parity, never listed. |
| Delete a milestone with an impact previewMilestone (the object itself) | Done | Parity, and ahead of github.com. |
| Read milestone added / removed events in the item timelineIssue milestone assignment | Done | Parity, never listed. |
Project (ProjectV2) itself
5 done · 6 partial · 30 missing of 41
| Operation | Gitsu | Note |
|---|---|---|
| Create a user-owned projectProject (ProjectV2) | Missing | Cannot create a project in-app; the user is bounced to github.com. |
| Create an org-owned project (choose owner)Project (ProjectV2) | Missing | No owner choice at all, so the user/org distinction GitHub offers at creation time does not exist in Gitsu. |
| Create a project from a template (template gallery)Project (ProjectV2) | Missing | Template gallery is a github.com-UI-only feature; Gitsu could not offer it via the public API even if it wanted to. |
| List / discover projects the token can seeProject (ProjectV2) | Done | Onboarding ProjectPicker; AppSidebar project switcher; command palette `project.switch.*` (src/lib/commands/product-commands.ts:118-132) |
| Search / filter the project list (is:open, is:closed, text)Project (ProjectV2) | Partial | With many projects the picker is an unsearchable scroll list that silently truncates at 2000; GitHub gives a search box plus open/closed tabs. |
| Open one project with its field schemaProject (ProjectV2) | Done | Board / List / Detail (all read `useProject`) |
| Project numberProject (ProjectV2) | Partial | Once a project is active, its number is never shown — not in ProjectHeader, not in the sidebar switcher, not in the settings drawer. |
| Project URL / open the project on github.comProject (ProjectV2) | Partial | No control opens the project *board* on github.com — only its settings page. |
| Owner (user vs organization) of the active projectProject (ProjectV2) | Partial | Owner is visible while choosing but not while working — the settings drawer, which is where it would matter, cannot show it. |
| Project READMEProject (ProjectV2) | Missing | README is neither read nor written; a project that documents itself in its README shows nothing in Gitsu. |
| Visibility (public / private)Project (ProjectV2) | Missing | A user cannot tell from Gitsu whether the board they are editing is public. |
| Closed / open state of the projectProject (ProjectV2) | Missing | `projectsV2` with no `query` argument returns closed projects too (verified: `query:"is:open"` and no-query both return 1 on the demo owner), so a closed… |
| Template flagProject (ProjectV2) | Missing | Not read; a template project is indistinguishable from a normal one. |
| Created / updated timestamps and creatorProject (ProjectV2) | Missing | No provenance shown anywhere. |
| Viewer permission on the project (can update / close / reopen)Project (ProjectV2) | Missing | Concrete consequence: ProjectMetaSection (src/features/settings/drawer/ProjectMetaSection.tsx:43-63) renders live title and description inputs for every viewer. |
| Linked repositoriesProject (ProjectV2) | Partial | Read, but only as a means to source labels and milestones. |
| Linked teamsProject (ProjectV2) | Missing | Not read at all. |
| Project views (Table / Board / Roadmap tabs)Project (ProjectV2) | Missing | A user's existing GitHub views (names, layouts, per-view filters) are invisible in Gitsu, and Gitsu's own saved views are invisible on github.com. |
| Project workflows (built-in automations)Project (ProjectV2) | Missing | Workflows silently change item state behind Gitsu's back (an added item gets a Status, a closed issue moves lane) with nothing in the app explaining why. |
| Project status updatesProject (ProjectV2) | Missing | Not read or written. |
| Rename the project (title)Project (ProjectV2) | Done | Settings drawer → Project section → "Project title" input (saves on blur and Enter) |
| Edit the short descriptionProject (ProjectV2) | Done | Settings drawer → Project section → "Description" textarea |
| Edit the project READMEProject (ProjectV2) | Missing | One input field short of parity on a mutation the app already calls — the cheapest gap in this cluster to close. |
| Change visibility (public / private)Project (ProjectV2) | Missing | Making a board public is a consequential, one-way-feeling action; its absence is defensible, but nothing in the app says where to do it beyond the generic… |
| Close a projectProject (ProjectV2) | Missing | No close. |
| Reopen a closed projectProject (ProjectV2) | Missing | No reopen, and since `closed` is never read, a user could be looking at a closed project without knowing. |
| Delete the projectProject (ProjectV2) | Missing | Absent, and reasonably so for a client — but there is no in-app pointer to where it is done either, beyond the drawer's generic settings link. |
| Copy / duplicate a projectProject (ProjectV2) | Missing | Absent entirely. |
| Mark / unmark the project as a templateProject (ProjectV2) | Missing | Absent entirely. |
| Manage access — add/remove collaborators and set their roleProject (ProjectV2) | Missing | Absent. |
| Link / unlink a repository to the projectProject (ProjectV2) | Missing | This matters more than it looks: the linked-repository set is what sources the label and milestone catalogues (src/services/catalogues.ts:70) and therefore… |
| Link / unlink a team to the projectProject (ProjectV2) | Missing | Absent entirely. |
| Create / rename / delete a GitHub project view (Table, Board, Roadmap)Project (ProjectV2) | Missing | No create, rename, reorder, delete, or layout change for real GitHub views, and no roadmap layout at all. |
| Enable / disable / edit project workflowsProject (ProjectV2) | Missing | Authoring workflows is a github.com-UI-only capability; Gitsu could not reach parity through the public API. |
| Post / edit / delete a project status updateProject (ProjectV2) | Missing | Absent entirely. |
| Project insights / chartsProject (ProjectV2) | Missing | github.com-UI-only on GitHub's side too, so unreachable for any API client. |
| Reach the project's settings page on github.comProject (ProjectV2) | Done | Settings drawer header → `settings.drawer.openOnGitHub` |
| View and restore archived project items (the project-level "Archived items" page)Project (ProjectV2) | Missing | GitHub: ProjectV2.items takes archivedStates with introspected defaultValue [NOT_ARCHIVED], and archiveProjectV2Item / unarchiveProjectV2Item are both in the… |
| Open a project by URL or owner+number (reach a board the discovery walk cannot see)Project (ProjectV2) | Missing | GitHub: User.projectV2(number:) and Organization.projectV2(number:) both exist (introspected), so any accessible board is reachable from a URL the user can… |
| Export project / view data as CSVProject (ProjectV2) | Missing | GitHub: github.com project ⋯ menu → "Export view data (CSV)", documented as "Exporting your project data" in the Managing-your-project docs index. |
| Display the project short description outside the settings drawerProject (ProjectV2) | Partial | Create/read/update all work: shortDescription is selected at src/github/queries/project.ts:172, typed at src/domain/types.ts:176-181, and edited through… |
Project custom fields and their options
18 done · 13 partial · 18 missing of 49
| Operation | Gitsu | Note |
|---|---|---|
| Create a TEXT fieldProject field declaration | Done | Settings > Project fields screen > Create field dialog (/p/$projectId/settings/fields, src/routes/router.tsx:122) |
| Create a NUMBER fieldProject field declaration | Done | Create field dialog |
| Create a DATE fieldProject field declaration | Done | Create field dialog |
| Create a SINGLE_SELECT field with its initial options (name + colour + description each)Project field declaration | Done | Create field dialog |
| Create a MULTI_SELECT field with its initial optionsProject field declaration | Done | Create field dialog |
| Create an ITERATION field with start date + durationProject field declaration | Partial | Always sends an empty iterations list, so the field is born with no iterations and Gitsu has no surface to add any afterwards. |
| Add an organisation-level issue field to a projectProject field declaration | Missing | Org-level issue fields cannot be attached to a project from Gitsu. |
| Read the project's field list with each field's typeProject field declaration | Partial | Eight upstream field types are silently dropped and appear nowhere in Gitsu: LINKED_PULL_REQUESTS, REVIEWERS, PARENT_ISSUE, SUB_ISSUES_PROGRESS, ISSUE_TYPE… |
| Read a single-select field's options (id, name, colour, description)Project field declaration | Done | Settings drawer option rows, Project fields screen options section |
| Read a multi-select field's optionsProject field declaration | Done | Settings drawer |
| Read an iteration field's configuration (start day, duration, iterations, completed iterations)Project field declaration | Missing | Because the iterations are never fetched, FieldDef.options stays undefined for iteration fields (project.ts:286), and the item-level iteration picker at… |
| Read field metadata: createdAt, updatedAt, databaseIdProject field declaration | Missing | Not surfaced anywhere; no user-visible consequence found. |
| Rename a custom fieldProject field declaration | Done | Project fields screen name input (FieldSettings.tsx:344-362) and settings drawer name input (FieldAccordionRow.tsx:283-301) |
| Rename the Status fieldProject field declaration | Missing | Gitsu treats Status as immutable. |
| Reorder fields (change column order)Project field declaration | Missing | Field order is a per-view property upstream and Gitsu has no view mutations at all, so column order is fixed to whatever GitHub returns. |
| Show or hide a field in a viewProject field declaration | Missing | |
| Delete a custom fieldProject field declaration | Done | Delete field button on both surfaces, each with an affected-item count (field-settings-model.ts:85-93) |
| Add an option to an existing single-select fieldSingle-select / multi-select option | Done | 'Add option' button (fields screen) and 'Add option…' inline input (drawer, locales/en.json settings.drawer.addOptionPlaceholder) |
| Add an option to an existing MULTI_SELECT fieldSingle-select / multi-select option | Partial | The drawer sends singleSelectOptions for a MULTI_SELECT field — the create path deliberately switches the key by dataType (CreateFieldDialog.tsx:176-180), so… |
| Add an option at field-creation time with name, colour and descriptionSingle-select / multi-select option | Done | Create field dialog option cards |
| Rename an optionSingle-select / multi-select option | Done | Inline name input on both surfaces |
| Set or change an option's descriptionSingle-select / multi-select option | Done | Inline description input on both surfaces |
| Recolour an option (the eight GitHub colours)Single-select / multi-select option | Done | Colour select (fields screen) and a colour submenu in the option overflow menu (drawer) |
| Render option colours faithfully to GitHub's paletteSingle-select / multi-select option | Partial | Deliberate and documented at field-settings-model.ts:10-17 (the palette must follow light/dark theme). |
| Reorder optionsSingle-select / multi-select option | Partial | Works, but by discrete moves only. |
| Preserve option identity (and therefore item values) across an option editSingle-select / multi-select option | Done | n/a (behaviour) |
| Delete an optionSingle-select / multi-select option | Done | Trash button + confirm dialog (fields screen); 'Delete option' menu item + confirm dialog (drawer) |
| Delete an option from a MULTI_SELECT fieldSingle-select / multi-select option | Partial | |
| Set the iteration start dateIteration field configuration | Partial | Settable once at creation; never editable afterwards. |
| Set the iteration durationIteration field configuration | Partial | No days/weeks unit toggle, and no way to change duration after creation. |
| Read the configured start day and durationIteration field configuration | Missing | Note also the shape mismatch: the write input takes startDate (a Date) while the read side returns startDay (a weekday Int 1-7). |
| Read the list of iterations (id, title, startDate, duration)Iteration field configuration | Missing | |
| Read completed iterationsIteration field configuration | Missing | |
| Assign an iteration to an itemIteration field configuration | Partial | An iteration select with an empty option list. |
| Add an iterationIteration field configuration | Missing | API-capable but no UI: the MutationOp/helper accepts iterationConfiguration on update (src/github/mutations.ts:108-111, :770-780), and nothing in src/features… |
| Rename an iterationIteration field configuration | Missing | Even at API level this is awkward upstream: without ids the list is positional, so a rename is a whole-list rewrite. |
| Change an individual iteration's date or durationIteration field configuration | Missing | |
| Delete an individual iterationIteration field configuration | Missing | |
| Insert a break between iterationsIteration field configuration | Missing | github.com UI only; the public API cannot express it either, so this is not something Gitsu could implement. |
| List Title, Assignees, Labels, Milestone, Repository as project fieldsBuilt-in and native project fields | Done | Detail rail, filter bar, board grouping; drawer shows Labels + Milestone read-only |
| List Linked pull requests, Reviewers, Parent issue, Sub-issues progress, Created, Updated, Closed, Issue typeBuilt-in and native project fields | Missing | Gitsu under-reports the project's own field inventory by ten columns. |
| Edit the Status field's optionsBuilt-in and native project fields | Done | Both surfaces |
| Read or edit a custom field value from the list row or the board cardCustom field value (item cell) | Partial | github.com's table shows one column per visible field and edits each cell in place; board cards show the fields the view configures… |
| Bulk-edit an arbitrary custom field on selected itemsCustom field value (item cell) | Partial | github.com edits many cells of any field column at once — copy one cell into many, drag-fill down, or clear the field on a multi-item selection (docs 'Editing… |
| Group items by an arbitrary custom fieldProject field declaration | Partial | github.com offers a 'Group by' menu on the table and the board, over any groupable field (ProjectV2View.groupByFields exists in the schema). |
| Sort items by a custom fieldProject field declaration | Missing | github.com sorts a table by any field column, and ProjectV2View.sortByFields records it. |
| Know whether the viewer may edit this project's fieldsProject field declaration | Missing | ProjectV2 exposes viewerCanUpdate (confirmed by introspection of the ProjectV2 type), and github.com hides or disables the field settings for a user with… |
| Create a field from the project settings drawerProject field declaration | Partial | github.com offers 'New field' wherever fields are listed — the project settings page and the table's '+' column. |
| Read or set an organisation issue field value, and read an issue's typeOrganisation issue field | Missing | The auditor considered only createProjectV2IssueField (attaching the declaration to a project). |
Project items: adding, removing, archiving, ordering, bulk
8 done · 8 partial · 30 missing of 46
| Operation | Gitsu | Note |
|---|---|---|
| Add an existing issue or PR to the project (search picker)Project item (ProjectV2Item) lifecycle | Missing | The mutation is wired but reachable only for an issue Gitsu itself just created; an issue that already exists cannot be put into the project at all. |
| Add an existing issue or PR by pasting its URLProject item (ProjectV2Item) lifecycle | Missing | The URL-resolution machinery is present but never connected to project membership. |
| Create a new issue and add it to the projectProject item (ProjectV2Item) lifecycle | Done | AppSidebar "Create issue" button; command palette |
| Choose which repository the new issue is created inProject item (ProjectV2Item) lifecycle | Missing | In a project spanning two repositories the user cannot say which one the issue lands in, and a project with no items yet can create no issues. |
| Set fields (Status/Priority/assignees/labels/milestone) while creating the itemProject item (ProjectV2Item) lifecycle | Missing | FR-070 asks for "a composer with a property chip row"; the chips render but set nothing, so every new item starts with no Status even when created from a… |
| List items in the project's manual (POSITION) orderProject item (ProjectV2Item) lifecycle | Done | ListView, BoardView |
| See whether an item is archivedProject item (ProjectV2Item) lifecycle | Missing | No archived state is modelled at all; harmless only because archived rows are also filtered out upstream (see next row). |
| View the project's archived itemsProject item (ProjectV2Item) lifecycle | Missing | Archived items are invisible and unreachable in Gitsu; a user who archived items on github.com has no way to see or restore them here. |
| Move an item between board columns (write the Status field)Project item (ProjectV2Item) lifecycle | Done | BoardView drag and drop |
| Reorder an item manually (drag within a column, or reorder table rows)Project item (ProjectV2Item) lifecycle | Missing | Order can be read but never written. |
| Move an item to the top or bottom of its column/groupProject item (ProjectV2Item) lifecycle | Missing | |
| Change an item's group by dragging a row in the list/table viewProject item (ProjectV2Item) lifecycle | Missing | Drag-to-regroup exists on the board only. |
| Remove (delete) an item from the projectProject item (ProjectV2Item) lifecycle | Missing | An item added by mistake can never be taken out of the project from Gitsu. |
| Archive an itemProject item (ProjectV2Item) lifecycle | Missing | Archiving is the primary way a Projects v2 board is kept clean; Gitsu offers no equivalent (and no delete either, so there is no way to shrink a board). |
| Unarchive an itemProject item (ProjectV2Item) lifecycle | Missing | |
| Show an item whose content is redacted/inaccessibleProject item (ProjectV2Item) lifecycle | Missing | Item counts in Gitsu can differ from github.com with no explanation. |
| Open the item on github.comProject item (ProjectV2Item) lifecycle | Done | DetailView header; command palette |
| Create a draft issue inside the projectDraft issue (DraftIssue item) | Missing | The fastest capture path on github.com (type a title, get a draft, no repo needed) has no counterpart. |
| Read a draft's title and bodyDraft issue (DraftIssue item) | Done | ListView row, BoardCard, DetailView body |
| Read a draft's assigneesDraft issue (DraftIssue item) | Missing | A draft assigned to someone on github.com shows as unassigned in Gitsu, and filtering by assignee silently excludes it. |
| Read a draft's creator and timestampsDraft issue (DraftIssue item) | Missing | |
| Edit a draft's titleDraft issue (DraftIssue item) | Missing | Directly contradicts FR-033 ("Draft issues render and are editable"). |
| Edit a draft's bodyDraft issue (DraftIssue item) | Missing | Contradicts FR-033. |
| Set a draft's assigneesDraft issue (DraftIssue item) | Missing | FR-033 assumes assignees "cannot apply" to drafts and hides the row by design — but upstream drafts do carry assignees, so the requirement's premise is wrong… |
| Set a project field value (Status, Priority, custom column) on a draftDraft issue (DraftIssue item) | Done | MetadataRail, BoardCard inline editors, BulkEditBar, board drag |
| Convert a draft issue into a real issueDraft issue (DraftIssue item) | Missing | FR-033 explicitly requires it ("…and can be converted to real issues"). |
| Delete a draft (remove it from the project)Draft issue (DraftIssue item) | Missing | A draft has no existence outside the project, so with no delete a mistaken draft is permanent from Gitsu's side. |
| Select multiple rowsBulk selection and bulk edit | Partial | Selection is discoverable only by knowing the shortcut; FR-081 is met, but a mouse user sees no affordance. |
| Select a contiguous range of rowsBulk selection and bulk edit | Partial | Range selection exists but not with the mouse. |
| Select all items in the current viewBulk selection and bulk edit | Missing | A 200-row bulk change means 200 keystrokes. |
| Bulk set Status on the selectionBulk selection and bulk edit | Partial | A project whose status column is called "Stage" or "State" gets a permanently disabled Status control even though the app already knows the mapping. |
| Bulk set Priority on the selectionBulk selection and bulk edit | Partial | Same exact-name limitation as Status. |
| Bulk set any other project field (number, date, text, iteration, multi-select, other single-selects)Bulk selection and bulk edit | Missing | FR-074 says "bulk-edit any settable field"; Estimate, Iteration, dates and every other custom column are unreachable in bulk. |
| Bulk assign a userBulk selection and bulk edit | Partial | Two gaps at once. |
| Bulk set labelsBulk selection and bulk edit | Partial | Same two defects as bulk assign: choices limited to labels already on the selection, and names sent where node ids are required. |
| Bulk set milestoneBulk selection and bulk edit | Partial | Cannot move a selection onto a milestone that none of the selected items already carries. |
| Bulk clear a fieldBulk selection and bulk edit | Done | BulkEditBar ("Clear …" option in each select) |
| Bulk add (rather than replace) assignees or labels, or set several at onceBulk selection and bulk edit | Missing | Bulk-assigning wipes every other assignee and bulk-labelling wipes every other label on the selected rows — silently. |
| Bulk archive the selectionBulk selection and bulk edit | Missing | |
| Bulk delete the selection from the projectBulk selection and bulk edit | Missing | |
| Report which rows a bulk run failed onBulk selection and bulk edit | Done | BulkEditBar toast and inline message |
| Bulk edit a selection containing draft issuesBulk selection and bulk edit | Partial | Drafts are counted as failures rather than explained, and the assignee change that upstream would in fact accept on a draft is never attempted. |
| Add the open item to another project, or take it out of this project, from the detail viewProject item (ProjectV2Item) lifecycle | Missing | github.com puts a "Projects" picker in the issue sidebar: it lists the projects you may write to, adds the issue to one, and removes it again. |
| Warn the user when the project is larger than the item capProject item (ProjectV2Item) lifecycle | Missing | Gitsu stops the item walk at 2000 rows: src/github/client.ts:48 (DEFAULT_MAX_ITEMS = 2000), applied at client.ts:576 and enforced at client.ts:634-644, which… |
| Add an item directly into a group (the group header "+")Project item (ProjectV2Item) lifecycle | Missing | github.com's table view puts a "+ Add item" control in each group header; the new item is created already carrying that group's field value. |
| Group the board by a field other than Status, and drag a card to write that fieldProject item (ProjectV2Item) lifecycle | Missing | github.com's board layout can be grouped by any single-select, iteration, assignee, milestone or repository, and dragging a card between columns writes that… |
Project views, layouts and per-view configuration
0 done · 7 partial · 34 missing of 41
| Operation | Gitsu | Note |
|---|---|---|
| Create a new view tab in the projectProject view (ProjectV2View tab) | Missing | Gitsu cannot create a GitHub project view even though the public API supports it. |
| List the project's views and render a tab stripProject view (ProjectV2View tab) | Missing | A user who has 5 views on github.com sees none of them in Gitsu. |
| Read a view's stored layout, filter, group-by, sort-by and visible fieldsProject view (ProjectV2View tab) | Missing | None of the per-view config a user already set on github.com is visible to Gitsu. |
| Rename a viewProject view (ProjectV2View tab) | Missing | |
| Change a view's layout (Table / Board / Roadmap)Project view (ProjectV2View tab) | Partial | Two of GitHub's three layouts exist as app-local modes only; Roadmap is absent; layout choice never round-trips. |
| Set the filter query saved on a viewProject view (ProjectV2View tab) | Missing | |
| Duplicate a viewProject view (ProjectV2View tab) | Missing | Not fixable through the public API — GitHub exposes duplication only in its own web UI. |
| Reorder the view tabsProject view (ProjectV2View tab) | Missing | Not fixable through the public API. |
| Delete a viewProject view (ProjectV2View tab) | Missing | |
| Open / copy a link to a specific view on github.comProject view (ProjectV2View tab) | Partial | Violates BR-004 ("never a dead end") for the view/project surface: there is no one-click escape from a project screen to the same view on github.com. |
| Save / discard the unsaved changes banner on a viewProject view (ProjectV2View tab) | Missing | Not applicable — Gitsu has no server-side view to be dirty against. |
| Choose which fields (table columns) are visiblePer-view configuration knobs | Missing | Gitsu shows one hard-coded row shape; a project with 9 custom fields cannot choose what appears. |
| Reorder the visible fields (column order)Per-view configuration knobs | Missing | |
| Set Group byPer-view configuration knobs | Partial | FR-041 ("Group by any mapped concept or custom field") is implemented in the domain layer but has no picker; the board ignores `group` entirely. |
| Set Sub-group / vertical group (board column field, table sub-group)Per-view configuration knobs | Missing | A project that groups its board by Priority or Iteration on github.com cannot be reproduced in Gitsu at all. |
| Set Sort by (field + ASC/DESC, multi-key)Per-view configuration knobs | Missing | Sorting is completely unimplemented while FR-047 promises saved views persist a sort, and BR-003 names sorting as part of the product. |
| Set Slice byPer-view configuration knobs | Missing | Not fixable through the public API. |
| Set a field sum / aggregate on group headers and board columnsPer-view configuration knobs | Missing | Not fixable through the public API. |
| Set a board column item limit (WIP limit)Per-view configuration knobs | Missing | Not fixable through the public API. |
| Choose the roadmap's start/target date fieldsPer-view configuration knobs | Missing | Whole layout missing. |
| Set the roadmap zoom level (month / quarter / year)Per-view configuration knobs | Missing | Not fixable through the public API. |
| Set roadmap markers (iterations / milestones overlay)Per-view configuration knobs | Missing | Not fixable through the public API. |
| Express the same filter query the view stores (syntax parity)Per-view configuration knobs | Partial | A GitHub view filter pasted into Gitsu will not parse the same way, and Gitsu's filter cannot be saved back onto a GitHub view. |
| Save the current filter/group/sort/mode as a named viewGitsu app-local saved view | Missing | API-capable but no UI, in the strongest sense: the whole feature is dark code. |
| List saved views and switch between themGitsu app-local saved view | Partial | No persistent tab strip or list; the one sidebar entry is broken by construction. |
| Rename a saved viewGitsu app-local saved view | Missing | |
| Update an existing saved view in place (save changed filter onto it)Gitsu app-local saved view | Missing | Absent entirely, even in the dark code. |
| Delete a saved viewGitsu app-local saved view | Missing | |
| Reorder saved viewsGitsu app-local saved view | Missing | |
| Persist saved views where the PRD says (config repo, synced desktop↔web)Gitsu app-local saved view | Missing | Contradicts FR-012/FR-013 (`.gh-projects/config.json`, `.gh-projects/views/<id>.json` in the designated config repo) and FR-047 ("persist … to the config… |
| Round-trip a saved view with a GitHub ProjectV2ViewGitsu app-local saved view | Missing | The two systems are entirely disjoint: a Gitsu saved view is invisible on github.com and vice versa. |
| A saved view's filter is actually applied when it opens in board modeGitsu app-local saved view | Missing | A saved view with view:'board' silently shows every item — its stored filter is discarded. |
| A saved view's grouping is appliedGitsu app-local saved view | Partial | |
| A saved view's sort is appliedGitsu app-local saved view | Missing | Dead field in the persisted schema. |
| A saved view's text query (`q`) is appliedGitsu app-local saved view | Missing | Second dead field in the persisted schema. |
| Switching layout keeps the current filter and groupingGitsu app-local saved view | Missing | Moving list→board→list silently resets the user's filter to the default open-work filter. |
| Share a view with another person by linkGitsu app-local saved view | Partial | Filter links travel; saved-view links do not, and there is no affordance to copy either. |
| Reorder items manually (drag a card inside a board column, or drag table rows when no sort is set)Item order inside a view | Missing | GitHub: `updateProjectV2ItemPosition` is present in `{ __type(name:"Mutation"){ fields{ name } } }`; UpdateProjectV2ItemPositionInput = projectId, itemId… |
| Open the board column menu (collapse column, and the actions GitHub puts there)Board column | Missing | github.com: every board column has a ⋯ menu (collapse column, set limit, field sum, delete). |
| Archive an item out of every view, and browse the project's archiveArchived items | Missing | GitHub: `archiveProjectV2Item` and `unarchiveProjectV2Item` are both present in the Mutation type (introspected). |
| Land on the project's own default view (github.com opens view number 1) or on the layout last usedProject view (ProjectV2View tab) | Missing | github.com opens a project on its first view tab and keeps the view in the URL, so returning to the project restores the user's own default. |
Setting and clearing field values on an item
46 done · 8 partial · 47 missing of 101
| Operation | Gitsu | Note |
|---|---|---|
| Read a TEXT cell from GitHubTEXT field value (custom column) | Done | none (data layer) |
| Show a TEXT value in the detail metadata railTEXT field value (custom column) | Done | Detail metadata rail |
| Show a TEXT value in the list row / table columnTEXT field value (custom column) | Missing | A TEXT column is invisible in list view; the user must open each item to see it. |
| Show a TEXT value on a board cardTEXT field value (custom column) | Partial | Only two hardcoded field names render on a card; any other TEXT field is hidden. |
| Set a TEXT valueTEXT field value (custom column) | Done | Detail metadata rail (text input, commits on blur) |
| Clear a TEXT valueTEXT field value (custom column) | Done | Detail metadata rail (blank the input) |
| Set a TEXT value across a multi-row selectionTEXT field value (custom column) | Missing | No bulk path for TEXT. |
| Read a NUMBER cell from GitHubNUMBER field value (custom column) | Done | none (data layer) |
| Show a NUMBER value in the railNUMBER field value (custom column) | Done | Detail metadata rail |
| Show a NUMBER value in the list rowNUMBER field value (custom column) | Missing | NUMBER columns (e.g. |
| Set a NUMBER valueNUMBER field value (custom column) | Done | Detail metadata rail (numeric input, commits on blur) |
| Clear a NUMBER valueNUMBER field value (custom column) | Done | Detail metadata rail |
| Read a DATE cell from GitHubDATE field value (custom column) | Done | none (data layer) |
| Show a DATE value in the rail (grouped under Dates)DATE field value (custom column) | Done | Detail metadata rail |
| Show a DATE value in the list rowDATE field value (custom column) | Partial | A project with Start date and Target date shows one of them, chosen by object key order, with no indication which. |
| Set a DATE valueDATE field value (custom column) | Done | Detail metadata rail (calendar popover) |
| Clear a DATE valueDATE field value (custom column) | Done | Detail metadata rail (Clear button in the calendar popover) |
| Respect read-only state on the date editorDATE field value (custom column) | Missing | The DatePicker ignores readOnly and pending. |
| Read a SINGLE_SELECT cellSINGLE_SELECT field value (custom column, not Status/Priority) | Done | none (data layer) |
| Show a SINGLE_SELECT value in the railSINGLE_SELECT field value (custom column, not Status/Priority) | Done | Detail metadata rail |
| Set a SINGLE_SELECT optionSINGLE_SELECT field value (custom column, not Status/Priority) | Done | Detail metadata rail (select) |
| Clear a SINGLE_SELECT optionSINGLE_SELECT field value (custom column, not Status/Priority) | Done | Detail metadata rail ('Not set' row) |
| Bulk-set a non-Status/Priority single-select across selected rowsSINGLE_SELECT field value (custom column, not Status/Priority) | Missing | Bulk edit covers two single-selects by name, not the project's single-select fields. |
| Show a SINGLE_SELECT option colourSINGLE_SELECT field value (custom column, not Status/Priority) | Missing | Option colours round-trip through the data layer but are never shown on an item. |
| Read and render StatusStatus (builtin single-select) | Done | List row glyph, board column + card, detail rail |
| Set Status from the detail railStatus (builtin single-select) | Done | Detail metadata rail |
| Set Status inline on a board cardStatus (builtin single-select) | Done | Board card (icon-only select) |
| Set Status by dragging a card between columnsStatus (builtin single-select) | Done | Board drag-and-drop (with keyboard equivalent per FR-052) |
| Clear Status by dropping on the No-status laneStatus (builtin single-select) | Done | Board (No status column) |
| Bulk-set Status on a multi-row selectionStatus (builtin single-select) | Done | Bulk edit bar (list view) |
| Bulk-clear StatusStatus (builtin single-select) | Done | Bulk edit bar ('Clear Status') |
| Set Status on a pull-request itemStatus (builtin single-select) | Partial | FR-032 requires PRs to be 'editable only for project field values'; the rail and card controls disable them instead. |
| Locate the Status field when the project renamed itStatus (builtin single-select) | Missing | FR-014 promises a user-configured mapping of project fields onto Status/Priority/Estimate/Cycle. |
| Read a MULTI_SELECT cellMULTI_SELECT field value (custom column) | Done | none (data layer) |
| Show MULTI_SELECT values as badgesMULTI_SELECT field value (custom column) | Done | Detail rail (badges), list row (tags, mixed with labels) |
| Add / remove one MULTI_SELECT optionMULTI_SELECT field value (custom column) | Done | Detail metadata rail (checkbox dropdown) |
| Clear a MULTI_SELECT value (uncheck the last option)MULTI_SELECT field value (custom column) | Partial | Multi-select is the one type whose 'clear' does not use clearProjectV2ItemFieldValue. |
| Bulk-set / bulk-clear a MULTI_SELECTMULTI_SELECT field value (custom column) | Missing | |
| Read an ITERATION cellITERATION field value (custom column) | Partial | startDate and duration of the assigned iteration are not read, so nothing can show 'ends in 3 days'. |
| Show an ITERATION value in the railITERATION field value (custom column) | Done | Detail metadata rail |
| List the project's available iterationsITERATION field value (custom column) | Missing | No source of iteration ids exists in the app. |
| Assign an item to an iterationITERATION field value (custom column) | Missing | An ITERATION column can be read but never written. |
| Clear an iterationITERATION field value (custom column) | Done | Detail metadata rail |
| Offer the @current / @next relative iteration shortcutsITERATION field value (custom column) | Missing | |
| Read the titleTitle (native issue field) | Done | List row, board card, detail header |
| Rename an issueTitle (native issue field) | Done | Detail header (pencil → input → save) |
| Rename inline from the list row or board cardTitle (native issue field) | Missing | Renaming always costs a navigation to the detail screen. |
| Rename a draft issueTitle (native issue field) | Missing | FR-033 states 'Draft issues render and are editable'. |
| Rename a pull requestTitle (native issue field) | Missing | |
| Read the assignee listAssignees (native issue field) | Done | List row avatars, board card avatars, detail rail |
| Show assignee avatarsAssignees (native issue field) | Partial | avatarUrl is never fetched for the item list, so no real avatar ever renders on a row or card. |
| List the users who may be assignedAssignees (native issue field) | Missing | No source of candidate assignees exists. |
| Assign a user to an item from the detail rail or board cardAssignees (native issue field) | Missing | A user can never be added as an assignee anywhere in Gitsu. |
| Remove one assignee when several are assignedAssignees (native issue field) | Missing | Unchecking one of two assignees fails; only going to zero succeeds, because an empty array carries no bad id. |
| Unassign everyoneAssignees (native issue field) | Done | Detail rail, board card, bulk bar 'Clear Assignee', command palette 'Clear assignee' |
| Bulk-assign across a multi-row selectionAssignees (native issue field) | Missing | Two compounding faults: wrong id type, and a candidate list drawn from the selection instead of the repository. |
| Assign on a draft issueAssignees (native issue field) | Missing | |
| Read the label listLabels (native issue field) | Done | List row tags, board card chips, detail rail |
| List the repository's labels as choicesLabels (native issue field) | Done | Detail rail popover, board card popover |
| Add / remove one labelLabels (native issue field) | Done | Detail metadata rail, board card |
| Remove all labelsLabels (native issue field) | Done | Detail rail, board card, bulk bar 'Clear Labels' |
| Bulk-set labels across a multi-row selectionLabels (native issue field) | Missing | Bulk label application is broken. |
| Bulk-add a label without discarding existing onesLabels (native issue field) | Missing | Even once the id bug is fixed, one bulk label write would erase every other label on all selected rows. |
| Create a new label from the pickerLabels (native issue field) | Missing | A documented product decision in code, not in the PRD. |
| Read the milestoneMilestone (native issue field) | Done | List row badge, detail rail |
| List the repository's milestones as choicesMilestone (native issue field) | Done | Detail rail dropdown |
| Set the milestoneMilestone (native issue field) | Done | Detail metadata rail |
| Clear the milestoneMilestone (native issue field) | Done | Detail rail ('Not set'), bulk bar 'Clear Milestone' |
| Set the milestone from a board cardMilestone (native issue field) | Missing | |
| Bulk-set the milestoneMilestone (native issue field) | Partial | You can only bulk-apply a milestone that at least one selected row already carries; a brand-new milestone is unreachable from bulk edit even though the… |
| Read the item stateState — open / closed (native issue field) | Done | List row badge (PRs only), detail header glyph |
| Close or reopen an issueState — open / closed (native issue field) | Done | Detail header button |
| Close with a reason (completed / not planned / duplicate)State — open / closed (native issue field) | Missing | Every issue Gitsu closes is closed as 'completed'. |
| Close an item from the list row, board card, bulk bar or command paletteState — open / closed (native issue field) | Missing | Closing always costs a navigation to the detail screen; there is no bulk close. |
| Read the item's repositoryRepository (native, read-only column) | Done | Board card badge (BoardCard.tsx:301-312, only when the project spans several repos), detail rail 'Project' row (MetadataRail.tsx:374-379) |
| Show the repository on a list rowRepository (native, read-only column) | Missing | |
| Move an item to another repositoryRepository (native, read-only column) | Missing | Parity with github.com's project table is intact, so this is not a user-facing gap — but the stated reason is factually wrong: transferIssue does exist. |
| Read the pull requests that close this issueLinked pull requests (computed column) | Done | Detail screen, Linked items section |
| Show linked PRs as a list/board columnLinked pull requests (computed column) | Missing | Only visible after opening the item. |
| Read the reviewers of a pull-request itemReviewers (computed column) | Missing | A PR item in a project shows no reviewer information anywhere in Gitsu, while github.com renders the column in every view. |
| Request a reviewerReviewers (computed column) | Missing | |
| Read the item's parent issueParent issue (writable relationship column) | Done | Detail screen, Linked items section (as an untyped link, not labelled 'Parent') |
| Set this item's parent from the item itselfParent issue (writable relationship column) | Missing | Re-parenting requires navigating to the intended parent and adding the current item as a child there. |
| Detach this item from its parentParent issue (writable relationship column) | Missing | |
| Read completed-of-total sub-issue progressSub-issues progress (computed column) | Done | Detail screen, Sub-issues section (progress bar) |
| Show sub-issue progress as a list/board columnSub-issues progress (computed column) | Missing | |
| Read the item's createdAtCreated / Updated / Closed timestamps (computed columns) | Missing | Cannot show or sort by creation date; github.com renders it as a column and offers sort/filter on it. |
| Read the item's updatedAtCreated / Updated / Closed timestamps (computed columns) | Missing | No 'stale items' view is possible. |
| Read the item's closedAtCreated / Updated / Closed timestamps (computed columns) | Missing | |
| Read the item's issue typeIssue type (writable native column) | Missing | Organisations using issue types (Bug/Feature/Task) see none of it in Gitsu. |
| Set the issue typeIssue type (writable native column) | Missing | |
| Clear the issue typeIssue type (writable native column) | Missing | |
| Edit any field value from a keyboard shortcutCross-cutting write mechanics | Missing | Field editing is pointer-driven everywhere except through the command palette. |
| Edit any field value inline in the list viewCross-cutting write mechanics | Missing | This is the single largest structural divergence in the cluster: Gitsu's list is a read surface with a bulk bar bolted on, while github.com's equivalent is a… |
| Reorder an item within its Status column / set its manual positionItem position (Projects v2 built-in) | Missing | `updateProjectV2ItemPosition` is present in { __type(name:"Mutation"){ fields{ name } } } (introspected), and github.com persists manual card order inside a… |
| Set Status / Priority / assignees / labels / milestone while creating the itemAny field value, at creation time | Missing | src/features/compose/ComposeDialog.tsx:281-300 renders four <Badge> elements labelled Status, Priority, Assignee and Labels inside a role="group" — they carry… |
| Disable the field editors when the viewer has no write access to the projectCross-cutting write mechanics | Missing | ProjectV2.viewerCanUpdate exists (confirmed in the ProjectV2 field list) and github.com uses it: a read-only collaborator sees the table and side pane… |
| Bulk-set or bulk-clear a NUMBER or DATE value across a selectionNUMBER and DATE field values (custom columns) | Missing | The auditor raised the bulk gap for TEXT, MULTI_SELECT and non-Status single-selects but never for the other two writable custom types. |
| Edit the body of a draft issueBody (native issue field) | Missing | The auditor covered the draft's title but not its body, which is the other half of what a draft actually is. |
| Read a MULTI_SELECT value on the list row as its own fieldMULTI_SELECT field value (custom column) | Partial | The auditor checked TEXT, NUMBER and DATE reads on the row and concluded MULTI_SELECT was not a problem, but the row does render it — badly. |
| Create an item already carrying the group's field value (per-group quick add)Status (builtin single-select) | Missing | src/features/items/components/GroupSection.tsx:64-75 implements a per-group '+' button behind an optional onQuickAdd prop, and locales/en.json carries its… |
Sub-issues, parent issue, dependencies and linked items
20 done · 11 partial · 35 missing of 66
| Operation | Gitsu | Note |
|---|---|---|
| Create a new issue and link it as a sub-issueSub-issue link | Done | Detail view > Sub-issues > inline create form (src/features/detail/components/SubIssuesEditor.tsx:173-184) |
| Set a body/description on the new sub-issueSub-issue link | Missing | The create form is a single title input; a sub-issue can only be born empty and must be filled in afterwards. |
| Set assignees, labels, issue type and milestone on the new sub-issueSub-issue link | Missing | None of the four can be set at creation time; the user must open the new issue on github.com (it is not in the project, so it cannot be opened in Gitsu). |
| Add the new sub-issue to a projectSub-issue link | Missing | A sub-issue created in Gitsu never enters the open project, so it never appears in the list or board and its own detail view is unreachable… |
| Create several sub-issues in a row without reopening a dialogSub-issue link | Done | Detail view > Sub-issues > create form |
| Link an existing issue as a sub-issue by searchSub-issue link | Done | Detail view > Sub-issues > "Add existing" popover (src/features/detail/components/SubIssuesEditor.tsx:114-122) |
| Link an existing issue from a different repositorySub-issue link | Partial | No repository switcher. |
| Add a sub-issue by pasting its URLSub-issue link | Missing | The one input GitHub offers for reaching an issue you already have in hand is missing; only free-text search is available. |
| Re-parent an issue that already has a parentSub-issue link | Missing | Already-parented issues are deliberately hidden from the picker rather than offered with a "move it here" confirmation, so a sub-issue can never be moved… |
| Offer candidate sub-issues before the user typesSub-issue link | Missing | The picker opens empty; there are no suggested actors/issues. |
| Convert a task-list checkbox in the body into a sub-issueSub-issue link | Missing | UI-only capability upstream; Gitsu could not implement it through the public API anyway. |
| List sub-issues with state, repository, number and assigneeSub-issue link | Done | Detail view > Sub-issues |
| Sub-issue progress (completed / total, percentage bar)Sub-issue link | Done | Detail view > Sub-issues > badge and Progress bar |
| Expand a child in place to see its own sub-issues (nested hierarchy)Sub-issue link | Missing | Only one level of the hierarchy is visible. |
| Open a sub-issue from its rowSub-issue link | Partial | Drilling into a child always leaves the app, even when the child is an item of the same project and has its own Gitsu detail view. |
| See beyond 100 sub-issues, or be told the list was cutSub-issue link | Partial | 100 equals GitHub's own ceiling so nothing is lost today, but the computed `truncated` flag is never shown, so any future overflow is silent. |
| Reorder a sub-issue by draggingSub-issue link | Done | Detail view > Sub-issues > drag handle |
| Move a sub-issue before a named sibling (beforeId)Sub-issue link | Missing | Expressively equivalent — afterId plus "omit for front" reaches every position — so this is not a user-visible gap. |
| Unlink a sub-issue, leaving the issue itself intactSub-issue link | Done | Detail view > Sub-issues > row X button (SubIssuesEditor.tsx:152-160) |
| Delete the underlying issue from the sub-issue rowSub-issue link | Missing | Belongs more to the issue-lifecycle cluster, but the sub-issue row's only destructive action is unlink. |
| See the parent of the open issue, identified as the parentParent issue | Partial | The parent is displayed, but indistinguishable from a closing pull request or an inbound cross-reference. |
| Set a parent from the child issue's pageParent issue | Missing | The only way to give an issue a parent in Gitsu is to open the intended parent and use its "Add existing" picker — and that parent must itself be an item of… |
| Change an issue's parent (move it to a different parent)Parent issue | Missing | Re-parenting is impossible; the child must first be unlinked from its current parent, which itself needs that parent to be in the project. |
| Remove the parent from the child issue's pageParent issue | Missing | There is no child-side unparent. |
| Follow the parent link to open the parent issueParent issue | Partial | Navigation leaves the app even when the parent is an item of the same project. |
| Mark the open issue as blocked by another issueIssue dependency (blocked by / blocking) | Done | Detail view > Blocked by > "Add blocker" popover (src/features/detail/components/IssueDependencies.tsx:127-135) |
| Mark the open issue as blocking another issueIssue dependency (blocked by / blocking) | Done | Detail view > Blocking > "Add blocked issue" popover |
| Add several dependencies in one dialogIssue dependency (blocked by / blocking) | Missing | Each dependency costs a fresh popover open, search and select. |
| Add a dependency on an issue in another repositoryIssue dependency (blocked by / blocking) | Partial | Cross-repo dependencies need a hand-typed repo:/org: qualifier; there is no repository switcher and no hint that one is possible. |
| Add a dependency by pasting a URL or typing #numberIssue dependency (blocked by / blocking) | Missing | A user holding the issue URL must still search for it by words. |
| List the issues blocking this oneIssue dependency (blocked by / blocking) | Done | Detail view > Blocked by |
| List the issues this one blocksIssue dependency (blocked by / blocking) | Done | Detail view > Blocking |
| Dependency counts that stay right when the list is truncatedIssue dependency (blocked by / blocking) | Done | Detail view > Blocked by / Blocking badges |
| "Blocked" indicator on the board and the item listIssue dependency (blocked by / blocking) | Missing | A bottleneck is invisible everywhere except inside one issue's detail view, which defeats the point of dependencies for triage. |
| See beyond 50 blockers or 50 blocked issuesIssue dependency (blocked by / blocking) | Partial | The badge stays correct because it uses the summary totals, but the list silently stops at 50 with no "and N more". |
| Cycle rejection explained to the userIssue dependency (blocked by / blocking) | Done | Toast |
| Remove a blockerIssue dependency (blocked by / blocking) | Done | Detail view > Blocked by > row X button |
| Remove a blocked issue from the Blocking listIssue dependency (blocked by / blocking) | Done | Detail view > Blocking > row X button |
| Attach an existing issue as a linked itemLinked items and external links (Gitsu's own concept) | Done | Detail view > Linked items > "Link issue" popover (src/features/detail/components/LinkedItemsEditor.tsx:217-226) |
| Attach an arbitrary external (non-GitHub) URLLinked items and external links (Gitsu's own concept) | Done | Detail view > Linked items > external URL form (LinkedItemsEditor.tsx:125-181) |
| A link added on this issue is still listed after the view refetchesLinked items and external links (Gitsu's own concept) | Missing | The row disappears from the issue where the user added it as soon as the view remounts, and instead turns up on the other issue's Linked items list. |
| Remove a user-added link after leaving and returning to the issueLinked items and external links (Gitsu's own concept) | Missing | Removal works only in the same session, before any remount, while the comment id is still in the query cache. |
| Remove a link inside the current sessionLinked items and external links (Gitsu's own concept) | Done | Detail view > Linked items > row X |
| Pick a pull request in the link pickerLinked items and external links (Gitsu's own concept) | Missing | The picker is issue-only; PRs must be reached by pasting a URL. |
| Scope of the link picker's choicesLinked items and external links (Gitsu's own concept) | Partial | Only the viewer's own repositories are searched. |
| Tell a parent, a closing pull request and an inbound cross-reference apartLinked items and external links (Gitsu's own concept) | Missing | One undifferentiated list, so the user cannot tell what kind of relationship any row represents. |
| See beyond 50 closing-PR references or 100 timeline eventsLinked items and external links (Gitsu's own concept) | Partial | Silent truncation with no "show more". |
| Pull requests that will close this issueDevelopment panel: linked pull requests and linked branches | Done | Detail view > Linked items (with a pull-request glyph, LinkedItemsEditor.tsx:44-47) |
| Manually link an existing pull request to the issueDevelopment panel: linked pull requests and linked branches | Missing | A Gitsu "link" to a PR is a comment cross-reference, which does not create GitHub's closing relationship and does not auto-close the issue on merge. |
| Unlink a manually linked pull requestDevelopment panel: linked pull requests and linked branches | Missing | |
| Branches linked to the issueDevelopment panel: linked pull requests and linked branches | Missing | Work in progress on a branch is invisible in Gitsu. |
| Create a branch for the issue (custom name, destination repository)Development panel: linked pull requests and linked branches | Missing | |
| Delete or unlink a linked branchDevelopment panel: linked pull requests and linked branches | Missing | |
| Closing-keyword links ("Closes #12") reflected on the issueDevelopment panel: linked pull requests and linked branches | Done | Detail view > Linked items |
| Show the "Parent issue" column in a viewHierarchy project fields (Parent issue, Sub-issue progress, Tracks / Tracked by, Linked pull requests) | Missing | The column cannot be shown, grouped, sorted or filtered because the field never becomes a FieldDef. |
| Show the "Sub-issue progress" column in a viewHierarchy project fields (Parent issue, Sub-issue progress, Tracks / Tracked by, Linked pull requests) | Missing | Progress is visible only inside one issue's detail view, never on a row or a card, so a triage pass cannot see which parents are nearly done. |
| Group a view by "Parent issue"Hierarchy project fields (Parent issue, Sub-issue progress, Tracks / Tracked by, Linked pull requests) | Missing | There is no hierarchical view of a project anywhere in Gitsu. |
| Filter with parent-issue:OWNER/REPO#NUMBERHierarchy project fields (Parent issue, Sub-issue progress, Tracks / Tracked by, Linked pull requests) | Missing | |
| Show the "Linked pull requests" columnHierarchy project fields (Parent issue, Sub-issue progress, Tracks / Tracked by, Linked pull requests) | Missing | |
| Show the legacy "Tracks" / "Tracked by" columnsHierarchy project fields (Parent issue, Sub-issue progress, Tracks / Tracked by, Linked pull requests) | Missing | Task-list tracking is superseded by sub-issues upstream, so the practical cost is small. |
| Hide or show these built-in fields on a viewHierarchy project fields (Parent issue, Sub-issue progress, Tracks / Tracked by, Linked pull requests) | Missing | Gitsu cannot even list these fields, so it cannot offer the show/hide control. |
| Add a link without posting a bare-URL comment into the issue threadLinked items and external links (Gitsu's own concept) | Missing | GitHub's own link affordances (Development panel, the manual PR link) write no comment — there is no addComment behind them. |
| See a pull request that was closed without merging, and tell manual links from automatic onesLinked items and external links (Gitsu's own concept) | Missing | Introspected: Issue.closedByPullRequestsReferences takes includeClosedPrs (default false), orderByState (default false) and userLinkedOnly (default false). |
| Keep inbound cross-references visible on a busy issueLinked items and external links (Gitsu's own concept) | Partial | Linked items is not read from a cross-reference connection: src/github/queries/item-detail.ts:490-502 filters CrossReferencedEvent out of timelineItems(first… |
| Show the new sub-issue's repository correctly before the next refetchSub-issue link | Partial | src/features/detail/useMutateSubIssues.ts:166 builds the optimistic row with `detail.subIssues[0]?.repository ?? |
| Set a parent while creating a new issueParent issue | Missing | Introspected CreateIssueInput carries parentIssueId, and `gh issue create --parent` uses it; github.com's own new-issue form has no parent field, so this is… |
Frequently asked questions
Does Gitsu replace github.com?
No. Gitsu works on top of GitHub Issues and GitHub Projects, and github.com still does far more. Anything Gitsu cannot do, you can still do on github.com against the same issue or board.
When was the audit run?
On 5 August 2026. The tables show Gitsu as it was then; the audit has not been re-run since, so a feature shipped later can still show as missing.
How is an operation marked partial?
Partial means Gitsu offers the operation but not the whole of it: fewer options than github.com, only some of the places github.com offers it, or a path that works only in some cases.
Why are some things github.com offers not counted?
Parity is counted only over operations github.com actually offers. Rows the verifier struck as false alarms are left out of every count.
Try it on your own boardsGitsu opens your GitHub Projects boards in the browser. Sign in with GitHub; your data stays in GitHub.
Open the Web App