@sellable/mcp 0.1.0
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/.claude-plugin/plugin.json +12 -0
- package/.mcp.json +9 -0
- package/README.md +355 -0
- package/dist/api.d.ts +21 -0
- package/dist/api.js +73 -0
- package/dist/auth.d.ts +60 -0
- package/dist/auth.js +246 -0
- package/dist/engage-memory.d.ts +63 -0
- package/dist/engage-memory.js +354 -0
- package/dist/index-dev.d.ts +2 -0
- package/dist/index-dev.js +17 -0
- package/dist/index.d.ts +7 -0
- package/dist/index.js +8 -0
- package/dist/server.d.ts +1 -0
- package/dist/server.js +499 -0
- package/dist/skills.d.ts +11 -0
- package/dist/skills.js +97 -0
- package/dist/tools/auth.d.ts +30 -0
- package/dist/tools/auth.js +124 -0
- package/dist/tools/blueprint-commit.d.ts +174 -0
- package/dist/tools/blueprint-commit.js +286 -0
- package/dist/tools/bootstrap.d.ts +64 -0
- package/dist/tools/bootstrap.js +246 -0
- package/dist/tools/campaigns.d.ts +589 -0
- package/dist/tools/campaigns.js +892 -0
- package/dist/tools/cells.d.ts +58 -0
- package/dist/tools/cells.js +48 -0
- package/dist/tools/context.d.ts +88 -0
- package/dist/tools/context.js +271 -0
- package/dist/tools/csv-domains.d.ts +73 -0
- package/dist/tools/csv-domains.js +464 -0
- package/dist/tools/csv-linkedin.d.ts +102 -0
- package/dist/tools/csv-linkedin.js +712 -0
- package/dist/tools/direct-campaigns.d.ts +240 -0
- package/dist/tools/direct-campaigns.js +250 -0
- package/dist/tools/engage-bootstrap.d.ts +94 -0
- package/dist/tools/engage-bootstrap.js +205 -0
- package/dist/tools/engage-discovery.d.ts +78 -0
- package/dist/tools/engage-discovery.js +150 -0
- package/dist/tools/engage-memory.d.ts +181 -0
- package/dist/tools/engage-memory.js +143 -0
- package/dist/tools/engage-state.d.ts +72 -0
- package/dist/tools/engage-state.js +62 -0
- package/dist/tools/enrichment.d.ts +167 -0
- package/dist/tools/enrichment.js +174 -0
- package/dist/tools/flow-preflight.d.ts +68 -0
- package/dist/tools/flow-preflight.js +138 -0
- package/dist/tools/framework.d.ts +44 -0
- package/dist/tools/framework.js +153 -0
- package/dist/tools/interaction-mode.d.ts +27 -0
- package/dist/tools/interaction-mode.js +102 -0
- package/dist/tools/leads.d.ts +2417 -0
- package/dist/tools/leads.js +2307 -0
- package/dist/tools/linkedin.d.ts +210 -0
- package/dist/tools/linkedin.js +229 -0
- package/dist/tools/navigation.d.ts +91 -0
- package/dist/tools/navigation.js +381 -0
- package/dist/tools/one-off.d.ts +229 -0
- package/dist/tools/one-off.js +273 -0
- package/dist/tools/processing.d.ts +70 -0
- package/dist/tools/processing.js +56 -0
- package/dist/tools/prompts.d.ts +211 -0
- package/dist/tools/prompts.js +210 -0
- package/dist/tools/provider-preflight.d.ts +21 -0
- package/dist/tools/provider-preflight.js +59 -0
- package/dist/tools/readiness.d.ts +261 -0
- package/dist/tools/readiness.js +510 -0
- package/dist/tools/rows.d.ts +126 -0
- package/dist/tools/rows.js +105 -0
- package/dist/tools/rubrics.d.ts +497 -0
- package/dist/tools/rubrics.js +681 -0
- package/dist/tools/senders.d.ts +44 -0
- package/dist/tools/senders.js +69 -0
- package/dist/tools/sequencer.d.ts +127 -0
- package/dist/tools/sequencer.js +194 -0
- package/dist/tools/tables.d.ts +35 -0
- package/dist/tools/tables.js +36 -0
- package/dist/tools/verify-row.d.ts +36 -0
- package/dist/tools/verify-row.js +38 -0
- package/dist/tools/workspaces.d.ts +140 -0
- package/dist/tools/workspaces.js +139 -0
- package/dist/utils/workspace-root.d.ts +1 -0
- package/dist/utils/workspace-root.js +39 -0
- package/package.json +46 -0
- package/skills/building-gtm-tables/SKILL.md +216 -0
- package/skills/building-gtm-tables/core/auto-execute.yaml +19 -0
- package/skills/building-gtm-tables/core/blueprint-schema.json +72 -0
- package/skills/building-gtm-tables/references/brief-to-blueprint.md +334 -0
- package/skills/building-gtm-tables/references/column-type-catalog.md +318 -0
- package/skills/building-gtm-tables/references/common-blueprints.fixtures.ts +199 -0
- package/skills/building-gtm-tables/references/common-blueprints.md +44 -0
- package/skills/building-gtm-tables/references/failure-taxonomy.md +197 -0
- package/skills/building-gtm-tables/references/uat-seed-prompts.md +37 -0
- package/skills/building-gtm-tables/references/verify-loop.md +74 -0
- package/skills/campaign-messages/SKILL.md +173 -0
- package/skills/campaign-messages/flow.v1.json +75 -0
- package/skills/craft-message/SKILL.md +401 -0
- package/skills/create-campaign/ARCHITECTURE.md +232 -0
- package/skills/create-campaign/DISCUSS.md +296 -0
- package/skills/create-campaign/FLOW_ASCII.md +240 -0
- package/skills/create-campaign/HOST-PARITY-CHECKLIST.md +49 -0
- package/skills/create-campaign/README.md +142 -0
- package/skills/create-campaign/SKILL.md +286 -0
- package/skills/create-campaign/context/README.md +67 -0
- package/skills/create-campaign/context/_TEMPLATE.md +12 -0
- package/skills/create-campaign/context/context.md +35 -0
- package/skills/create-campaign/context/learnings.md +16 -0
- package/skills/create-campaign/context/registry.json +19 -0
- package/skills/create-campaign/core/flow.v1.json +217 -0
- package/skills/create-campaign/core/policy.md +191 -0
- package/skills/create-campaign/core/providers/apollo.json +35 -0
- package/skills/create-campaign/core/providers/prospeo.json +34 -0
- package/skills/create-campaign/core/providers/registry.json +31 -0
- package/skills/create-campaign/core/providers/sales-nav.json +37 -0
- package/skills/create-campaign/core/providers/signal-discovery.json +42 -0
- package/skills/create-campaign/references/brief-template.md +64 -0
- package/skills/create-campaign/references/campaign-quality.md +84 -0
- package/skills/create-campaign/references/copy-calibration-examples.md +120 -0
- package/skills/create-campaign/references/offer-patterns.md +108 -0
- package/skills/create-campaign/references/provider-selection-strategy.md +212 -0
- package/skills/create-campaign/references/question-examples.md +167 -0
- package/skills/create-campaign/references/token-fill-examples.md +81 -0
- package/skills/create-campaign-brief/ARCHITECTURE.md +72 -0
- package/skills/create-campaign-brief/DISCUSS.md +64 -0
- package/skills/create-campaign-brief/README.md +176 -0
- package/skills/create-campaign-brief/SKILL.md +537 -0
- package/skills/create-campaign-brief/references/brief-synthesis-rules.md +100 -0
- package/skills/create-campaign-brief/references/brief-template.md +220 -0
- package/skills/create-campaign-brief/references/campaign-idea-options.md +30 -0
- package/skills/create-campaign-brief/references/copy-appendix-template.md +62 -0
- package/skills/create-campaign-brief/references/draft-lifecycle.md +23 -0
- package/skills/create-campaign-brief/references/examples/MANIFEST.json +89 -0
- package/skills/create-campaign-brief/references/examples/briefs/clover.md +223 -0
- package/skills/create-campaign-brief/references/examples/briefs/galley.md +222 -0
- package/skills/create-campaign-brief/references/examples/briefs/gelee.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/hey-digital.md +234 -0
- package/skills/create-campaign-brief/references/examples/briefs/persona.md +231 -0
- package/skills/create-campaign-brief/references/examples/briefs/revvix.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/sellable-dev.md +220 -0
- package/skills/create-campaign-brief/references/examples/briefs/superposition.md +233 -0
- package/skills/create-campaign-brief/references/examples/briefs/superpower.md +219 -0
- package/skills/create-campaign-brief/references/examples/briefs/westpark-villas.md +220 -0
- package/skills/create-campaign-brief/references/icp-lock-question-bank.md +43 -0
- package/skills/create-campaign-brief/references/messaging-inputs.md +58 -0
- package/skills/create-campaign-brief/references/output-acceptance-rubric.md +62 -0
- package/skills/create-campaign-brief/references/phase75-active-runtime-message-pack.md +248 -0
- package/skills/create-campaign-brief/references/phase75-canonical-brief-template.md +319 -0
- package/skills/create-campaign-brief/references/phase75-good-brief-and-messaging-examples.md +445 -0
- package/skills/create-campaign-brief/references/quick-research-protocol.md +39 -0
- package/skills/create-campaign-brief/references/reference-sheet-protocol.md +60 -0
- package/skills/create-campaign-brief/references/zero-shot-iteration-rules.md +66 -0
- package/skills/create-campaign-v2/SKILL.md +1619 -0
- package/skills/create-campaign-v2/core/auto-execute.README.md +219 -0
- package/skills/create-campaign-v2/core/auto-execute.yaml +121 -0
- package/skills/create-campaign-v2/core/flow.v2.json +1643 -0
- package/skills/create-campaign-v2/core/policy.md +82 -0
- package/skills/create-campaign-v2/references/ai-tells.md +253 -0
- package/skills/create-campaign-v2/references/approval-gate-framing.md +346 -0
- package/skills/create-campaign-v2/references/draft-lifecycle.md +110 -0
- package/skills/create-campaign-v2/references/escalation-ladder.md +119 -0
- package/skills/create-campaign-v2/references/filter-leads.md +495 -0
- package/skills/create-campaign-v2/references/final-handoff-contract.md +176 -0
- package/skills/create-campaign-v2/references/gold-standard-message-examples.md +394 -0
- package/skills/create-campaign-v2/references/gold-standard-message-patterns.md +314 -0
- package/skills/create-campaign-v2/references/gold-standard-message-validation-example.md +212 -0
- package/skills/create-campaign-v2/references/lead-validation-preview.md +172 -0
- package/skills/create-campaign-v2/references/parallel-critique-protocol.md +368 -0
- package/skills/create-campaign-v2/references/sample-validation-loop.md +289 -0
- package/skills/create-campaign-v2/references/step-13-import-leads.md +151 -0
- package/skills/create-campaign-v2/references/step-15-re-cascade.md +90 -0
- package/skills/create-campaign-v2/references/thomas-revision-filters.md +521 -0
- package/skills/create-campaign-v2/references/thomas-variant-selection.md +202 -0
- package/skills/create-campaign-v2/references/tier-routing-matrix.md +66 -0
- package/skills/create-campaign-v2/references/validation-criteria.md +367 -0
- package/skills/create-campaign-v2/references/watch-link-handoff.md +106 -0
- package/skills/create-campaign-v2-validation/SKILL.md +296 -0
- package/skills/create-post/SKILL.md +1308 -0
- package/skills/create-rubric/SKILL.md +251 -0
- package/skills/engage/SKILL.md +549 -0
- package/skills/engage/core/README.md +23 -0
- package/skills/engage/core/proven-searches.json +11 -0
- package/skills/engage/core/style-guide.template.md +47 -0
- package/skills/engage/core/tracked-people.json +10 -0
- package/skills/enrich-prospects/SKILL.md +97 -0
- package/skills/find-leads/SKILL.md +467 -0
- package/skills/generate-messages/SKILL.md +2361 -0
- package/skills/interview/SKILL.md +132 -0
- package/skills/interview/core/ENGAGE_STYLE_GUIDE.template.md +54 -0
- package/skills/interview/core/ICP.template.md +54 -0
- package/skills/interview/core/VOICE_PROFILE.template.md +101 -0
- package/skills/providers/apollo.md +520 -0
- package/skills/providers/prospeo.md +398 -0
- package/skills/providers/sales-nav.md +372 -0
- package/skills/providers/signal-discovery.md +495 -0
- package/skills/research/SKILL.md +258 -0
- package/skills/research/config.json +9 -0
- package/skills/research/override.md +13 -0
- package/skills/research-prospect/SKILL.md +99 -0
- package/skills/research-sender/SKILL.md +158 -0
- package/skills/workflow-sequences/SKILL.md +85 -0
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
# Step 13 — Import Leads Contract
|
|
2
|
+
|
|
3
|
+
This reference governs Step 13 (`auto-execute-leads`) of the Plan 85-02
|
|
4
|
+
autonomous tail. Load before calling `import_leads` and on every resume
|
|
5
|
+
into Step 13.
|
|
6
|
+
|
|
7
|
+
## Principle
|
|
8
|
+
|
|
9
|
+
Bounded review-batch sourcing + import happens AFTER atomic mint, not during.
|
|
10
|
+
The commit gate never calls `import_leads`; Step 13 is where the first real
|
|
11
|
+
review batch is pulled into the workspace. Do not spend credits on the full
|
|
12
|
+
source list until the user reviews the first batch and explicitly approves
|
|
13
|
+
expansion.
|
|
14
|
+
|
|
15
|
+
## Resolve Approved Source
|
|
16
|
+
|
|
17
|
+
Before importing, read `lead-source-intake.json` if it exists. Treat it as a
|
|
18
|
+
manifest, not a suggestion. Revalidate file metadata and confirmation tokens on
|
|
19
|
+
resume, and persist/recover materialized IDs so retries do not duplicate
|
|
20
|
+
source lead lists, searches, campaign table rows, or queued cells.
|
|
21
|
+
|
|
22
|
+
Supported branches:
|
|
23
|
+
|
|
24
|
+
- **No manifest / normal discovery** — use the existing provider import path.
|
|
25
|
+
- **Supplied LinkedIn profile CSV** — confirm `load_csv_linkedin_leads` only
|
|
26
|
+
after approval, then import into the campaign table with
|
|
27
|
+
`confirm_lead_list({ sourceLeadListId, targetLeadCount: importLimit })`.
|
|
28
|
+
Do **not** call `wait_for_lead_list_ready` for this branch; there is no
|
|
29
|
+
provider import job to wait on, and probing readiness can leave the campaign
|
|
30
|
+
in an import-failed state before `confirm_lead_list`.
|
|
31
|
+
- **Existing Sellable lead list** — revalidate the source list in the same
|
|
32
|
+
workspace, then reuse it with
|
|
33
|
+
`confirm_lead_list({ sourceLeadListId, targetLeadCount: importLimit })`.
|
|
34
|
+
Do **not** call `wait_for_lead_list_ready` for this branch.
|
|
35
|
+
- **Supplied domain/account CSV** — reuse or confirm `load_csv_domains`, keep
|
|
36
|
+
its `domainFilterId`, run a campaign-associated Prospeo people search with
|
|
37
|
+
`campaignOfferId`, provider prompt preflight, and `domainFilterId`, then
|
|
38
|
+
import the review batch from that search.
|
|
39
|
+
|
|
40
|
+
If the source file changed after preview, or the existing list is missing or
|
|
41
|
+
wrong-workspace, escalate before materialization. If a supplied-domain search
|
|
42
|
+
returns zero or too few usable people, preserve `domainFilterId` and ask
|
|
43
|
+
whether to widen role filters, add more domains, or abort. Never silently drop
|
|
44
|
+
the domain constraint.
|
|
45
|
+
|
|
46
|
+
## First-Import Path
|
|
47
|
+
|
|
48
|
+
Default case — no existing lead list bound to the campaign:
|
|
49
|
+
|
|
50
|
+
```text
|
|
51
|
+
import_leads({
|
|
52
|
+
campaignOfferId,
|
|
53
|
+
targetLeadCount: <importLimit from auto-execute.yaml; default 25>
|
|
54
|
+
})
|
|
55
|
+
```
|
|
56
|
+
|
|
57
|
+
Provider is inherited from the Phase 84 commit decision (not re-selected
|
|
58
|
+
here). Response returns `{ imported, skipped, duplicates }` — surface all
|
|
59
|
+
three to the escalation logic so dedup ratios are visible.
|
|
60
|
+
|
|
61
|
+
For supplied direct lists, `confirm_lead_list` must receive
|
|
62
|
+
`targetLeadCount: <importLimit>` or explicit `sourceRowIds` so a 100-row source
|
|
63
|
+
imports only the bounded review batch before greenlight.
|
|
64
|
+
|
|
65
|
+
## `mode=add` Two-Step Handshake
|
|
66
|
+
|
|
67
|
+
When importing into an existing workflow table (e.g. signal-discovery
|
|
68
|
+
overlay onto an existing Sales Nav cohort), `import_leads` with
|
|
69
|
+
`mode=add` requires a two-step handshake:
|
|
70
|
+
|
|
71
|
+
### Step 1 — First call returns `needsModeSelection=true`
|
|
72
|
+
|
|
73
|
+
```text
|
|
74
|
+
import_leads({
|
|
75
|
+
campaignOfferId,
|
|
76
|
+
mode: "add",
|
|
77
|
+
targetLeadCount: ...
|
|
78
|
+
})
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Response:
|
|
82
|
+
|
|
83
|
+
```text
|
|
84
|
+
{
|
|
85
|
+
needsModeSelection: true,
|
|
86
|
+
existingLeadListId: "lead_list_xyz",
|
|
87
|
+
...
|
|
88
|
+
}
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
This is NOT an error. It's the handshake. Do NOT retry the same call.
|
|
92
|
+
Do NOT treat this as a failure. Capture `existingLeadListId`.
|
|
93
|
+
|
|
94
|
+
### Step 2 — Second call passes `sourceLeadListId`
|
|
95
|
+
|
|
96
|
+
```text
|
|
97
|
+
import_leads({
|
|
98
|
+
campaignOfferId,
|
|
99
|
+
mode: "add",
|
|
100
|
+
sourceLeadListId: existingLeadListId,
|
|
101
|
+
targetLeadCount: ...
|
|
102
|
+
})
|
|
103
|
+
```
|
|
104
|
+
|
|
105
|
+
Response: actual import result `{ imported, skipped, duplicates }`.
|
|
106
|
+
|
|
107
|
+
## Dedup Ratio Surfacing
|
|
108
|
+
|
|
109
|
+
`import_leads` can produce wildly different outcomes depending on prior
|
|
110
|
+
imports into the same campaign. Surface all three counters to the tail
|
|
111
|
+
so escalation can distinguish "lane exhausted" from "good-looking import":
|
|
112
|
+
|
|
113
|
+
- **imported** — new rows added to the cohort
|
|
114
|
+
- **skipped** — rows that matched dedup keys (already in list)
|
|
115
|
+
- **duplicates** — rows that were in the raw pull but rejected by dedup
|
|
116
|
+
|
|
117
|
+
### Interpretation
|
|
118
|
+
|
|
119
|
+
| imported | skipped | Interpretation |
|
|
120
|
+
| ---------- | ---------- | --------------------------------------------------- |
|
|
121
|
+
| near limit | low | Fresh lane; good pull |
|
|
122
|
+
| low | near limit | Lane mostly exhausted (dedup against prior imports) |
|
|
123
|
+
| 0 | high | Lane fully exhausted — escalate as "lane exhausted" |
|
|
124
|
+
| 0 | 0 | Real zero-lead case — escalate as "hard fail" |
|
|
125
|
+
|
|
126
|
+
Observed signal-discovery run: 911 scraped / 548 skipped / 363 imported
|
|
127
|
+
(≈40% fresh). That's a "good-looking import" not a lane-exhausted
|
|
128
|
+
state — escalation should NOT fire.
|
|
129
|
+
|
|
130
|
+
## Zero-Leads Escalation
|
|
131
|
+
|
|
132
|
+
Per `escalation-ladder.md` condition #1: if `import_leads` returns 0
|
|
133
|
+
usable rows (imported = 0, skipped = 0), hard-fail escalate.
|
|
134
|
+
|
|
135
|
+
Distinction: 0 imported but high skipped = lane exhausted; this is NOT a
|
|
136
|
+
hard fail but DOES warrant surfacing to the operator — the campaign
|
|
137
|
+
cannot scale further without a new source lane.
|
|
138
|
+
|
|
139
|
+
## Hard Rules
|
|
140
|
+
|
|
141
|
+
- `import_leads` with `mode=add` is ALWAYS a two-step handshake. Never
|
|
142
|
+
treat the first `needsModeSelection=true` response as a failure.
|
|
143
|
+
- Dedup ratios (imported / skipped / duplicates) are always surfaced for
|
|
144
|
+
escalation-logic input.
|
|
145
|
+
- Zero-imported + zero-skipped ⇒ hard-fail escalate.
|
|
146
|
+
- Zero-imported + high-skipped ⇒ lane-exhausted operator notice (NOT a
|
|
147
|
+
silent proceed).
|
|
148
|
+
- `import_leads` is NOT called in atomic mint. Only in Step 13.
|
|
149
|
+
- `import_leads` is NOT called again in Step 14 (validate-sample). Full
|
|
150
|
+
cohort import is a Step 13 action, not a recovery action for a bad
|
|
151
|
+
sample.
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
# Step 15 — Message Re-Cascade Contract
|
|
2
|
+
|
|
3
|
+
This reference governs Step 15 (`auto-execute-messaging`) re-cascade
|
|
4
|
+
behavior when Step 14's validate-sample loop graduates additional rows
|
|
5
|
+
from pending → passed after the first `generate_messages` call has
|
|
6
|
+
already run.
|
|
7
|
+
|
|
8
|
+
Load whenever Step 15 is about to transition to
|
|
9
|
+
`awaiting-user-greenlight`, and on every resume into Step 15.
|
|
10
|
+
|
|
11
|
+
## Principle
|
|
12
|
+
|
|
13
|
+
Generate Message cells are cascade-scoped. If Step 14's rubric flips rows
|
|
14
|
+
from pending → passed AFTER Step 15 first observes messages for the review
|
|
15
|
+
batch, the new rows can sit pending with no message. Step 15 must explicitly
|
|
16
|
+
queue the newly-pending Generate Message cells for the review-batch subset.
|
|
17
|
+
|
|
18
|
+
Observed on manual Phase-85 signal-discovery run (2026-04-20): 15 new
|
|
19
|
+
rows graduated pending → passed mid-tail while `messagesCount` stayed
|
|
20
|
+
flat at 257. The new rows never got messages.
|
|
21
|
+
|
|
22
|
+
## When Re-Cascade Fires
|
|
23
|
+
|
|
24
|
+
Re-cascade runs whenever ALL of the following are true:
|
|
25
|
+
|
|
26
|
+
1. Step 15 has already observed the initial review-batch message cascade.
|
|
27
|
+
2. A subsequent check of rubric state shows rows that were pending at
|
|
28
|
+
first generate_messages time are now passed.
|
|
29
|
+
3. Those newly-passed rows do NOT yet have generated messages
|
|
30
|
+
(`messagesCount` flat relative to pre-cascade).
|
|
31
|
+
4. Step 15 has NOT yet transitioned to `awaiting-user-greenlight`.
|
|
32
|
+
|
|
33
|
+
If condition 4 already fired (i.e. we're in Step 16), the re-cascade
|
|
34
|
+
runs on resume into Step 15 if validate-sample was re-entered and new
|
|
35
|
+
rows graduated.
|
|
36
|
+
|
|
37
|
+
## Re-Cascade Loop Shape
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
1. paginate campaign table (get_rows_minimal, strip carryData) to
|
|
41
|
+
collect rowIds where:
|
|
42
|
+
- rubricStatus = "passed"
|
|
43
|
+
- messageStatus = "pending" OR messagesCount = 0
|
|
44
|
+
|
|
45
|
+
2. if newlyPassedRowIds.length == 0:
|
|
46
|
+
proceed to awaiting-user-greenlight
|
|
47
|
+
EXIT re-cascade loop
|
|
48
|
+
|
|
49
|
+
3. else:
|
|
50
|
+
queue_cells({
|
|
51
|
+
tableId,
|
|
52
|
+
cellIds: newlyPassedGenerateMessageCellIds
|
|
53
|
+
})
|
|
54
|
+
|
|
55
|
+
4. re-check token contract on the cascaded subset (strict mode default)
|
|
56
|
+
— see references/thomas-revision-filters.md + gold-standard-message-patterns.md
|
|
57
|
+
|
|
58
|
+
5. go back to step 1 until newlyPassedRowIds == 0
|
|
59
|
+
```
|
|
60
|
+
|
|
61
|
+
## Cap
|
|
62
|
+
|
|
63
|
+
Re-cascade must not loop indefinitely. Cap at 3 cascade iterations —
|
|
64
|
+
if after 3 cascades the newly-passed set is still growing, escalate
|
|
65
|
+
(the validate-sample loop is likely mis-configured or the rubric is
|
|
66
|
+
flapping).
|
|
67
|
+
|
|
68
|
+
## Interaction with Critique
|
|
69
|
+
|
|
70
|
+
When `messaging.critique.enabled=true`, the critique + finalizer pass
|
|
71
|
+
applies to the re-cascade subset same as the initial cohort. Budget
|
|
72
|
+
caps (`messaging.critique.budgetUsdCap`) are per-cascade, not
|
|
73
|
+
cumulative across cascades.
|
|
74
|
+
|
|
75
|
+
## Interaction with Token Contract
|
|
76
|
+
|
|
77
|
+
Token contract (`messaging.tokenContract: strict`) applies to every
|
|
78
|
+
cascade subset. A cascade message that fails token resolution is
|
|
79
|
+
persisted as pending (same as sample-level token failures) — not
|
|
80
|
+
silently skipped.
|
|
81
|
+
|
|
82
|
+
## Hard Rules
|
|
83
|
+
|
|
84
|
+
- Generate Message cells do not always auto-cascade on late-passed rows —
|
|
85
|
+
Step 15 must explicitly queue newly-pending Generate Message cells.
|
|
86
|
+
- Re-cascade iteration cap = 3. Trip escalates.
|
|
87
|
+
- `messagesCount` flat + rubric graduating rows ⇒ re-cascade required.
|
|
88
|
+
- Token contract enforcement applies per-cascade, not once-for-all.
|
|
89
|
+
- Re-cascade NEVER re-runs `import_leads`, `check_rubric`, or
|
|
90
|
+
`enrich_with_prospeo`. Those are Step 13 / Step 14 actions.
|