--- name: my-onboarding description: Generate a partner's own onboarding and certification progress report — what's done, what's left, and what's overdue across the flows assigned to them by one customer, using EULER MCP tools. Use this skill whenever a partner wants their personal onboarding status — phrases like "where am I in my onboarding", "my certification progress", "what onboarding steps do I have left", "am I done with onboarding", "show my training progress". Partner-facing (a partner viewing their OWN progress), NOT a customer admin reviewing partners — that distinction selects this skill over generate-qbr. --- # my-onboarding — your onboarding & certification progress ## When to use this skill Invoke when **a partner** wants a read on **their own** onboarding / certification progress with one customer — what's done, what's left, what's overdue: - "Where am I in my onboarding?" / "Am I done with onboarding?" - "My certification progress" / "Show my training progress" - "What onboarding steps do I have left?" - `/euler-for-partner-managers:my-onboarding` DO NOT invoke for: - **A customer admin reviewing partners** — a single-partner deep review is `generate-qbr`. That is customer-scope and looks *at* partners; this skill is the partner looking at *themselves*. - **A customer admin asking "who's stuck in onboarding?"** — not feasible today (the customer surface exposes no per-partner progress). Say so. The distinction that selects this skill: **the connected account is the partner, and the subject is that same partner's own flows.** Per-flow progress (`percent_complete`, step buckets, due dates, badge) is exposed only partner-side — that is why this is the partner's self-service view, not a customer-admin one. ## Account type — required: partner This skill is the **inverse** of the customer-admin gate: it needs a connection with a `type === 'partner'` entry (the partner viewing their own progress). **Step 1 is always `list_accounts`.** Apply the account gate in [`references/account-gate.md`](references/account-gate.md) before anything else: - Connected account has a `type === 'partner'` entry → proceed (partner context); take `partner_id` + `affiliate_company_name` from that entry. - **Customer-only connection** (no `type === 'partner'`) → emit the friendly gate message and **STOP** (do not proceed into a raw `forbidden_scope`): "my-onboarding shows *your* progress as a partner; you're connected as a customer admin — partner onboarding lives in your dashboard: ``." Use the `dashboard_url` from the customer entry. - Both roles → proceed as the partner (use the partner entry). `partner_id` comes **only** from the chosen `type: 'partner'` entry — **never** from `partner_directory_search` (that returns a directory `profile_id`, rejected downstream as `partner_not_in_consent`). Translate any escaping `forbidden_scope` into the same friendly message; never show the user `forbidden_scope` or any `euler_*` code. ## Inputs (optional — never block) No date window — progress is current state; "overdue" comes from the tool's own `overdue_count` / `flow_due_date`, never a user-supplied window. | Input | Default | Accepts | |---|---|---| | **Which customer** | the only `type:'partner'` account | a customer name → match `affiliate_company_name`. If >1 partner account and the user named none (or it matches several), **ask** which — show the `affiliate_company_name` list. | | **Flow filter** | all assigned flows | "just my certifications" / "the X onboarding" → filter the assigned-flow list by `flow_type` / title. | One partner + one customer pairing per invocation — do not fan out across accounts. ## Orchestration sequence 3 fixed calls + one progress call per assigned flow. For exact response field paths per tool, consult [`references/mcp-field-paths.md`](references/mcp-field-paths.md) (both `partner_flow_*` tools are `scope: partner`; a customer-admin session cannot see them). | # | Tool call | Provides | |---|-----------|----------| | 1 | `list_accounts` | Account gate + `partner_id` + customer `affiliate_company_name` (header). | | 2 | `partner_flow_details` (`partner_id`, **no drill-down param**) | The partner's currently-assigned flows — `flow_id`, title, type. The discovery anchor; do NOT pass `name`/`flow_id`/`flow_step_id` here (they are mutually exclusive drill-downs). | | 3 | `partner_flow_progress` (`partner_id`, `flow_id`) — **once per flow** | `percent_complete`; counts (`total_steps`, `done_count`, `failed_count`, `to_do_count`, `overdue_count`); per-status detail lists (`to_do_details` / `overdue_details` / `done_details` / `failed_details`); `flow_title`, `flow_type`, `flow_due_date`, `flow_due_in_days`, `certification_badge`. | Realistically 1–5 flows. Cap at ~8 progress calls; if a partner has more, render the top 8 by urgency and add a one-line footnote.[^cap] A non-assigned or empty flow returns empty counts + empty detail lists (**not** an error) → **skip it silently**. [^cap]: A partner with >8 assigned flows is unusual; the cap bounds the call count. Order by urgency (overdue first) before truncating so the cut never hides an overdue flow. ### Error handling - Customer-only account → friendly gate message (see §Account type), STOP. - `backend_data_issue` on `list_accounts` → surface its `support_email`, note reconnecting won't help, and continue with whatever the flow tools return. - `forbidden_scope` escaping mid-run → translate via `references/account-gate.md` into the friendly message; never surface the raw code. - Any single `partner_flow_progress` empty/errors → skip that flow; one-line footnote at the end if a named flow could not be read. No giant banner. - **Zero assigned flows** → a positive empty state ("Nothing's assigned to you with {Customer} yet"), no tables, no fabricated rows. ## Progress logic - **Overall %** = Σ`done_count` / Σ`total_steps` across all flows — **NOT** the average of per-flow `percent_complete` (a 2-step and a 20-step flow must not weigh equally). State the basis in `.fact-sub` (e.g. "12/20 steps · across 3 flows"). Zero-denominator collapse: Σ`total_steps` = 0 → render **"—"**, not "0%". - **Per-flow status / tone** (first match wins): - 🟢 **Done** — `percent_complete` = 100% (certification badge earned, for Certification flows) - 🔴 **Overdue** — `overdue_count` > 0 - 🟡 **In progress** — started (`done_count` > 0), no overdue - ⚪ **Not started** — `done_count` = 0 - **Hero tone + spotlight** follow the **worst** per-flow status: any flow overdue → red; else any in progress → amber; all done → green. - **Spotlight = the single most-urgent move:** the flow with overdue steps (or, if none overdue, the soonest `flow_due_date`) + its top blocking step from `overdue_details` / `to_do_details`. e.g. "Finish *{step}* in *{flow}* — due {date}." - **Most urgent first:** order the per-flow sections **overdue → due-soon → in-progress → done**. ## 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/fonts/scripts beyond the one web-font import. Opens in a browser, prints to PDF, or shares by file/link (email, Notion, Slack). Note: pasting raw HTML into Slack does not render — share the file or a link. ### Euler design system (modern report treatment) Output follows the **Euler design system** in a modern, landing-page-style layout: sticky **topbar** with the Euler **text wordmark** → **hero** (eyebrow chip + headline with a gradient `.accent` span + `.quick-facts` headline stats) → **spotlight** gradient panel for the one most-urgent move → per-flow sections (`.section-eyebrow` "01 · …") each with a `.progress` bar + `.attention` step rows → footer. Read [`assets/styles.css`](assets/styles.css) and inline its FULL contents into a single `