{
  "schemaVersion": 1,
  "study": "cold-email-unsubscribe-usability-study",
  "title": "Unsubscribe enforcement: controlled checks and usability study protocol",
  "status": "limited-controlled-evidence-available; field-study-pending",
  "scope": "Collection template, not a dataset or completed field study. All null values are intentionally uncollected.",
  "unitOfObservation": "recipient-journey",
  "requiredInputs": "Owned recipients, supported opt-out paths and an isolated queued sequence.",
  "controls": "Test discoverability separately from enforcement; never recontact a real opted-out person.",
  "primaryAnalysis": "User completion and subsequent sending prevention as separate outcomes.",
  "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": {
    "journey_id": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "journey id",
      "missingValue": null
    },
    "path_supported": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "path supported",
      "missingValue": null
    },
    "path_used": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "path used",
      "missingValue": null
    },
    "discovery_completed": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "discovery completed",
      "missingValue": null
    },
    "confirmation_seen": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "confirmation seen",
      "missingValue": null
    },
    "suppression_recorded": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "suppression recorded",
      "missingValue": null
    },
    "reenrollment_result": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "reenrollment result",
      "missingValue": null
    },
    "later_send_result": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "later send result",
      "missingValue": null
    },
    "evidence_reference": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "evidence reference",
      "missingValue": null
    }
  },
  "blankRecord": {
    "observation_id": null,
    "journey_id": null,
    "path_supported": null,
    "path_used": null,
    "discovery_completed": null,
    "confirmation_seen": null,
    "suppression_recorded": null,
    "reenrollment_result": null,
    "later_send_result": null,
    "evidence_reference": null,
    "excluded": false,
    "exclusion_reason": null,
    "protocol_deviation": null
  },
  "records": [],
  "analysisStatus": "not-run",
  "results": null,
  "interpretationLimits": "This is a usability and behavior protocol, not a legal compliance certification. Never test by recontacting real people who opted out. Publish results only after the evidence, method and limitations have been reviewed. This protocol provides no benchmark, expected lift or completed-study claim.",
  "procedure": [
    "Define reply-based, body-link and header-based paths separately. Prepare an owned address and a queued test sequence.",
    "Observe discoverability without coaching, then verify suppression state and attempted later enrollment. Test supported paths only.",
    "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": [],
  "controlledEvidence": {
    "url": "https://zintara.io/research-data/2026-09-16/controlled-results.json",
    "limits": "No recipient participated in these checks. Completion time, discoverability, assistive technology, every opt-out path, live delivery and legal compliance were not tested."
  }
}
