---
name: adom-desktop-bridge-ownership
description: The boundary between Adom Bridge core and a bridge author — what AD owns vs what you (the bridge) own. Read before filing an AD bug about a bridge (kicad, fusion360, native-browser, puppeteer, blender, rdp, or any third-party bridge) or before editing bridge code, so you fix and report in the right place.
---

# Who owns what: AD core vs bridge author

**Read this FIRST if you're working on, debugging, or filing a bug about a bridge
(kicad, fusion360, native-browser, puppeteer, blender, rdp, or any third-party
bridge).** It exists because an AI drove the Fusion bridge end-to-end, hit a dozen
issues, and filed almost all of them against **adom-desktop** — when nearly every
one was **bridge code**. The platform never stated the boundary, so the AI guessed
"AD," posted to the wrong place, and hand-edited the wrong copy. Don't repeat that.

## The split

### Adom Bridge (AD) core owns
- The `adom-desktop` CLI + the **relay / `/command` passthrough** (AD relays a
  bridge's response **verbatim** — incl. `_hint`/`_next`/`related` and every other
  top-level field the bridge sets; v1.9.30 made this a denylist, never an allowlist).
- **Bridge lifecycle**: discover/register/spawn/reap, stable ports, the
  `bridge_*` verbs, and **streaming a bridge from its wiki page into the local
  cache** (`bridge_install` / `refresh_bridges` / the 4-h auto-sync).
- The core `desktop_*` verbs (input, screenshot, UIA, tunnels, wsl, …).
- Generic, app-agnostic behavior. **AD returns good DATA so the calling AI decides
  — it does NOT bake in app-specific verbs** (see CLAUDE.md "AD stays GENERIC").

### The bridge author owns (NOT AD)
- **Every bridge-specific verb and its behavior** — args, outputs, and the per-call
  `_hint`/`_next`/`related`/`pitfalls` (the rich-hint contract). A wrong/missing
  hint is a **bridge** fix.
- **Any integration the bridge ships** — e.g. Fusion's **APS** cloud search: its
  OAuth/auth, its config, its `*_aps_*` verbs, its never-charge caps. AD does NOT
  manage it. Divergent results from the bridge's own status verb = a **bridge** bug.
- **The bridge's add-in / plugin code AND getting it deployed into the host app.**
  Editing the streamed cache source is not enough if the host app loads the add-in
  from elsewhere (e.g. Fusion loads from `%APPDATA%\…\API\AddIns\`, not the
  bridges-cache) — wiring cache→host-app is the **bridge's** concern.
- The bridge's `SKILL.md`, `describe` verb, hero/wiki page, and version.
- The **edit-source → publish → bump version → reinstall** loop.

## The cardinal rules

1. **NEVER hand-edit the streamed cache** (`%LOCALAPPDATA%\Adom Desktop\bridges-cache\<bridge>\`).
   It's a download. Edit the **source** (the bridge's own repo/wiki), `publish`,
   bump the version, then `bridge_install`/`refresh_bridges` to pull it. A
   hand-edit is overwritten on the next sync and may not even be what the host app
   runs (cache-vs-deployed-copy gotcha).
2. **Before filing a bridge bug against adom-desktop, ask "who owns this?"** If it's
   verb behavior, a hint, an integration, an add-in, or the bridge's docs → it's the
   **bridge author's** repo/wiki, not AD. Cloud-owned bridges (kicad, fusion, puppeteer)
   live in their OWN wiki repos (see CLAUDE.md "Cloud-owned bridge repos").
3. **AD's job is to relay + host, generically.** If AD is *dropping* or *mangling*
   a bridge's data, or missing a lifecycle/verb capability — THAT is an AD bug.
   Fix the AD VERB; don't re-absorb the bridge.

When in doubt: data-shape/relay/lifecycle/ports → **AD**; what a verb does, its
hints, its integration, its add-in, its docs → **the bridge**.

## Skill ownership — a bridge ships its OWN skill pkg (not bundled in AD-core)

The same boundary applies to the **consumer skill** (the SKILL.md that teaches a cloud
container how to drive a bridge's verbs):

- **The AD-core pkg** (`adom-wiki pkg install adom/adom-desktop`) ships ONLY core skills —
  desktop verbs, discovery, direct-api, installer, notify, multi-ad, bridge-sdk,
  bridge-ownership, windows-host. It must NOT bundle a cloud/3rd-party bridge's skill (it
  would go stale and isn't AD's to own). (2026-06-28: `eagle-commands.md` — Fusion-Electronics,
  `fusion_electron_run` — was dropped for this reason; 2026-06-29: `pup-SKILL.md` was dropped
  too when Puppeteer became cloud-owned. Both belong in their bridge's own pkg.)
- **Each cloud/3rd-party bridge publishes its OWN skill pkg** carrying its SKILL.md, e.g.
  `adom/adom-desktop-kicad-bridge`, `adom/adom-desktop-fusion-bridge`,
  `adom/adom-desktop-puppeteer-bridge`. The cloud thread that owns the bridge owns + bumps it.
  (Puppeteer's runtime still ships as an NSIS-bundled SEED for fresh-PC/offline spawn — but its
  *skill* now ships from its own page, like the other cloud bridges.)
- **How a container gets dynamic bridge skills:** it does NOT get them from the AD-core install.
  It (a) installs AD-core (CLI + core skills), then (b) `adom-desktop bridge_list` against the
  live laptop AD to see which bridges are present, then (c) `adom-wiki pkg install
  adom/adom-desktop-<bridge>-bridge` for each one it needs (and `adom-wiki pkg update` keeps them
  fresh, version-matched to the bridge the cloud thread published). The bridge's runtime PAYLOAD
  (what AD spawns on the laptop) is a SEPARATE artifact — the `/files` manifest+zip that
  `bridge_install`/`refresh_bridges` pull — don't conflate it with the skill pkg.
- **Discoverability gap / enhancement:** `bridge_list` should surface the exact
  `adom-wiki pkg install adom/adom-desktop-<name>-bridge` line per live bridge so a container
  knows precisely which skill pkg to pull (today it infers the slug from the bridge's `docs`).
