--- name: partner-briefing description: Generate a pre-meeting briefing about a specific partner — 30-second read with what they'll want to discuss, what you should bring up, and key stats from the last 30 days. Use this skill whenever the user mentions a partner call, partner meeting, pre-call prep, partner briefing, or asks "what should I know before I talk to a partner", "prep me for my call with this partner", or "give me a quick read on a partner" — even when the word "briefing" isn't used. --- # Partner Briefing — Pre-meeting prep for a partner call ## When to use this skill Invoke whenever the user types something like: - "Briefing on " - "Prep me for my call with " - "What should I know before I meet ?" - "Give me a quick read on " - "I have a call with in 30 minutes" - `/euler-for-partner-managers:partner-briefing` DO NOT invoke for: - **Quarterly retrospectives** — use `generate-qbr` instead (different audience, different format, longer doc). - **Multi-partner overviews** — this skill is per-partner. - **Company-wide reviews** — use `performance(action: 'company')` directly. The distinction that matters: a briefing is **forward-looking** (what to walk into a meeting knowing). A QBR is **backward-looking** (what happened last quarter, shareable doc). If the user wants to *send something to the partner*, route to QBR. If they want *internal prep before talking to them*, this skill. ## Inputs needed from user ### 1. Which partner? Same resolution as `generate-qbr`: 1. `list_accounts` if the user has an account with that partner. 2. Otherwise `partners(action: 'list', filter_name: '')` and match on `"Partner name"` (case-insensitive substring). 3. If multiple matches, list with `status` and ask the user to pick. ### 2. (Optional) Lookback window Default: **last 30 days from today**. Accept variants: `"last week"` (7 days), `"last 2 weeks"`, `"last month"`, `"since last meeting"` (treat as 30 days unless user specifies a date), `"since "`. Render dates in `YYYY-MM-DD` format when calling the MCP. ### 3. (Optional) Meeting context A short tag like `"renewal call"`, `"QBR call"`, `"first intro"`, `"escalation"`. If supplied, it reshapes the "What they'll likely want to talk about" section. If not supplied, do not ask — generic framing is the default. ## Orchestration sequence Same 6 MCP tools as `generate-qbr`, just with a 30-day window by default instead of a quarter. Skip steps only if the user's framing excludes them (e.g. "skip pipeline, just the agreements"). | # | Tool call | Provides | |---|-----------|----------| | 1 | `list_accounts` | Customer-side name (rarely rendered in briefing — internal prep doesn't need a doc header) | | 2 | `partners(action: 'list', filter_name: '')` | Resolves `partner_id`. Skip if user provided one. | | 3 | `performance(action: 'partner', partner_id, start_date, end_date)` | Headline movement in the window | | 4 | `partner_artifacts(action: 'deals', partner_id, page: 1, limit: 20)` | All-time pipeline — used for "what they'll want to discuss" + "what you should bring up" | | 5 | `commissions(action: 'partner', partner_id, start_date, end_date)` | Recent commission events | | 6 | `referrals(action: 'for_partner', partner_id, page: 1, limit: 20)` | All-time referrals; filter to the window by parsing `"Submitted On"`. **Cap at ~2 pages** — this is a 30-second read; if the window isn't fully covered, report an approximate floor ("40+ in 30d"), don't paginate the whole history. | | 7 | `partner_artifacts(action: 'agreements', partner_id)` | Open agreement blockers | | 8 | `influenced_sourced_deals(partner_id, start_date, end_date)` | Sourced vs Influenced split for the window. Adds depth to "what they'll want to talk about" — partners commonly raise attribution disputes. | | 9 | `performance(action: 'partner', partner_id, prev_window_dates)` | Previous window (e.g. 30 days before the current 30-day window) for delta indicators in the hero facts (`.fact-sub`). | For exact field paths per tool, consult [`references/mcp-field-paths.md`](references/mcp-field-paths.md). The same backend serves this skill and `generate-qbr`; the same gotchas apply (date format `YYYY-MM-DD` for `performance`, `last_stage_change_date` is a duration not a timestamp, JSON serialization bugs on `referrals(for_partner)`). ### Error handling Inherits from `generate-qbr`: `partner_not_in_consent` → abort with reconnect instructions; tool errors mid-run → render the rest and add a footnote. A briefing is short, so if any single tool fails, a footnote is fine — don't add a giant red banner. ## Status traffic light (briefing variant — 30-day window) The same emoji vocabulary as QBR, but the conditions are tuned for a shorter window: | Indicator | Conditions | |-----------|------------| | ⚪ **Inactive** | `partner_status` = "Inactive" — meeting is likely reactivate-or-offboard | | 🟢 **Hot** | Any of these in the window: ≥1 closed-won deal, ≥1 **real** referral approved (ignore test/placeholder/malformed entries — a date-as-name, `test`, or blank-company row is NOT a real approval), ≥1 agreement signed, or commission paid | | 🟡 **Steady** | Default — activity in flight (open pipeline, pending referrals, in-progress agreements) but no closes in window | | 🔴 **Cold / blocked** | `partner_status` = "Active" AND zero window activity AND foundational blocker present (unsigned agreement, stuck referrals, no open pipeline) | The traffic light is the most important single signal — the partner manager glances at it before reading anything else. ## 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 Render a **single self-contained HTML file** — no external CSS, no external fonts, no script tags. The user opens it in a browser, prints to PDF, or shares the file / link (email, Notion, Slack). Note: pasting raw HTML into Slack does not render — share the file or a link instead. Portability across these targets demands a self-contained artifact. **Target length:** ~200 words of body content. The point is 30-second readability before walking into a call. ### How to produce the HTML 1. Read [`assets/styles.css`](assets/styles.css) and inline its full contents into a single `