@sellable/mcp 0.1.213 → 0.1.215
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/agents/post-find-leads-message-scout.md +190 -151
- package/dist/tools/prompts.js +18 -13
- package/package.json +1 -1
- package/skills/create-campaign/SKILL.md +11 -12
- package/skills/create-campaign-brief/references/examples/briefs/superpower.md +3 -3
- package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +16 -28
- package/skills/create-campaign-v2/SKILL.md +12 -9
- package/skills/create-campaign-v2/core/auto-execute.README.md +11 -11
- package/skills/create-campaign-v2/core/auto-execute.yaml +4 -4
- package/skills/create-campaign-v2/core/flow.v2.json +1 -1
- package/skills/create-campaign-v2/references/ai-tells.md +3 -3
- package/skills/create-campaign-v2/references/approval-gate-framing.md +9 -9
- package/skills/create-campaign-v2/references/escalation-ladder.md +3 -3
- package/skills/create-campaign-v2/references/final-handoff-contract.md +3 -3
- package/skills/create-campaign-v2/references/gold-standard-message-examples.md +294 -239
- package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +13 -9
- package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +4 -4
- package/skills/create-campaign-v2/references/lead-validation-preview.md +1 -1
- package/skills/create-campaign-v2/references/parallel-critique-protocol.md +10 -10
- package/skills/create-campaign-v2/references/sample-validation-loop.md +3 -3
- package/skills/create-campaign-v2/references/{thomas-revision-filters.md → sellable-cleanup-rules.md} +13 -12
- package/skills/create-campaign-v2/references/step-15-re-cascade.md +1 -1
- package/skills/create-campaign-v2/references/thomas-variant-selection.md +1 -1
- package/skills/create-campaign-v2/references/validation-criteria.md +16 -13
- package/skills/create-campaign-v2-tail/SKILL.md +7 -7
- package/skills/create-campaign-v2-validation/SKILL.md +17 -8
- package/skills/generate-messages/SKILL.md +157 -93
- package/skills/research/config.json +9 -0
- package/skills/create-campaign-v2/references/gold-standard-runtime-message-pack.md +0 -252
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Gold-Standard Message Patterns
|
|
2
2
|
|
|
3
|
-
Use these patterns when validating or drafting
|
|
3
|
+
Use these patterns when validating or drafting Sellable campaign messages.
|
|
4
4
|
|
|
5
5
|
The priority is not "write generally good outbound." The priority is:
|
|
6
6
|
|
|
@@ -193,14 +193,15 @@ Shape:
|
|
|
193
193
|
- plain signal mention first
|
|
194
194
|
- one line that makes the relevance feel honest
|
|
195
195
|
- simple product framing
|
|
196
|
-
-
|
|
196
|
+
- specific low-friction next step
|
|
197
197
|
- optional short `PS` with proof as the final line
|
|
198
198
|
|
|
199
199
|
Prefer:
|
|
200
200
|
|
|
201
201
|
- lowercase or casual casing when the motion supports it
|
|
202
|
-
- an honest line like "hope this is relevant" or "so
|
|
203
|
-
-
|
|
202
|
+
- an honest line like "hope this is relevant" or "so may be off, but this seemed relevant"
|
|
203
|
+
- a concrete CTA that names the useful conversation or asset
|
|
204
|
+
- binary options only when the brief explicitly supports two real next steps
|
|
204
205
|
- direct wording over polished marketing language
|
|
205
206
|
|
|
206
207
|
Avoid:
|
|
@@ -229,11 +230,11 @@ Use only when event, signal, and hiring hooks are unavailable.
|
|
|
229
230
|
|
|
230
231
|
This is the fallback most likely to drift into bland copy, so keep it tight.
|
|
231
232
|
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
category
|
|
233
|
+
Use the proof-led fallback logic below directly. Do not retrieve a deleted
|
|
234
|
+
stack-replacement archive example as copy. The useful rhythm is: observed
|
|
235
|
+
current-state → what breaks → product-name-first mechanism → strongest true
|
|
236
|
+
proof or useful CTA. That rhythm generalizes across proof-led fallbacks even
|
|
237
|
+
when the category is not literally stack replacement.
|
|
237
238
|
|
|
238
239
|
Shape:
|
|
239
240
|
|
|
@@ -277,6 +278,9 @@ Prefer:
|
|
|
277
278
|
- product-name-first mechanism lines when the product can be named cleanly
|
|
278
279
|
- a short `PS` for social proof, backing, prior-company proof, or category-first
|
|
279
280
|
proof when that proof is real and would otherwise bloat the main body
|
|
281
|
+
- backing proof in a `PS` must translate into buyer value, not seller focus:
|
|
282
|
+
`backed by [X] to help [buyer segment] [buyer outcome]` beats
|
|
283
|
+
`backed by [X] and focused on [category/problem]`
|
|
280
284
|
- if a `PS` is used, keep it to the final line of the message
|
|
281
285
|
- short words and plain sentences a busy buyer can scan fast
|
|
282
286
|
- one sentence per line in the final draft when the channel is InMail or email
|
|
@@ -19,7 +19,7 @@ Status: confirmed
|
|
|
19
19
|
Mode: DRY MODE (no DB mutation)
|
|
20
20
|
Template Used: event-led canonical template
|
|
21
21
|
Primary Example: Example 1 — Revvix / Spektion Event-Led Security
|
|
22
|
-
Secondary Influence: Example
|
|
22
|
+
Secondary Influence: Example 6 — Useful CTA Shapes (binary option)
|
|
23
23
|
Lead Sample Basis: 3 validated leads (Dana Patel — VP Security Eng at Arco;
|
|
24
24
|
Mariko Stein — Head of AppSec at Fernway; Ben Oduya — Director, Vuln Mgmt
|
|
25
25
|
at Plantform)
|
|
@@ -52,7 +52,7 @@ No other tokens are allowed in this campaign.
|
|
|
52
52
|
|
|
53
53
|
## Token Adherence Table
|
|
54
54
|
|
|
55
|
-
| Sample | Supported Tokens Only | All Tokens Resolved | Proof Safe | Personalization Grounded |
|
|
55
|
+
| Sample | Supported Tokens Only | All Tokens Resolved | Proof Safe | Personalization Grounded | Sellable Cleanup Rules | Result |
|
|
56
56
|
| ------ | --------------------- | ------------------- | ---------- | ------------------------ | -------------- | ------ |
|
|
57
57
|
| Dana | yes | yes | yes | yes | pass | pass |
|
|
58
58
|
| Mariko | yes | yes | yes | yes | pass | pass |
|
|
@@ -135,7 +135,7 @@ No other tokens are allowed in this campaign.
|
|
|
135
135
|
- Best bridge: **Candidate A** — single-line transition from pain to
|
|
136
136
|
mechanism without editorializing.
|
|
137
137
|
- Best CTA: **Candidate C** — "Happy to grab coffee or send a short
|
|
138
|
-
overview first" is the binary option from Example
|
|
138
|
+
overview first" is the binary option from Example 6 and matches the
|
|
139
139
|
low-pressure event motion better than A's open-ended close.
|
|
140
140
|
- Assembly note: clean combination — opener from C, bridge + mechanism from
|
|
141
141
|
A, CTA from C, plus a new short `PS` carrying the rank-5 founder proof
|
|
@@ -203,7 +203,7 @@ No other tokens are allowed in this campaign.
|
|
|
203
203
|
generic credibility sentence."
|
|
204
204
|
- Token fill rules are declared once, with source fields and fallbacks, and
|
|
205
205
|
the adherence table reports pass/fail per lead.
|
|
206
|
-
- The "What Good Looks Like" bar in `
|
|
206
|
+
- The "What Good Looks Like" bar in `sellable-cleanup-rules.md` is met:
|
|
207
207
|
sharp voice, grounded personalization, motion-aligned structure, useful
|
|
208
208
|
CTA proportional to signal.
|
|
209
209
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
# Parallel Critique Protocol
|
|
2
2
|
|
|
3
|
-
This reference governs the optional Step 15 critique pass
|
|
4
|
-
|
|
3
|
+
This reference governs the optional Step 15 critique pass. Load this file
|
|
4
|
+
whenever `messaging.critique.enabled === true`
|
|
5
5
|
in `core/auto-execute.yaml`. When the flag is `false`, the plain Step 15
|
|
6
6
|
path runs unchanged and none of the protocol below applies.
|
|
7
7
|
|
|
8
8
|
## Principle
|
|
9
9
|
|
|
10
10
|
Step 15 (`auto-execute-messaging`) already generates messages under the
|
|
11
|
-
|
|
11
|
+
offline-validation token contract. The critique pass is a bounded, opt-in quality
|
|
12
12
|
lens on top of that output. It is NOT a second drafting pass. It never
|
|
13
13
|
invents new tokens, new proof, or new personalization, and it never
|
|
14
14
|
ships a rewrite that violates the token contract.
|
|
@@ -20,7 +20,7 @@ The critique pass is:
|
|
|
20
20
|
- **Parallel.** Three fixed critic groups (targeting, copy, voice)
|
|
21
21
|
run in parallel and return structured JSON.
|
|
22
22
|
- **Synthesized.** One synthesis step merges the three voices into a
|
|
23
|
-
single rewrite and re-runs the
|
|
23
|
+
single rewrite and re-runs the offline-validation finalizer pass.
|
|
24
24
|
- **Budget-capped.** A trip on `budgetUsdCap` HALTS critique for the
|
|
25
25
|
remaining sample and continues the plain tail. Cost never explodes
|
|
26
26
|
silently.
|
|
@@ -47,8 +47,8 @@ calibration.
|
|
|
47
47
|
- `lead-sample.json`, `lead-filter.md`, `brief.md` (read-only — these
|
|
48
48
|
are the same artifacts the plain drafter used).
|
|
49
49
|
- `messaging.critique.*` config values from `auto-execute.yaml`.
|
|
50
|
-
- The
|
|
51
|
-
`references/
|
|
50
|
+
- The offline-validation token contract rules in
|
|
51
|
+
`references/sellable-cleanup-rules.md`.
|
|
52
52
|
|
|
53
53
|
## Step Shape
|
|
54
54
|
|
|
@@ -201,7 +201,7 @@ the protocol file).
|
|
|
201
201
|
|
|
202
202
|
Rules:
|
|
203
203
|
|
|
204
|
-
1. **Token contract first.** The synthesizer enforces the
|
|
204
|
+
1. **Token contract first.** The synthesizer enforces the offline-validation
|
|
205
205
|
token contract verbatim:
|
|
206
206
|
|
|
207
207
|
- Use only tokens documented in `brief.md` as supported fields.
|
|
@@ -216,7 +216,7 @@ Rules:
|
|
|
216
216
|
voice. Do not blend two motions into one rewrite.
|
|
217
217
|
|
|
218
218
|
3. **Finalizer pass last.** If `synthesis.enforceFinalizerPass` is
|
|
219
|
-
`true` (default), re-run the
|
|
219
|
+
`true` (default), re-run the offline-validation finalizer pass on the
|
|
220
220
|
synthesis output. The finalizer is the last guardrail against
|
|
221
221
|
critic-introduced token drift. A finalizer failure falls back to
|
|
222
222
|
the plain message for that row.
|
|
@@ -346,14 +346,14 @@ passes.
|
|
|
346
346
|
|
|
347
347
|
## Hard Rules
|
|
348
348
|
|
|
349
|
-
- Critique is OFF by default.
|
|
349
|
+
- Critique is OFF by default. The plain campaign tail never flips the flag.
|
|
350
350
|
- Sample size is bounded by `messaging.critique.sampleSize`. The
|
|
351
351
|
pass NEVER runs against the full cohort.
|
|
352
352
|
- Three critic groups only: targeting, copy, voice. Do NOT add a
|
|
353
353
|
fourth.
|
|
354
354
|
- Every critic returns the structured JSON envelope above. Free-form
|
|
355
355
|
critic output is discarded.
|
|
356
|
-
- The synthesizer enforces the
|
|
356
|
+
- The synthesizer enforces the offline-validation token contract verbatim.
|
|
357
357
|
- The synthesis step MUST re-run the finalizer pass when
|
|
358
358
|
`enforceFinalizerPass === true` (default).
|
|
359
359
|
- Opus is reserved for the highest-value subset only and gated
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Sample Validation Loop
|
|
2
2
|
|
|
3
|
-
This reference governs Step 14 (`validate-sample`) of the
|
|
3
|
+
This reference governs Step 14 (`validate-sample`) of the
|
|
4
4
|
autonomous tail. Load this file before enriching + scoring the sample, and
|
|
5
5
|
on every revision round.
|
|
6
6
|
|
|
@@ -243,9 +243,9 @@ Action: autonomous `update_campaign_brief` with the specific diagnostic
|
|
|
243
243
|
(e.g. "add case-study proof for pain point Y"). Rerun sample. Increment
|
|
244
244
|
revisionRound.
|
|
245
245
|
|
|
246
|
-
#### Worked example — horizontal-SaaS seniority drift
|
|
246
|
+
#### Worked example — horizontal-SaaS seniority drift
|
|
247
247
|
|
|
248
|
-
Symptom observed during
|
|
248
|
+
Symptom observed during an Ambral walkthrough: 14/30 (47%)
|
|
249
249
|
sample was FIT+MAYBE, but the MAYBE cluster was driven by sub-D-round
|
|
250
250
|
"VP Customer Success" titles. These rows match the title whitelist but
|
|
251
251
|
likely don't own budget at that stage.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Sellable Cleanup Rules
|
|
2
2
|
|
|
3
|
-
Use these filters before
|
|
3
|
+
Use these filters before offline message validation is marked `confirmed`.
|
|
4
4
|
|
|
5
5
|
Read "What Good Looks Like" first. These are the positive targets. Use
|
|
6
6
|
"Automatic Revisions" as the rejection backstop, not the primary lens.
|
|
@@ -75,6 +75,7 @@ Revise or reject the sample when any of these happen.
|
|
|
75
75
|
- **category-level opener used when a per-lead signal exists** — if `lead-sample.json` carries any per-lead signal (post, hire, visible tool, topic engagement), the opener must reference it. Category-level openers of shape `"Most [category] teams still do X by hand"` are only acceptable when zero per-lead signal is in the sample. When a category-level opener is used as fallback, Findings must flag it explicitly
|
|
76
76
|
- **mind-reading from engagement signals** — a topic engagement, post, public activity, role, company, or hiring trigger does not prove buyer intent. Reject phrases like `"AI-GTM stack is clearly on your mind"`, `"you're clearly focused on..."`, `"obviously relevant"`, or `"already thinking about..."` unless that exact priority is explicitly present in `lead-sample.json`. Translate to low-certainty buyer context or omit the signal from copy.
|
|
77
77
|
- **source-y signal narration** — reject `"saw you on..."`, `"saw you engaging with..."`, `"you commented on..."`, `"your LinkedIn activity..."`, `"you might not remember the thread..."`, `"found you through [source] and your role looked close..."`, or any line that makes the recipient feel watched unless the chosen archived motion is intentionally self-aware about the signal. For sender-owned LinkedIn post sources, a light first-person acknowledgment is allowed when row data proves a reaction/comment: `"appreciate you showing some love on my post about [topic]"` or `"thanks for showing support on my [topic] post"`. Do not name a comment unless comment text is present. Follow the acknowledgment with a soft relevance bridge before broad pain/product copy, e.g. `"figured this might be relevant if LinkedIn is becoming more of a GTM channel for [company]"`. For third-party LinkedIn-post-sourced campaigns, a topic-level bridge is allowed when it explains why the note exists and stays apologetically uncertain: `"saw you in a few conversations about [topic], so may be off, but this seemed relevant."`, `"saw you in a few conversations around [topic], so hope this is relevant."`, or `"found you in a thread about [topic], so may be off, but this seemed relevant."` Reserve `"raise your hand"` language for explicit lead-magnet comments, replies, or opt-ins. Translate the signal into natural buyer context or omit it.
|
|
78
|
+
- **sender-owned source rendered as third-party** — hard fail when the source post is sender-owned and the draft says `"found you in a thread"`, `"saw you in a thread"`, `"saw you in conversations"`, or `"saw you in a few conversations"` as if the post were third-party. For sender-owned sources, the copy must either use a light first-person acknowledgment plus a soft relevance bridge, or omit the source line. If multiple senders may send the campaign, or the final sender/source-owner match is ambiguous, do not assume a specific `my post` voice or name a specific sender; omit the sender-owned source line until row-level sender ownership is proven. Neutral low-certainty thread/source language is only for truly third-party sources.
|
|
78
79
|
- **fake line-to-line continuity** — reject line stacks where the source acknowledgment, relevance bridge, product line, and CTA do not actually build on each other. Each line must make the next line feel earned. If two adjacent lines could be swapped, deleted, or joined with `"anyway"` without changing the meaning, the transition is fake. In sender-owned post campaigns, the chain should be: support on my post -> why this topic may matter for the company -> what the product/problem does about that same topic -> low-friction next step.
|
|
79
80
|
- **assumptive title-fit opener** — reject `"Your [role] role at [company] looked close to this problem"` or `"looked close to this outbound campaign problem"`. This asserts fit from title/company. Keep the apologetic uncertainty instead: `"may be off, but if [workflow] is relevant to what you're working on..."`.
|
|
80
81
|
- **internal-metric flex** — reject compute time, token/cache details, model names, agent-counts, orchestration internals, or similar process metrics unless the brief proves the buyer cares about that exact detail. `~5 min of compute per message` is not buyer value by itself.
|
|
@@ -99,6 +100,7 @@ Revise or reject the sample when any of these happen.
|
|
|
99
100
|
- **full titles in the PS when the bare role word would read more natural** — "our CEO [did X]" reads more natural than "CEO Alex, 2x founder, [did X]". Drop titles unless the title itself is the proof
|
|
100
101
|
- more than two proof beats in the PS (three or more reads as a resume dump)
|
|
101
102
|
- a proof beat that is not tied to the buyer's situation — proof should explain why this sender gets the buyer's pain, not just list credentials
|
|
103
|
+
- **backing proof ends in seller-focus copy** — reject `backed by [X] and focused on [category/problem]`. Keep the backing only if the same line turns into buyer value, e.g. `backed by [X] to help [buyer segment] [buyer outcome]`; otherwise cut the PS
|
|
102
104
|
|
|
103
105
|
**Motion alignment**
|
|
104
106
|
|
|
@@ -453,17 +455,17 @@ Tell #8 hardcoded signoff, Tell #10 vague-proof) overlap with
|
|
|
453
455
|
Filters 3 and 6. This is intentional — the catalog is the canonical
|
|
454
456
|
enumeration; Filter 8 is the catalog-driven check. Filters 3 and 6
|
|
455
457
|
remain as human-readable explanations of specific high-priority
|
|
456
|
-
tell classes, but the actual detection logic in
|
|
458
|
+
tell classes, but the actual detection logic in offline validation reads from
|
|
457
459
|
`ai-tells.md`.
|
|
458
460
|
|
|
459
461
|
**Adding new tells.** When UAT surfaces a new AI-tell pattern, add
|
|
460
462
|
it as `Tell #N` in `ai-tells.md` with Pattern / Why / Allowed
|
|
461
|
-
alternative / Severity. The next
|
|
463
|
+
alternative / Severity. The next offline validation run picks it up
|
|
462
464
|
automatically. Update
|
|
463
465
|
`tests/scripts/skill-references-substance-filters.test.ts` if the
|
|
464
466
|
new tell needs regression coverage.
|
|
465
467
|
|
|
466
|
-
**Example of a violation** (
|
|
468
|
+
**Example of a violation** (Patientdesk regression example, pre-catalog —
|
|
467
469
|
Tell #1 body-level self-introduction):
|
|
468
470
|
|
|
469
471
|
> "Hey Bonnie — Oncel here. My co-founders and I ran our own dental
|
|
@@ -519,7 +521,7 @@ Do not patch a weak message by inventing stronger personalization.
|
|
|
519
521
|
|
|
520
522
|
## Dry-Mode Discipline
|
|
521
523
|
|
|
522
|
-
|
|
524
|
+
Offline dry mode is validation, not production drafting.
|
|
523
525
|
|
|
524
526
|
- use only `brief.md`, `lead-filter.md`, and `lead-sample.json`
|
|
525
527
|
- do not fetch new research
|
|
@@ -530,19 +532,18 @@ Phase 84 dry mode is validation, not production drafting.
|
|
|
530
532
|
- retrieve broadly, but preserve one primary example and borrow from at most one
|
|
531
533
|
narrow secondary influence
|
|
532
534
|
|
|
533
|
-
##
|
|
535
|
+
## Critique Rewrite Addendum
|
|
534
536
|
|
|
535
537
|
These filters are also the gate on any critique rewrite shipped by the
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
on, a rewritten message must still clear:
|
|
538
|
+
parallel critique protocol (see `references/parallel-critique-protocol.md`).
|
|
539
|
+
When the critique flag is on, a rewritten message must still clear:
|
|
539
540
|
|
|
540
541
|
- every "Automatic Revisions" check above (jargon, resume-list PS, stacked
|
|
541
542
|
sentences, weak hooks, etc.)
|
|
542
|
-
- the
|
|
543
|
+
- the offline-validation token contract: only supported tokens from the brief, no
|
|
543
544
|
unresolved `{{token}}`, no invented proof, no personalization that can't
|
|
544
545
|
be traced to `lead-sample.json`
|
|
545
|
-
- the
|
|
546
|
+
- the offline-validation finalizer pass when `synthesis.enforceFinalizerPass` is
|
|
546
547
|
`true` (default)
|
|
547
548
|
|
|
548
549
|
If a rewrite fails any of these, the critique pass falls back to the
|
|
@@ -63,7 +63,7 @@ rows graduated.
|
|
|
63
63
|
})
|
|
64
64
|
|
|
65
65
|
5. re-check token contract on the cascaded subset (strict mode default)
|
|
66
|
-
— see references/
|
|
66
|
+
— see references/sellable-cleanup-rules.md + gold-standard-message-patterns.md
|
|
67
67
|
|
|
68
68
|
6. go back to step 1 until selectedCellCount == 0
|
|
69
69
|
```
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Thomas Variant Selection
|
|
2
2
|
|
|
3
|
-
This reference governs which rows in a
|
|
3
|
+
This reference governs which rows in a critique sample earn
|
|
4
4
|
an Opus refinement rewrite. Load this file only when
|
|
5
5
|
`messaging.critique.enabled === true` AND
|
|
6
6
|
`messaging.critique.opus.enabled === true` in
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
# Validation Criteria
|
|
2
2
|
|
|
3
|
-
|
|
4
|
-
goal is to preserve the brief thesis while proving that
|
|
5
|
-
message direction hold up against real preview evidence.
|
|
3
|
+
Offline validation is a chained-artifact validation pass over the approved
|
|
4
|
+
campaign brief. The goal is to preserve the brief thesis while proving that
|
|
5
|
+
leads, filters, and message direction hold up against real preview evidence.
|
|
6
6
|
|
|
7
7
|
## Primary Contract
|
|
8
8
|
|
|
@@ -10,7 +10,7 @@ message direction hold up against real preview evidence.
|
|
|
10
10
|
- validation/debug artifacts are optional debug/UAT diagnostics, not durable campaign state.
|
|
11
11
|
- normal customer runs should not expose local draft files.
|
|
12
12
|
- resume and handoff read campaign state before debug files.
|
|
13
|
-
- `CampaignOffer.campaignBrief` is the durable
|
|
13
|
+
- `CampaignOffer.campaignBrief` is the durable campaign thesis input;
|
|
14
14
|
`brief.md` is its debug copy
|
|
15
15
|
- `lead-review.md` and `lead-sample.json` are the required outputs of lead preview
|
|
16
16
|
- `lead-filter.md` is the primary output of the middle step
|
|
@@ -28,7 +28,7 @@ Allowed:
|
|
|
28
28
|
|
|
29
29
|
Not allowed:
|
|
30
30
|
|
|
31
|
-
- rewrite the
|
|
31
|
+
- rewrite the approved campaign thesis in `brief.md`
|
|
32
32
|
- create `lead-filter.md`
|
|
33
33
|
- create `message-validation.md`
|
|
34
34
|
- mutate campaign state
|
|
@@ -87,13 +87,12 @@ Required:
|
|
|
87
87
|
the brief justifies absence with reference to a specific archived winner.
|
|
88
88
|
If a candidate uses `two options:`, option `a)` and option `b)` must be
|
|
89
89
|
separated by a blank line so the CTA scans cleanly on mobile.
|
|
90
|
-
- **All
|
|
91
|
-
PASS per candidate.** A candidate that fails
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
the offending line).
|
|
90
|
+
- **All Sellable cleanup rules, including all 8 substance filters from
|
|
91
|
+
`sellable-cleanup-rules.md`, MUST PASS per candidate.** A candidate that fails
|
|
92
|
+
any cleanup rule or substance filter is BLOCKED. The Finalizer Pass CANNOT
|
|
93
|
+
select a blocked candidate. If all 3 candidates fail, route to
|
|
94
|
+
`revise-message` with the failure reasons enumerated per candidate (cite the
|
|
95
|
+
rule/filter name and the offending line).
|
|
97
96
|
|
|
98
97
|
## Lead Preview Expectations
|
|
99
98
|
|
|
@@ -254,7 +253,7 @@ The sample set must:
|
|
|
254
253
|
- contain no invented proof, metrics, logos, or customer names
|
|
255
254
|
- keep proof claims inside the brief's safe-claims boundary
|
|
256
255
|
- reject personalization that cannot be traced back to `lead-sample.json`
|
|
257
|
-
- apply
|
|
256
|
+
- apply Sellable cleanup rules before the step is marked `confirmed`
|
|
258
257
|
- choose the highest-specificity validated strategy available in this order:
|
|
259
258
|
event-led, signal-led, job-post-led, then proof-led specialist fallback
|
|
260
259
|
- retrieve against the full archived gold-standard library and choose a
|
|
@@ -328,6 +327,10 @@ that does Y` anchor sentence before any action breakdown, then one action
|
|
|
328
327
|
with no anchor. Use "I" voice if the sender is the founder; "our CEO",
|
|
329
328
|
"our team", or "we" otherwise. At most two proof beats. No three-credential
|
|
330
329
|
resume lists
|
|
330
|
+
- reject backing PS lines that describe the seller's focus instead of the
|
|
331
|
+
buyer's outcome, such as `backed by [X] and focused on [category/problem]`.
|
|
332
|
+
Backing proof only survives when the same line translates to buyer value,
|
|
333
|
+
e.g. `backed by [X] to help [buyer segment] [buyer outcome]`
|
|
331
334
|
- samples in one set must read like siblings from one campaign, not three
|
|
332
335
|
experiments
|
|
333
336
|
- reject fallback drafts that lead with generic "most teams..." copy without a
|
|
@@ -379,7 +379,7 @@ templateRevision: "current" })` until the first current-revision generated
|
|
|
379
379
|
Generate Message cell, and do not add "one more wait" for a stronger sample.
|
|
380
380
|
Remaining review/process sample rows can continue processing in the background.
|
|
381
381
|
4. Read the first ready generated message back via `get_rows` (full) and
|
|
382
|
-
sanity-check that sample against the
|
|
382
|
+
sanity-check that sample against the offline-validation token contract: no unresolved
|
|
383
383
|
`{{tokens}}`, no invented proof, one sentence per line, etc.
|
|
384
384
|
5. If the sample fails the token contract, diagnose brief-vs-list
|
|
385
385
|
(same revision loop as Step 14) and escalate if over
|
|
@@ -403,17 +403,17 @@ strings, which is why Step 16 requires Step 15 to be complete.
|
|
|
403
403
|
|
|
404
404
|
1. Observe the review-sample messages on the same sample that passed
|
|
405
405
|
validation.
|
|
406
|
-
2. If `messaging.critique.enabled` is true
|
|
406
|
+
2. If `messaging.critique.enabled` is true, run the
|
|
407
407
|
bounded critique pass on the sample output per
|
|
408
408
|
`references/parallel-critique-protocol.md`. The pass runs on at
|
|
409
409
|
most `messaging.critique.sampleSize` rows, sends each row through
|
|
410
410
|
three parallel critics (targeting / copy / voice) that return
|
|
411
411
|
structured JSON, and merges the voices in a synthesis step that
|
|
412
|
-
enforces the
|
|
412
|
+
enforces the offline-validation token contract verbatim and re-runs the
|
|
413
413
|
finalizer pass. Any rewrite that invents proof or uses an
|
|
414
414
|
unsupported token falls back to the plain generated message. A
|
|
415
415
|
trip of `messaging.critique.budgetUsdCap` HALTS critique for the
|
|
416
|
-
remaining sample and continues the plain tail.
|
|
416
|
+
remaining sample and continues the plain tail. The plain campaign tail reads
|
|
417
417
|
the flag but never flips it; critique stays off until the flag is
|
|
418
418
|
deliberately enabled.
|
|
419
419
|
3. If `messaging.critique.opus.enabled` is also true, route the
|
|
@@ -512,7 +512,7 @@ calling any mutating tool; if the campaign is already running, skip
|
|
|
512
512
|
approve-batch / start_campaign / update_campaign and just confirm.
|
|
513
513
|
|
|
514
514
|
Workspace/sender mismatch at greenlight time aborts the start with the
|
|
515
|
-
same invariant
|
|
515
|
+
same invariant offline validation enforces.
|
|
516
516
|
|
|
517
517
|
## Threshold Trips and Logging
|
|
518
518
|
|
|
@@ -546,7 +546,7 @@ runs.
|
|
|
546
546
|
|
|
547
547
|
| File | Load when |
|
|
548
548
|
| ------------------------------------------------ | ------------------------------------------------------------------------- |
|
|
549
|
-
| `references/approval-gate-framing.md` |
|
|
549
|
+
| `references/approval-gate-framing.md` | Approval gate, before showing the approval packet |
|
|
550
550
|
| `references/watch-link-handoff.md` | First brief handoff + explicit link recovery only |
|
|
551
551
|
| `references/post-mint-source-materialization.md` | Step 13, before importing normal-discovery or legacy campaignless sources |
|
|
552
552
|
| `references/sample-validation-loop.md` | Step 14, before enriching + scoring the sample |
|
|
@@ -554,7 +554,7 @@ runs.
|
|
|
554
554
|
| `references/final-handoff-contract.md` | Step 16, and every Claude greenlight turn |
|
|
555
555
|
| `references/parallel-critique-protocol.md` | Step 15 when `messaging.critique.enabled` is true |
|
|
556
556
|
| `references/thomas-variant-selection.md` | Step 15 when `messaging.critique.opus.enabled` is true |
|
|
557
|
-
| `references/
|
|
557
|
+
| `references/sellable-cleanup-rules.md` | Any critique rewrite, before persisting |
|
|
558
558
|
| `core/auto-execute.yaml` | Start of Step 13, load once; all tail steps read parsed values |
|
|
559
559
|
| `core/auto-execute.README.md` | When tuning `auto-execute.yaml` knobs or reviewing threshold-trip logs |
|
|
560
560
|
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: create-campaign-v2-validation
|
|
3
|
-
description: Validate
|
|
3
|
+
description: Validate an approved `brief.md` through chained offline artifacts before any live campaign state exists.
|
|
4
4
|
visibility: internal
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Create Campaign v2 Validation
|
|
8
8
|
|
|
9
9
|
<role>
|
|
10
|
-
You are the
|
|
11
|
-
is to validate
|
|
10
|
+
You are the offline validation orchestrator for create-campaign-v2. Your job
|
|
11
|
+
is to validate an approved `brief.md` through chained draft artifacts without
|
|
12
12
|
creating live campaign state.
|
|
13
13
|
</role>
|
|
14
14
|
|
|
@@ -41,7 +41,7 @@ Validated draft directory:
|
|
|
41
41
|
|
|
42
42
|
<rules>
|
|
43
43
|
|
|
44
|
-
- `brief.md` is the stable
|
|
44
|
+
- `brief.md` is the stable approved input and remains the thesis source.
|
|
45
45
|
- `lead-review.md` and `lead-sample.json` are the required outputs of `find leads`.
|
|
46
46
|
- `lead-filter.md` is the primary output of `filter leads`.
|
|
47
47
|
- `rubric.json` is optional and secondary to `lead-filter.md`.
|
|
@@ -49,7 +49,7 @@ Validated draft directory:
|
|
|
49
49
|
- Run validation serially in this order: `find leads`, `filter leads`, `generate message`.
|
|
50
50
|
- Resume state is based on the presence and completeness of the chained artifacts,
|
|
51
51
|
not on inline validation blocks inside `brief.md`.
|
|
52
|
-
- Preserve the
|
|
52
|
+
- Preserve the approved thesis. Do not rewrite product, ICP, offer, or message
|
|
53
53
|
hypothesis sections during preview validation.
|
|
54
54
|
- Every artifact write uses `tmp + rename` so a failed write leaves the prior
|
|
55
55
|
artifact intact.
|
|
@@ -222,7 +222,7 @@ Orchestration requirements:
|
|
|
222
222
|
same company as the brief
|
|
223
223
|
- draft 3 internal candidates and run a Finalizer Pass that combines the
|
|
224
224
|
best opener, proof sentence, bridge, and CTA across them into one winner
|
|
225
|
-
- pass the
|
|
225
|
+
- pass the Sellable cleanup rules before writing findings
|
|
226
226
|
- pass the source-transition gate before writing findings. For sender-owned
|
|
227
227
|
LinkedIn post sources where the sample proves a reaction/comment, a light
|
|
228
228
|
first-person acknowledgment is allowed (`appreciate you showing some love on
|
|
@@ -230,8 +230,17 @@ Orchestration requirements:
|
|
|
230
230
|
before broad problem or product copy (`figured this might be relevant if
|
|
231
231
|
LinkedIn is becoming more of a GTM channel for [company/team]`). Block drafts
|
|
232
232
|
that jump straight from the acknowledgment into generic `a lot of teams...` or
|
|
233
|
-
`most teams...` pain. For
|
|
234
|
-
|
|
233
|
+
`most teams...` pain. For sender-owned sources, third-party thread framing is
|
|
234
|
+
blocked unless the source is truly third-party: reject `found you in a thread`,
|
|
235
|
+
`saw you in a thread`, `saw you in conversations`, or `saw you in a few
|
|
236
|
+
conversations`. The message must either use the first-person acknowledgment
|
|
237
|
+
plus bridge or omit the source line. Use the first-person acknowledgment plus
|
|
238
|
+
bridge only when the final sender and source owner are proven to match. If
|
|
239
|
+
multiple senders may send the campaign, or the final sender/source-owner match
|
|
240
|
+
is ambiguous, do not assume `my post` or name a specific sender; omit the
|
|
241
|
+
sender-owned source line until row-level sender ownership is proven. Neutral
|
|
242
|
+
low-certainty source language is only for truly third-party post sources; keep
|
|
243
|
+
those source references topic-level and low-certainty.
|
|
235
244
|
- pass the line-continuity gate before writing findings. Each message line must
|
|
236
245
|
make the next line feel earned: source/post signal -> relevance bridge ->
|
|
237
246
|
product/problem -> next step. If two adjacent lines could be swapped, deleted,
|