@sellable/mcp 0.1.345 → 0.1.346

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.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.345",
3
+ "version": "0.1.346",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -63,6 +63,15 @@ currentStep: "sequence" })` to attach the sender via the v3 senders route and
63
63
  and Paid InMail Campaign is only an explicit paid-InMail opt-in because it
64
64
  can spend InMail credits. If that response does not persist `currentStep:
65
65
  "send"`, call `update_campaign({ campaignId, currentStep: "send" })`.
66
+ Then reread `get_campaign({ campaignId })` and `list_tables()` and verify the
67
+ current `workflowTableId` has `hasSequence:true`. A campaign-level
68
+ `SEQUENCE_EXISTS` response is not enough when `confirm_lead_list` or another
69
+ copy step has moved the campaign to a new current campaign table while an old
70
+ stale shell table still owns the sequence columns. In that stale-shell case,
71
+ either repair only the current workflowTableId with `attach_sequence` using
72
+ the same non-paid product template the recommended selector would have chosen,
73
+ or stop and report the stale-shell sequence blocker if replacement was not
74
+ explicitly approved. Never choose a paid-InMail template for this repair.
66
75
  9. Surface the `handoff.orientation` string from `auto-execute.yaml` and
67
76
  summarize the visible Settings/Sequence/Send state without repeating the
68
77
  watch URL.
@@ -141,7 +150,11 @@ order, atomically:
141
150
  2. **Validate sender + sequence state.** If no sender is attached, refuse start
142
151
  and return the Settings link. If no sequence is attached but a sender is
143
152
  attached, call `attach_recommended_sequence({ campaignId, currentStep:
144
- "send" })` before approving messages.
153
+ "send" })` before approving messages, then rerun the precondition check against
154
+ the current workflowTableId rather than an older shell table. If
155
+ `SEQUENCE_EXISTS` only proves an old shell while the current table lacks
156
+ `hasSequence:true`, stop or perform the explicitly approved stale-shell
157
+ current-table repair before any launch.
145
158
  3. **Approve generated messages** through the bounded or broad path:
146
159
  - If the user asked for an exact send count, such as "schedule 250 sends",
147
160
  verify the preparation job approved only the bounded prepared cohort for
@@ -68,6 +68,7 @@ Step 16 — awaiting-user-greenlight
68
68
  ask the user which connected sender to attach; in explicit UAT safe mode only, use the safe mock sender
69
69
  update_campaign(senderIds=[selectedSenderId], currentStep=sequence)
70
70
  attach_recommended_sequence({ campaignId, currentStep: "send" }) # tier-aware: premium/SN -> If Open Profile->INMAIL_OPEN, else INVITE->accepted->DM
71
+ reread get_campaign + list_tables; verify hasSequence:true on the current workflowTableId, not an older shell table
71
72
  if the attach response did not move the UI: update_campaign(currentStep=send)
72
73
  surface campaign setup orientation + final launch choices without repeating the watch URL
73
74
  STOP. DO NOT call start_campaign. DO NOT move to running without explicit launch greenlight.
@@ -81,7 +82,13 @@ hand-author a `version: 2` template with nodes, branches, and
81
82
  entryNodeId — that's error-prone mid-long-context (galley-off UAT
82
83
  `20260420T195732Z` failed because Claude hit "Invalid node type" and
83
84
  tried to debug via forbidden Bash/Glob calls). Use `attach_sequence`
84
- only when the caller explicitly needs a custom non-recommended cadence.
85
+ only when the caller explicitly needs a custom non-recommended cadence, or when
86
+ you have just reread the campaign after `confirm_lead_list` and proved the
87
+ current campaign table has no sequence while an older stale shell table is
88
+ causing campaign-level `SEQUENCE_EXISTS`. In that stale-shell repair case, use
89
+ `attach_sequence` on the current workflowTableId with the same non-paid product
90
+ template the backend would select; never choose a paid-InMail template and never
91
+ repair a table other than the current workflowTableId.
85
92
 
86
93
  Hard gates — if you find yourself about to violate any of these, stop
87
94
  first:
@@ -532,6 +539,14 @@ Shape:
532
539
  opt-in because it can spend InMail credits. If the tool response
533
540
  does not persist `currentStep: "send"`, call
534
541
  `update_campaign({ campaignId, currentStep: "send" })`.
542
+ Then reread `get_campaign({ campaignId })` and `list_tables()` and verify the
543
+ returned current workflowTableId has `hasSequence:true`. If
544
+ `attach_recommended_sequence` returned `SEQUENCE_EXISTS` but the current table
545
+ still has `hasSequence:false`, do not continue to launch handoff from that
546
+ stale shell proof. Repair only the current workflowTableId with
547
+ `attach_sequence` using the same non-paid product template the recommended
548
+ selector would have chosen, or stop and report the stale-shell sequence
549
+ blocker if replacement was not explicitly approved.
535
550
  9. Surface the `handoff.orientation` string from `auto-execute.yaml` without
536
551
  repeating the watch URL.
537
552
  10. Ask the final launch greenlight with the structured question function:
@@ -183,22 +183,51 @@ Parent-thread handwritten copy or setting `currentStep` is not proof.
183
183
  - The first review batch exists and at least 3 review rows have generated
184
184
  messages from the approved brief. If fewer than 3 usable rows exist, report
185
185
  the actual count and why.
186
+ If a bounded preparation job requested more than the minimum but already
187
+ met the minimum generated-message floor, do not stall on a single bad review row once a fresh status/readiness check shows no queued, processing, or active cells; record the shortfall, name the failed/empty-row reason when
188
+ available, and continue with route-proof review rather than expanding source
189
+ or waiting forever.
186
190
  - At least one generated row is approved as a route-proof gate. If zero rows
187
191
  are approved and the prompt explicitly asked for full/customer-ready
188
192
  completion, approve exactly one quality-valid generated row. If one or more
189
193
  rows are already approved, do not add more approvals during evergreen
190
194
  completion. Never broad approve all rows.
191
- - The recommended non-paid sequence is attached, and the watched campaign is
192
- on Send. Use `attach_recommended_sequence({ campaignId, currentStep:"send" })`
193
- when a safe attach is needed. Existing sequence proof may come from
194
- `SEQUENCE_EXISTS`; do not replace it without explicit user confirmation.
195
+ - The recommended non-paid sequence is attached to the current campaign
196
+ table, and the watched campaign is on Send. Use
197
+ `attach_recommended_sequence({ campaignId, currentStep:"send" })` when a
198
+ safe attach is needed. After `confirm_lead_list` or any source-list copy,
199
+ immediately reread `get_campaign({ campaignId })`; the returned
200
+ `workflowTableId` is the current campaign table. Cross-check that exact
201
+ current workflowTableId with `list_tables` and require `hasSequence:true`
202
+ before reporting completion. If a stale shell table has sequence columns but
203
+ the current campaign table does not, `SEQUENCE_EXISTS` is not enough:
204
+ record the stale shell table id, then repair the current workflowTableId
205
+ with `attach_sequence` using the same non-paid product template
206
+ `attach_recommended_sequence` would have selected. Never use a paid-InMail
207
+ template and never attach/replace sequence outside the current table unless
208
+ the current lane packet explicitly allowed sequence repair.
195
209
  - No scheduled, queued outbound, sent outbound, campaign launch, or paid
196
210
  InMail spend is created by this skill.
197
211
  4. **Verify each slot** after create/reuse/repair:
198
212
  - `get_campaign` shows the campaign exists, remains unlaunched, and has the expected workflow table.
199
213
  - Builder truth must match dashboard truth. `currentStep:"running"` is valid only when the linked table has `campaignStatus:"ACTIVE"`. For a `PAUSED` or `ARCHIVED` campaign/table, repair or flag stale `currentStep:"running"` back to launch review (`send` / review-ready) before reporting the slot done. Never call `start_campaign` just to make a stale `running` step true.
200
- - Send/action lanes such as Post Engagers have a sequence attached. Use `list_tables({ hasSequence: true })` as a quick cross-check, but do not treat that filter as the only proof. If the canonical campaign/table is missing from the sequence-filtered table list but a safe `attach_recommended_sequence({ campaignId })` repair/precheck returns `SEQUENCE_EXISTS`, record `sequence attached (verified by SEQUENCE_EXISTS precheck; list_tables.hasSequence mismatch)` and do not retry.
201
- - Only use `attach_recommended_sequence({ campaignId })` for a send-lane sequence repair/precheck when the target is a canonical prod slot and the invoking prompt allows sequence repair. Call it at most once without `confirmed`; a successful response is `repaired`, and `SEQUENCE_EXISTS` is non-mutating proof that a sequence already exists. Never call `attach_recommended_sequence` or `attach_sequence` with `confirmed:true` in evergreen automation unless the user explicitly asks to replace an existing sequence.
214
+ - Send/action lanes such as Post Engagers have a sequence attached on the
215
+ exact current campaign table. Use `list_tables({ hasSequence: true })` as a
216
+ quick cross-check, but do not treat that filter as the only proof. If the
217
+ canonical current campaign table is missing from the sequence-filtered
218
+ table list and `attach_recommended_sequence({ campaignId })` returns
219
+ `SEQUENCE_EXISTS`, inspect whether a stale shell table owns the sequence.
220
+ For a customer-visible completion run, stale shell proof is not completion:
221
+ rerun the current-table repair above or report `blocked: stale_shell_sequence`.
222
+ - Only use `attach_recommended_sequence({ campaignId })` for a send-lane
223
+ sequence repair/precheck when the target is a canonical prod slot and the
224
+ invoking prompt allows sequence repair. Call it at most once without
225
+ `confirmed`; a successful response is `repaired`. Treat `SEQUENCE_EXISTS` as
226
+ non-mutating proof only when the current table also has `hasSequence:true`.
227
+ Never call `attach_recommended_sequence` or `attach_sequence` with
228
+ `confirmed:true` in evergreen automation unless the user explicitly asks to
229
+ replace an existing sequence or the approved lane packet allows current
230
+ table stale-shell repair.
202
231
  - Do not report `source-only/no sequence expected` for any named evergreen
203
232
  campaign that appears in Campaigns, has a CampaignOffer ID, or is backed by
204
233
  a campaign dashboard table. Shared Signal Discovery and Shared Cold