OUT-4015: gate Client Home Actions dropdown on app install published status - #231
Merged
Conversation
Add an AppInstallStatus enum (draft/published) and expose the new `status` field on AppInstallsDataSchema, surfaced by the /installs endpoint via POR-21837. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Only surface installs with status = published in getActionableInstalls, the single choke point feeding both the client "Your Actions" card and the editor Actions toggle list. App-builder drafts no longer appear until published. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Assert getActionableInstalls hides only explicit drafts while missing/null status is treated as non-draft and shown, matching the status != draft gate. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
Greptile SummaryAdds the app-install publication status to the frontend schema and excludes explicit app-builder drafts from actionable installs before notification settings are fetched.
Confidence Score: 5/5The PR appears safe to merge, with the new draft gate consistently applied at the shared actionable-installs boundary. The schema accepts the documented current statuses and preserves legacy nullish values, while the combined lifecycle checks exclude drafts before notification settings are fetched; the added tests exercise the principal filtering paths. Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart LR
A[GET installs] --> B[Parse install status]
B --> C{Eligible and not draft?}
C -- No --> D[Exclude install]
C -- Yes --> E[Fetch notification settings]
E --> F{Complete action label?}
F -- No --> D
F -- Yes --> G[Return in Your Actions]
Reviews (1): Last reviewed commit: "test(OUT-4015): cover non-draft install ..." | Re-trigger Greptile |
priosshrsth
requested changes
Aug 4, 2026
| !install.isInternalApp, | ||
| !install.isInternalApp && | ||
| // show non drafts apps in the action dropdown. | ||
| install.status !== AppInstallStatus.DRAFT, |
Collaborator
There was a problem hiding this comment.
maybe install.status === AppINstallStatus.PUBLISHED is better?
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Changes
AppInstallStatusenum (draft/published) and expose the newstatusfield onAppInstallsDataSchema— surfaced on the/installsendpoint by POR-21837.InstalledAppsService.getActionableInstalls()onstatus !== AppInstallStatus.DRAFT, so app-builder draft apps no longer appear in the Client Home "Your Actions" dropdown. This is the single choke point feeding both the client-facing card and the editor's Actions toggle list, so drafts drop off both surfaces.draftstatus is hidden; missing/nullstatus is treated as non-draft and shown (avoids regressing installs without a status).Testing Criteria
tests/unit/installed-apps.service.test.tscovering:undefined/nullstatus is shown (denylist)pnpm vitest run tests/unit→ 28 passed ·pnpm typecheckclean ·pnpm lintclean.Notes
statusto the app-install model / installs endpoint. Frontend should not deploy ahead of that backend change.statusis populated for non-app-builder installs (legacy marketplace/native Studio apps) as well, not just newly created app-builder installs.Impact & Surface Area of Change
GET /api/installed-apps. Built-in rows (Invoices, Contracts, Tasks, Forms) are unaffected.statusis parsed via a strictz.enumon the whole installs array — a future third status value would fail the list parse; onlydraft/publishedexist today.