---
name: pending-approvals-triage
description: Build a prioritized, age-sorted worklist of everything awaiting a customer admin's approval — partner applications, pending referrals, and pending deal registrations — using EULER MCP tools. Use this skill whenever a partner manager wants to triage what's stuck in their approval queue — phrases like "what's pending approval", "what do I need to approve", "my approval queue", "any pending partners or referrals", "what's waiting on me", "triage approvals" — and wants the oldest/most-overdue items surfaced first.
---
# Pending Approvals Triage — one age-sorted worklist of what's waiting on you
## When to use this skill
Invoke when a customer admin wants to clear their approval backlog:
- "What's pending approval / waiting on me?"
- "My approval queue", "triage approvals"
- "Any pending partners, referrals, or deal registrations?"
- `/euler-for-partner-managers:pending-approvals-triage`
DO NOT invoke for:
- **Approving an item** — this skill is read-only; it surfaces + prioritizes the
queue and deep-links to the dashboard to act. It does not approve anything.
- **A portfolio overview** — this skill covers the approval queue only.
- **A single partner's detail** — use `generate-qbr` / `partner-briefing`.
## Account type — required: customer admin
For **customer admins / partner managers**. NOT usable from a partner-only account.
**Step 1 is always `list_accounts`.** Apply [`references/account-gate.md`](references/account-gate.md):
proceed only with a `type === 'customer'` entry; a partner-only connection gets the
friendly gate message and STOPs (no raw `forbidden_scope`).
## Inputs (all optional)
- **Type filter** — default: all three queues. Accept "only referrals", "only deal
registrations", "partner approvals only".
No date window — pending is current state. "Age" is how long each item has waited.
## Orchestration sequence (~4 calls)
| # | Tool call | Provides |
|---|-----------|----------|
| 1 | `list_accounts` | Customer-side `name` (header) + account gate. |
| 2 | `partners(action: 'pending')` | Partner applications awaiting approval. |
| 3 | `referrals(action: 'search', os_referral_type: 'Referral', filter_status: 'pending')` | Referrals awaiting review. |
| 4 | `referrals(action: 'search', os_referral_type: 'Deal Registration', filter_status: 'pending')` | Deal registrations awaiting review. |
`os_referral_type` is **required** for `search` — that's why referrals + deal
registrations are two separate calls. `filter_status` matches Bubble **literally** —
use the exact lowercase `pending`. Honor the user's type filter by skipping the
queues they excluded.
For response field paths, see [`references/mcp-field-paths.md`](references/mcp-field-paths.md)
(provisional — validate on first run). Backend gotchas: numerics arrive as strings;
parse `"Submitted On"` dates loosely; some payloads are stringified JSON.
### Error handling
- Partner-only account → gate message, STOP.
- `backend_data_issue` on `list_accounts` → surface its `support_email`; continue.
- `forbidden_scope` escaping mid-run → translate via `account-gate.md`; never show the code.
- A single queue empty/erroring → continue; footnote which queue is incomplete.
## Triage logic (age / SLA)
- Compute each item's **waiting age** from `"Submitted On"`. For partner applications,
use an applied/created date if present; if none, list it without an age and say so.
- Merge all three types into ONE **worklist, oldest-first**, each row tagged with its
type (Partner app · Referral · Deal reg).
- **SLA color by age:** 🔴 > 14 days · 🟡 7–14 · 🟢 < 7.
- Per-queue counts + the single oldest wait feed the hero.
- **Inbox zero:** if all three queues are empty, render a positive spotlight ("Nothing
awaiting approval") and omit the worklist.
## Product how-to questions (`euler_help`)
If the user asks how EULER itself works or how to do something in the product — not about
their own data — e.g. "how do I register a deal", "where do I find X in the portal", "how
does onboarding work" — call `euler_help` with their question and answer briefly from its
result. Do not guess about product behavior. This is a tangent to this skill's main job:
answer in 1–3 sentences (no HTML report) and return to the task.
## Output format
Single self-contained HTML, following the **Euler design system** in the modern
treatment (same stylesheet family as `generate-qbr` and `partner-briefing`).
### Lightweight & mobile-responsive (required)
No JavaScript. **No images** — the brand is a text wordmark ("Euler",
`.brand-mark` / `.footer-mark`); do NOT add an `` (the remote logo renders
broken in Claude). Fonts load non-blocking (`display=swap` + the `preconnect` tags in
`