@sellable/mcp 0.1.360 → 0.1.362

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.360",
3
+ "version": "0.1.362",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -183,9 +183,10 @@ not a parent-thread summary. The receipt must include:
183
183
  workflowTableId, brief hash or updated-at marker, delivery format, token
184
184
  rules, hard avoids, source-use rules, and first-message template state.
185
185
  - `sourceDecisionReceipt`: selected source/list id, provider, cursor/inventory
186
- state, import/copy caps, dedupe/DNC/provider exclusions, row ids or row-count
187
- evidence, and the reason no colder source was used before the current source
188
- was proven exhausted or insufficient.
186
+ state, import/copy caps, explicit `dedupeDncProviderExclusions:true` or an
187
+ equivalent exclusions object, row ids or row-count evidence (`rowCount`,
188
+ `readyRowCount`, or `rowEvidence`), and the reason no colder source was used
189
+ before the current source was proven exhausted or insufficient.
189
190
  - `filterDecisionReceipt`: saved/applied filter ids or explicit skip-filter
190
191
  decision with current campaign/table basis.
191
192
  - `messageDraftingReceipt`: the Message Drafting proof described below,
@@ -206,6 +207,92 @@ not a parent-thread summary. The receipt must include:
206
207
  planRevision, selectedActionIds, receipts })` call/result used before the
207
208
  parent reports completion.
208
209
 
210
+ Use these canonical receipt leaf names exactly. Do not substitute looser aliases
211
+ like `generateMessagesPromptLoad`, `requiredAssetLoads`,
212
+ `validationPromptLoad`, `reviewBatchBasisHash`, `reviewRowIds`,
213
+ `sequenceActionTypes`, or `pass:true` unless you also include the canonical
214
+ fields below:
215
+
216
+ ```json
217
+ {
218
+ "status": "succeeded",
219
+ "planRevision": "<original planRevision>",
220
+ "laneKey": "<lane key>",
221
+ "laneType": "<lane type>",
222
+ "workspaceId": "<workspace id>",
223
+ "senderIds": ["<sender id>"],
224
+ "campaignId": "<campaign id>",
225
+ "tableId": "<workflow table id>",
226
+ "createCampaignStepReceipt": {
227
+ "campaignBriefReceipt": {
228
+ "campaignId": "<campaign id>",
229
+ "workflowTableId": "<workflow table id>",
230
+ "briefHash": "<brief/currentApprovedBriefHash>",
231
+ "deliveryFormat": "single message",
232
+ "tokenRules": true,
233
+ "hardAvoids": true,
234
+ "sourceUseRules": true,
235
+ "firstMessageTemplate": "<template or template state>"
236
+ },
237
+ "sourceDecisionReceipt": {
238
+ "sourceId": "<source id>",
239
+ "sourceListId": "<source/list id>",
240
+ "cursorOrInventoryState": "<cursor/inventory/import state>",
241
+ "dedupeDncProviderExclusions": true,
242
+ "sourceLadderReason": "<why the current source is valid before colder sources>"
243
+ },
244
+ "filterDecisionReceipt": {
245
+ "status": "skipped",
246
+ "workflowTableId": "<workflow table id>"
247
+ },
248
+ "messageDraftingReceipt": {
249
+ "promptLoadedToHasMoreFalse": true,
250
+ "requiredAssetsLoaded": true,
251
+ "validationLoaded": true,
252
+ "campaignId": "<campaign id>",
253
+ "workflowTableId": "<workflow table id>",
254
+ "selectedLeadListId": "<source/list id>",
255
+ "reviewBatchRowHash": "<review row ids hash>",
256
+ "messageDraftRecommendation": {"basis": "generate-messages"},
257
+ "sampleMessages[].verdict": "pass",
258
+ "sampleMessages": [
259
+ {"rowId": "<row id>", "generatedMessageText": "<message>", "verdict": "pass"}
260
+ ]
261
+ },
262
+ "reviewBatchReceipt": {
263
+ "rowIdsHash": "<review row ids hash>",
264
+ "generatedCount": 3
265
+ },
266
+ "sequenceReceipt": {
267
+ "workflowTableId": "<workflow table id>",
268
+ "hasSequence": true,
269
+ "sequenceReceipt.actionTypes": ["send_invite"],
270
+ "sequenceReceipt.nonPaid": true,
271
+ "actionTypes": ["send_invite"],
272
+ "nonPaid": true
273
+ },
274
+ "finalPausedSendProof": {
275
+ "currentStep": "send",
276
+ "campaignStatus": "PAUSED"
277
+ },
278
+ "verifyCall": {
279
+ "mode": "verify",
280
+ "planRevision": "<original planRevision>",
281
+ "selectedActionIds": ["<all original selected action ids>"]
282
+ }
283
+ }
284
+ }
285
+ ```
286
+
287
+ Verification always uses the original execution planRevision and original
288
+ selectedActionIds from the plan packets that were dispatched before mutation.
289
+ The parent must preserve the original selectedActionIds exactly.
290
+ Do not replace them with a later reuse planRevision/actionIds after the
291
+ campaigns exist. After workers complete, attach or patch `verifyCall` on each
292
+ lane receipt with that original execution planRevision, original
293
+ selectedActionIds, same sender scopes, and the verify result. Only after verify
294
+ succeeds should the parent perform the idempotency rerun.
295
+
209
296
  If any required field is missing, report
210
297
  `blocked: missing_create_campaign_step_receipt` for that lane and do not call it
211
298
  complete.
@@ -286,12 +373,11 @@ create-campaign Message Drafting branch ran. If this receipt is missing, report
286
373
  The parent then calls
287
374
  `setup_evergreen_campaigns({ mode:"verify", postEngagerSenderIds,
288
375
  sharedSenderIds, planRevision, selectedActionIds, receipts })` using the same
289
- sender scopes as the plan call, and reports only verified completion. A verify
290
- call without the same sender scopes can recompute an empty or different plan and
291
- is invalid proof. After verify succeeds, rerun
376
+ sender scopes as the plan call and the original execution planRevision/actionIds,
377
+ and reports only verified completion. A verify call without the same sender scopes can recompute an empty or different plan and is invalid proof. A verify call that uses a later reuse planRevision instead of the original execution planRevision is also invalid proof. Only after verify succeeds, rerun
292
378
  `setup_evergreen_campaigns({ mode:"plan", postEngagerSenderIds,
293
379
  sharedSenderIds, yolo:true })` without explicit campaign/table bindings. That
294
- idempotency plan must return `intent:"reuse"` for every completed lane and no
380
+ idempotency rerun must return `intent:"reuse"` for every completed lane and no
295
381
  duplicate-lane blockers before you call the command finished. If verify blocks,
296
382
  report the blocker and repair only the missing postconditions from the same
297
383
  current plan.