{
  "schemaVersion": 1,
  "study": "cold-email-deliverability-incident-taxonomy",
  "title": "Deliverability incident taxonomy worksheet",
  "status": "awaiting-real-data",
  "scope": "Collection template, not a dataset or completed field study. All null values are intentionally uncollected.",
  "unitOfObservation": "incident",
  "requiredInputs": "Redacted incident logs with bounded sender, receiver and time scope.",
  "controls": "Classify symptom before proposed cause; preserve unconfirmed and multi-cause cases.",
  "primaryAnalysis": "Consistent symptom and confidence categories; response decline alone is not placement evidence.",
  "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": {
    "incident_id": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "incident id",
      "missingValue": null
    },
    "sender_scope": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "sender scope",
      "missingValue": null
    },
    "receiver_scope": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "receiver scope",
      "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
    },
    "ended_at": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "ended at",
      "missingValue": null
    },
    "symptom": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "symptom",
      "missingValue": null
    },
    "smtp_status": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "smtp status",
      "missingValue": null
    },
    "authentication_evidence": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "authentication evidence",
      "missingValue": null
    },
    "recent_change": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "recent change",
      "missingValue": null
    },
    "cause_hypothesis": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "cause hypothesis",
      "missingValue": null
    },
    "confidence": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "confidence",
      "missingValue": null
    },
    "unknowns": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "unknowns",
      "missingValue": null
    }
  },
  "blankRecord": {
    "observation_id": null,
    "incident_id": null,
    "sender_scope": null,
    "receiver_scope": null,
    "started_at": null,
    "ended_at": null,
    "symptom": null,
    "smtp_status": null,
    "authentication_evidence": null,
    "recent_change": null,
    "cause_hypothesis": null,
    "confidence": null,
    "unknowns": null,
    "excluded": false,
    "exclusion_reason": null,
    "protocol_deviation": null
  },
  "records": [],
  "analysisStatus": "not-run",
  "results": null,
  "interpretationLimits": "Do not label a response-rate decline as spam placement without independent evidence. Redact addresses and credentials before sharing incident records. Publish results only after the evidence, method and limitations have been reviewed. This protocol provides no benchmark, expected lift or completed-study claim.",
  "procedure": [
    "Record SMTP response, authentication evidence, mailbox state, sending changes and scope. Keep raw evidence separate from the proposed cause.",
    "Assign a symptom category first: connection, authentication, rejection, deferral, suspected placement or response decline. Add cause confidence and an unresolved option.",
    "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": []
}
