After many hours of looking at this, I think I'm brave enough to call these issues bugs in the Javascript 4.3 SDK
I have found workarounds (included below) for the following issues.
Bug #1
-- in PrintTask._setPrintParams(), the resulting Web_Map_as_JSON does not include MapView.rotation
Bug #2
-- in PrintTask._setPrintParams(), the resulting Web_Map_as_JSON does not include a visibleLayers []. For some layers, the GP service does not respect sublayer visibility. I have not determined what the difference is between those that work and those that do not.
Bug #3
-- in PrintTask._setPrintParams(), the resulting Web_Map_as_JSON graphic point layers symbols do not have a style attribute. Web_Map_as_JSON -> Graphics layer -> Points -> Symbols -> Style missing
My Workaround
wapp<SPAN class="punctuation token">.</SPAN>objects<SPAN class="punctuation token">.</SPAN>CustomPrintTask <SPAN class="operator token">=</SPAN> EsriPrintTask<SPAN class="punctuation token">.</SPAN><SPAN class="token function">createSubclass</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">{</SPAN>
execute<SPAN class="punctuation token">:</SPAN> <SPAN class="keyword token">function</SPAN> <SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">,</SPAN> b<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
internalPrintPrams <SPAN class="operator token">=</SPAN> <SPAN class="keyword token">this</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="token function">_setPrintParams</SPAN><SPAN class="punctuation token">(</SPAN>a<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// parse current esri version</SPAN>
<SPAN class="keyword token">var</SPAN> mapJson <SPAN class="operator token">=</SPAN> JSON<SPAN class="punctuation token">.</SPAN><SPAN class="token function">parse</SPAN><SPAN class="punctuation token">(</SPAN>internalPrintPrams<SPAN class="punctuation token">.</SPAN>Web_Map_as_JSON<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// add rotation</SPAN>
mapJson<SPAN class="punctuation token">.</SPAN>mapOptions<SPAN class="punctuation token">.</SPAN>rotation <SPAN class="operator token">=</SPAN> <SPAN class="operator token">-</SPAN><SPAN class="number token">1</SPAN> <SPAN class="operator token">*</SPAN> a<SPAN class="punctuation token">.</SPAN>view<SPAN class="punctuation token">.</SPAN>rotation<SPAN class="punctuation token">;</SPAN>
<SPAN class="comment token">// create visibleLayers node</SPAN>
<SPAN class="token function">$</SPAN><SPAN class="punctuation token">(</SPAN>mapJson<SPAN class="punctuation token">.</SPAN>operationalLayers<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="token function">each</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">function</SPAN> <SPAN class="punctuation token">(</SPAN>opIdx<SPAN class="punctuation token">,</SPAN> opLayer<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">var</SPAN> visibleLayers <SPAN class="operator token">=</SPAN> <SPAN class="punctuation token">[</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="token function">$</SPAN><SPAN class="punctuation token">(</SPAN>opLayer<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">.</SPAN><SPAN class="token function">each</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">function</SPAN> <SPAN class="punctuation token">(</SPAN>subIdx<SPAN class="punctuation token">,</SPAN> subLayer<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
visibleLayers<SPAN class="punctuation token">.</SPAN><SPAN class="token function">push</SPAN><SPAN class="punctuation token">(</SPAN>subLayer<SPAN class="punctuation token">.</SPAN>id<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
opLayer<SPAN class="punctuation token">.</SPAN>visibleLayers <SPAN class="operator token">=</SPAN> jQuery<SPAN class="punctuation token">.</SPAN><SPAN class="token function">makeArray</SPAN><SPAN class="punctuation token">(</SPAN>visibleLayers<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="comment token">// for each Operational Layer</SPAN>
<SPAN class="comment token">// Remove empty layers</SPAN>
mapJson<SPAN class="punctuation token">.</SPAN>operationalLayers <SPAN class="operator token">=</SPAN> jQuery<SPAN class="punctuation token">.</SPAN><SPAN class="token function">grep</SPAN><SPAN class="punctuation token">(</SPAN>mapJson<SPAN class="punctuation token">.</SPAN>operationalLayers<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">function</SPAN> <SPAN class="punctuation token">(</SPAN>layer<SPAN class="punctuation token">,</SPAN> idx<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">return</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>layer<SPAN class="punctuation token">.</SPAN>visibleLayers<SPAN class="punctuation token">.</SPAN>length <SPAN class="operator token">></SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN>
<SPAN class="operator token">||</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>layer<SPAN class="punctuation token">.</SPAN>featureCollection<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">&&</SPAN> <SPAN class="punctuation token">(</SPAN>layer<SPAN class="punctuation token">.</SPAN>featureCollection<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">&&</SPAN> <SPAN class="punctuation token">(</SPAN>layer<SPAN class="punctuation token">.</SPAN>featureCollection<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">.</SPAN>length <SPAN class="operator token">></SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="comment token">// grep Operational Layers</SPAN>
<SPAN class="comment token">// Add "style": "esriSMSCircle", to draw features that don't have it</SPAN>
jQuery<SPAN class="punctuation token">.</SPAN><SPAN class="token function">each</SPAN><SPAN class="punctuation token">(</SPAN>mapJson<SPAN class="punctuation token">.</SPAN>operationalLayers<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">function</SPAN> <SPAN class="punctuation token">(</SPAN>opIdx<SPAN class="punctuation token">,</SPAN> opLayer<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>opLayer<SPAN class="punctuation token">.</SPAN>featureCollection<SPAN class="punctuation token">)</SPAN><SPAN class="operator token">&&</SPAN><SPAN class="punctuation token">(</SPAN>opLayer<SPAN class="punctuation token">.</SPAN>featureCollection<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">)</SPAN> <SPAN class="operator token">&&</SPAN> <SPAN class="punctuation token">(</SPAN>opLayer<SPAN class="punctuation token">.</SPAN>featureCollection<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">.</SPAN>length <SPAN class="operator token">></SPAN> <SPAN class="number token">0</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
jQuery<SPAN class="punctuation token">.</SPAN><SPAN class="token function">each</SPAN><SPAN class="punctuation token">(</SPAN>opLayer<SPAN class="punctuation token">.</SPAN>featureCollection<SPAN class="punctuation token">.</SPAN>layers<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">function</SPAN> <SPAN class="punctuation token">(</SPAN>featureSetIdx<SPAN class="punctuation token">,</SPAN> featureSet<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
jQuery<SPAN class="punctuation token">.</SPAN><SPAN class="token function">each</SPAN><SPAN class="punctuation token">(</SPAN>featureSet<SPAN class="punctuation token">.</SPAN>featureSet<SPAN class="punctuation token">.</SPAN>features<SPAN class="punctuation token">,</SPAN> <SPAN class="keyword token">function</SPAN> <SPAN class="punctuation token">(</SPAN>featureIdx<SPAN class="punctuation token">,</SPAN> feature<SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
<SPAN class="keyword token">if</SPAN> <SPAN class="punctuation token">(</SPAN><SPAN class="punctuation token">(</SPAN>feature<SPAN class="punctuation token">.</SPAN>symbol<SPAN class="punctuation token">)</SPAN><SPAN class="operator token">&&</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="operator token">!</SPAN>feature<SPAN class="punctuation token">.</SPAN>symbol<SPAN class="punctuation token">.</SPAN>style<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">)</SPAN> <SPAN class="punctuation token">{</SPAN>
feature<SPAN class="punctuation token">.</SPAN>symbol<SPAN class="punctuation token">.</SPAN>style <SPAN class="operator token">=</SPAN> <SPAN class="string token">"esriSMSCircle"</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="comment token">// for each featureSet</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN> <SPAN class="comment token">// for each opLayer, add style to symbols that don't have it</SPAN>
internalPrintPrams<SPAN class="punctuation token">.</SPAN>Web_Map_as_JSON <SPAN class="operator token">=</SPAN> JSON<SPAN class="punctuation token">.</SPAN><SPAN class="token function">stringify</SPAN><SPAN class="punctuation token">(</SPAN>mapJson<SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN>
<SPAN class="keyword token">return</SPAN> <SPAN class="keyword token">this</SPAN><SPAN class="punctuation token">.</SPAN>_geoprocessor<SPAN class="punctuation token">[</SPAN><SPAN class="string token">"async"</SPAN> <SPAN class="operator token">===</SPAN> <SPAN class="keyword token">this</SPAN><SPAN class="punctuation token">.</SPAN>mode <SPAN class="operator token">?</SPAN> <SPAN class="string token">"submitJob"</SPAN> <SPAN class="punctuation token">:</SPAN> <SPAN class="string token">"execute"</SPAN><SPAN class="punctuation token">]</SPAN><SPAN class="punctuation token">(</SPAN>internalPrintPrams<SPAN class="punctuation token">,</SPAN> b<SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">.</SPAN><SPAN class="token function">then</SPAN><SPAN class="punctuation token">(</SPAN><SPAN class="keyword token">this</SPAN><SPAN class="punctuation token">.</SPAN>_handleExecuteResponse<SPAN class="punctuation token">)</SPAN>
<SPAN class="punctuation token">}</SPAN>
<SPAN class="punctuation token">}</SPAN><SPAN class="punctuation token">)</SPAN><SPAN class="punctuation token">;</SPAN><SPAN class="line-numbers-rows"><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN><SPAN></SPAN></SPAN>