Skip to content

Package a local directory code_source_path for AI Runtime tasks - #6110

Merged
vinchenzo-db merged 20 commits into
mainfrom
air-code-source-dir-rebase
Aug 4, 2026
Merged

Package a local directory code_source_path for AI Runtime tasks#6110
vinchenzo-db merged 20 commits into
mainfrom
air-code-source-dir-rebase

Conversation

@vinchenzo-db

@vinchenzo-db vinchenzo-db commented Jul 31, 2026

Copy link
Copy Markdown
Contributor

Let ai_runtime_task.code_source_path point at a local directory, not just a pre-built tarball. A new aicode mutator (run in the build phase, before libraries.ExpandGlobReferences/ReplaceWithRemotePath) detects a local-directory value, packages it into a reproducible, content-addressed tarball — honoring .gitignore and the top-level sync.include/exclude globs — uploads it to the user's ~/.air/repo_snapshots directory, and rewrites code_source_path to the uploaded (de-/Workspace-prefixed) path. Because it runs first, PR #5922's artifact-style collection then sees an already-remote path and skips it, so the two compose: a directory is packaged by the CLI, a pre-built .tgz still flows through the artifact path.

Also synthesizes a requirements.yaml next to the task's command_path from the job's serverless environments[] spec, so the AI Runtime harness sets up the workload environment. command_path translation itself is provided by #5922.

Verified end-to-end on a live workspace: a plain bundle deploy of a directory code_source_path yields a job whose run terminates SUCCESS; sync.exclude and .gitignore entries are absent from the uploaded snapshot; unchanged code skips re-upload.

Co-authored-by: Isaac

Changes

Adds an aicode bundle mutator that packages a local code directory referenced by an AI Runtime task's code_source_path and uploads it during bundle deploy, then wires it into the build/initialize phases.

  • bundle/config/mutator/aicode/package_upload.go — PackageAndUpload (build-phase mutator): finds every ai_runtime_task.code_source_path (direct and under for_each_task) that points at a local directory, packages it into a reproducible, content-addressed .tar.gz (.git/gitignored files excluded, honoring the top-level sync.include/exclude), uploads it to the user's ~/.air/repo_snapshots directory, and rewrites code_source_path to the uploaded remote path. The archive name embeds the SHA-256 of the tarball, so an unchanged directory resolves to the same remote path and re-uploads are skipped.
  • bundle/config/mutator/aicode/snapshot_package.go — the reproducible tar builder (fixed epoch on every entry so identical content ⇒ identical bytes ⇒ identical hash).
  • bundle/config/mutator/aicode/requirements.go — SynthesizeRequirements: writes a requirements.yaml next to each task's translated command_path, derived from the job's serverless environments[] spec, so the AI Runtime harness can set up the workload environment.
  • bundle/config/mutator/aicode/validate.go — Validate (read-only, initialize-phase): surfaces misconfigurations early (local code_source_path combined with git_source, or with experimental.immutable_folder) with actionable messages, performing no uploads.
  • Directory-vs-file discrimination (package_upload.go + validate.go): both mutators only claim a code_source_path that resolves to an existing directory. A local file (a pre-built tarball delivered via an artifacts block) or a not-yet-existing path is left untouched so it flows through the standard artifact-upload path. This is what lets the two paths compose.
  • bundle/phases/{build,initialize}.go — runs PackageAndUpload + SynthesizeRequirements in the build phase before libraries.ExpandGlobReferences/ReplaceWithRemotePath, and Validate in the initialize phase.
  • Acceptance test bundle/ai_runtime_task/local_code_source covering the full package → upload → rewrite → requirements-synthesis flow, plus unit tests for each mutator (including the directory/file/remote skip cases).

Why

The SDK jobs.AiRuntimeTask.code_source_path field expects a workspace or UC-volume path to an uploaded code archive, and its doc comment states the CLI is responsible for packaging the user's local code into that archive. Nothing in DABs did that yet: a user pointing code_source_path at a local directory had no way to bundle deploy a runnable AI Runtime job.

This mutator implements that contract for bundles. It deliberately reuses DABs' existing local-artifact upload plumbing and runs before ReplaceWithRemotePath, so the two upload paths compose without special-casing: a directory is packaged and uploaded by this mutator (which then presents an already-remote path that the artifact collector skips), while a pre-built tarball delivered via an artifacts block still flows through the artifact path as a file. Content-addressing keeps redeploys of unchanged code a no-op. SynthesizeRequirements closes the loop so the deployed workload actually has its environment set up — without it the run fails during setup.

Tests

End-to-end validation

Verified on a live A10 staging workspace (dbc-04ac0685-8857) that the aicode mutator packages a local-directory code_source_path at bundle deploy and that the deployed AI Runtime workload runs to SUCCESS on real GPU. Covered all three code-source shapes the mutator must handle, plus the artifact-tarball path it must not claim.

What was validated
Seam: PackageAndUpload claims a local directory
Expected: dir → content-addressed .tar.gz, uploaded to ~/.air/repo_snapshots, code_source_path rewritten to
the remote archive
Result: ✅
────────────────────────────────────────
Seam: PackageAndUpload skips a local file
Expected: a pre-built tarball (artifacts block) flows through the standard artifact upload, not aicode
packaging
Result: ✅ (bundle/artifacts/ai_runtime_code_source acceptance test)
────────────────────────────────────────
Seam: command_path translation
Expected: rewritten to its absolute synced workspace path
Result: ✅
────────────────────────────────────────
Seam: SynthesizeRequirements
Expected: writes requirements.yaml next to command_path, derived from environments[].spec
Result: ✅
────────────────────────────────────────
Seam: GPU workload
Expected: extracts code, installs deps, runs on A10, exits SUCCESS
Result: ✅

Deployed ai_runtime_task after bundle deploy (mutator output)

{
"code_source_path": "/Users//.air/repo_snapshots/code_source/code_source_5659f5b55c3427b1.tar.gz",
"command_path": "/Workspace/Users//.bundle/convert-e2e-smoke/dev/files/command.sh"
}

code_source_path was ./code_source (a local directory) in the bundle — the mutator packaged it, uploaded the content-addressed archive, and rewrote the field to the remote path.

Live GPU runs (all SUCCESS on NVIDIA A10G)

┌────────────────────┬───────────────────────────┬───────────┬─────────────────────────────────────────┐
│      Scenario      │     code_source shape     │   Run     │          Workload log evidence          │
│                    │                           │  result   │                                         │
├────────────────────┼───────────────────────────┼───────────┼─────────────────────────────────────────┤
│                    │                           │ ✅        │ cuda available: True · device: NVIDIA   │
│ Working tree       │ local dir                 │ SUCCESS   │ A10G · matmul checksum 1131894.0 · ===  │
│                    │                           │ (242s)    │ SUCCESS ===                             │
├────────────────────┼───────────────────────────┼───────────┼─────────────────────────────────────────┤
│                    │ local dir (materialized   │ ✅        │ ran the committed code, not the dirty   │
│ Git-pinned commit  │ from a pinned SHA)        │ SUCCESS   │ working tree · === SUCCESS ===          │
│                    │                           │ (192s)    │                                         │
├────────────────────┼───────────────────────────┼───────────┼─────────────────────────────────────────┤
│ Requirements-file  │ local dir + deps in       │ ✅        │ torch 2.13.0+cu130, numpy 2.1.3         │
│ deps               │ environments[].spec       │ SUCCESS   │ installed via synthesized               │
│                    │                           │ (272s)    │ requirements.yaml · === SUCCESS ===     │
└────────────────────┴───────────────────────────┴───────────┴─────────────────────────────────────────┘

Reproduce

# 1. Author a run YAML with a local code_source directory
cat > train.yaml <<'YAML'
experiment_name: aicode-e2e
command: cd "$CODE_SOURCE_PATH" && python train.py
compute: {accelerator_type: GPU_1xA10, num_accelerators: 1}
environment: {version: 5, dependencies: [torch]}
code_source: {type: snapshot, snapshot: {root_path: ./src}}
YAML
mkdir -p src && echo 'import torch; print("cuda:", torch.cuda.is_available()); print("=== SUCCESS ===")' > src/train.py

# 2. Convert to a bundle (emits code_source_path: ./code_source, a local directory)
databricks experimental air convert-to-dabs train.yaml --output-dir bundle
cd bundle

# 3. Deploy — the aicode mutator packages the directory, uploads it, rewrites code_source_path,
#    and synthesizes requirements.yaml next to command_path
databricks bundle deploy

# 4. Run on GPU and confirm SUCCESS
databricks bundle run aicode-e2e

Let ai_runtime_task.code_source_path point at a local directory, not just a
pre-built tarball. A new aicode mutator (run in the build phase, before
libraries.ExpandGlobReferences/ReplaceWithRemotePath) detects a local-directory
value, packages it into a reproducible, content-addressed tarball — honoring
.gitignore and the top-level sync.include/exclude globs — uploads it to the
user's ~/.air/repo_snapshots directory, and rewrites code_source_path to the
uploaded (de-/Workspace-prefixed) path. Because it runs first, PR #5922's
artifact-style collection then sees an already-remote path and skips it, so the
two compose: a directory is packaged by the CLI, a pre-built .tgz still flows
through the artifact path.

Also synthesizes a requirements.yaml next to the task's command_path from the
job's serverless environments[] spec, so the AI Runtime harness sets up the
workload environment. command_path translation itself is provided by #5922.

Verified end-to-end on a live workspace: a plain bundle deploy of a directory
code_source_path yields a job whose run terminates SUCCESS; sync.exclude and
.gitignore entries are absent from the uploaded snapshot; unchanged code skips
re-upload.

Co-authored-by: Isaac
@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Jul 31, 2026

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: 215d43d

Run: 30951122910

Env 💚​RECOVERED 🙈​SKIP ✅​pass 🙈​skip Time
💚​ aws linux 4 4 306 1090 4:36
💚​ aws windows 4 4 308 1088 6:43
💚​ azure linux 4 4 305 1090 4:58
💚​ azure windows 4 4 307 1088 6:49
💚​ gcp linux 1 5 306 1090 5:06
💚​ gcp windows 1 5 308 1088 7:04
8 interesting tests: 4 RECOVERED, 4 SKIP
Test Name aws linux aws windows azure linux azure windows gcp linux gcp windows
💚​ TestAccept 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
🙈​ TestAccept/bundle/invariant/no_drift 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_endpoints/drift/recreated_same_name 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/bundle/resources/vector_search_indexes/recreate/embedding_dimension 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
🙈​ TestAccept/ssh/connection 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S 🙈​S
💚​ TestFetchRepositoryInfoAPI_FromRepo 💚​R 💚​R 💚​R 💚​R 🙈​S 🙈​S
💚​ TestFetchRepositoryInfoAPI_FromRepo/root 💚​R 💚​R 💚​R 💚​R
💚​ TestFetchRepositoryInfoAPI_FromRepo/subdir 💚​R 💚​R 💚​R 💚​R
Top 6 slowest tests (at least 2 minutes):
duration env testname
6:27 gcp windows TestAccept
6:14 azure windows TestAccept
6:05 aws windows TestAccept
2:56 gcp linux TestAccept
2:48 azure linux TestAccept
2:45 aws linux TestAccept

The aicode mutator packages a local directory code_source_path at deploy. A
pre-built tarball delivered via an `artifacts` block (code_source_path pointing
at a local *file*) must instead flow through the standard artifact-upload path,
exactly as the two-path design intends. Validate rejected such a path outright
("code_source_path not found" — the artifact tarball does not exist yet at
initialize time), breaking the existing bundle/artifacts/ai_runtime_code_source
acceptance test.

Both Validate and collectLocalCodeSources now skip any local code_source_path
that does not resolve to an existing directory, leaving it for the artifact
uploader. The packaging-specific constraints (git_source, immutable_folder) only
apply once the path is confirmed to be a directory this mutator will package.

Co-authored-by: Isaac
Comment thread acceptance/bundle/ai_runtime_task/local_code_source/src/.gitignore
Comment thread acceptance/bundle/ai_runtime_task/local_code_source/databricks.yml
Comment thread acceptance/bundle/ai_runtime_task/local_code_source/script Outdated
Comment thread acceptance/bundle/ai_runtime_task/local_code_source/script Outdated
Comment thread bundle/config/mutator/aicode/validate.go Outdated
Comment thread bundle/config/mutator/aicode/package_upload.go Outdated
Comment thread bundle/config/mutator/aicode/package_upload.go Outdated
Comment thread acceptance/bundle/ai_runtime_task/local_code_source/databricks.yml
Comment thread bundle/config/mutator/aicode/package_upload.go Outdated
Comment thread bundle/config/mutator/aicode/requirements.go Outdated
- Remove the never-set `client` filer field from packageAndUpload and
  synthesizeRequirements (only ever nil); build the workspace filer directly.
- Read the current user directly (resolved in the initialize phase) instead of
  the defensive nil-guarded helper.
- Surface a stat error other than not-exist (e.g. unreadable directory) instead
  of silently treating it as "not a directory to package"; shared isExistingDir
  helper used by collect and Validate.
- Pass GitSource into validateTask (nil-check inside) to keep validation logic
  contained.
- Collect a single direct-task code_source_path pattern, matching Validate and
  SynthesizeRequirements (for_each_task is unsupported until all three gain it).
- SynthesizeRequirements writes requirements.yaml next to every deployment's
  command_path (deduped by directory), not just the first.

Co-authored-by: Isaac
Reworks the local_code_source acceptance test per review:
- Assert the uploaded tarball's contents via list_code_snapshot.py: gitignored
  files (ignored_by_git.txt, data/) are excluded, *.log is excluded via
  sync.exclude, and data/model.bin is force-included via sync.include.
- Use print_requests.py instead of hand-rolled jq (testing.md rule); extend its
  --del-body to also strip the top-level raw_body so the binary tarball upload
  doesn't dump into the golden.
- Add a cache-miss case: editing a file changes the content hash and re-uploads.

Co-authored-by: Isaac
vinchenzo-db and others added 5 commits July 31, 2026 12:53
print_requests.py path filters and the workspace export in list_code_snapshot.py
were rewritten by Git Bash's MSYS path conversion on Windows (e.g. /repo_snapshots/
-> C:/Program Files/Git/repo_snapshots/), failing the test. Use // leading
filters (matching the existing convention) and set MSYS_NO_PATHCONV for the export.

Co-authored-by: Isaac
Split subprocess.run kwargs onto separate lines to satisfy ruff format.

Co-authored-by: Isaac
Reworks PackageAndUpload to place the code snapshot inside the bundle instead of
uploading it to a shared ~/.air/repo_snapshots workspace cache. The mutator now
writes the content-addressed tarball into the bundle's sync tree (.air_snapshots/)
and rewrites code_source_path to the workspace path it will occupy once synced; it
performs no workspace write itself. Normal bundle file sync uploads it during the
deploy phase.

Why:
- Build phase must not mutate the workspace (it runs before `bundle plan`). The
  old filer upload violated that; now the only build-phase work is local
  prepare-and-archive, and the upload happens in the deploy phase via file sync.
- No deploy-time side-effect outside the bundle: `bundle destroy` removes the
  snapshot like any other bundle file, so the home-dir cache can no longer
  compound across bundles/deploys.
- Dedup is preserved: the name is content-addressed and bundle file sync is
  incremental, so unchanged code keeps the same synced path and is not re-uploaded.

Tradeoff: the cache is now per-bundle rather than shared across bundles. See the
package doc for the (rejected) TranslatePaths alternative and why archiving stays
in the build phase.

Co-authored-by: Isaac
The snapshot is now injected into the bundle sync root as an in-memory overlay
file rather than written under the working tree. This keeps the deploy artifact
inside the bundle (synced to <root>/files/.air_snapshots/, removed by
`bundle destroy`, content-addressed so unchanged code is not re-uploaded) while
leaving the user's working tree clean — no generated .tar.gz appears in their
checkout.

Adds libs/vfs.Overlay: a vfs.Path wrapper that serves a set of in-memory files in
addition to a base path, participating in Open/Stat/ReadDir/ReadFile and fs.WalkDir
so bundle file sync uploads the overlaid files transparently. PackageAndUpload
builds each snapshot in memory and swaps b.SyncRoot for an overlay carrying them.

Co-authored-by: Isaac
@ben-hansen-db
ben-hansen-db self-requested a review July 31, 2026 23:19

@ben-hansen-db ben-hansen-db left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

code_source_path: ../shared # points outside the bundle

Error: failed to list files for code_source_path "../shared": stat ../shared: invalid argument

can we make this error better?

Comment thread bundle/config/mutator/aicode/requirements.go Outdated
Comment thread bundle/config/mutator/aicode/package_code_source.go
Comment thread bundle/config/mutator/aicode/package_code_source.go
Comment thread bundle/config/mutator/aicode/package_upload.go Outdated
Fixes from PR review:

- Reject a code_source_path that escapes the bundle sync root (e.g. "../shared")
  in Validate with a clear message, instead of failing later as an opaque io/fs
  "invalid argument".
- Reject a local code_source_path combined with source-linked deployment: that
  mode makes files.Upload a no-op and ignores workspace.file_path, so the packaged
  snapshot would never be uploaded and the job would point at a missing path.
- Reject a local code_source_path nested under a for_each_task, which the mutator
  does not package (it operates on direct tasks only) — previously silently skipped.
- Error when the code_source directory has no files to package (all excluded by
  .gitignore/sync.exclude, or empty) rather than deploying a job with no code.
- Force-include the .air_snapshots snapshot dir in GetSyncIncludePatterns (like
  .databricks) so a user ignore rule such as "*.tar.gz" can't filter the deployed
  job's code_source_path archive out of the sync set. Shared bundle.AiCodeSnapshotDir
  constant keeps the mutator and the sync include in agreement.

Co-authored-by: Isaac
Remove the SynthesizeRequirements mutator. It wrote a co-located requirements.yaml
next to command_path during the build phase — which (a) made workspace writes in a
phase that runs before `bundle plan` and (b) duplicated dependency delivery that
the native path already handles.

The AI Runtime runtime installs pip deps from the job's serverless environment
(environments[].spec.dependencies) via the server-side --deps-config path; the
co-located requirements.yaml is the legacy mechanism new clients no longer create.
convert-to-dabs already emits deps into environments[].spec, so the sidecar was
redundant.

Verified end-to-end on A10: with SynthesizeRequirements disabled and no
requirements.yaml uploaded, the run logs "No co-located requirements.yaml ...
skipping" and installs torch from the inline environment deps to SUCCESS.

Co-authored-by: Isaac
Comment thread bundle/bundle.go Outdated
Comment thread bundle/phases/build.go Outdated
Comment thread bundle/config/mutator/aicode/package_code_source.go
Comment thread acceptance/bundle/ai_runtime_task/local_code_source/databricks.yml
Comment thread acceptance/bundle/ai_runtime_task/local_code_source/script
Comment thread bundle/config/mutator/aicode/package_code_source.go
Second review round:

- Reject a sync.exclude that matches the reserved .air_snapshots dir. The sync set
  is (git ∪ include) − exclude, so exclude wins over the force-include; a pattern
  like ".air_snapshots/*" or "**/*.tar.gz" would silently drop the generated
  archive and leave the job pointing at an un-uploaded path. Validate now errors.
- Reject a real file/dir at .air_snapshots in the bundle: it would collide with the
  in-memory overlay (sync would carry the user's entry, not the generated archive).
- Both guards only fire when a task actually packages a local code_source.
- Rename PackageAndUpload -> PackageCodeSource: it packages and overlays the archive
  for file sync to upload; it no longer uploads itself.
- Acceptance test: add a second AI Runtime task so two tarballs are packaged, both
  under the repo-root .air_snapshots; assert a no-op re-deploy; and destroy at the
  end so the test cleans up after itself. list_code_snapshot.py now lists every
  task's archive.

Co-authored-by: Isaac
Close two review gaps:

- Assert a literal `bundle plan` no-op ("0 to add, 0 to change, 0 to delete")
  after deploy, instead of a no-op re-deploy proxy.
- Add an empty_code_source acceptance test: a code_source dir whose contents are
  all filtered out (src/.gitignore of "*") makes `bundle deploy` fail with the
  "no files to package" error, covering packageOne's empty-source unhappy path
  end-to-end (the pipeline needs a workspace client, so this is exercised via
  acceptance rather than a mocked unit test).

Co-authored-by: Isaac
Comment thread .nextchanges/bundles/ai-runtime-code-source-dir.md Outdated
Only force-sync .air_snapshots for bundles that actually package an AI Runtime
code_source, rather than for every bundle. The aicode mutator sets a new
Bundle.HasAiRuntimeCodeSnapshot flag when it packages one, and
GetSyncIncludePatterns gates the force-include on it. Keeps the generic sync
include list from carrying a feature-specific entry for unrelated bundles.

Also tighten the comments added across this feature to be concise.

Co-authored-by: Isaac
The fragment described the pre-review behavior. requirements.yaml is no longer
synthesized (deps come from the environments spec), and the archive is packaged
into the bundle and uploaded by file sync, not written to a separate workspace
cache dir.

Co-authored-by: Isaac

@ben-hansen-db ben-hansen-db left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Looks good but I think mode should be no more restrictive than whatever user has locally

Comment thread bundle/config/mutator/aicode/snapshot_package.go Outdated
The snapshot builder hardcoded 0o644, stripping the execute bit — a bundled
helper the user invokes (e.g. a ./run.sh called from command.sh) would arrive
non-executable and fail at runtime. Preserve the owner execute bit (0o755 when
set, else 0o644) while still normalizing the rest of the mode. Deriving the mode
from the file's own bits keeps the archive reproducible.

Co-authored-by: Isaac
Windows file modes don't carry a Unix execute bit, so writing 0o755 doesn't make
the file report executable and the archived-mode assertion fails there. The bit
only matters on the Unix hosts that run the workload; skip the test on Windows.
The production path is already Windows-safe (files report non-exec -> 0o644).

Co-authored-by: Isaac
Comment thread libs/vfs/overlay.go Outdated
Comment thread libs/vfs/overlay.go
Comment thread .nextchanges/bundles/ai-runtime-code-source-dir.md Outdated
Comment thread bundle/config/mutator/aicode/package_code_source.go
Comment thread bundle/config/mutator/aicode/snapshot_package.go
Comment thread acceptance/bin/print_requests.py
Comment thread bundle/config/mutator/aicode/validate.go Outdated
Comment thread acceptance/bundle/ai_runtime_task/empty_code_source/script Outdated
Comment thread bundle/config/mutator/aicode/package_code_source.go
…erlay paths

- validate: gate the snapshot-dir guards on an existing local *directory*, not any
  local path. A pre-built tarball (a local file, the #5922 flow) is uploaded by the
  artifact path and packages no snapshot, so a natural `sync.exclude` of "*.tar.gz"
  was wrongly rejected. Guarded in the file-based acceptance test.
- codeSourceFiles: drop entries outside the code directory. sync.include is force-
  added regardless of the scoped walk, so an unrelated include made an all-filtered
  directory look non-empty and shipped an empty archive. The empty_code_source test
  now covers that shape and uses musterr.
- vfs.Overlay: reject names that aren't relative in-root files. An absolute name hung
  the ancestor walk (path.Dir("/") is never "."), and "" resolved to the root.
- print_requests.py: add --del-field for top-level request fields instead of
  overloading --del-body, which only edits the parsed JSON body.
- Rename package_upload.go to package_code_source.go (it performs no upload), trim
  the changelog fragment, and document that entry modes are not cross-platform
  identical (Windows has no execute bit).

Co-authored-by: Isaac
Co-authored-by: Isaac

@janniklasrose janniklasrose left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

couple of small changes on the newly created list_code_snapshot, otherwise lgtm & ready to merge

@@ -0,0 +1,69 @@
#!/usr/bin/env python3

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

use main() for this script

Comment thread acceptance/bin/list_code_snapshot.py Outdated
if pos >= len(text):
break
obj, pos = decoder.raw_decode(text, pos)
requests.append(obj)

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

re-use read_json_many from here

Reuse read_json_many from print_requests instead of re-implementing the
concatenated-JSON decode.

Co-authored-by: Isaac
@vinchenzo-db
vinchenzo-db added this pull request to the merge queue Aug 4, 2026
Merged via the queue into main with commit da9949b Aug 4, 2026
26 checks passed
@vinchenzo-db
vinchenzo-db deleted the air-code-source-dir-rebase branch August 4, 2026 22:12
Sankalp-Mittal added a commit that referenced this pull request Aug 5, 2026
The local_code_source test filtered recorded uploads by URL path, which no
longer matches: /workspace/import carries the target filename in the multipart
body. Filter on the body instead, the same way auto-migrate-empty-tfstate does.

--del-field raw_body is dropped because the tarball is binary and the request
recorder already summarizes it as a size placeholder.

This test was added in #6110, after the upload migration branch was cut, so it
was not covered by the earlier fixture updates.

Co-authored-by: Isaac
@eng-dev-ecosystem-bot

Copy link
Copy Markdown
Collaborator

Integration test report

Commit: da9949b

Run: 30991378297

Env ❌​FAIL 🟨​KNOWN 🤯​MISS 💚​RECOVERED 🙈​SKIP ✅​pass 🙈​skip Time
❌​ aws windows 9 2 241 4 1 890 902 343:51
❌​ azure windows 7 136 6 1 897 937 347:25
❌​ gcp windows 4 235 4 2 772 947 346:27
412 interesting tests: 385 MISS, 20 FAIL, 4 RECOVERED, 2 KNOWN, 1 SKIP
Test Name aws windows azure windows gcp windows
🤯​ TestAccept 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/apps/job_permissions 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/apps/job_permissions/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/apps/job_permissions/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_doesnot_exist 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_doesnot_exist/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_doesnot_exist/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_not_deployed 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_not_deployed/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/artifacts/artifact_path_with_volume/volume_not_deployed/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/empty-bundle 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/empty-bundle/DATABRICKS_BUNDLE_ENABLE_EXPERIMENTAL_YAML_SYNC=/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/empty-bundle/DATABRICKS_BUNDLE_ENABLE_EXPERIMENTAL_YAML_SYNC=/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/empty-bundle/DATABRICKS_BUNDLE_ENABLE_EXPERIMENTAL_YAML_SYNC=true/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/empty-bundle/DATABRICKS_BUNDLE_ENABLE_EXPERIMENTAL_YAML_SYNC=true/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/files/no-snapshot-sync 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/files/no-snapshot-sync/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/files/no-snapshot-sync/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/mlops-stacks 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/mlops-stacks/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/mlops-stacks/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/snapshot-comparison 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/snapshot-comparison/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/spark-jar-task 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/spark-jar-task/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deploy/spark-jar-task/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M 🤯​M 🤯​M
🤯​ TestAccept/bundle/deployment/bind/alert 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/alert/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/alert/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/catalog 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/catalog/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/cluster 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/cluster/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/cluster/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/dashboard 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/dashboard/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/dashboard/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/dashboard/recreation 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/dashboard/recreation/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/dashboard/recreation/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/experiment 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/experiment/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/experiment/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/job/generate-and-bind 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/job/generate-and-bind/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/job/generate-and-bind/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/job/job-abort-bind 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/job/job-abort-bind/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/job/job-abort-bind/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/job/job-spark-python-task 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/job/job-spark-python-task/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/job/job-spark-python-task/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/model-serving-endpoint 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/model-serving-endpoint/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/model-serving-endpoint/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
❌​ TestAccept/bundle/deployment/bind/pipelines/recreate 🤯​M ❌​F 🤯​M
❌​ TestAccept/bundle/deployment/bind/pipelines/recreate/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ❌​F 🤯​M
🤯​ TestAccept/bundle/deployment/bind/pipelines/recreate/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/registered-model 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/registered-model/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/registered-model/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/schema 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/schema/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/schema/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/secret-scope 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/secret-scope/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/secret-scope/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/vector_search_endpoint 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/vector_search_endpoint/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/vector_search_index 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/vector_search_index/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/volume 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/volume/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/bind/volume/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/unbind/grants 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/unbind/grants/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/unbind/grants/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/unbind/permissions 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/unbind/permissions/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/deployment/unbind/permissions/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/destroy/jobs-and-pipeline 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/destroy/jobs-and-pipeline/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/destroy/jobs-and-pipeline/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/alert 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/alert/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/alert/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/auto-bind 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/auto-bind/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/pipeline_and_deploy 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/pipeline_and_deploy/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/pipeline_and_deploy/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/python_job_and_deploy 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/python_job_and_deploy/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/generate/python_job_and_deploy/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/base 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/custom_params 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/custom_params/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/custom_params/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/interactive_cluster 🤯​M ✅​p ✅​p
🤯​ TestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p ✅​p
🤯​ TestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p ✅​p
🤯​ TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=SINGLE_USER 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=USER_ISOLATION 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=USER_ISOLATION 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/interactive_single_user 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/serverless 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/serverless/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/serverless/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/serverless_custom_params 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/serverless_custom_params/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/serverless_custom_params/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/serverless_dynamic_version 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/serverless_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/integration_whl/serverless_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform 🤯​M ✅​p ✅​p
🤯​ TestAccept/bundle/invariant/continue_293 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=dashboard.yml.tmpl 🤯​M ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=experiment.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_10_tasks.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_depends_on.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_serving_endpoint.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_allow_duplicate_names.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=registered_model.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_empty_grants.yml.tmpl ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_uppercase_name.yml.tmpl ✅​p ✅​p 🤯​M
💚​ TestAccept/bundle/invariant/no_drift 💚​R 💚​R 💚​R
❌​ TestAccept/bundle/resources/apps/lifecycle-started-toggle ❌​F ✅​p ✅​p
❌​ TestAccept/bundle/resources/apps/lifecycle-started-toggle/DATABRICKS_BUNDLE_ENGINE=direct ❌​F ✅​p ✅​p
❌​ TestAccept/bundle/resources/dashboards/change-name ✅​p ❌​F ✅​p
❌​ TestAccept/bundle/resources/dashboards/change-name/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ❌​F ✅​p
🤯​ TestAccept/bundle/resources/dashboards/destroy ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/destroy/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/destroy/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/detect-change ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/detect-change/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/detect-change/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/generate_inplace ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/generate_inplace/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/generate_inplace/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/nested-folders ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/nested-folders/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/nested-folders/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/simple ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/simple/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/simple/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/simple_outside_bundle_root ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/simple_outside_bundle_root/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/simple_outside_bundle_root/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/simple_syncroot ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/simple_syncroot/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/simple_syncroot/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/unpublish-out-of-band ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/unpublish-out-of-band/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/dashboards/unpublish-out-of-band/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/experiments/basic ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/experiments/basic/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/experiments/basic/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/genie_spaces/parent_path_update ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/genie_spaces/parent_path_update/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/genie_spaces/recreate_when_gone ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/genie_spaces/recreate_when_gone/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/genie_spaces/simple ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/genie_spaces/simple/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/genie_spaces/version_migration ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/genie_spaces/version_migration/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/catalogs ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/catalogs/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/registered_models ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/registered_models/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/registered_models/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/all_privileges ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/all_privileges/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/all_privileges/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/all_privileges_coexist ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/all_privileges_coexist/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/all_privileges_coexist/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/change_privilege ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/change_privilege/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/change_privilege/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/duplicate_principals ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/duplicate_principals/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/duplicate_principals/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/duplicate_privileges ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/duplicate_privileges/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/duplicate_privileges/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/empty_array ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/empty_array/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/empty_array/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/out_of_band_principal ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/out_of_band_principal/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/out_of_band_principal/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/remove_principal ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/remove_principal/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/schemas/remove_principal/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/volumes ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/volumes/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/grants/volumes/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/alert-task ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/alert-task/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/alert-task/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/check-metadata ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/check-metadata/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/check-metadata/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/double-underscore-keys ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/double-underscore-keys/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/double-underscore-keys/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/fail-on-active-runs ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/fail-on-active-runs/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/fail-on-active-runs/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/no-git-provider ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/no-git-provider/DATABRICKS_BUNDLE_ENGINE=direct ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/no-git-provider/DATABRICKS_BUNDLE_ENGINE=terraform ✅​p ✅​p 🤯​M
🤯​ TestAccept/bundle/resources/jobs/shared-root-path ✅​p ✅​p 🤯​M
Top 50 slowest tests (at least 2 minutes):
duration env testname
31:42 aws windows TestAccept/bundle/resources/vector_search_indexes/schema_normalization/DATABRICKS_BUNDLE_ENGINE=direct
20:59 azure windows TestAccept/bundle/resources/vector_search_indexes/recreate/embedding_dimension/DATABRICKS_BUNDLE_ENGINE=direct
15:11 gcp windows TestAccept/bundle/resources/apps/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
13:27 gcp windows TestAccept/bundle/resources/vector_search_indexes/recreate/embedding_dimension/DATABRICKS_BUNDLE_ENGINE=direct
13:12 azure windows TestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=direct
13:02 azure windows TestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=terraform
13:02 gcp windows TestAccept/bundle/resources/vector_search_indexes/basic/DATABRICKS_BUNDLE_ENGINE=direct
12:46 azure windows TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=USER_ISOLATION
12:44 gcp windows TestAccept/bundle/resources/vector_search_indexes/schema_normalization/DATABRICKS_BUNDLE_ENGINE=direct
12:35 azure windows TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=direct
12:33 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=app.yml.tmpl/READPLAN=1
12:04 gcp windows TestAccept/bundle/resources/vector_search_indexes/grants/select/DATABRICKS_BUNDLE_ENGINE=direct
12:03 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1
12:03 gcp windows TestAccept/bundle/run/app-with-job/DATABRICKS_BUNDLE_ENGINE=terraform
11:22 azure windows TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=direct/DATA_SECURITY_MODE=SINGLE_USER
10:55 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=1
10:54 gcp windows TestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=direct
10:52 azure windows TestAccept/bundle/integration_whl/interactive_single_user/DATABRICKS_BUNDLE_ENGINE=direct
10:40 azure windows TestAccept/bundle/integration_whl/base/DATABRICKS_BUNDLE_ENGINE=terraform
10:33 gcp windows TestAccept/bundle/resources/clusters/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
10:21 gcp windows TestAccept/bundle/integration_whl/interactive_cluster/DATABRICKS_BUNDLE_ENGINE=terraform
10:18 aws windows TestAccept/bundle/resources/model_serving_endpoints/running-endpoint/DATABRICKS_BUNDLE_ENGINE=terraform
10:12 azure windows TestAccept/bundle/templates/default-python/combinations/serverless/DATABRICKS_BUNDLE_ENGINE=terraform/DLT=yes/NBOOK=yes/PY=yes/READPLAN=
10:05 gcp windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster_apply_policy_default_values.yml.tmpl/READPLAN=1
10:02 azure windows TestAccept/bundle/resources/apps/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
9:59 gcp windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=1
9:51 gcp windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=
9:45 gcp windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl/READPLAN=1
9:43 aws windows TestAccept/bundle/resources/apps/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
9:38 aws windows TestAccept/bundle/resources/permissions/factcheck/DATABRICKS_BUNDLE_ENGINE=terraform
9:36 gcp windows TestAccept/bundle/run/app-with-job/DATABRICKS_BUNDLE_ENGINE=direct
9:30 aws windows TestAccept/bundle/resources/model_serving_endpoints/running-endpoint/DATABRICKS_BUNDLE_ENGINE=direct
9:24 gcp windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=pipeline_apply_policy_default_values.yml.tmpl/READPLAN=1
9:22 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=catalog.yml.tmpl/READPLAN=
9:09 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=cluster.yml.tmpl/READPLAN=
9:07 gcp windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=instance_pool.yml.tmpl/READPLAN=1
9:07 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=model_serving_endpoint.yml.tmpl/READPLAN=1
9:06 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_with_task.yml.tmpl/READPLAN=
9:04 aws windows TestAccept/bundle/resources/clusters/lifecycle-started/DATABRICKS_BUNDLE_ENGINE=direct
8:49 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_pydabs_1000_tasks.yml.tmpl/READPLAN=1
8:48 azure windows TestAccept/bundle/integration_whl/interactive_cluster_dynamic_version/DATABRICKS_BUNDLE_ENGINE=terraform/DATA_SECURITY_MODE=SINGLE_USER
8:41 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_for_each_task.yml.tmpl/READPLAN=1
8:38 gcp windows TestAccept/bundle/resources/clusters/deploy/local_ssd_count/DATABRICKS_BUNDLE_ENGINE=direct
8:30 gcp windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=genie_space.yml.tmpl/READPLAN=
8:30 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=experiment.yml.tmpl/READPLAN=1
8:29 gcp windows TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=sql_warehouse.yml.tmpl
8:29 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=dashboard.yml.tmpl/READPLAN=1
8:28 aws windows TestAccept/bundle/invariant/continue_293/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=schema_uppercase_name.yml.tmpl
8:25 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_job_cluster.yml.tmpl/READPLAN=
8:25 aws windows TestAccept/bundle/invariant/delete_idempotent/DATABRICKS_BUNDLE_ENGINE=direct/INPUT_CONFIG=job_apply_policy_default_values_task_cluster.yml.tmpl/READPLAN=1
(182 table rows omitted to keep the report under 60000 bytes)

deco-sdk-tagging Bot added a commit that referenced this pull request Aug 6, 2026
## Release v1.11.0

### CLI

 * Fixed `databricks repos get/update/delete` failing with `object at path "..." is not a repo` for Git-CLI-enabled folders (currently in preview), which the workspace API reports as directories rather than repos ([#6181](#6181)).
 * Support `dbfs:/Skills/...` paths in `databricks fs` commands, routed to the Files API. ([#6147](#6147))

### Bundles

 * For jobs where `ai_runtime_task.code_source_path` is a relative path to a local directory, the directory is now packaged into a tarball (honoring `.gitignore` and `sync.include`/`sync.exclude`), uploaded during deployment, and `code_source_path` is rewritten to the uploaded workspace path. ([#6110](#6110))
 * Added JSON output to `bundle init`. Running `databricks bundle init <template> -o json` now reports the files the template wrote, relative to the output directory. This lets callers that pass `--output-dir` learn where the template materialized instead of assuming the output is a single directory named after the project. The default text output is unchanged. ([#6161](#6161))
 * The terraform deployment engine is deprecated and will stop working in a future version of the CLI. Setting `bundle.engine: terraform` now emits a deprecation warning. See https://docs.databricks.com/aws/en/dev-tools/bundles/direct for how to migrate to the direct deployment engine. ([#6099](#6099))
 * Fixed the direct deployment engine planning a spurious `create` for an empty `grants: []` list. Terraform records no grants resource for such a list, so `bundle plan` after `bundle deployment migrate` no longer reports an action for it. Emptying a previously deployed list still revokes the grants, after which the node is dropped from the deployment state instead of being reported as unchanged forever. ([#6039](#6039))
 * Fixed `bundle generate` downloading notebooks found inside a folder without their file extension. They are now exported like top-level notebooks, so a Python notebook lands as `notebook.py` instead of an extensionless file ([#6144](#6144)).
 * direct: `webhook_notifications.on_*` destinations on jobs, tasks, and `for_each_task` are now compared as unordered sets. Previously the Jobs API returning these lists in a different order than submitted produced a phantom diff that `bundle plan` and `bundle deploy` could never converge past, reporting `1 to change` on every run ([#6060](#6060)).
 * Fixed a pipeline with `allow_duplicate_names: true` never converging on the direct engine: the field is only accepted on create/update and is never returned by the pipelines GET API, so every subsequent `bundle plan` reported the pipeline as a perpetual update. ([#6076](#6076))
 * direct: A local change to an input-only field (one the API accepts on write but never returns on read, e.g. pipelines' `run_as` or external locations' `skip_validation`) is no longer silently skipped when the new value coincidentally matches the field's fabricated remote value. Previously such a change could hit the `remote_already_set` shortcut and be dropped from the plan. ([#6112](#6112))
 * Revert usage of RedactiveSenstiveFields (added in [#5896](#5896), released in 1.10.0) which lead to incorrect behaviour (permanent drift) for duration field in Postgres resources ([#6179](#6179)).
 * Document postgres resource fields in the json schema ([#6164](#6164), [#6163](#6163)).
 * direct: Recreating a `vector_search_indexes` resource no longer fails with "Index ... is currently pending deletion" when the backend has not yet released the index name. The create is now retried until the name becomes available. ([#6143](#6143))

### Dependency Updates

 * Bump `github.com/databricks/databricks-sdk-go` from v0.165.0 to v0.166.0. ([#6175](#6175))
 * Upgrade Terraform provider to 1.124.0. ([#6174](#6174))
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.

4 participants