Journal indexDockup / field note
Note / production-guardrails-for-ai-agents

AI Agent Production Guardrails for Safe Autonomy

AI agent production guardrails for secrets, confirmations, audit logs, scoped access, structured errors, and safe autonomous deployment workflows.

AI agent production guardrails must survive more than a polite prompt. An autonomous coding agent can misunderstand a target, retry an operation, expose a credential in its explanation, or continue after an ambiguous response. Production safety therefore has to exist in the executable interface, authorization model, and audit trail—not only in instructions.

Dockup combines behavioral guidance in its Claude Code and Codex skill with CLI-level enforcement: secrets are masked, destructive operations require --yes, failures return stable codes, deploys can wait for a terminal state, and mutations appear in the audit log.

Why must guardrails be enforced below the prompt?

A prompt is useful policy, but it is not a security boundary. Agent context can be truncated, instructions can conflict, and a model can choose an incorrect interpretation. The underlying tool should make unsafe behavior difficult or impossible.

Consider a deletion request. The weak design exposes a command that deletes immediately and relies on the agent to remember to ask. The stronger design rejects the operation unless a separate confirmation flag is present.

Dockup uses the stronger pattern:

dockup up production/api --prune --json

Without explicit confirmation, the destructive cleanup is refused and the JSON includes code:"needs_confirm". Nothing is pruned. The agent must surface that result to a human, receive approval, and then deliberately rerun:

dockup up production/api --prune --yes --json

This is defense in depth. The Dockup skill tells the agent to stop, while the CLI prevents accidental execution even if the instruction is missed.

How does secret masking protect autonomous agents?

Agents often include command output in their reasoning or final response. If a read operation returns a production token, the secret can spread into chat history, logs, telemetry, screenshots, or copied incident notes.

A safe configuration interface separates secret metadata from secret values. Dockup returns environment variable keys and the isSecret marker, but stored secret values are null or masked.

dockup env list -s production/api --json

The agent can set a secret without later retrieving it:

dockup env set API_KEY="$API_KEY" \
  --secret \
  -s production/api \
  --json

Secret masking does not remove the need for careful process handling. The original value still exists in the shell environment during the set operation. Avoid set -x, do not echo the variable, and do not build command strings that are captured by verbose logging.

Database passwords, API keys, registry tokens, SSH credentials, and Windows RDP credentials should be treated as one-time or restricted outputs. An agent should store them in an approved secret manager or hand them directly to the next process without reproducing them in prose.

The wider application-level approach is covered in security best practices.

How should destructive action approval work?

Not every mutation deserves the same ceremony. A useful autonomy model separates operations by reversibility and blast radius:

LevelExampleDefault agent behavior
Read-onlyList services, read status, view logsExecute and summarize
Reversible writeSet a variable, trigger a deployExecute within approved scope
Operational recoveryRestart, rerun an older deploymentExecute if runbook permits; report evidence
DestructiveDestroy service, delete database, leave projectStop for explicit approval
Broad destructiveApply --prune, transfer ownershipRequire target-specific human confirmation

Explicit approval should include the exact target and consequence. “Yes, proceed” is weaker than “Delete staging/old-api and its associated service resources.” The agent should not reuse approval given for a different command or target.

Dockup config as code is additive by default. dockup up will not remove environment variables or domains absent from the manifest. Deletion requires the explicit --prune flag:

dockup plan production/api --json
dockup up production/api --prune --json

The plan is read-only and should be reviewed first. Even with --prune, secrets, services, databases, and volumes are protected from this manifest cleanup path. See dockup.yaml config as code for the full workflow.

How do structured errors keep autonomy bounded?

An agent needs a finite set of safe branches. Free-form messages are useful for humans, but stable error codes make the first response deterministic.

CodeCorrect response
not_logged_inStop and obtain a valid credential
not_linkedResolve the target or pass it explicitly
no_targetRun service discovery; never invent a slug
needs_confirmAsk for human approval
deploy_trigger_failedReport why the operation could not start
deploy_failedInspect build logs
deploy_timeoutReport non-terminal uncertainty

A deployment should use terminal-state waiting:

dockup deploy production/api --wait --json

The default timeout is 900 seconds. Exit 0 proves the deployment reached success. A non-zero exit prevents the agent from continuing to domain changes, migrations, or announcements as though production were ready.

This design is examined in AI agent CLI design. The principle is simple: the tool must make an ambiguous result explicit.

What should an audit log record?

Autonomy without attribution is operational debt. A production audit trail should answer who acted, what interface they used, which target changed, whether it was a read or write, when it happened, and whether it succeeded.

Dockup records CLI, UI, and API actions. Operators can inspect recent mutations:

dockup audit --writes --json
dockup audit --number 30 --json
dockup audit --search domains --json

The agent’s own report should complement the platform record. Include:

  1. The resolved project/service target.
  2. The command category, without secret values.
  3. Deployment or resource IDs returned by the platform.
  4. The exit code and structured status.
  5. Evidence gathered after the mutation.
  6. Any approval received for destructive work.
  7. Remaining uncertainty or follow-up.

Audit logs are not merely for post-incident blame. They allow a second agent or human operator to reconstruct state without repeating risky commands.

How can teams increase agent autonomy safely?

Start with read access and one low-risk service. Expand only when the agent demonstrates correct target discovery, secret hygiene, failure branching, and reporting.

A practical progression is:

Stage 1: Observe

Permit service listing, status, deployment history, build logs, runtime logs, uptime, usage, and security scan reads. Compare the agent’s summary with the raw JSON.

Stage 2: Deploy within a fixed target

Allow deployment of one service with --wait. Require a health check and a structured completion report. Do not grant deletion or team permissions.

Stage 3: Manage reversible configuration

Permit non-secret and secret variable updates, health-check configuration, and custom-domain setup under a reviewed runbook. Require redeployment after environment changes.

Stage 4: Operate recovery actions

Permit restart or rollback only when the agent selects an exact known deployment ID and retains failure evidence.

Stage 5: Approval-gated destructive work

Keep destructive flags behind explicit human approval, even when the credential technically permits them. Use scoped API keys where possible and review the audit trail regularly.

The agent skill installation reinforces these behaviors:

npm install -g dockup-cli
dockup skill install
dockup skill status --json

The Dockup CLI reference documents the enforced command behavior. The agent should verify its local schema rather than relying on a remembered example.

Guardrail review checklist

Before granting production access, answer each question:

  • Can the agent discover exact targets without guessing?
  • Are secret values masked in all read paths?
  • Does every failed mutation return non-zero?
  • Can long operations wait for a terminal state?
  • Are destructive actions blocked without explicit confirmation?
  • Are credentials scoped and supplied outside prompts?
  • Can every mutation be found in an audit log?
  • Is there a tested rollback or recovery procedure?
  • Can the skill and executable versions drift?
  • Does the final report separate fact from uncertainty?

A “no” is a design task, not a prompt-writing task. Production autonomy should grow only as the underlying guarantees grow.

Test the guardrails as failure cases

A review is incomplete until the team deliberately triggers the boundaries. Run a deploy with an invalid token, request an unknown target, allow a test build to fail, set a very short timeout, and attempt a destructive command without confirmation. Each case should produce a non-zero exit, a stable code, no secret leakage, and no unintended mutation.

These tests turn AI agent production guardrails into observable guarantees. Repeat them after CLI or policy updates, just as you would repeat authentication and authorization tests for an application. A guardrail that exists only in a slide deck will not protect an unattended release.

Put the workflow into production

Install the skill, inspect its instructions, and test every guardrail—including a blocked destructive command—before issuing a production token.

npm install -g dockup-cli
dockup skill install

The first command installs the CLI. The second installs the matching Dockup skill for Claude Code and Codex. Start free at app.dockup.ai.

FAQ

Are prompt instructions enough to keep an AI agent safe in production?

No. Prompts help guide behavior, but critical controls such as secret masking, confirmation, authorization, exit codes, and audit logging must be enforced by the tool and platform.

How does Dockup block destructive operations?

Destructive commands refuse to run without the explicit --yes flag and return the structured needs_confirm code, allowing the agent to stop and ask a human.

Can an AI agent read secret environment values from Dockup?

Stored secret values are masked in output. The agent can see the key and secret marker and can replace the value, but it does not receive the stored secret.

Why are structured error codes important for autonomy?

They constrain the agent to known recovery branches, such as requesting authentication, discovering the exact target, reading build logs, or asking for confirmation.

How should a team begin granting production access?

Start with read-only operations, then allow deployment to one low-risk target, and expand to reversible configuration and recovery only after the agent consistently reports verifiable evidence.