@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.
- package/dist/index-dev.js +0 -0
- package/dist/index.js +0 -0
- package/dist/refill-journal.d.ts +49 -0
- package/dist/refill-journal.js +134 -0
- package/dist/refill-local-state.d.ts +31 -0
- package/dist/refill-local-state.js +96 -0
- package/dist/server.js +9 -4
- package/dist/tools/campaigns.d.ts +1 -54
- package/dist/tools/campaigns.js +3 -18
- package/dist/tools/evergreen-refill-plan.d.ts +49 -0
- package/dist/tools/evergreen-refill-plan.js +196 -0
- package/dist/tools/leads.d.ts +40 -2
- package/dist/tools/leads.js +107 -135
- package/dist/tools/prompts.d.ts +3 -3
- package/dist/tools/prompts.js +3 -1
- package/dist/tools/refill-sends-evergreen.d.ts +28 -0
- package/dist/tools/refill-sends-evergreen.js +47 -0
- package/dist/tools/refill-sends.d.ts +40 -38
- package/dist/tools/refill-sends.js +130 -261
- package/dist/tools/refill-target-plan.js +22 -3
- package/dist/tools/registry.d.ts +32 -141
- package/dist/tools/registry.js +4 -0
- package/dist/tools/senders.d.ts +2 -1
- package/dist/tools/senders.js +9 -7
- package/package.json +1 -1
- package/skills/refill-sends/SKILL.md +30 -10
- package/skills/refill-sends-evergreen/SKILL.md +84 -0
- package/skills/refill-sends-evergreen-workflow/SKILL.md +107 -0
- package/skills/refill-sends-evergreen-workflow/core/flow.v1.json +247 -0
- package/skills/refill-sends-workflow/SKILL.md +27 -2
- package/skills/refill-sends-workflow/core/flow.v1.json +281 -0
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refill-sends-evergreen
|
|
3
|
+
description: Plan evergreen waterfall send refill work through the Phase 85 dry-run workflow.
|
|
4
|
+
visibility: public
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__sellable__refill_sends_evergreen
|
|
7
|
+
- mcp__sellable__get_evergreen_refill_plan
|
|
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 Evergreen
|
|
17
|
+
|
|
18
|
+
Use this public command wrapper for evergreen waterfall refill requests such as
|
|
19
|
+
"refill evergreen", "fill evergreen senders", "load evergreen lanes", or
|
|
20
|
+
"plan evergreen refill".
|
|
21
|
+
|
|
22
|
+
Host command names:
|
|
23
|
+
|
|
24
|
+
- Claude Code: `/sellable:refill-sends-evergreen`
|
|
25
|
+
- Codex: `$sellable:refill-sends-evergreen`
|
|
26
|
+
|
|
27
|
+
Phase 85 is read-only, dry-run, zero mutations. It plans the deterministic
|
|
28
|
+
waterfall-ladder refill packet and writes a local dry-run journal, but it does
|
|
29
|
+
not prepare messages, approve messages, start campaigns, schedule sends, send
|
|
30
|
+
messages, refresh paid InMail credit facts, create campaigns, or change source
|
|
31
|
+
configuration. Execution ships in the follow-up phase.
|
|
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
|
+
Start with the command contract:
|
|
41
|
+
|
|
42
|
+
```text
|
|
43
|
+
refill_sends_evergreen({ workspaceId })
|
|
44
|
+
```
|
|
45
|
+
|
|
46
|
+
Then load the internal workflow prompt and flow asset:
|
|
47
|
+
|
|
48
|
+
```text
|
|
49
|
+
get_subskill_prompt({ subskillName: "refill-sends-evergreen-workflow" })
|
|
50
|
+
get_subskill_asset({ subskillName: "refill-sends-evergreen-workflow", assetPath: "core/flow.v1.json" })
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
Continue both loads until `hasMore:false`; parse the flow JSON and verify
|
|
54
|
+
`workflow:"refill-sends-evergreen-workflow"` with a `v1` version before the
|
|
55
|
+
planner call.
|
|
56
|
+
|
|
57
|
+
Call the dry-run planner with the explicit workspace id:
|
|
58
|
+
|
|
59
|
+
```text
|
|
60
|
+
get_evergreen_refill_plan({ workspaceId, senderIds?, runState?, journal?, journalNote? })
|
|
61
|
+
```
|
|
62
|
+
|
|
63
|
+
Use `senderIds` only when the user scoped the request to exact senders. Use
|
|
64
|
+
`runState` only for an explicit what-if dry run; otherwise let the MCP read
|
|
65
|
+
local lane memory hints. Leave `journal` enabled unless the user specifically
|
|
66
|
+
asked for no local journal.
|
|
67
|
+
|
|
68
|
+
## Report
|
|
69
|
+
|
|
70
|
+
Review the returned packet before giving a recommendation:
|
|
71
|
+
|
|
72
|
+
- `planRevision` starts with `pr1:`.
|
|
73
|
+
- `stateRevision` identifies the current readback.
|
|
74
|
+
- `packet` is the operator-facing facts receipt.
|
|
75
|
+
- `plans[]` contains per-sender lane decisions and itinerary details.
|
|
76
|
+
- `globalActionQueue[]` is a dry-run sequence only in Phase 85.
|
|
77
|
+
- `evergreen.enumeratedRungs` and each action's `evergreenRung` map to the
|
|
78
|
+
locked ladder from the workflow asset.
|
|
79
|
+
- `journalPath` points to the dry-run markdown journal written by the MCP.
|
|
80
|
+
- `sideEffects` must be all false.
|
|
81
|
+
|
|
82
|
+
Report campaign names and sender names first, ids second. Include the chosen
|
|
83
|
+
rung, the itinerary, the plan revision, the journal path, and any blockers or
|
|
84
|
+
warnings. Stop after the report; do not execute the action queue in Phase 85.
|
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: refill-sends-evergreen-workflow
|
|
3
|
+
description: Internal read-only workflow for evergreen waterfall refill dry-run planning.
|
|
4
|
+
visibility: internal
|
|
5
|
+
allowed-tools:
|
|
6
|
+
- mcp__sellable__refill_sends_evergreen
|
|
7
|
+
- mcp__sellable__get_evergreen_refill_plan
|
|
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 Evergreen Workflow
|
|
17
|
+
|
|
18
|
+
This internal workflow is the Phase 85 plan surface for evergreen waterfall
|
|
19
|
+
refill. It is read-only, dry-run, zero mutations. The workflow has three gates:
|
|
20
|
+
bootstrap, plan, and report.
|
|
21
|
+
|
|
22
|
+
Runtime flow asset: after loading this prompt, load
|
|
23
|
+
`get_subskill_asset({ subskillName: "refill-sends-evergreen-workflow", assetPath: "core/flow.v1.json" })`
|
|
24
|
+
through MCP, continue chunks until `hasMore:false`, parse the JSON, and verify
|
|
25
|
+
`workflow:"refill-sends-evergreen-workflow"` with a `v1` version before any
|
|
26
|
+
planner call. If the asset cannot load or parse, stop with
|
|
27
|
+
`blocked:evergreen_refill_workflow_asset_unavailable`; do not emulate it from
|
|
28
|
+
local files or memory.
|
|
29
|
+
|
|
30
|
+
## G0 Bootstrap Facts
|
|
31
|
+
|
|
32
|
+
Resolve the request-scoped `workspaceId` using read-only auth and workspace
|
|
33
|
+
tools. Scheduled or autonomous runs must not rely on implicit workspace state.
|
|
34
|
+
Call `refill_sends_evergreen({ workspaceId })` first to receive the command
|
|
35
|
+
contract, then call `get_evergreen_refill_plan({ workspaceId })` for the dry-run
|
|
36
|
+
packet.
|
|
37
|
+
|
|
38
|
+
Optional inputs:
|
|
39
|
+
|
|
40
|
+
- `senderIds`: exact sender scope when the user named senders.
|
|
41
|
+
- `runState`: synthetic v1 lane memory for what-if dry runs. Use it only when
|
|
42
|
+
the user intentionally wants a hypothetical cursor, pin, or cooldown state.
|
|
43
|
+
- `journal:false`: skip the local journal only when explicitly requested.
|
|
44
|
+
- `journalNote`: append operator context to the dry-run terminal section.
|
|
45
|
+
|
|
46
|
+
## G1 Evergreen Ladder
|
|
47
|
+
|
|
48
|
+
The planner chooses from this locked rung order:
|
|
49
|
+
|
|
50
|
+
1. `start_campaign`: a paused selected lane has scheduler-ready supply but must
|
|
51
|
+
be live before the scheduler can pick it up.
|
|
52
|
+
2. `approve_messages`: generated rows are ready for a bounded approval step.
|
|
53
|
+
3. `wait_for_active_work`: enrichment, generation, import, or preparation is
|
|
54
|
+
already active, so the next honest action is to wait for that work to finish.
|
|
55
|
+
4. `enrich_more`: exact-set enrichment can close the current ready gap.
|
|
56
|
+
5. `reconcile_source_copy`: same-source rows exist and can be copied without
|
|
57
|
+
changing source family or source fingerprint.
|
|
58
|
+
6. `add_leads_same_source`: the same source path can add bounded new supply.
|
|
59
|
+
7. `paid_lane_fallback`: paid InMail is blocked or below threshold, so the same
|
|
60
|
+
waterfall can fall back to an existing supported lane.
|
|
61
|
+
8. `next_campaign`: the current lane is exhausted, cooling down, pinned away, or
|
|
62
|
+
unsafe, and the next surviving campaign lane should be inspected.
|
|
63
|
+
9. `wait_for_scheduler`: ready or projected supply covers the target, and only
|
|
64
|
+
scheduler pickup remains.
|
|
65
|
+
10. `done`: the sender or lane is complete for the selected target window, or a
|
|
66
|
+
scheduler cap makes additional preparation unnecessary.
|
|
67
|
+
|
|
68
|
+
Forward-only lane rule: a lane can move to a later rung or a later surviving
|
|
69
|
+
campaign, but the dry-run packet must not jump backward to invent work that the
|
|
70
|
+
facts do not support. Pinned-campaign rule: a pinned campaign stays selected
|
|
71
|
+
until the planner proves a blocker, cooldown, exhaustion, or safer next lane.
|
|
72
|
+
Capped-is-complete rule: when scheduler capacity is lower than the requested
|
|
73
|
+
target and ready/projected coverage satisfies that cap, report `done` with the
|
|
74
|
+
cap reason. Honest-itinerary rule: show what was checked, what was skipped, and
|
|
75
|
+
why; never hide uncertainty behind a confident source recommendation.
|
|
76
|
+
|
|
77
|
+
Guardrails inherited from the Phase 83 evergreen workflow: no campaign creation,
|
|
78
|
+
no provider-family switch, no threshold lowering, no scheduler writes, no
|
|
79
|
+
launch/send/archive/delete, no brief/filter/message/sequence/sender mutation,
|
|
80
|
+
no message preparation, no message approval, no paid InMail credit refresh, no
|
|
81
|
+
source mutation, no row queueing, and no campaign status change.
|
|
82
|
+
|
|
83
|
+
## Journal
|
|
84
|
+
|
|
85
|
+
`get_evergreen_refill_plan` writes a local dry-run journal unless
|
|
86
|
+
`journal:false` is passed. Read the returned `journalPath` from the tool result
|
|
87
|
+
and include it in the report. The journal contains bootstrap, plan, and terminal
|
|
88
|
+
sections plus an index line under the run journal directory. If the tool returns
|
|
89
|
+
`journalPath:null` with a `journalWriteFailed` warning, report the warning and
|
|
90
|
+
continue with the dry-run packet; do not retry by writing local files yourself.
|
|
91
|
+
|
|
92
|
+
## Report Contract
|
|
93
|
+
|
|
94
|
+
Completion for Phase 85 means packet reviewed and journal written. Merely
|
|
95
|
+
calling `get_evergreen_refill_plan` is not completion proof.
|
|
96
|
+
|
|
97
|
+
Report these facts:
|
|
98
|
+
|
|
99
|
+
- workspace id and selected sender scope;
|
|
100
|
+
- plan revision and state revision;
|
|
101
|
+
- selected campaign and lane per sender;
|
|
102
|
+
- chosen rung and dry-run action queue;
|
|
103
|
+
- itinerary, skipped lanes, blockers, cooldowns, and warnings;
|
|
104
|
+
- journal path;
|
|
105
|
+
- side effects proof, which must show all false values.
|
|
106
|
+
|
|
107
|
+
Stop after the report. The Phase 85 workflow never executes the action queue.
|
|
@@ -0,0 +1,247 @@
|
|
|
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
|
+
"enumeratedRungs": [
|
|
6
|
+
"start_campaign",
|
|
7
|
+
"approve_messages",
|
|
8
|
+
"wait_for_active_work",
|
|
9
|
+
"enrich_more",
|
|
10
|
+
"reconcile_source_copy",
|
|
11
|
+
"add_leads_same_source",
|
|
12
|
+
"paid_lane_fallback",
|
|
13
|
+
"next_campaign",
|
|
14
|
+
"wait_for_scheduler",
|
|
15
|
+
"done"
|
|
16
|
+
],
|
|
17
|
+
"requiredBootstrap": [
|
|
18
|
+
{
|
|
19
|
+
"tool": "get_auth_status",
|
|
20
|
+
"purpose": "Confirm MCP auth before reading workspace or plan facts."
|
|
21
|
+
},
|
|
22
|
+
{
|
|
23
|
+
"tool": "get_active_workspace",
|
|
24
|
+
"purpose": "Resolve explicit workspace evidence when the request did not provide workspaceId."
|
|
25
|
+
},
|
|
26
|
+
{
|
|
27
|
+
"tool": "refill_sends_evergreen",
|
|
28
|
+
"requiredValues": {
|
|
29
|
+
"workspaceId": "{workspaceId}"
|
|
30
|
+
},
|
|
31
|
+
"requiredOutput": [
|
|
32
|
+
"readOnly true",
|
|
33
|
+
"approvalContract says Phase 85 is plan-only"
|
|
34
|
+
]
|
|
35
|
+
},
|
|
36
|
+
{
|
|
37
|
+
"tool": "get_subskill_prompt",
|
|
38
|
+
"requiredValues": {
|
|
39
|
+
"subskillName": "refill-sends-evergreen-workflow"
|
|
40
|
+
},
|
|
41
|
+
"mustReadUntil": {
|
|
42
|
+
"hasMore": false
|
|
43
|
+
}
|
|
44
|
+
},
|
|
45
|
+
{
|
|
46
|
+
"tool": "get_subskill_asset",
|
|
47
|
+
"requiredValues": {
|
|
48
|
+
"subskillName": "refill-sends-evergreen-workflow",
|
|
49
|
+
"assetPath": "core/flow.v1.json"
|
|
50
|
+
},
|
|
51
|
+
"mustReadUntil": {
|
|
52
|
+
"hasMore": false
|
|
53
|
+
},
|
|
54
|
+
"validation": {
|
|
55
|
+
"workflow": "refill-sends-evergreen-workflow",
|
|
56
|
+
"versionPrefix": "v1",
|
|
57
|
+
"requiredTopLevelKeys": [
|
|
58
|
+
"states",
|
|
59
|
+
"gateOrder",
|
|
60
|
+
"enumeratedRungs",
|
|
61
|
+
"verification"
|
|
62
|
+
]
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
{
|
|
66
|
+
"tool": "get_evergreen_refill_plan",
|
|
67
|
+
"requiredValues": {
|
|
68
|
+
"workspaceId": "{workspaceId}"
|
|
69
|
+
},
|
|
70
|
+
"requiredOutput": [
|
|
71
|
+
"planRevision",
|
|
72
|
+
"stateRevision",
|
|
73
|
+
"packet",
|
|
74
|
+
"journalPath",
|
|
75
|
+
"sideEffects"
|
|
76
|
+
]
|
|
77
|
+
}
|
|
78
|
+
],
|
|
79
|
+
"gateOrder": ["bootstrap", "plan", "report"],
|
|
80
|
+
"states": [
|
|
81
|
+
{
|
|
82
|
+
"id": "bootstrap",
|
|
83
|
+
"description": "Load the read-only command contract, workflow prompt, flow asset, and workspace facts.",
|
|
84
|
+
"allowedTools": [
|
|
85
|
+
"get_auth_status",
|
|
86
|
+
"get_active_workspace",
|
|
87
|
+
"list_workspaces",
|
|
88
|
+
"get_workspace",
|
|
89
|
+
"refill_sends_evergreen",
|
|
90
|
+
"get_subskill_prompt",
|
|
91
|
+
"get_subskill_asset",
|
|
92
|
+
"get_evergreen_refill_plan"
|
|
93
|
+
],
|
|
94
|
+
"onEnter": [
|
|
95
|
+
{
|
|
96
|
+
"tool": "get_auth_status"
|
|
97
|
+
},
|
|
98
|
+
{
|
|
99
|
+
"tool": "refill_sends_evergreen",
|
|
100
|
+
"requiredFields": ["workspaceId"]
|
|
101
|
+
},
|
|
102
|
+
{
|
|
103
|
+
"tool": "get_subskill_prompt",
|
|
104
|
+
"requiredValues": {
|
|
105
|
+
"subskillName": "refill-sends-evergreen-workflow"
|
|
106
|
+
}
|
|
107
|
+
},
|
|
108
|
+
{
|
|
109
|
+
"tool": "get_subskill_asset",
|
|
110
|
+
"requiredValues": {
|
|
111
|
+
"subskillName": "refill-sends-evergreen-workflow",
|
|
112
|
+
"assetPath": "core/flow.v1.json"
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
],
|
|
116
|
+
"transitions": {
|
|
117
|
+
"contract_loaded": "plan"
|
|
118
|
+
}
|
|
119
|
+
},
|
|
120
|
+
{
|
|
121
|
+
"id": "plan",
|
|
122
|
+
"description": "Call the dry-run evergreen refill planner exactly once for this invocation.",
|
|
123
|
+
"allowedTools": ["get_evergreen_refill_plan"],
|
|
124
|
+
"onEnter": [
|
|
125
|
+
{
|
|
126
|
+
"tool": "get_evergreen_refill_plan",
|
|
127
|
+
"requiredFields": ["workspaceId"],
|
|
128
|
+
"optionalFields": ["senderIds", "runState", "journal", "journalNote"]
|
|
129
|
+
}
|
|
130
|
+
],
|
|
131
|
+
"requiredOutput": [
|
|
132
|
+
"sideEffects all false",
|
|
133
|
+
"planRevision starts with pr1:",
|
|
134
|
+
"journalPath reported",
|
|
135
|
+
"chosen evergreenRung is in enumeratedRungs"
|
|
136
|
+
],
|
|
137
|
+
"allowedRungsSource": "enumeratedRungs",
|
|
138
|
+
"doNotAllow": [
|
|
139
|
+
"add_column",
|
|
140
|
+
"add_on_demand_leads",
|
|
141
|
+
"add_rubric_item",
|
|
142
|
+
"add_teammate",
|
|
143
|
+
"add_to_comment_campaign",
|
|
144
|
+
"add_to_connection_campaign",
|
|
145
|
+
"add_to_inmail_campaign",
|
|
146
|
+
"archive_campaign",
|
|
147
|
+
"attach_recommended_sequence",
|
|
148
|
+
"attach_sequence",
|
|
149
|
+
"bulk_enrich_with_prospeo",
|
|
150
|
+
"cancel_campaign_message_preparation",
|
|
151
|
+
"cancel_lead_import",
|
|
152
|
+
"capture_post_idea",
|
|
153
|
+
"check_rubric",
|
|
154
|
+
"commit_blueprint",
|
|
155
|
+
"confirm_harvest_job_companies",
|
|
156
|
+
"confirm_lead_list",
|
|
157
|
+
"confirm_prospeo_company_accounts",
|
|
158
|
+
"copy_sender_config",
|
|
159
|
+
"create_campaign",
|
|
160
|
+
"create_on_demand_campaign",
|
|
161
|
+
"create_on_demand_table",
|
|
162
|
+
"create_workspace",
|
|
163
|
+
"create_workflow_table",
|
|
164
|
+
"delete_column",
|
|
165
|
+
"delete_rubric_item",
|
|
166
|
+
"duplicate_campaign",
|
|
167
|
+
"enrich_with_prospeo",
|
|
168
|
+
"fill_campaign_horizon",
|
|
169
|
+
"get_or_create_direct_campaign_table",
|
|
170
|
+
"import_leads",
|
|
171
|
+
"load_csv_dnc_entries",
|
|
172
|
+
"load_csv_domains",
|
|
173
|
+
"load_csv_linkedin_leads",
|
|
174
|
+
"mark_post_published",
|
|
175
|
+
"migrate_flat_configs",
|
|
176
|
+
"pause_campaign",
|
|
177
|
+
"pause_direct_campaign",
|
|
178
|
+
"pause_on_demand_campaign",
|
|
179
|
+
"prepare_campaign_ab_test",
|
|
180
|
+
"queue_campaign_cells",
|
|
181
|
+
"queue_cells",
|
|
182
|
+
"record_campaign_review_batch",
|
|
183
|
+
"record_engage_proven_search",
|
|
184
|
+
"refill_sends",
|
|
185
|
+
"refresh_paid_inmail_credits",
|
|
186
|
+
"revise_message_template_and_rerun",
|
|
187
|
+
"save_domain_filters",
|
|
188
|
+
"save_hook_research",
|
|
189
|
+
"save_post_draft",
|
|
190
|
+
"save_rubrics",
|
|
191
|
+
"send_inbox_draft",
|
|
192
|
+
"send_inbox_manual_reply",
|
|
193
|
+
"set_active_workspace",
|
|
194
|
+
"set_campaign_waterfall_order",
|
|
195
|
+
"set_company_info",
|
|
196
|
+
"set_engage_state",
|
|
197
|
+
"set_engage_style_guide",
|
|
198
|
+
"set_headline_icp_criteria",
|
|
199
|
+
"set_sender_routing",
|
|
200
|
+
"setup_evergreen_campaigns",
|
|
201
|
+
"start_campaign",
|
|
202
|
+
"start_campaign_message_preparation",
|
|
203
|
+
"start_direct_campaign",
|
|
204
|
+
"start_on_demand_campaign",
|
|
205
|
+
"update_campaign",
|
|
206
|
+
"update_campaign_brief",
|
|
207
|
+
"update_cell",
|
|
208
|
+
"update_column",
|
|
209
|
+
"update_inbox_draft",
|
|
210
|
+
"update_post_draft",
|
|
211
|
+
"update_published_post_metrics",
|
|
212
|
+
"update_rubric_item",
|
|
213
|
+
"upsert_engage_tracked_person",
|
|
214
|
+
"upsert_rubric"
|
|
215
|
+
],
|
|
216
|
+
"transitions": {
|
|
217
|
+
"packet_returned": "report"
|
|
218
|
+
}
|
|
219
|
+
},
|
|
220
|
+
{
|
|
221
|
+
"id": "report",
|
|
222
|
+
"description": "Present packet, itinerary, warnings, blockers, plan revision, and journal path; then stop.",
|
|
223
|
+
"allowedTools": [],
|
|
224
|
+
"onEnter": [
|
|
225
|
+
{
|
|
226
|
+
"action": "present_packet_itinerary_and_journal_path"
|
|
227
|
+
}
|
|
228
|
+
],
|
|
229
|
+
"terminal": true
|
|
230
|
+
}
|
|
231
|
+
],
|
|
232
|
+
"verification": {
|
|
233
|
+
"requiredProof": [
|
|
234
|
+
"sideEffects all false in get_evergreen_refill_plan response",
|
|
235
|
+
"planRevision has pr1: prefix",
|
|
236
|
+
"journalPath reported or journalWriteFailed warning surfaced",
|
|
237
|
+
"chosen evergreenRung belongs to enumeratedRungs",
|
|
238
|
+
"packet reviewed with itinerary and blockers"
|
|
239
|
+
],
|
|
240
|
+
"notCompletionProof": [
|
|
241
|
+
"called get_evergreen_refill_plan alone",
|
|
242
|
+
"action queue exists",
|
|
243
|
+
"ready rows alone",
|
|
244
|
+
"operator wants execution"
|
|
245
|
+
]
|
|
246
|
+
}
|
|
247
|
+
}
|
|
@@ -3,6 +3,7 @@ name: refill-sends-workflow
|
|
|
3
3
|
description: Internal skill-led refill sends workflow for regular campaigns and evergreen campaigns.
|
|
4
4
|
visibility: internal
|
|
5
5
|
allowed-tools:
|
|
6
|
+
- mcp__sellable__get_subskill_asset
|
|
6
7
|
- mcp__sellable__get_refill_target_plan
|
|
7
8
|
- mcp__sellable__get_scheduler_fill_capacity
|
|
8
9
|
- mcp__sellable__refresh_paid_inmail_credits
|
|
@@ -79,6 +80,16 @@ open until every selected sender lane is horizon-filled by projected coverage
|
|
|
79
80
|
non-scheduler blocker appears. `awaiting_scheduler_after_ready_buffer` is an
|
|
80
81
|
in-progress wait state, not a reason to mark the goal complete or blocked.
|
|
81
82
|
|
|
83
|
+
Runtime flow asset: after loading this prompt, load
|
|
84
|
+
`get_subskill_asset({ subskillName: "refill-sends-workflow", assetPath: "core/flow.v1.json" })`
|
|
85
|
+
through MCP, continue chunks until `hasMore:false`, parse the JSON, and verify
|
|
86
|
+
`workflow:"refill-sends-workflow"` with a `v1` version before any operational
|
|
87
|
+
step. The flow asset is the deterministic gate order: target-plan read, paid
|
|
88
|
+
InMail credit freshness gate, action selection, bounded table action, scheduler
|
|
89
|
+
wait readback, then completion/blocker. If the asset cannot load or parse, stop
|
|
90
|
+
with `blocked:refill_workflow_asset_unavailable`; do not emulate it from local
|
|
91
|
+
files or memory.
|
|
92
|
+
|
|
82
93
|
1. Call `get_refill_target_plan` first. This read-only target plan is the
|
|
83
94
|
canonical opening receipt: eligible senders, selected sender-local days,
|
|
84
95
|
gross target, inferred per-sender send lane/action selections, actual sent
|
|
@@ -136,6 +147,19 @@ in-progress wait state, not a reason to mark the goal complete or blocked.
|
|
|
136
147
|
threshold, below-threshold paid-InMail facts fall back to an existing
|
|
137
148
|
connection lane, the same Sales Nav cascade campaign's connection branch, or
|
|
138
149
|
a manual continuation.
|
|
150
|
+
Freshness gate precedes scheduler wait: if any selected
|
|
151
|
+
`target.senderRefillPlans[].paidInmail.status` is `missing_credit_facts` or
|
|
152
|
+
`stale_credit_facts`, or the target plan contains a
|
|
153
|
+
`refresh_paid_inmail_credits` candidate, do not enter
|
|
154
|
+
`wait_for_scheduler` even when `remainingReadyOrProjectedGap:0`. Refresh the
|
|
155
|
+
exact selected sender credit facts once, rerun `get_refill_target_plan`, and
|
|
156
|
+
only then decide whether scheduler wait is the next safe action. If facts
|
|
157
|
+
remain missing/stale after the single refresh attempt, stop with a
|
|
158
|
+
paid-InMail freshness blocker instead of waiting on scheduler pickup.
|
|
159
|
+
The standalone MCP refresh surface is the scoped route
|
|
160
|
+
`/api/v3/mcp/senders/:senderId/refresh-inmail-credits` with explicit
|
|
161
|
+
`workspaceId`; do not use active-workspace mutation as the automation
|
|
162
|
+
control path.
|
|
139
163
|
Compact refill lessons: sender-level target plan is final truth; trust
|
|
140
164
|
`schedulerGate.sendable` and scheduler gate blockers, not raw
|
|
141
165
|
`unipileAccountStatus` labels alone; use compact prep status checks for
|
|
@@ -154,8 +178,9 @@ in-progress wait state, not a reason to mark the goal complete or blocked.
|
|
|
154
178
|
If `status:"complete"`, report the target, selected dates, sent count,
|
|
155
179
|
scheduled count, projected count, campaign ids, and no-op proof without
|
|
156
180
|
asking for approval or mutating.
|
|
157
|
-
If `remainingReadyOrProjectedGap:0` but `remainingProjectedGap>0`,
|
|
158
|
-
|
|
181
|
+
If `remainingReadyOrProjectedGap:0` but `remainingProjectedGap>0`, and paid
|
|
182
|
+
InMail credit freshness is clean for every selected paid-InMail lane, run
|
|
183
|
+
only a persistent read-only scheduler wait/reread loop; do not ask for
|
|
159
184
|
prep/import/approval. Poll `get_refill_target_plan` every 60-120 seconds, or
|
|
160
185
|
on the host's next continuation interval, until projected coverage fills,
|
|
161
186
|
a concrete non-scheduler blocker appears, or Christian explicitly asks to
|