Skip to content

direct: Add hidden --local flag to bundle plan and deploy#5680

Draft
denik wants to merge 17 commits into
mainfrom
denik/local-only
Draft

direct: Add hidden --local flag to bundle plan and deploy#5680
denik wants to merge 17 commits into
mainfrom
denik/local-only

Conversation

@denik

@denik denik commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Adds a hidden --local flag to bundle plan and bundle deploy. When passed, the plan is computed from the local state only — the per-resource remote read is skipped, so the remote state of resources is neither fetched nor considered.

${resources...} references still resolve: if fetching remote state is needed for resolution, we'll still fetchthe remote state.

In --local mode the saved state is used as the stand-in for remote, so state-only fields (dashboard/genie_space etag, vector_search_index endpoint_uuid) reconcile against their saved value rather than nil — avoiding spurious drift.

Why

  • External: --local plan is much faster, so for dev mode or for a large bundle it could be preferred if you don't care about remote drift.
  • Internal: Running no_drift test in --local model provides additional coverage on state serialization. The same bugs that were fixed in direct: test StateType/RemoteType JSON round-trip; fix found issues #5681 were first found by this branch

Tests

  • acceptance/bundle/local/basicplan --local reports no drift and issues no resource reads; resolves a cross-resource .id reference from local state; local_used telemetry on deploy; out-of-band rename is invisible to --local plan; deploy --plan with a --local plan warns; READPLAN matrix covers the warning.
  • acceptance/bundle/local/referencesplan --local fetches only the one referenced target on-demand (for a remote-only field), reports no drift, and is unaffected by out-of-band drift on that target; a normal plan detects the same drift.
  • acceptance/bundle/local/rejected — terraform rejects the flag.
  • no_drift invariant gains a LOCAL_DIFF matrix that runs every config with and without --local.
  • acceptance/bundle/resources--local matrix added to catalogs, external_locations, jobs/num_workers, volumes/change-name for smoke coverage.

@github-actions

github-actions Bot commented Jun 22, 2026

Copy link
Copy Markdown
Contributor

Approval status: pending

/acceptance/bundle/ - needs approval

36 files changed
Suggested: @andrewnester
Also eligible: @janniklasrose, @pietern, @shreyas-goenka, @lennartkats-db, @anton-107

/bundle/ - needs approval

10 files changed
Suggested: @andrewnester
Also eligible: @janniklasrose, @pietern, @shreyas-goenka, @lennartkats-db, @anton-107

/cmd/bundle/ - needs approval

4 files changed
Suggested: @andrewnester
Also eligible: @janniklasrose, @pietern, @shreyas-goenka, @lennartkats-db, @anton-107

Any maintainer (@andrewnester, @anton-107, @pietern, @shreyas-goenka, @simonfaltum, @renaudhartert-db, @janniklasrose, @lennartkats-db) can approve all areas.
See OWNERS for ownership rules.

@denik
denik force-pushed the denik/local-only branch from 6a2e7c1 to ce803e6 Compare June 23, 2026 12:31
@denik
denik temporarily deployed to test-trigger-is June 23, 2026 12:31 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is June 23, 2026 12:31 — with GitHub Actions Inactive
@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Jun 23, 2026

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: 151bc11

Run: 29728978811

Env 💚​RECOVERED 🙈​SKIP ✅​pass 🙈​skip Time
💚​ aws linux 4 4 227 1124 4:56
💚​ aws windows 4 4 229 1122 8:59
💚​ aws-ucws linux 4 4 314 1041 5:20
💚​ aws-ucws windows 4 4 316 1039 9:45
💚​ azure linux 4 4 227 1123 4:31
💚​ azure windows 4 4 229 1121 8:59
💚​ azure-ucws linux 4 4 316 1038 6:08
💚​ azure-ucws windows 4 4 318 1036 9:52
💚​ gcp linux 4 4 226 1125 4:33
💚​ gcp windows 4 4 228 1123 8:51
8 interesting tests: 4 RECOVERED, 4 SKIP
Test Name aws linux aws windows aws-ucws linux aws-ucws windows azure linux azure windows azure-ucws linux azure-ucws windows gcp linux gcp windows
💚​ TestAccept 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
🙈​ TestAccept/bundle/invariant/no_drift 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_endpoints/drift/recreated_same_name 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_indexes/recreate/embedding_dimension 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/ssh/connection 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestFetchRepositoryInfoAPI_FromRepo 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
💚​ TestFetchRepositoryInfoAPI_FromRepo/root 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
💚​ TestFetchRepositoryInfoAPI_FromRepo/subdir 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
Top 10 slowest tests (at least 2 minutes):
duration env testname
8:40 aws-ucws windows TestAccept
8:34 aws windows TestAccept
8:34 azure-ucws windows TestAccept
8:32 azure windows TestAccept
8:24 gcp windows TestAccept
3:06 aws linux TestAccept
3:03 gcp linux TestAccept
2:57 azure linux TestAccept
2:52 azure-ucws linux TestAccept
2:50 aws-ucws linux TestAccept

@denik
denik force-pushed the denik/local-only branch from ce803e6 to d4eb28b Compare June 23, 2026 15:10
@denik
denik temporarily deployed to test-trigger-is June 23, 2026 15:10 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is June 23, 2026 15:10 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is June 24, 2026 05:04 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is June 24, 2026 05:04 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is June 24, 2026 05:28 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is June 24, 2026 05:28 — with GitHub Actions Inactive
bradleyjamrozik-origindigital pushed a commit to Origin-Digital-LLC/databricks-cli that referenced this pull request Jun 25, 2026
…e if resize failed due to INVALID_STATE (databricks#5716)

## Changes

`DoResize` now tries `clusters/resize` first and falls back to
`clusters/edit` (via `DoUpdate`) on `INVALID_STATE`. `PlanEntry` is
threaded through to `DoResize` so the fallback reuses the existing
edit+retry logic without duplication.

## Why

A saved plan records the action at plan time (e.g. `resize` when the
cluster was running). If the cluster terminates before the plan is
applied, the resize API returns `INVALID_STATE` and the deploy fails.
The fallback makes apply resilient to this race.

This also helps for local-only plan
(databricks#5680) where we don't have remote
state available to check. With this change we can always plan 'resize'
based on changed attributes.

## Tests

New acceptance test `resize-terminated-fallback`: plans while the
cluster is running (plan shows `resize`), terminates the cluster,
applies the saved plan, and confirms both a failed resize request and a
successful edit fallback in the request log.

_This PR was written by Claude Code._
@denik
denik force-pushed the denik/local-only branch from 9b4c606 to 3abb966 Compare July 3, 2026 12:22
@denik
denik temporarily deployed to test-trigger-is July 3, 2026 12:22 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 3, 2026 12:22 — with GitHub Actions Inactive
@denik
denik force-pushed the denik/local-only branch from 3abb966 to e03533c Compare July 6, 2026 09:41
@denik
denik temporarily deployed to test-trigger-is July 6, 2026 09:42 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 6, 2026 09:42 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 6, 2026 09:53 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 6, 2026 09:53 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 6, 2026 10:56 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 6, 2026 10:56 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 6, 2026 11:31 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 6, 2026 11:31 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 6, 2026 11:57 — with GitHub Actions Inactive
@denik
denik had a problem deploying to test-trigger-is July 6, 2026 11:57 — with GitHub Actions Failure
@denik
denik had a problem deploying to test-trigger-is July 6, 2026 13:45 — with GitHub Actions Failure
@denik
denik temporarily deployed to test-trigger-is July 6, 2026 13:45 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 7, 2026 13:31 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 8, 2026 07:14 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 8, 2026 07:14 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 8, 2026 12:12 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 8, 2026 12:12 — with GitHub Actions Inactive
@denik denik changed the title Add hidden --local flag to bundle plan and deploy direct: Add hidden --local flag to bundle plan and deploy Jul 8, 2026
@denik
denik force-pushed the denik/local-only branch from 639cc98 to 5c562b5 Compare July 13, 2026 16:39
@denik
denik temporarily deployed to test-trigger-is July 13, 2026 16:40 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 13, 2026 16:40 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 13, 2026 16:57 — with GitHub Actions Inactive
@denik
denik temporarily deployed to test-trigger-is July 13, 2026 16:57 — with GitHub Actions Inactive
denik added 17 commits July 20, 2026 10:41
When passed, the plan is computed from the local state only: the per-resource
remote read is skipped, so the remote state of resources is neither fetched nor
considered. References that genuinely need a target's remote state (e.g. a
remote-only field) fetch that target on demand, so $resources references still
resolve. Direct engine only; rejected on terraform.

Exercise it in the no_drift invariant via a LOCAL_DIFF matrix.

Co-authored-by: Isaac
When --local resolves a reference that needs a target's remote-only field, it
already fetches that target on demand. Copy those fetched states onto their plan
entries (entry.RemoteState) so the plan shows what was actually read. Done in a
single-threaded pass after the parallel walk: during the walk a target is fetched
from a dependent's goroutine under the target's read lock, where writing its entry
would race with sibling dependents.

Co-authored-by: Isaac
Add a LOCAL=["", "--local"] matrix to three resource tests (jobs/num_workers,
schemas/update, volumes/change-name) so plan/deploy run both with and without
--local. Deploy issues the same mutating requests either way (only GET reads
differ, which print_requests.py excludes), so output is identical across variants.
--local is excluded on terraform (rejected there) and not applied to `bundle plan
-o json`, whose remote_state would diverge.

Co-authored-by: Isaac
A --local plan is computed without remote state, so a saved plan can miss
out-of-band drift. Add a top-level local_only field (omitempty, so normal plans
are unchanged) and warn when deploy --plan applies a local-only plan.

Extend local/basic to record the JSON plan, showing local_only: true and the
absence of remote_state.

Co-authored-by: Isaac
Drop the redundant b.localOnly field (remoteStateForRef reads b.Plan.LocalOnly,
set before the walk), remove a dead nil-guard in the post-walk reconciliation
loop (entries are always nil there in --local mode), and trim a duplicated
comment. No behavior change.

Also regenerate no_drift/out.test.toml for the merged LOCAL_DIFF matrix.

Co-authored-by: Isaac
Tested commit: 6b94feb7d acc: regenerate no_drift/out.test.toml with LOCAL_DIFF matrix entry

<!-- Acceptance tests: 6 (2 added, 4 modified) — 6 regression -->

| test | branch | main (de465e09b) | latest (v1.6.0) |
| --- | --- | --- | --- |
| TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct | ✅ | ❌ | ❌ |
| TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=dashboard.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=dashboard.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_catalog.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_catalog.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=database_instance.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=experiment.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=experiment.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=experiment.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=experiment.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=external_location.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=external_location.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=external_location.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=external_location.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=genie_space.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=genie_space.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_permission_ref.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_permission_ref.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_permission_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_permission_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_run_job_ref.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_run_job_ref.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_run_job_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_run_job_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_depends_on.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_depends_on.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_depends_on.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_depends_on.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_with_permissions.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_with_permissions.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_with_permissions.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_with_permissions.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_branch.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_branch.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_branch.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_branch.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_catalog.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_catalog.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_catalog.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_database.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_database.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_database.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_database.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_project.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_project.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_project.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_project.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_role.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_role.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_role.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_role.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_synced_table.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_synced_table.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_synced_table.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=postgres_synced_table.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=registered_model.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=registered_model.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=registered_model.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=registered_model.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_grant_ref.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_grant_ref.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_grant_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_grant_ref.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=sql_warehouse.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=sql_warehouse.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=sql_warehouse.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=sql_warehouse.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=synced_database_table.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=synced_database_table.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=synced_database_table.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=synced_database_table.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_index.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=vector_search_index.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_external.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_external.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_external.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_external.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/LOCAL_DIFF=/READPLAN= | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/LOCAL_DIFF=/READPLAN=1 | ✅ | ✅ | ✅ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/LOCAL_DIFF=--local/READPLAN= | ✅ | ❌ | ❌ |
| TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 | ✅ | ❌ | ❌ |
| TestAccept/bundle/resources/jobs/num_workers/DATABRICKS_BUNDLE_ENGINE=terraform/LOCAL= | ✅ | ✅ | ✅ |
| TestAccept/bundle/resources/jobs/num_workers/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL= | ✅ | ✅ | ✅ |
| TestAccept/bundle/resources/jobs/num_workers/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL=--local | ✅ | ❌ | ❌ |
| TestAccept/bundle/resources/schemas/update/DATABRICKS_BUNDLE_ENGINE=terraform/LOCAL= | ✅ | ✅ | ✅ |
| TestAccept/bundle/resources/schemas/update/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL= | ✅ | ✅ | ✅ |
| TestAccept/bundle/resources/schemas/update/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL=--local | ✅ | ❌ | ❌ |
| TestAccept/bundle/resources/volumes/change-name/DATABRICKS_BUNDLE_ENGINE=terraform/LOCAL= | ✅ | ✅ | ❌ |
| TestAccept/bundle/resources/volumes/change-name/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL= | ✅ | ✅ | ❌ |
| TestAccept/bundle/resources/volumes/change-name/DATABRICKS_BUNDLE_ENGINE=direct/LOCAL=--local | ✅ | ❌ | ❌ |

<details>
<summary>TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct ✅ | main (de465e09b) ❌ | latest (v1.6.0) ❌</summary>

**main (de465e09b):**
```
=== RUN   TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
=== PAUSE TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
=== CONT  TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
    acceptance_test.go:1083: Diff:
        --- bundle/local/basic/output.txt
        +++ /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundlelocalbasicDATABRICKS_BUNDLE_ENGINE=direct2985499174/001/output.txt
        @@ -6,46 +6,25 @@
         Deployment complete!

         >>> [CLI] bundle plan --local
        -Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged
        +Error: unknown flag: --local

        -=== Job reads during 'bundle plan --local':
        +Usage:
        +  databricks bundle plan [flags]

        ->>> print_requests.py --get //jobs/get
        +Flags:
        +  -c, --cluster-id string   Override cluster in the deployment with the given cluster ID.
        +      --force               Force-override Git branch validation.
        +  -h, --help                help for plan
        +      --select strings      Plan only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.

        -=== Plan --local as JSON:
        +Global Flags:
        +      --debug            enable debug logging
        +  -o, --output type      output type: text or json (default text)
        +  -p, --profile string   ~/.databrickscfg profile
        +  -t, --target string    bundle target to use (if applicable)
        +      --var strings      set values for variables defined in bundle config. Example: --var="foo=bar"

        ->>> [CLI] bundle plan --local -o json
        -{
        -  "plan_version": 2,
        -  "cli_version": "[DEV_VERSION]",
        -  "lineage": "[UUID]",
        -  "serial": 1,
        -  "local_only": true,
        -  "plan": {
        -    "resources.jobs.bar": {
        -      "action": "skip"
        -    },
        -    "resources.jobs.foo": {
        -      "depends_on": [
        -        {
        -          "node": "resources.jobs.bar",
        -          "label": "${resources.jobs.bar.id}"
        -        }
        -      ],
        -      "action": "skip"
        -    }
        -  }
        -}

        ->>> [CLI] bundle deploy --local
        -Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/local-[UNIQUE_NAME]/default/files...
        -Deploying resources...
        -Updating deployment state...
        -Deployment complete!
        -
        -=== Telemetry:
        -local_used true
        -
         === Destroy
         >>> [CLI] bundle destroy --auto-approve
         The following resources will be deleted:
        @@ -56,3 +30,5 @@

         Deleting files...
         Destroy complete!
        +
        +Exit code: 1

--- FAIL: TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct (1.07s)
```

**latest (v1.6.0):**
```
=== RUN   TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
=== PAUSE TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
=== CONT  TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct
    acceptance_test.go:1083: Diff:
        --- bundle/local/basic/output.txt
        +++ /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundlelocalbasicDATABRICKS_BUNDLE_ENGINE=direct798157468/001/output.txt
        @@ -6,46 +6,25 @@
         Deployment complete!

         >>> [CLI] bundle plan --local
        -Plan: 0 to add, 0 to change, 0 to delete, 2 unchanged
        +Error: unknown flag: --local

        -=== Job reads during 'bundle plan --local':
        +Usage:
        +  databricks bundle plan [flags]

        ->>> print_requests.py --get //jobs/get
        +Flags:
        +  -c, --cluster-id string   Override cluster in the deployment with the given cluster ID.
        +      --force               Force-override Git branch validation.
        +  -h, --help                help for plan
        +      --select strings      Plan only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.

        -=== Plan --local as JSON:
        +Global Flags:
        +      --debug            enable debug logging
        +  -o, --output type      output type: text or json (default text)
        +  -p, --profile string   ~/.databrickscfg profile
        +  -t, --target string    bundle target to use (if applicable)
        +      --var strings      set values for variables defined in bundle config. Example: --var="foo=bar"

        ->>> [CLI] bundle plan --local -o json
        -{
        -  "plan_version": 2,
        -  "cli_version": "[DEV_VERSION]",
        -  "lineage": "[UUID]",
        -  "serial": 1,
        -  "local_only": true,
        -  "plan": {
        -    "resources.jobs.bar": {
        -      "action": "skip"
        -    },
        -    "resources.jobs.foo": {
        -      "depends_on": [
        -        {
        -          "node": "resources.jobs.bar",
        -          "label": "${resources.jobs.bar.id}"
        -        }
        -      ],
        -      "action": "skip"
        -    }
        -  }
        -}

        ->>> [CLI] bundle deploy --local
        -Uploading bundle files to /Workspace/Users/[USERNAME]/.bundle/local-[UNIQUE_NAME]/default/files...
        -Deploying resources...
        -Updating deployment state...
        -Deployment complete!
        -
        -=== Telemetry:
        -local_used true
        -
         === Destroy
         >>> [CLI] bundle destroy --auto-approve
         The following resources will be deleted:
        @@ -56,3 +30,5 @@

         Deleting files...
         Destroy complete!
        +
        +Exit code: 1

--- FAIL: TestAccept/bundle/local/basic/DATABRICKS_BUNDLE_ENGINE=direct (0.77s)
```

</details>

<details>
<summary>TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform ✅ | main (de465e09b) ❌ | latest (v1.6.0) ❌</summary>

**main (de465e09b):**
```
=== RUN   TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
=== PAUSE TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
=== CONT  TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
    acceptance_test.go:1083: Diff:
        --- bundle/local/rejected/output.txt
        +++ /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundlelocalrejectedDATABRICKS_BUNDLE_ENGINE=terraf1530229415/001/output.txt
        @@ -1,12 +1,48 @@

         >>> [CLI] bundle plan --local
        -Error: --local is only supported with the direct engine. See https://docs.databricks.com/aws/en/dev-tools/bundles/direct
        +Error: unknown flag: --local

        +Usage:
        +  databricks bundle plan [flags]

        +Flags:
        +  -c, --cluster-id string   Override cluster in the deployment with the given cluster ID.
        +      --force               Force-override Git branch validation.
        +  -h, --help                help for plan
        +      --select strings      Plan only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.
        +
        +Global Flags:
        +      --debug            enable debug logging
        +  -o, --output type      output type: text or json (default text)
        +  -p, --profile string   ~/.databrickscfg profile
        +  -t, --target string    bundle target to use (if applicable)
        +      --var strings      set values for variables defined in bundle config. Example: --var="foo=bar"
        +
        +
         Exit code: 1

         >>> [CLI] bundle deploy --local
        -Error: --local is only supported with the direct engine. See https://docs.databricks.com/aws/en/dev-tools/bundles/direct
        +Error: unknown flag: --local

        +Usage:
        +  databricks bundle deploy [flags]

        +Flags:
        +      --auto-approve          Skip interactive approvals that might be required for deployment.
        +  -c, --cluster-id string     Override cluster in the deployment with the given cluster ID.
        +      --fail-on-active-runs   Fail if there are running jobs or pipelines in the deployment.
        +      --force                 Force-override Git branch validation.
        +      --force-lock            Force acquisition of deployment lock.
        +  -h, --help                  help for deploy
        +      --plan string           Path to a JSON plan file to apply instead of planning (direct engine only).
        +      --select strings        Deploy only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.
        +
        +Global Flags:
        +      --debug            enable debug logging
        +  -o, --output type      output type: text or json (default text)
        +  -p, --profile string   ~/.databrickscfg profile
        +  -t, --target string    bundle target to use (if applicable)
        +      --var strings      set values for variables defined in bundle config. Example: --var="foo=bar"
        +
        +
         Exit code: 1

--- FAIL: TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform (0.05s)
```

**latest (v1.6.0):**
```
=== RUN   TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
=== PAUSE TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
=== CONT  TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform
    acceptance_test.go:1083: Diff:
        --- bundle/local/rejected/output.txt
        +++ /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundlelocalrejectedDATABRICKS_BUNDLE_ENGINE=terraf2105928878/001/output.txt
        @@ -1,12 +1,48 @@

         >>> [CLI] bundle plan --local
        -Error: --local is only supported with the direct engine. See https://docs.databricks.com/aws/en/dev-tools/bundles/direct
        +Error: unknown flag: --local

        +Usage:
        +  databricks bundle plan [flags]

        +Flags:
        +  -c, --cluster-id string   Override cluster in the deployment with the given cluster ID.
        +      --force               Force-override Git branch validation.
        +  -h, --help                help for plan
        +      --select strings      Plan only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.
        +
        +Global Flags:
        +      --debug            enable debug logging
        +  -o, --output type      output type: text or json (default text)
        +  -p, --profile string   ~/.databrickscfg profile
        +  -t, --target string    bundle target to use (if applicable)
        +      --var strings      set values for variables defined in bundle config. Example: --var="foo=bar"
        +
        +
         Exit code: 1

         >>> [CLI] bundle deploy --local
        -Error: --local is only supported with the direct engine. See https://docs.databricks.com/aws/en/dev-tools/bundles/direct
        +Error: unknown flag: --local

        +Usage:
        +  databricks bundle deploy [flags]

        +Flags:
        +      --auto-approve          Skip interactive approvals that might be required for deployment.
        +  -c, --cluster-id string     Override cluster in the deployment with the given cluster ID.
        +      --fail-on-active-runs   Fail if there are running jobs or pipelines in the deployment.
        +      --force                 Force-override Git branch validation.
        +      --force-lock            Force acquisition of deployment lock.
        +  -h, --help                  help for deploy
        +      --plan string           Path to a JSON plan file to apply instead of planning (direct engine only).
        +      --select strings        Deploy only the specified resource (e.g. 'my_job' or 'jobs.my_job'). Can be repeated or comma-separated.
        +
        +Global Flags:
        +      --debug            enable debug logging
        +  -o, --output type      output type: text or json (default text)
        +  -p, --profile string   ~/.databrickscfg profile
        +  -t, --target string    bundle target to use (if applicable)
        +      --var strings      set values for variables defined in bundle config. Example: --var="foo=bar"
        +
        +
         Exit code: 1

--- FAIL: TestAccept/bundle/local/rejected/DATABRICKS_BUNDLE_ENGINE=terraform (0.06s)
```

</details>

<details>
<summary>TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN= ✅ | main (de465e09b) ❌ | latest (v1.6.0) ❌</summary>

**main (de465e09b):**
```
=== RUN   TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== CONT  TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
    acceptance_test.go:1083:
        	Error Trace:	/Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
        	Error:      	Not equal:
        	            	expected: "INPUT_CONFIG_OK\n"
        	            	actual  : "INPUT_CONFIG_OK\n\nExit code: 1\n"

        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2 +2,3 @@

        	            	+Exit code: 1
        	            	+
        	Test:       	TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
        	Messages:   	bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di3172530878/001/output.txt
    acceptance_test.go:942:
        LOG.config: bundle:
        LOG.config:   name: test-bundle-3qcizlrz6zeqlokrmg4s54rgne
        LOG.config:
        LOG.config: resources:
        LOG.config:   alerts:
        LOG.config:     foo:
        LOG.config:       warehouse_id: 8ec9edc1-db0c-40df-af8d-7580020fe61e
        LOG.config:       display_name: test-alert-3qcizlrz6zeqlokrmg4s54rgne
        LOG.config:       file_path: ./alert.dbalert.json
        LOG.config:       permissions:
        LOG.config:         - level: CAN_MANAGE
        LOG.config:           group_name: users
    acceptance_test.go:942: LOG.cp:
    acceptance_test.go:942:
        LOG.deploy:
        LOG.deploy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle deploy
        LOG.deploy: Uploading bundle files to /Workspace/Users/tester@databricks.com/.bundle/test-bundle-3qcizlrz6zeqlokrmg4s54rgne/default/files...
        LOG.deploy: Deploying resources...
        LOG.deploy: Updating deployment state...
        LOG.deploy: Deployment complete!
    acceptance_test.go:942:
        LOG.destroy:
        LOG.destroy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle destroy --auto-approve
        LOG.destroy: The following resources will be deleted:
        LOG.destroy:   delete resources.alerts.foo
        LOG.destroy:
        LOG.destroy: All files and directories at the following location will be deleted: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-3qcizlrz6zeqlokrmg4s54rgne/default
        LOG.destroy:
        LOG.destroy: Deleting files...
        LOG.destroy: Destroy complete!
    acceptance_test.go:942: LOG.planjson:
    acceptance_test.go:942:
        LOG.validate:
        LOG.validate: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle validate
        LOG.validate: Name: test-bundle-3qcizlrz6zeqlokrmg4s54rgne
        LOG.validate: Target: default
        LOG.validate: Workspace:
        LOG.validate:   User: tester@databricks.com
        LOG.validate:   Path: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-3qcizlrz6zeqlokrmg4s54rgne/default
        LOG.validate:
        LOG.validate: Validation OK!
--- FAIL: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN= (0.38s)
```

**latest (v1.6.0):**
```
=== RUN   TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== CONT  TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
    acceptance_test.go:1083:
        	Error Trace:	/Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
        	Error:      	Not equal:
        	            	expected: "INPUT_CONFIG_OK\n"
        	            	actual  : "INPUT_CONFIG_OK\n\nExit code: 1\n"

        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2 +2,3 @@

        	            	+Exit code: 1
        	            	+
        	Test:       	TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
        	Messages:   	bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di2526780256/001/output.txt
    acceptance_test.go:942:
        LOG.config: bundle:
        LOG.config:   name: test-bundle-q74yvfo34ffezmspxodeoenate
        LOG.config:
        LOG.config: resources:
        LOG.config:   alerts:
        LOG.config:     foo:
        LOG.config:       warehouse_id: 8ec9edc1-db0c-40df-af8d-7580020fe61e
        LOG.config:       display_name: test-alert-q74yvfo34ffezmspxodeoenate
        LOG.config:       file_path: ./alert.dbalert.json
        LOG.config:       permissions:
        LOG.config:         - level: CAN_MANAGE
        LOG.config:           group_name: users
    acceptance_test.go:942: LOG.cp:
    acceptance_test.go:942:
        LOG.deploy:
        LOG.deploy: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle deploy
        LOG.deploy: Uploading bundle files to /Workspace/Users/tester@databricks.com/.bundle/test-bundle-q74yvfo34ffezmspxodeoenate/default/files...
        LOG.deploy: Deploying resources...
        LOG.deploy: Updating deployment state...
        LOG.deploy: Deployment complete!
    acceptance_test.go:942:
        LOG.destroy:
        LOG.destroy: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle destroy --auto-approve
        LOG.destroy: The following resources will be deleted:
        LOG.destroy:   delete resources.alerts.foo
        LOG.destroy:
        LOG.destroy: All files and directories at the following location will be deleted: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-q74yvfo34ffezmspxodeoenate/default
        LOG.destroy:
        LOG.destroy: Deleting files...
        LOG.destroy: Destroy complete!
    acceptance_test.go:942: LOG.planjson:
    acceptance_test.go:942:
        LOG.validate:
        LOG.validate: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle validate
        LOG.validate: Name: test-bundle-q74yvfo34ffezmspxodeoenate
        LOG.validate: Target: default
        LOG.validate: Workspace:
        LOG.validate:   User: tester@databricks.com
        LOG.validate:   Path: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-q74yvfo34ffezmspxodeoenate/default
        LOG.validate:
        LOG.validate: Validation OK!
--- FAIL: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN= (0.32s)
```

</details>

<details>
<summary>TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 ✅ | main (de465e09b) ❌ | latest (v1.6.0) ❌</summary>

**main (de465e09b):**
```
=== RUN   TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
=== CONT  TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
    acceptance_test.go:1083:
        	Error Trace:	/Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
        	Error:      	Not equal:
        	            	expected: "INPUT_CONFIG_OK\n"
        	            	actual  : "INPUT_CONFIG_OK\n\nExit code: 1\n"

        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2 +2,3 @@

        	            	+Exit code: 1
        	            	+
        	Test:       	TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
        	Messages:   	bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di1652478110/001/output.txt
    acceptance_test.go:942:
        LOG.config: bundle:
        LOG.config:   name: test-bundle-yjzfni652vbtvi5ymltuu4jisu
        LOG.config:
        LOG.config: resources:
        LOG.config:   alerts:
        LOG.config:     foo:
        LOG.config:       warehouse_id: 8ec9edc1-db0c-40df-af8d-7580020fe61e
        LOG.config:       display_name: test-alert-yjzfni652vbtvi5ymltuu4jisu
        LOG.config:       file_path: ./alert.dbalert.json
        LOG.config:       permissions:
        LOG.config:         - level: CAN_MANAGE
        LOG.config:           group_name: users
    acceptance_test.go:942: LOG.cp:
    acceptance_test.go:942:
        LOG.deploy:
        LOG.deploy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle deploy --plan plan.json
        LOG.deploy: Uploading bundle files to /Workspace/Users/tester@databricks.com/.bundle/test-bundle-yjzfni652vbtvi5ymltuu4jisu/default/files...
        LOG.deploy: Deploying resources...
        LOG.deploy: Updating deployment state...
        LOG.deploy: Deployment complete!
    acceptance_test.go:942:
        LOG.destroy:
        LOG.destroy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle destroy --auto-approve
        LOG.destroy: The following resources will be deleted:
        LOG.destroy:   delete resources.alerts.foo
        LOG.destroy:
        LOG.destroy: All files and directories at the following location will be deleted: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-yjzfni652vbtvi5ymltuu4jisu/default
        LOG.destroy:
        LOG.destroy: Deleting files...
        LOG.destroy: Destroy complete!
    acceptance_test.go:942: LOG.planjson:
    acceptance_test.go:942:
        LOG.validate:
        LOG.validate: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle validate
        LOG.validate: Name: test-bundle-yjzfni652vbtvi5ymltuu4jisu
        LOG.validate: Target: default
        LOG.validate: Workspace:
        LOG.validate:   User: tester@databricks.com
        LOG.validate:   Path: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-yjzfni652vbtvi5ymltuu4jisu/default
        LOG.validate:
        LOG.validate: Validation OK!
--- FAIL: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 (0.32s)
```

**latest (v1.6.0):**
```
=== RUN   TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
=== CONT  TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
    acceptance_test.go:1083:
        	Error Trace:	/Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
        	Error:      	Not equal:
        	            	expected: "INPUT_CONFIG_OK\n"
        	            	actual  : "INPUT_CONFIG_OK\n\nExit code: 1\n"

        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2 +2,3 @@

        	            	+Exit code: 1
        	            	+
        	Test:       	TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1
        	Messages:   	bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di1892342805/001/output.txt
    acceptance_test.go:942:
        LOG.config: bundle:
        LOG.config:   name: test-bundle-ly7ipbof5naa5eogrk43vhpxay
        LOG.config:
        LOG.config: resources:
        LOG.config:   alerts:
        LOG.config:     foo:
        LOG.config:       warehouse_id: 8ec9edc1-db0c-40df-af8d-7580020fe61e
        LOG.config:       display_name: test-alert-ly7ipbof5naa5eogrk43vhpxay
        LOG.config:       file_path: ./alert.dbalert.json
        LOG.config:       permissions:
        LOG.config:         - level: CAN_MANAGE
        LOG.config:           group_name: users
    acceptance_test.go:942: LOG.cp:
    acceptance_test.go:942:
        LOG.deploy:
        LOG.deploy: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle deploy --plan plan.json
        LOG.deploy: Uploading bundle files to /Workspace/Users/tester@databricks.com/.bundle/test-bundle-ly7ipbof5naa5eogrk43vhpxay/default/files...
        LOG.deploy: Deploying resources...
        LOG.deploy: Updating deployment state...
        LOG.deploy: Deployment complete!
    acceptance_test.go:942:
        LOG.destroy:
        LOG.destroy: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle destroy --auto-approve
        LOG.destroy: The following resources will be deleted:
        LOG.destroy:   delete resources.alerts.foo
        LOG.destroy:
        LOG.destroy: All files and directories at the following location will be deleted: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-ly7ipbof5naa5eogrk43vhpxay/default
        LOG.destroy:
        LOG.destroy: Deleting files...
        LOG.destroy: Destroy complete!
    acceptance_test.go:942: LOG.planjson:
    acceptance_test.go:942:
        LOG.validate:
        LOG.validate: >>> /Users/denis.bilenko/work/cli-trees/local-only/acceptance/build/darwin_arm64/1.6.0/databricks bundle validate
        LOG.validate: Name: test-bundle-ly7ipbof5naa5eogrk43vhpxay
        LOG.validate: Target: default
        LOG.validate: Workspace:
        LOG.validate:   User: tester@databricks.com
        LOG.validate:   Path: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-ly7ipbof5naa5eogrk43vhpxay/default
        LOG.validate:
        LOG.validate: Validation OK!
--- FAIL: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=alert.yml.tmpl/LOCAL_DIFF=--local/READPLAN=1 (0.32s)
```

</details>

<details>
<summary>TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN= ✅ | main (de465e09b) ❌ | latest (v1.6.0) ❌</summary>

**main (de465e09b):**
```
=== RUN   TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== CONT  TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
    acceptance_test.go:1083:
        	Error Trace:	/Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
        	Error:      	Not equal:
        	            	expected: "INPUT_CONFIG_OK\n"
        	            	actual  : "INPUT_CONFIG_OK\n\nExit code: 1\n"

        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2 +2,3 @@

        	            	+Exit code: 1
        	            	+
        	Test:       	TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
        	Messages:   	bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di1994182820/001/output.txt
    acceptance_test.go:942:
        LOG.config: bundle:
        LOG.config:   name: test-bundle-42b7orzkifflve5iq6gr7qgpnu
        LOG.config:
        LOG.config: resources:
        LOG.config:   apps:
        LOG.config:     foo:
        LOG.config:       name: app-42b7orzkifflve5iq6gr7qgpnu
        LOG.config:       source_code_path: ./app
        LOG.config:       permissions:
        LOG.config:         - level: CAN_USE
        LOG.config:           group_name: users
    acceptance_test.go:942: LOG.cp:
    acceptance_test.go:942:
        LOG.deploy:
        LOG.deploy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle deploy
        LOG.deploy: Uploading bundle files to /Workspace/Users/tester@databricks.com/.bundle/test-bundle-42b7orzkifflve5iq6gr7qgpnu/default/files...
        LOG.deploy: Deploying resources...
        LOG.deploy: Updating deployment state...
        LOG.deploy: Deployment complete!
    acceptance_test.go:942:
        LOG.destroy:
        LOG.destroy: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle destroy --auto-approve
        LOG.destroy: The following resources will be deleted:
        LOG.destroy:   delete resources.apps.foo
        LOG.destroy:
        LOG.destroy: All files and directories at the following location will be deleted: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-42b7orzkifflve5iq6gr7qgpnu/default
        LOG.destroy:
        LOG.destroy: Deleting files...
        LOG.destroy: Destroy complete!
    acceptance_test.go:942: LOG.planjson:
    acceptance_test.go:942:
        LOG.validate:
        LOG.validate: >>> /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/regression_main_cli_zcw9ioq8/src/databricks bundle validate
        LOG.validate: Name: test-bundle-42b7orzkifflve5iq6gr7qgpnu
        LOG.validate: Target: default
        LOG.validate: Workspace:
        LOG.validate:   User: tester@databricks.com
        LOG.validate:   Path: /Workspace/Users/tester@databricks.com/.bundle/test-bundle-42b7orzkifflve5iq6gr7qgpnu/default
        LOG.validate:
        LOG.validate: Validation OK!
--- FAIL: TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN= (0.32s)
```

**latest (v1.6.0):**
```
=== RUN   TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== PAUSE TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
=== CONT  TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
    acceptance_test.go:1083:
        	Error Trace:	/Users/denis.bilenko/work/cli-trees/local-only/libs/testdiff/testdiff.go:22
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:1083
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:915
        	            				/Users/denis.bilenko/work/cli-trees/local-only/acceptance/acceptance_test.go:515
        	Error:      	Not equal:
        	            	expected: "INPUT_CONFIG_OK\n"
        	            	actual  : "INPUT_CONFIG_OK\n\nExit code: 1\n"

        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -2 +2,3 @@

        	            	+Exit code: 1
        	            	+
        	Test:       	TestAccept/bundle/invariant/no_drift/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/LOCAL_DIFF=--local/READPLAN=
        	Messages:   	bundle/invariant/no_drift/output.txt vs /var/folders/5y/9kkdnjw91p11vsqwk0cvmk200000gp/T/TestAcceptbundleinvariantno_driftDATABRICKS_BUNDLE_ENGINE=di992411277/001/output.txt
    acceptance_test.go:942:
        LOG.config: bundle:
       …
In --local mode the per-resource remote read is skipped. Previously this left
the remote comparison value nil, so state-only fields reconciled via
OverrideChangeDesc (dashboard/genie etag, vector_search_index endpoint_uuid)
read as spurious drift. Treat the saved state as the remote stand-in: it is our
last recorded snapshot of remote, so drift is computed purely from saved-state
vs config and these fields reconcile against their saved value.

VectorSearchIndex.OverrideChangeDesc now reads change.Remote (equal to the raw
remote's EndpointUuid) instead of the raw remote param, which is nil in --local.

Drops the three no_drift EnvMatrixExclude entries that worked around this, and
reverts the --local matrix on schemas/drift/managed_properties (its subject is a
remote-only managed-properties map that has no local stand-in, so it is a
genuine bad fit for --local).

Co-authored-by: Isaac
The hook dereferenced its raw remote *AppRemote param, but calladapt
delivers a typed nil when the remote read is skipped (--local) or the
resource does not exist remotely. Read change.Remote instead, matching
the pattern used by vector_search_index.

Co-authored-by: Isaac
Every row now passes a typed-nil raw remote param, so the nil-safety
guarantee is exercised on every case rather than a dedicated subtest.

Co-authored-by: Isaac
Introduce deployplan.PlanMode enum (Full, Local, Offline) and thread it
through the planner and CLI. --local becomes --plan-mode=local; Offline
is reserved for a follow-up. Bundle.Local becomes Bundle.PlanMode, and
the local_used telemetry key becomes plan_mode_used_<mode>.

Co-authored-by: Isaac
Two fixes from the cursor-agent review:

1. In --plan-mode=local, entry.RemoteState was being set to savedState
   (state type, e.g. *AppState). Apply-time consumers like
   remoteIsStarted type-assert to the remote type (*AppRemote) and
   silently returned false, which made manageLifecycle skip a Stop when
   config toggled lifecycle.started true → false. Leave entry.RemoteState
   nil in local mode; classification still uses savedState via the local
   remoteStateComparable variable that feeds change.Remote.

2. --plan-mode=offline was accepted at flag-parse but not wired: a
   reference to a remote-only field on an unchanged target hit an
   internal error in LookupReferencePreDeploy. Reject the value at parse
   time until Offline semantics are implemented. SkipsRemoteReads()
   narrowed to Local only.

acc: local/rejected covers the offline rejection and unknown values.
acc: local/basic output.txt regenerated (remote_state no longer present
in local-mode plan JSON).

Co-authored-by: Isaac
@denik
denik force-pushed the denik/local-only branch from b6bc472 to 151bc11 Compare July 20, 2026 08:44
@denik
denik marked this pull request as draft July 20, 2026 08:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants