{
  "schemaVersion": 1,
  "study": "cold-email-campaign-setup-friction-study",
  "title": "Campaign setup friction study: study protocol",
  "status": "awaiting-real-data",
  "scope": "Collection template, not a dataset or completed field study. All null values are intentionally uncollected.",
  "unitOfObservation": "participant-task",
  "requiredInputs": "Consenting first-time operators, fictional leads and a task that ends before activation.",
  "controls": "Use the same task; record any coaching or interruptions rather than hiding them.",
  "primaryAnalysis": "Task completion, errors and help requests; elapsed time needs interpretation.",
  "registration": {
    "owner": null,
    "protocolVersion": "1",
    "registeredAt": null,
    "population": null,
    "eligibilityRules": null,
    "primaryOutcomeDefinition": null,
    "denominator": null,
    "observationWindow": null,
    "targetSampleAndJustification": null,
    "assignmentProcedureAndSeed": null,
    "exclusionRules": null,
    "safetyStopConditions": null,
    "missingDataPolicy": null,
    "retentionAndAccessOwner": null
  },
  "collectionRules": [
    "Assign pseudonymous IDs; do not store mailbox passwords, access tokens or unnecessary identifiers.",
    "Freeze the outcome and exclusions before collection; retain exclusions with reasons.",
    "Do not use repeated observations as independent people. Record clustering by person, company or mailbox.",
    "Do not treat a software test, simulated reply or researcher-written example as participant or campaign evidence.",
    "Record complaints and opt-outs and follow the actual suppression workflow.",
    "For interviews obtain permission before recording and respect withdrawal.",
    "Publish aggregate or redacted evidence only after review; keep original private records outside the public website."
  ],
  "fieldDictionary": {
    "participant_id": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "participant id",
      "missingValue": null
    },
    "experience_level": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "experience level",
      "missingValue": null
    },
    "task_id": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "task id",
      "missingValue": null
    },
    "started_at": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "started at",
      "missingValue": null
    },
    "finished_at": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "finished at",
      "missingValue": null
    },
    "completed": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "completed",
      "missingValue": null
    },
    "error_observed": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "error observed",
      "missingValue": null
    },
    "help_requested": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "help requested",
      "missingValue": null
    },
    "stop_rule_noticed": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "stop rule noticed",
      "missingValue": null
    }
  },
  "blankRecord": {
    "observation_id": null,
    "participant_id": null,
    "experience_level": null,
    "task_id": null,
    "started_at": null,
    "finished_at": null,
    "completed": null,
    "error_observed": null,
    "help_requested": null,
    "stop_rule_noticed": null,
    "excluded": false,
    "exclusion_reason": null,
    "protocol_deviation": null
  },
  "records": [],
  "analysisStatus": "not-run",
  "results": null,
  "interpretationLimits": "Do not make participants send to real prospects. Participation and recording require informed agreement. Publish results only after the evidence, method and limitations have been reviewed. This protocol provides no benchmark, expected lift or completed-study claim.",
  "procedure": [
    "Prepare fictional leads, an owned test mailbox and a task ending at review rather than activation. Record experience level.",
    "Observe without coaching initially. Log hesitation, errors, help requests and whether the participant notices suppression and stop rules.",
    "Before collection, write the primary outcome, observation window, exclusion rules and stopping conditions. Preserve excluded observations with a reason rather than quietly removing them.",
    "Pilot the procedure with fictional or owned test data, resolve ambiguous fields, and freeze a dated protocol version before the main run."
  ],
  "interviewPrompts": []
}
