---
path: /isis/comfy-nodes
surface: admin
domain: isis
auth: signed-in (admin)
source: apps/oshun/admin/src/app/isis/comfy-nodes/page.tsx
status: drafted
last_walked: '—'
---

# Isis ops · ComfyUI nodes

## Purpose

ComfyUI node-registry browser (§24.3): lists every registered node type with its
schema, deprecation flag, alternative-node suggestion, and the workflow classes
that reference it (a "used by" report). Pairs with `isis-workflow-editor.md`
which composes graphs against this registry.

## Entry points

- Direct URL — `/isis/comfy-nodes`
- External runbooks / deep links to the Isis ops admin area
- Not in canonical IA — no sidebar entry

## Layout regions

The page does NOT wrap the body in `AdminShell`. Server entry resolves the node
list via `binding` (set by `bindNodeRegistryLoader`) and renders
`<ComfyNodesPanel nodes={nodes} />`:

- **ComfyNodesPanel** — `<main>` with a 300px aside + 1fr detail:
  - **Aside / Filter** (`aria-label="Filter"`):
    - h2 "Nodes (`<filtered.length>`)"
    - **Search input** — `data-field="search"`, placeholder
      `classType / display / category`; filters by lowercase match on
      `classType` / `displayName` / `category`
    - **"Show deprecated" checkbox** — `data-field="showDeprecated"`; when off,
      deprecated nodes hidden
    - **Node list** (`<ul data-testid="node-list">`) — each `<li>` is
      `role="button"` with `tabIndex={0}`; clicking or Enter sets `selectedIdx`
  - **Detail pane** — schema / deprecation / alternative-node suggestion / "used
    by" workflow-class ids for the selected node

## States

- [ ] Anonymous → global middleware redirects (this route is NOT in
      `PUBLIC_PATHS`)
- [ ] Binding not set → `binding ? await binding() : []` returns `[]`; panel
      renders empty list
- [ ] Binding bound, registry populated → list renders; first entry selected
- [ ] Query trims to empty → all (non-deprecated) nodes
- [ ] Query non-empty → case-insensitive substring match across classType /
      displayName / category
- [ ] Show-deprecated toggle off → `deprecated === true` nodes filtered out
- [ ] `selectedIdx` overflows filtered length → clamped to last entry;
      `selected` falls back to null when filtered is empty

## Interactions

- [ ] **Search input** — `<input type="text" data-field="search">`
  - Function: updates `query` state; re-derives `filtered`
- [ ] **"Show deprecated" checkbox** — `data-field="showDeprecated"`
  - Function: toggles `showDeprecated` state
- [ ] **Node list item** (`<li role="button" tabIndex={0}>`)
  - Function: sets `selectedIdx`; Enter key activates
- [ ] Detail-pane interactions inside the selected node view (read from the
      panel source if exposed; the visible code shows selection only)

## Data & contracts

- **Reads**: `binding()` returns `readonly NodeRegistryItem[]` — each item
  `{ definition: NodeDefinition, deprecated: boolean, alternativeClassType: string | null, usedByWorkflowClassIds: readonly string[] }`.
  Production binding wires `@yemaya/comfyui-integration` exports
- **Writes**: _None visible at page level._ The browser is read-only
- **Realtime**: _None._
- **Auth/role check**: only the global middleware

## Cross-references

- Shell: `shell/02-routing-layouts.md`
- Sibling route: `isis-workflow-editor.md` (consumes node registry to build
  workflow classes)
- Library: `@yemaya/comfyui-integration` — `NodeDefinition`
- Component source:
  `apps/oshun/admin/src/app/isis/comfy-nodes/ComfyNodesPanel.tsx`

## Open questions / known gaps

- [ ] `bindNodeRegistryLoader` is module-level mutable state; document where
      production binding happens
- [ ] No session / scope check at the page level
- [ ] Confirm whether the registry browser has write affordances (mark
      deprecated, edit alternative-node suggestion) anywhere beyond the visible
      read-only list
