@sellable/mcp 0.1.512 → 0.1.514

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.
@@ -236,7 +236,7 @@ export declare const allTools: ({
236
236
  properties: {
237
237
  subskillName: {
238
238
  type: string;
239
- enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-evergreen-campaigns", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "refill-sends", "refill-sends-evergreen", "refill-sends-evergreen-workflow", "refill-sends-workflow", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
239
+ enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-evergreen-campaigns", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "refill-sends", "refill-sends-evergreen", "refill-sends-evergreen-workflow", "refill-sends-v2", "refill-sends-v2-workflow", "refill-sends-workflow", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
240
240
  description: string;
241
241
  };
242
242
  offset: {
@@ -271,7 +271,7 @@ export declare const allTools: ({
271
271
  properties: {
272
272
  subskillName: {
273
273
  type: string;
274
- enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-evergreen-campaigns", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "refill-sends", "refill-sends-evergreen", "refill-sends-evergreen-workflow", "refill-sends-workflow", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
274
+ enum: readonly ["building-gtm-tables", "content", "create-ab-test", "create-campaign", "create-campaign-brief", "create-campaign-v2", "create-campaign-v2-tail", "create-campaign-v2-validation", "create-evergreen-campaigns", "create-post", "create-rubric", "engage", "enrich-prospects", "fill-send-horizon", "find-leads", "foundation", "generate-messages", "interview", "load-voice", "refresh-sender-engagement", "refill-sends", "refill-sends-evergreen", "refill-sends-evergreen-workflow", "refill-sends-v2", "refill-sends-v2-workflow", "refill-sends-workflow", "research", "research-prospect", "research-sender", "weekly-campaign-summary", "workflow-sequences"];
275
275
  description: string;
276
276
  };
277
277
  assetPath: {
@@ -474,6 +474,39 @@ export declare const allTools: ({
474
474
  required: string[];
475
475
  additionalProperties: boolean;
476
476
  };
477
+ } | {
478
+ name: string;
479
+ description: string;
480
+ inputSchema: {
481
+ type: string;
482
+ properties: {
483
+ intent: {
484
+ type: string;
485
+ enum: string[];
486
+ description: string;
487
+ };
488
+ campaignId: {
489
+ type: string;
490
+ description: string;
491
+ };
492
+ tableId: {
493
+ type: string;
494
+ description: string;
495
+ };
496
+ limit: {
497
+ type: string;
498
+ minimum: number;
499
+ maximum: number;
500
+ description: string;
501
+ };
502
+ workspaceId: {
503
+ type: string;
504
+ description: string;
505
+ };
506
+ };
507
+ required: string[];
508
+ additionalProperties: boolean;
509
+ };
477
510
  } | {
478
511
  name: string;
479
512
  description: string;
@@ -585,20 +618,6 @@ export declare const allTools: ({
585
618
  additionalProperties: boolean;
586
619
  required?: undefined;
587
620
  };
588
- } | {
589
- name: string;
590
- description: string;
591
- inputSchema: {
592
- type: string;
593
- properties: {
594
- workspaceId: {
595
- type: string;
596
- description: string;
597
- };
598
- };
599
- required: string[];
600
- additionalProperties: boolean;
601
- };
602
621
  } | {
603
622
  name: string;
604
623
  description: string;
@@ -2309,6 +2328,24 @@ export declare const allTools: ({
2309
2328
  };
2310
2329
  required: string[];
2311
2330
  };
2331
+ } | {
2332
+ name: string;
2333
+ description: string;
2334
+ inputSchema: {
2335
+ type: string;
2336
+ properties: {
2337
+ senderId: {
2338
+ type: string;
2339
+ description: string;
2340
+ };
2341
+ workspaceId: {
2342
+ type: string;
2343
+ description: string;
2344
+ };
2345
+ };
2346
+ required: string[];
2347
+ additionalProperties: boolean;
2348
+ };
2312
2349
  } | {
2313
2350
  name: string;
2314
2351
  description: string;
@@ -2597,6 +2634,43 @@ export declare const allTools: ({
2597
2634
  };
2598
2635
  required: never[];
2599
2636
  };
2637
+ } | {
2638
+ name: string;
2639
+ description: string;
2640
+ inputSchema: {
2641
+ type: string;
2642
+ properties: {
2643
+ workspaceId: {
2644
+ type: string;
2645
+ description: string;
2646
+ };
2647
+ senderIds: {
2648
+ type: string;
2649
+ items: {
2650
+ type: string;
2651
+ };
2652
+ };
2653
+ runState: {
2654
+ type: string;
2655
+ description: string;
2656
+ };
2657
+ intent: {
2658
+ type: string;
2659
+ enum: string[];
2660
+ description: string;
2661
+ };
2662
+ journal: {
2663
+ type: string;
2664
+ description: string;
2665
+ };
2666
+ journalNote: {
2667
+ type: string;
2668
+ description: string;
2669
+ };
2670
+ };
2671
+ required: string[];
2672
+ additionalProperties: boolean;
2673
+ };
2600
2674
  } | {
2601
2675
  name: string;
2602
2676
  description: string;
@@ -7197,6 +7271,47 @@ export declare const allTools: ({
7197
7271
  };
7198
7272
  required: string[];
7199
7273
  };
7274
+ } | {
7275
+ name: string;
7276
+ description: string;
7277
+ inputSchema: {
7278
+ type: string;
7279
+ properties: {
7280
+ workspaceId: {
7281
+ type: string;
7282
+ description: string;
7283
+ };
7284
+ runId: {
7285
+ type: string;
7286
+ description: string;
7287
+ };
7288
+ fence: {
7289
+ type: string;
7290
+ description: string;
7291
+ };
7292
+ dryRun: {
7293
+ type: string;
7294
+ description: string;
7295
+ };
7296
+ approvalMode: {
7297
+ type: string;
7298
+ enum: string[];
7299
+ description: string;
7300
+ };
7301
+ senderIds: {
7302
+ type: string;
7303
+ items: {
7304
+ type: string;
7305
+ };
7306
+ };
7307
+ intent: {
7308
+ type: string;
7309
+ enum: string[];
7310
+ };
7311
+ };
7312
+ required: string[];
7313
+ additionalProperties: boolean;
7314
+ };
7200
7315
  } | {
7201
7316
  name: string;
7202
7317
  description: string;
@@ -7541,6 +7656,59 @@ export declare const allTools: ({
7541
7656
  required: string[];
7542
7657
  additionalProperties: boolean;
7543
7658
  };
7659
+ } | {
7660
+ name: string;
7661
+ description: string;
7662
+ inputSchema: {
7663
+ type: string;
7664
+ properties: {
7665
+ capacityRequests: {
7666
+ type: string;
7667
+ minItems: number;
7668
+ items: {
7669
+ type: string;
7670
+ properties: {
7671
+ senderId: {
7672
+ type: string;
7673
+ description: string;
7674
+ };
7675
+ actionType: {
7676
+ type: string;
7677
+ enum: string[];
7678
+ description: string;
7679
+ };
7680
+ cellId: {
7681
+ type: string;
7682
+ description: string;
7683
+ };
7684
+ columnId: {
7685
+ type: string;
7686
+ description: string;
7687
+ };
7688
+ };
7689
+ required: string[];
7690
+ additionalProperties: boolean;
7691
+ };
7692
+ description: string;
7693
+ };
7694
+ targetDate: {
7695
+ type: string;
7696
+ pattern: string;
7697
+ description: string;
7698
+ };
7699
+ mode: {
7700
+ type: string;
7701
+ enum: string[];
7702
+ description: string;
7703
+ };
7704
+ workspaceId: {
7705
+ type: string;
7706
+ description: string;
7707
+ };
7708
+ };
7709
+ required: string[];
7710
+ additionalProperties: boolean;
7711
+ };
7544
7712
  } | {
7545
7713
  name: string;
7546
7714
  description: string;
@@ -5,8 +5,8 @@ import { campaignAbTestToolDefinitions } from "./campaign-ab-test.js";
5
5
  import { campaignFillRoutingToolDefinitions } from "./campaign-fill-routing.js";
6
6
  import { campaignHorizonFillToolDefinitions } from "./campaign-horizon-fill.js";
7
7
  import { campaignMessagePreparationToolDefinitions } from "./campaign-message-preparation.js";
8
- import { campaignRefillStateToolDefinitions } from "./campaign-refill-state.js";
9
8
  import { campaignProcessingToolDefinitions } from "./campaign-processing.js";
9
+ import { campaignRefillStateToolDefinitions } from "./campaign-refill-state.js";
10
10
  import { campaignToolDefinitions } from "./campaigns.js";
11
11
  import { cellToolDefinitions } from "./cells.js";
12
12
  import { startCliLoginToolDef, waitForCliLoginToolDef } from "./cli-login.js";
@@ -23,6 +23,7 @@ import { engageDiscoveryToolDefinitions } from "./engage-discovery.js";
23
23
  import { engageMemoryToolDefinitions } from "./engage-memory.js";
24
24
  import { engageStateToolDefinitions } from "./engage-state.js";
25
25
  import { enrichmentToolDefinitions } from "./enrichment.js";
26
+ import { refillPlanV2ToolDefinitions } from "./evergreen-refill-plan.js";
26
27
  import { frameworkToolDefinitions } from "./framework.js";
27
28
  import { harvestJobToolDefinitions } from "./harvest-jobs.js";
28
29
  import { inboxToolDefinitions } from "./inbox.js";
@@ -33,10 +34,9 @@ import { onDemandToolDefinitions } from "./one-off.js";
33
34
  import { processingToolDefinitions } from "./processing.js";
34
35
  import { promptToolDefinitions } from "./prompts.js";
35
36
  import { readinessToolDefinitions } from "./readiness.js";
36
- import { evergreenRefillPlanToolDefinitions } from "./evergreen-refill-plan.js";
37
- import { refillSendsEvergreenToolDefinitions } from "./refill-sends-evergreen.js";
38
- import { refillTargetPlanToolDefinitions } from "./refill-target-plan.js";
37
+ import { refillSendsV2ToolDefinitions } from "./refill-sends-v2.js";
39
38
  import { refillSendsToolDefinitions } from "./refill-sends.js";
39
+ import { refillTargetPlanToolDefinitions } from "./refill-target-plan.js";
40
40
  import { rowToolDefinitions } from "./rows.js";
41
41
  import { rubricToolDefinitions } from "./rubrics.js";
42
42
  import { schedulerFillCapacityToolDefinitions } from "./scheduler-fill-capacity.js";
@@ -54,11 +54,11 @@ export const allTools = [
54
54
  ...campaignAbTestToolDefinitions,
55
55
  ...campaignFillRoutingToolDefinitions,
56
56
  ...campaignRefillStateToolDefinitions,
57
- ...evergreenRefillPlanToolDefinitions,
57
+ ...refillPlanV2ToolDefinitions,
58
58
  ...refillTargetPlanToolDefinitions,
59
59
  ...schedulerFillCapacityToolDefinitions,
60
60
  ...refillSendsToolDefinitions,
61
- ...refillSendsEvergreenToolDefinitions,
61
+ ...refillSendsV2ToolDefinitions,
62
62
  ...setupEvergreenCampaignsToolDefinitions,
63
63
  ...campaignHorizonFillToolDefinitions,
64
64
  ...campaignMessagePreparationToolDefinitions,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sellable/mcp",
3
- "version": "0.1.512",
3
+ "version": "0.1.514",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -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.
@@ -1,107 +1,20 @@
1
1
  ---
2
2
  name: refill-sends-evergreen-workflow
3
- description: Internal read-only workflow for evergreen waterfall refill dry-run planning.
3
+ description: Deprecated alias for refill-sends-v2-workflow.
4
4
  visibility: internal
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 Workflow
17
10
 
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.
11
+ Superseded by refill-sends-v2-workflow. The prompt name now redirects through
12
+ `DEPRECATED_SUBSKILL_PROMPT_REPLACEMENTS`; do not call this deprecated prompt or
13
+ its old flow asset directly.
21
14
 
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.
15
+ Use `refill-sends-v2-workflow` instead:
29
16
 
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.
17
+ ```text
18
+ get_subskill_prompt({ subskillName: "refill-sends-v2-workflow" })
19
+ get_subskill_asset({ subskillName: "refill-sends-v2-workflow", assetPath: "core/flow.v1.json" })
20
+ ```
@@ -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.