{
  "schema_version": "workshop-feedback-v1",
  "fictional": true,
  "event": "Fictional workshop pilot",
  "report_cutoff_utc": "2026-11-09T17:00:00Z",
  "record_grain": "One invitation ID per CSV row; no real people or contact details.",
  "invitation_delivery": "unknown",
  "recipient_eligibility": "unknown",
  "submission_states": {
    "submitted": "A final Submit event is explicitly present in this fictional fixture. Optional questions can still be skipped.",
    "partial": "At least one captured answer, no final Submit event.",
    "no_response": "No captured survey event by the cutoff; delivery, exposure and reason remain unknown."
  },
  "questions": [
    {
      "id": "Q1",
      "column": "attended",
      "text": "Did you attend the workshop?",
      "type": "single_choice",
      "options": [
        "yes",
        "no"
      ],
      "blank": "unknown",
      "eligibility": "Any respondent may answer. No-response invitations have unknown exposure."
    },
    {
      "id": "Q2",
      "state_column": "rating_state",
      "value_column": "rating_value",
      "text": "How useful was the workshop for your next task?",
      "type": "integer_rating",
      "minimum": 1,
      "maximum": 5,
      "anchors": {
        "1": "Not useful",
        "2": "Slightly useful",
        "3": "Moderately useful",
        "4": "Very useful",
        "5": "Extremely useful"
      },
      "eligibility": "attended=yes; attended=no means not_asked; unknown attendance means unknown eligibility.",
      "mean_denominator": "answered only, including valid captured partial-session answers; never fill blank with zero."
    },
    {
      "id": "Q3",
      "state_column": "topics_state",
      "value_column": "topics_selected",
      "text": "What would you like offered next? Choose any, or choose none.",
      "type": "multiple_choice",
      "options": [
        "practice",
        "examples",
        "recording"
      ],
      "option_labels": {
        "practice": "Guided practice",
        "examples": "More worked examples",
        "recording": "Session recording"
      },
      "separator": ";",
      "eligibility": "Offered to all respondents, including those who answered attended=no; no_response does not establish exposure.",
      "explicit_none": "state=explicit_none with an empty selection field. Never combine with positive choices.",
      "denominator": "Unique invitation IDs with state=answered or explicit_none; not the number of selections.",
      "deduplication": "Count each invitation_id + option once; repeated option tokens do not create another person or selection. Retain and flag the duplicate evidence."
    }
  ],
  "answer_states": {
    "answered": "A supported value or at least one positive checkbox choice is present.",
    "explicit_none": "A deliberate none choice for Q3 only; an answer, not a skip.",
    "skipped": "Shown and explicitly bypassed, recorded by this fictional fixture.",
    "not_reached": "The fictional captured progress ends before this eligible question.",
    "not_asked": "The Q2 branch was inapplicable because attended=no.",
    "unknown": "Evidence does not establish the narrower state; a raw blank alone belongs here."
  },
  "report_policy": "Include all supported captured answers, whether submitted or partial. Never infer a state from final-submit status alone.",
  "privacy": "Only fictional IDs are supplied. An eventual app must implement and test its own permissions; this file does not enforce them.",
  "missing_evidence": "The example explicitly supplies states. It is not an export format or claim about an Overskill template.",
  "respondent_identity": "Each invitation ID identifies one distinct fictional participant here. Real repeat invitations or responses need a declared respondent-identity rule before reporting unique people."
}
