---
name: question-extractor
description: Extract open questions from any text (conversation, brief, PRD, email, spec) and output a JSON questionnaire that pastes directly into https://omgfixmd.com to render an interactive form. Use this whenever someone wants to identify unresolved decisions, find what's still unclear, or turn messy input into structured questions with answer options. Triggers include "extract the open questions", "what's still unclear", "what decisions are missing", "turn this into a questionnaire", "find the unknowns", "generate questions from this", "תוציא שאלות פתוחות", "מה עדיין לא ברור", "מה צריך להחליט", "omgfixmd".
version: 1.2
created: 05-05-2026
updated: 2026-05-06
created_by: adam-mason
owner: Adam Mason
triggers:
  - extract open questions
  - what's still unclear
  - turn this into a questionnaire
  - find unknowns
  - omgfixmd
  - תוציא שאלות
  - מה לא ברור
  - מה צריך להחליט
  - תהפוך לשאלון פתוח
---

# Question Extractor

**Job.** Read any input. Identify the open questions (decisions not made, ambiguities, missing info). Output a JSON questionnaire that pastes into https://omgfixmd.com.

**Output contract.** Two things, in this exact order, nothing else:
1. A single JSON object (raw, or in a ```json fence).
2. A short closing message in the user's language (see Closing Message Format below).

No commentary, no category breakdown, no schema explanation, no "here's what I built." The closing message is the ONLY chat text after the JSON.

## Closing Message Format (MANDATORY)

After the JSON block, output exactly this structure (translate to user's language):

```
X questions in Y categories.

1. Copy the JSON above
2. Open https://omgfixmd.com
3. Click Paste
```

If there are no sections, say `X questions.` (drop the categories phrase). That's the entire post-JSON output. No additional sentences. No listing the categories. No explaining the JSON. Done.

Hebrew variant:
```
X שאלות ב-Y קטגוריות.

1. העתק את ה-JSON למעלה
2. פתח את https://omgfixmd.com
3. לחץ Paste
```

## Optional pre-step (only when ambiguous)

If the conversation does NOT make it clear whether the user is answering themselves or sending to someone else, ask one question before generating:

> "Are you answering these yourself, or sending them to someone else?"

If clear from context (user said "for me", "for David", etc.), skip the question. Just produce the output.

- **Self-answer** → omit `routing` from the JSON.
- **Sending to someone else** → include `routing.from` (sender's name from context) and `routing.return_prompt` ("When done, copy your answers and send them back to <name>.").

## JSON schema

```jsonc
{
  "version": "1",                          // required, always "1"
  "skill_version": "1.2",                  // REQUIRED — must match this skill's frontmatter version
  "title": "<short title>",                // recommended
  "source_summary": "<one sentence>",      // optional
  "routing": {                             // omit when self-answering
    "from": "<sender name>",
    "return_prompt": "When done, copy your answers and send them back to <sender name>."
  },
  "questions": [
    {
      "id": "q1",                          // required, unique
      "question": "<the open question>",   // required
      "context": "<why this is open>",     // required, one sentence, reference source
      "section": "<chapter title>",        // optional, see Sections below
      "options": ["a", "b", "c", "d"],     // required, 3 to 4 short labels
      "multi": false,                      // OPTIONAL — true to allow multiple picks; default false
      "open_field": {                      // OMIT unless overriding default Other
        "label": "I need to check with:",
        "placeholder": "e.g. legal team"
      }
    }
  ]
}
```

## Hard rules

| Rule | Detail |
|---|---|
| Cap | **Maximum 12 questions.** If more found, pick the most important / most blocking. |
| Options | 3 to 4 per question. Short labels (under 8 words). Genuinely distinct paths, not synonyms. |
| Never | Don't include "Other" inside the `options` array. The renderer adds it automatically. |
| Skip | If the answer is already in the text, don't ask the question. |
| One per | One decision per question. Don't bundle. |
| Context | Required on every question. One sentence. Reference the source. |
| Version | Always emit `"skill_version": "<this skill's frontmatter version>"` at the JSON root. The app uses it to detect when the user's installed skill is older than the deployed version and offer an in-app upgrade prompt. The string MUST match this file's `version:` frontmatter. |

## Renderer features (use when they earn their weight)

**Default Other.** Omit `open_field` for the default. The renderer renders a localized "Other:" input AND unlocks the edit-into-Other gesture (hover-pencil desktop, long-press mobile). Setting a custom `open_field.label` disables that gesture, so only set it when the escape-hatch needs a directed phrase:

| Situation | Label |
|---|---|
| Default | omit `open_field` |
| Blocked on a person/team | `"I need to check with:"` |
| Depends on external condition | `"Depends on:"` |
| Reasoning needed | `"The reason is:"` |
| Constraint/deadline | `"The constraint is:"` |
| Tool/resource not listed | `"The tool/resource is:"` |

**Sections.** Set `section` only when ≥2 chapters exist AND each has 2+ questions. Use short titles ("Authentication", "Compliance"). Keep same-section questions consecutive in the array (the renderer groups CONSECUTIVE items). For <5 questions or no natural break, skip `section` entirely.

**Multi-select.** Default is single-select (radio). Set `multi: true` ONLY when the question genuinely allows more than one answer — features to include in v1, integrations to support, channels to launch on, regions to roll out to, stakeholders to consult. Do NOT set `multi` for questions where the answers are mutually exclusive ("which auth method", "which deadline"). When `multi` is true, the renderer shows a "Select all that apply" badge, switches to checkboxes, and the export emits an `Answers:` bullet list instead of a single `Answer:` line. Keep options short and parallel — they read as a set, not a hierarchy.

**Routing.** When set, `routing.return_prompt` MUST contain the literal value of `routing.from` so the renderer can auto-bold the name.

**RTL.** Auto-detected from content. Don't set a language field. Hebrew/Arabic input → Hebrew/Arabic chrome strings.

**Notes.** Every question has a `+ add a note` toggle. A note alone is a valid answer. Don't engineer "TBD" options.

## What counts as an open question

Explicit "we haven't decided X" / placeholder ("TBD", "ask the team") / conflict between stated preferences / missing info the rest assumes / implicit decision the author made without flagging / scope boundary not defined.

**Skip:** style preferences with no consequence, questions answered later in the same doc, pure implementation details (unless the input IS a tech spec).

## Worked example

**Input:** "Mobile guest check-in feature. Haven't decided PIN vs room number, biometric debate (v1 or defer), legal needs to confirm retention, storage location TBD: region-local or centralized."

**Output:**

```json
{
  "version": "1",
  "skill_version": "1.2",
  "title": "Guest Check-In, Open Decisions",
  "routing": {
    "from": "Elad",
    "return_prompt": "When done, copy your answers and send them back to Elad."
  },
  "questions": [
    {
      "id": "q1",
      "section": "Authentication",
      "question": "What authentication method should guests use at check-in?",
      "context": "Brief: PIN vs room number not yet decided.",
      "options": ["Room number only", "Room number + PIN", "Last name + booking ref", "Magic link"]
    },
    {
      "id": "q2",
      "section": "Authentication",
      "question": "Should we offer biometric authentication in v1?",
      "context": "Team split between v1 and defer-to-v2.",
      "options": ["No, defer to v2", "Optional opt-in", "Required"]
    },
    {
      "id": "q3",
      "section": "Compliance",
      "question": "What is the data retention policy?",
      "context": "Brief notes legal sign-off pending.",
      "options": ["Delete after checkout", "30 days", "1 year", "Follow hotel data policy"],
      "open_field": {"label": "I need to check with:", "placeholder": "e.g. legal team, DPO"}
    },
    {
      "id": "q4",
      "section": "Compliance",
      "question": "Where is guest check-in data stored?",
      "context": "Brief lists region-local vs centralized as TBD.",
      "options": ["Region-local", "Centralized", "Hybrid (PII local, telemetry central)"]
    },
    {
      "id": "q5",
      "section": "Compliance",
      "question": "Which guest data fields do we collect at check-in?",
      "context": "Brief is silent on the field list — depends on policy below.",
      "multi": true,
      "options": ["Full name", "ID/passport number", "Phone", "Email", "License plate", "Estimated arrival time"]
    }
  ]
}
```

```
5 questions in 2 categories.

1. Copy the JSON above
2. Open https://omgfixmd.com
3. Click Paste
```

## Changelog

### v1.2 (2026-05-06)
- Multi-select questions (set `multi: true`), checkboxes + bullet-list export.

### v1.1 (2026-05-05)
- Sections, routing, default Other field with edit-into-Other gesture.

### v1.0 (2026-05-05)
- Initial release.
