@vruum/skills 0.6.41 → 0.6.42
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vruum",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.42",
|
|
4
4
|
"description": "Vruum AI skills + remote MCP server for B2B GTM teams. Slash commands for outreach triage, engagement triage, pipeline filling, prospect enrichment, and reply diagnosis, paired with the full Vruum MCP tool surface over OAuth 2.1.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Vruum AI",
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "vruum",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.42",
|
|
4
4
|
"description": "Vruum AI skills + remote MCP server for B2B GTM teams. Skills for outreach triage, engagement triage, pipeline filling, prospect enrichment, and reply diagnosis, paired with the full Vruum MCP tool surface over OAuth 2.1.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Vruum AI",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@vruum/skills",
|
|
3
|
-
"version": "0.6.
|
|
3
|
+
"version": "0.6.42",
|
|
4
4
|
"description": "Vruum AI skills for Claude Code, Claude Desktop, Codex CLI, and any AI assistant with a skill directory. Slash commands for outreach triage, engagement triage, pipeline filling, prospect enrichment, and reply diagnosis. Pairs with the Vruum MCP server at https://api.vruum.ai/mcp.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"repository": {
|
|
@@ -42,5 +42,5 @@
|
|
|
42
42
|
"outreach",
|
|
43
43
|
"gtm"
|
|
44
44
|
],
|
|
45
|
-
"contentHash": "
|
|
45
|
+
"contentHash": "116c4499218d3234185bf864ba4b84c1233ee375f967f9c66c4a34b97d325294"
|
|
46
46
|
}
|
|
@@ -60,7 +60,12 @@ Stable operator-visible codes:
|
|
|
60
60
|
| `linkedin_auth_required` | LinkedIn account is disconnected/expired | reconnect LinkedIn |
|
|
61
61
|
| `company_identity_conflict` | exact evidence points to different companies | correct the evidence; never auto-merge |
|
|
62
62
|
| `company_resolution_failed` | company resolver returned no canonical row | retry once, then inspect resolver logs and evidence |
|
|
63
|
-
| `
|
|
63
|
+
| `company_research_commit_unknown` | company research persistence response was lost | replay only the identical payload with the same idempotency key |
|
|
64
|
+
| `company_research_serialization_conflict` | bounded transaction retries were exhausted | replay only the identical payload with the same idempotency key |
|
|
65
|
+
| `idempotency_key_reused` | a save key was reused with different content | keep the original payload or generate a new key |
|
|
66
|
+
| `company_research_invalid_value` | a company anchor or research value is malformed | correct the named value before retrying |
|
|
67
|
+
| `company_research_source_invalid` | a shared field lacks admissible evidence | add/correct sources_by_field before retrying |
|
|
68
|
+
| `company_research_save_failed` | save failed outside the atomic receipt boundary | inspect the correlation ID before deciding whether to retry |
|
|
64
69
|
| `person_not_visible` | supplied person is outside the caller's tenant | use a tenant-visible person or omit `person_id` |
|
|
65
70
|
| `person_not_found_for_update` | save_person anchors matched no one in your pipeline (update-only) | search and pass `payload.person_id`, or use save_discovered's `person` block for a new prospect |
|
|
66
71
|
| `identity_unverifiable` | person has neither a LinkedIn URL nor an email | include `person.linkedin_url` or `person.email` |
|
|
@@ -98,9 +103,11 @@ Per campaign's candidate list:
|
|
|
98
103
|
|
|
99
104
|
1. **MCP precheck + ICP load** (above) — abort run on failure.
|
|
100
105
|
2. **Batch dedup against existing pipeline.** Call `search(type="people", query=[{name, company, linkedin_url} for each candidate])`. Returns one match record per candidate (in input order). Drop candidates with non-null `match` — they're already in pipeline.
|
|
101
|
-
3. **Batch company-
|
|
102
|
-
-
|
|
103
|
-
-
|
|
106
|
+
3. **Batch company fixed-field reuse check.** Collect unique company domains from surviving candidates. Call `fetch(type="company_research", id=[the domains], filters={"requested_fields":["company_summary","company_stage","current_priorities","funding_data","growth_metrics"]})`.
|
|
107
|
+
- Reuse only values whose field entry has `status="reusable"`.
|
|
108
|
+
- `core_reuse.reusable` means the shared summary core is reusable; it never means the campaign brief is complete.
|
|
109
|
+
- Missing, unsourced, stale, invalid, and absent fields remain null inputs. Never carry a raw stored value forward.
|
|
110
|
+
- **Every company still runs Phase A** for campaign-relative outbound motion, ACV class, sales-cycle inference, and triggers. Reusable fixed values are inputs that avoid redundant fetching, not a Phase A skip signal.
|
|
104
111
|
4. **Operator confirmation gate (CSV / large lists only).** If the original candidate list was >200 (CSV) or >100 (manual list), confirm count to process before continuing.
|
|
105
112
|
|
|
106
113
|
**Latency:** ~2s for batch dedup + ~1s for batch company cache, regardless of list size. (Per-prospect iteration was ~12s for 60 prospects pre-batch primitives.)
|
|
@@ -111,7 +118,7 @@ Per campaign's candidate list:
|
|
|
111
118
|
|
|
112
119
|
**Concurrency cap: 10 parallel.** Phase A subagents don't call `research` with action=linkedin_fetch — they hit `fetch` (type=company_research), `research` (action=enrich_company), `WebFetch`, `WebSearch`. No Unipile rate-limit pressure.
|
|
113
120
|
|
|
114
|
-
Dispatch one `vruum-company-deep-researcher` per unique
|
|
121
|
+
Dispatch one `vruum-company-deep-researcher` per unique company. Subagent file at `.claude/agents/vruum-company-deep-researcher.md` defines the workflow + tools. Include the reusable fixed-field values and their evidence in the prompt; the researcher must still compute campaign-relative outputs.
|
|
115
122
|
|
|
116
123
|
Dispatch prompt template (fill in placeholders):
|
|
117
124
|
|
|
@@ -126,7 +133,7 @@ acv_floor: {dollars or default $10K}
|
|
|
126
133
|
Run your workflow (a–i) and return the structured output block.
|
|
127
134
|
```
|
|
128
135
|
|
|
129
|
-
Each subagent returns: `company_name`, `domain`, `funding_data`, `growth_metrics`, `current_priorities`, `outbound_motion_score` (0/1/2), `acv_class` (smb/mid/ent), `sales_cycle_inference` (short/medium/long), `triggers[]`, `STATUS: ok | failed`,
|
|
136
|
+
Each subagent returns: `company_name`, `domain`, `company_summary`, `company_stage`, `funding_data`, `growth_metrics`, `current_priorities`, `sources_by_field` (`{field:[{url,title?,observed_at}]}`), `outbound_motion_score` (0/1/2), `acv_class` (smb/mid/ent), `sales_cycle_inference` (short/medium/long), `triggers[]`, `STATUS: ok | failed`, and the list of reused fixed fields. Subagents never persist; the orchestrator resolves `company_id` in Step 7 when the requested mode permits writes.
|
|
130
137
|
|
|
131
138
|
**Wait for the wave to complete before Phase B.** Phase B inputs depend on Phase A's signals (or null if failed).
|
|
132
139
|
|
|
@@ -227,7 +234,7 @@ Apply the requested mode before any persistence:
|
|
|
227
234
|
Per surviving prospect:
|
|
228
235
|
|
|
229
236
|
### a. Save company research (once per company)
|
|
230
|
-
|
|
237
|
+
When Phase A produced any newly researched fixed fields, call `research(action="save_company", payload={idempotency_key: <stable run/company save key>, name: <Phase A COMPANY>, website: <Phase A DOMAIN or canonical URL>, company_summary, company_stage, funding_data, growth_metrics, current_priorities: <newline-joined descriptions>, sources_by_field})`. The API field is `name`, not `company_name`; it accepts `website`, not `domain`; and `current_priorities` is one string. Omit reusable fields that were not revalidated so the atomic patch preserves them. Explicit null deliberately clears a field, so do not send null merely because Phase A did not research it. `sources_by_field` keys must equal exactly the supplied non-null research fields. Preserve the identical idempotency key and payload for unknown-commit replay; every bulk item needs its own key.
|
|
231
238
|
|
|
232
239
|
### b. Identity prep (names + company linkage for the atomic save)
|
|
233
240
|
|
|
@@ -348,7 +355,7 @@ Pipeline fill complete: {campaign_name} (source: {source}, mode: {harness|platfo
|
|
|
348
355
|
Candidates flow:
|
|
349
356
|
source : {N from source skill output}
|
|
350
357
|
pre-flight : {after dedup, after company-cache hit}
|
|
351
|
-
phase A : {company subagents fired} (
|
|
358
|
+
phase A : {company subagents fired} (0 skipped via cache; fixed fields reused: {count})
|
|
352
359
|
phase B : {prospect subagents fired} ({linkedin_unavailable} dismissed)
|
|
353
360
|
|
|
354
361
|
For runs that went through committee resolution (account_list, discovery Path B), also report:
|