Treating plan as the step that changes infrastructure
The wrong answers credit terraform plan with work that only apply does: provisioning new resources, destroying a resource listed in the summary, or performing a rollback. Plan compares the configuration against the current state and reports proposed actions. It creates, updates and destroys nothing, so a destroy line in its output is a proposal. Real infrastructure changes only when terraform apply runs, whether it plans first or consumes a saved plan file.
See it in a sample questionExpecting validate to contact the provider or detect drift
The wrong answers give terraform validate the reach of plan: refreshing real resources, reading state, detecting console changes, needing credentials or calling provider APIs. Validate runs offline against the configuration and the installed provider schemas. It catches bad syntax, references to nonexistent attributes and arguments given the wrong value type. Drift, permission errors and rate limits only appear when plan or apply calls the provider, which is why validate succeeds on a machine with no cloud credentials.
See it in a sample questionExpecting plan, apply or validate to install providers
The wrong answers reach for another command when a provider plugin is missing: validate, apply, a refresh-only apply, terraform get, providers lock, or deleting the lock file. None of them installs providers. A freshly cloned directory, or one where a new required_providers entry has been added, has no plugin installed, so terraform init must run first. Init downloads the declared providers into the working directory and records them in the dependency lock file, so it is re-run whenever a provider is added.
See it in a sample questionMistaking other flags for -auto-approve
To run apply or destroy unattended, the wrong answers pick a flag that sounds related: -input=false, disabling the state lock, skipping the refresh, or adding -auto-approve to plan. The -input=false flag only stops prompting for missing variables, so with no approval given the run fails instead of proceeding. The state lock governs concurrency and the refresh governs reconciliation. Only -auto-approve skips the yes prompt, and plan does not accept it.
See it in a sample questionExpecting fmt flags to stop it writing files
A CI job that must fail on badly formatted files without editing them needs fmt -check, which reports non-conforming files and returns a non-zero exit code. The wrong answers choose -recursive, -json or -write=true, all of which still rewrite files. The -write=true form is the default behaviour and does not fail on unformatted input. Validate cannot replace -check either, because it checks configuration correctness, not formatting style.
See it in a sample question