[
  {
    "fragmentId": "method:1mtzd71:signalrsyncbroadcaster__fragment",
    "ownerFileId": "file:10i5sd6:signalrsyncbroadcaster-cs",
    "ownerSymbolId": "method:1mtzd71:signalrsyncbroadcaster",
    "ownerSymbolName": "SignalRSyncBroadcaster",
    "entryNodeId": "method:1mtzd71:signalrsyncbroadcaster__entry",
    "exitNodeIds": [
      "method:1mtzd71:signalrsyncbroadcaster__implicit_return"
    ],
    "nodes": [
      {
        "id": "method:1mtzd71:signalrsyncbroadcaster__entry",
        "kind": "entry",
        "label": "SignalRSyncBroadcaster entry",
        "line": 15,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.99,
        "detail": "Constructs the broadcaster with the SignalR hub context."
      },
      {
        "id": "method:1mtzd71:signalrsyncbroadcaster__action_17_assignment_17__linear",
        "kind": "statement",
        "label": "store hub context",
        "line": 17,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7,
        "detail": "_hubContext = hubContext"
      },
      {
        "id": "method:1mtzd71:signalrsyncbroadcaster__implicit_return",
        "kind": "return",
        "label": "return",
        "line": 18,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.72,
        "detail": "Implicit method exit inferred from method boundary."
      }
    ],
    "edges": [
      {
        "id": "method:1mtzd71:signalrsyncbroadcaster__entry__method:1mtzd71:signalrsyncbroadcaster__action_17_assignment_17__linear",
        "from": "method:1mtzd71:signalrsyncbroadcaster__entry",
        "to": "method:1mtzd71:signalrsyncbroadcaster__action_17_assignment_17__linear",
        "kind": "next",
        "line": 17,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:1mtzd71:signalrsyncbroadcaster__action_17_assignment_17__linear__implicit_return",
        "from": "method:1mtzd71:signalrsyncbroadcaster__action_17_assignment_17__linear",
        "to": "method:1mtzd71:signalrsyncbroadcaster__implicit_return",
        "kind": "return",
        "line": 18,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.72
      }
    ],
    "jumpTargets": [],
    "exceptionTargets": [],
    "loopBackEdges": [],
    "mergeNodeIds": [],
    "language": "csharp",
    "confidence": 0.76,
    "lineSpan": {
      "start": 15,
      "end": 18
    },
    "unsupportedConstructs": [],
    "evidence": [
      {
        "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "line": 15,
        "summary": "Control-flow fragment extracted for method SignalRSyncBroadcaster.",
        "kind": "file-summary"
      }
    ]
  },
  {
    "fragmentId": "method:115yp5z:broadcastprogressasync__fragment",
    "ownerFileId": "file:10i5sd6:signalrsyncbroadcaster-cs",
    "ownerSymbolId": "method:115yp5z:broadcastprogressasync",
    "ownerSymbolName": "BroadcastProgressAsync",
    "entryNodeId": "method:115yp5z:broadcastprogressasync__entry",
    "exitNodeIds": [
      "method:115yp5z:broadcastprogressasync__implicit_return"
    ],
    "nodes": [
      {
        "id": "method:115yp5z:broadcastprogressasync__entry",
        "kind": "entry",
        "label": "BroadcastProgressAsync entry",
        "line": 21,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.99,
        "detail": "Sends a 'ProgressUpdated' notification to all connected devices of a user (attempts to consider an excluded connection id but falls back to User-scoped broadcast)."
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__condition",
        "kind": "condition",
        "label": "!string.IsNullOrEmpty(excludedConnectionId)",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.78,
        "detail": "if (!string.IsNullOrEmpty(excludedConnectionId))"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__true",
        "kind": "branch-true",
        "label": "true",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.78
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__false",
        "kind": "branch-false",
        "label": "false",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.78
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__merge",
        "kind": "statement",
        "label": "merge",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.78
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__condition",
        "kind": "condition",
        "label": "!string.IsNullOrEmpty(excludedConnectionId)",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7,
        "detail": "If excludedConnectionId present the code enters the if-block but still uses Clients.User(userId).SendAsync (no actual exclusion implemented here)."
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__true",
        "kind": "branch-true",
        "label": "enter branch: attempts exclusion comment",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__false",
        "kind": "branch-false",
        "label": "else: normal send",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__merge",
        "kind": "statement",
        "label": "merge",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_32_broadcastprogressasync_await_32_1__await",
        "kind": "await",
        "label": "Waits for async work",
        "line": 32,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.81,
        "detail": "await _hubContext.Clients"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_34_external_call_34__linear",
        "kind": "http-call",
        "label": "send progress update to user",
        "line": 34,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7,
        "detail": "Await _hubContext.Clients.User(userId).SendAsync('ProgressUpdated', pageId, timestamp, cancellationToken: cancellationToken)"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_34_broadcastprogressasync_external_call_34_2__linear",
        "kind": "http-call",
        "label": "Calls external dependency",
        "line": 34,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.82,
        "detail": ".SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken);"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__call_34_IHubContext_SyncHub_Clients_User_SendAsync",
        "kind": "call",
        "label": "IHubContext<SyncHub>.Clients.User(...).SendAsync",
        "line": 34,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.88,
        "detail": "event 'ProgressUpdated', pageId, timestamp, cancellationToken"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_36_comment_36__linear",
        "kind": "statement",
        "label": "note about exclusion limitations",
        "line": 36,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7,
        "detail": "Comments state HubContext doesn't support Except when using .User(id) from outside the Hub and suggests groups for strict exclusion."
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__condition",
        "kind": "condition",
        "label": "Falls back to alternate path",
        "line": 40,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.84,
        "detail": "else"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__true",
        "kind": "branch-true",
        "label": "fallback",
        "line": 40,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.84
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__false",
        "kind": "branch-false",
        "label": "otherwise",
        "line": 40,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.84
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__merge",
        "kind": "statement",
        "label": "merge",
        "line": 40,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.84
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_42_broadcastprogressasync_await_42_4__await",
        "kind": "await",
        "label": "Waits for async work",
        "line": 42,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.81,
        "detail": "await _hubContext.Clients"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_44_external_call_44__linear",
        "kind": "http-call",
        "label": "send progress update to user (else branch)",
        "line": 44,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7,
        "detail": "Await _hubContext.Clients.User(userId).SendAsync('ProgressUpdated', pageId, timestamp, cancellationToken: cancellationToken)"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_44_broadcastprogressasync_external_call_44_5__linear",
        "kind": "http-call",
        "label": "Calls external dependency",
        "line": 44,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.82,
        "detail": ".SendAsync(\"ProgressUpdated\", pageId, timestamp, cancellationToken: cancellationToken);"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__call_44_IHubContext_SyncHub_Clients_User_SendAsync",
        "kind": "call",
        "label": "IHubContext<SyncHub>.Clients.User(...).SendAsync",
        "line": 44,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.88,
        "detail": "event 'ProgressUpdated', pageId, timestamp, cancellationToken"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__implicit_return",
        "kind": "return",
        "label": "return",
        "line": 46,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.72,
        "detail": "Implicit method exit inferred from method boundary."
      }
    ],
    "edges": [
      {
        "id": "method:115yp5z:broadcastprogressasync__entry__method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__condition",
        "from": "method:115yp5z:broadcastprogressasync__entry",
        "to": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__condition",
        "kind": "next",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.78
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__condition__method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__true",
        "from": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__condition",
        "to": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__true",
        "kind": "condition-true",
        "label": "true",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.78
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__condition__method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__false",
        "from": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__condition",
        "to": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__false",
        "kind": "condition-false",
        "label": "false",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.78
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__true__method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__merge",
        "from": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__true",
        "to": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__merge",
        "kind": "next",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.78
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__false__method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__merge",
        "from": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__false",
        "to": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__merge",
        "kind": "next",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.78
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__merge__method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__condition",
        "from": "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__merge",
        "to": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__condition",
        "kind": "next",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__condition__method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__true",
        "from": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__condition",
        "to": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__true",
        "kind": "condition-true",
        "label": "enter branch: attempts exclusion comment",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__condition__method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__false",
        "from": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__condition",
        "to": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__false",
        "kind": "condition-false",
        "label": "else: normal send",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__true__method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__merge",
        "from": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__true",
        "to": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__merge",
        "kind": "next",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__false__method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__merge",
        "from": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__false",
        "to": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__merge",
        "kind": "next",
        "line": 30,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__merge__method:115yp5z:broadcastprogressasync__action_32_broadcastprogressasync_await_32_1__await",
        "from": "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__merge",
        "to": "method:115yp5z:broadcastprogressasync__action_32_broadcastprogressasync_await_32_1__await",
        "kind": "next",
        "line": 32,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.81
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_32_broadcastprogressasync_await_32_1__await__method:115yp5z:broadcastprogressasync__action_34_external_call_34__linear",
        "from": "method:115yp5z:broadcastprogressasync__action_32_broadcastprogressasync_await_32_1__await",
        "to": "method:115yp5z:broadcastprogressasync__action_34_external_call_34__linear",
        "kind": "next",
        "line": 34,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_34_external_call_34__linear__method:115yp5z:broadcastprogressasync__action_34_broadcastprogressasync_external_call_34_2__linear",
        "from": "method:115yp5z:broadcastprogressasync__action_34_external_call_34__linear",
        "to": "method:115yp5z:broadcastprogressasync__action_34_broadcastprogressasync_external_call_34_2__linear",
        "kind": "next",
        "line": 34,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.82
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_34_broadcastprogressasync_external_call_34_2__linear__call_method:115yp5z:broadcastprogressasync__call_34_IHubContext_SyncHub_Clients_User_SendAsync",
        "from": "method:115yp5z:broadcastprogressasync__action_34_broadcastprogressasync_external_call_34_2__linear",
        "to": "method:115yp5z:broadcastprogressasync__call_34_IHubContext_SyncHub_Clients_User_SendAsync",
        "kind": "call",
        "label": "event 'ProgressUpdated', pageId, timestamp, cancellationToken",
        "line": 34,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.88
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__call_34_IHubContext_SyncHub_Clients_User_SendAsync__method:115yp5z:broadcastprogressasync__action_36_comment_36__linear",
        "from": "method:115yp5z:broadcastprogressasync__call_34_IHubContext_SyncHub_Clients_User_SendAsync",
        "to": "method:115yp5z:broadcastprogressasync__action_36_comment_36__linear",
        "kind": "next",
        "line": 36,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_36_comment_36__linear__method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__condition",
        "from": "method:115yp5z:broadcastprogressasync__action_36_comment_36__linear",
        "to": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__condition",
        "kind": "fallback",
        "line": 40,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.84
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__condition__method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__true",
        "from": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__condition",
        "to": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__true",
        "kind": "condition-true",
        "label": "fallback",
        "line": 40,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.84
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__condition__method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__false",
        "from": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__condition",
        "to": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__false",
        "kind": "condition-false",
        "label": "otherwise",
        "line": 40,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.84
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__true__method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__merge",
        "from": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__true",
        "to": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__merge",
        "kind": "next",
        "line": 40,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.84
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__false__method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__merge",
        "from": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__false",
        "to": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__merge",
        "kind": "next",
        "line": 40,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.84
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__merge__method:115yp5z:broadcastprogressasync__action_42_broadcastprogressasync_await_42_4__await",
        "from": "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__merge",
        "to": "method:115yp5z:broadcastprogressasync__action_42_broadcastprogressasync_await_42_4__await",
        "kind": "next",
        "line": 42,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.81
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_42_broadcastprogressasync_await_42_4__await__method:115yp5z:broadcastprogressasync__action_44_external_call_44__linear",
        "from": "method:115yp5z:broadcastprogressasync__action_42_broadcastprogressasync_await_42_4__await",
        "to": "method:115yp5z:broadcastprogressasync__action_44_external_call_44__linear",
        "kind": "next",
        "line": 44,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_44_external_call_44__linear__method:115yp5z:broadcastprogressasync__action_44_broadcastprogressasync_external_call_44_5__linear",
        "from": "method:115yp5z:broadcastprogressasync__action_44_external_call_44__linear",
        "to": "method:115yp5z:broadcastprogressasync__action_44_broadcastprogressasync_external_call_44_5__linear",
        "kind": "next",
        "line": 44,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.82
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__action_44_broadcastprogressasync_external_call_44_5__linear__call_method:115yp5z:broadcastprogressasync__call_44_IHubContext_SyncHub_Clients_User_SendAsync",
        "from": "method:115yp5z:broadcastprogressasync__action_44_broadcastprogressasync_external_call_44_5__linear",
        "to": "method:115yp5z:broadcastprogressasync__call_44_IHubContext_SyncHub_Clients_User_SendAsync",
        "kind": "call",
        "label": "event 'ProgressUpdated', pageId, timestamp, cancellationToken",
        "line": 44,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.88
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__call_44_IHubContext_SyncHub_Clients_User_SendAsync__implicit_return",
        "from": "method:115yp5z:broadcastprogressasync__call_44_IHubContext_SyncHub_Clients_User_SendAsync",
        "to": "method:115yp5z:broadcastprogressasync__implicit_return",
        "kind": "return",
        "line": 46,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.72
      }
    ],
    "jumpTargets": [
      {
        "id": "method:115yp5z:broadcastprogressasync__call_34_IHubContext_SyncHub_Clients_User_SendAsync__jump_unknown_IHubContext_SyncHub_Clients_User_SendAsync",
        "fromNodeId": "method:115yp5z:broadcastprogressasync__call_34_IHubContext_SyncHub_Clients_User_SendAsync",
        "kind": "call-target",
        "targetPath": "unknown",
        "targetHint": "IHubContext<SyncHub>.Clients.User(...).SendAsync",
        "line": 34,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "reason": "Call target IHubContext<SyncHub>.Clients.User(...).SendAsync in unknown could not be matched to an extracted method symbol.",
        "status": "unresolved"
      },
      {
        "id": "method:115yp5z:broadcastprogressasync__call_44_IHubContext_SyncHub_Clients_User_SendAsync__jump_unknown_IHubContext_SyncHub_Clients_User_SendAsync",
        "fromNodeId": "method:115yp5z:broadcastprogressasync__call_44_IHubContext_SyncHub_Clients_User_SendAsync",
        "kind": "call-target",
        "targetPath": "unknown",
        "targetHint": "IHubContext<SyncHub>.Clients.User(...).SendAsync",
        "line": 44,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "reason": "Call target IHubContext<SyncHub>.Clients.User(...).SendAsync in unknown could not be matched to an extracted method symbol.",
        "status": "unresolved"
      }
    ],
    "exceptionTargets": [],
    "loopBackEdges": [],
    "mergeNodeIds": [
      "method:115yp5z:broadcastprogressasync__action_30_broadcastprogressasync_branch_30_0__merge",
      "method:115yp5z:broadcastprogressasync__action_30_guard_clause_30__merge",
      "method:115yp5z:broadcastprogressasync__action_40_broadcastprogressasync_fallback_40_3__merge"
    ],
    "language": "csharp",
    "confidence": 0.98,
    "lineSpan": {
      "start": 21,
      "end": 46
    },
    "unsupportedConstructs": [],
    "evidence": [
      {
        "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "line": 21,
        "summary": "Control-flow fragment extracted for method BroadcastProgressAsync.",
        "kind": "file-summary"
      }
    ]
  },
  {
    "fragmentId": "method:1s8oq59:broadcastingestionprogressasync__fragment",
    "ownerFileId": "file:10i5sd6:signalrsyncbroadcaster-cs",
    "ownerSymbolId": "method:1s8oq59:broadcastingestionprogressasync",
    "ownerSymbolName": "BroadcastIngestionProgressAsync",
    "entryNodeId": "method:1s8oq59:broadcastingestionprogressasync__entry",
    "exitNodeIds": [
      "method:1s8oq59:broadcastingestionprogressasync__implicit_return"
    ],
    "nodes": [
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__entry",
        "kind": "entry",
        "label": "BroadcastIngestionProgressAsync entry",
        "line": 49,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.99,
        "detail": "Pushes ingestion status messages and numeric progress (0.0-1.0) to a user's active sessions via SignalR."
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__action_55_comment_55__linear",
        "kind": "statement",
        "label": "intent comment",
        "line": 55,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7,
        "detail": "Comments explain this pushes ingestion status to user UI components (e.g., BookIngestionModal)."
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__action_57_broadcastingestionprogressasync_await_57_0__await",
        "kind": "await",
        "label": "Waits for async work",
        "line": 57,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.81,
        "detail": "await _hubContext.Clients"
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__action_59_external_call_59__linear",
        "kind": "http-call",
        "label": "send ingestion progress to user",
        "line": 59,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7,
        "detail": "Await _hubContext.Clients.User(userId).SendAsync('IngestionProgress', message, progress, cancellationToken: cancellationToken)"
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__action_59_broadcastingestionprogressasync_external_call_59_1__linear",
        "kind": "http-call",
        "label": "Calls external dependency",
        "line": 59,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.82,
        "detail": ".SendAsync(\"IngestionProgress\", message, progress, cancellationToken: cancellationToken);"
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__call_59_IHubContext_SyncHub_Clients_User_SendAsync",
        "kind": "call",
        "label": "IHubContext<SyncHub>.Clients.User(...).SendAsync",
        "line": 59,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.88,
        "detail": "event 'IngestionProgress', message, progress, cancellationToken"
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__implicit_return",
        "kind": "return",
        "label": "return",
        "line": 60,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.72,
        "detail": "Implicit method exit inferred from method boundary."
      }
    ],
    "edges": [
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__entry__method:1s8oq59:broadcastingestionprogressasync__action_55_comment_55__linear",
        "from": "method:1s8oq59:broadcastingestionprogressasync__entry",
        "to": "method:1s8oq59:broadcastingestionprogressasync__action_55_comment_55__linear",
        "kind": "next",
        "line": 55,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__action_55_comment_55__linear__method:1s8oq59:broadcastingestionprogressasync__action_57_broadcastingestionprogressasync_await_57_0__await",
        "from": "method:1s8oq59:broadcastingestionprogressasync__action_55_comment_55__linear",
        "to": "method:1s8oq59:broadcastingestionprogressasync__action_57_broadcastingestionprogressasync_await_57_0__await",
        "kind": "next",
        "line": 57,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.81
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__action_57_broadcastingestionprogressasync_await_57_0__await__method:1s8oq59:broadcastingestionprogressasync__action_59_external_call_59__linear",
        "from": "method:1s8oq59:broadcastingestionprogressasync__action_57_broadcastingestionprogressasync_await_57_0__await",
        "to": "method:1s8oq59:broadcastingestionprogressasync__action_59_external_call_59__linear",
        "kind": "next",
        "line": 59,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.7
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__action_59_external_call_59__linear__method:1s8oq59:broadcastingestionprogressasync__action_59_broadcastingestionprogressasync_external_call_59_1__linear",
        "from": "method:1s8oq59:broadcastingestionprogressasync__action_59_external_call_59__linear",
        "to": "method:1s8oq59:broadcastingestionprogressasync__action_59_broadcastingestionprogressasync_external_call_59_1__linear",
        "kind": "next",
        "line": 59,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.82
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__action_59_broadcastingestionprogressasync_external_call_59_1__linear__call_method:1s8oq59:broadcastingestionprogressasync__call_59_IHubContext_SyncHub_Clients_User_SendAsync",
        "from": "method:1s8oq59:broadcastingestionprogressasync__action_59_broadcastingestionprogressasync_external_call_59_1__linear",
        "to": "method:1s8oq59:broadcastingestionprogressasync__call_59_IHubContext_SyncHub_Clients_User_SendAsync",
        "kind": "call",
        "label": "event 'IngestionProgress', message, progress, cancellationToken",
        "line": 59,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.88
      },
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__call_59_IHubContext_SyncHub_Clients_User_SendAsync__implicit_return",
        "from": "method:1s8oq59:broadcastingestionprogressasync__call_59_IHubContext_SyncHub_Clients_User_SendAsync",
        "to": "method:1s8oq59:broadcastingestionprogressasync__implicit_return",
        "kind": "return",
        "line": 60,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "confidence": 0.72
      }
    ],
    "jumpTargets": [
      {
        "id": "method:1s8oq59:broadcastingestionprogressasync__call_59_IHubContext_SyncHub_Clients_User_SendAsync__jump_unknown_IHubContext_SyncHub_Clients_User_SendAsync",
        "fromNodeId": "method:1s8oq59:broadcastingestionprogressasync__call_59_IHubContext_SyncHub_Clients_User_SendAsync",
        "kind": "call-target",
        "targetPath": "unknown",
        "targetHint": "IHubContext<SyncHub>.Clients.User(...).SendAsync",
        "line": 59,
        "sourcePath": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "reason": "Call target IHubContext<SyncHub>.Clients.User(...).SendAsync in unknown could not be matched to an extracted method symbol.",
        "status": "unresolved"
      }
    ],
    "exceptionTargets": [],
    "loopBackEdges": [],
    "mergeNodeIds": [],
    "language": "csharp",
    "confidence": 0.8299999999999998,
    "lineSpan": {
      "start": 49,
      "end": 60
    },
    "unsupportedConstructs": [],
    "evidence": [
      {
        "path": "NexusReader.Infrastructure/RealTime/SignalRSyncBroadcaster.cs",
        "line": 49,
        "summary": "Control-flow fragment extracted for method BroadcastIngestionProgressAsync.",
        "kind": "file-summary"
      }
    ]
  }
]