What openSession accepts: every run option, plus the one that chooses the shape.
watch lives here rather than on UserRunOptions on purpose — test must not be able to
take it. A watching run never finishes, so test({ watch: true }) would be a Task that never
settles, and a type that cannot express the mistake is better than a validation that catches it.
const options: SessionOptions = { inputs: ['test/'], watch: true }; options.watch; // true — the durable shape
UserRunOptions & { watch?: boolean; }