{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "$id": "https://crypticpy.github.io/phct/examples/cohort-portal/submit/answers.schema.json",
  "title": "Data Learning Cohorts Portal: answers for a new team project",
  "description": "The answers to the submission form at https://crypticpy.github.io/phct/examples/cohort-portal/submit/, one property per question, keyed by the question's key. Leave out any question you do not have an answer for. Files are not part of this JSON: the submitter attaches them on the submit page (or drags them into the GitHub issue).",
  "type": "object",
  "properties": {
    "title": {
      "title": "Title",
      "description": "What is it called? Short, descriptive name.",
      "type": "string",
      "minLength": 1
    },
    "summary": {
      "title": "One-sentence summary",
      "description": "In one or two sentences, what did the team do? One or two sentences shown on the catalog card. Plain language, no jargon.",
      "type": "string",
      "minLength": 1
    },
    "finding": {
      "title": "Headline finding",
      "description": "What is the one thing the team found? Optional. The single clearest result — a number if you have one.",
      "type": "string"
    },
    "cohort": {
      "title": "Cohort",
      "description": "Which cohort was this? Cohort year, e.g. 2026.",
      "type": "string",
      "minLength": 1
    },
    "area": {
      "title": "Area of work",
      "description": "Which area or team did the participants come from? The area, unit or team the participants come from — whatever your organization calls it.",
      "type": "string"
    },
    "track": {
      "title": "Track",
      "description": "Which program track was this? Which program track this project came out of.",
      "type": "string",
      "enum": [
        "Data Science Essentials",
        "Data Storytelling",
        "Civic Analytics"
      ]
    },
    "members": {
      "title": "Team members",
      "description": "Who was on the team? One name per line. Each item is one line of its own. Never put a comma inside an item.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "pattern": "^[^,\\r\\n]+$"
      },
      "minItems": 1
    },
    "coach_name": {
      "title": "Coach",
      "description": "Who coached the team? The coach or mentor who supported this team.",
      "type": "string"
    },
    "coach_email": {
      "title": "Coach email",
      "description": "What is their email?",
      "type": "string",
      "format": "email"
    },
    "methods": {
      "title": "Methods & tools",
      "description": "What methods and tools did the team use? Techniques, libraries or platforms the team used. Each item is one line of its own. Never put a comma inside an item.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "pattern": "^[^,\\r\\n]+$"
      }
    },
    "data_sources": {
      "title": "Data sources",
      "description": "Which datasets did the team work with? Describe the datasets — do not paste sensitive data. Each item is one line of its own. Never put a comma inside an item.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "pattern": "^[^,\\r\\n]+$"
      }
    },
    "skills": {
      "title": "Skills practiced",
      "description": "Which skills did this project build? Select all that apply.",
      "type": "array",
      "items": {
        "type": "string",
        "enum": [
          "Data cleaning",
          "Statistics",
          "Mapping & GIS",
          "Visualization",
          "Automation",
          "Stakeholder interviews"
        ]
      },
      "uniqueItems": true
    },
    "tags": {
      "title": "Tags",
      "description": "What topics does it touch? Free-form topics so people can find related work. Each item is one line of its own. Never put a comma inside an item.",
      "type": "array",
      "items": {
        "type": "string",
        "minLength": 1,
        "pattern": "^[^,\\r\\n]+$"
      }
    },
    "dashboard_url": {
      "title": "Interactive dashboard",
      "description": "Is there a dashboard or notebook to look at? A published dashboard, notebook or app, if there is one.",
      "type": "string",
      "format": "uri",
      "pattern": "^https?://\\S+$"
    },
    "repo_url": {
      "title": "Code repository",
      "description": "Where is the code? A repository the next cohort could start from.",
      "type": "string",
      "format": "uri",
      "pattern": "^https?://\\S+$"
    },
    "poster_pdf": {
      "title": "Project poster (PDF)",
      "description": "Do you have a showcase poster? The showcase poster. Its first page becomes the card thumbnail. Only a public https link. Files are not part of this JSON: the submitter attaches them on the submit page (or drags them into the GitHub issue).",
      "type": "string",
      "format": "uri",
      "pattern": "^https?://\\S+$"
    },
    "idea_sheet_pdf": {
      "title": "Idea sheet (PDF)",
      "description": "Do you have the original project brief? The one-page brief written at the start of the cohort. Only a public https link. Files are not part of this JSON: the submitter attaches them on the submit page (or drags them into the GitHub issue).",
      "type": "string",
      "format": "uri",
      "pattern": "^https?://\\S+$"
    },
    "screenshots": {
      "title": "Screenshots",
      "description": "Can you show the work? Up to six PNG or JPG images. Make sure no personal information is visible. Only images already hosted at a public https address; each needs alt text of at most 125 characters saying what the screenshot shows. Files are not part of this JSON: the submitter attaches them on the submit page (or drags them into the GitHub issue).",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "url": {
            "type": "string",
            "format": "uri",
            "pattern": "^https?://\\S+$"
          },
          "alt": {
            "type": "string",
            "maxLength": 125
          }
        },
        "required": [
          "url"
        ],
        "additionalProperties": false
      }
    },
    "resources": {
      "title": "Other materials",
      "description": "Anything else worth linking? Slides, shared drives or write-ups. One per line as “Label | URL”. Each link is a short label and a web address.",
      "type": "array",
      "items": {
        "type": "object",
        "properties": {
          "label": {
            "type": "string",
            "description": "Short text saying where the link goes."
          },
          "url": {
            "type": "string",
            "format": "uri",
            "pattern": "^https?://\\S+$"
          }
        },
        "required": [
          "url"
        ],
        "additionalProperties": false
      }
    },
    "body": {
      "title": "Project write-up",
      "description": "Tell the full story. Markdown is supported. Tell the story of the project.",
      "type": "string",
      "minLength": 1
    }
  },
  "required": [
    "title",
    "summary",
    "cohort",
    "members",
    "body"
  ],
  "additionalProperties": false
}
