# Serious Issues Remaining in UEWingman Handlers

## Breaking API Changes

Several handlers switched from GUID-based node matching to
`WingUtils::Identifies()`. Since the only caller is our own MCP
bridge (which uses `FormatName` output from dump commands), this
is actually fine — but it's a one-way door.

- **ChangeStructNodeType, SetMaterialExpressionPosition,
  DeleteMaterialExpression, DisconnectMaterialExpressionPin** —
  node param now expects FormatName identifiers, not GUIDs
- **RemoveStructField, AddStructField** — switched from
  MCPAssets (accepts bare names) to WingFetcher (requires full
  paths)
- **SetPinDefaultValues** — entry struct changed from
  `{Blueprint, Node, PinName, Value}` to `{Pin, Value}` where
  Pin is a full fetcher path
- **SpawnNodesInGraph** — changed from `Blueprint` + `Graph`
  params to single `Graph` path

## Potential Crashes

- **SearchAssets** — `Data.GetClass()` can return null with
  `.Info()` (asset class not loaded). Would crash on
  `FormatName`.
- **SpawnNodesInGraph** — assumes `GetOuter()` of a graph is
  always a `UBlueprint`. Fails for level blueprints.

## Silent Error Handling Gaps

- **AddAnimStateToMachine, SetAnimStateAnimation,
  SetAnimTransitionRule** — `FindStateMachineGraph` and
  `FindStateByName` lack MCPErrorCallback. If the state machine
  or state isn't found, error reporting is ad-hoc/incomplete.

## Behavioral Changes

- **SetBlendSpaceSamplePoints** — now aborts on animation
  lookup failure instead of silently inserting a blank sample.
  Probably better behavior, but different.

## Minor Concerns

- **SetNodePositions** — node search across all graphs could
  match wrong node if names collide across graphs
- **ReplaceFunctionCallsInBlueprint** — connection survival
  uses pointer comparison; could be unsafe if pins are
  recreated during the replacement
- **DumpMaterialInstanceParameters** — parent chain lost class
  type info (Material vs MaterialInstance)

## Design changes

- Saving assets is being done at somewhat unpredictable
  points.  It's not entirely clear that we *should* be
  saving things every time an edit is made.  It might be
  better to have an explicit "Save" MCP command.

