--- 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 ``). Fluid `clamp()` type; the worklist table scrolls on narrow screens. Must look right at 360px. Cap the worklist at a sensible length (e.g. 25 rows) + note any overflow — keep the HTML small. ### How to produce the HTML Read [`assets/styles.css`](assets/styles.css) and inline its FULL contents into one `