{
  "schemaVersion": 1,
  "study": "cold-email-mailbox-reconnect-reliability-study",
  "title": "Mailbox reconnect: controlled state checks and recovery 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": "mailbox-recovery-scenario",
  "requiredInputs": "Owned dedicated mailboxes plus message IDs before, during and after a deliberate outage.",
  "controls": "Separate token expiry, revocation and interrupted reconnect; keep provider and retention window visible.",
  "primaryAnalysis": "Recovery completeness and duplicate events per scenario, plus latency where actually observed.",
  "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": {
    "scenario_id": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "scenario id",
      "missingValue": null
    },
    "provider": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "provider",
      "missingValue": null
    },
    "auth_method": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "auth method",
      "missingValue": null
    },
    "revoked_at": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "revoked at",
      "missingValue": null
    },
    "reconnected_at": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "reconnected at",
      "missingValue": null
    },
    "known_message_ids": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "known message ids",
      "missingValue": null
    },
    "recovered_message_ids": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "recovered message ids",
      "missingValue": null
    },
    "duplicate_message_ids": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "duplicate message ids",
      "missingValue": null
    },
    "checkpoint_before": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "checkpoint before",
      "missingValue": null
    },
    "checkpoint_after": {
      "required": true,
      "type": "string, number or boolean as specified by the registered protocol; null until collected",
      "meaning": "checkpoint after",
      "missingValue": null
    }
  },
  "blankRecord": {
    "observation_id": null,
    "scenario_id": null,
    "provider": null,
    "auth_method": null,
    "revoked_at": null,
    "reconnected_at": null,
    "known_message_ids": null,
    "recovered_message_ids": null,
    "duplicate_message_ids": null,
    "checkpoint_before": null,
    "checkpoint_after": null,
    "excluded": false,
    "exclusion_reason": null,
    "protocol_deviation": null
  },
  "records": [],
  "analysisStatus": "not-run",
  "results": null,
  "interpretationLimits": "Use dedicated test credentials. Provider-specific behavior and retention windows limit how far results generalize. 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 provider, auth mechanism, checkpoint state, known message IDs, expected reply counts and token revocation time.",
    "Test expiry, revoked consent and interrupted reconnect separately. Send controlled replies before, during and after the outage.",
    "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": "These are database/service checks. They do not open an SMTP or IMAP provider session, exercise OAuth expiry, reset UIDVALIDITY, measure downtime recovery or establish that replies sent during an outage are recovered."
  }
}
