{
  "schemaVersion": 1,
  "study": "cold-email-mobile-rendering-study",
  "title": "Mobile email rendering study: study protocol",
  "status": "awaiting-real-data",
  "scope": "Collection template, not a dataset or completed field study. All null values are intentionally uncollected.",
  "unitOfObservation": "message-client-configuration",
  "requiredInputs": "Original MIME and owned inboxes across the chosen email-client matrix.",
  "controls": "Keep the same message version; inspect links and assistive behavior separately from screenshots.",
  "primaryAnalysis": "Defects by configuration and task impact; website browser screenshots are not email-client coverage.",
  "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": {
    "message_version": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "message version",
      "missingValue": null
    },
    "mime_reference": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "mime reference",
      "missingValue": null
    },
    "client_version": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "client version",
      "missingValue": null
    },
    "os_version": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "os version",
      "missingValue": null
    },
    "viewport": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "viewport",
      "missingValue": null
    },
    "text_scale": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "text scale",
      "missingValue": null
    },
    "color_mode": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "color mode",
      "missingValue": null
    },
    "images_enabled": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "images enabled",
      "missingValue": null
    },
    "assistive_technology": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "assistive technology",
      "missingValue": null
    },
    "defect": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "defect",
      "missingValue": null
    },
    "screenshot_reference": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "screenshot reference",
      "missingValue": null
    }
  },
  "blankRecord": {
    "observation_id": null,
    "message_version": null,
    "mime_reference": null,
    "client_version": null,
    "os_version": null,
    "viewport": null,
    "text_scale": null,
    "color_mode": null,
    "images_enabled": null,
    "assistive_technology": null,
    "defect": null,
    "screenshot_reference": null,
    "excluded": false,
    "exclusion_reason": null,
    "protocol_deviation": null
  },
  "records": [],
  "analysisStatus": "not-run",
  "results": null,
  "interpretationLimits": "Do not claim all-device compatibility from a small matrix. Publish tested versions and unknown combinations. Publish results only after the evidence, method and limitations have been reviewed. This protocol provides no benchmark, expected lift or completed-study claim.",
  "procedure": [
    "Build a matrix of client, OS, viewport, text scaling, light/dark mode and images blocked. Keep the original MIME artifact.",
    "Use controlled inboxes. Inspect text overflow, link target clarity, contrast and reading order with assistive technology where available.",
    "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": []
}
