@vruum/skills 0.6.66 → 0.6.68

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.66",
3
+ "version": "0.6.68",
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,9 +1,9 @@
1
1
  {
2
2
  "name": "vruum",
3
- "version": "0.6.66",
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.",
3
+ "version": "0.6.68",
4
+ "description": "Connect your Vruum workspace to review revenue priorities, manage deals, research prospects, and prepare outreach through guided skills and authenticated MCP tools.",
5
5
  "author": {
6
- "name": "Vruum AI",
6
+ "name": "Vruum",
7
7
  "url": "https://vruum.ai"
8
8
  },
9
9
  "license": "MIT",
@@ -13,7 +13,26 @@
13
13
  "mcpServers": "./.mcp.json",
14
14
  "interface": {
15
15
  "displayName": "Vruum",
16
- "shortDescription": "Vruum sales skills + remote MCP server",
17
- "category": "Productivity"
16
+ "shortDescription": "Manage your revenue work",
17
+ "longDescription": "Connect your existing Vruum workspace to review daily priorities, inspect deals, research people and companies, and prepare outreach. Use guided workflows to review drafts and record updates in your workspace. Access follows your Vruum account permissions, and execution follows your workspace policies.",
18
+ "developerName": "Vruum",
19
+ "category": "Productivity",
20
+ "capabilities": [
21
+ "Revenue priorities",
22
+ "Deal review",
23
+ "Prospect research",
24
+ "Outreach review"
25
+ ],
26
+ "websiteURL": "https://vruum.ai",
27
+ "privacyPolicyURL": "https://vruum.ai/privacy",
28
+ "termsOfServiceURL": "https://vruum.ai/terms",
29
+ "defaultPrompt": [
30
+ "What needs my attention in Vruum today?",
31
+ "Review my stalled deals and recommend the next action for each.",
32
+ "Review my outreach drafts and suggest improvements before I approve them."
33
+ ],
34
+ "brandColor": "#3B82F6",
35
+ "composerIcon": "./assets/logo.svg",
36
+ "logo": "./assets/logo.svg"
18
37
  }
19
38
  }
package/README.md CHANGED
@@ -63,13 +63,21 @@ Register the MCP server via your editor's MCP setup (each one has its own UI / c
63
63
 
64
64
  ### Claude Desktop / Claude.ai (Cowork)
65
65
 
66
- Install the Vruum plugin via the official plugin directory — bundles the connector and the skills in one step:
66
+ Download the Vruum plugin ZIP to bundle the connector and skills in one step:
67
67
 
68
68
  [github.com/vruum-gtm/skills/releases/latest/download/vruum-plugin.zip](https://github.com/vruum-gtm/skills/releases/latest/download/vruum-plugin.zip)
69
69
 
70
70
  Download and upload via **Settings → Customize → Plugins → "+"**.
71
71
 
72
- ### ChatGPT / Windsurf / other harnesses without plugin support
72
+ ### ChatGPT
73
+
74
+ Vruum's OpenAI directory submission is in preparation. This package does not
75
+ establish an approved directory listing. Until that listing is available,
76
+ connect `https://api.vruum.ai/mcp` through custom remote MCP where your account
77
+ supports it. The npm installer below requires a local harness; it does not
78
+ install skills into ChatGPT.
79
+
80
+ ### Other local harnesses without plugin support
73
81
 
74
82
  ```bash
75
83
  npx --yes @vruum/skills@latest install --target /path/to/skills/dir
Binary file
@@ -0,0 +1 @@
1
+ <?xml version="1.0" encoding="UTF-8"?><svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 522.374 522.374"><g transform="translate(18.238 0)"><path d="M456.671,275.006c-5.426.014-10.551,1.918-14.645,5.382l-63.169-32.3c26.307-10.274,51.567-17.688,69.895-22.464,3.921,3.176,8.909,5.083,14.333,5.083h.059c12.578-.032,22.785-10.291,22.754-22.871-.033-12.559-10.26-22.753-22.812-22.753h-.059c-12.306.032-22.336,9.854-22.735,22.058-53.133,14.055-146.261,45.436-186.856,100.152l-.214-84.072c.186-.934.245-1.91.15-2.907-.214-2.232-.22-4.479-.018-6.68,1.988-21.774,24.98-44.324,66.488-65.212,21.68-10.91,48.508-21.361,78.341-30.572,3.966,3.328,9.073,5.337,14.641,5.337h.059c12.578-.032,22.785-10.291,22.754-22.871-.033-12.559-10.26-22.753-22.812-22.753h-.059c-12.244.031-22.237,9.753-22.731,21.871-30.001,9.373-57.083,20.001-79.183,31.122-25.507,12.835-44.787,26.452-57.762,40.738l-.325-128.012c.083-.041.164-.084.246-.126.329-.167.653-.342.974-.525.321-.183.636-.373.947-.571.306-.195.607-.397.905-.607.331-.234.655-.476.973-.726.248-.196.493-.396.734-.604.357-.306.704-.622,1.042-.95.097-.094.203-.176.299-.272.102-.103.189-.216.289-.32.328-.343.647-.694.954-1.057.197-.232.386-.468.572-.707.256-.328.504-.663.743-1.005.199-.285.389-.574.574-.867.204-.324.401-.653.589-.988.175-.31.341-.624.5-.941.186-.371.364-.746.53-1.128.121-.278.234-.558.344-.84.184-.473.358-.952.511-1.44.058-.188.109-.377.162-.566.157-.552.299-1.11.415-1.678.025-.125.044-.251.067-.376.117-.628.213-1.263.277-1.908.007-.067.009-.134.015-.201.062-.682.098-1.371.098-2.069,0-.012,0-.025,0-.037,0-.007,0-.014,0-.02,0-.019-.003-.037-.003-.056-.004-.726-.04-1.445-.11-2.154-.003-.034-.007-.069-.01-.103-.069-.664-.17-1.319-.295-1.966-.023-.12-.045-.241-.07-.361-.118-.561-.26-1.112-.419-1.657-.065-.226-.133-.451-.206-.674-.143-.441-.301-.875-.47-1.304-.122-.311-.251-.618-.387-.923-.154-.346-.317-.688-.488-1.025-.174-.343-.357-.682-.548-1.016-.175-.306-.357-.607-.546-.904-.203-.319-.414-.633-.633-.943-.224-.317-.456-.628-.696-.932-.206-.262-.417-.519-.635-.773-.295-.343-.599-.677-.914-1.002-.101-.104-.189-.217-.292-.32-.109-.108-.229-.201-.34-.307-.325-.311-.659-.613-1.002-.905-.248-.211-.5-.414-.755-.613-.308-.24-.621-.472-.941-.696-.305-.214-.613-.418-.927-.616-.299-.188-.603-.37-.911-.545-.333-.189-.67-.369-1.012-.541-.34-.171-.685-.334-1.035-.488-.305-.134-.612-.261-.923-.382-.435-.169-.874-.328-1.322-.471-.223-.071-.447-.135-.672-.199-.547-.156-1.099-.299-1.661-.414-.124-.025-.249-.044-.373-.067-.627-.118-1.261-.215-1.905-.28-.059-.006-.119-.008-.179-.014-.694-.065-1.396-.102-2.106-.102-.008,0-.015-.001-.023-.001h-.06c-.025,0-.05.004-.075.004-.713.004-1.419.04-2.115.108-.049.005-.097.009-.145.014-.652.068-1.294.168-1.928.29-.133.025-.266.05-.398.078-.549.116-1.089.255-1.623.41-.236.068-.47.139-.704.215-.432.141-.857.295-1.277.46-.318.125-.632.257-.943.396-.341.152-.677.312-1.009.48-.347.175-.688.36-1.026.553-.304.174-.603.354-.897.542-.321.204-.636.415-.947.636-.316.224-.626.455-.93.695-.262.206-.52.417-.774.636-.343.295-.677.599-1.002.913-.104.101-.218.189-.32.292-.107.108-.199.227-.304.336-.318.332-.626.673-.923,1.023-.204.241-.401.485-.594.733-.251.322-.494.65-.728.985-.202.29-.396.584-.585.882-.202.32-.396.645-.582.976-.176.313-.345.63-.506.951-.185.368-.361.74-.526,1.119-.122.28-.237.563-.347.848-.183.471-.356.948-.508,1.433-.059.189-.11.381-.164.572-.157.552-.299,1.11-.415,1.678-.025.124-.044.249-.067.373-.117.629-.213,1.264-.277,1.909-.007.067-.009.135-.015.202-.062.682-.098,1.371-.098,2.068,0,.012,0,.025,0,.037,0,.007,0,.014,0,.02,0,.019.003.037.003.056.004.726.04,1.445.11,2.154.003.034.006.068.01.102.069.666.171,1.322.296,1.97.023.117.044.235.068.352.119.565.262,1.121.422,1.67.063.219.129.437.199.654.145.448.306.89.478,1.325.119.303.245.602.376.899.158.356.326.707.502,1.053.168.332.345.659.53.983.182.319.371.633.568.942.195.306.397.608.608.906.233.331.475.654.726.972.197.249.397.494.605.736.306.357.622.704.949,1.041.094.097.176.203.273.299.103.102.216.189.32.289.342.328.693.646,1.054.952.229.194.461.381.696.565.331.259.668.509,1.014.75.28.195.564.383.852.565.327.207.659.406.997.596.305.172.613.336.926.493.077.039.153.08.23.118v128.012c-13.011-14.253-32.326-27.821-57.865-40.591-22.129-11.065-49.237-21.624-79.263-30.921-.525-12.117-10.543-21.813-22.787-21.813-12.579,0-22.812,10.233-22.812,22.812s10.233,22.812,22.812,22.812c5.59,0,10.714-2.025,14.685-5.374,29.856,9.136,56.711,19.518,78.419,30.373,41.562,20.782,64.61,43.274,66.654,65.042.207,2.204.207,4.452,0,6.682-.092.995-.031,1.968.156,2.9v84.078c-40.734-54.612-133.941-85.757-187.11-99.677-.43-12.203-10.485-22-22.791-22-12.578,0-22.812,10.233-22.812,22.812s10.233,22.812,22.812,22.812c5.447,0,10.453-1.922,14.38-5.119,18.34,4.729,43.618,12.079,69.951,22.286l-63.09,32.462c-3.967-3.334-9.079-5.347-14.654-5.347-12.578,0-22.812,10.233-22.812,22.812s10.233,22.812,22.812,22.812c12.297,0,22.347-9.782,22.791-21.972l79.051-40.675c.514.233,1.029.461,1.543.695,28.086,12.852,50.688,26.941,67.177,41.875,19.25,17.436,30.125,36.062,32.323,55.363.572,5.022.57,10.206-.004,15.409-.161,1.457.008,2.872.434,4.181v136.323c0,5.522,4.478,10,10,10,.22,0,.434-.019.651-.033.197.012.393.03.594.03h.025c5.522-.014,9.988-4.503,9.975-10.025l-.346-136.32c.423-1.311.588-2.727.423-4.184-.587-5.203-.602-10.388-.043-15.408,2.148-19.308,12.977-37.962,32.183-55.445,16.451-14.977,39.017-29.123,67.069-42.047.513-.236,1.027-.465,1.54-.699l79.176,40.484c.226,5.772,2.561,11.167,6.678,15.262,4.306,4.284,10.017,6.641,16.085,6.641h.062c6.094-.016,11.816-2.402,16.114-6.722,4.299-4.32,6.656-10.055,6.641-16.146-.016-6.094-2.402-11.816-6.722-16.114-4.32-4.299-10.068-6.675-16.146-6.641Z" fill="#3b82f6"/></g></svg>
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@vruum/skills",
3
- "version": "0.6.66",
3
+ "version": "0.6.68",
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": {
@@ -20,6 +20,7 @@
20
20
  "LICENSE",
21
21
  "skills/",
22
22
  "agents/",
23
+ "assets/",
23
24
  "bin/",
24
25
  ".mcp.json",
25
26
  ".claude-plugin/",
@@ -41,5 +42,5 @@
41
42
  "outreach",
42
43
  "gtm"
43
44
  ],
44
- "contentHash": "de2c5ed6fe1316e89f8c0e088b99d1c45b56714fcb38ede708ea06febd9195e8"
45
+ "contentHash": "935d2cff928fcd38ce3918f9a9b03b10997239323f820f351224c843c3a6aa1c"
45
46
  }
@@ -13,13 +13,21 @@ description: >-
13
13
 
14
14
  Your meeting transcripts (Gemini Meet auto-notes, Read.ai reports) land in Google Drive. With Drive connected to Vruum, those transcripts sync into your knowledge base — but on their own they're just searchable text. This skill turns them into CRM activity: each transcript gets **attached to the right person and deal as a meeting** on their timeline, and its **action items become Vruum tasks** that show up in your daily briefing.
15
15
 
16
- This is an analyst's job, not a batch import. The attribution step (which person? which deal?) is where a wrong guess does real damage — a meeting logged on the wrong account misleads whoever reads it next. So **you confirm every attach before anything is written**, the skill never auto-attaches an ambiguous match, and it's **safe to re-run** (already-logged meetings and tasks are skipped, not duplicated).
16
+ This is an analyst's job, not a batch import. The attribution step (which person? which deal?) is where a wrong guess does real damage — a meeting logged on the wrong account misleads whoever reads it next. So **you confirm every attach before anything is written**, the skill never auto-attaches an ambiguous match, and every retry checks the meeting and task receipts separately.
17
17
 
18
18
  ## What this needs
19
19
 
20
20
  - **Drive connected to Vruum.** The transcripts must be syncing into the knowledge base via the connector. If KB search turns up none of your recent meetings, the connection may be down or PDFs may not be admitted — say so and stop; this skill reads what's synced, it doesn't fix the connector.
21
21
  - **Vruum MCP** for: `search` (kb + people reads), `get_person_360`, `manage_person` (to log the meeting as a `meeting`-kind interaction), `manage_tasks`, `get_tasks`.
22
22
 
23
+ **Check the session's actual tools before proposing execution.** The backend may
24
+ implement a tool without advertising it to the harness. If either task tool is
25
+ unavailable, explain that meeting-to-task execution is blocked; prepare a
26
+ reviewable proposal only. Do not log the meeting first and then discover that its
27
+ approved tasks cannot be written. Drive connection health proves neither tool
28
+ availability nor automatic contact linking/task creation: those are this reviewed
29
+ workflow's separate steps.
30
+
23
31
  ### Step 1 — Establish the recency window, then find NEW transcripts
24
32
 
25
33
  **This skill is incremental and go-forward.** It ingests only meetings newer than the last one already logged, and never re-ingests the historical archive (a connected Drive can hold years of old transcripts — those stay KB-searchable but are not turned into CRM activity/tasks).
@@ -28,17 +36,24 @@ This is an analyst's job, not a batch import. The attribution step (which person
28
36
  - **Set** → the window is everything *after* that date.
29
37
  - **`null`** (no meeting logged yet — first run) → **ask the operator for a seed date** ("Ingest meetings since when? (default: last 30 days)"). Never silently default to the whole archive.
30
38
 
31
- 2. **Find candidates — deterministic recency listing, NOT a keyword search.** `search` type=kb with `filters={doc_type: "connector", modified_after: "<watermark or seed date, ISO-8601>", include_content: false}` and **no `query`**. This returns every synced connector document modified after the watermark, newest first (up to 100). Connector results carry `source_kind='connector'`, the meeting date in `modified_at`, a Drive `url`, and predictable filename shapes:
39
+ 2. **Find candidates — deterministic recency listing, NOT a keyword search.** `search` type=kb with `filters={doc_type: "connector", modified_after: "<watermark or seed date, ISO-8601>", include_content: false}` and **no `query`**. This lists synced connector documents modified after the watermark, newest first (up to 100). Connector results carry `source_kind='connector'`, the Drive modification time in `modified_at` (not the meeting date), a Drive `url`, and often these filename shapes:
32
40
  - **Gemini:** `… - Notes by Gemini`, `… - Transcript`, `… - Live Notes`
33
41
  - **Read.ai:** `… - Read Meeting Report`, `… Smart Notes`
34
42
 
35
43
  > **Never use a keyword query for this step.** A query (e.g. "meeting notes transcript live notes") is a relevance-ranked top-N sample over the whole archive — on a Drive with years of old transcripts, recent meetings routinely fall below the relevance cutoff and the run wrongly concludes there is nothing new. Keyword search is fine later for looking things up; candidate discovery must be the `modified_after` listing.
36
44
 
37
- 3. **Keep only the meeting artifacts.** The listing is every synced doc in the window, so drop non-meeting files (specs, sheets, decks) by the filename shapes above and obvious content. The Drive's historical archive is intentionally left KB-searchable-only, NOT re-ingested into the CRM. Logging an old meeting (and minting "follow up next week" tasks from a meeting that happened a year ago) is noise.
45
+ 3. **Keep only the meeting artifacts.** The filename shapes above are clues, not an allowlist. Exported notes can use a plain `YYYY-MM-DD - <meeting title>` name with no provider suffix. Inspect the summary and, when unclear, read the document before excluding it; meeting time, attendees and substantive discussion identify a meeting more reliably than its filename. Drop obvious non-meeting files (specs, sheets, decks). The Drive's historical archive is intentionally left KB-searchable-only, NOT re-ingested into the CRM. Logging an old meeting (and minting "follow up next week" tasks from a meeting that happened a year ago) is noise.
38
46
 
39
47
  > **The window field is Drive *modified* time, not the meeting time.** They usually track each other, but an OLD transcript someone re-edits re-enters the window looking "new" — check the meeting date in the title/content, and the Step 5 idempotency marker catches anything already logged. If the listing returns exactly 100 documents, the window overflowed and the OLDEST part was cut (results are newest-first) — tell the user and pull the remainder via the Drive MCP alternative below; a narrower window can NOT recover it (the filter is a lower bound only).
40
48
 
41
- 4. Present the surviving candidates as a short list: `name · meeting date · one-line summary`. **If none are newer than the watermark, say so and stop** — there are no new meetings to ingest.
49
+ 4. Present the surviving candidates as a short list: `name · meeting date · one-line summary`. **If none are newer than the watermark, say so and stop** — no new candidates were found in the inspected window. This is not a claim about uninspected history.
50
+
51
+ A failed or timed-out listing is **unknown coverage**, never an empty result.
52
+ Report the failing read and stop discovery; do not substitute a keyword sample
53
+ and claim completeness. The latest logged meeting is only a recency hint,
54
+ not a completed-import checkpoint: skipped/failed older meetings and late
55
+ arrivals can remain behind it. Any recovery or historical pass needs an
56
+ explicitly agreed window and a per-document completion ledger.
42
57
 
43
58
  > **One meeting, one record.** Gemini + Read.ai often produce 3-4 artifacts per meeting (`- Transcript`, `- Live Notes`, `Read Meeting Report`, `- Chat`). Pick the single richest one (usually `- Transcript` or `Notes by Gemini`) and ingest that — don't log the same meeting multiple times.
44
59
 
@@ -48,6 +63,13 @@ This is an analyst's job, not a batch import. The attribution step (which person
48
63
 
49
64
  `search` type=kb with `filters={document_id: "<doc_id>", include_content: true}` returns the full document text. You need the whole transcript (attendees + the discussion), not a search snippet.
50
65
 
66
+ Check `truncated` and the actual content. A Read Meeting Report link, attendee
67
+ list, empty "Your Notes"/"Live Notes" template or "Recent Turn: ..." placeholder
68
+ is not a transcript. Mark it source-incomplete and request the substantive
69
+ artifact; do not infer action items from its title. If `truncated=true`, obtain
70
+ the complete source through an already-authorized read path or report the read
71
+ limit before extracting a supposedly complete action list.
72
+
51
73
  ### Step 3 — Resolve the entity (the careful step)
52
74
 
53
75
  For each transcript, work out **which person** it's with and **which deal** it belongs to. Mis-attribution is worse than no attribution — when in doubt, ask.
@@ -75,7 +97,12 @@ Per transcript, show the user the complete proposal before writing anything:
75
97
  - **Meeting:** the recap + meeting date.
76
98
  - **Tasks:** the action-item list.
77
99
 
78
- **Idempotency check (do this before writing):** confirm the transcript isn't already logged — in `get_person_360` for the resolved person, scan recent **meeting** activity for the marker `[vruum-meeting:<doc_id>]`. If it's there, this transcript was already ingested → skip it (don't re-log, don't re-create tasks). The marker must lead the summary (see Step 6) because `get_person_360` truncates each activity description to ~200 chars — a marker buried at the end is cut off and the scan misses it.
100
+ **Idempotency check (do this before writing):** in `get_person_360` for the resolved person, scan recent **meeting** activity for the marker `[vruum-meeting:<doc_id>]`. If present, skip the meeting write. That marker does **not** prove its tasks succeeded: a run can fail after logging the meeting. Resume task writes only from the saved, approved task list with the same external IDs and original numbering; the task service returns an existing task on a sequential retry. If that proposal or its write receipts are missing, report the partial state for review instead of inventing a new task list. The marker must lead the summary because `get_person_360` truncates each activity description to ~200 chars.
101
+
102
+ The recent activity view is bounded. Absence there is not proof that an old
103
+ meeting was never logged. Historical reconciliation needs an exhaustive,
104
+ tenant-scoped marker check before writes. Run one writer at a time: the meeting
105
+ marker is a workflow check, not a database uniqueness constraint.
79
106
 
80
107
  The user **approves / edits / drops individual tasks / drops the whole transcript**. Only what they approve gets written.
81
108
 
@@ -87,7 +114,7 @@ For each approved transcript:
87
114
  - `person_id` = the resolved person
88
115
  - `interaction_kind` = `"meeting"`
89
116
  - `direction` = `"outbound"` (or `"inbound"` if the prospect convened it)
90
- - `occurred_at` = the meeting date as ISO-8601 (from the transcript title/text; fall back to the KB doc's date)
117
+ - `occurred_at` = the meeting date as ISO-8601 from the transcript title/text, with its timezone resolved. If missing, ask; Drive modification time can be a later edit/export and must not silently become the meeting date.
91
118
  - `deal_id` = the resolved deal (omit if none)
92
119
  - `summary` =
93
120
  ```
@@ -96,21 +123,21 @@ For each approved transcript:
96
123
  Attendees: <names / emails>
97
124
  Source: <transcript filename> (Google Drive)
98
125
  ```
99
- The `[vruum-meeting:<doc_id>]` marker is what makes re-runs idempotent (Step 5 scans for it). It **must be the very first thing in the summary** — `get_person_360` truncates the activity description to ~200 chars, so a marker placed at the end is cut off and the dedup scan silently fails (re-runs would create duplicate meetings). Keep it verbatim, at the front.
126
+ The `[vruum-meeting:<doc_id>]` marker lets Step 5 detect a previously logged transcript within the returned activity history. It **must be the very first thing in the summary** — `get_person_360` truncates the activity description to ~200 chars, so a marker placed at the end is cut off and the duplicate check fails. Keep it verbatim, at the front.
100
127
  2. **Name the meeting's purpose** — pass `purpose` on the `manage_person` interaction (step 1) when the transcript makes it clear: discovery, demo, proposal, negotiation, commit, kickoff, impact_review, renewal, expansion, winback, internal, other. A purpose you got wrong is corrected later with `manage_person` action=set_meeting_purpose (id = `li:<interaction id>` for a logged meeting, or the meeting id; payload={purpose}) — it moves the held event to the right practice. The held meeting's timeline event under its practice (`discovery_held`, `kickoff_held`, `impact_review_held`, …) is written by the backend from the purpose; you do NOT call `manage_account` action=record_impact for the meeting itself — a held meeting is not impact. Record impact only when the transcript states a RESULT the customer got (a value in a unit): then `manage_account` action=record_impact with a post-commit practice (onboarding | adoption | expansion), its event type, `value_delivered_numeric` and `value_delivered_unit`.
101
128
  3. **Create each approved task** — `manage_tasks` action=create with:
102
129
  - `title` (the action item), `person_id` (+ `deal_id` if there is one)
103
130
  - `priority`, and `due_at` as ISO-8601 **only if** a date was actually parseable (omit otherwise)
104
131
  - `assigned_to` = the rep running this (leave to self; only assign a teammate if you know their Vruum user id)
105
- - `external_id` = `transcript:<doc_id>:task:<n>` — the backend dedups on this, so re-running never duplicates a task.
132
+ - `external_id` = `transcript:<doc_id>:task:<n>` — keep the approved list's original numbering, including gaps for dropped tasks. Save the approved proposal and each successful task ID before continuing. Retry the same IDs sequentially; never renumber or re-extract the task list during partial recovery.
106
133
 
107
134
  ### Step 7 — Confirm
108
135
 
109
- Report concisely: **N meetings logged, M tasks created**, and anything **skipped** (already-logged, or unresolved). Note that the tasks will now surface in `get_daily_briefing` (tasks due) and on each person's timeline (`get_person_360`). For any **unresolved** transcripts, list them so the user can create the people and re-run.
136
+ Report concisely: **N meetings logged, M tasks created**, and anything **skipped** (already-logged, or unresolved). Distinguish reused tasks from newly created ones and report partial failures, unavailable tools, incomplete source text and discovery limits. Note that successfully created tasks will surface in `get_daily_briefing` (tasks due) and on each person's timeline (`get_person_360`). For any **unresolved** transcripts, list them so the user can create the people and re-run.
110
137
 
111
138
  ## Guardrails
112
139
 
113
140
  - **Never attach on an ambiguous or missing match** — ask. Mis-attribution is worse than no attribution.
114
141
  - **Never invent action items** — only commitments actually stated in the meeting.
115
142
  - **You approve every write.** Nothing is committed without the Step 5 sign-off.
116
- - **Safe to re-run.** Tasks dedup on `external_id`; meetings dedup on the `[vruum-meeting:<doc_id>]` summary marker. Running this twice on the same Drive is a no-op for already-ingested meetings.
143
+ - **Reconcile before re-running.** Tasks dedup on stable `external_id` values; meeting checks use the `[vruum-meeting:<doc_id>]` summary marker. Multiple artifacts for one meeting, truncated activity history and partial task failures require explicit reconciliation. Do not promise an unconditional no-op.