@sellable/mcp 0.1.510 → 0.1.512

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.
@@ -0,0 +1,281 @@
1
+ {
2
+ "version": "v1.0",
3
+ "workflow": "refill-sends-workflow",
4
+ "principle": "Use the target planner and scheduler readback as canonical facts. Refresh stale paid-InMail credit facts before scheduler-wait decisions; do not change scheduler allocation logic.",
5
+ "requiredBootstrap": [
6
+ {
7
+ "tool": "get_subskill_prompt",
8
+ "requiredValues": {
9
+ "subskillName": "refill-sends-workflow"
10
+ },
11
+ "mustReadUntil": {
12
+ "hasMore": false
13
+ }
14
+ },
15
+ {
16
+ "tool": "get_subskill_asset",
17
+ "requiredValues": {
18
+ "subskillName": "refill-sends-workflow",
19
+ "assetPath": "core/flow.v1.json"
20
+ },
21
+ "mustReadUntil": {
22
+ "hasMore": false
23
+ },
24
+ "validation": {
25
+ "workflow": "refill-sends-workflow",
26
+ "versionPrefix": "v1",
27
+ "requiredTopLevelKeys": [
28
+ "states",
29
+ "gateOrder",
30
+ "yoloMode"
31
+ ]
32
+ }
33
+ }
34
+ ],
35
+ "gateOrder": [
36
+ "target_plan_read",
37
+ "paid_inmail_credit_freshness_gate",
38
+ "target_action_selection",
39
+ "bounded_table_action",
40
+ "scheduler_wait_readback",
41
+ "completion_or_blocker"
42
+ ],
43
+ "sharedFacts": [
44
+ "workspaceId",
45
+ "senderId",
46
+ "campaignId",
47
+ "tableId",
48
+ "columnId",
49
+ "actionType",
50
+ "targetDate",
51
+ "untilDate",
52
+ "targetShapeRevision",
53
+ "stateRevision",
54
+ "paidInmail.status",
55
+ "paidInmail.available",
56
+ "paidInmail.threshold",
57
+ "paidInmail.maxStalenessSeconds",
58
+ "remainingProjectedGap",
59
+ "remainingReadyOrProjectedGap",
60
+ "readyToSchedule",
61
+ "scheduled",
62
+ "projected"
63
+ ],
64
+ "states": [
65
+ {
66
+ "id": "target_plan_read",
67
+ "description": "Read the canonical target plan before any mutation or wait loop.",
68
+ "allowedTools": [
69
+ "get_refill_target_plan"
70
+ ],
71
+ "requiredOutput": [
72
+ "target.eligibleSenderLedger",
73
+ "target.senderRefillPlans",
74
+ "target.globalActionQueue",
75
+ "targetShapeRevision",
76
+ "stateRevision"
77
+ ],
78
+ "transitions": [
79
+ {
80
+ "when": "status == complete",
81
+ "to": "completion_or_blocker"
82
+ },
83
+ {
84
+ "when": "any selected senderRefillPlans[].paidInmail.status is missing_credit_facts or stale_credit_facts",
85
+ "to": "paid_inmail_credit_freshness_gate"
86
+ },
87
+ {
88
+ "when": "globalActionQueue or actionCandidates contains refresh_paid_inmail_credits",
89
+ "to": "paid_inmail_credit_freshness_gate"
90
+ },
91
+ {
92
+ "otherwise": "target_action_selection"
93
+ }
94
+ ]
95
+ },
96
+ {
97
+ "id": "paid_inmail_credit_freshness_gate",
98
+ "description": "Make paid-InMail credit freshness deterministic before trusting scheduler wait decisions.",
99
+ "allowedTools": [
100
+ "refresh_paid_inmail_credits",
101
+ "get_refill_target_plan"
102
+ ],
103
+ "rules": [
104
+ "This gate precedes scheduler_wait_readback, even when remainingReadyOrProjectedGap is 0.",
105
+ "Refresh only exact sender ids present in the rendered target packet.",
106
+ "Refresh each selected sender at most once per refill_sends command call.",
107
+ "The refresh receipt must include approvalSource, workspaceId, senderId, actionKey, campaignId, tableId, columnId, threshold, maxStalenessSeconds, and targetPlanFingerprint.",
108
+ "After refresh, rerun get_refill_target_plan with the same workspaceId and selectors before choosing a prep, approval, source-copy, or scheduler-wait action.",
109
+ "If facts remain missing or stale after the single refresh attempt, stop with paid_inmail_credit_freshness_blocked rather than entering scheduler wait.",
110
+ "If fresh facts are below threshold, report the exact threshold blocker or same-campaign connection fallback; do not lower thresholds in yolo mode."
111
+ ],
112
+ "disallowedBeforeReread": [
113
+ "wait_for_scheduler",
114
+ "start_campaign_message_preparation",
115
+ "confirm_lead_list",
116
+ "select_campaign_cells",
117
+ "queue_campaign_cells",
118
+ "start_campaign"
119
+ ],
120
+ "transitions": [
121
+ {
122
+ "when": "post_refresh_target_plan has no missing/stale paid-InMail facts for selected lanes",
123
+ "to": "target_action_selection"
124
+ },
125
+ {
126
+ "when": "post_refresh_target_plan still has missing/stale paid-InMail facts",
127
+ "to": "completion_or_blocker"
128
+ }
129
+ ]
130
+ },
131
+ {
132
+ "id": "target_action_selection",
133
+ "description": "Choose only the globally ranked planner primitive after freshness gates pass.",
134
+ "allowedTools": [
135
+ "get_refill_target_plan",
136
+ "get_campaign_refill_state",
137
+ "get_scheduler_fill_capacity"
138
+ ],
139
+ "rules": [
140
+ "Use target.globalActionQueue[0] as the only cross-sender yolo action.",
141
+ "manualAlternates are not yolo actions.",
142
+ "If projected coverage is complete, no-op.",
143
+ "If remainingReadyOrProjectedGap is 0 and remainingProjectedGap is positive, scheduler wait is allowed only after paid_inmail_credit_freshness_gate is clean.",
144
+ "If ready buffer is short, choose bounded existing-row prep, bounded approval, same-source copy, or provider-aligned source-more according to the planner."
145
+ ],
146
+ "transitions": [
147
+ {
148
+ "when": "next action is wait_for_scheduler and paid freshness gate is clean",
149
+ "to": "scheduler_wait_readback"
150
+ },
151
+ {
152
+ "when": "next action is a bounded table/source/prep/approval primitive",
153
+ "to": "bounded_table_action"
154
+ },
155
+ {
156
+ "when": "no safe action remains or non-scheduler blocker exists",
157
+ "to": "completion_or_blocker"
158
+ }
159
+ ]
160
+ },
161
+ {
162
+ "id": "bounded_table_action",
163
+ "description": "Run one safe primitive, then reread the target plan.",
164
+ "allowedTools": [
165
+ "start_campaign_message_preparation",
166
+ "get_campaign_message_preparation_status",
167
+ "import_leads",
168
+ "wait_for_lead_list_ready",
169
+ "confirm_lead_list",
170
+ "select_campaign_cells",
171
+ "queue_campaign_cells",
172
+ "wait_for_campaign_processing",
173
+ "get_refill_target_plan"
174
+ ],
175
+ "rules": [
176
+ "One primitive per loop.",
177
+ "No broad approval.",
178
+ "No scheduler writes.",
179
+ "Reread get_refill_target_plan before any second primitive.",
180
+ "Continue while targetShapeRevision is stable and projected coverage progresses."
181
+ ],
182
+ "transitions": [
183
+ {
184
+ "after": "terminal primitive result and target reread",
185
+ "to": "target_plan_read"
186
+ }
187
+ ]
188
+ },
189
+ {
190
+ "id": "scheduler_wait_readback",
191
+ "description": "Read-only scheduler polling after rows are ready and paid-credit facts are fresh.",
192
+ "allowedTools": [
193
+ "get_refill_target_plan",
194
+ "get_scheduler_fill_capacity"
195
+ ],
196
+ "entryConditions": [
197
+ "remainingReadyOrProjectedGap == 0",
198
+ "remainingProjectedGap > 0",
199
+ "no selected paid-InMail lane has missing_credit_facts or stale_credit_facts",
200
+ "no refresh_paid_inmail_credits action remains in target.globalActionQueue or actionCandidates"
201
+ ],
202
+ "rules": [
203
+ "Poll every 60-120 seconds or on the host continuation interval.",
204
+ "Stop waiting when projected coverage fills the target.",
205
+ "Leave wait if a concrete non-scheduler blocker appears.",
206
+ "Do not mark complete or blocked only because awaiting_scheduler_after_ready_buffer persists."
207
+ ],
208
+ "transitions": [
209
+ {
210
+ "when": "projected coverage fills target",
211
+ "to": "completion_or_blocker"
212
+ },
213
+ {
214
+ "when": "paid facts become missing/stale again",
215
+ "to": "paid_inmail_credit_freshness_gate"
216
+ },
217
+ {
218
+ "when": "ready buffer no longer covers gap",
219
+ "to": "target_action_selection"
220
+ }
221
+ ]
222
+ },
223
+ {
224
+ "id": "completion_or_blocker",
225
+ "description": "Report exact no-op, completion proof, or blocker with ids and revisions.",
226
+ "allowedTools": [
227
+ "get_refill_target_plan",
228
+ "get_campaign_refill_state",
229
+ "get_scheduler_fill_capacity"
230
+ ],
231
+ "terminal": true
232
+ }
233
+ ],
234
+ "yoloMode": {
235
+ "approvalSource": "explicit_yolo_flag",
236
+ "autoExecutableActions": [
237
+ "refresh_paid_inmail_credits",
238
+ "start_campaign_message_preparation",
239
+ "same_source_copy",
240
+ "bounded_generated_message_approval",
241
+ "wait_for_scheduler"
242
+ ],
243
+ "neverAutoExecute": [
244
+ "lower_paid_inmail_threshold",
245
+ "create_campaign",
246
+ "create_connection_campaign",
247
+ "switch_source_family",
248
+ "direct_scheduler_write",
249
+ "start_unselected_campaign",
250
+ "archive_or_delete"
251
+ ],
252
+ "driftStops": [
253
+ "workspaceId",
254
+ "sender set",
255
+ "campaignId",
256
+ "tableId",
257
+ "columnId",
258
+ "actionType",
259
+ "targetDate",
260
+ "untilDate",
261
+ "targetShapeRevision",
262
+ "paid-InMail threshold feasibility",
263
+ "side-effect class"
264
+ ]
265
+ },
266
+ "verification": {
267
+ "requiredProof": [
268
+ "final get_refill_target_plan",
269
+ "projected coverage sent + scheduled",
270
+ "scheduler-owned cells with non-null scheduledFor when claiming scheduled",
271
+ "paid-InMail freshness status clean before scheduler wait",
272
+ "refresh receipt for each refreshed sender"
273
+ ],
274
+ "notCompletionProof": [
275
+ "prepared rows alone",
276
+ "approved rows alone",
277
+ "ready-to-schedule rows alone",
278
+ "awaiting_scheduler_after_ready_buffer"
279
+ ]
280
+ }
281
+ }