Inferensys

Prompt

Tool Contract Read-Only vs Mutating Operation Tag Prompt

A practical prompt playbook for using Tool Contract Read-Only vs Mutating Operation Tag Prompt in production AI workflows.
Developer demonstrating multi-agent tool use, agent tool selection interface on laptop, casual tech demo moment.
PROMPT PLAYBOOK

When to Use This Prompt

Define the job, reader, and constraints for classifying tool operations by mutation risk.

This prompt is for security engineers and platform operators who need to classify every operation in a tool contract as read-only, side-effect, or destructive before an agent is allowed to invoke it. The job-to-be-done is safety gating: you have a tool schema—likely from an OpenAPI spec, an MCP server, or an internal service definition—and you need a machine-readable tag on each operation so your agent runtime can enforce confirmation rules, require human approval, or block calls entirely based on risk level. The ideal user is someone integrating a new tool into a production agent system where a misclassified DELETE or a silent POST that mutates state could cause data loss, compliance violations, or customer impact.

Do not use this prompt when you need runtime argument-level analysis (e.g., 'this specific call would delete 10,000 records'). This prompt classifies operations by their declared contract, not by the blast radius of a particular invocation. Do not use it for tools where the schema is so ambiguous that even a human reviewer cannot determine side effects from the description alone—garbage descriptions produce garbage tags. This prompt also does not replace a full threat model; it is one layer in a defense-in-depth strategy that should include argument validation, output sanitization, and human-in-the-loop approval for destructive actions. If your tool contract uses non-standard HTTP methods or custom RPC verbs, you must include those in the [CUSTOM_VERB_RULES] section of the prompt or the model will default to conservative classification, which may over-block legitimate operations.

Before running this prompt, ensure you have the complete tool contract with operation IDs, HTTP methods, path patterns, and natural-language descriptions. The output is a structured tag per operation, not a narrative summary. Wire the output into your agent's tool selection layer so that read-only operations proceed without friction, side-effect operations trigger a confirmation or logging step, and destructive operations require explicit human approval. If your agent framework does not support per-operation gating, start by implementing it for destructive tags first—that alone prevents the highest-severity incidents. After classification, spot-check at least 10% of operations manually, focusing on any operation where the model's confidence score falls below 0.9 or where the description contains words like 'update,' 'modify,' or 'remove' without clarifying scope.

PRACTICAL GUARDRAILS

Use Case Fit

Where the Read-Only vs Mutating Operation Tag Prompt delivers value and where it introduces risk.

01

Good Fit: Pre-Execution Safety Gates

Use when: An agent must classify a tool operation before invocation to decide whether to auto-approve, request confirmation, or block execution. Guardrail: Run the prompt in a pre-execution hook that gates the actual tool call; never rely on post-hoc classification.

02

Good Fit: Heterogeneous Tool Ecosystems

Use when: You have tools from multiple teams, vendors, or MCP servers with inconsistent or missing side-effect documentation. Guardrail: Treat the prompt output as a normalized overlay, not a replacement for provider documentation. Flag mismatches for human review.

03

Bad Fit: Real-Time Safety-Critical Systems

Avoid when: The classification decision must be made with hard real-time guarantees or deterministic correctness. Guardrail: Use static allowlists and compile-time checks for safety-critical paths. This prompt is a probabilistic layer, not a proof.

04

Bad Fit: Ambiguous or Composite Operations

Avoid when: A single tool endpoint mixes read and write behavior based on arguments or internal state. Guardrail: Refactor the tool contract to separate read and write paths before applying classification. A single tag on a composite operation creates a false sense of safety.

05

Required Input: Complete Tool Contract

Risk: Classification without the full schema, description, argument list, and error codes produces unreliable tags. Guardrail: Require the complete tool definition as input. If the schema is incomplete, route to the Tool Schema Annotation Prompt first.

06

Operational Risk: Classification Drift

Risk: A tool's implementation changes but its contract and classification tags do not, creating a silent authorization gap. Guardrail: Re-run classification on every tool schema version change and tie the tag to a specific schema hash. Block execution if the hash mismatches.

PROMPT PLAYBOOK

Copy-Ready Prompt Template

A reusable prompt for classifying tool operations by mutation risk and producing safety tags for agent gating.

This prompt template is designed to be dropped into a security review pipeline where every tool operation must be classified before an agent is allowed to invoke it. The prompt takes a tool contract as input and returns a structured operation tag with a mutability classification, a risk level, and a rationale. The output is intended to be consumed by an agent safety gate that enforces approval workflows for destructive or side-effect operations. Use this prompt when you need consistent, auditable operation classification across a heterogeneous tool ecosystem.

text
You are a tool safety classifier. Your job is to analyze a tool operation and classify it by mutation risk.

## INPUT
Tool Name: [TOOL_NAME]
Operation: [OPERATION_NAME]
Description: [OPERATION_DESCRIPTION]
Arguments: [ARGUMENTS]
HTTP Method: [HTTP_METHOD]
Path: [PATH]

## CLASSIFICATION RULES
1. **read-only**: The operation does not create, update, or delete any resource. It only retrieves data. Safe to call without approval.
2. **side-effect**: The operation creates or updates resources but is reversible or low-risk (e.g., creating a log entry, updating a status field). May require logging but not always human approval.
3. **destructive**: The operation deletes resources, modifies critical configuration, triggers financial transactions, or exposes sensitive data. Always requires human approval.

## OUTPUT SCHEMA
Return a JSON object with these fields:
- `operation_tag`: "read-only" | "side-effect" | "destructive"
- `risk_level`: "low" | "medium" | "high" | "critical"
- `requires_approval`: boolean
- `rationale`: string explaining the classification with specific evidence from the operation description
- `concerns`: array of strings listing specific risks (empty array if none)

## CONSTRAINTS
- If the operation description is ambiguous, default to the higher-risk classification.
- If the HTTP method is DELETE, the operation is at minimum "side-effect" and likely "destructive".
- If the operation accesses PII, credentials, or financial data, flag it in `concerns`.
- Do not invent information not present in the input.

## EXAMPLES
Input: Tool "user-service", Operation "getUser", GET /users/{id}, returns user profile
Output: {"operation_tag": "read-only", "risk_level": "low", "requires_approval": false, "rationale": "GET request that retrieves data without modification", "concerns": ["Returns PII if user profile includes email or phone"]}

Input: Tool "billing-service", Operation "chargeCustomer", POST /charges, creates a payment
Output: {"operation_tag": "destructive", "risk_level": "critical", "requires_approval": true, "rationale": "Initiates financial transaction that cannot be automatically reversed", "concerns": ["Financial impact", "Irreversible without refund process"]}

Now classify the operation described in the INPUT section.

Adapt this template by replacing the placeholder values with your actual tool metadata. The [ARGUMENTS] placeholder should include the full argument schema with types and descriptions, as argument sensitivity often drives classification. If your approval workflow has more granular levels, extend the operation_tag enum and adjust the requires_approval logic accordingly. For production use, pair this prompt with a validation step that checks the output JSON against the declared schema before the safety gate consumes it. If the model returns an unrecognized tag or missing required fields, reject the classification and retry with a more explicit error message rather than defaulting to a permissive setting.

IMPLEMENTATION TABLE

Prompt Variables

Required inputs for the Tool Contract Read-Only vs Mutating Operation Tag Prompt. Populate these placeholders before invoking the prompt to ensure reliable classification and safety gating.

PlaceholderPurposeExampleValidation Notes

[TOOL_CONTRACT]

The full tool definition to classify, including name, description, and argument schema.

{"name": "update_user_email", "description": "Changes the email address for a user account.", "parameters": {...}}

Must be valid JSON. Reject if description or parameters are missing. Schema parse check required.

[OPERATION_CONTEXT]

Additional context about how the tool is invoked, including caller identity, environment, and intended workflow.

"Called by admin dashboard during user profile edit flow in production."

String or null. If null, classification defaults to most conservative (destructive) tag. Null allowed.

[SECURITY_POLICY]

The organization's definitions for read-only, side-effect, and destructive operations, including approval thresholds.

"Read-only: no data mutation. Side-effect: creates or modifies non-critical state. Destructive: deletes data, modifies permissions, or triggers external payments."

Must be a non-empty string. If policy is vague, prompt will request clarification before tagging. Approval required for policy changes.

[APPROVAL_WORKFLOW]

The current approval workflow rules that determine when human review is required for each operation class.

"Destructive operations require two-person approval. Side-effect operations require one-person approval if in production."

String or null. If null, prompt defaults to requiring human approval for all mutating operations. Null allowed.

[PREVIOUS_TAGS]

Previously assigned operation tags for similar tools, used to maintain consistency across the tool ecosystem.

[{"tool": "delete_user", "tag": "destructive", "rationale": "Permanently removes user records"}]

Array of objects with tool, tag, and rationale fields. If empty array, classification proceeds without consistency check. Schema check required.

[FAILURE_MODE_EXAMPLES]

Known examples of misclassified tools that bypassed safety gates, used as negative examples for the classifier.

[{"tool": "archive_project", "misclassified_as": "read-only", "actual_behavior": "Moves data to cold storage and removes from active indexes"}]

Array of objects. If empty, prompt uses default heuristics. Each example must include misclassified_as and actual_behavior fields. Schema check required.

[OUTPUT_SCHEMA]

The expected JSON schema for the classification output, including required fields and enum values.

{"tag": "destructive", "confidence": 0.95, "rationale": "...", "requires_approval": true}

Must define tag enum: read-only, side-effect, destructive. Confidence must be 0.0-1.0. requires_approval must be boolean. Schema validation required before agent consumption.

PROMPT PLAYBOOK

Implementation Harness Notes

How to wire the operation classification prompt into a production tool-gating workflow with validation, retries, and human review.

This prompt is not a standalone classifier; it is a safety gate that must be wired into your agent's tool execution pipeline. The harness should intercept every tool call before execution, classify the operation using this prompt, and enforce a policy based on the returned tag. A read-only tag allows immediate execution. A side-effect tag should trigger a confirmation step or log the operation for audit. A destructive tag must halt execution and require explicit human approval. The harness must never execute a tool call that returns an invalid or missing tag—treat that as a destructive operation by default to fail closed.

Implement the harness as a pre-execution middleware in your agent framework. For each tool call, construct the prompt by injecting the tool's full contract—name, description, argument schema, and the specific arguments the agent intends to pass—into the [TOOL_CONTRACT] placeholder. Use a fast, inexpensive model (such as GPT-4o-mini or Claude Haiku) for classification to keep latency low. Set temperature=0 and enforce a structured output mode that returns a JSON object with exactly the operation_tag field. Validate the response immediately: if the tag is not one of read-only, side-effect, or destructive, or if the JSON is malformed, retry once. If the retry also fails, escalate to a human operator and block the tool call. Log every classification decision with the tool name, arguments, tag, model used, and timestamp for auditability.

For high-throughput systems, cache classification results by a hash of the tool name and argument schema (not the argument values, since those change per call). A tool's contract rarely changes, so re-classifying the same tool on every invocation is wasteful. Invalidate the cache when the tool schema version increments. For tools with dynamic behavior where the same tool can be read-only or mutating depending on arguments (e.g., an HTTP client that can GET or DELETE based on the method argument), do not cache—classify every call with the full argument context. Wire the harness to emit structured logs and metrics: count classifications by tag, track retry rates, and alert if the destructive tag rate spikes unexpectedly, which may indicate a prompt regression or an agent attempting unauthorized mutations.

IMPLEMENTATION TABLE

Expected Output Contract

Fields, format, and validation rules for the operation tag output. Use this contract to parse and validate the model response before routing to approval gates.

Field or ElementType or FormatRequiredValidation Rule

operation_id

string

Must match the [OPERATION_ID] input exactly. Fail if missing or altered.

operation_name

string

Non-empty string. Must not exceed 200 characters. Reject if null or whitespace only.

operation_tag

enum: read_only | side_effect | destructive

Must be exactly one of the three allowed enum values. Reject any other string.

risk_level

enum: low | medium | high | critical

Must be exactly one of the four allowed enum values. Reject if missing or invalid.

justification

string

Must contain at least one sentence referencing the operation's data mutation behavior. Reject if empty or generic.

affected_resources

array of strings

Must be a non-empty array. Each element must be a non-empty string. Reject if null or empty array.

requires_approval

boolean

Must be true if operation_tag is destructive or risk_level is critical. Validate consistency with tag and risk_level.

confidence_score

number

If present, must be between 0.0 and 1.0 inclusive. Null allowed. Reject if outside range.

PRACTICAL GUARDRAILS

Common Failure Modes

What breaks first when classifying tool operations by mutation risk and how to guard against it.

01

Misclassification of Side-Effect Operations

What to watch: Operations that modify external state without explicit data mutation (e.g., sending notifications, triggering webhooks, updating caches) are often misclassified as read-only. This bypasses approval gates and creates audit gaps. Guardrail: Require explicit enumeration of side-effect categories in the prompt schema. Add a 'side-effect' tag distinct from 'read-only' and 'destructive' with mandatory human review for any operation tagged as side-effect unless explicitly allowlisted.

02

Schema Drift Between Tag and Actual Behavior

What to watch: Tool implementations change over time, but operation tags remain static. A previously read-only endpoint may gain mutation capabilities after an API update, leaving the safety gate stale. Guardrail: Implement a periodic re-validation pipeline that compares tagged contracts against live API behavior or updated OpenAPI specs. Flag any operation where the declared tag conflicts with observed side effects for immediate review.

03

Ambiguous Operation Naming Bypassing Classification

What to watch: Poorly named operations (e.g., 'process', 'execute', 'handle') provide insufficient signal for accurate mutation risk classification. The model defaults to conservative or permissive guesses, both of which cause production incidents. Guardrail: Add a pre-classification step that requires tool providers to supply a capability statement for any operation with an ambiguous name. Reject schemas that lack clear verb-object descriptions before classification runs.

04

Batch Operations Masking Destructive Sub-Actions

What to watch: A batch endpoint tagged as 'read-only' may contain individual sub-operations that mutate or delete resources. The aggregate tag hides destructive behavior, allowing bulk data loss through a supposedly safe call. Guardrail: Require batch operations to declare the maximum risk level of any sub-operation. If any sub-action is destructive, the entire batch must inherit the destructive tag and require approval.

05

Parameter-Dependent Mutation Not Captured in Static Tags

What to watch: An operation's mutation risk depends on argument values (e.g., a 'dry_run' flag, a 'mode' enum). Static tags cannot express conditional risk, leading to over-blocking safe calls or under-blocking dangerous ones. Guardrail: Extend the output schema to support conditional tags with parameter predicates. For example, tag as 'read-only when dry_run=true, destructive otherwise.' Validate that all enum values and flag states are covered.

06

Approval Workflow Bypass via Tag Spoofing

What to watch: If the classification prompt output is consumed directly by an approval router without cryptographic verification, a compromised or hallucinating agent can emit a 'read-only' tag for a destructive operation and bypass human review entirely. Guardrail: Never trust the tag alone. Implement a server-side re-check that validates the operation against a signed, immutable contract registry before the approval gate. Log all tag mismatches as security events.

IMPLEMENTATION TABLE

Evaluation Rubric

Use this rubric to evaluate the quality and safety of the operation tags produced by the prompt before deploying the classification into an agent safety gating system. Each criterion targets a specific failure mode that could allow a mutating operation to bypass approval workflows.

CriterionPass StandardFailure SignalTest Method

Read-Only Classification Accuracy

All GET, LIST, DESCRIBE, and SEARCH operations are tagged as 'read-only' with no false negatives.

A GET operation is tagged as 'side-effect' or 'destructive'.

Run a golden set of 20 standard REST/GraphQL read operations through the prompt and assert all output tags are 'read-only'.

Destructive Operation Detection

All DELETE, DROP, PURGE, and TERMINATE operations are tagged as 'destructive' with no false negatives.

A DELETE operation is tagged as 'read-only' or 'side-effect'.

Run a golden set of 15 destructive operations through the prompt and assert all output tags are 'destructive'.

Side-Effect Boundary Enforcement

All POST, PUT, PATCH, CREATE, and UPDATE operations are tagged as 'side-effect' unless they meet explicit destructive criteria.

A POST operation that creates a resource is tagged as 'read-only'.

Run a golden set of 25 mutating but non-destructive operations through the prompt and assert all output tags are 'side-effect'.

Ambiguous Operation Handling

Operations with unclear mutation semantics (e.g., EXECUTE, INVOKE, RUN) are tagged as 'side-effect' by default and flagged with a confidence score below 0.9.

An EXECUTE operation that runs a stored procedure is tagged as 'read-only' with high confidence.

Run a set of 10 ambiguous operations through the prompt and assert no 'read-only' tags appear with confidence above 0.8.

Confidence Score Calibration

Confidence scores for 'read-only' tags are above 0.95 only when the operation has zero mutation risk. Scores below 0.9 trigger a human review flag.

A 'read-only' tag is assigned with a confidence score of 0.99 to an operation that logs access but does not mutate data.

Extract confidence scores from 50 tagged operations and verify that all 'read-only' tags with scores above 0.95 correspond to truly read-only operations via manual audit.

Schema Field Sensitivity Flagging

Output includes a 'sensitive_fields' array identifying any input arguments that accept PII, credentials, or tokens.

A tool schema with a 'password' or 'api_key' argument produces an empty 'sensitive_fields' array.

Provide schemas with 10 known sensitive fields and assert the 'sensitive_fields' array contains all expected field names.

Approval Workflow Trigger Accuracy

Any operation tagged as 'destructive' or 'side-effect' with confidence below 0.9 includes an 'approval_required: true' field in the output.

A 'destructive' operation is tagged with 'approval_required: false'.

Run 20 destructive and low-confidence side-effect operations through the prompt and assert 'approval_required' is 'true' for all outputs.

Idempotency Hint Presence

Operations tagged as 'side-effect' include an 'idempotency_hint' field indicating whether the operation is safe to retry.

A PUT operation that is idempotent by design has a null or missing 'idempotency_hint' field.

Provide 10 idempotent and 10 non-idempotent mutating operations and assert the 'idempotency_hint' field is populated correctly for each.

ADAPTATION OPTIONS

Adapt This Prompt

How to adapt

Start with the base prompt and a simple two-category output (READ_ONLY | MUTATING). Remove the destructive sub-label and evidence requirements. Use a small set of 5-10 known tool contracts to iterate quickly.

code
Classify each operation as READ_ONLY or MUTATING.

Tool: [TOOL_NAME]
Operation: [OPERATION_NAME]
Description: [OPERATION_DESCRIPTION]
Arguments: [ARGUMENTS]

Return JSON: {"operation": "...", "tag": "READ_ONLY|MUTATING", "rationale": "..."}

Watch for

  • Overly broad MUTATING tags on idempotent writes (e.g., PUT with same payload)
  • Missing distinction between read-only metadata ops and data-access reads
  • No validation of argument side-effects (e.g., a GET that triggers a write via query param)
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.