> ## Documentation Index
> Fetch the complete documentation index at: https://docs.encoreos.io/llms.txt
> Use this file to discover all available pages before exploring further.

# Quick actions inventory

> Last regenerated: 2026-04-18 (PF-99) Source of truth: MODULE_REGISTRY in src/platform/modules/module-registry/. DB-backed catalog: pf_quick_action_catalog (see…

**Last regenerated:** 2026-04-18 (PF-99)
**Source of truth:** `MODULE_REGISTRY` in [`src/platform/modules/module-registry/`](https://github.com/Encore-OS/encoreos/blob/development/src/platform/modules/module-registry).
**DB-backed catalog:** `pf_quick_action_catalog` (seeded from registry; see § Workflow).
**Total registered:** 116 quick actions across 11 cores.

This document is a snapshot of every quick action exposed by the runtime registry. Quick actions surface in the **command palette (`⌘K`)**, **header dropdown**, **dashboard `QuickActionsCard`**, **mobile dock**, and **per-page contextual hooks** — see [`src/platform/navigation/`](https://github.com/Encore-OS/encoreos/blob/development/src/platform/navigation) for consumers.

***

## Stable keys

Action keys are computed by `computeQuickActionKey(moduleId, navGroupId?, route)` in [`src/platform/navigation/quick-action-catalog.ts`](https://github.com/Encore-OS/encoreos/blob/development/src/platform/navigation/quick-action-catalog.ts). User and org JSON preferences (`pf_org_quick_action_selections`) store `action_key`, **not** labels — relabels are safe.

Format:

* Module-level: `{moduleId}::{slugified-route}` (e.g. `gr::gr:incidents:report`).
* Nav-group level: `{moduleId}::{navGroupId}::{slugified-route}`.

***

## Workflow: keeping the DB catalog in sync with the registry

The runtime `MODULE_REGISTRY` is the source of truth for **rendering**. The DB table `pf_quick_action_catalog` is a copy of that data used by org-admin tooling (`pf_org_quick_action_selections` references rows by `action_key`).

When you add or change a registry quick action:

1. Edit the relevant `src/platform/modules/module-registry/{core}.ts` file.
2. Re-run the inventory generator:
   ```bash theme={null}
   npx tsx scripts/dev/print-quick-action-catalog-seed.ts > /tmp/qa-rows.sql
   ```
3. Add a follow-up migration `supabase/migrations/<TIMESTAMP>_<name>_pf_quick_action_catalog_seed.sql` that UPSERTs the changed rows on `action_key`. The latest seed migration template lives at `supabase/migrations/20260418021116_pf99_pf_quick_action_catalog_seed.sql` — copy its INSERT/ON CONFLICT structure.
4. Apply the migration.
5. Update this doc (regenerate the tables below).
6. Run tests:
   ```bash theme={null}
   npx vitest run tests/unit/platform-quick-action-catalog.test.ts tests/unit/platform/migrations/quick-action-catalog-seed.test.ts
   ```
   The second test fails if any registry `action_key` is missing from the union of all `*_pf_quick_action_catalog_seed.sql` migrations.

***

## How to audit quick actions in code

1. Run `npx vitest run tests/unit/platform-quick-action-catalog.test.ts` — asserts unique `action_key` values, route-prefix correctness, and presence of the GR/HR wizard wave actions (PF-99).
2. Search for `quickActions:` under `src/platform/modules/module-registry/`.
3. SQL-side: `SELECT module_id, count(*) FROM pf_quick_action_catalog GROUP BY module_id ORDER BY 1;`

***

## Inventory (snapshot)

> Generated by `scripts/dev/print-quick-action-catalog-seed.ts`. Re-run and refresh after every registry change.

### CE (11)

| Label              | Route                       | Permission           | Action key                     |
| ------------------ | --------------------------- | -------------------- | ------------------------------ |
| New Lead           | `/ce/leads?action=add-lead` | `ce.leads.create`    | `ce::ce:leads:action:add:lead` |
| Onboard Partner    | `/ce/partners/onboard`      | `ce.partners.create` | `ce::ce:partners:onboard`      |
| Recent Calls       | `/ce/analytics/calls`       | `ce.calls.view`      | `ce::ce:analytics:calls`       |
| Add Contact        | `/ce/contacts/new`          | `ce.contacts.create` | `ce::ce:contacts:new`          |
| Lead Pipeline      | `/ce/leads`                 | `ce.leads.view`      | `ce::ce:leads`                 |
| New Partner        | `/ce/partners/new`          | `ce.partners.create` | `ce::ce:partners:new`          |
| Campaigns          | `/ce/campaigns`             | `ce.campaigns.view`  | `ce::ce:campaigns`             |
| Contacts           | `/ce/contacts`              | `ce.contacts.view`   | `ce::ce:contacts`              |
| Activities         | `/ce/activities`            | `ce.activities.view` | `ce::ce:activities`            |
| Pipeline Dashboard | `/ce/analytics/pipeline`    | `ce.pipeline.view`   | `ce::ce:analytics:pipeline`    |
| SMS Consent        | `/ce/sms/consent`           | `ce.sms.admin`       | `ce::ce:sms:consent`           |

### CL (8)

| Label                | Route                             | Permission                   | Action key                           |
| -------------------- | --------------------------------- | ---------------------------- | ------------------------------------ |
| Patient Charts       | `/cl/charts`                      | `cl.charts.view`             | `cl::cl:charts`                      |
| In-Basket            | `/cl/in-basket`                   | `cl.inbasket.view`           | `cl::cl:in:basket`                   |
| Co-Sign Queue        | `/cl/notes/cosign-queue`          | `cl.progress_note.cosign`    | `cl::cl:notes:cosign:queue`          |
| Treatment Plans      | `/cl/treatment-plans`             | `cl.treatment_plan.view`     | `cl::cl:treatment:plans`             |
| Group Sessions       | `/cl/group-sessions`              | `cl.group_sessions.view`     | `cl::cl:group:sessions`              |
| Care Gaps            | `/cl/population-health/care-gaps` | `cl.care-gaps.view`          | `cl::cl:population:health:care:gaps` |
| Compliance Dashboard | `/cl/compliance-dashboard`        | `cl.report_definitions.view` | `cl::cl:compliance:dashboard`        |
| Incidents            | `/cl/incidents`                   | `cl.incidents.view`          | `cl::cl:incidents`                   |

### FA (8)

| Label             | Route                     | Permission                  | Action key                   |
| ----------------- | ------------------------- | --------------------------- | ---------------------------- |
| New Bill          | `/fa/bills/new`           | `fa.bills.create`           | `fa::fa:bills:new`           |
| New Invoice       | `/fa/invoices/new`        | `fa.invoices.create`        | `fa::fa:invoices:new`        |
| New Journal Entry | `/fa/journal-entries/new` | `fa.journal_entries.create` | `fa::fa:journal:entries:new` |
| Submit Expense    | `/fa/expenses/new`        | `_(any user)_`              | `fa::fa:expenses:new`        |
| My Expenses       | `/fa/expenses/me`         | `_(any user)_`              | `fa::fa:expenses:me`         |
| My Approvals      | `/fa/approvals`           | `_(any user)_`              | `fa::fa:approvals`           |
| Banking           | `/fa/banking`             | `fa.banking.view`           | `fa::fa:banking`             |
| Chart of Accounts | `/fa/accounts`            | `fa.accounts.view`          | `fa::fa:accounts`            |

### FM (8)

| Label          | Route                 | Permission              | Action key               |
| -------------- | --------------------- | ----------------------- | ------------------------ |
| New Work Order | `/fm/work-orders/new` | `fm.work-orders.create` | `fm::fm:work:orders:new` |
| Work Orders    | `/fm/work-orders`     | `fm.work-orders.view`   | `fm::fm:work:orders`     |
| Assets         | `/fm/assets`          | `fm.assets.view`        | `fm::fm:assets`          |
| Inventory      | `/fm/inventory`       | `fm.inventory.view`     | `fm::fm:inventory`       |
| Vendors        | `/fm/vendors`         | `fm.vendors.view`       | `fm::fm:vendors`         |
| PM Templates   | `/fm/pm-templates`    | `fm.pm-templates.view`  | `fm::fm:pm:templates`    |
| Inspections    | `/fm/inspections`     | `fm.inspections.view`   | `fm::fm:inspections`     |
| Fleet Overview | `/fm/fleet/dashboard` | `fm.fleet.view`         | `fm::fm:fleet:dashboard` |

### FW (8)

| Label          | Route             | Permission            | Action key           |
| -------------- | ----------------- | --------------------- | -------------------- |
| Create Form    | `/fw/forms/new`   | `fw.forms.create`     | `fw::fw:forms:new`   |
| My Requests    | `/fw/my-requests` | `_(any user)_`        | `fw::fw:my:requests` |
| Approval Inbox | `/fw/approvals`   | `fw.approvals.view`   | `fw::fw:approvals`   |
| Automations    | `/fw/automations` | `fw.workflows.view`   | `fw::fw:automations` |
| Forms          | `/fw/forms`       | `fw.forms.view`       | `fw::fw:forms`       |
| Submissions    | `/fw/submissions` | `fw.submissions.view` | `fw::fw:submissions` |
| Delegations    | `/fw/delegations` | `_(any user)_`        | `fw::fw:delegations` |
| Analytics      | `/fw/analytics`   | `fw.analytics.view`   | `fw::fw:analytics`   |

### GR (17)

| Label                  | Route                             | Permission             | Action key                              |
| ---------------------- | --------------------------------- | ---------------------- | --------------------------------------- |
| My Acknowledgments     | `/gr/my-acknowledgments`          | `_(any user)_`         | `gr::gr:my:acknowledgments`             |
| My Training            | `/gr/my-training`                 | `_(any user)_`         | `gr::gr:my:training`                    |
| Compliance             | `/gr/compliance`                  | `gr.compliance.view`   | `gr::gr:compliance`                     |
| Policy Library         | `/gr/policies`                    | `gr.policies.view`     | `gr::gr:policies`                       |
| Training Library       | `/gr/training`                    | `gr.training.view`     | `gr::gr:training`                       |
| Risk Register          | `/gr/risks`                       | `gr.risks.view`        | `gr::gr:risks`                          |
| Audits                 | `/gr/audits`                      | `gr.audits.view`       | `gr::gr:audits`                         |
| Acknowledgment Tracker | `/gr/acknowledgments`             | `gr.policies.admin`    | `gr::gr:acknowledgments`                |
| New Procedure          | `/gr/procedures/new`              | `gr.procedures.create` | `gr::gr:procedures:new`                 |
| Report Incident        | `/gr/incidents/report`            | `gr.incidents.report`  | `gr::gr:incidents:report`               |
| New Risk Assessment    | `/gr/risks/wizard`                | `gr.risks.admin`       | `gr::gr:risks:wizard`                   |
| New Requirement        | `/gr/compliance/requirements/new` | `gr.compliance.admin`  | `gr::gr:compliance:requirements:new`    |
| New Audit              | `/gr/audits/new`                  | `gr.audits.admin`      | `gr::gr:audits:new`                     |
| New QI Project         | `/gr/quality-improvement/new`     | `gr.qi.admin`          | `gr::gr:quality:improvement:new`        |
| New Contract           | `/gr/contracts/new`               | `gr.contracts.create`  | `gr::gr:contracts:new`                  |
| Suggestions            | `/gr/ai/suggestions`              | `_(any user)_`         | `gr::ai-compliance::gr:ai:suggestions`  |
| Gap Analysis           | `/gr/ai/gap-analysis`             | `_(any user)_`         | `gr::ai-compliance::gr:ai:gap:analysis` |

### HR (24)

| Label             | Route                                  | Permission              | Action key                                                    |
| ----------------- | -------------------------------------- | ----------------------- | ------------------------------------------------------------- |
| New Employee      | `/hr/employees/new`                    | `hr.employees.create`   | `hr::hr:employees:new`                                        |
| Employees         | `/hr/employees`                        | `hr.employees.view`     | `hr::hr:employees`                                            |
| Submit Time       | `/hr/time-clock`                       | `_(any user)_`          | `hr::hr:time:clock`                                           |
| My Tasks          | `/hr/my-tasks`                         | `_(any user)_`          | `hr::hr:my:tasks`                                             |
| My Profile        | `/hr/me/profile`                       | `_(any user)_`          | `hr::hr:me:profile`                                           |
| HR Dashboard      | `/hr/dashboard`                        | `hr.dashboard.view`     | `hr::hr:dashboard`                                            |
| Onboarding        | `/hr/onboarding`                       | `hr.onboarding.view`    | `hr::hr:onboarding`                                           |
| Payroll Runs      | `/hr/payroll/runs`                     | `hr.payroll.admin`      | `hr::hr:payroll:runs`                                         |
| New Credential    | `/hr/credentials/new`                  | `hr.credentials.create` | `hr::hr:credentials:new`                                      |
| New Contractor    | `/hr/contractors/new/wizard`           | `hr.contractor.manage`  | `hr::hr:contractors:new:wizard`                               |
| Request Time Off  | `/hr/leave-request`                    | `_(any user)_`          | `hr::my-profile-self-service::hr:leave:request`               |
| View Pay Stubs    | `/hr/payroll`                          | `_(any user)_`          | `hr::my-profile-self-service::hr:payroll`                     |
| View Benefits     | `/hr/my-benefits`                      | `_(any user)_`          | `hr::my-profile-self-service::hr:my:benefits`                 |
| Job Postings      | `/hr/ats/job-postings`                 | `_(any user)_`          | `hr::talent-acquisition::hr:ats:job:postings`                 |
| My Credentials    | `/hr/my-credentials`                   | `_(any user)_`          | `hr::credentialing-oversight::hr:my:credentials`              |
| Compliance Report | `/hr/credentialing/report`             | `_(any user)_`          | `hr::credentialing-oversight::hr:credentialing:report`        |
| Schedule          | `/hr/scheduling`                       | `_(any user)_`          | `hr::time-leave::hr:scheduling`                               |
| Open Enrollment   | `/hr/benefits/open-enrollment`         | `_(any user)_`          | `hr::benefits::hr:benefits:open:enrollment`                   |
| Pay Rates         | `/hr/payroll/pay-rates`                | `_(any user)_`          | `hr::payroll::hr:payroll:pay:rates`                           |
| New Payroll Run   | `/hr/payroll/runs/new`                 | `_(any user)_`          | `hr::payroll::hr:payroll:runs:new`                            |
| Report Incident   | `/hr/employee-relations/incidents/new` | `_(any user)_`          | `hr::employee-relations::hr:employee:relations:incidents:new` |
| My Cases          | `/hr/employee-relations/my-cases`      | `_(any user)_`          | `hr::employee-relations::hr:employee:relations:my:cases`      |
| Performance       | `/hr/performance`                      | `_(any user)_`          | `hr::performance-analytics::hr:performance`                   |
| Analytics         | `/hr/analytics`                        | `_(any user)_`          | `hr::performance-analytics::hr:analytics`                     |

### IT (8)

| Label           | Route                | Permission          | Action key              |
| --------------- | -------------------- | ------------------- | ----------------------- |
| New Ticket      | `/it/tickets/new`    | `it.tickets.create` | `it::it:tickets:new`    |
| My Tickets      | `/it/my-tickets`     | `_(any user)_`      | `it::it:my:tickets`     |
| Knowledge Base  | `/it/knowledge-base` | `_(any user)_`      | `it::it:knowledge:base` |
| Add Asset       | `/it/assets/new`     | `it.assets.create`  | `it::it:assets:new`     |
| My Assets       | `/it/my-assets`      | `_(any user)_`      | `it::it:my:assets`      |
| All Tickets     | `/it/tickets`        | `it.tickets.view`   | `it::it:tickets`        |
| All Assets      | `/it/assets`         | `it.assets.view`    | `it::it:assets`         |
| Change Requests | `/it/changes`        | `it.changes.view`   | `it::it:changes`        |

### LO (8)

| Label            | Route                        | Permission            | Action key                      |
| ---------------- | ---------------------------- | --------------------- | ------------------------------- |
| Add To-Do        | `/lo/todos?action=new`       | `lo.todos.create`     | `lo::lo:todos:action:new`       |
| Report Issue     | `/lo/issues?action=new`      | `lo.issues.create`    | `lo::lo:issues:action:new`      |
| Schedule Meeting | `/lo/meetings?action=new`    | `lo.meetings.create`  | `lo::lo:meetings:action:new`    |
| Create Goal      | `/lo/rocks`                  | `lo.goals.create`     | `lo::lo:rocks`                  |
| New Article      | `/lo/knowledge/articles/new` | `lo.knowledge.create` | `lo::lo:knowledge:articles:new` |
| Scorecards       | `/lo/scorecards`             | `lo.scorecard.view`   | `lo::lo:scorecards`             |
| Meetings         | `/lo/meetings`               | `lo.meetings.view`    | `lo::lo:meetings`               |
| Knowledge Portal | `/lo/knowledge`              | `lo.knowledge.view`   | `lo::lo:knowledge`              |

### PM (8)

| Label                | Route                     | Permission              | Action key                   |
| -------------------- | ------------------------- | ----------------------- | ---------------------------- |
| Register Patient     | `/pm/patients?action=new` | `pm.patients.create`    | `pm::pm:patients:action:new` |
| Schedule Appointment | `/pm/scheduling`          | `pm.scheduling.view`    | `pm::pm:scheduling`          |
| Charges              | `/pm/charges`             | `pm.charges.view`       | `pm::pm:charges`             |
| Claims               | `/pm/claims`              | `pm.claims.view`        | `pm::pm:claims`              |
| Patients             | `/pm/patients`            | `pm.patients.view`      | `pm::pm:patients`            |
| Revenue Dashboard    | `/pm/revenue`             | `pm.rcm_dashboard.view` | `pm::pm:revenue`             |
| Prior Authorizations | `/pm/authorizations`      | `pm.prior_auth.view`    | `pm::pm:authorizations`      |
| Payments             | `/pm/payments`            | `pm.payments.view`      | `pm::pm:payments`            |

### RH (8)

| Label         | Route                    | Permission            | Action key                  |
| ------------- | ------------------------ | --------------------- | --------------------------- |
| Bed Board     | `/rh/bed-board`          | `rh.beds.view`        | `rh::rh:bed:board`          |
| New Admission | `/rh/admissions/new`     | `rh.residents.create` | `rh::rh:admissions:new`     |
| Log Event     | `/rh/significant-events` | `rh.residents.view`   | `rh::rh:significant:events` |
| Curfew Check  | `/rh/curfew-checks`      | `rh.residents.view`   | `rh::rh:curfew:checks`      |
| Residences    | `/rh/residences`         | `rh.residences.view`  | `rh::rh:residences`         |
| Episodes      | `/rh/episodes`           | `rh.residents.view`   | `rh::rh:episodes`           |
| Attendance    | `/rh/attendance`         | `rh.residents.view`   | `rh::rh:attendance`         |
| Compliance    | `/rh/compliance`         | `rh.compliance.view`  | `rh::rh:compliance`         |

***

## See also

* Spec: [`specs/pf/specs/PF-99-quick-actions-catalog-sync.md`](https://github.com/Encore-OS/encoreos/blob/development/specs/pf/specs/PF-99-quick-actions-catalog-sync.md)
* Catalog code: [`src/platform/navigation/quick-action-catalog.ts`](https://github.com/Encore-OS/encoreos/blob/development/src/platform/navigation/quick-action-catalog.ts)
* Module-registry types: [`src/platform/modules/module-registry/types.ts`](https://github.com/Encore-OS/encoreos/blob/development/src/platform/modules/module-registry/types.ts)
* Seed migration (initial): [`supabase/migrations/20260413180000_pf_quick_action_catalog_and_org_selections.sql`](https://github.com/Encore-OS/encoreos/blob/development/supabase/migrations/20260413180000_pf_quick_action_catalog_and_org_selections.sql) (DDL only)
* Seed migration (data, PF-99): [`supabase/migrations/20260418021116_pf99_pf_quick_action_catalog_seed.sql`](https://github.com/Encore-OS/encoreos/blob/development/supabase/migrations/20260418021116_pf99_pf_quick_action_catalog_seed.sql)
