Skip to content

OUT-4015: gate Client Home Actions dropdown on app install published status - #230

Merged
SandipBajracharya merged 4 commits into
stagingfrom
OUT-4015
Aug 4, 2026
Merged

OUT-4015: gate Client Home Actions dropdown on app install published status#230
SandipBajracharya merged 4 commits into
stagingfrom
OUT-4015

Conversation

@SandipBajracharya

Copy link
Copy Markdown
Collaborator

Changes

  • Add an AppInstallStatus enum (draft / published) and expose the new status field on AppInstallsDataSchema — surfaced on the /installs endpoint by POR-21837.
  • Gate InstalledAppsService.getActionableInstalls() on status !== 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.
  • Denylist semantics: only an explicit draft status is hidden; missing/null status is treated as non-draft and shown (avoids regressing installs without a status).

Testing Criteria

  • Loom walkthrough — pending
  • Added tests/unit/installed-apps.service.test.ts covering:
    • draft installs are hidden and their notification-settings endpoint is never called
    • a published install with a registered action label is shown
    • only explicit drafts are hidden — undefined/null status is shown (denylist)
    • a published install without a complete action label is excluded
  • pnpm vitest run tests/unit → 28 passed · pnpm typecheck clean · pnpm lint clean.

Notes

  • Depends on POR-21837 (backend, merged) which adds status to the app-install model / installs endpoint. Frontend should not deploy ahead of that backend change.
  • Worth confirming with backend/QA that status is 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

  • Affects only the "Your Actions" list on Client Home (client preview card + editor Actions toggle), both fed by GET /api/installed-apps. Built-in rows (Invoices, Contracts, Tasks, Forms) are unaffected.
  • status is parsed via a strict z.enum on the whole installs array — a future third status value would fail the list parse; only draft/published exist today.

SandipBajracharya and others added 4 commits August 4, 2026 16:12
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>
@linear-code

linear-code Bot commented Aug 4, 2026

Copy link
Copy Markdown

OUT-4015

@vercel

vercel Bot commented Aug 4, 2026

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated (UTC)
client-home-v3 Ready Ready Preview Aug 4, 2026 10:46am

Request Review

@SandipBajracharya SandipBajracharya changed the title feat(OUT-4015): gate Client Home Actions dropdown on app install published status OUT-4015: gate Client Home Actions dropdown on app install published status Aug 4, 2026
@greptile-apps

greptile-apps Bot commented Aug 4, 2026

Copy link
Copy Markdown

Greptile Summary

Adds app-install lifecycle status validation and excludes explicit app-builder drafts from the shared actionable-installs pipeline.

  • Defines draft and published install statuses in the Assembly response schema.
  • Filters draft installs before fetching their notification settings.
  • Adds unit coverage for draft, published, nullish-status, and incomplete-label cases.

Confidence Score: 5/5

The PR appears safe to merge with no concrete blocking or independently actionable non-blocking issue identified.

The new guard excludes explicit drafts before notification-settings fan-out, preserves installs with missing status as intended, and is covered across the relevant eligibility cases.

Important Files Changed

Filename Overview
src/features/installed-apps/lib/installed-apps.service.ts Adds the explicit draft-status exclusion at the shared actionable-install filtering point.
src/lib/assembly/types.ts Introduces the two-value lifecycle enum and accepts nullish status values in install responses.
tests/unit/installed-apps.service.test.ts Covers filtering, notification-fetch suppression, denylist semantics, and action-label eligibility.

Flowchart

%%{init: {'theme': 'neutral'}}%%
flowchart TD
    A[GET /api/installed-apps] --> B[Fetch app installs]
    B --> C{Eligible install?}
    C -->|Disabled, internal, legacy draft, tasks app, or status=draft| D[Exclude]
    C -->|Otherwise| E[Fetch notification settings]
    E --> F{Complete registered action label?}
    F -->|No| D
    F -->|Yes| G[Return in Your Actions]
Loading

Reviews (1): Last reviewed commit: "test(OUT-4015): cover non-draft install ..." | Re-trigger Greptile

@SandipBajracharya
SandipBajracharya merged commit 8b3fe66 into staging Aug 4, 2026
8 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants