@sellable/mcp 0.1.552 → 0.1.553

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.
@@ -83,6 +83,8 @@ Accepted invocation flags in the same user request:
83
83
  - `senderIds: <id>, <id>` or `senderNames: <name>, <name>`: explicit selector
84
84
  alternatives when the host preserves natural-language arguments better than
85
85
  shell-style flags.
86
+ - `actionTypes: send_invite, send_inmail_closed`: optional lane selector. Omit
87
+ `actionTypes` to preserve the target planner's lane inference.
86
88
  - `untilDate: YYYY-MM-DD`: explicit date selector alternative when the host
87
89
  preserves natural-language arguments better than shell-style flags.
88
90
  - `targetDate: YYYY-MM-DD`: exact-date selector alternative when the host
@@ -91,7 +93,7 @@ Accepted invocation flags in the same user request:
91
93
  When the host can call typed MCP tools, start with:
92
94
 
93
95
  ```text
94
- refill_sends({ yolo?: boolean, executionMode?: "manual" | "scheduled" | "yolo", requireWorkspace?: boolean, workspaceId?: string, senders?: string[], senderIds?: string[], senderNames?: string[], horizonSendDays?: number, untilDate?: "YYYY-MM-DD", targetDate?: "YYYY-MM-DD" })
96
+ refill_sends({ yolo?: boolean, executionMode?: "manual" | "scheduled" | "yolo", requireWorkspace?: boolean, workspaceId?: string, senders?: string[], senderIds?: string[], senderNames?: string[], actionTypes?: ("send_invite" | "send_inmail_closed")[], horizonSendDays?: number, untilDate?: "YYYY-MM-DD", targetDate?: "YYYY-MM-DD" })
95
97
  ```
96
98
 
97
99
  That command helper normalizes arguments and returns the execution contract. In
@@ -99,14 +101,22 @@ non-yolo mode it does not mutate. In `--yolo`, it may execute exactly one safe
99
101
  bounded primitive from the fresh `target.globalActionQueue[0]`, then reread and
100
102
  return the new target plan; currently safe primitives are paid-credit refresh,
101
103
  existing-row message preparation, generated-message approval, receipt-proven
102
- same-source row copy, and read-only wait rereads. Same-source copy/source
104
+ same-source row copy, a request-scoped exact-date product scheduler sweep, and
105
+ read-only wait rereads. Same-source copy/source
103
106
  fallback is safe only after receipt-proven exhaustion:
104
107
  `hasMoreFrontierRows:false`, zero `approvalCandidates`, no `stuckActiveCells`,
105
- and no non-terminal `approvedNotDispatched` work. It does not run unbounded approval, lower
106
- paid-InMail thresholds, switch source families, create campaigns, launch, send,
107
- or write scheduler rows. Continue with the workflow below for route selection,
108
- state rereads, approval gating, source import, preparation, and bounded
109
- approval.
108
+ and no non-terminal `approvedNotDispatched` work. It does not run unbounded
109
+ approval, lower paid-InMail thresholds, switch source families, create
110
+ campaigns, launch, or send directly; it never raw-writes scheduler fields.
111
+ Continue with the workflow below for route selection, state rereads, approval
112
+ gating, source import, preparation, and bounded approval.
113
+
114
+ The approval scope is the exact `workspaceId`, `targetDate`, sender ids, action
115
+ types, campaign/table/source ids, `targetShapeRevision`, and `actionKey` in the
116
+ rendered packet. `stateRevision` and sent/scheduled/ready counts are mutable
117
+ progress, not approval-scope drift. Execute only
118
+ `target.globalActionQueue[0]`, then perform a full authoritative reread before
119
+ deciding any next action.
110
120
 
111
121
  ## Workspace Contract
112
122
 
@@ -284,6 +294,19 @@ When the refill loop has ready rows and needs scheduler pickup now, use
284
294
  `run_scheduler_sweep` with the same explicit `workspaceId`; it can place cells
285
295
  within existing scheduler gates and returns the receipt, but it never sends or
286
296
  bypasses limits.
297
+ A scheduler sweep is a visible workspace-wide scheduling side effect. The
298
+ request packet limits the expected target changes to its exact date, senders,
299
+ action types, campaigns, tables, and stable sources, but the product scheduler
300
+ may also place unrelated eligible workspace work; disclose that possibility in
301
+ the approval packet and receipt. For an exact-date sweep action, execute it
302
+ once, then reread the full target plan before taking or presenting another
303
+ action.
304
+ The exact-date `run_scheduler_sweep` may schedule eligible workspace cells
305
+ through existing product gates; it never sends directly or raw-writes scheduler
306
+ fields. Only non-exact or no-sweep scheduler waits are read-only.
307
+ On resume, reconcile the current target plan and matching sweep status/receipt
308
+ before retrying. A matching same-key terminal receipt replays; an
309
+ `uncertain_outcome` stops for reconciliation and must not schedule again.
287
310
  Scheduler-run receipt interpretation: `cellsConsidered is allocation-attempt
288
311
  count`, not total ready supply, while `readyCellsFound` is ready inventory found
289
312
  before prefilters. Inspect `campaignScopeSummary` before assuming the selected
@@ -396,6 +419,14 @@ scheduler wait loop. Do not finish the refill goal, mark it complete, or mark it
396
419
  blocked only because it is still `awaiting_scheduler_after_ready_buffer`; keep
397
420
  waiting unless Christian stops the run or the host cannot continue.
398
421
 
422
+ Future scheduled coverage and already sent actions are distinct; only
423
+ scheduler-owned future scheduled actions count as scheduled coverage. For
424
+ multiple target dates, finish D1 execution and the full D1 reread before
425
+ planning D2. Completion proof is product-native Sellable MCP evidence only:
426
+ target plan, campaign refill state, scheduler capacity, sweep/status, and
427
+ bounded receipts. Never use individual cell ids, Prisma, SQL, direct database
428
+ access, or production-environment scripts as completion proof.
429
+
399
430
  In `--yolo`, the default fill target is the scheduler-forward 48-hour window
400
431
  unless `--target-date`/`targetDate`, `--until`/`untilDate`, or an explicit
401
432
  compatibility `horizonSendDays` is provided. If a target date is provided,
@@ -75,6 +75,20 @@ calls, preparation calls, approval calls, and campaign start calls. Missing
75
75
  interactive workspace switching is diagnostic setup only and is not an
76
76
  automation control path.
77
77
 
78
+ Typed command scope:
79
+
80
+ ```text
81
+ refill_sends({ yolo?: boolean, executionMode?: "manual" | "scheduled" | "yolo", requireWorkspace?: boolean, workspaceId?: string, senders?: string[], senderIds?: string[], senderNames?: string[], actionTypes?: ("send_invite" | "send_inmail_closed")[], horizonSendDays?: number, untilDate?: "YYYY-MM-DD", targetDate?: "YYYY-MM-DD" })
82
+ ```
83
+
84
+ Omit `actionTypes` to preserve the target planner's lane inference. The
85
+ approval scope is the exact `workspaceId`, `targetDate`, sender ids, action
86
+ types, campaign/table/source ids, `targetShapeRevision`, and `actionKey` in the
87
+ rendered packet. `stateRevision` and sent/scheduled/ready counts are mutable
88
+ progress, not approval-scope drift. Execute only
89
+ `target.globalActionQueue[0]`, then perform a full authoritative reread before
90
+ deciding any next action.
91
+
78
92
  Goal-mode continuation: a skill cannot create or invoke `/goal` by itself. When
79
93
  this workflow is already running inside an active Codex goal, keep that goal
80
94
  open until every selected sender lane is horizon-filled by projected coverage
@@ -192,6 +206,19 @@ files or memory.
192
206
  `run_scheduler_sweep` with the same explicit `workspaceId` to request the
193
207
  product scheduler placement pass now and read its receipt. This may place
194
208
  cells within existing gates, never sends messages, and never bypasses limits.
209
+ A scheduler sweep is a visible workspace-wide scheduling side effect. The
210
+ request packet limits expected target changes to the exact date, senders,
211
+ action types, campaigns, tables, and stable sources, but unrelated eligible
212
+ workspace work may also be scheduled by the product scheduler and must be
213
+ disclosed. For an exact-date sweep action, execute it once and perform the
214
+ full target-plan reread before taking or presenting another action.
215
+ The exact-date `run_scheduler_sweep` may schedule eligible workspace cells
216
+ through existing product gates; it never sends directly or raw-writes
217
+ scheduler fields. Only non-exact or no-sweep scheduler waits are read-only.
218
+ On resume, reconcile the current target plan and matching sweep
219
+ status/receipt before retrying. A matching same-key terminal receipt
220
+ replays; an `uncertain_outcome` stops for reconciliation and must not
221
+ schedule again.
195
222
  Scheduler-run receipt interpretation: `cellsConsidered is
196
223
  allocation-attempt count`, not total ready supply, while `readyCellsFound`
197
224
  is ready inventory found before prefilters. Inspect `campaignScopeSummary`
@@ -210,8 +237,10 @@ files or memory.
210
237
  scheduled count, projected count, campaign ids, and no-op proof without
211
238
  asking for approval or mutating.
212
239
  If `remainingReadyOrProjectedGap:0` but `remainingProjectedGap>0`, and paid
213
- InMail credit freshness is clean for every selected paid-InMail lane, run
214
- only a persistent read-only scheduler wait/reread loop; do not ask for
240
+ InMail credit freshness is clean for every selected paid-InMail lane,
241
+ execute an exact-date `run_scheduler_sweep` action once when it is
242
+ `target.globalActionQueue[0]`, then fully reread. Otherwise, run only a
243
+ persistent read-only scheduler wait/reread loop; do not ask for
215
244
  prep/import/approval. Poll `get_refill_target_plan` every 60-120 seconds, or
216
245
  on the host's next continuation interval, until projected coverage fills,
217
246
  a concrete non-scheduler blocker appears, or Christian explicitly asks to
@@ -384,10 +413,11 @@ exceeds the sender's capacity for the selected target window. Put another way:
384
413
  complete when the same daily-limit/readback model would show no remaining
385
414
  send-day capacity for that selected lane. Ready-to-schedule rows are only buffer
386
415
  for the product scheduler. If ready plus projected coverage covers the target
387
- window but scheduled cells do not yet, run a persistent read-only scheduler wait
388
- loop: wait, reread, recompute the ledger, and continue until projected coverage
389
- is proved, a concrete non-scheduler blocker appears, or Christian explicitly
390
- stops or asks for status only. `awaiting_scheduler_after_ready_buffer` is not
416
+ window but scheduled cells do not yet, execute the exact-date sweep when the
417
+ planner emits it; otherwise run a persistent read-only scheduler wait loop:
418
+ wait, reread, recompute the ledger, and continue until projected coverage is
419
+ proved, a concrete non-scheduler blocker appears, or Christian explicitly stops
420
+ or asks for status only. `awaiting_scheduler_after_ready_buffer` is not
391
421
  success and is not a terminal blocker for an active refill goal; it is the
392
422
  loaded, awaiting scheduler poll state that keeps the thread waiting. It does not
393
423
  need a prep/import/approval packet.
@@ -720,6 +750,14 @@ with non-null `scheduledFor`. Prepared, approved, and ready-to-schedule rows are
720
750
  intermediate states; report them as awaiting scheduler unless scheduled cells
721
751
  are present.
722
752
 
753
+ Future scheduled coverage and already sent actions are distinct; only
754
+ scheduler-owned future scheduled actions count as scheduled coverage. For
755
+ multiple target dates, finish D1 execution and the full D1 reread before
756
+ planning D2. Completion proof is product-native Sellable MCP evidence only:
757
+ target plan, campaign refill state, scheduler capacity, sweep/status, and
758
+ bounded receipts. Never use individual cell ids, Prisma, SQL, direct database
759
+ access, or production-environment scripts as completion proof.
760
+
723
761
  preparedMessages can remain 0 while scheduler-ready state changes downstream.
724
762
  After a prep job reaches a terminal state, run `wait_for_campaign_processing`
725
763
  when generated/pass counts are still settling, then poll `get_campaign_refill_state` until `readyToSchedule` drops, scheduled counts increase, or the state clearly
@@ -61,6 +61,44 @@
61
61
  "scheduled",
62
62
  "projected"
63
63
  ],
64
+ "scopeContract": {
65
+ "immutableApprovalEnvelope": [
66
+ "workspaceId",
67
+ "targetDate",
68
+ "senderIds",
69
+ "actionTypes",
70
+ "campaignIds",
71
+ "tableIds",
72
+ "sourceIds",
73
+ "targetShapeRevision",
74
+ "actionKey"
75
+ ],
76
+ "mutableProgress": [
77
+ "stateRevision",
78
+ "sent",
79
+ "scheduled",
80
+ "readyToSchedule",
81
+ "remainingProjectedGap"
82
+ ],
83
+ "executionRules": [
84
+ "Execute only target.globalActionQueue[0].",
85
+ "Execute one action, then perform a full authoritative reread before selecting any next action.",
86
+ "Mutable progress must not be treated as approval-scope drift while targetShapeRevision remains stable."
87
+ ]
88
+ },
89
+ "interruptionRecovery": {
90
+ "rules": [
91
+ "On resume, reread the canonical target plan and reconcile scheduler status or receipt with the matching requestKey and actionKey before retrying.",
92
+ "A matching terminal receipt must replay without a second scheduler execution.",
93
+ "An uncertain_outcome requires reconciliation; do not schedule again with the same or a replacement key until a canonical read resolves it."
94
+ ]
95
+ },
96
+ "multiDayOrdering": {
97
+ "rules": [
98
+ "For multiple target dates, finish D1 execution and the full D1 reread before planning D2.",
99
+ "Do not pre-plan or execute a later date from stale earlier-date state."
100
+ ]
101
+ },
64
102
  "states": [
65
103
  {
66
104
  "id": "target_plan_read",
@@ -188,7 +226,7 @@
188
226
  },
189
227
  {
190
228
  "id": "scheduler_wait_readback",
191
- "description": "Read-only scheduler polling after rows are ready and paid-credit facts are fresh.",
229
+ "description": "Exact-date scheduler sweep or read-only polling after rows are ready and paid-credit facts are fresh.",
192
230
  "allowedTools": [
193
231
  "get_refill_target_plan",
194
232
  "get_scheduler_fill_capacity",
@@ -203,6 +241,9 @@
203
241
  "rules": [
204
242
  "Poll every 60-120 seconds or on the host continuation interval.",
205
243
  "Use run_scheduler_sweep with the explicit workspaceId when ready rows need scheduler pickup now; it places cells only inside existing gates and never sends.",
244
+ "A scheduler sweep is a visible workspace-wide scheduling side effect; the packet limits expected target changes but must disclose that unrelated eligible workspace work may also be scheduled.",
245
+ "For an explicit targetDate, execute only the request-scoped run_scheduler_sweep from target.globalActionQueue[0], then perform a full authoritative target-plan reread before any next action.",
246
+ "Reuse the matching requestKey and actionKey only for status or receipt reconciliation; replay a matching terminal receipt and stop on uncertain_outcome rather than scheduling again.",
206
247
  "cellsConsidered is allocation-attempt count; inspect campaignScopeSummary before assuming the selected refill campaign/table was included or ready-but-blocked.",
207
248
  "Read prefiltered, skipped, and deferred separately: prefiltered ready closed-InMail cells with stale paid-credit facts require refresh_paid_inmail_credits_then_rerun once, then rerun/status.",
208
249
  "wait_for_capacity_or_window means report loaded/capped/waiting and do not source or prep more rows; no_ready_cells_continue_refill_prep means return to the refill/prep ladder.",
@@ -211,6 +252,11 @@
211
252
  "Do not mark complete or blocked only because awaiting_scheduler_after_ready_buffer persists."
212
253
  ],
213
254
  "transitions": [
255
+ {
256
+ "when": "explicit targetDate and target.globalActionQueue[0] is request-scoped run_scheduler_sweep",
257
+ "action": "execute exactly one request-scoped run_scheduler_sweep, capture its complete receipt, and do not execute a returned next action",
258
+ "to": "target_plan_read"
259
+ },
214
260
  {
215
261
  "when": "projected coverage fills target",
216
262
  "to": "completion_or_blocker"
@@ -243,6 +289,7 @@
243
289
  "start_campaign_message_preparation",
244
290
  "same_source_copy",
245
291
  "bounded_generated_message_approval",
292
+ "run_scheduler_sweep",
246
293
  "wait_for_scheduler"
247
294
  ],
248
295
  "neverAutoExecute": [
@@ -271,11 +318,26 @@
271
318
  "verification": {
272
319
  "requiredProof": [
273
320
  "final get_refill_target_plan",
321
+ "get_campaign_refill_state for selected campaign/table facts",
322
+ "get_scheduler_fill_capacity for the exact sender/action/date",
323
+ "run_scheduler_sweep status or receipt for any executed sweep",
274
324
  "projected coverage sent + scheduled",
275
325
  "scheduler-owned cells with non-null scheduledFor when claiming scheduled",
276
326
  "paid-InMail freshness status clean before scheduler wait",
277
327
  "refresh receipt for each refreshed sender"
278
328
  ],
329
+ "forbiddenProof": [
330
+ "individual cell ids",
331
+ "Prisma",
332
+ "SQL",
333
+ "direct database access",
334
+ "production-environment scripts"
335
+ ],
336
+ "completionRules": [
337
+ "Report already sent actions separately from future scheduled actions.",
338
+ "Only scheduler-owned future scheduled actions count as scheduled coverage.",
339
+ "Prepared, approved, and ready rows remain intermediate evidence."
340
+ ],
279
341
  "notCompletionProof": [
280
342
  "prepared rows alone",
281
343
  "approved rows alone",