@sellable/mcp 0.1.74 → 0.1.75

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/mcp",
3
- "version": "0.1.74",
3
+ "version": "0.1.75",
4
4
  "type": "module",
5
5
  "description": "Sellable MCP server for Claude Code and Codex campaign workflows",
6
6
  "main": "dist/index.js",
@@ -456,11 +456,22 @@ should test for this campaign. Those can run in parallel and usually take
456
456
  message quality gate outputs between `message-validation.md` and
457
457
  `approval-packet.md`.
458
458
  - Run the dependency chain as a DAG: `create-campaign-brief` -> `find leads`;
459
- once `lead-review.md` and `lead-sample.json` exist, run `filter leads` and
460
- `message generation` from the same basis (`brief.md`, `lead-review.md`,
461
- `lead-sample.json`). Approval waits for both `lead-filter.md` and
462
- `message-validation.md`, then reconciles that the selected message basis rows
463
- still pass the final filter.
459
+ once `lead-review.md` and `lead-sample.json` exist, the normal path is the
460
+ `post-lead-workstreams` step. Launch `filter leads` and `message generation`
461
+ from the same basis (`brief.md`, `lead-review.md`, `lead-sample.json`) as
462
+ separate workstreams when the host supports real subagents/background work.
463
+ In Claude Code, use two Task/Agent subagents in the same assistant message;
464
+ in Codex, use disjoint worker subagents when the host exposes them. The
465
+ existing `filter-rubric` and `message-generation` steps remain focused retry
466
+ and resume targets.
467
+ - Message generation does not need `lead-filter.md` to start. The moment
468
+ `lead-sample.json` exists with at least 5 probable good-fit rows and the lead
469
+ source is confirmed or auto-confirmed, start the message-generation
470
+ workstream from `brief.md`, `lead-review.md`, and `lead-sample.json`. It can
471
+ prepare proof inventory, token strategy, and candidate angles while
472
+ filter-leads tightens keep/exclude rules. Approval still waits for both
473
+ `lead-filter.md` and `message-validation.md`, then reconciles that the
474
+ selected message basis rows still pass the final filter.
464
475
  - `lead-sample.json` from `find leads` is always the message sample source.
465
476
  `filter leads` must not create a different message sample or cause message
466
477
  generation to fetch new prospects. The filter only marks which find-leads
@@ -548,10 +548,106 @@
548
548
  "auto_continue"
549
549
  ],
550
550
  "transitions": {
551
- "lead_review_confirmed": "filter-rubric",
551
+ "lead_review_confirmed": "post-lead-workstreams",
552
552
  "revise_leads": "find-leads",
553
- "confirm_with_user": "filter-rubric",
554
- "auto_continue": "filter-rubric"
553
+ "confirm_with_user": "post-lead-workstreams",
554
+ "auto_continue": "post-lead-workstreams"
555
+ },
556
+ "interruptOnly": true
557
+ },
558
+ {
559
+ "id": "post-lead-workstreams",
560
+ "label": "Post-lead filter and message workstreams",
561
+ "normalFlow": true,
562
+ "onEnter": [
563
+ {
564
+ "action": "launch_post_lead_workstreams",
565
+ "mode": "parallel_when_host_supports_subagents",
566
+ "branches": [
567
+ {
568
+ "name": "filter-leads",
569
+ "target": "filter-leads",
570
+ "inputs": ["brief.md", "lead-review.md", "lead-sample.json"],
571
+ "producesArtifacts": ["lead-filter.md"],
572
+ "optionalProducesArtifacts": ["rubric.json"],
573
+ "ownership": "lead quality, false-positive patterns, keep/exclude rules, and production rubric translation only"
574
+ },
575
+ {
576
+ "name": "message-generation",
577
+ "target": "generate-messages",
578
+ "mode": "DRY MODE",
579
+ "inputs": ["brief.md", "lead-review.md", "lead-sample.json"],
580
+ "producesArtifacts": ["message-validation.md"],
581
+ "optionalProducesArtifacts": [
582
+ "message-prep.md",
583
+ "message-candidate-drafts.md"
584
+ ],
585
+ "ownership": "proof inventory, token strategy, angle drafting, skeptical-prospect review, and selected winner only"
586
+ }
587
+ ],
588
+ "earlyMessageStartRule": "As soon as lead-sample.json exists with at least 5 probable good-fit rows and the lead source is confirmed or auto-confirmed, launch message-generation from brief.md, lead-review.md, and lead-sample.json. Do not wait for lead-filter.md to begin proof inventory, token planning, or candidate angles.",
589
+ "finalMessageReconcileRule": "message-validation.md may start before lead-filter.md exists, but before message-review it must cite only lead-sample.json rows that still pass lead-filter.md. If the selected winner depends on a row later excluded by lead-filter.md, revise message-generation before message review.",
590
+ "claudeRule": "In Claude Code, launch both workstreams with Task/Agent subagents in the same assistant message when Task is available. Do not run filter first and then message generation unless subagents/background work are unavailable.",
591
+ "codexRule": "In Codex, launch disjoint worker subagents for filter-leads and message-generation when the host exposes subagents for this run. If the host cannot spawn them, run the same branches sequentially and say so.",
592
+ "fallback": "If real parallel branches are unavailable, run filter-leads and then message-generation in the parent thread. Do not claim background or parallel work in that fallback."
593
+ },
594
+ {
595
+ "action": "wait_for_post_lead_artifacts",
596
+ "requiredArtifacts": ["lead-filter.md", "message-validation.md"],
597
+ "optionalArtifacts": [
598
+ "rubric.json",
599
+ "message-prep.md",
600
+ "message-candidate-drafts.md"
601
+ ],
602
+ "reconciliationRule": "Before entering message-review, verify lead-filter.md and message-validation.md both came from the same brief.md, lead-review.md, and lead-sample.json. lead-filter.md gates the sample rows; lead-sample.json remains the message sample source."
603
+ }
604
+ ],
605
+ "requiredArtifacts": ["brief.md", "lead-review.md", "lead-sample.json"],
606
+ "producesArtifacts": ["lead-filter.md", "message-validation.md"],
607
+ "optionalProducesArtifacts": [
608
+ "rubric.json",
609
+ "message-prep.md",
610
+ "message-candidate-drafts.md"
611
+ ],
612
+ "allowedTools": [
613
+ "get_subskill_prompt",
614
+ "get_subskill_asset",
615
+ "Task",
616
+ "spawn_agent",
617
+ "AskUserQuestion",
618
+ "request_user_input"
619
+ ],
620
+ "toolRules": [
621
+ "The post-lead workstreams are disjoint: filter-leads owns lead-filter.md/rubric.json; message-generation owns message-validation.md/message-prep.md/message-candidate-drafts.md.",
622
+ "message-generation can start before lead-filter.md, but message-review cannot start until both lead-filter.md and message-validation.md exist and reconcile against the same lead-sample.json.",
623
+ "Do not let filter-leads create a new message sample. Do not let message-generation fetch new prospects.",
624
+ "Before writing message-validation.md, message-generation must read 100% of the real generate-messages prompt via chunked get_subskill_prompt({ subskillName: \"generate-messages\", offset, limit }) calls."
625
+ ],
626
+ "doNotAllow": [
627
+ "create_campaign",
628
+ "save_rubrics",
629
+ "import_leads",
630
+ "confirm_lead_list",
631
+ "update_campaign",
632
+ "queue_cells",
633
+ "start_campaign",
634
+ "check_rubric",
635
+ "generate_messages"
636
+ ],
637
+ "watchRequired": false,
638
+ "waitFor": [
639
+ "post_lead_workstreams_ready",
640
+ "revise_leads",
641
+ "revise_rubric",
642
+ "revise_messaging",
643
+ "confirm_with_user"
644
+ ],
645
+ "transitions": {
646
+ "post_lead_workstreams_ready": "message-review",
647
+ "revise_leads": "find-leads",
648
+ "revise_rubric": "filter-rubric",
649
+ "revise_messaging": "message-generation",
650
+ "confirm_with_user": "message-review"
555
651
  },
556
652
  "interruptOnly": true
557
653
  },
@@ -66,8 +66,11 @@ Use this mode when the caller explicitly says `DRY MODE`, `Phase 84`,
66
66
  `create-campaign-v2`, or provides:
67
67
 
68
68
  - `brief.md`
69
- - `lead-filter.md`
70
69
  - `lead-sample.json`
70
+ - `lead-filter.md` when available. In the create-campaign-v2
71
+ `post-lead-workstreams` step, message generation may start before
72
+ `lead-filter.md` exists so it can prepare proof inventory, token strategy,
73
+ and candidate angles while filter-leads runs.
71
74
 
72
75
  Required dry-mode contract:
73
76
 
@@ -78,12 +81,20 @@ Required dry-mode contract:
78
81
  - do not call `mcp__sellable__update_campaign_brief`
79
82
  - do not mutate DB-backed campaign state
80
83
  - do not fetch fresh web or LinkedIn research
81
- - use only `brief.md`, `lead-filter.md`, and `lead-sample.json`
84
+ - use only `brief.md`, `lead-sample.json`, and `lead-filter.md` when present
82
85
  - treat `lead-sample.json` from find-leads as the message sample source; do not
83
86
  ask filter-leads for a new sample, create a new sample, or fetch additional
84
87
  prospects for dry-mode message generation
85
- - use `lead-filter.md` only to decide which find-leads sample rows remain valid
86
- for the final winner and which false-positive patterns must be avoided
88
+ - if `lead-filter.md` is not present yet, do the expensive early work only:
89
+ proof inventory, token rules, strategy map, candidate angle drafting, and
90
+ provisional sample fills. Prefer writing `message-prep.md` and
91
+ `message-candidate-drafts.md` while waiting for the filter branch.
92
+ - use `lead-filter.md` once available to decide which find-leads sample rows
93
+ remain valid for the final winner and which false-positive patterns must be
94
+ avoided
95
+ - do not mark `message-validation.md` as final or ready for message review until
96
+ `lead-filter.md` exists and the selected winner cites only rows that still
97
+ pass the filter
87
98
  - generate 2-3 sample messages inline
88
99
  - write findings to `message-validation.md`
89
100
  - start `message-validation.md` with `Mode: DRY MODE (no DB mutation)`
@@ -98,9 +109,11 @@ Dry mode validates message quality before campaign mint.
98
109
  Read:
99
110
 
100
111
  - `brief.md`
101
- - `lead-filter.md`
102
112
  - `lead-sample.json` from the find-leads step; this is the only allowed sample
103
113
  source for dry-mode message generation
114
+ - `lead-filter.md` when present. If it is absent because the caller launched
115
+ post-lead workstreams in parallel, start the prep/candidate stages and then
116
+ reconcile before final `message-validation.md`.
104
117
  - `mcp/sellable/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md`
105
118
  - `mcp/sellable/skills/create-campaign-v2/references/validation-criteria.md`
106
119
  - `mcp/sellable/skills/create-campaign-v2/references/thomas-revision-filters.md`