L

LinkedIn Outreach Platform Agentic Workflow

Validate All Applicants — LinkedIn Outreach Platform Agentic Workflow

Two-pass validation: warms up candidates first (triggers security scans), then validates. Handles 1-25 candidates dynamically.

Available free v1.0.0 Browser LLM
$ sidebutton install linkedin
Download ZIP

A bulk validation chain that processes every applicant on a job posting in two passes. The first pass opens each candidate's profile briefly to trigger LinkedIn's background security scanning; the second pass returns to extract the now-stable profile data and apply the validation rules — work history, role match, location constraints, custom criteria.

The chain adapts to the applicant count automatically, handling anywhere from one candidate up to the batch cap of twenty-five. Output is a per-candidate verdict with the supporting profile facts, suitable for inline decision-making or for a follow-up human review.

Steps

  1. 1.
    browser injectCSS
    id
    sb-batch-validate
    css
    |
    browser.injectCSS
  2. 2.
    browser injectJS
    js
    |
    browser.injectJS
  3. 3.
    llm generate
    prompt
    |
    as
    job_id
    llm.generate
  4. 4.
    control if
    condition
    {{job_summary}} == ''
    then
    control.if
  5. 5.
    workflow call
    workflow
    linkedin_extract_job_requirements
    params
    as
    job_info
    workflow.call
  6. 6.
    variable set
    name
    effective_job_summary
    value
    {{job_info.job_summary}}
    variable.set
  7. 7.
    variable set
    name
    effective_job_summary
    value
    {{job_summary}}
    variable.set
  8. 8.
    control if
    condition
    {{effective_job_summary}} == ''
    then
    control.if
  9. 9.
    control stop
    message
    ERROR: No job requirements for job {{job_id}}. Provide job_summary param or ensure extraction succeeds.
    control.stop
  10. 10.
    control if
    condition
    {{job_summary}} == ''
    then
    control.if
  11. 11.
    Navigate to a URL
    url
    {{_url}}
    browser.navigate
  12. 12.
    Wait
    selector
    .hiring-applicants__list-item
    timeout
    10000
    browser.wait
  13. 13.
    Wait
    ms
    2000
    browser.wait
  14. 14.
    Extract text from a selector
    selector
    .hiring-applicants__list-item
    as
    applicant_list_content
    browser.extract
  15. 15.
    llm generate
    prompt
    |
    as
    candidate_count
    llm.generate
  16. 16.
    browser injectJS
    js
    |
    browser.injectJS
  17. 17.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  18. 18.
    control if
    condition
    {{candidate_count}} >= 2
    then
    control.if
  19. 19.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  20. 20.
    control if
    condition
    {{candidate_count}} >= 3
    then
    control.if
  21. 21.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  22. 22.
    control if
    condition
    {{candidate_count}} >= 4
    then
    control.if
  23. 23.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  24. 24.
    control if
    condition
    {{candidate_count}} >= 5
    then
    control.if
  25. 25.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  26. 26.
    control if
    condition
    {{candidate_count}} >= 6
    then
    control.if
  27. 27.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  28. 28.
    control if
    condition
    {{candidate_count}} >= 7
    then
    control.if
  29. 29.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  30. 30.
    control if
    condition
    {{candidate_count}} >= 8
    then
    control.if
  31. 31.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  32. 32.
    control if
    condition
    {{candidate_count}} >= 9
    then
    control.if
  33. 33.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  34. 34.
    control if
    condition
    {{candidate_count}} >= 10
    then
    control.if
  35. 35.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  36. 36.
    control if
    condition
    {{candidate_count}} >= 11
    then
    control.if
  37. 37.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  38. 38.
    control if
    condition
    {{candidate_count}} >= 12
    then
    control.if
  39. 39.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  40. 40.
    control if
    condition
    {{candidate_count}} >= 13
    then
    control.if
  41. 41.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  42. 42.
    control if
    condition
    {{candidate_count}} >= 14
    then
    control.if
  43. 43.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  44. 44.
    control if
    condition
    {{candidate_count}} >= 15
    then
    control.if
  45. 45.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  46. 46.
    control if
    condition
    {{candidate_count}} >= 16
    then
    control.if
  47. 47.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  48. 48.
    control if
    condition
    {{candidate_count}} >= 17
    then
    control.if
  49. 49.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  50. 50.
    control if
    condition
    {{candidate_count}} >= 18
    then
    control.if
  51. 51.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  52. 52.
    control if
    condition
    {{candidate_count}} >= 19
    then
    control.if
  53. 53.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  54. 54.
    control if
    condition
    {{candidate_count}} >= 20
    then
    control.if
  55. 55.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  56. 56.
    control if
    condition
    {{candidate_count}} >= 21
    then
    control.if
  57. 57.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  58. 58.
    control if
    condition
    {{candidate_count}} >= 22
    then
    control.if
  59. 59.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  60. 60.
    control if
    condition
    {{candidate_count}} >= 23
    then
    control.if
  61. 61.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  62. 62.
    control if
    condition
    {{candidate_count}} >= 24
    then
    control.if
  63. 63.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  64. 64.
    control if
    condition
    {{candidate_count}} >= 25
    then
    control.if
  65. 65.
    workflow call
    workflow
    linkedin_warmup_candidate
    params
    workflow.call
  66. 66.
    Wait
    ms
    1000
    browser.wait
  67. 67.
    Click an element
    selector
    .hiring-applicants__list-item:nth-child(1) a
    browser.click
  68. 68.
    Wait
    ms
    1500
    browser.wait
  69. 69.
    browser injectJS
    js
    |
    browser.injectJS
  70. 70.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_1
    workflow.call
  71. 71.
    control if
    condition
    {{candidate_count}} >= 2
    then
    control.if
  72. 72.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_2
    workflow.call
  73. 73.
    control if
    condition
    {{candidate_count}} >= 3
    then
    control.if
  74. 74.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_3
    workflow.call
  75. 75.
    control if
    condition
    {{candidate_count}} >= 4
    then
    control.if
  76. 76.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_4
    workflow.call
  77. 77.
    control if
    condition
    {{candidate_count}} >= 5
    then
    control.if
  78. 78.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_5
    workflow.call
  79. 79.
    control if
    condition
    {{candidate_count}} >= 6
    then
    control.if
  80. 80.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_6
    workflow.call
  81. 81.
    control if
    condition
    {{candidate_count}} >= 7
    then
    control.if
  82. 82.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_7
    workflow.call
  83. 83.
    control if
    condition
    {{candidate_count}} >= 8
    then
    control.if
  84. 84.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_8
    workflow.call
  85. 85.
    control if
    condition
    {{candidate_count}} >= 9
    then
    control.if
  86. 86.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_9
    workflow.call
  87. 87.
    control if
    condition
    {{candidate_count}} >= 10
    then
    control.if
  88. 88.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_10
    workflow.call
  89. 89.
    control if
    condition
    {{candidate_count}} >= 11
    then
    control.if
  90. 90.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_11
    workflow.call
  91. 91.
    control if
    condition
    {{candidate_count}} >= 12
    then
    control.if
  92. 92.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_12
    workflow.call
  93. 93.
    control if
    condition
    {{candidate_count}} >= 13
    then
    control.if
  94. 94.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_13
    workflow.call
  95. 95.
    control if
    condition
    {{candidate_count}} >= 14
    then
    control.if
  96. 96.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_14
    workflow.call
  97. 97.
    control if
    condition
    {{candidate_count}} >= 15
    then
    control.if
  98. 98.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_15
    workflow.call
  99. 99.
    control if
    condition
    {{candidate_count}} >= 16
    then
    control.if
  100. 100.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_16
    workflow.call
  101. 101.
    control if
    condition
    {{candidate_count}} >= 17
    then
    control.if
  102. 102.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_17
    workflow.call
  103. 103.
    control if
    condition
    {{candidate_count}} >= 18
    then
    control.if
  104. 104.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_18
    workflow.call
  105. 105.
    control if
    condition
    {{candidate_count}} >= 19
    then
    control.if
  106. 106.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_19
    workflow.call
  107. 107.
    control if
    condition
    {{candidate_count}} >= 20
    then
    control.if
  108. 108.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_20
    workflow.call
  109. 109.
    control if
    condition
    {{candidate_count}} >= 21
    then
    control.if
  110. 110.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_21
    workflow.call
  111. 111.
    control if
    condition
    {{candidate_count}} >= 22
    then
    control.if
  112. 112.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_22
    workflow.call
  113. 113.
    control if
    condition
    {{candidate_count}} >= 23
    then
    control.if
  114. 114.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_23
    workflow.call
  115. 115.
    control if
    condition
    {{candidate_count}} >= 24
    then
    control.if
  116. 116.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_24
    workflow.call
  117. 117.
    control if
    condition
    {{candidate_count}} >= 25
    then
    control.if
  118. 118.
    workflow call
    workflow
    linkedin_validate_single_applicant
    params
    as
    result_25
    workflow.call
  119. 119.
    browser injectJS
    js
    |
    browser.injectJS
  120. 120.
    llm generate
    prompt
    |
    as
    summary
    llm.generate
  121. 121.
    control stop
    message
    {{summary}}
    control.stop

Workflow definition

schema_version: 1
version: "2.1.0"
last_verified: "2026-02-27"
id: linkedin_validate_applicants
title: "Validate All Applicants"
description: "Two-pass validation: warms up candidates first (triggers security scans), then validates. Handles 1-25 candidates dynamically."
overview: |
  A bulk validation chain that processes every applicant on a job posting in two passes. The first pass opens each candidate's profile briefly to trigger LinkedIn's background security scanning; the second pass returns to extract the now-stable profile data and apply the validation rules — work history, role match, location constraints, custom criteria.

  The chain adapts to the applicant count automatically, handling anywhere from one candidate up to the batch cap of twenty-five. Output is a per-candidate verdict with the supporting profile facts, suitable for inline decision-making or for a follow-up human review.

category:
  level: task
  domain: hiring
  reusable: true
params:
  job_summary:
    type: string
    description: |
      Optional: Pre-defined job requirements summary. If provided, skips extraction.
      Include JOB_ID in first line for tracking: "JOB_ID: 4350796385\n..."
      Add to settings.json user_contexts for persistence.
    required: false
policies:
  allowed_domains:
    - "*.linkedin.com"
embed:
  selector: "button[aria-label^='Manage job']"
  position: after
  when: ".hiring-applicants__list-item"
  label: "AI Validate All"
  result:
    action: "popup"
steps:
  # ================================================================
  # VISUAL FEEDBACK: Inject progress styles for candidate rows
  # ================================================================

  - type: browser.injectCSS
    id: sb-batch-validate
    css: |
      @keyframes sb-pulse-border {
        0%, 100% { border-left-color: rgba(21, 195, 154, 0.3); }
        50% { border-left-color: rgba(21, 195, 154, 1); }
      }
      .hiring-applicants__list-item.sb-processing {
        border-left: 4px solid #15C39A !important;
        animation: sb-pulse-border 1.2s ease-in-out infinite !important;
        background: rgba(21, 195, 154, 0.04) !important;
        transition: all 0.3s ease !important;
      }
      .hiring-applicants__list-item.sb-done {
        border-left: 4px solid #22C55E !important;
        animation: none !important;
        background: rgba(34, 197, 94, 0.04) !important;
        transition: all 0.3s ease !important;
      }
      .hiring-applicants__list-item.sb-pending {
        opacity: 0.5 !important;
        transition: opacity 0.3s ease !important;
      }
      #sb-progress-banner {
        position: sticky;
        top: 0;
        z-index: 100;
        background: linear-gradient(135deg, #15C39A 0%, #0EA87D 100%);
        color: white;
        padding: 8px 16px;
        font-size: 13px;
        font-weight: 600;
        display: flex;
        align-items: center;
        gap: 8px;
        border-radius: 6px;
        margin-bottom: 8px;
      }
      #sb-progress-banner .sb-spinner {
        width: 14px; height: 14px;
        border: 2px solid rgba(255,255,255,0.3);
        border-top-color: white;
        border-radius: 50%;
        animation: sb-spin 0.8s linear infinite;
      }
      @keyframes sb-spin {
        to { transform: rotate(360deg); }
      }

  # Inject progress banner above the applicant list
  - type: browser.injectJS
    js: |
      const list = document.querySelector('.hiring-applicants__list');
      if (list && !document.getElementById('sb-progress-banner')) {
        const banner = document.createElement('div');
        banner.id = 'sb-progress-banner';
        banner.innerHTML = '<div class="sb-spinner"></div><span>Preparing validation...</span>';
        list.parentElement.insertBefore(banner, list);
      }

  # ================================================================
  # PHASE 1: GET JOB REQUIREMENTS
  # ================================================================

  - type: llm.generate
    prompt: |
      Extract the numeric job ID from this LinkedIn hiring URL:
      {{_url}}

      Example: https://www.linkedin.com/hiring/jobs/4350796385/applicants/12345/detail/
      Returns: 4350796385

      Return ONLY the numeric job ID, nothing else.
    as: job_id

  - type: control.if
    condition: "{{job_summary}} == ''"
    then:
      - type: workflow.call
        workflow: linkedin_extract_job_requirements
        params:
          job_id: "{{job_id}}"
        as: job_info

      - type: variable.set
        name: effective_job_summary
        value: "{{job_info.job_summary}}"

    else:
      - type: variable.set
        name: effective_job_summary
        value: "{{job_summary}}"

  - type: control.if
    condition: "{{effective_job_summary}} == ''"
    then:
      - type: control.stop
        message: "ERROR: No job requirements for job {{job_id}}. Provide job_summary param or ensure extraction succeeds."

  # ================================================================
  # PHASE 2: RETURN TO APPLICANTS PAGE (only if we navigated away)
  # ================================================================

  - type: control.if
    condition: "{{job_summary}} == ''"
    then:
      - type: browser.navigate
        url: "{{_url}}"

  - type: browser.wait
    selector: ".hiring-applicants__list-item"
    timeout: 10000

  - type: browser.wait
    ms: 2000

  # ================================================================
  # PHASE 3: COUNT CANDIDATES ON PAGE
  # ================================================================

  # Extract text from all applicant list items to count them
  - type: browser.extract
    selector: ".hiring-applicants__list-item"
    as: applicant_list_content

  - type: llm.generate
    prompt: |
      Count how many individual applicant entries appear in this content.
      Each applicant has a name and job title.

      Content:
      {{applicant_list_content}}

      Return ONLY a number between 1 and 25, nothing else.
      If you cannot determine, return 25.
      Example: 17
    as: candidate_count

  # ================================================================
  # PHASE 4: WARM-UP ALL CANDIDATES (Trigger Security Scans)
  # ================================================================

  # Update banner and dim pending candidates
  - type: browser.injectJS
    js: |
      const banner = document.getElementById('sb-progress-banner');
      if (banner) banner.querySelector('span').textContent = 'Warming up candidates (0/{{candidate_count}})...';
      document.querySelectorAll('.hiring-applicants__list-item').forEach(el => el.classList.add('sb-pending'));

  # Warm-up 1 (always)
  - type: workflow.call
    workflow: linkedin_warmup_candidate
    params:
      index: "1"

  # Warm-up 2
  - type: control.if
    condition: "{{candidate_count}} >= 2"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "2"

  # Warm-up 3
  - type: control.if
    condition: "{{candidate_count}} >= 3"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "3"

  # Warm-up 4
  - type: control.if
    condition: "{{candidate_count}} >= 4"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "4"

  # Warm-up 5
  - type: control.if
    condition: "{{candidate_count}} >= 5"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "5"

  # Warm-up 6
  - type: control.if
    condition: "{{candidate_count}} >= 6"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "6"

  # Warm-up 7
  - type: control.if
    condition: "{{candidate_count}} >= 7"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "7"

  # Warm-up 8
  - type: control.if
    condition: "{{candidate_count}} >= 8"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "8"

  # Warm-up 9
  - type: control.if
    condition: "{{candidate_count}} >= 9"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "9"

  # Warm-up 10
  - type: control.if
    condition: "{{candidate_count}} >= 10"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "10"

  # Warm-up 11
  - type: control.if
    condition: "{{candidate_count}} >= 11"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "11"

  # Warm-up 12
  - type: control.if
    condition: "{{candidate_count}} >= 12"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "12"

  # Warm-up 13
  - type: control.if
    condition: "{{candidate_count}} >= 13"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "13"

  # Warm-up 14
  - type: control.if
    condition: "{{candidate_count}} >= 14"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "14"

  # Warm-up 15
  - type: control.if
    condition: "{{candidate_count}} >= 15"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "15"

  # Warm-up 16
  - type: control.if
    condition: "{{candidate_count}} >= 16"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "16"

  # Warm-up 17
  - type: control.if
    condition: "{{candidate_count}} >= 17"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "17"

  # Warm-up 18
  - type: control.if
    condition: "{{candidate_count}} >= 18"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "18"

  # Warm-up 19
  - type: control.if
    condition: "{{candidate_count}} >= 19"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "19"

  # Warm-up 20
  - type: control.if
    condition: "{{candidate_count}} >= 20"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "20"

  # Warm-up 21
  - type: control.if
    condition: "{{candidate_count}} >= 21"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "21"

  # Warm-up 22
  - type: control.if
    condition: "{{candidate_count}} >= 22"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "22"

  # Warm-up 23
  - type: control.if
    condition: "{{candidate_count}} >= 23"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "23"

  # Warm-up 24
  - type: control.if
    condition: "{{candidate_count}} >= 24"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "24"

  # Warm-up 25
  - type: control.if
    condition: "{{candidate_count}} >= 25"
    then:
      - type: workflow.call
        workflow: linkedin_warmup_candidate
        params:
          index: "25"

  # ================================================================
  # PHASE 5: RESET TO FIRST CANDIDATE
  # ================================================================

  - type: browser.wait
    ms: 1000

  # Click first candidate to reset view (this also scrolls it into view)
  - type: browser.click
    selector: ".hiring-applicants__list-item:nth-child(1) a"

  - type: browser.wait
    ms: 1500

  # ================================================================
  # PHASE 6: VALIDATE APPLICANTS (Conditional based on count)
  # ================================================================

  # Update banner for validation phase
  - type: browser.injectJS
    js: |
      const banner = document.getElementById('sb-progress-banner');
      if (banner) banner.querySelector('span').textContent = 'Validating candidates (0/{{candidate_count}})...';
      document.querySelectorAll('.hiring-applicants__list-item').forEach(el => {
        el.classList.remove('sb-pending');
      });

  # Validate 1 (always)
  - type: workflow.call
    workflow: linkedin_validate_single_applicant
    params:
      index: "1"
      job_summary: "{{effective_job_summary}}"
    as: result_1

  # Validate 2
  - type: control.if
    condition: "{{candidate_count}} >= 2"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "2"
          job_summary: "{{effective_job_summary}}"
        as: result_2

  # Validate 3
  - type: control.if
    condition: "{{candidate_count}} >= 3"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "3"
          job_summary: "{{effective_job_summary}}"
        as: result_3

  # Validate 4
  - type: control.if
    condition: "{{candidate_count}} >= 4"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "4"
          job_summary: "{{effective_job_summary}}"
        as: result_4

  # Validate 5
  - type: control.if
    condition: "{{candidate_count}} >= 5"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "5"
          job_summary: "{{effective_job_summary}}"
        as: result_5

  # Validate 6
  - type: control.if
    condition: "{{candidate_count}} >= 6"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "6"
          job_summary: "{{effective_job_summary}}"
        as: result_6

  # Validate 7
  - type: control.if
    condition: "{{candidate_count}} >= 7"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "7"
          job_summary: "{{effective_job_summary}}"
        as: result_7

  # Validate 8
  - type: control.if
    condition: "{{candidate_count}} >= 8"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "8"
          job_summary: "{{effective_job_summary}}"
        as: result_8

  # Validate 9
  - type: control.if
    condition: "{{candidate_count}} >= 9"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "9"
          job_summary: "{{effective_job_summary}}"
        as: result_9

  # Validate 10
  - type: control.if
    condition: "{{candidate_count}} >= 10"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "10"
          job_summary: "{{effective_job_summary}}"
        as: result_10

  # Validate 11
  - type: control.if
    condition: "{{candidate_count}} >= 11"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "11"
          job_summary: "{{effective_job_summary}}"
        as: result_11

  # Validate 12
  - type: control.if
    condition: "{{candidate_count}} >= 12"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "12"
          job_summary: "{{effective_job_summary}}"
        as: result_12

  # Validate 13
  - type: control.if
    condition: "{{candidate_count}} >= 13"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "13"
          job_summary: "{{effective_job_summary}}"
        as: result_13

  # Validate 14
  - type: control.if
    condition: "{{candidate_count}} >= 14"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "14"
          job_summary: "{{effective_job_summary}}"
        as: result_14

  # Validate 15
  - type: control.if
    condition: "{{candidate_count}} >= 15"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "15"
          job_summary: "{{effective_job_summary}}"
        as: result_15

  # Validate 16
  - type: control.if
    condition: "{{candidate_count}} >= 16"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "16"
          job_summary: "{{effective_job_summary}}"
        as: result_16

  # Validate 17
  - type: control.if
    condition: "{{candidate_count}} >= 17"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "17"
          job_summary: "{{effective_job_summary}}"
        as: result_17

  # Validate 18
  - type: control.if
    condition: "{{candidate_count}} >= 18"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "18"
          job_summary: "{{effective_job_summary}}"
        as: result_18

  # Validate 19
  - type: control.if
    condition: "{{candidate_count}} >= 19"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "19"
          job_summary: "{{effective_job_summary}}"
        as: result_19

  # Validate 20
  - type: control.if
    condition: "{{candidate_count}} >= 20"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "20"
          job_summary: "{{effective_job_summary}}"
        as: result_20

  # Validate 21
  - type: control.if
    condition: "{{candidate_count}} >= 21"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "21"
          job_summary: "{{effective_job_summary}}"
        as: result_21

  # Validate 22
  - type: control.if
    condition: "{{candidate_count}} >= 22"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "22"
          job_summary: "{{effective_job_summary}}"
        as: result_22

  # Validate 23
  - type: control.if
    condition: "{{candidate_count}} >= 23"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "23"
          job_summary: "{{effective_job_summary}}"
        as: result_23

  # Validate 24
  - type: control.if
    condition: "{{candidate_count}} >= 24"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "24"
          job_summary: "{{effective_job_summary}}"
        as: result_24

  # Validate 25
  - type: control.if
    condition: "{{candidate_count}} >= 25"
    then:
      - type: workflow.call
        workflow: linkedin_validate_single_applicant
        params:
          index: "25"
          job_summary: "{{effective_job_summary}}"
        as: result_25

  # ================================================================
  # PHASE 7: COMPLETION SUMMARY
  # ================================================================

  # Update banner to complete state
  - type: browser.injectJS
    js: |
      const banner = document.getElementById('sb-progress-banner');
      if (banner) {
        banner.style.background = 'linear-gradient(135deg, #22C55E 0%, #16A34A 100%)';
        banner.innerHTML = '<span>Validation complete — generating summary...</span>';
      }

  - type: llm.generate
    prompt: |
      Summarize the validation results. Count only non-empty results.
      Total candidates on page: {{candidate_count}}

      Results (some may be empty if fewer than 25 candidates):
      1: {{result_1.rating}}
      2: {{result_2.rating}}
      3: {{result_3.rating}}
      4: {{result_4.rating}}
      5: {{result_5.rating}}
      6: {{result_6.rating}}
      7: {{result_7.rating}}
      8: {{result_8.rating}}
      9: {{result_9.rating}}
      10: {{result_10.rating}}
      11: {{result_11.rating}}
      12: {{result_12.rating}}
      13: {{result_13.rating}}
      14: {{result_14.rating}}
      15: {{result_15.rating}}
      16: {{result_16.rating}}
      17: {{result_17.rating}}
      18: {{result_18.rating}}
      19: {{result_19.rating}}
      20: {{result_20.rating}}
      21: {{result_21.rating}}
      22: {{result_22.rating}}
      23: {{result_23.rating}}
      24: {{result_24.rating}}
      25: {{result_25.rating}}

      Count how many are in each category (ignore empty/undefined):

      VALIDATION COMPLETE
      ==================
      Good Fit: X applicants
      Maybe: X applicants
      Not a Fit: X applicants
      ==================
      Total Processed: {{candidate_count}}
    as: summary

  - type: control.stop
    message: "{{summary}}"