This prompt is for compliance engineers, platform architects, and security teams who need every write tool selection to be accompanied by a structured, reviewable justification. It forces the model to articulate the user request, the intended change, and why a read-only alternative is insufficient before a write tool is selected. Use this when audit trails, regulatory compliance, or internal governance require evidence that destructive operations were necessary and intentional. The output is a justification record that can be logged, reviewed, and used to demonstrate that write operations were not selected carelessly or by default.
Prompt
Write Tool Justification Requirement Prompt

When to Use This Prompt
Determine when to enforce structured justification before any write tool is selected, and when a lighter-weight guardrail is the better choice.
The ideal deployment context is a backend agent or copilot where write operations carry material risk: database mutations, configuration changes, user-visible actions, or state transitions that are difficult to undo. In these environments, the prompt sits between intent classification and tool execution. When the model proposes a write tool, this prompt intercepts the selection and requires the model to produce a structured justification block before the tool call is released. The justification must cite the specific user request, describe the intended change, and explain why a read-only tool cannot satisfy the request. A generic justification such as 'user asked for it' or 'write is required' should fail validation. The justification record becomes part of the audit log alongside the tool call and its result.
Do not use this prompt for latency-sensitive user-facing copilots where a justification step would degrade the experience. In chat-based products where users expect immediate action, inserting a justification round-trip adds friction that users will resent. Instead, use a lighter-weight confirmation prompt such as the Write Operation Confirmation Prompt Template or a pre-execution guardrail like the Write Operation Pre-Flight Check Prompt. Reserve this justification prompt for backend systems, internal tools, and regulated workflows where auditability is a hard requirement and the extra latency is an acceptable cost of doing business safely.
Use Case Fit
Where the Write Tool Justification Requirement Prompt works and where it introduces friction or false confidence.
Good Fit: Regulated Audit Trails
Use when: compliance frameworks require a documented reason for every state change. The prompt produces a structured justification record that auditors can review without replaying the full conversation. Guardrail: store the justification alongside the tool call in an append-only log.
Good Fit: High-Risk Write Operations
Use when: the write operation is destructive, irreversible, or affects multiple downstream systems. The justification step forces the model to articulate the blast radius before execution. Guardrail: pair the justification with a pre-flight impact analysis before granting execution.
Bad Fit: Low-Latency User Interactions
Avoid when: the user expects sub-second response times for routine writes such as saving a draft or toggling a setting. The justification step adds latency and verbosity that degrades UX. Guardrail: skip justification for pre-approved low-risk write operations with a static allowlist.
Bad Fit: Fully Automated Agent Loops
Avoid when: an agent is executing a pre-planned sequence of writes where each step was already approved. Re-justifying each call adds token cost without new information. Guardrail: generate a single plan-level justification and reference it in each tool call.
Required Inputs
Must provide: the user's original request verbatim, the proposed tool name and arguments, and the list of available read-only alternatives. Without the read-only alternatives, the model cannot demonstrate that a read was insufficient. Guardrail: validate that the justification explicitly references at least one rejected read-only tool.
Operational Risk: Generic Justifications
What to watch: the model produces vague justifications such as 'user requested an update' that bypass scrutiny and become rubber-stamp records. Guardrail: add eval checks that reject justifications under a minimum specificity threshold and require concrete field-level change descriptions.
Copy-Ready Prompt Template
A copy-ready system prompt that forces the model to produce a structured justification before selecting any write tool, creating an auditable record for compliance engineers.
This prompt template acts as a pre-tool-call guard for compliance-sensitive environments. It instructs the model to generate a structured justification block before selecting any tool that mutates state, writes data, or produces user-visible side effects. The justification must cite the specific user request, describe the intended change, and explain why a read-only alternative is insufficient. This record becomes part of your audit trail, giving compliance teams a traceable decision log for every write operation the model initiates.
textSYSTEM INSTRUCTION: Before selecting any tool classified as a write, destructive, or state-mutating operation, you MUST produce a structured justification block. Do not call the tool until the justification is complete. JUSTIFICATION FORMAT: ```json { "justification": { "user_request_summary": "[RESTATE THE USER'S REQUEST IN ONE SENTENCE]", "intended_change": "[DESCRIBE WHAT WILL BE CREATED, MODIFIED, OR DELETED]", "affected_resources": ["[RESOURCE_ID_OR_TYPE]", "..."], "read_only_alternative_considered": "[NAME THE READ-ONLY TOOL OR APPROACH THAT WAS EVALUATED]", "why_read_only_insufficient": "[EXPLAIN WHY A READ-ONLY OPERATION CANNOT SATISFY THE REQUEST]", "irreversibility_assessment": "reversible | partially-reversible | irreversible", "confidence": 0.0_to_1.0 } }
RULES:
- If no write tool is required, do not produce a justification block.
- If the user request is ambiguous between read and write intent, default to the read-only tool and explain the limitation.
- If confidence is below [CONFIDENCE_THRESHOLD], do not call the write tool. Instead, ask the user for clarification.
- If the operation is irreversible, flag it explicitly and consider requesting human approval before proceeding.
- Never use generic justifications such as "user requested it" or "write required." Each field must contain specific, auditable detail.
AVAILABLE TOOLS: [TOOLS]
USER REQUEST: [INPUT]
To adapt this template, replace [TOOLS] with your actual tool definitions, ensuring each tool has a clear operation_type field set to read, write, or destructive. Set [CONFIDENCE_THRESHOLD] to a value appropriate for your risk tolerance—0.85 is a common starting point for financial or healthcare systems. Replace [INPUT] with the user's request at runtime. If your system already classifies tools by side-effect profile, wire that classification into the operation_type field so the model can reference it directly. For high-risk domains, add a [RISK_LEVEL] placeholder that gates whether human approval is required before execution.
Prompt Variables
Placeholders required by the Write Tool Justification Requirement Prompt. Replace each with concrete values before execution. Validation notes describe how to check that the input is well-formed and safe.
| Placeholder | Purpose | Example | Validation Notes |
|---|---|---|---|
[USER_REQUEST] | The raw user input that triggered the tool selection process | Delete all records from the customers table where last_login is older than 2023-01-01 | Must be non-empty string. Check for injection patterns before passing to prompt. Log original request for audit trail. |
[PROPOSED_TOOL_NAME] | The name of the write tool the model intends to call | database_bulk_delete | Must match an entry in the registered tool catalog. Reject if tool name not found in allowlist. Case-sensitive match required. |
[PROPOSED_ARGUMENTS] | The full arguments object the model would pass to the write tool | {"table": "customers", "filter": {"last_login": {"$lt": "2023-01-01"}}} | Must be valid JSON. Validate against tool parameter schema before justification step. Reject if required fields missing or types mismatch. |
[AVAILABLE_READ_TOOLS] | List of read-only tools that could potentially satisfy the user request without side effects | ["database_query", "customer_search", "analytics_export"] | Must be a JSON array of tool names. Each name must exist in tool catalog and be tagged as read-only. Empty array is valid if no read alternatives exist. |
[TOOL_CATALOG_CONTEXT] | Descriptions and side-effect profiles of relevant tools for the model to reason about | database_bulk_delete: Destructive write. Removes rows matching filter. No rollback. database_query: Read-only. Returns rows matching SQL SELECT. | Must include side-effect classification for each tool. Descriptions must match current deployed tool versions. Stale descriptions cause false justifications. |
[AUDIT_TRAIL_ID] | Unique identifier linking this justification to the broader request trace | req_9a7b3c_2025-01-15_toolselect_02 | Must be unique per justification attempt. Use UUID or trace-id format. Must be logged alongside justification output for compliance review. |
[CONFIDENCE_THRESHOLD] | Minimum confidence score required before a write justification can be accepted without human review | 0.85 | Must be float between 0.0 and 1.0. Values below 0.7 should always require human approval regardless of threshold. Document threshold rationale in system config. |
Implementation Harness Notes
How to wire the Write Tool Justification Requirement Prompt into a production application with validation, logging, and audit controls.
This prompt is not a conversational suggestion—it is a compliance gate. Wire it into your tool-call pipeline so that every write operation is preceded by a structured justification record. The model must produce the justification as a separate, parseable output before the write tool call is executed. In practice, this means your application should intercept any proposed tool call classified as write or destructive, invoke this prompt with the user request and proposed tool call as context, and block execution until a valid justification is received and logged. The justification record becomes part of your immutable audit trail, alongside the user request, the tool call arguments, the timestamp, and the session identifier.
Pipeline integration: Structure your tool-execution middleware as a three-step sequence. First, classify the proposed tool call using a read-vs-write intent classifier. If the call is read-only, proceed without justification. If the call is a write, invoke this prompt with [USER_REQUEST], [PROPOSED_TOOL_CALL] (name and arguments), and [AVAILABLE_READ_ALTERNATIVES] (a list of read-only tools that could partially satisfy the request). Parse the model's output against a strict JSON schema that requires justification_id, user_intent_summary, intended_change, read_alternative_considered, why_read_insufficient, and confidence_score. Reject any justification where why_read_insufficient is fewer than 20 words or contains generic phrases like 'user requested it' or 'write is required.' Log the justification, attach it to the tool call metadata, and only then execute the write. If the model refuses to justify or produces an invalid record, escalate to a human reviewer queue with the full context preserved.
Validation and evals: Build automated checks that run on every justification before execution. Reject justifications that cite no specific read alternative by name, that use circular reasoning ('write is needed because write is needed'), or that fail to quote the relevant portion of the user request. In your eval harness, maintain a dataset of borderline cases—requests that could plausibly be satisfied by a read operation but where a user might expect a write. Measure the false-justification rate: how often the model produces a passing justification for a write that a human reviewer would deem unnecessary. Set a threshold (e.g., <5% false-justification rate) and gate prompt changes on it. For high-risk domains such as financial transactions, PII modification, or infrastructure changes, require dual approval: the model's justification must be reviewed by a second human or a separate LLM judge before execution proceeds.
Model choice and latency: This prompt adds a synchronous step before every write operation, so latency matters. Use a fast, instruction-tuned model (e.g., GPT-4o-mini, Claude Haiku) for the justification generation, reserving larger models for the human-escalation review path. Cache the read-alternative tool list per session to avoid rebuilding it on each call. If your application issues writes in rapid succession, consider batching justification requests where the same user intent spans multiple tool calls, but never batch across different user requests or sessions—each audit record must be traceable to a single user action. Monitor justification generation latency in your observability dashboard and set an SLA (e.g., p95 < 800ms) with automatic fallback to human review if the model times out.
What to avoid: Do not treat this prompt as a checkbox that can be satisfied with boilerplate. The primary failure mode is justification drift, where the model learns to produce superficially valid justifications that pass schema validation but contain no real reasoning. Combat this by rotating eval examples, periodically reviewing a sample of production justifications, and updating the prompt's [CONSTRAINTS] to block newly observed bypass patterns. Never allow a write to proceed without a logged justification record—even in 'emergency' or 'admin override' paths, require a manual justification entry that follows the same schema. The audit trail is only as strong as its weakest entry.
Expected Output Contract
Fields, format, and validation rules for the structured justification record produced before any write tool is selected. Use this contract to build downstream audit logging, pre-execution guardrails, and compliance checks.
| Field or Element | Type or Format | Required | Validation Rule |
|---|---|---|---|
justification_id | string (UUID v4) | Must be a valid UUID v4 string. Reject if missing or malformed. | |
timestamp | string (ISO 8601 UTC) | Must parse as valid ISO 8601 datetime in UTC. Reject if timezone is missing or non-UTC. | |
user_request_summary | string (1-3 sentences) | Length must be between 20 and 500 characters. Must not be a verbatim copy of [USER_INPUT]. Reject if empty or generic placeholder text. | |
intended_change | string | Must describe a specific state mutation (create, update, delete, execute). Reject if it describes a read-only operation or uses vague language like 'handle request'. | |
selected_tool_name | string | Must exactly match a tool name in [AVAILABLE_WRITE_TOOLS]. Reject if tool is not in the write-tool registry or is classified as read-only. | |
read_only_alternative_considered | string | Must name at least one tool from [AVAILABLE_READ_TOOLS] or explicitly state 'none available'. Reject if field is empty or cites a write tool as read-only. | |
read_only_insufficiency_rationale | string | Must explain why the read-only alternative cannot satisfy the user request. Reject if rationale is generic (e.g., 'not applicable') without specific reasoning tied to [USER_INPUT]. | |
confidence_score | number (0.0 to 1.0) | Must be a float between 0.0 and 1.0 inclusive. If below [CONFIDENCE_THRESHOLD], the justification record must be routed for human review before tool execution. |
Common Failure Modes
What breaks first when requiring write justifications and how to guard against it.
Generic Justification Bypass
What to watch: The model produces a vague justification like 'user requested change' that satisfies the output schema but provides no real audit trail. This bypasses the entire purpose of the justification requirement. Guardrail: Require specific fields in the justification schema: cite the exact user request text, name the target resource, and explain why a read-only alternative is insufficient. Validate that each field contains non-generic content before accepting the justification.
Write Selection Without Justification
What to watch: The model selects a write tool but fails to produce the required justification record, either by omitting it entirely or by producing it in a non-parseable format. This creates an audit gap where destructive operations proceed without traceability. Guardrail: Implement a pre-execution gate that blocks any write tool call unless accompanied by a valid, parseable justification record. Return an error to the model requiring regeneration rather than proceeding silently.
Read-Only Alternative Suppression
What to watch: The justification claims no read-only alternative exists when one clearly does, either because the model didn't search the tool catalog thoroughly or because it prioritized user-perceived speed over correctness. Guardrail: Include a required field in the justification schema that lists at least one read-only tool considered and explains why it was rejected. If the field is empty or the reasoning is circular, reject the justification.
Justification Drift Under Repeated Use
What to watch: After several successful write operations, the model begins producing shorter, less rigorous justifications as the pattern degrades. Early justifications are thorough; later ones become perfunctory. Guardrail: Implement a minimum length or minimum entity count check on justification fields. Monitor justification quality metrics over a session and escalate to human review if quality scores drop below a threshold.
Multi-Step Write Without Per-Step Justification
What to watch: The model proposes a sequence of write operations but produces only one justification covering the first step, leaving subsequent mutations unaccounted for. This is common when the model treats a multi-tool plan as a single action. Guardrail: Require a justification record for each individual write tool call in a sequence. Validate that the number of justification records matches the number of write tool calls before any execute.
Justification Reuse Across Unrelated Requests
What to watch: The model reuses a previous justification template for a new, unrelated write request, changing only superficial details while keeping the core reasoning identical. This produces audit records that look valid but misrepresent the actual decision process. Guardrail: Compare each new justification against recent justifications using embedding similarity or key-phrase overlap. Flag near-duplicates for human review before the write proceeds.
Evaluation Rubric
Criteria for evaluating whether the model's write tool justification is sufficient, specific, and auditable before a write operation is allowed to proceed. Use these criteria to build automated eval checks or human review gates.
| Criterion | Pass Standard | Failure Signal | Test Method |
|---|---|---|---|
Justification Presence | A non-empty justification string is produced for every write tool call | Null, empty string, or missing justification field when a write tool is selected | Schema check: assert [JUSTIFICATION] field exists and length > 0 |
User Intent Citation | Justification explicitly quotes or paraphrases the specific user request that triggered the write | Generic phrases like 'user wants to update' without referencing the actual request text | String match: assert [USER_REQUEST] substring or semantic similarity > 0.8 to justification text |
Intended Change Description | Justification states what resource will change, the specific field or property, and the new value | Vague descriptions like 'update record' or 'make change' without field-level specificity | Entity extraction: assert at least one resource name and one field name are present |
Read-Only Alternative Rejection | Justification explains why a read-only tool or query cannot satisfy the user request | No mention of read-only alternatives, or claim that read is insufficient without explanation | Keyword check: assert presence of 'read-only', 'retrieve', 'fetch', or named read tool with rationale |
Specificity Score | Justification contains at least two concrete details (resource name, field, value, timestamp, or user ID) | Justification is a single generic sentence with no concrete identifiers | Count entities: assert count of named entities, IDs, or field paths >= 2 |
Audit Trail Completeness | Justification includes or references a correlation ID, request ID, or session ID for traceability | No trace identifier present, making audit log linkage impossible | Regex check: assert [TRACE_ID] pattern match or field populated in output |
Bypass Detection | Justification does not contain generic bypass language like 'user requested write' without further specificity | Justification is a tautology that restates 'write was selected because write was needed' | Similarity check: assert cosine similarity between justification and generic bypass templates < 0.7 |
Confidence Alignment | Justification quality correlates with confidence score; low-confidence writes have more detailed justification | High-confidence score paired with minimal or generic justification, or vice versa | Correlation check: assert [CONFIDENCE] < 0.8 implies justification length > 100 chars or entity count >= 3 |
Enabling Efficiency, Speed & Accuracy
Intelligent Analysis, Decision & Execution
We build AI systems for teams that need search across company data, workflow automation across tools, or AI features inside products and internal software.
Talk to Us
Search across company data
Give teams answers from docs, tickets, runbooks, and product data with sources and permissions.
Useful when people spend too long searching or get different answers from different systems.

Automate internal workflows
Use AI to route work, draft outputs, trigger actions, and keep approvals and logs in place.
Useful when repetitive work moves across multiple tools and teams.

Add AI to products and internal tools
Build assistants, guided actions, or decision support into the software your team or customers already use.
Useful when AI needs to be part of the product, not a separate tool.
Adapt This Prompt
How to adapt
Use the base prompt with a simpler justification schema. Drop the [EVIDENCE_CITATION] field and accept a single-sentence rationale. Run with a small set of known write tools and test against 10-15 scenarios.
codeBefore selecting any write tool, produce: { "justification": "[ONE_SENTENCE_RATIONALE]", "read_alternative_considered": "[READ_TOOL_NAME_OR_NONE]" }
Watch for
- Generic justifications like "user requested it" that bypass scrutiny
- Model skipping the justification block entirely when confident
- No differentiation between reversible and irreversible writes

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.
Partnered with leading AI, data, and software stack.
How We Work
Custom AI workflows for your Business
One-fit-all AI don't work for modern businesses. At Inferensys, we aim to understand your business & custom requirements; which we use to define most efficient agentic workflows, the data, and the tools for your business.
01
Review the use case
We understand the task, the users, and where AI can actually help.
Read more02
Pick the right approach
We define what needs search, automation, or product integration.
Read more03
Build the first useful version
We implement the part that proves the value first.
Read more04
Improve from there
We add the checks and visibility needed to keep it useful.
Read moreThe first call is a practical review of your use case and the right next step.
Talk to Us