leadbay_qualify_top_n — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited leadbay_qualify_top_n (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Qualify the top <the user-supplied value if any; otherwise a sensible default. Source: How many leads to qualify (default 10, max 25). Higher counts may take 5+ minutes.> un-qualified leads in the active Leadbay lens.
GATE — DEFER TO TOOL RENDERING. When you call a Leadbay composite that ships its own RENDERING block (every composite in 0.9.0+ does), render the response using that block's recipe verbatim — score bars, glyph palette, column order, hide-list, link priorities, all of it. Do NOT substitute prose, a numbered list, or a different column structure even when an orchestrating prompt's body suggests alternate framing. Prompt-specific commentary (motivational nudges, summaries, next-action recommendations) belongs ABOVE or BELOW the canonical table, never in place of it.
If the prompt's body and the tool's RENDERING appear to conflict, the tool's RENDERING wins for the structural layout; the prompt's voice wins for the commentary that surrounds it.
Call leadbay_bulk_qualify_leads with count=<the count_or_default (as extracted above)> and wait_for_completion=true (synchronous mode — waits for results before returning).
Resilience rule: If leadbay_bulk_qualify_leads returns a BulkTracker-not-configured error or similar infrastructure error, do NOT retry with wait_for_completion=false. Instead, proceed directly to Phase 3 and call leadbay_pull_leads to surface the already-qualified leads in the current batch.
While it polls, expect notifications / progress events showing per-lead transitions. Surface meaningful ones (e.g. "lead X just finished") to me as they arrive — one inline status sentence per check, never expanded into a card:
The response is a status confirmation or scalar — render exactly one sentence inline. Do NOT emit a card or a table. Do NOT enumerate the affected records (that's the next tool's job).
Template patterns to follow:
"✓ <Verb> N <noun(s)> — typically ~M minutes. I'll refresh when it's done.""All N <noun(s)> already <state> — no work to do.""⏳ <Verb> still running — N% complete; check back in ~M minutes.""⚠ <Verb> failed: <error>. <recovery hint>"After the status line, propose the obvious refresh / progress-check / recovery action in the NEXT STEPS block. Never expand the status into a card.
When bulk_qualify_leads returns, surface results in two parts.
Status line first — one sentence in this exact format: "✓ N leads qualified · M still processing (lead IDs: X, Y, Z)". Variants:
exhausted=true or total_unqualified_found=0 (all leads were already qualified): "✓ All N/N leads already qualified · 0 still processing" — use the actual count (e.g. "All 10/10 leads already qualified")Then a refreshed table — call leadbay_pull_leads to fetch the current batch (this is always required — the qualification results do not include the full lead data needed to render the table). Use the same lensId and render using the canonical pull_leads layout:
Present the response as a markdown table sorted by score descending, with exactly three columns. Do not summarize in prose. Do not show the numeric score anywhere.
Wrap a 10-glyph bar in a SINGLE inline-code span (backticks). The inline-code styling is what gives the bar contrast in most chat renderers — HTML <span> is stripped inside table cells.
Glyphs (use these exact characters; do not substitute):
▰ — firmographic-only fill❖ — AI-booster cap (placed at the RIGHT END of the filled run, never the front)▱ — emptyComputation:
total_filled = round(score / 10), clamped to 0..10
ai_segments = round(qualification_summary.avg_qualification_boost / 3.3),
clamped to [0, total_filled]
normal_filled = total_filled − ai_segments
bar = "▰" × normal_filled
+ "❖" × ai_segments
+ "▱" × (10 − total_filled)If qualification_summary.answered == 0 or avg_qualification_boost is null, set ai_segments = 0 (no ❖). Always wrap the bar in backticks. Print the legend ` ▰ firmographic · ❖ AI booster cap · ▱ unfilled ` once below the table.
Column 1 — Company
<br> between lines. · + short location + · + compact size.website (prefix https:// if it's a bare hostname). Don't synthesize an app deep-link."Xk+" when size.min >= 1000, "min–max" otherwise.Column 2 — Why it fits
short_description, top 2 tags[].display_name, and the gist of qualification_summary.best_response_excerpt. The trim payload does NOT carry the longer description field — for that, agent must call leadbay_research_lead_by_id or leadbay_research_lead_by_name_fuzzy.(boost N) — the ❖ cap in column 1 already carries that signal.Column 3 — Contact
[Contact name](LINK) · short job title. The [Contact name](LINK) markdown link wrapping is mandatory — never render the name as plain text. See linking/contact-linkedin for the URL priority (real profile → constructed people-search) and the °-flag fallback.
Hide from the user (never include in any cell): id, location.pos, location.country (unless city/state both missing), sector_id, is_hq, web_fetch_in_progress, enrichment_in_progress, highlighted_fields, custom_fields, contacts_count when 0, notes_count / epilogue_actions_count / prospecting_actions_count when 0, stale_at, deal_insights, social_presence booleans (except as the °-flag signal), need_attention flags, any field whose value is the string "null".
MANDATORY: every contact name in your output — table cells, prose, headers, "Reach <Name>" callouts — MUST be wrapped in markdown link syntax `[Name](URL)`. Never render a contact name as bare text. A plain-text name is a broken contact card; the underlined name is the user's primary affordance for "take me to this person's profile". No "no URL available" exception — the search URL below is always constructable from name + company.
URL priority (first applicable wins):
contact.linkedin_page when it's a string starting with https:// (the MCP coerces the legacy literal "null" string to real null before you see it).https://www.linkedin.com/search/results/people/?keywords=<First>+<Last>+<Company>. URL-encode params. Strip Inc / LLC / Corp / Ltd / GmbH / Co / S.A. / S.L. / PLC / AG / SAS / SARL suffixes from the company. Append a trailing ° to the rendered name ONLY when this fallback is in use AND social_presence.linkedin == false. Never append ° when a real linkedin_page was used.Never link a person's name to the company's LinkedIn page (and vice versa) — the two surfaces are different and conflating them quietly degrades the workflow.
Use the lead's website as the company-name link target — prefix https:// if the value is a bare hostname. (The MCP does NOT synthesize a Leadbay-app deep-link URL; the team has not standardized one. Linking to website is always real data.)
When the response carries social_urls (the post-fix multi-platform URL block on rich-lead responses), render every non-null platform as a pill chip in the company-info row. Iterate over social_urls's keys — never hardcode a fixed list — and emit each as [<platform-label>](<url>). Skip platforms whose URL is null.
social_presence carries booleans for the same 6 platforms (crunchbase, facebook, instagram, linkedin, tiktok, twitter) — useful when you only care that the company has a profile somewhere. Use it as the °-flag signal in the contact people-search fallback (see linking/contact-linkedin).
ABOVE the table, add a 1–2 sentence "Standouts from this batch" line that calls out the 3 highest-ai_agent_lead_score rows — this is supplementary commentary, not a replacement for the table.
Recommend the single most-promising lead from this batch and offer to research it deeply with leadbay_research_lead_by_id. Do not actually call research_lead_by_id yet — wait for my go.
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.