Good questions Geoff, here's what I have so far:

 

Current version of the onAfter Script, properly copied this time:

(function runTransformScript(source, map, log, target /*undefined onStart*/ ) {
	gs.info("CDL: 1. onAfter Script started")
	
	try {
		gs.info("CDL: 3. inside try")
		var inputs = {};
		inputs['importRow'] = source; // Object 

		// Start Asynchronously: Uncomment to run in background. Code snippet will not have access to outputs.
		// sn_fd.FlowAPI.getRunner().subflow('global.peoplesoft_photo_process').inBackground().withInputs(inputs).run();
				
		// Execute Synchronously: Run in foreground. Code snippet has access to outputs.
		var result = sn_fd.FlowAPI.getRunner().subflow('global.peoplesoft_photo_process').inForeground().withInputs(inputs).run();
		var outputs = result.getOutputs();

		// Current subflow has no outputs defined.		
	} catch (ex) {
		var message = ex.getMessage();
		gs.error("CDL: onAfter Error: " + message);
	}

})(source, map, log, target);

As you can see, I added some logging.  Here's what I get for each row when I run the transform:
CDL: 1. onAfter Script started
CDL: 3. inside try
CDL: onAfter Error: Invalid ComplexObject input format found

And yes, the subflow is active and published