Inferensys

Prompt

Unresolved Question Carry-Forward Prompt

A practical prompt playbook for tracking questions the system couldn't answer earlier and re-attempting answers when new context becomes available in production AI workflows.
Developer doing prompt engineering on laptop, prompt variations visible on screen, casual coding session.
PROMPT PLAYBOOK

When to Use This Prompt

Defines the job-to-be-done, ideal user, required context, and boundaries for the Unresolved Question Carry-Forward Prompt.

This prompt is designed for multi-turn RAG assistants and copilots that must maintain a running ledger of questions the system could not answer earlier. The core job-to-be-done is transforming 'I don't know yet' into 'I can answer that now' without requiring the user to repeat themselves. When a user asks a question and the retrieved context lacks sufficient evidence, the system records it as unresolved. On subsequent turns, when new documents are retrieved or the user provides additional information, the system re-evaluates pending questions and attempts to answer them. This is essential for customer-facing Q&A systems, research assistants, support copilots, and any multi-turn RAG application where answer continuity across turns is a product requirement.

The ideal user is an AI engineer or product developer building a conversational RAG system where users expect the assistant to remember what it couldn't answer and proactively close those gaps. Required context includes: a persistent session store that can hold the unresolved question ledger across turns, a retrieval system that may return different or expanded evidence on subsequent turns, and a clear policy for when a question should be marked as permanently unresolvable versus temporarily pending. The prompt expects [CURRENT_QUESTION], [RETRIEVED_CONTEXT], [UNRESOLVED_QUESTIONS_LEDGER], and [CONVERSATION_HISTORY] as inputs, and produces a structured output containing both a resolution attempt for each pending question where new evidence is now available and an updated ledger reflecting any remaining gaps.

Do not use this prompt when the assistant operates in a single-turn mode with no memory, when the retrieval corpus is static and will never yield new evidence on subsequent turns, or when the product requirement is to simply apologize and move on rather than track unresolved questions. This prompt is also inappropriate for systems where users expect immediate answers or escalation to a human rather than deferred resolution. If your RAG pipeline cannot guarantee that subsequent retrieval calls will return different or expanded context, the carry-forward mechanism will produce repeated 'still cannot answer' outputs that frustrate users rather than build trust. Before implementing this prompt, ensure your retrieval system supports re-querying with expanded or reformulated queries when initial evidence is insufficient, and that your session management layer can reliably persist and update the unresolved question ledger across turns.

PRACTICAL GUARDRAILS

Use Case Fit

Where the Unresolved Question Carry-Forward Prompt works and where it introduces risk. Use these cards to decide if this pattern fits your product before integrating it into a multi-turn RAG pipeline.

01

Strong Fit: Research Copilots

Use when: Users explore a topic across multiple turns and the system must remember what it couldn't answer earlier. Guardrail: Persist unresolved questions with the original query timestamp and re-attempt only when new evidence chunks are retrieved, not on every turn.

02

Strong Fit: Customer Support Triage

Use when: A support assistant needs to track questions that require escalation or later follow-up. Guardrail: Attach a maximum carry-forward limit (e.g., 5 turns) and auto-escalate to a human if a question remains unresolved beyond the threshold.

03

Poor Fit: Stateless Single-Turn Q&A

Avoid when: The system resets context after every query and has no session memory. Guardrail: Do not add carry-forward logic to stateless endpoints. Instead, use a session-bound agent architecture that explicitly manages question state across turns.

04

Required Inputs

What you need: A structured session log containing prior user questions, prior system answers, and explicit 'unanswered' flags with the reason for abstention. Guardrail: Validate that the session log schema includes question_id, timestamp, status, and abstention_reason before passing it into the prompt.

05

Operational Risk: Question Hallucination

Risk: The model fabricates a prior question that was never asked, then 'resolves' it with a confident but irrelevant answer. Guardrail: Require the prompt to cite the exact prior turn ID and original user text when claiming a question was unresolved. Validate this citation in eval before surfacing the answer.

06

Operational Risk: Infinite Persistence

Risk: Unresolved questions accumulate across long sessions, consuming context window budget and causing the model to re-attempt answering irrelevant stale questions. Guardrail: Implement a TTL (time-to-live) on unresolved questions. Drop questions older than N turns or flag them for explicit user re-confirmation before re-attempting.

PROMPT PLAYBOOK

Copy-Ready Prompt Template

A reusable prompt template for tracking and re-attempting unresolved questions when new context becomes available in a multi-turn RAG session.

This prompt is designed to be wired into your RAG pipeline after retrieval but before answer generation. It instructs the model to maintain a running list of questions the system could not answer in prior turns, compare them against newly retrieved evidence, and either resolve them with grounded answers or carry them forward with updated status. The template uses square-bracket placeholders that your application must populate at runtime from conversation state, retrieval results, and session metadata.

text
You are an assistant that tracks unresolved questions across conversation turns.

## PRIOR UNRESOLVED QUESTIONS
[UNRESOLVED_QUESTIONS]

## CURRENT USER QUESTION
[CURRENT_QUESTION]

## RETRIEVED CONTEXT
[RETRIEVED_CONTEXT]

## INSTRUCTIONS
1. Review the PRIOR UNRESOLVED QUESTIONS list. For each question, check whether the RETRIEVED CONTEXT now contains sufficient evidence to answer it.
2. For any previously unresolved question that can now be answered:
   - Provide a grounded answer with inline citations to the RETRIEVED CONTEXT.
   - Mark the question as RESOLVED.
3. For any previously unresolved question that still cannot be answered:
   - Keep it in the UNRESOLVED list.
   - Update its status with a brief note on what evidence is still missing.
4. Answer the CURRENT USER QUESTION using only the RETRIEVED CONTEXT.
   - If the context is insufficient, add the question to the UNRESOLVED list with a clear description of what information is needed.
   - If the context is sufficient, provide a grounded answer with citations.
5. Do not fabricate answers. If evidence is missing, say so explicitly.

## OUTPUT FORMAT
Return a JSON object with this exact structure:
{
  "current_answer": {
    "text": "string (the answer to CURRENT_QUESTION, or null if unanswered)",
    "citations": ["source_id_1", "source_id_2"],
    "status": "ANSWERED | UNANSWERED"
  },
  "resolved_questions": [
    {
      "question": "string",
      "answer": "string",
      "citations": ["source_id"]
    }
  ],
  "updated_unresolved_questions": [
    {
      "question": "string",
      "missing_evidence": "string (what information is still needed)",
      "first_asked_turn": number,
      "attempts": number
    }
  ]
}

## CONSTRAINTS
- Never invent sources or citations.
- If the RETRIEVED_CONTEXT is empty, mark all questions as UNANSWERED.
- Do not repeat resolved questions in the unresolved list.
- Preserve the original question text when carrying forward.

Adapt this template by adjusting the output schema to match your application's data model. The [UNRESOLVED_QUESTIONS] placeholder should be populated from your session state store, not from model memory. The [RETRIEVED_CONTEXT] placeholder expects pre-ranked passages with source identifiers. If your retrieval system does not return source IDs, add a preprocessing step to assign them before populating this prompt. For high-stakes domains, route outputs with status: UNANSWERED to a human review queue rather than surfacing them directly to users.

IMPLEMENTATION TABLE

Prompt Variables

Required and optional inputs for the Unresolved Question Carry-Forward Prompt. Each placeholder must be populated before the prompt is assembled and sent to the model.

PlaceholderPurposeExampleValidation Notes

[CURRENT_QUESTION]

The user's latest question or message that may resolve a previously unanswered question

What about the Q3 revenue breakdown by region?

Required. Must be non-empty string. Check for null or whitespace-only input before prompt assembly.

[UNRESOLVED_QUESTIONS_LIST]

A structured list of questions the system could not answer in prior turns, each with a unique ID, the original question text, and the turn when it was first asked

[{"id":"q1","question":"What was the churn rate in EMEA?","asked_at_turn":3}]

Required if any unresolved questions exist. Must be valid JSON array. If empty array, skip carry-forward logic. Validate schema: id (string), question (string), asked_at_turn (integer).

[CONVERSATION_HISTORY]

The full or summarized dialogue history up to the current turn, used to detect if the new question addresses a prior unresolved item

User: What drove the revenue dip? Assistant: The dip was primarily in APAC due to supply chain delays. User: And what about EMEA?

Required. Must include at least the last N turns where N is configurable. Validate that history contains user and assistant turns with timestamps or turn indices.

[RETRIEVED_CONTEXT]

New evidence retrieved for the current turn that may contain information relevant to previously unresolved questions

Document chunk: 'EMEA churn increased 2.3% YoY driven by competitor pricing pressure in DACH region.'

Required. Must be non-empty string or array of passages. Validate that each passage has a source identifier for citation. If retrieval returns zero results, set to empty string and trigger abstention path.

[RESOLUTION_CONFIDENCE_THRESHOLD]

The minimum confidence score required to mark a previously unresolved question as resolved

0.85

Optional. Defaults to 0.80 if not provided. Must be float between 0.0 and 1.0. Validate range. Lower values risk premature resolution; higher values may leave questions unresolved when evidence is sufficient.

[MAX_UNRESOLVED_QUESTIONS]

The maximum number of unresolved questions to track before the system forces a summary or escalation

5

Optional. Defaults to 10 if not provided. Must be positive integer. Validate that the unresolved list length does not exceed this value before adding new items. If exceeded, trigger truncation or escalation logic.

[OUTPUT_SCHEMA]

The expected JSON structure for the response, defining how resolved questions, still-unresolved questions, and the current answer are formatted

{"resolved":[],"still_unresolved":[],"current_answer":"","carryforward_notes":""}

Required. Must be valid JSON Schema or example object. Validate that the model output conforms to this schema before passing downstream. Fields: resolved (array of question IDs), still_unresolved (array of question objects), current_answer (string), carryforward_notes (string).

PROMPT PLAYBOOK

Implementation Harness Notes

How to wire the Unresolved Question Carry-Forward Prompt into a multi-turn RAG application with state management, validation, and retry logic.

The Unresolved Question Carry-Forward Prompt is not a standalone call; it is a stateful component that must be integrated into a conversation loop. The application layer is responsible for maintaining a persistent list of unresolved questions across turns, injecting that list into the prompt's [UNRESOLVED_QUESTIONS] placeholder, and updating the list based on the model's structured output. This means your harness must parse the model's response, extract the resolved and new_unresolved fields, and merge them into the canonical question list before the next turn begins. Do not rely on the model to remember unresolved questions implicitly through conversation history alone—explicit state management prevents questions from being silently dropped when context windows shift or when conversation history compression occurs.

The prompt expects a JSON output with a strict schema: an array of resolved question objects (each with question_id, question_text, and answer_summary), an array of new_unresolved question objects (with question_id, question_text, and reason_unresolved), and a current_answer string. Your implementation harness must validate this schema after every model call. Use a JSON schema validator to check required fields, types, and non-null constraints. If validation fails, implement a retry loop with a maximum of two correction attempts, feeding the validation error message back to the model in a repair prompt. If the output still fails validation after retries, log the failure, preserve the existing unresolved question list unchanged, and surface a fallback answer to the user indicating a processing error. For model choice, prefer models with strong JSON mode or structured output support (such as GPT-4o with response_format set to json_schema or Claude with tool-use-based structured output). Avoid models with inconsistent JSON adherence for this workflow unless you add a robust repair layer.

Logging and observability are critical for debugging question carry-forward failures. At minimum, log the following on every turn: the incoming unresolved question count, the model's raw output, the parsed resolved and new_unresolved counts, any validation errors, and the updated question list after merging. This trace data lets you detect regressions such as questions that persist across too many turns without resolution, questions that are incorrectly marked as resolved, or new questions that duplicate existing entries. Implement a deduplication check in the application layer: before adding a new_unresolved question to the canonical list, compare its text against existing unresolved questions using a simple embedding similarity threshold or exact-match check. This prevents the list from bloating with near-duplicate entries when the model rephrases the same unresolved concern across turns. For high-stakes deployments, add a human-review queue trigger when the unresolved question count exceeds a configurable threshold (e.g., five open questions) or when a single question remains unresolved for more than three turns—this prevents the system from silently accumulating debt it cannot resolve.

IMPLEMENTATION TABLE

Expected Output Contract

Defines the structured payload the model must return for unresolved question tracking. Use this contract to validate outputs before persisting to session state or triggering re-retrieval.

Field or ElementType or FormatRequiredValidation Rule

pending_questions

Array of objects

Must be a JSON array. Empty array allowed if no unresolved questions exist.

pending_questions[].question_id

String (UUID v4)

Must match UUID v4 regex. Must be unique within the array and stable across turns for the same question.

pending_questions[].question_text

String

Must be the user's exact original question or a minimally clarified restatement. Length must be between 10 and 500 characters.

pending_questions[].original_turn

Integer

Must be a positive integer representing the conversation turn index when the question was first asked. Must not exceed the current turn index.

pending_questions[].unresolved_reason

Enum string

Must be one of: 'insufficient_context', 'conflicting_sources', 'ambiguous_question', 'out_of_scope', 'awaiting_clarification'. No other values permitted.

pending_questions[].clarification_asked

String or null

If a clarification question was posed to the user, this must contain that exact question text. Otherwise must be null.

pending_questions[].re_attempted

Boolean

Must be true if the current turn attempted to answer this question using new context, false otherwise. Defaults to false for newly added questions.

pending_questions[].resolution_status

Enum string

Must be one of: 'pending', 'resolved', 'escalated'. 'resolved' requires an answer to be present in the current turn's output. 'escalated' requires a human handoff note.

PRACTICAL GUARDRAILS

Common Failure Modes

What breaks first when tracking unresolved questions across conversation turns and how to guard against it.

01

Question Forgotten Across Turns

What to watch: The model drops an unresolved question after a single turn, especially when new user input or retrieved evidence shifts attention. The carry-forward list silently loses items. Guardrail: Require the prompt to output a structured pending_questions array at the end of every turn. Validate that the array length never decreases unless a question is explicitly resolved or the user dismisses it.

02

False Resolution from Partial Evidence

What to watch: The model marks a question as resolved when new context provides only tangentially related information, not a direct answer. This creates a false sense of completion. Guardrail: Add a resolution gate in the prompt that requires the model to cite specific evidence chunks that directly address the question. If no chunk meets the threshold, the question must remain pending with a resolution_confidence score below a defined cutoff.

03

Question Drift and Semantic Decay

What to watch: Over multiple turns, the wording of a pending question morphs slightly each time it's carried forward, eventually changing its meaning. The system ends up answering a different question than the user originally asked. Guardrail: Store the original user question verbatim in a canonical_question field. Always carry forward the canonical form alongside any rephrased version. Run a semantic similarity check between the original and the carried-forward version each turn.

04

Context Window Starvation

What to watch: As pending questions accumulate over a long session, the carry-forward list consumes more and more of the context window, crowding out new evidence and conversation history. Answer quality degrades across the board. Guardrail: Implement a hard cap on the number of pending questions carried forward. When the cap is hit, force the model to either resolve, escalate, or explicitly ask the user which questions to prioritize. Log dropped questions for human review.

05

Hallucinated Resolution Status

What to watch: The model fabricates a resolution for a pending question, claiming it was answered when no such answer exists in the conversation or evidence. This is especially common when the model is pressured to appear helpful. Guardrail: Require the model to output a resolution_evidence object containing the exact turn number and source passage where the answer was found. If the model cannot produce this, the question must remain unresolved. Validate this field against the actual conversation log.

06

Implicit Resolution Without User Confirmation

What to watch: The model assumes a question is resolved because it provided an answer, but the user never acknowledged or confirmed the answer was satisfactory. The system closes the loop prematurely. Guardrail: Distinguish between answered and resolved states. A question moves to answered when the model provides a response, but only moves to resolved when the user explicitly confirms or the next user turn implicitly builds on the answer without objection. Require user-facing confirmation language for high-stakes questions.

IMPLEMENTATION TABLE

Evaluation Rubric

Use this rubric to test whether the Unresolved Question Carry-Forward Prompt correctly tracks, persists, and re-attempts previously unanswered questions. Each criterion targets a specific failure mode observed in production RAG assistants.

CriterionPass StandardFailure SignalTest Method

Unresolved Question Extraction

All questions from prior turns that received an abstention or low-confidence answer appear in the [PENDING_QUESTIONS] list

A previously unanswered question is missing from the carry-forward list

Run against a golden conversation history containing exactly 3 abstained answers; assert list length equals 3 and question text matches

Resolved Question Exclusion

Questions that received a grounded, high-confidence answer in prior turns are excluded from [PENDING_QUESTIONS]

A question that was already answered with citations appears in the carry-forward list

Feed a history with 2 resolved and 2 unresolved questions; assert only unresolved questions appear in output

Question Text Preservation

Carried-forward questions retain the user's original intent without paraphrasing that changes meaning

A carried-forward question introduces constraints or entities not present in the original user query

Compare original user question strings against carried-forward entries using semantic similarity threshold above 0.95; flag additions

Re-Attempt Triggering with New Context

When new [RETRIEVED_CONTEXT] is provided, the system re-attempts answering each pending question and updates [RESOLUTION_STATUS] to 'resolved' or 'still_unresolved'

A pending question remains untouched or status stays 'pending' after new relevant context is supplied

Provide context that definitively answers a previously unresolved question; assert status transitions to 'resolved' and answer contains citations

Persistent Unresolved Status

Questions that remain unanswerable after re-attempt are marked 'still_unresolved' with a reason in [UNRESOLVED_REASON]

The system fabricates an answer or marks a question 'resolved' without supporting evidence

Provide context irrelevant to the pending question; assert status remains 'still_unresolved' and reason field is non-empty

Cross-Turn Citation Consistency

Re-attempted answers use the same citation format and source identifiers as prior turns in the conversation

Citation format changes between turns or source document IDs shift without explanation

Validate output citation format against a predefined [CITATION_SCHEMA] using regex or schema validator; flag mismatches

Carry-Forward List Deduplication

Semantically identical pending questions from different turns are merged into a single entry with a reference to both original turn IDs

Duplicate questions appear as separate entries bloating the pending list

Feed history where the user asks the same unresolved question in turn 2 and turn 4; assert only one entry exists with both turn references

Empty State Handling

When no unresolved questions exist, the system returns an empty [PENDING_QUESTIONS] list and does not fabricate questions

The system hallucinates pending questions or returns a non-empty list when all prior questions were resolved

Feed a conversation where every question was answered with high confidence; assert [PENDING_QUESTIONS] is an empty array

ADAPTATION OPTIONS

Adapt This Prompt

How to adapt

Start with the base prompt and a simple in-memory list for [UNRESOLVED_QUESTIONS]. Use the model's native context window to carry forward the list as a formatted block at the end of each turn. No persistence layer needed.

code
[UNRESOLVED_QUESTIONS]
- Q1: What is the SLA for premium support?
- Q2: Is there a data residency option for EU customers?

Watch for

  • Questions dropping off when the list grows beyond context limits
  • No deduplication across turns, leading to repeated unresolved items
  • Model inventing resolutions without evidence when the list feels stale
Prasad Kumkar

About the author

Prasad Kumkar

CEO & MD, Inference Systems

Prasad Kumkar is the CEO & MD of Inference Systems and writes about AI systems architecture, LLM infrastructure, model serving, evaluation, and production deployment. Over 5+ years, he has worked across computer vision models, L5 autonomous vehicle systems, and LLM research, with a focus on taking complex AI ideas into real-world engineering systems.

His work and writing cover AI systems, large language models, AI agents, multimodal systems, autonomous systems, inference optimization, RAG, evaluation, and production AI engineering.