@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,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/install",
3
- "version": "0.1.301",
3
+ "version": "0.1.303",
4
4
  "type": "module",
5
5
  "description": "One-command installer for Sellable MCP in Claude Code and Codex",
6
6
  "bin": {
@@ -1,84 +1,19 @@
1
1
  ---
2
2
  name: refill-sends-evergreen
3
- description: Plan evergreen waterfall send refill work through the Phase 85 dry-run workflow.
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
- 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".
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
- 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:
15
+ Use `refill-sends-v2` instead:
41
16
 
42
17
  ```text
43
- refill_sends_evergreen({ workspaceId })
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, same-source row copy, and read-only wait
101
- rereads. It does not run unbounded approval, lower
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