cargo.state.json
Every deploy writes cargo.state.json — a map from each code resource
(kind:slug) to the real uuid Cargo assigned it, plus its outputs and a content
hash:
Lock file
During a deploy/destroy/import the CDK writes sibling files next tocargo.state.json — a cargo.state.lock (serializes concurrent runs), a
cargo.state.bak.json (the snapshot cdk rollback
restores from), and a cargo.state.audit.jsonl (run log). Only
cargo.state.json is committed; git-ignore the rest:
--force overrides one
you believe is stale.
Drift
The CDK compares your code against state. It can also compare against the live workspace to catch changes made outside the CDK (e.g. someone edits an agent in the Cargo UI, or deletes a folder).Detect (read-only)
unchanged,
modified externally, or deleted externally. It changes nothing.
Correct
- Modified externally → re-applies your code over it (code wins).
- Deleted externally → the deploy stops and asks you to re-run with
--recreate-deletedbefore it will recreate anything — a deliberate gate so a resource someone removed on purpose doesn’t silently come back.
Drift is measured against the state captured at the last deploy, not guessed
from code — so it reflects real changes to the live resource. A transient read
error is reported as
unknown, never as a deletion, so a network blip can’t
trigger a mass re-create.Code and UI round-trips
Resources deployed from code remain fully editable in the Cargo UI — but the CDK never reads those edits back into your files. What happens to UI work on the next deploy follows directly from the hash model:- A plain
cdk deploycompares code against state, not against the live workspace. If you haven’t changed a resource in code, it plans as=unchanged and is skipped — UI edits to it survive every deploy. - The moment you change that resource in code, the next deploy pushes the full code spec and overwrites the resource — including anything changed in the UI since.
cdk deploy --refreshre-applies code over every externally-modified resource, whether or not its code changed. Reach for it when you want to reset to what the repo says; avoid it while UI work is in flight.
cargo-ai cdk refresh before deploying to see exactly which resources have
diverged.
Secrets and drift
Becausesecret() values are excluded from the content hash, rotating a secret
does not show as drift and a plain deploy won’t push the new value (nothing
changed). To roll a rotated secret, re-apply the resource (make any other change,
or use --refresh). Use env() instead if you want a config value tracked in
the hash. See Secrets & environments for
the full secret() vs env() rules and how to deploy the same code to a second
workspace.
