@sellable/mcp 0.1.768 → 0.1.769
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/dist/agent-tool-names.d.ts +1 -1
- package/dist/agent-tool-names.js +0 -2
- package/dist/refill-run-loop.js +4 -4
- package/dist/server.js +2 -12
- package/dist/tools/prompts.d.ts +3 -19
- package/dist/tools/prompts.js +1 -23
- package/dist/tools/refill-exact-run.d.ts +123 -0
- package/dist/tools/{refill-sends-v2.js → refill-exact-run.js} +6 -66
- package/dist/tools/{evergreen-refill-plan.d.ts → refill-execution-plan.d.ts} +4 -56
- package/dist/tools/{evergreen-refill-plan.js → refill-execution-plan.js} +14 -66
- package/dist/tools/refill-sends.d.ts +1 -1
- package/dist/tools/refill-sends.js +12 -21
- package/dist/tools/refill-target-plan.js +1 -1
- package/dist/tools/registry.d.ts +3 -465
- package/dist/tools/registry.js +0 -6
- package/package.json +1 -1
- package/skills/refill-sends/SKILL.md +1 -1
- package/skills/refill-sends-workflow/SKILL.md +3 -3
- package/skills/refill-sends-workflow/core/flow.v1.json +1 -1
- package/dist/tools/refill-sends-v2.d.ts +0 -537
- package/skills/refill-sends-evergreen/SKILL.md +0 -24
- package/skills/refill-sends-evergreen-workflow/SKILL.md +0 -25
- package/skills/refill-sends-evergreen-workflow/core/flow.v1.json +0 -259
- package/skills/refill-sends-v2/SKILL.md +0 -207
- package/skills/refill-sends-v2-workflow/SKILL.md +0 -171
- package/skills/refill-sends-v2-workflow/core/flow.v1.json +0 -397
|
@@ -1,259 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": "v1.0",
|
|
3
|
-
"workflow": "refill-sends-evergreen-workflow",
|
|
4
|
-
"principle": "Plan evergreen waterfall refill as a read-only dry-run with zero mutations.",
|
|
5
|
-
"revisionProjectionContract": {
|
|
6
|
-
"canonicalWorkflow": "refill-sends-v2-workflow",
|
|
7
|
-
"action": "revise_message_template_and_rerun",
|
|
8
|
-
"requiredAuthorities": [
|
|
9
|
-
"targetConfig",
|
|
10
|
-
"runHandle",
|
|
11
|
-
"reportingContext",
|
|
12
|
-
"complete messageTemplateRevision with source:user_approved, approved markdown, authority digests, bounded cohort, and request/effect/revision-operation IDs"
|
|
13
|
-
],
|
|
14
|
-
"noInference": "The deprecated alias preserves explicit authority losslessly and never infers it from forceRerun.",
|
|
15
|
-
"reporting": "Preserve refill_reporting.v2 and campaign_preparation_live.v2 fields exactly while redacting raw copy/prospect fields."
|
|
16
|
-
},
|
|
17
|
-
"enumeratedRungs": [
|
|
18
|
-
"start_campaign",
|
|
19
|
-
"approve_messages",
|
|
20
|
-
"wait_for_active_work",
|
|
21
|
-
"enrich_more",
|
|
22
|
-
"reconcile_source_copy",
|
|
23
|
-
"add_leads_same_source",
|
|
24
|
-
"paid_lane_fallback",
|
|
25
|
-
"next_campaign",
|
|
26
|
-
"wait_for_scheduler",
|
|
27
|
-
"done"
|
|
28
|
-
],
|
|
29
|
-
"requiredBootstrap": [
|
|
30
|
-
{
|
|
31
|
-
"tool": "get_auth_status",
|
|
32
|
-
"purpose": "Confirm MCP auth before reading workspace or plan facts."
|
|
33
|
-
},
|
|
34
|
-
{
|
|
35
|
-
"tool": "get_active_workspace",
|
|
36
|
-
"purpose": "Resolve explicit workspace evidence when the request did not provide workspaceId."
|
|
37
|
-
},
|
|
38
|
-
{
|
|
39
|
-
"tool": "refill_sends_evergreen",
|
|
40
|
-
"requiredValues": {
|
|
41
|
-
"workspaceId": "{workspaceId}"
|
|
42
|
-
},
|
|
43
|
-
"requiredOutput": [
|
|
44
|
-
"readOnly true",
|
|
45
|
-
"approvalContract says Phase 85 is plan-only"
|
|
46
|
-
]
|
|
47
|
-
},
|
|
48
|
-
{
|
|
49
|
-
"tool": "get_subskill_prompt",
|
|
50
|
-
"requiredValues": {
|
|
51
|
-
"subskillName": "refill-sends-evergreen-workflow"
|
|
52
|
-
},
|
|
53
|
-
"mustReadUntil": {
|
|
54
|
-
"hasMore": false
|
|
55
|
-
}
|
|
56
|
-
},
|
|
57
|
-
{
|
|
58
|
-
"tool": "get_subskill_asset",
|
|
59
|
-
"requiredValues": {
|
|
60
|
-
"subskillName": "refill-sends-evergreen-workflow",
|
|
61
|
-
"assetPath": "core/flow.v1.json"
|
|
62
|
-
},
|
|
63
|
-
"mustReadUntil": {
|
|
64
|
-
"hasMore": false
|
|
65
|
-
},
|
|
66
|
-
"validation": {
|
|
67
|
-
"workflow": "refill-sends-evergreen-workflow",
|
|
68
|
-
"versionPrefix": "v1",
|
|
69
|
-
"requiredTopLevelKeys": [
|
|
70
|
-
"states",
|
|
71
|
-
"gateOrder",
|
|
72
|
-
"enumeratedRungs",
|
|
73
|
-
"verification"
|
|
74
|
-
]
|
|
75
|
-
}
|
|
76
|
-
},
|
|
77
|
-
{
|
|
78
|
-
"tool": "get_evergreen_refill_plan",
|
|
79
|
-
"requiredValues": {
|
|
80
|
-
"workspaceId": "{workspaceId}"
|
|
81
|
-
},
|
|
82
|
-
"requiredOutput": [
|
|
83
|
-
"planRevision",
|
|
84
|
-
"stateRevision",
|
|
85
|
-
"packet",
|
|
86
|
-
"journalPath",
|
|
87
|
-
"sideEffects"
|
|
88
|
-
]
|
|
89
|
-
}
|
|
90
|
-
],
|
|
91
|
-
"gateOrder": ["bootstrap", "plan", "report"],
|
|
92
|
-
"states": [
|
|
93
|
-
{
|
|
94
|
-
"id": "bootstrap",
|
|
95
|
-
"description": "Load the read-only command contract, workflow prompt, flow asset, and workspace facts.",
|
|
96
|
-
"allowedTools": [
|
|
97
|
-
"get_auth_status",
|
|
98
|
-
"get_active_workspace",
|
|
99
|
-
"list_workspaces",
|
|
100
|
-
"get_workspace",
|
|
101
|
-
"refill_sends_evergreen",
|
|
102
|
-
"get_subskill_prompt",
|
|
103
|
-
"get_subskill_asset",
|
|
104
|
-
"get_evergreen_refill_plan"
|
|
105
|
-
],
|
|
106
|
-
"onEnter": [
|
|
107
|
-
{
|
|
108
|
-
"tool": "get_auth_status"
|
|
109
|
-
},
|
|
110
|
-
{
|
|
111
|
-
"tool": "refill_sends_evergreen",
|
|
112
|
-
"requiredFields": ["workspaceId"]
|
|
113
|
-
},
|
|
114
|
-
{
|
|
115
|
-
"tool": "get_subskill_prompt",
|
|
116
|
-
"requiredValues": {
|
|
117
|
-
"subskillName": "refill-sends-evergreen-workflow"
|
|
118
|
-
}
|
|
119
|
-
},
|
|
120
|
-
{
|
|
121
|
-
"tool": "get_subskill_asset",
|
|
122
|
-
"requiredValues": {
|
|
123
|
-
"subskillName": "refill-sends-evergreen-workflow",
|
|
124
|
-
"assetPath": "core/flow.v1.json"
|
|
125
|
-
}
|
|
126
|
-
}
|
|
127
|
-
],
|
|
128
|
-
"transitions": {
|
|
129
|
-
"contract_loaded": "plan"
|
|
130
|
-
}
|
|
131
|
-
},
|
|
132
|
-
{
|
|
133
|
-
"id": "plan",
|
|
134
|
-
"description": "Call the dry-run evergreen refill planner exactly once for this invocation.",
|
|
135
|
-
"allowedTools": ["get_evergreen_refill_plan"],
|
|
136
|
-
"onEnter": [
|
|
137
|
-
{
|
|
138
|
-
"tool": "get_evergreen_refill_plan",
|
|
139
|
-
"requiredFields": ["workspaceId"],
|
|
140
|
-
"optionalFields": ["senderIds", "runState", "journal", "journalNote"]
|
|
141
|
-
}
|
|
142
|
-
],
|
|
143
|
-
"requiredOutput": [
|
|
144
|
-
"sideEffects all false",
|
|
145
|
-
"planRevision starts with pr1:",
|
|
146
|
-
"journalPath reported",
|
|
147
|
-
"chosen evergreenRung is in enumeratedRungs"
|
|
148
|
-
],
|
|
149
|
-
"allowedRungsSource": "enumeratedRungs",
|
|
150
|
-
"doNotAllow": [
|
|
151
|
-
"add_column",
|
|
152
|
-
"add_on_demand_leads",
|
|
153
|
-
"add_rubric_item",
|
|
154
|
-
"add_teammate",
|
|
155
|
-
"add_to_comment_campaign",
|
|
156
|
-
"add_to_connection_campaign",
|
|
157
|
-
"add_to_inmail_campaign",
|
|
158
|
-
"archive_campaign",
|
|
159
|
-
"attach_recommended_sequence",
|
|
160
|
-
"attach_sequence",
|
|
161
|
-
"bulk_enrich_with_prospeo",
|
|
162
|
-
"cancel_campaign_message_preparation",
|
|
163
|
-
"cancel_lead_import",
|
|
164
|
-
"capture_post_idea",
|
|
165
|
-
"check_rubric",
|
|
166
|
-
"commit_blueprint",
|
|
167
|
-
"confirm_harvest_job_companies",
|
|
168
|
-
"confirm_lead_list",
|
|
169
|
-
"confirm_prospeo_company_accounts",
|
|
170
|
-
"copy_sender_config",
|
|
171
|
-
"create_campaign",
|
|
172
|
-
"create_on_demand_campaign",
|
|
173
|
-
"create_on_demand_table",
|
|
174
|
-
"create_workspace",
|
|
175
|
-
"create_workflow_table",
|
|
176
|
-
"delete_column",
|
|
177
|
-
"delete_rubric_item",
|
|
178
|
-
"duplicate_campaign",
|
|
179
|
-
"enrich_with_prospeo",
|
|
180
|
-
"fill_campaign_horizon",
|
|
181
|
-
"get_or_create_direct_campaign_table",
|
|
182
|
-
"import_leads",
|
|
183
|
-
"load_csv_dnc_entries",
|
|
184
|
-
"load_csv_domains",
|
|
185
|
-
"load_csv_linkedin_leads",
|
|
186
|
-
"mark_post_published",
|
|
187
|
-
"migrate_flat_configs",
|
|
188
|
-
"pause_campaign",
|
|
189
|
-
"pause_direct_campaign",
|
|
190
|
-
"pause_on_demand_campaign",
|
|
191
|
-
"prepare_campaign_ab_test",
|
|
192
|
-
"queue_campaign_cells",
|
|
193
|
-
"queue_cells",
|
|
194
|
-
"record_campaign_review_batch",
|
|
195
|
-
"record_engage_proven_search",
|
|
196
|
-
"refill_sends",
|
|
197
|
-
"refresh_paid_inmail_credits",
|
|
198
|
-
"revise_message_template_and_rerun",
|
|
199
|
-
"save_domain_filters",
|
|
200
|
-
"save_hook_research",
|
|
201
|
-
"save_post_draft",
|
|
202
|
-
"save_rubrics",
|
|
203
|
-
"send_inbox_draft",
|
|
204
|
-
"send_inbox_manual_reply",
|
|
205
|
-
"set_active_workspace",
|
|
206
|
-
"set_campaign_waterfall_order",
|
|
207
|
-
"set_company_info",
|
|
208
|
-
"set_engage_state",
|
|
209
|
-
"set_engage_style_guide",
|
|
210
|
-
"set_headline_icp_criteria",
|
|
211
|
-
"set_sender_routing",
|
|
212
|
-
"setup_evergreen_campaigns",
|
|
213
|
-
"start_campaign",
|
|
214
|
-
"start_campaign_message_preparation",
|
|
215
|
-
"start_direct_campaign",
|
|
216
|
-
"start_on_demand_campaign",
|
|
217
|
-
"update_campaign",
|
|
218
|
-
"update_campaign_brief",
|
|
219
|
-
"update_cell",
|
|
220
|
-
"update_column",
|
|
221
|
-
"update_inbox_draft",
|
|
222
|
-
"update_post_draft",
|
|
223
|
-
"update_published_post_metrics",
|
|
224
|
-
"update_rubric_item",
|
|
225
|
-
"upsert_engage_tracked_person",
|
|
226
|
-
"upsert_rubric"
|
|
227
|
-
],
|
|
228
|
-
"transitions": {
|
|
229
|
-
"packet_returned": "report"
|
|
230
|
-
}
|
|
231
|
-
},
|
|
232
|
-
{
|
|
233
|
-
"id": "report",
|
|
234
|
-
"description": "Present packet, itinerary, warnings, blockers, plan revision, and journal path; then stop.",
|
|
235
|
-
"allowedTools": [],
|
|
236
|
-
"onEnter": [
|
|
237
|
-
{
|
|
238
|
-
"action": "present_packet_itinerary_and_journal_path"
|
|
239
|
-
}
|
|
240
|
-
],
|
|
241
|
-
"terminal": true
|
|
242
|
-
}
|
|
243
|
-
],
|
|
244
|
-
"verification": {
|
|
245
|
-
"requiredProof": [
|
|
246
|
-
"sideEffects all false in get_evergreen_refill_plan response",
|
|
247
|
-
"planRevision has pr1: prefix",
|
|
248
|
-
"journalPath reported or journalWriteFailed warning surfaced",
|
|
249
|
-
"chosen evergreenRung belongs to enumeratedRungs",
|
|
250
|
-
"packet reviewed with itinerary and blockers"
|
|
251
|
-
],
|
|
252
|
-
"notCompletionProof": [
|
|
253
|
-
"called get_evergreen_refill_plan alone",
|
|
254
|
-
"action queue exists",
|
|
255
|
-
"ready rows alone",
|
|
256
|
-
"operator wants execution"
|
|
257
|
-
]
|
|
258
|
-
}
|
|
259
|
-
}
|
|
@@ -1,207 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: refill-sends-v2
|
|
3
|
-
description: Execute refill sends v2 through the fenced evergreen refill loop, with dry-run and resume support.
|
|
4
|
-
visibility: public
|
|
5
|
-
allowed-tools:
|
|
6
|
-
- mcp__sellable__refill_sends_v2
|
|
7
|
-
- mcp__sellable__get_refill_plan_v2
|
|
8
|
-
- mcp__sellable__get_subskill_prompt
|
|
9
|
-
- mcp__sellable__get_subskill_asset
|
|
10
|
-
- mcp__sellable__get_auth_status
|
|
11
|
-
- mcp__sellable__get_active_workspace
|
|
12
|
-
- mcp__sellable__list_workspaces
|
|
13
|
-
- mcp__sellable__get_workspace
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# Refill Sends V2
|
|
17
|
-
|
|
18
|
-
Use this command for refill requests such as "refill sends", "fill evergreen
|
|
19
|
-
senders", "load everyone up", "run Damiano", or "show a dry run for this
|
|
20
|
-
workspace".
|
|
21
|
-
|
|
22
|
-
Host command names:
|
|
23
|
-
|
|
24
|
-
- Claude Code: `/sellable:refill-sends-v2`
|
|
25
|
-
- Codex: `$sellable:refill-sends-v2`
|
|
26
|
-
|
|
27
|
-
`refill_sends_v2` is the execution surface. In real-run mode it starts or
|
|
28
|
-
resumes a fenced refill run, reads a fresh packet, executes only the packet's
|
|
29
|
-
named bounded work, verifies the result, and returns either a terminal report, a
|
|
30
|
-
blocked report, or an in-progress resume handle. In dry-run mode it stays
|
|
31
|
-
read-only and writes only a dry-run journal.
|
|
32
|
-
|
|
33
|
-
## Entry
|
|
34
|
-
|
|
35
|
-
Resolve the explicit `workspaceId` from the request, automation config, or
|
|
36
|
-
active workspace readback. Scheduled or autonomous usage must carry
|
|
37
|
-
`workspaceId` on every tool call. If the workspace is missing or ambiguous, stop
|
|
38
|
-
with `WORKSPACE_REQUIRED`; do not switch the shared active workspace.
|
|
39
|
-
|
|
40
|
-
For a real refill run:
|
|
41
|
-
|
|
42
|
-
```text
|
|
43
|
-
refill_sends_v2({ workspaceId, intent:"auto", senderIds?, approvalMode? })
|
|
44
|
-
```
|
|
45
|
-
|
|
46
|
-
For read-only inspection:
|
|
47
|
-
|
|
48
|
-
```text
|
|
49
|
-
refill_sends_v2({ workspaceId, dryRun:true, intent:"auto", senderIds? })
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
To resume an in-progress run, pass the handle back exactly:
|
|
53
|
-
|
|
54
|
-
```text
|
|
55
|
-
refill_sends_v2({ workspaceId, runHandle:{runId,fence}, targetConfig, reportingContext, messageTemplateRevision? })
|
|
56
|
-
```
|
|
57
|
-
|
|
58
|
-
`targetConfig` and the server-issued `runHandle` are separate authorities. Keep
|
|
59
|
-
both byte-for-byte through every continuation and takeover; never fold the
|
|
60
|
-
rotating fence into target configuration.
|
|
61
|
-
|
|
62
|
-
An approved copy change is reachable only through an explicit
|
|
63
|
-
`messageTemplateRevision` object with `version:1`, `source:"user_approved"`,
|
|
64
|
-
the approved `templateMarkdown`, `messageTemplateRevision` identity,
|
|
65
|
-
`priorTemplateAuthorityDigest`, `nextTemplateAuthorityDigest`, 1–500 exact
|
|
66
|
-
`cohortRowIds`, and `requestId`, `effectId`, and `revisionOperationId`. Pass it
|
|
67
|
-
with the exact `targetConfig` and `reportingContext`; the command obtains or
|
|
68
|
-
resumes the server run handle and lets the planner name
|
|
69
|
-
`revise_message_template_and_rerun`. Missing or partial input means no revision.
|
|
70
|
-
`forceRerun:true` on a queue operation never authorizes or implies a template
|
|
71
|
-
change.
|
|
72
|
-
|
|
73
|
-
After a committed and dispatched revision receipt, continue only with the
|
|
74
|
-
planner-provided revision-derived `approve_messages` action. It must preserve
|
|
75
|
-
the exact revision cohort as `rowSelector:{type:"rowIds",rowIds:[...]}` plus
|
|
76
|
-
`approvalMode:"approve"`, the compiled readiness identity, and the canonical
|
|
77
|
-
`reportingContext`, even when the ordinary sender lane is ineligible. Do not
|
|
78
|
-
replace it with `queue_campaign_cells` on Approved cells; that path cannot mint
|
|
79
|
-
the authoritative approval/lane-scope receipt. Require `laneScope` in the
|
|
80
|
-
bounded preparation receipt before the lane is considered approved. A
|
|
81
|
-
disconnected or zero-capacity sender still blocks scheduling and does not
|
|
82
|
-
authorize reconnecting, campaign start, or direct send.
|
|
83
|
-
|
|
84
|
-
If a stale handle loses the lease, the tool reports the holder status and the
|
|
85
|
-
approximately 10 minute lockout window. Reinvoke with the current handle or wait
|
|
86
|
-
for lease expiry; never guess a fence.
|
|
87
|
-
|
|
88
|
-
The default `intent:"auto"` inspects `managed_waterfall`,
|
|
89
|
-
`dashboard_evergreen`, and `active_campaign` lane sources. Report the lane
|
|
90
|
-
source and lane chain as proof for every selected sender.
|
|
91
|
-
Connection-only evergreen lanes are invite-only refill targets. When the packet
|
|
92
|
-
or campaign proof shows exactly `["send_invite"]`, report and execute only
|
|
93
|
-
`selectedLane:"send_invite"` work; do not infer DM, InMail, Sales Nav cascade,
|
|
94
|
-
paid-credit refresh, message generation, follow-up, sequence mutation,
|
|
95
|
-
launch/start beyond packet authority, scheduler writes, or direct sends.
|
|
96
|
-
|
|
97
|
-
If membership blocks a workspace read, report the structured
|
|
98
|
-
`workspace_access` blocker instead of retrying auth or switching workspaces.
|
|
99
|
-
|
|
100
|
-
## Authority
|
|
101
|
-
|
|
102
|
-
The run may execute only packet-named bounded work:
|
|
103
|
-
|
|
104
|
-
- approve generated messages that are ready for review (`approve_messages`);
|
|
105
|
-
- enrich the next batch of unenriched rows (`enrich_more`);
|
|
106
|
-
- copy leads already found into the campaign table (`reconcile_source_copy`);
|
|
107
|
-
- re-run errored enrichment/message cells (`rerun_errored_cells`);
|
|
108
|
-
- find more leads via this campaign's original source (`add_leads_same_source`)
|
|
109
|
-
only for mechanical same-source continuations;
|
|
110
|
-
- start the paused campaign so ready rows can schedule (`start_campaign`) only
|
|
111
|
-
when the campaign is in the packet's pinned lane chain;
|
|
112
|
-
- refresh paid InMail credit facts during bootstrap and once per scheduler-wait
|
|
113
|
-
entry when the packet requires it.
|
|
114
|
-
- apply `revise_message_template_and_rerun` only when the packet contains the
|
|
115
|
-
complete explicit user-approved revision envelope and exact fenced target.
|
|
116
|
-
- after that revision commits, apply only its exact-row, readiness-bound
|
|
117
|
-
`approve_messages` continuation and require the returned lane-scope receipt.
|
|
118
|
-
|
|
119
|
-
The loop records planned -> did -> outcome before and after every foreign
|
|
120
|
-
mutation. It refuses stale packets by fingerprint and validates packet
|
|
121
|
-
coherence before dispatch. The planner owns repair decisions: if a batch needs
|
|
122
|
-
repair, the next packet names the repair rung; the loop bounds and refuses, it
|
|
123
|
-
does not improvise fixes.
|
|
124
|
-
|
|
125
|
-
Do not create campaigns, switch provider families, lower thresholds, write
|
|
126
|
-
scheduler fields, send messages, archive/delete campaigns, or mutate
|
|
127
|
-
brief/filter/message/sequence/sender config unless a separate exact approval
|
|
128
|
-
packet explicitly authorizes that work. In short: no campaign creation, no
|
|
129
|
-
provider-family switch, no threshold lowering, no scheduler writes, no
|
|
130
|
-
launch/send/archive/delete, and no brief/filter/message/sequence/sender
|
|
131
|
-
mutation.
|
|
132
|
-
|
|
133
|
-
## Continuations
|
|
134
|
-
|
|
135
|
-
Sales Nav and Prospeo source continuations that are not yolo-safe are blocked
|
|
136
|
-
as executable scoped handoffs. The report will include text shaped like:
|
|
137
|
-
|
|
138
|
-
```text
|
|
139
|
-
$sellable:create-campaign [campaignId]
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
That handoff is run in a separate thread only after explicit approval. Scope is
|
|
143
|
-
strict: add leads through this campaign's existing source, keep the same
|
|
144
|
-
saved-search identity, import mode `add` into the same source list, and do
|
|
145
|
-
source work only. It is never a new campaign, provider-family switch, brief
|
|
146
|
-
change, rubric change, message change, sequence change, or sender change.
|
|
147
|
-
|
|
148
|
-
## Verification
|
|
149
|
-
|
|
150
|
-
The loop verifies whole rows before replanning. It reattaches to an own active
|
|
151
|
-
prep job instead of re-dispatching, waits on foreign prep jobs without adopting
|
|
152
|
-
their outcomes, waits on active enrichment/import work by rereading the packet,
|
|
153
|
-
and treats capped scheduler capacity as complete.
|
|
154
|
-
|
|
155
|
-
Scheduler waits are cross-invocation. Each tool call polls briefly under the
|
|
156
|
-
host guard, heartbeats the run lease, and may return:
|
|
157
|
-
|
|
158
|
-
```text
|
|
159
|
-
{ status:"in_progress", runId, fence, gate, guidance }
|
|
160
|
-
```
|
|
161
|
-
|
|
162
|
-
Reinvoke with that handle. The approximately five minute scheduler budget is at
|
|
163
|
-
the run level, not one tool call. A window-closed or loaded-awaiting scheduler
|
|
164
|
-
report must include remaining-ready count, exact expected pickup time, and the
|
|
165
|
-
resume handle; never treat bare "awaiting scheduler" copy as a final answer.
|
|
166
|
-
Scheduler-run receipt interpretation still applies to terminal progress:
|
|
167
|
-
`cellsConsidered is allocation-attempt count`, not total ready supply, while
|
|
168
|
-
`readyCellsFound` is ready inventory found before prefilters. Inspect
|
|
169
|
-
`campaignScopeSummary` before assuming the selected refill campaign/table was
|
|
170
|
-
included; if absent, do not infer that target was ready-but-blocked. Interpret
|
|
171
|
-
`prefiltered`, `skipped`, and `deferred` separately. For ready closed-InMail
|
|
172
|
-
cells with stale paid-credit reasons, route to
|
|
173
|
-
`refresh_paid_inmail_credits_then_rerun` once, then rerun/status.
|
|
174
|
-
`wait_for_capacity_or_window` means report loaded/capped/waiting and do not
|
|
175
|
-
source or prep more rows; `no_ready_cells_continue_refill_prep` means return to
|
|
176
|
-
the refill/prep ladder. Do not treat `cellsScheduled:0` alone as failure.
|
|
177
|
-
|
|
178
|
-
After the first prep batch, read the conversion-verdict journal line. It is
|
|
179
|
-
rendered from packet facts: `supplyCensus`, `censusReason`, and
|
|
180
|
-
`pipelineDiagnosis.firstFailing`. If the verdict is honest rubric failure, the
|
|
181
|
-
human decision is to update the rubric or change lead source; refill does not
|
|
182
|
-
mutate those automatically.
|
|
183
|
-
|
|
184
|
-
## Results
|
|
185
|
-
|
|
186
|
-
Terminal reasons are:
|
|
187
|
-
|
|
188
|
-
- `complete`
|
|
189
|
-
- `capped_by_scheduler`
|
|
190
|
-
- `loaded_awaiting_scheduler`
|
|
191
|
-
- `lanes_exhausted`
|
|
192
|
-
- `blocked`
|
|
193
|
-
- `no_refillable_campaigns`
|
|
194
|
-
- `not_an_evergreen_workspace`
|
|
195
|
-
|
|
196
|
-
Report campaign names and sender names first, ids second. Include the terminal
|
|
197
|
-
reason or resume handle, lane source, lane chain, chosen label with token
|
|
198
|
-
secondary, plan revision, journal path, blocked continuation packets, and
|
|
199
|
-
firstFailing checklist when present.
|
|
200
|
-
|
|
201
|
-
Preserve `refill_reporting.v2` exactly in progress, continuation, replay, and
|
|
202
|
-
terminal results. Do not recompute its semantic counts or drop live-preparation
|
|
203
|
-
epoch, snapshot sequence, reset reason, watermark, blockers, compatibility, or
|
|
204
|
-
terminal fields. Never surface raw prospect or message-copy fields.
|
|
205
|
-
|
|
206
|
-
Real-run journals live under `~/.sellable/refill/runs` by default and append an
|
|
207
|
-
index line. Dry runs include the dry marker and do not create run records.
|
|
@@ -1,171 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: refill-sends-v2-workflow
|
|
3
|
-
description: Internal execution workflow for refill sends v2 fenced runs.
|
|
4
|
-
visibility: internal
|
|
5
|
-
allowed-tools:
|
|
6
|
-
- mcp__sellable__refill_sends_v2
|
|
7
|
-
- mcp__sellable__get_refill_plan_v2
|
|
8
|
-
- mcp__sellable__get_subskill_prompt
|
|
9
|
-
- mcp__sellable__get_subskill_asset
|
|
10
|
-
- mcp__sellable__get_auth_status
|
|
11
|
-
- mcp__sellable__get_active_workspace
|
|
12
|
-
- mcp__sellable__list_workspaces
|
|
13
|
-
- mcp__sellable__get_workspace
|
|
14
|
-
---
|
|
15
|
-
|
|
16
|
-
# Refill Sends V2 Workflow
|
|
17
|
-
|
|
18
|
-
This internal workflow mirrors the run-record gates enforced by
|
|
19
|
-
`refill_sends_v2`: bootstrap, plan, execute, verify, and report. Dry runs stay
|
|
20
|
-
read-only. Real runs execute only packet-named bounded work under a fenced run
|
|
21
|
-
lease and return terminal, blocked, or in-progress results.
|
|
22
|
-
|
|
23
|
-
Runtime flow asset: after loading this prompt, load
|
|
24
|
-
`get_subskill_asset({ subskillName: "refill-sends-v2-workflow", assetPath: "core/flow.v1.json" })`
|
|
25
|
-
through MCP, continue chunks until `hasMore:false`, parse the JSON, and verify
|
|
26
|
-
`workflow:"refill-sends-v2-workflow"` with a `v1` version before driving the
|
|
27
|
-
loop. If the asset cannot load or parse, stop with
|
|
28
|
-
`blocked:refill_sends_v2_workflow_asset_unavailable`; do not emulate it from
|
|
29
|
-
local files or memory.
|
|
30
|
-
|
|
31
|
-
## G0 Bootstrap
|
|
32
|
-
|
|
33
|
-
Resolve request-scoped `workspaceId` using read-only auth and workspace tools.
|
|
34
|
-
Scheduled or autonomous runs must not rely on implicit workspace state.
|
|
35
|
-
|
|
36
|
-
Start or resume the execution loop:
|
|
37
|
-
|
|
38
|
-
```text
|
|
39
|
-
refill_sends_v2({ workspaceId, intent:"auto", senderIds?, approvalMode?, runHandle?, targetConfig?, reportingContext?, messageTemplateRevision? })
|
|
40
|
-
```
|
|
41
|
-
|
|
42
|
-
Use `dryRun:true` only when the user asked for read-only inspection. A dry run
|
|
43
|
-
writes a journal only. A real run creates or resumes a run record, refreshes
|
|
44
|
-
paid-credit trust only when packet facts require it, and returns a resume handle
|
|
45
|
-
when the current invocation must pause.
|
|
46
|
-
|
|
47
|
-
## G1 Plan
|
|
48
|
-
|
|
49
|
-
The loop reads `get_refill_plan_v2` with runState fed back from the run record.
|
|
50
|
-
It captures `planRevision`, `stateRevision`, and `targetShapeRevision`, then
|
|
51
|
-
validates the packet before dispatch. Packet coherence is required: fingerprint
|
|
52
|
-
shape, tool input completeness, lane-chain membership, census-vs-rung
|
|
53
|
-
consistency, and terminal/action exclusivity. An incoherent packet is replanned
|
|
54
|
-
once, then blocked as `packet_incoherent`.
|
|
55
|
-
|
|
56
|
-
The packet's `supplyCensus`, `censusReason`, and `pipelineDiagnosis` checklist
|
|
57
|
-
are the reason for the next rung. Repair is replan-driven: the planner names
|
|
58
|
-
the repair rung, such as re-run errored enrichment/message cells
|
|
59
|
-
(`rerun_errored_cells`), approve generated messages that are ready for review
|
|
60
|
-
(`approve_messages`), or start the paused campaign so ready rows can schedule
|
|
61
|
-
(`start_campaign`). The loop bounds and refuses repair loops; it never invents
|
|
62
|
-
a fix list.
|
|
63
|
-
|
|
64
|
-
The exact `RefillTargetConfigV1` and server `RefillRunHandleV1` stay separate.
|
|
65
|
-
If and only if the caller supplies a complete explicit
|
|
66
|
-
`messageTemplateRevision` with `source:"user_approved"`, approved markdown,
|
|
67
|
-
prior/new authority digests, a bounded row cohort, and request/effect/revision-
|
|
68
|
-
operation IDs, the planner may name `revise_message_template_and_rerun`.
|
|
69
|
-
Missing/partial input blocks before dispatch; `forceRerun` never synthesizes
|
|
70
|
-
revision authority.
|
|
71
|
-
|
|
72
|
-
Connection-only evergreen packets are invite-only. If the selected lane or
|
|
73
|
-
campaign proof is exactly `["send_invite"]`, the workflow may refill only
|
|
74
|
-
`selectedLane:"send_invite"` capacity. Do not treat that lane as a DM, InMail,
|
|
75
|
-
Sales Nav cascade, paid-credit refresh, generated-message requirement,
|
|
76
|
-
follow-up branch, sequence-repair task, scheduler write, launch/send, or
|
|
77
|
-
provider-family continuation.
|
|
78
|
-
|
|
79
|
-
Use plain-language labels first and tokens second, for example "copy leads
|
|
80
|
-
already found into the campaign table (`reconcile_source_copy`)".
|
|
81
|
-
|
|
82
|
-
## G2 Execute
|
|
83
|
-
|
|
84
|
-
The loop executes only the packet head action whose fingerprint was captured at
|
|
85
|
-
G1. Stale packets are refused and replanned.
|
|
86
|
-
|
|
87
|
-
Allowed packet-named work:
|
|
88
|
-
|
|
89
|
-
1. start the paused campaign so ready rows can schedule (`start_campaign`) when
|
|
90
|
-
the campaign is in the pinned lane chain;
|
|
91
|
-
2. approve generated messages that are ready for review (`approve_messages`);
|
|
92
|
-
3. enrich the next batch of unenriched rows (`enrich_more`);
|
|
93
|
-
4. copy leads already found into the campaign table (`reconcile_source_copy`);
|
|
94
|
-
5. re-run errored enrichment/message cells (`rerun_errored_cells`);
|
|
95
|
-
6. find more leads via this campaign's original source
|
|
96
|
-
(`add_leads_same_source`) for mechanical same-source continuations;
|
|
97
|
-
7. wait for the scheduler to pick up ready rows (`wait_for_scheduler`).
|
|
98
|
-
8. apply the exact approved message-template revision
|
|
99
|
-
(`revise_message_template_and_rerun`) and preserve its domain replay receipt.
|
|
100
|
-
|
|
101
|
-
Never create campaigns, switch providers, lower thresholds, write scheduler
|
|
102
|
-
fields, send/archive/delete, or mutate brief/filter/message/sequence/sender
|
|
103
|
-
config inside refill.
|
|
104
|
-
|
|
105
|
-
Sales Nav and Prospeo continuations that need human source work are blocked as
|
|
106
|
-
scoped handoffs:
|
|
107
|
-
|
|
108
|
-
```text
|
|
109
|
-
$sellable:create-campaign [campaignId]
|
|
110
|
-
```
|
|
111
|
-
|
|
112
|
-
The handoff scope is source work only: same saved-search identity, import mode
|
|
113
|
-
`add` into the same source list, no new campaign, no provider-family switch, and
|
|
114
|
-
no brief/rubric/message/sequence/sender changes without a separate approval
|
|
115
|
-
packet.
|
|
116
|
-
|
|
117
|
-
## G3 Verify
|
|
118
|
-
|
|
119
|
-
Verification is whole-row and bounded. The loop records planned -> did ->
|
|
120
|
-
outcome, then verifies before replanning.
|
|
121
|
-
|
|
122
|
-
- Own active prep jobs are reattached by `requestSource` and `requestHash`; do
|
|
123
|
-
not re-dispatch prep while the job is active.
|
|
124
|
-
- Foreign prep jobs are waited out or blocked as `foreign_prep_active`; their
|
|
125
|
-
outcomes are not adopted.
|
|
126
|
-
- Active enrichment/import work is handled by bounded packet rereads.
|
|
127
|
-
- The conversion verdict after the first prep batch is journaled from packet
|
|
128
|
-
facts. The plan gate withholds a second unproven prep batch when
|
|
129
|
-
`censusReason` is `conversion_blocked`.
|
|
130
|
-
- Honest rubric failure means a human updates the rubric or changes lead source.
|
|
131
|
-
- Capped scheduler capacity is complete.
|
|
132
|
-
|
|
133
|
-
Scheduler wait is cross-invocation. If the tool returns `in_progress` with
|
|
134
|
-
sweep guidance, re-invoke `refill_sends_v2` with `{runId, fence}`. The scheduler
|
|
135
|
-
budget is cumulative at the run level. Zero pickup after a confirmed sweep is
|
|
136
|
-
debugged from `pipelineDiagnosis`; it is not waited out forever.
|
|
137
|
-
Scheduler-run receipt interpretation still applies to terminal progress:
|
|
138
|
-
`cellsConsidered is allocation-attempt count`, not total ready supply, while
|
|
139
|
-
`readyCellsFound` is ready inventory found before prefilters. Inspect
|
|
140
|
-
`campaignScopeSummary` before assuming the selected refill campaign/table was
|
|
141
|
-
included; if absent, do not infer that target was ready-but-blocked. Interpret
|
|
142
|
-
`prefiltered`, `skipped`, and `deferred` separately. For ready closed-InMail
|
|
143
|
-
cells with stale paid-credit reasons, route to
|
|
144
|
-
`refresh_paid_inmail_credits_then_rerun` once, then rerun/status.
|
|
145
|
-
`wait_for_capacity_or_window` means report loaded/capped/waiting and do not
|
|
146
|
-
source or prep more rows; `no_ready_cells_continue_refill_prep` means return to
|
|
147
|
-
the refill/prep ladder. Do not treat `cellsScheduled:0` alone as failure.
|
|
148
|
-
|
|
149
|
-
## G4 Report
|
|
150
|
-
|
|
151
|
-
Completion proof is the run record at `g4_terminal` with a named doneReason and
|
|
152
|
-
journal evidence showing planned -> did -> outcome plus a terminal block and
|
|
153
|
-
index line. A plan packet alone is not completion proof.
|
|
154
|
-
|
|
155
|
-
Every progress, continuation, replay, and terminal projection carries the
|
|
156
|
-
canonical `refill_reporting.v2` DTO without rebuilding it. Preserve live epoch,
|
|
157
|
-
sequence, reset, watermark, semantic/compatibility counts, blockers, and
|
|
158
|
-
terminal outcome while redacting raw copy/prospect fields.
|
|
159
|
-
|
|
160
|
-
Terminal reasons are `complete`, `capped_by_scheduler`,
|
|
161
|
-
`loaded_awaiting_scheduler`, `lanes_exhausted`, `blocked`,
|
|
162
|
-
`no_refillable_campaigns`, and `not_an_evergreen_workspace`.
|
|
163
|
-
|
|
164
|
-
`loaded_awaiting_scheduler` remains the run-record token, but report copy must
|
|
165
|
-
include remaining-ready count, exact expected pickup time, and the resume
|
|
166
|
-
handle. Do not render bare "loaded, awaiting scheduler" as a final answer.
|
|
167
|
-
|
|
168
|
-
Report campaign names and sender names first, ids second. Include lane source,
|
|
169
|
-
lane chain, chosen label with token secondary, plan revision, terminal reason or
|
|
170
|
-
resume handle, journal path, blocked continuation packets, and firstFailing
|
|
171
|
-
checklist when present.
|