---
name: fusion-demo
description: >
  Run a FIRST-TIME-USER demo of the Fusion 360 bridge - the guided tour Hydrogen Desktop's installer
  fires when someone new wants to see what this thing does. Covers the one verb (fusion_demo), the
  staged loop, and the two rules that make or break it: FINISH the Autodesk sign-in (never leave a new
  user parked on the sign-in page) by driving the user's NATIVE browser via ABE/nbrowser_* (already
  signed into Autodesk) instead of pup (anonymous), and SET UP APS cloud search rather than just
  mentioning it, then prove it with a live sample search. Then show real work in order: electronics
  PROJECT -> SCHEMATIC -> 2D BOARD -> 3D BOARD. Trigger words - fusion demo, demo the bridge, show me
  fusion, first time user demo, hd installer demo, demo verb, guided tour, showcase fusion, new user
  onboarding demo, fusion_demo.
---

# Demoing the Fusion bridge to a brand-new user

## Why this exists

HD's installer ran a "demo" that opened Fusion and then **sat on the Autodesk sign-in page doing
nothing** (John, 2026-07-20). A first-time user watched an app open and stall. That is the single
worst first impression this bridge can make, and this skill exists to make it impossible.

**A demo is not "launch the app." A demo finishes the blockers and shows real work.**

## The one verb

```bash
adom-desktop fusion_demo '{}'                       # start / resume the tour
adom-desktop fusion_demo '{"query":"BQ25792"}'      # demo a specific design
adom-desktop fusion_demo '{"stage":"skip_aps"}'     # user declined cloud-search setup
```

It is **staged and resumable**. Every call advances as far as it safely can and returns:

| Field | Use it for |
|---|---|
| `stage` | where you are: `not_installed`, `signin`, `aps_setup`, `open_design`, `done`, ... |
| `done` | keep calling `fusion_demo` until this is `true` |
| `narrate` | say this to the user, verbatim-ish. It is written for a newcomer, not an engineer |
| `screenshots` | `[{label,path}]` - SHOW these; labels are `project`, `schematic`, `board_2d`, `board_3d` |
| `steps` | what it actually did, for your own logging |
| `_hint` | the exact next action, including the `nbrowser_*` calls for the browser leg |

Loop: call it, do what `_hint` says, narrate, call it again. Do not improvise a different order.

## Rule 1: FINISH the sign-in, in the user's NATIVE browser

`fusion_demo` does not just tell you to do this - at `stage:"signin"` it **already opened the
Autodesk sign-in in the user's own browser, in the BACKGROUND**, so their current work is never
interrupted. The response tells you where it landed:

| Field | Meaning |
|---|---|
| `signinOpened` | true if the background tab is up |
| `signinWhere` | the EXACT place, e.g. "Chrome - John Personal (jlauer12@gmail.com)" - say this verbatim |
| `signinProfileChoices` | every profile (describe/email/displayName/active/live/extensionInstalled) |
| `signinProfile` / `signinSession` | the ABE profile + sessionId (`fusion-signin`) to drive it |

### Pick the profile by EVIDENCE, never by "whichever is active"

`fusion_demo` probes **every live profile** with
`nbrowser_login_state {profile, url:"https://accounts.autodesk.com/"}` and picks the one that
actually holds an Autodesk session (auth cookies), reporting why in `signinProfileReason` and the
per-profile `autodesk` / `autodeskConfidence` / `autodeskCookies` in `signinProfileChoices`.

This exists because the first version just grabbed the *active* profile and landed in John's
**personal** Chrome with no analysis at all - on another machine that would have been simply wrong.
A user's Autodesk seat can live in any profile, and it is frequently NOT the one they happen to be
using. **Ask the browser; do not assume.**

- **Relay the reason** to the user ("I used X because it's the profile actually signed into Autodesk").
- If `signinProfileAmbiguous` is true (nothing signed in anywhere, or several are), **ASK which
  account their Autodesk login belongs to** rather than picking for them.
- Profiles that are asleep or lack the extension come back `unprobed` - say so instead of silently
  skipping them.

**Never say "it's in your browser" or even "your Chrome".** A power user runs several profiles -
personal, work, media - and a vague pointer sends them hunting through windows. Always name the
browser AND the identity from `signinWhere`. If `signinProfileChoices` has more than one, say which
one you used and offer to switch to another. If the profile they want shows
`extensionInstalled:false`, it needs the one-time extension install in THAT specific profile
(extensions are per-profile).

**Always tell the user where it is waiting, then offer all three paths:**

1. **They finish it themselves**, whenever they like - it is sitting there, backgrounded.
2. **You bring it to the front** for them (foreground that nb window) if they would rather do it now.
3. **You drive it for them** - ASK first (`AskUserQuestion`), then click through
   "Continue with Google/Apple/Microsoft" on their warm session.

Never silently sit and wait, and never foreground it uninvited.

Then:

- **Use ABE (`nbrowser_*`), never pup.** pup is an anonymous browser, so Autodesk demands a full
  login with password + 2FA. The user's real Chrome/Edge profile is **typically already signed into
  Autodesk**, so the same flow is one click. `nbrowser_profiles` lists their real profiles; ABE
  exposes these verbs even before the browser extension is installed.
- Click Fusion's **Sign In** in the BACKGROUND (`desktop_find_control` + `desktop_ui_click`), never a
  coordinate click, never steal focus.
- That fires the OAuth at the **default** browser. If that is the signed-in profile it completes
  itself; if it lands logged-out, re-open the auth URL with
  `nbrowser_open_window {profile:"chrome:<their account>"}`.
- The handoff back is the **Autodesk Identity Manager** overlay: tick "Always allow", click "Open".
- **Never type their password or 2FA.** If a secret is demanded, `fusion_notify_owner` toasts their
  machine so they type it. Sign-in codes expire in ~2 minutes; if it expires, click Sign In again for
  a fresh one.

Full detail: the **fusion-autodesk-signin** skill.

## Rule 2: SET UP APS, don't just name-drop it

When `stage:"aps_setup"`, actually configure it (`fusion_aps_status` -> `fusion_aps_set_client_id`
if unconfigured -> `fusion_aps_signin` driven in the native browser -> poll until `tokenLive:true`).
Then the demo runs a **live sample search** so the user watches their whole Autodesk hub return
results in about two seconds.

If they decline, call `fusion_demo {stage:"skip_aps"}` and still TELL them what it is: server-indexed
search across the team hub in seconds. The old in-app search took 30+ minutes and crashed Fusion, so
it is disabled - APS is the only cloud-search path. See **fusion-aps-search**.

## Rule 3: the tour order is fixed

**electronics PROJECT -> SCHEMATIC -> 2D BOARD -> 3D BOARD.** That sequence tells the story of how a
board is actually made, and each step is screenshotted so you can show it. Always open the PROJECT
(`EcadDesignProductType`), never a `.brd`/`.sch`/3D child - a child opens an isolated, often empty
view and the demo looks broken.

## Landing it

Close by offering next steps in the user's own words, not verb names: "export the Gerbers", "make me
a SOIC-8 with my part number etched on it", "check this against JLCPCB rules", "find my other
boards". The full catalog is `fusion_describe`.

## If Fusion isn't installed: offer it, and say what they actually get

Do not just report "not installed". OFFER, and be concrete AND honest about the tiers:

- **Free 30-day trial: fully featured.** Every step of this demo works - electronics design,
  schematic, 2D board, 3D board, Gerber/BOM/CPL exports, APS cloud search. This is the one to start
  on; there is no reason to hedge about it.
- **After the trial: Fusion for Personal Use is free** for non-commercial work. Still genuinely
  useful for hobby PCBs, but it LIMITS electronics (roughly 2 layers, 2 schematic sheets, a modest
  board area) and some export options. Say that plainly rather than letting them discover it.
- **Even an expired / read-only install still OPENS and VIEWS designs** (it only blocks
  save/export/modify), so nothing they make gets locked away.

Then `fusion_install_fusion` (no shell approval needed, streams the installer, 10-30 min), poll
`fusion_readiness` until `installed:true`, and call `fusion_demo` again to pick the tour back up.
Full flow: **fusion-onboarding**.

## If something else is missing

- Nothing to open -> ask which board, or `fusion_aps_search` and open the first hit.
- Never end a demo on an error screen. If a stage fails, say what you tried, and offer the next thing.
