prospect — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited prospect (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.
Go from an ICP description to a ranked, phone-enriched lead list. Filters are resolved before search — never guess filter values.
conversation_id from the most recent Lusha response on every call. Start every reason_for_invocation with prospect: (or with the calling skill's name, when another skill delegated here).purchase_options.next_step_hints and the user picks one of its offers, pass its ref as next_step_ref.Extract structured filters from the user's natural language description. Some filters take free-form text directly; others must be resolved to canonical values first.
Contact filters (`prospecting_contact_search`):
jobTitles (free-form strings, e.g. "VP of Sales"). No resolution call needed.prospecting_contact_filters (type: departments, seniority). Use these for broad role targeting when a specific title isn't given.prospecting_contact_filters (type: all_countries); Location → type: locations (requires locationSearchText).Company filters (`prospecting_company_search`):
prospecting_company_filters (type: industries_labels)prospecting_company_filters (type: sizes)prospecting_company_filters (type: revenues)prospecting_company_filters (type: locations, requires q)prospecting_company_filters (type: technologies, requires q)prospecting_company_filters (type: intent_topics)Resolve every non-title filter to canonical values before searching — passing raw natural-language strings as structured filter values is the most common cause of search failures. Each prospecting_*_filters call resolves one filter type; run the independent lookups in parallel.
If the ICP is too vague to resolve (no title, no industry, no company size), ask one clarifying question before proceeding. At minimum, a title or department and at least one company-level constraint are required.
See references/filter-guide.md for filter resolution details.
Use prospecting_company_search with resolved company filters. Request up to 25 results. This scopes the contact search to qualified accounts.
If the user only specified contact-level criteria (no company filters), skip this step and go directly to Step 3.
Use prospecting_contact_search with resolved contact filters. Scope to the company results from Step 2 where applicable. Request up to 25 results.
No results? Don't stop. Say exactly what was searched, then offer the widening that fits, most useful first:
departments + seniority ids).Search results are previews — they carry no phones/emails but include a canReveal[] list per contact showing which fields can be revealed and their per-field credit cost in canReveal[].credits.
Use prospecting_contact_enrich with the contact ids to reveal phones and email. Pass reveal set from the results' canReveal[].field to control exactly which fields (and credits) you pay for. Up to 50 contacts per call — split larger sets across calls.
Before enriching, sum the canReveal[].credits for the fields you'll reveal, state the total to the user, and wait for confirmation on large batches. Use account_usage first if the user wants to confirm their balance covers it.
What a reveal returns.
canReveal[].credits is Lusha's own price. If the account has the data waterfall on, a Lusha miss can be filled by a third-party source at its own rate (account_usage lists them, e.g. a phone at 8 credits). Say so when quoting the cost. Offer waterfallEnabled: false for a Lusha-only reveal.Background reveals. A job block in an enrich response means some reveals (usually from third-party sources) are still running. Show what has landed and how many are still running (job.outstandingCount). Then check contacts_enrich_job_status after pollAgainInSeconds until isTerminal is true, and read the final contacts with contacts_enrich_job_results (contactLimit: 25, following contactPage.nextContactOffset while hasMore). Never enrich the same ids again: that charges twice. The job tools are free. Larger sets still go in calls of 50; each call may carry its own job.
Show the user exactly what was used so they can verify:
| Filter | Value |
|---|---|
| ... | ... |
| # | Name | Title | Company | Industry | Size | Direct Phone | Mobile | Intent Signal |
|---|
— not blank cellsintent_topics filter was usedscore-my-listsave-or-export (contacts tables are free)save-or-export, which checks the CRM connection first and offers to connect one if there is none~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.