Skip to content

Add bundle bitmap for per-field telemetry - #6104

Draft
denik wants to merge 25 commits into
mainfrom
denik/bundle-bitmap
Draft

denik wants to merge 25 commits into
mainfrom
denik/bundle-bitmap

Conversation

@denik

@denik denik commented Jul 30, 2026 •

Copy link
Copy Markdown
Contributor

Why

Today each tracked DABs feature needs custom code (a key constant plus a SetBoolValue call), so only hand-picked features are tracked. The bundle bitmap encodes the presence of every bundle config field as one bit, derived by reflecting over config.Root, so all current and future fields are covered for free (http://go/dabs-telemetry).

Changes

  • Hidden databricks bundle bitmap group: schema, bitmap-text, bitmap (DEFLATE + base64), decode (stdin) and update-schema [--validate]. The schema lives in bundle/bitmap/schema.txt, is embedded into the binary, and is append-only so bit positions stay stable; task generate appends new fields. Bool fields also record their value.
  • Bits describe the config as the user wrote it: a snapshot taken at the start of Initialize, plus resources added by Python, before defaults are filled in.
  • Boolean deploy telemetry lives in a typed bundle.Telemetry struct (metric tags): one assignment per call site instead of a key constant plus SetBoolValue. bool_values keeps the same entries, now in field order. The bitmap is not sent yet.
  • databricks.bundles._bitmap in databricks-bundles: a self-contained decoder with the schema embedded.

Tests

Go and Python unit tests for presence, bool variants and the wire format. acceptance/bundle/bitmap/presence pins the set bits of a fixture and checks the CLI and Python decoders agree; bitmap/full records the whole schema; python/telemetry covers a Python-defined resource; no_drift runs both decoders over every invariant config.

This pull request and its description were written by Isaac.

@denik
denik force-pushed the denik/bundle-bitmap branch from 221d417 to 39faace Compare July 30, 2026 10:11
@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Jul 30, 2026 •

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: 0b478d0

Run: 41845736497

Env ✅​pass 🙈​skip Time
✅​ aws linux-2core-8gb 448 21 44:57
✅​ aws-windows-latest-4core-16gb 450 19 44:12
✅​ azure linux-2core-8gb 447 21 40:06
✅​ azure-windows-latest-4core-16gb 449 19 43:22
✅​ gcp linux-2core-8gb 448 21 43:40
✅​ gcp-windows-latest-4core-16gb 450 19 48:30
Top 50 slowest tests (at least 2 minutes):
duration env testname
6:48 aws linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1
4:09 aws-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
4:04 aws linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
3:54 aws linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
3:31 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
3:28 azure-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
3:23 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
3:22 aws linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=
3:22 aws-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
3:21 aws-windows-latest-4core-16gb TestAccept
3:20 azure linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=1
3:14 gcp-windows-latest-4core-16gb TestAccept
3:13 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=1
3:12 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
3:11 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
3:11 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
3:03 azure linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
3:02 aws-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
3:01 azure-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
3:00 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=pipeline_allow_duplicate_names.yml.tmpl/READPLAN=1
2:59 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
2:57 aws linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
2:55 azure-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
2:55 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
2:48 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=1
2:47 azure-windows-latest-4core-16gb TestAccept
2:47 azure linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
2:46 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=
2:46 azure-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
2:43 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
2:43 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=
2:41 azure linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
2:37 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=
2:36 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1
2:34 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=1
2:33 azure-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=
2:33 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=
2:31 aws-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1
2:31 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=
2:30 aws-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=1
2:30 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/READPLAN=
2:30 aws-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=
2:30 aws linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=
2:28 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1
2:28 azure-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=vector_search_index.yml.tmpl/READPLAN=1
2:27 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=instance_pool.yml.tmpl/READPLAN=
2:25 gcp-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1
2:25 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=
2:23 gcp linux-2core-8gb TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1
2:21 aws-windows-latest-4core-16gb TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1

@denik
denik force-pushed the denik/bundle-bitmap branch 2 times, most recently from eb6b1f0 to 29c5b44 Compare August 3, 2026 10:01
@denik
denik force-pushed the denik/bundle-bitmap branch 2 times, most recently from 45b8bfe to 9ad0bbb Compare August 17, 2026 11:52
@github-actions

Copy link
Copy Markdown
Contributor

This PR has not received an update in a while. If you want to keep this PR open, please leave a comment below or push a new commit and auto-close will be canceled.

@github-actions github-actions Bot added the Stale label Oct 17, 2026
@denik
denik force-pushed the denik/bundle-bitmap branch from 9ad0bbb to 96a6df5 Compare November 3, 2026 16:34
@github-actions github-actions Bot added the DABs DABs related issues label Nov 3, 2026
@denik
denik force-pushed the denik/bundle-bitmap branch from 96a6df5 to f972c44 Compare November 3, 2026 16:42
@github-actions

github-actions Bot commented Nov 3, 2026 •

Copy link
Copy Markdown
Contributor

Commit: 0b478d026 | Workflow run

Regression test report

Selected 7 changed tests (limit=20, 0 not selected)

260 tests: regression=135 unreleased=0 coverage=125 failing=0
test branch main (cd5c64d) latest (v1.23.0)
TestAccept/bundle/bitmap/full ✅ ❌ ❌
TestAccept/bundle/bitmap/presence/DMS= ✅ ❌ ❌
TestAccept/bundle/bitmap/presence/DMS=true ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=alert.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=alert.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=app.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=app.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=catalog.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=catalog.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=catalog_optional_fields.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=catalog_optional_fields.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_policy.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=cluster_policy.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=dashboard.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=dashboard.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=data_quality_monitor.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=data_quality_monitor.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=database_catalog.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=database_catalog.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=database_instance.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=database_instance.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=experiment.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=experiment.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=external_location.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=external_location.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=feature.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=feature.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=genie_space.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=genie_space.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=instance_pool.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=instance_pool.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_escaped_refs.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_escaped_refs.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_permission_ref.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_permission_ref.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_run.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_run.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_run_job_ref.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_run_job_ref.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_table_update_trigger.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_table_update_trigger.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_with_depends_on.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_with_depends_on.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_with_task.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=job_with_task.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=model.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=model.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=model_service.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=model_service.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=model_serving_endpoint_telemetry.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=model_serving_endpoint_telemetry.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=model_with_permissions.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=model_with_permissions.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=pipeline.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=pipeline.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=pipeline_allow_duplicate_names.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=pipeline_allow_duplicate_names.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_branch.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_branch.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_catalog.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_catalog.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_database.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_database.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_endpoint.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_endpoint.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_project.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_project.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_role.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_role.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_synced_table.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=postgres_synced_table.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=registered_model.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=registered_model.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=schema.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=schema.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=schema_empty_grants.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=schema_empty_grants.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=schema_grant_ref.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=schema_grant_ref.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=schema_tf_compat.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=schema_tf_compat.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=secret.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=secret_scope.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=secret_scope.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=sql_warehouse.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=sql_warehouse.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=synced_database_table.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=synced_database_table.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=uc_trailing_slash.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=uc_trailing_slash.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=vector_search_index.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=vector_search_index.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=volume.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=volume.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=volume_external.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=volume_external.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=volume_path_job_ref.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=volume_path_job_ref.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=alert.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=alert.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=app.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=app.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=catalog.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=catalog.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=catalog_optional_fields.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=catalog_optional_fields.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_libraries.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_policy.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=cluster_policy.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=dashboard.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=dashboard.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=data_quality_monitor.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=data_quality_monitor.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=database_catalog.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=database_catalog.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=database_instance.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=database_instance.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=experiment.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=experiment.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=external_location.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=external_location.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=genie_space.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=genie_space.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=instance_pool.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=instance_pool.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_cross_resource_ref.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_escaped_refs.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_escaped_refs.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_permission_ref.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_permission_ref.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_run.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_run.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_run_job_ref.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_run_job_ref.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_table_update_trigger.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_table_update_trigger.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_with_depends_on.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_with_depends_on.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_with_task.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=job_with_task.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=model.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=model.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=model_service.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=model_service.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=model_serving_endpoint_telemetry.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=model_serving_endpoint_telemetry.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=model_with_permissions.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=model_with_permissions.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=pipeline.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=pipeline.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=pipeline_allow_duplicate_names.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=pipeline_allow_duplicate_names.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=pipeline_config_dots.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_branch.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_branch.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_catalog.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_catalog.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_database.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_database.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_endpoint.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_endpoint.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_project.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_project.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_role.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_role.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_synced_table.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=postgres_synced_table.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=registered_model.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=registered_model.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=schema.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=schema.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=schema_grant_ref.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=schema_grant_ref.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=schema_tf_compat.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=schema_tf_compat.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=schema_uppercase_name.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=secret.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=secret_scope.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=secret_scope.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=secret_scope_default_backend_type.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=sql_warehouse.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=sql_warehouse.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=synced_database_table.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=synced_database_table.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=uc_trailing_slash.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=uc_trailing_slash.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=vector_search_endpoint.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=vector_search_index.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=vector_search_index.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=volume.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=volume.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=volume_external.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=volume_external.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=volume_path_job_ref.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=volume_path_job_ref.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/READPLAN= ✅ ❌ ❌
TestAccept/bundle/invariant/no_drift/DMS=true/INPUT_CONFIG=volume_uppercase_name.yml.tmpl/READPLAN=1 ✅ ✅ ✅
TestAccept/bundle/python/telemetry/DMS=/PYDAB_VERSION=current ✅ ❌ ❌
TestAccept/bundle/telemetry/deploy-app-lifecycle-started/DMS= ✅ ❌ ❌
TestAccept/bundle/telemetry/deploy/DMS= ✅ ❌ ❌
TestAccept/bundle/templates/default-python/classic/DMS=/READPLAN= ✅ ❌ ❌
TestAccept/bundle/templates/default-python/classic/DMS=/READPLAN=1 ✅ ❌ ❌
TestAccept/bundle/bitmap/full: branch ✅ | main (cd5c64d) ❌ | latest (v1.23.0) ❌

main (cd5c64d):

acceptance_test.go:1342: Diff:
        --- bundle/bitmap/full/out.schema.txt
        +++ /tmp/TestAcceptbundlebitmapfull1393337894/001/out.schema.txt
        @@ -1,5158 +1,42 @@
        -variables
        -variables.*
        -variables.*.type
        -variables.*.default
        -variables.*.description
        -variables.*.sensitive
        -variables.*.sensitive=true
        -variables.*.sensitive=false
        -variables.*.value
        -variables.*.lookup
        -variables.*.lookup.alert
        -variables.*.lookup.cluster_policy
        -variables.*.lookup.cluster
        -variables.*.lookup.dashboard
        -variables.*.lookup.instance_pool
        -variables.*.lookup.job
        -variables.*.lookup.metastore
        -variables.*.lookup.notification_destination
        -variables.*.lookup.pipeline
        -variables.*.lookup.query
        -variables.*.lookup.service_principal
        -variables.*.lookup.warehouse
        -bundle
        -bundle.name
        -bundle.target
        -bundle.environment
        -bundle.terraform
        -bundle.terraform.exec_path
        -bundle.force
        -bundle.force=true
        -bundle.force=false
        -bundle.git
        -bundle.git.branch
        -bundle.git.origin_url
        -bundle.git.commit
        -bundle.git.bundle_root_path
        -bundle.git.actual_branch
        -bundle.mode
        -bundle.compute_id
        -bundle.cluster_id
        -bundle.engine
        -bundle.deployment
        -bundle.deployment.fail_on_active_runs
        -bundle.deployment.fail_on_active_runs=true
        -bundle.deployment.fail_on_active_runs=false
        -bundle.deployment.lock
        -bundle.deployment.lock.enabled
        -bundle.deployment.lock.enabled=true
        -bundle.deployment.lock.enabled=false
        -bundle.deployment.lock.force
        -bundle.deployment.lock.force=true
        -bundle.deployment.lock.force=false
        -bundle.deployment.deployment_id
        -bundle.deployment.latest_version_id
        -bundle.databricks_cli_version
        -bundle.uuid
        -include
        -include[*]
        -workspace
        -workspace.host
        -workspace.profile
        -workspace.auth_type
        -workspace.metadata_service_url
        -workspace.client_id
        -workspace.google_service_account
        -workspace.azure_workspace_resource_id
        -workspace.azure_use_msi
        -workspace.azure_use_msi=true
        -workspace.azure_use_msi=false
        -workspace.azure_client_id
        -workspace.azure_tenant_id
        -workspace.azure_environment
        -workspace.azure_login_app_id
        -workspace.experimental_is_unified_host
        -workspace.experimental_is_unified_host=true
        -workspace.experimental_is_unified_host=false
        -workspace.account_id
        -workspace.workspace_id
        -workspace.current_user
        -workspace.current_user.short_name
        -workspace.current_user.domain_friendly_name
        -workspace.current_user.active
        -workspace.current_user.active=true
        -workspace.current_user.active=false
        -workspace.current_user.displayName
        -workspace.current_user.emails
        -workspace.current_user.emails[*]
        -workspace.current_user.emails[*].display
        -workspace.current_user.emails[*].primary
        -workspace.current_user.emails[*].primary=true
        -workspace.current_user.emails[*].primary=false
        -workspace.current_user.emails[*].$ref
        -workspace.current_user.emails[*].type
        -workspace.current_user.emails[*].value
        -workspace.current_user.entitlements
        -workspace.current_user.entitlements[*]
        -workspace.current_user.entitlements[*].display
        -workspace.current_user.entitlements[*].primary
        -workspace.current_user.entitlements[*].primary=true
        -workspace.current_user.entitlements[*].primary=false
        -workspace.current_user.entitlements[*].$ref
        -workspace.current_user.entitlements[*].type
        -workspace.current_user.entitlements[*].value
        -workspace.current_user.externalId
        -workspace.current_user.groups
        -workspace.current_user.groups[*]
        -workspace.current_user.groups[*].display
        -workspace.current_user.groups[*].primary
        -workspace.current_user.groups[*].primary=true
        -workspace.current_user.groups[*].primary=false
        -workspace.current_user.groups[*].$ref
        -workspace.current_user.groups[*].type
        -workspace.current_user.groups[*].value
        -workspace.current_user.id
        -workspace.current_user.name
        -workspace.current_user.name.familyName
        -workspace.current_user.name.givenName
        -workspace.current_user.roles
        -workspace.current_user.roles[*]
        -workspace.current_user.roles[*].display
        -workspace.current_user.roles[*].primary
        -workspace.current_user.roles[*].primary=true
        -workspace.current_user.roles[*].primary=false
        -workspace.current_user.roles[*].$ref
        -workspace.current_user.roles[*].type
        -workspace.current_user.roles[*].value
        -workspace.current_user.schemas
        -workspace.current_user.schemas[*]
        -workspace.current_user.userName
        -workspace.root_path
        -workspace.file_path
        -workspace.resource_path
        -workspace.artifact_path
        -workspace.state_path
        -workspace.sync_mode
        -artifacts
        -artifacts.*
        -artifacts.*.type
        -artifacts.*.path
        -artifacts.*.files
        -artifacts.*.files[*]
        -artifacts.*.files[*].source
        -artifacts.*.files[*].patched
        -artifacts.*.files[*].remote_path
        -artifacts.*.build
        -artifacts.*.executable
        -artifacts.*.dynamic_version
        -artifacts.*.dynamic_version=true
        -artifacts.*.dynamic_version=false
        -artifacts.*.include
        -artifacts.*.include[*]
        -artifacts.*.git
        -artifacts.*.git.branch
        -artifacts.*.git.commit
        -resources
        -resources.jobs
        -resources.jobs.*
        -resources.jobs.*.url
        -resources.jobs.*.modified_status
        -resources.jobs.*.lifecycle
        -resources.jobs.*.lifecycle.prevent_destroy
        -resources.jobs.*.lifecycle.prevent_destroy=true
        -resources.jobs.*.lifecycle.prevent_destroy=false
        -resources.jobs.*.lifecycle.depends_on
        -resources.jobs.*.lifecycle.depends_on[*]
        -resources.jobs.*.lifecycle.depends_on[*].resource
        -resources.jobs.*.id
        -resources.jobs.*.budget_policy_id
        -resources.jobs.*.continuous
        -resources.jobs.*.continuous.maintenance_window
        -resources.jobs.*.continuous.maintenance_window.day_of_week
        -resources.jobs.*.continuous.maintenance_window.start_hour
        -resources.jobs.*.continuous.maintenance_window.timezone_id
        -resources.jobs.*.continuous.pause_status
        -resources.jobs.*.continuous.task_retry_mode
        -resources.jobs.*.deployment
        -resources.jobs.*.deployment.deployment_id
        -resources.jobs.*.deployment.kind
        -resources.jobs.*.deployment.metadata_file_path
        -resources.jobs.*.deployment.version_id
        -resources.jobs.*.description
        -resources.jobs.*.duration_target
        -resources.jobs.*.edit_mode
        -resources.jobs.*.email_notifications
        -resources.jobs.*.email_notifications.no_alert_for_skipped_runs
        -resources.jobs.*.email_notifications.no_alert_for_skipped_runs=true
        -resources.jobs.*.email_notifications.no_alert_for_skipped_runs=false
        -resources.jobs.*.email_notifications.on_duration_warning_threshold_exceeded
        -resources.jobs.*.email_notifications.on_duration_warning_threshold_exceeded[*]
        -resources.jobs.*.email_notifications.on_failure
        -resources.jobs.*.email_notifications.on_failure[*]
        -resources.jobs.*.email_notifications.on_maintenance_complete
        -resources.jobs.*.email_notifications.on_maintenance_complete[*]
        -resources.jobs.*.email_notifications.on_maintenance_start
        -resources.jobs.*.email_notifications.on_maintenance_start[*]
        -resources.jobs.*.email_notifications.on_start
... (5004 more lines truncated, raise DATABRICKS_CLI_TEST_MAX_LOG to see more)

latest (v1.23.0): same output as main (cd5c64d)

TestAccept/bundle/bitmap/presence/DMS=: branch ✅ | main (cd5c64d) ❌ | latest (v1.23.0) ❌

main (cd5c64d):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1083
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle bitmap bitmap-text\n\n>>> [CLI] bundle bitmap bitmap\n\n>>> [CLI] bundle bitmap decode\n\n>>> uv run --isolated --no-project --reinstall-package databricks-bundles --with [DATABRICKS_BUNDLES_WHEEL] -q python -m databricks.bundles._bitmap\n\n>>> [CLI] bundle bitmap update-schema --validate\n\n=== decode rejects input that is not an encoded bitmap\n\n>>> musterr [CLI] bundle bitmap decode\nError: base64: illegal base64 data at input byte 3\n\n=== An invalid bundle fails instead of printing a bitmap\n\n>>> musterr [CLI] bundle bitmap bitmap\nError: Artifact not properly configured\n  in databricks.yml:5:10\n\nplease specify artifact properties\n\n"
        	            	actual  : "\n>>> [CLI] bundle bitmap bitmap-text\n\n>>> [CLI] bundle bitmap bitmap\n\n>>> [CLI] bundle bitmap decode\n\n>>> uv run --isolated --no-project --reinstall-package databricks-bundles --with [DATABRICKS_BUNDLES_WHEEL] -q python -m databricks.bundles._bitmap\nError: Non-base64 digit found\n\nExit code: 1\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -8,18 +8,5 @@
        	            	 >>> uv run --isolated --no-project --reinstall-package databricks-bundles --with [DATABRICKS_BUNDLES_WHEEL] -q python -m databricks.bundles._bitmap
        	            	+Error: Non-base64 digit found
        	            	 
        	            	->>> [CLI] bundle bitmap update-schema --validate
        	            	+Exit code: 1
        	            	 
        	            	-=== decode rejects input that is not an encoded bitmap
        	            	-
        	            	->>> musterr [CLI] bundle bitmap decode
        	            	-Error: base64: illegal base64 data at input byte 3
        	            	-
        	            	-=== An invalid bundle fails instead of printing a bitmap
        	            	-
        	            	->>> musterr [CLI] bundle bitmap bitmap
        	            	-Error: Artifact not properly configured
        	            	-  in databricks.yml:5:10
        	            	-
        	            	-please specify artifact properties
        	            	-
        	            	-
        	Test:       	TestAccept/bundle/bitmap/presence/DMS=
        	Messages:   	bundle/bitmap/presence/output.txt vs /tmp/TestAcceptbundlebitmappresenceDMS=814781160/002/output.txt
    acceptance_test.go:1342: Diff:
        --- bundle/bitmap/presence/out.bitmap.txt
        +++ /tmp/TestAcceptbundlebitmappresenceDMS=814781160/001/out.bitmap.txt
        @@ -1,57 +1,42 @@
        -1 variables
        -1 variables.*
        -1 variables.*.type
        -1 variables.*.default
        -1 variables.*.description
        -1 bundle
        -1 bundle.name
        -1 bundle.target
        -1 bundle.environment
        -1 artifacts
        -1 artifacts.*
        -1 artifacts.*.type
        -1 artifacts.*.files
        -1 artifacts.*.files[*]
        -1 artifacts.*.files[*].source
        -1 artifacts.*.build
        -1 resources
        -1 resources.jobs
        -1 resources.jobs.*
        -1 resources.jobs.*.description
        -1 resources.jobs.*.email_notifications
        -1 resources.jobs.*.max_concurrent_runs
        -1 resources.jobs.*.name
        -1 resources.jobs.*.notification_settings
        -1 resources.jobs.*.notification_settings.no_alert_for_skipped_runs
        -1 resources.jobs.*.parameters
        -1 resources.jobs.*.queue
        -T resources.jobs.*.queue.enabled
        -F resources.jobs.*.queue.enabled
        -1 resources.jobs.*.tags
        -1 resources.jobs.*.tags.*
        -1 resources.jobs.*.tasks
        -1 resources.jobs.*.tasks[*]
        -1 resources.jobs.*.tasks[*].depends_on
        -1 resources.jobs.*.tasks[*].depends_on[*]
        -1 resources.jobs.*.tasks[*].depends_on[*].task_key
        -F resources.jobs.*.tasks[*].disable_auto_optimization
        -1 resources.jobs.*.tasks[*].notebook_task
        -1 resources.jobs.*.tasks[*].notebook_task.notebook_path
        -1 resources.jobs.*.tasks[*].task_key
        -1 resources.jobs.*.timeout_seconds
        -1 run_as
        -1 run_as.service_principal_name
        -1 presets
        -1 presets.name_prefix
        -F presets.pipelines_development
        -1 experimental
        -1 telemetry.ArtifactBuildCommandIsSet
        -T telemetry.ArtifactBuildCommandIsSet[*]
        -F telemetry.ArtifactBuildCommandIsSet[*]
        -1 telemetry.ArtifactFilesIsSet
        -T telemetry.ArtifactFilesIsSet[*]
        -F telemetry.ArtifactFilesIsSet[*]
        -T telemetry.PresetsNamePrefixIsSet
        -T telemetry.ConfigHasDoubleDollarBrace
        -F telemetry.UseLegacyRunAs
        -T telemetry.RunAsSet
        +Declarative Automation Bundles let you express data/AI/analytics projects as code.
        +
        +Common workflows:
        +  databricks bundle init default-python      # Initialize new project
        +  databricks bundle deploy --target dev      # Deploy to development
        +  databricks bundle run my_job               # Run jobs/pipelines
        +  databricks bundle deploy --target prod     # Deploy to production
        +
        +Import existing resources:
        +  databricks bundle generate job --existing-job-id 123 --key my_job # Generate job configuration
        +  databricks bundle deployment bind my_job 123                      # Link to an existing job
        +
        +Online documentation: https://docs.databricks.com/en/dev-tools/bundles/index.html
        +
        +Usage:
        +  databricks bundle [command]
        +
        +Available Commands:
        +  deploy             Deploy bundle
        +  deployment         Deployment related commands
        +  destroy            Destroy deployed bundle resources
        +  generate           Generate bundle configuration
        +  init               Initialize using a bundle template
        +  open               Open a resource in the browser
        +  plan               Show deployment plan
        +  run                Run a job, pipeline update or app
        +  schema             Generate JSON Schema for bundle configuration
        +  summary            Summarize resources deployed by this bundle
        +  sync               Synchronize bundle tree to the workspace
        +  validate           Validate configuration
        +
        +Flags:
        +  -h, --help          help for bundle
        +      --var strings   set values for variables defined in bundle config. Example: --var="foo=bar"
        +
        +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)
        +
        +Use "databricks bundle [command] --help" for more information about a command.

latest (v1.23.0): same output as main (cd5c64d)

TestAccept/bundle/bitmap/presence/DMS=true: branch ✅ | main (cd5c64d) ❌ | latest (v1.23.0) ❌

main (cd5c64d):

acceptance_test.go:1342: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1342
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1083
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n>>> [CLI] bundle bitmap bitmap-text\n\n>>> [CLI] bundle bitmap bitmap\n\n>>> [CLI] bundle bitmap decode\n\n>>> uv run --isolated --no-project --reinstall-package databricks-bundles --with [DATABRICKS_BUNDLES_WHEEL] -q python -m databricks.bundles._bitmap\n\n>>> [CLI] bundle bitmap update-schema --validate\n\n=== decode rejects input that is not an encoded bitmap\n\n>>> musterr [CLI] bundle bitmap decode\nError: base64: illegal base64 data at input byte 3\n\n=== An invalid bundle fails instead of printing a bitmap\n\n>>> musterr [CLI] bundle bitmap bitmap\nError: Artifact not properly configured\n  in databricks.yml:5:10\n\nplease specify artifact properties\n\n"
        	            	actual  : "\n>>> [CLI] bundle bitmap bitmap-text\n\n>>> [CLI] bundle bitmap bitmap\n\n>>> [CLI] bundle bitmap decode\n\n>>> uv run --isolated --no-project --reinstall-package databricks-bundles --with [DATABRICKS_BUNDLES_WHEEL] -q python -m databricks.bundles._bitmap\nError: Non-base64 digit found\n\nExit code: 1\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -8,18 +8,5 @@
        	            	 >>> uv run --isolated --no-project --reinstall-package databricks-bundles --with [DATABRICKS_BUNDLES_WHEEL] -q python -m databricks.bundles._bitmap
        	            	+Error: Non-base64 digit found
        	            	 
        	            	->>> [CLI] bundle bitmap update-schema --validate
        	            	+Exit code: 1
        	            	 
        	            	-=== decode rejects input that is not an encoded bitmap
        	            	-
        	            	->>> musterr [CLI] bundle bitmap decode
        	            	-Error: base64: illegal base64 data at input byte 3
        	            	-
        	            	-=== An invalid bundle fails instead of printing a bitmap
        	            	-
        	            	->>> musterr [CLI] bundle bitmap bitmap
        	            	-Error: Artifact not properly configured
        	            	-  in databricks.yml:5:10
        	            	-
        	            	-please specify artifact properties
        	            	-
        	            	-
        	Test:       	TestAccept/bundle/bitmap/presence/DMS=true
        	Messages:   	bundle/bitmap/presence/output.txt vs /tmp/TestAcceptbundlebitmappresenceDMS=true1911421600/002/output.txt
    acceptance_test.go:1342: Diff:
        --- bundle/bitmap/presence/out.bitmap.txt
        +++ /tmp/TestAcceptbundlebitmappresenceDMS=true1911421600/001/out.bitmap.txt
        @@ -1,57 +1,42 @@
        -1 variables
        -1 variables.*
        -1 variables.*.type
        -1 variables.*.default
        -1 variables.*.description
        -1 bundle
        -1 bundle.name
        -1 bundle.target
        -1 bundle.environment
        -1 artifacts
        -1 artifacts.*
        -1 artifacts.*.type
        -1 artifacts.*.files
        -1 artifacts.*.files[*]
        -1 artifacts.*.files[*].source
        -1 artifacts.*.build
        -1 resources
        -1 resources.jobs
        -1 resources.jobs.*
        -1 resources.jobs.*.description
        -1 resources.jobs.*.email_notifications
        -1 resources.jobs.*.max_concurrent_runs
        -1 resources.jobs.*.name
        -1 resources.jobs.*.notification_settings
        -1 resources.jobs.*.notification_settings.no_alert_for_skipped_runs
        -1 resources.jobs.*.parameters
        -1 resources.jobs.*.queue
        -T resources.jobs.*.queue.enabled
        -F resources.jobs.*.queue.enabled
        -1 resources.jobs.*.tags
        -1 resources.jobs.*.tags.*
        -1 resources.jobs.*.tasks
        -1 resources.jobs.*.tasks[*]
        -1 resources.jobs.*.tasks[*].depends_on
        -1 resources.jobs.*.tasks[*].depends_on[*]
        -1 resources.jobs.*.tasks[*].depends_on[*].task_key
        -F resources.jobs.*.tasks[*].disable_auto_optimization
        -1 resources.jobs.*.tasks[*].notebook_task
        -1 resources.jobs.*.tasks[*].notebook_task.notebook_path
        -1 resources.jobs.*.tasks[*].task_key
        -1 resources.jobs.*.timeout_seconds
        -1 run_as
        -1 run_as.service_principal_name
        -1 presets
        -1 presets.name_prefix
        -F presets.pipelines_development
        -1 experimental
        -1 telemetry.ArtifactBuildCommandIsSet
        -T telemetry.ArtifactBuildCommandIsSet[*]
        -F telemetry.ArtifactBuildCommandIsSet[*]
        -1 telemetry.ArtifactFilesIsSet
        -T telemetry.ArtifactFilesIsSet[*]
        -F telemetry.ArtifactFilesIsSet[*]
        -T telemetry.PresetsNamePrefixIsSet
        -T telemetry.ConfigHasDoubleDollarBrace
        -F telemetry.UseLegacyRunAs
        -T telemetry.RunAsSet
        +Declarative Automation Bundles let you express data/AI/analytics projects as code.
        +
        +Common workflows:
        +  databricks bundle init default-python      # Initialize new project
        +  databricks bundle deploy --target dev      # Deploy to development
        +  databricks bundle run my_job               # Run jobs/pipelines
        +  databricks bundle deploy --target prod     # Deploy to production
        +
        +Import existing resources:
        +  databricks bundle generate job --existing-job-id 123 --key my_job # Generate job configuration
        +  databricks bundle deployment bind my_job 123                      # Link to an existing job
        +
        +Online documentation: https://docs.databricks.com/en/dev-tools/bundles/index.html
        +
        +Usage:
        +  databricks bundle [command]
        +
        +Available Commands:
        +  deploy             Deploy bundle
        +  deployment         Deployment related commands
        +  destroy            Destroy deployed bundle resources
        +  generate           Generate bundle configuration
        +  init               Initialize using a bundle template
        +  open               Open a resource in the browser
        +  plan               Show deployment plan
        +  run                Run a job, pipeline update or app
        +  schema             Generate JSON Schema for bundle configuration
        +  summary            Summarize resources deployed by this bundle
        +  sync               Synchronize bundle tree to the workspace
        +  validate           Validate configuration
        +
        +Flags:
        +  -h, --help          help for bundle
        +      --var strings   set values for variables defined in bundle config. Example: --var="foo=bar"
        +
        +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)
        +
        +Use "databricks bundle [command] --help" for more information about a command.
        
FAIL

latest (v1.23.0): same output as main (cd5c64d)

132 more failure details omitted, see the full report in the run.

@denik
denik force-pushed the denik/bundle-bitmap branch from f972c44 to 1cc9186 Compare November 4, 2026 10:08
@github-actions github-actions Bot added the PyDABs label Nov 4, 2026
@denik
denik force-pushed the denik/bundle-bitmap branch from a8684da to ae3e5d4 Compare November 4, 2026 13:01
denik added 15 commits November 4, 2026 14:55
Co-authored-by: Isaac
Encode presence of every bundle config field as one bit. The schema is
derived by reflecting over config.Root, recorded in bundle/bitmap/schema.txt,
and embedded into the binary. Append-only so bit positions stay stable.

Adds hidden `databricks bundle bitmap` group: schema, update-schema
[--validate], bitmap-text, bitmap. Wires generate-bitmap-schema into the
Taskfile and runs the encoder over all no_drift invariant configs.

Co-authored-by: Isaac
Kept in PR history for context; not landed.

Co-authored-by: Isaac
- Every bool/*bool field now gets a "#true" value bit in addition to its
  presence bit, so a *bool encodes unset/false/true as 00/10/11.
- decode_bitmap.py decodes the base64 bitmap against the schema; the dedicated
  acceptance test asserts it round-trips to bitmap-text.
- Record the encoded bitmap and set-bit list for the default-python template.

Co-authored-by: Isaac
Replace the string-keyed BoolValues map with a typed bundle.Telemetry struct
whose fields feed both the deploy telemetry wire (via BoolValues()) and the
bundle bitmap (namespaced under telemetry.*).

Value-bearing flags whose false is meaningful are stored as True/False pairs so
the bitmap can represent both outcomes; BoolValues() collapses each pair back to
its single wire key. libs/cache gets a concrete Metrics struct (embedded into
Telemetry) instead of the old interface.

The wire is unchanged except that redundant false entries of one-hot groups
(state_path_*, dms_undeclared_*) are no longer emitted; their true member is
preserved.

Co-authored-by: Isaac
decode_bitmap.py was committed without the executable bit, so the round-trip
step failed with "permission denied" (exit code differed across OSes, breaking
the golden). Mark it executable.

bitmap-text and bitmap are separate invocations sharing a cache dir, so the
second recorded a cache hit instead of a miss and the round-trip check
diverged. Give each its own cache dir so both observe a cold miss.

Co-authored-by: Isaac
On a CRLF checkout (Windows) the embedded schema.txt lines kept a trailing \r,
so they never matched the clean paths from WalkType. Merge's dedup then failed
and the schema doubled, breaking bundle bitmap schema/bitmap-text on Windows.
splitLines now normalizes CRLF.

Co-authored-by: Isaac
The schema had telemetry fields appended at the tail (from append-only merges
across a rebase). Since the PR has not landed, bit positions need not be
stable yet, so regenerate from scratch to put telemetry fields in natural walk
order.

generate-bitmap-schema now also regenerates the bitmap acceptance goldens
(out.schema.txt, out.bitmap-text.txt, encoded bitmap), which embed the schema
and depend on bit positions; otherwise they go stale when the schema changes.

Co-authored-by: Isaac
Existing telemetry (bundle/metrics AddBoolValue/SetBoolValue and the wire) is
unchanged. Add a Telemetry struct on Bundle with a field per bool flag; each
metrics call site additionally sets the matching field so the same signal
reaches the bitmap. Value-bearing flags use True/False pairs so the
presence-only bitmap can distinguish measured-false from not-measured. Fields
have no json tags, so they are invisible to the config schema and walked into
the bitmap under their Go field names (telemetry.*).

Verified the telemetry and resource_deps goldens are byte-identical to main:
the change is strictly additive to the existing wire.

Co-authored-by: Isaac
The four dms_undeclared_* flags are independent booleans recorded with
their real value on every deploy, so a measured false is meaningful (it
is the common "no undeclared writers" case). As single presence bits a
false collapsed to 0, indistinguishable from "not measured", losing the
signal. Store each as a True/False pair like the other value-bearing
flags. The telemetry wire (BoolValues) is unchanged.

Co-authored-by: Isaac
The dms_undeclared_* flags are always co-emitted with the one-hot
DMSCompat verdict, so a 0 bit is unambiguously "measured false" rather
than "not measured" — a True/False pair adds no information. A pair is
only warranted for a lone boolean with no co-located signal that the
measurement ran (e.g. run_as_set). Adds a comment recording why.

Co-authored-by: Isaac
The telemetry struct's fields have no json tags, so structwalk.Walk does
not honor omitempty and visits every field regardless of value. Bits()
ignored the visited value and set the bit on mere presence, so every
telemetry bit was 1 on every deploy (the acceptance golden showed all
mutually-exclusive one-hot members set at once). Gate the telemetry walk
on the visited bool value so a field maps to a bit only when true.

Also drop blank lines in splitLines so a stray one can never shift bit
indices in the append-only schema, and make the test stand-in tagless to
match the real struct (the tagged stand-in masked the bug).

Co-authored-by: Isaac
Rebase onto main picked up new config fields (resources.secrets.*) and
removed the acceptance Local option, which now fails as an undecoded key.

Co-authored-by: Isaac
Main added resources.pipelines.*.cascade_on_destroy, which shifts the
schema and the encoded bitmaps.

Co-authored-by: Isaac
denik and others added 8 commits November 4, 2026 14:55
Main moved the select/source-linked metrics into mark_select_used.go and
apply_sync_mode.go, dropped the dry-run migration metrics, and added
plan-error, recreate-planned, via-default, deployment-history,
immutable-snapshot, and ai_runtime_task metrics. Mirror them into
Telemetry, regenerate the (still unreleased) schema from scratch, and drop
the engine matrix from the bitmap test now that direct is the only engine.

Co-authored-by: Isaac <no-reply@databricks.com>
Co-authored-by: Isaac <no-reply@databricks.com>
… tests

- Compute bits from bundle.UserConfig, a snapshot of the config taken at the
  start of Initialize (plus resources added by Python before their defaults are
  filled in), so the bitmap records what users configure rather than CLI
  defaults (workspace paths, current_user, job format/queue, ...).
- Walk the dyn.Value instead of the typed struct: interface-typed fields
  (variables.*.default) and empty containers were never marked, and zero
  non-omitempty fields always were.
- Replace True/False field pairs and SetPaired with a BoolPair type; per-artifact
  flags call Set per artifact, so mixed artifacts set both bits.
- bundle bitmap now fails on an invalid bundle instead of printing a bitmap.
- Goldens record only set bits; the schema and encoded blob are scratch files
  checked by the round trip, so an added config field touches only schema.txt.
  test-acc/test-update no longer regenerate the schema and goldens first.
- Decode: overflow-safe size check; tests for header errors, byte boundaries,
  non-zero context; Python decoder checks the context; unique-schema test.
- Acceptance coverage for interface defaults, empty containers, explicit zero,
  dotted map keys, target overrides, run_as, escapes, mixed artifacts, an
  invalid bundle, and a Python-defined resource.

Co-authored-by: Isaac <no-reply@databricks.com>
Split acceptance/bundle/bitmap into presence/ (set bits, round trip, invalid
bundle) and full/, which records the complete bitmap-text so a PR adding a
config field shows where it landed. generate-bitmap-schema refreshes full/.

Co-authored-by: Isaac <no-reply@databricks.com>
- bundle.Telemetry is now the single source of the deploy event's bool_values:
  fields are bool (reported when true), *bool (a measured value) or []bool (one
  value per item), keyed by a `metric` tag. Call sites set one field instead of
  a Metrics call plus a mirror. The wire has the same entries in field order;
  has_<task_type> and local.cache.* stay in Metrics.BoolValues.
- The bitmap records each bool field's value: the schema has "=true"/"=false"
  entries after every bool field (config and telemetry).
- bitmap-text and the new `bundle bitmap decode` (stdin) print one line per set
  field: "T"/"F" for a bool value, "1" otherwise.
- acceptance/bundle/bitmap/full records the whole schema; presence covers bool
  variants (SDK omitempty false, non-omitempty true/false, *bool false, an
  unresolved reference) and pins the known gap: an explicit false on an
  omitempty bool of a CLI-defined struct is dropped by the loader.

Co-authored-by: Isaac <no-reply@databricks.com>
databricks.bundles._bitmap decodes an encoded bundle bitmap without the CLI:
it embeds the schema, raw-DEFLATE compressed and base64 encoded, and
decompresses it on import. `python -m databricks.bundles._bitmap` reads a
bitmap on stdin and prints the same lines as `bundle bitmap decode`.

bundle/bitmap/genpython writes the embedded schema; compressing in Go keeps
the generated file identical regardless of the Python's zlib build. It runs as
part of `task generate-bitmap-schema`.

The presence test and every no_drift invariant config check that the Python
decoder's output matches the CLI's. The tests pass --reinstall-package because
the wheel's version does not change with the code and uv would otherwise reuse
a cached install.

Co-authored-by: Isaac <no-reply@databricks.com>
Co-authored-by: Isaac <no-reply@databricks.com>
Co-authored-by: Isaac <no-reply@databricks.com>
@denik
denik force-pushed the denik/bundle-bitmap branch from ae3e5d4 to f9387c0 Compare November 4, 2026 13:57
denik and others added 2 commits November 4, 2026 15:04
pydabs-codegen deletes every databricks/bundles package except core before
regenerating, which removed _bitmap (and then ruff re-sorted the test's
imports). Exclude it there, and skip private packages in the generated docs.

Co-authored-by: Isaac <no-reply@databricks.com>
Configs with warnings (e.g. the deprecated pipeline development property)
leaked them into output.txt once stdout and stderr were split. Log stderr and
keep the panic check on it.

Co-authored-by: Isaac <no-reply@databricks.com>

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

DABs DABs related issues PyDABs Stale

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants