@floomhq/signaldash 0.13.0 → 0.22.0

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: signaldash-safe-usage
3
- description: Safely read and send LinkedIn, WhatsApp, or email messages through the SignalDash MCP without triggering account restrictions or contacting the wrong person. Use whenever an agent uses li_list_chats, li_read_messages, li_send_message, wa_list_chats, wa_read_messages, wa_send_message, email_list, email_read, or email_send.
3
+ description: Safely search stored LinkedIn connections, inspect exact contact state and action budgets, read and send LinkedIn, WhatsApp, or email messages, and operate exact LinkedIn invitations or human-approved invitation batches through the SignalDash MCP without triggering account restrictions or contacting the wrong person. Use whenever an agent uses li_search_connections, sd_contact_state, sd_budget_status, li_list_chats, li_read_messages, li_send_message, li_send_invitation, li_invitations_received, li_accept_invitation, li_invitations_sent, li_withdraw_invitation, li_create_invitation_batch, li_get_invitation_batch, li_cancel_invitation_batch, wa_list_chats, wa_read_messages, wa_send_message, email_list, email_read, or email_send.
4
4
  ---
5
5
 
6
6
  # Use SignalDash safely
@@ -23,6 +23,21 @@ Treat LinkedIn, WhatsApp, and email as human accounts, not bulk messaging APIs.
23
23
  Never infer a recipient from a partial name. Never send blind. Never retry a
24
24
  send after an ambiguous timeout without first reading the thread.
25
25
 
26
+ ## Contact-state limits
27
+
28
+ - `sd_contact_state` uses exact user-and-channel identifiers only. It does not
29
+ infer that a LinkedIn profile, WhatsApp number, and email address belong to
30
+ one person.
31
+ - Inspect state with `action:"get"` before outreach planning. Stop when
32
+ `campaign_eligible` is false.
33
+ - Add a suppression only after explicit human approval of the exact channel,
34
+ identifier kind, and reason. Use `action:"suppress"` with an allowed reason
35
+ and `confirm:true`.
36
+ - Never switch identifiers or channels to evade `contact_suppressed`,
37
+ `recipient_replied`, `already_contacted`, or `already_connected`.
38
+ - MCP cannot clear a suppression. Escalate mistaken suppressions to the
39
+ SignalDash operator.
40
+
26
41
  ## Email limits
27
42
 
28
43
  - `email_send` accepts one recipient per call. Never loop to simulate a bulk
@@ -37,12 +52,62 @@ send after an ambiguous timeout without first reading the thread.
37
52
 
38
53
  ## LinkedIn limits
39
54
 
40
- - Keep normal messaging at 15 to 20 sends per day. SignalDash hard-caps at 18
41
- send attempts per account per UTC day.
42
- - Let SignalDash enforce 45 to 90 seconds between sends. Do not parallelize
43
- send calls or bypass the guard.
55
+ - Prefer `li_search_connections` for list building inside the user's existing
56
+ network. It searches the account-scoped stored snapshot and exact local
57
+ contact state only; it makes no LinkedIn, Unipile, HarvestAPI, or other paid
58
+ discovery request. A missing snapshot requires the paced `signaldash
59
+ connections` sync, never an improvised profile-fetch loop.
60
+ - Treat connection-search results as planning evidence, not action approval.
61
+ Inspect `already_in_contact`, `contact_state`, and `blocking_reasons`.
62
+ Resolve, review, and approve every later action through its one-object flow.
63
+ - Read `sd_budget_status` before planning multiple LinkedIn actions. Treat its
64
+ campaign-excluded portion as capacity campaigns cannot consume, never as a
65
+ reserved or guaranteed manual allowance. Its counts cover SignalDash
66
+ attempts, not all native LinkedIn activity.
67
+ - Keep normal messaging at human volume. Use the cap reported in each hosted
68
+ response; LinkedIn messages, invitations, invitation maintenance, and post
69
+ publishing share the stable sender's daily action budget.
70
+ - Let SignalDash serialize LinkedIn writes and apply action-specific jitter. Do
71
+ not parallelize write calls or bypass the guard. Invitation jitter completes
72
+ before the server's final provider preflight and action reservation.
73
+ - Campaign invitations use a sender-local Monday-Friday 09:00-17:00 work
74
+ window and a durable 90-180 second per-sender pacing interval. Timing is
75
+ checked before final preflight and atomically during action reservation.
76
+ Downtime does not authorize a catch-up burst.
77
+ - `li_create_invitation_batch` accepts only 1-10 immutable canonical LinkedIn
78
+ `/in/` URLs with an exact inclusion reason and optional exact note for each
79
+ target. It starts a durable preview, never a provider write. Use
80
+ `li_get_invitation_batch` until the preview is complete, then give the exact
81
+ `approval_url` to the human.
82
+ - MCP cannot approve a batch. Never enter the human credential, automate the
83
+ approval page, preselect targets, or claim approval from an MCP confirmation.
84
+ The human authenticates separately, reviews every stored row, and selects
85
+ each exact invitation.
86
+ - To cancel, first call `li_get_invitation_batch`, show the exact state and
87
+ approval hash, obtain explicit approval, then call
88
+ `li_cancel_invitation_batch` once with that exact hash and `confirm:true`.
89
+ Cancel affects only unstarted targets and cannot recall an executing write.
90
+ - Do not emulate pause, resume, priority, future scheduling, recurring runs,
91
+ dynamic target generation, or automatic follow-ups. A changed target, note,
92
+ reason, sender binding, or source label requires a new batch and new human
93
+ approval.
94
+ - SignalDash does not expose future start dates, recurring schedules,
95
+ automatic follow-ups, acceptance-triggered messages, or multi-message
96
+ sequences. Treat every later message as new context that needs a fresh
97
+ thread read, exact draft, and human approval.
44
98
  - LinkedIn invitation ceilings vary and often surface around 100 invitations
45
- per week. SignalDash exposes no invitation tool. Do not automate invites.
99
+ per week. SignalDash enforces a separate default policy cap of 100 outbound
100
+ invitation attempts per stable sender each UTC week. This is not a claim
101
+ about a LinkedIn-safe threshold.
102
+ - Preview `li_send_invitation` once without `confirm`, show the exact target and
103
+ note, obtain approval, then repeat the identical payload once with
104
+ `confirm:true`.
105
+ - Before `li_accept_invitation` or `li_withdraw_invitation`, list the exact
106
+ current received or sent invitation, show the exact action, and obtain
107
+ approval. Never loop over an invitation page.
108
+ - Relationship uncertainty, an existing connection, an existing one-to-one
109
+ chat, a pending invitation in either direction, an incomplete bounded page,
110
+ a sender lock, or `outcome_unknown` blocks the action.
46
111
  - Never bulk-fetch profiles, run enrichment sweeps, or repeatedly open
47
112
  individual profiles. Prefer chat lists, exported connection data, and
48
113
  cached records.
@@ -71,13 +136,13 @@ sessions, and repeated checkpoint retries trigger restrictions.
71
136
  Do not work around daily caps, jitter, duplicate detection, account scoping,
72
137
  or the persistent warning lock.
73
138
 
74
- On a warning:
139
+ On a warning or `outcome_unknown`:
75
140
 
76
141
  1. Stop all sends on that account.
77
142
  2. Inspect LinkedIn or WhatsApp manually for a restriction or checkpoint.
78
143
  3. Wait until the account is clearly back in good standing.
79
- 4. Let a human clear only that account's entry in
80
- `~/.signaldash/safety/send-state.json`.
144
+ 4. Let the hosted SignalDash operator reconcile and clear the durable sender
145
+ lock. A local session change cannot clear it.
81
146
  5. Resume at a lower volume.
82
147
 
83
148
  Let the agent act slowly and human-like. Account health outranks throughput.