@sellable/install 0.1.301 → 0.1.303
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,84 +1,19 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: refill-sends-evergreen
|
|
3
|
-
description:
|
|
3
|
+
description: Deprecated alias for refill-sends-v2.
|
|
4
4
|
visibility: public
|
|
5
5
|
allowed-tools:
|
|
6
|
-
- mcp__sellable__refill_sends_evergreen
|
|
7
|
-
- mcp__sellable__get_evergreen_refill_plan
|
|
8
6
|
- 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
7
|
---
|
|
15
8
|
|
|
16
9
|
# Refill Sends Evergreen
|
|
17
10
|
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
11
|
+
Superseded by refill-sends-v2. The prompt name now redirects through
|
|
12
|
+
`DEPRECATED_SUBSKILL_PROMPT_REPLACEMENTS`; do not call this deprecated prompt
|
|
13
|
+
directly.
|
|
21
14
|
|
|
22
|
-
|
|
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:
|
|
15
|
+
Use `refill-sends-v2` instead:
|
|
41
16
|
|
|
42
17
|
```text
|
|
43
|
-
|
|
18
|
+
get_subskill_prompt({ subskillName: "refill-sends-v2" })
|
|
44
19
|
```
|
|
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,156 @@
|
|
|
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, runId, fence })
|
|
56
|
+
```
|
|
57
|
+
|
|
58
|
+
If a stale handle loses the lease, the tool reports the holder status and the
|
|
59
|
+
approximately 10 minute lockout window. Reinvoke with the current handle or wait
|
|
60
|
+
for lease expiry; never guess a fence.
|
|
61
|
+
|
|
62
|
+
The default `intent:"auto"` inspects `managed_waterfall`,
|
|
63
|
+
`dashboard_evergreen`, and `active_campaign` lane sources. Report the lane
|
|
64
|
+
source and lane chain as proof for every selected sender.
|
|
65
|
+
|
|
66
|
+
If membership blocks a workspace read, report the structured
|
|
67
|
+
`workspace_access` blocker instead of retrying auth or switching workspaces.
|
|
68
|
+
|
|
69
|
+
## Authority
|
|
70
|
+
|
|
71
|
+
The run may execute only packet-named bounded work:
|
|
72
|
+
|
|
73
|
+
- approve generated messages that are ready for review (`approve_messages`);
|
|
74
|
+
- enrich the next batch of unenriched rows (`enrich_more`);
|
|
75
|
+
- copy leads already found into the campaign table (`reconcile_source_copy`);
|
|
76
|
+
- re-run errored enrichment/message cells (`rerun_errored_cells`);
|
|
77
|
+
- find more leads via this campaign's original source (`add_leads_same_source`)
|
|
78
|
+
only for mechanical same-source continuations;
|
|
79
|
+
- start the paused campaign so ready rows can schedule (`start_campaign`) only
|
|
80
|
+
when the campaign is in the packet's pinned lane chain;
|
|
81
|
+
- refresh paid InMail credit facts during bootstrap and once per scheduler-wait
|
|
82
|
+
entry when the packet requires it.
|
|
83
|
+
|
|
84
|
+
The loop records planned -> did -> outcome before and after every foreign
|
|
85
|
+
mutation. It refuses stale packets by fingerprint and validates packet
|
|
86
|
+
coherence before dispatch. The planner owns repair decisions: if a batch needs
|
|
87
|
+
repair, the next packet names the repair rung; the loop bounds and refuses, it
|
|
88
|
+
does not improvise fixes.
|
|
89
|
+
|
|
90
|
+
Do not create campaigns, switch provider families, lower thresholds, write
|
|
91
|
+
scheduler fields, send messages, archive/delete campaigns, or mutate
|
|
92
|
+
brief/filter/message/sequence/sender config unless a separate exact approval
|
|
93
|
+
packet explicitly authorizes that work. In short: no campaign creation, no
|
|
94
|
+
provider-family switch, no threshold lowering, no scheduler writes, no
|
|
95
|
+
launch/send/archive/delete, and no brief/filter/message/sequence/sender
|
|
96
|
+
mutation.
|
|
97
|
+
|
|
98
|
+
## Continuations
|
|
99
|
+
|
|
100
|
+
Sales Nav and Prospeo source continuations that are not yolo-safe are blocked
|
|
101
|
+
as executable scoped handoffs. The report will include text shaped like:
|
|
102
|
+
|
|
103
|
+
```text
|
|
104
|
+
$sellable:create-campaign [campaignId]
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
That handoff is run in a separate thread only after explicit approval. Scope is
|
|
108
|
+
strict: add leads through this campaign's existing source, keep the same
|
|
109
|
+
saved-search identity, import mode `add` into the same source list, and do
|
|
110
|
+
source work only. It is never a new campaign, provider-family switch, brief
|
|
111
|
+
change, rubric change, message change, sequence change, or sender change.
|
|
112
|
+
|
|
113
|
+
## Verification
|
|
114
|
+
|
|
115
|
+
The loop verifies whole rows before replanning. It reattaches to an own active
|
|
116
|
+
prep job instead of re-dispatching, waits on foreign prep jobs without adopting
|
|
117
|
+
their outcomes, waits on active enrichment/import work by rereading the packet,
|
|
118
|
+
and treats capped scheduler capacity as complete.
|
|
119
|
+
|
|
120
|
+
Scheduler waits are cross-invocation. Each tool call polls briefly under the
|
|
121
|
+
host guard, heartbeats the run lease, and may return:
|
|
122
|
+
|
|
123
|
+
```text
|
|
124
|
+
{ status:"in_progress", runId, fence, gate, guidance }
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
Reinvoke with that handle. The approximately five minute scheduler budget is at
|
|
128
|
+
the run level, not one tool call. A window-closed or loaded-awaiting scheduler
|
|
129
|
+
report must include remaining-ready count, exact expected pickup time, and the
|
|
130
|
+
resume handle; never treat bare "awaiting scheduler" copy as a final answer.
|
|
131
|
+
|
|
132
|
+
After the first prep batch, read the conversion-verdict journal line. It is
|
|
133
|
+
rendered from packet facts: `supplyCensus`, `censusReason`, and
|
|
134
|
+
`pipelineDiagnosis.firstFailing`. If the verdict is honest rubric failure, the
|
|
135
|
+
human decision is to update the rubric or change lead source; refill does not
|
|
136
|
+
mutate those automatically.
|
|
137
|
+
|
|
138
|
+
## Results
|
|
139
|
+
|
|
140
|
+
Terminal reasons are:
|
|
141
|
+
|
|
142
|
+
- `complete`
|
|
143
|
+
- `capped_by_scheduler`
|
|
144
|
+
- `loaded_awaiting_scheduler`
|
|
145
|
+
- `lanes_exhausted`
|
|
146
|
+
- `blocked`
|
|
147
|
+
- `no_refillable_campaigns`
|
|
148
|
+
- `not_an_evergreen_workspace`
|
|
149
|
+
|
|
150
|
+
Report campaign names and sender names first, ids second. Include the terminal
|
|
151
|
+
reason or resume handle, lane source, lane chain, chosen label with token
|
|
152
|
+
secondary, plan revision, journal path, blocked continuation packets, and
|
|
153
|
+
firstFailing checklist when present.
|
|
154
|
+
|
|
155
|
+
Real-run journals live under `~/.sellable/refill/runs` by default and append an
|
|
156
|
+
index line. Dry runs include the dry marker and do not create run records.
|
|
@@ -97,8 +97,11 @@ That command helper normalizes arguments and returns the execution contract. In
|
|
|
97
97
|
non-yolo mode it does not mutate. In `--yolo`, it may execute exactly one safe
|
|
98
98
|
bounded primitive from the fresh `target.globalActionQueue[0]`, then reread and
|
|
99
99
|
return the new target plan; currently safe primitives are paid-credit refresh,
|
|
100
|
-
existing-row message preparation,
|
|
101
|
-
|
|
100
|
+
existing-row message preparation, generated-message approval, receipt-proven
|
|
101
|
+
same-source row copy, and read-only wait rereads. Same-source copy/source
|
|
102
|
+
fallback is safe only after receipt-proven exhaustion:
|
|
103
|
+
`hasMoreFrontierRows:false`, zero `approvalCandidates`, no `stuckActiveCells`,
|
|
104
|
+
and no non-terminal `approvedNotDispatched` work. It does not run unbounded approval, lower
|
|
102
105
|
paid-InMail thresholds, switch source families, create campaigns, launch, send,
|
|
103
106
|
or write scheduler rows. Continue with the workflow below for route selection,
|
|
104
107
|
state rereads, approval gating, source import, preparation, and bounded
|
|
@@ -198,7 +201,10 @@ Structured planner packet:
|
|
|
198
201
|
- `target.senderRefillPlans[]` is the canonical sender-level packet; read and
|
|
199
202
|
display it before mutation.
|
|
200
203
|
- Each sender packet includes `campaignRanking.options`, `sourcePlan`,
|
|
201
|
-
`nextActions`, and `manualAlternates`.
|
|
204
|
+
`refillReceipt`, `nextActions`, and `manualAlternates`.
|
|
205
|
+
- `refillReceipt` is the public ladder receipt. It carries the selected
|
|
206
|
+
campaign/sender/lane summary, skipped rungs, existing-row frontier proof, and
|
|
207
|
+
any absolute `wait.deadlineAt`.
|
|
202
208
|
- Preserve these coverage labels exactly: `Need to prepare`, `Goal`,
|
|
203
209
|
`Already sent`, `Scheduled`, `Ready and waiting to be scheduled`, and
|
|
204
210
|
`Still need`.
|
|
@@ -217,6 +223,13 @@ from the selected source (`selectedLeadListId`, provider, and source
|
|
|
217
223
|
fingerprint preserved), then use provider-aligned source-more. A new source or
|
|
218
224
|
provider switch changes the reply-rate baseline and is a manual alternate, not a
|
|
219
225
|
`--yolo` side effect.
|
|
226
|
+
Source/copy/fallback requires receipt-proven exhaustion of earlier rungs:
|
|
227
|
+
`existingRowFrontier.hasMoreFrontierRows:false`, zero `approvalCandidates`, no
|
|
228
|
+
fresh active prep, no `stuckActiveCells`, and no non-terminal
|
|
229
|
+
`approvedNotDispatched` rows. Treat anomalies, `stuckActiveCells`, and
|
|
230
|
+
non-terminal `approvedNotDispatched` as diagnose-and-report gates, not
|
|
231
|
+
exhaustion. Terminal `approvedNotDispatched` blockers may be reported, then the
|
|
232
|
+
ladder can proceed.
|
|
220
233
|
|
|
221
234
|
Run-local paid-credit guard: in `--yolo`, the `refill_sends` MCP command
|
|
222
235
|
automatically maintains a `refreshedPaidInmailSenderIds` set for the current
|
|
@@ -266,6 +279,10 @@ interval, until projected coverage fills the target, a concrete non-scheduler
|
|
|
266
279
|
blocker appears, or Christian explicitly asks to stop or only receive a status
|
|
267
280
|
report. Treat `awaiting_scheduler_after_ready_buffer` as an in-progress wait
|
|
268
281
|
state, not a close-out condition.
|
|
282
|
+
Wait actions are gates, not competing goals. When `wait_for_active_work` or
|
|
283
|
+
`wait_for_scheduler` includes receipt `wait.deadlineAt`, honor that absolute
|
|
284
|
+
deadline; if it is expired on this call, escalate to diagnostics with the
|
|
285
|
+
receipt evidence instead of issuing another blind wait.
|
|
269
286
|
If paid InMail credit facts are stale or missing and the first target plan
|
|
270
287
|
contains `refresh_paid_inmail_credits`, do not present that as the operator's
|
|
271
288
|
next action in `--yolo`. Do not present paid-credit refresh as the next operator
|