Full Automation
July 16, 2026 ยท View on GitHub
--full-auto lets VT Code run non-interactively on explicitly allow-listed tools. It is an execution and permission layer on top of the active primary agent, not a primary agent of its own. Use it only when you fully trust the workspace configuration and have reviewed the safeguards below.
--full-auto is intentionally separate from normal session permissions:
- Normal sessions use primary agents plus granular permission rules.
- Agent specs use
permissions.defaultplusallow,ask,auto, anddenyrule buckets. - The
permissions.autobucket sends matching calls to classifier-backed review instead of treating them as unrestricted. --full-autouses the explicit[automation.full_auto]allow-list as a hard gate. Tools outside the allow-list are denied; promptable outcomes inside the allow-list are routed through automatic permission review after explicit deny and policy checks instead of asking.--dangerously-skip-permissionsauto-approves promptable actions while still respecting explicit denies and policy blocks.
Primary-agent selection still works normally. If you explicitly select or configure a primary agent, including duck, full-auto runs on top of that agent. If no primary agent is explicitly selected or configured, VT Code selects the effective auto primary agent. If full-auto needs that defaulted auto agent and no effective auto exists, startup fails fast.
Activation Checklist
- Update
vtcode.toml- Enable the feature:
automation.full_auto.enabled = true. - Configure the tool allow-list to match your risk tolerance.
- Keep
require_profile_ack = trueso a profile file is required.
- Enable the feature:
- Create the acknowledgement profile
- Place the file referenced by
automation.full_auto.profile_pathin your workspace. - Document acceptable behaviour, escalation procedures, and any workspace-specific hazards.
- Place the file referenced by
- Review tool policies
- Full automation still honours existing tool policies; denied tools remain blocked.
- Tools not included in the allow-list will be rejected automatically.
- Allow-listed promptable actions use automatic permission review after deny and policy checks.
- Launch the agent
- Run
vtcode --full-autowith any other CLI flags you need.
- Run
Runtime Behaviour
- VT Code displays the active allow-list at session start.
- Full-auto does not grant tools outside
[automation.full_auto].allowed_tools. - Explicit denies and policy blocks are honoured before full-auto review.
- Promptable allow-listed actions are reviewed automatically instead of interrupting for user input.
- Non allow-listed tools are rejected before execution, and their attempts are logged.
- If the acknowledgement profile is missing while required, the CLI aborts before launching.
Customising The Allow-List
[automation.full_auto]
enabled = true
require_profile_ack = true
profile_path = "automation/full_auto_profile.toml"
allowed_tools = [
"exec_command",
"write_stdin",
"apply_patch",
"code_search",
]
Tips:
- Use the constants listed in
vtcode_core::config::constants::toolsto avoid typos. - Include
"*"only when the workspace is fully isolated. - Combine with granular agent permissions if you need per-tool constraints in normal interactive sessions.
- Treat the list as a hard execution boundary for full-auto: outside the list is denied, and inside the list still passes deny and policy checks before automatic review.
Propose/Verify Sub-agent
When automation.full_auto.verify_mutations is enabled, every call to SubagentController::verify_proposed_change() spawns a fresh read-only verifier sub-agent that re-reads the affected files and approves or rejects the change before it is committed. The verifier runs with no shared context from the proposer, preventing confirmation bias.
[automation.full_auto]
enabled = true
verify_mutations = true
The verifier is gated behind this flag because it roughly doubles the token cost on mutating calls. Default: false.
When enabled, the propose/verify cycle works as follows:
- The proposer sub-agent makes a change (file edit, shell command, etc.).
- The caller invokes
verify_proposed_change()with a diff description and affected file paths. - A verifier sub-agent (falling back to the
exploreragent if noverifieragent is defined) reads the files and returnsVerificationResult { approved, issues, reasoning }. - If rejected, the caller can retry the mutation up to N times.
See Loop Engineering for the full design.
Orchestrated Harness
For longer unattended builds, prefer enabling the planner/evaluator harness instead of relying on a single uninterrupted build loop:
[agent.harness]
orchestration_mode = "plan_build_evaluate"
max_revision_rounds = 2
When enabled, vtcode exec --full-auto writes a small set of working artefacts under .vtcode/tasks/:
current_spec.md: high-level execution speccurrent_contract.md: observable done criteria and verification contractcurrent_task.md: tracker statecurrent_evaluation.md: evaluator output after a completion attempt
This keeps long-running work resumable and makes evaluator-driven revision rounds explicit instead of relying on the generator to judge itself.
Each revision round follows a fixed LLM-call lifecycle:
- Planner expands the task into a spec, contract, feature list, and tracker.
- Build executes the tracker (may issue multiple turns, including tool calls, until it signals completion).
- Evaluator judges the candidate and returns a verdict.
- On rejection, a Replanner rewrites the spec/contract/tracker from evaluator feedback.
- The Build phase runs again (its own completion-signaling turn) before the Evaluator re-runs.
A round is exhausted once max_revision_rounds replans have been attempted; the run then writes a blocked-handoff artifact instead of silently accepting the candidate. Because the build phase must complete (produce a completion-signaling response) before re-evaluation, every revision round consumes at least one additional build turn. The eval test harness uses a role-aware mock (RoleQueuedProvider) that matches responses to the calling sub-agent by system prompt and returns a completion default for any build turn it did not explicitly queue, so tests declare what each role says rather than the exact wire-order of calls.
Regression Testing
For long-running automation, use the vtcode-eval crate to build a regression
eval suite that verifies the agent still handles previously-passing tasks after
model or harness changes.
Running Eval Suites
Use the vtcode exec eval CLI command to run an eval suite:
vtcode exec eval --suite my-suite.json --output report.md
The suite JSON file contains an EvalSuite with tasks, each specifying a prompt,
setup/verify commands, and category (capability or regression). The runner
executes each task through the agent, verifies outcomes with environment probes
(command exit codes), computes pass@k and pass^k metrics, and outputs a
markdown report.
See vtcode-eval for the framework and metric definitions.
Profile File Recommendations
The profile file is a simple acknowledgement document. Suggested content:
- Operator name and timestamp approving unattended execution.
- Workspace-specific limitations, such as directories that must not be modified.
- Contact or escalation details if automation encounters unexpected failures.
- Rollback procedures or monitoring steps to follow afterwards.
Keeping this file under version control provides a clear audit trail for when full automation was used and under which guardrails.