From 232f0e57342f5defc3d3dcf5d523c2c5779240c6 Mon Sep 17 00:00:00 2001
From: Denis Bilenko <denis.bilenko@databricks.com>
Date: Wed, 15 Apr 2026 16:33:04 +0000
Subject: [PATCH 1/6] Fix float precision loss in jsonschema ParseFloat

strconv.ParseFloat(s, 32) parses the string as a float32 and then
promotes it to float64, silently losing precision. For example, "1.1"
becomes 1.100000023841858 instead of 1.1. This affects users who
specify number-type template variables during `databricks bundle init`.

Change the bit size from 32 to 64 to preserve full float64 precision.

Task: 001.md

Co-authored-by: Isaac
---
 libs/jsonschema/utils.go      | 2 +-
 libs/jsonschema/utils_test.go | 5 ++---
 2 files changed, 3 insertions(+), 4 deletions(-)

diff --git a/libs/jsonschema/utils.go b/libs/jsonschema/utils.go
index b9df7da515..cb25393075 100644
--- a/libs/jsonschema/utils.go
+++ b/libs/jsonschema/utils.go
@@ -110,7 +110,7 @@ func fromString(s string, T Type) (any, error) {
 	case BooleanType:
 		v, err = strconv.ParseBool(s)
 	case NumberType:
-		v, err = strconv.ParseFloat(s, 32)
+		v, err = strconv.ParseFloat(s, 64)
 	case IntegerType:
 		v, err = strconv.ParseInt(s, 10, 64)
 	case ArrayType, ObjectType:
diff --git a/libs/jsonschema/utils_test.go b/libs/jsonschema/utils_test.go
index 954c723d3f..d0a46e6788 100644
--- a/libs/jsonschema/utils_test.go
+++ b/libs/jsonschema/utils_test.go
@@ -95,8 +95,7 @@ func TestTemplateFromString(t *testing.T) {
 
 	v, err = fromString("1.1", NumberType)
 	assert.NoError(t, err)
-	// Floating point conversions are not perfect
-	assert.Less(t, (v.(float64) - 1.1), 0.000001)
+	assert.Equal(t, 1.1, v)
 
 	v, err = fromString("12345", IntegerType)
 	assert.NoError(t, err)
@@ -104,7 +103,7 @@ func TestTemplateFromString(t *testing.T) {
 
 	v, err = fromString("123", NumberType)
 	assert.NoError(t, err)
-	assert.InDelta(t, float64(123), v.(float64), 0.0001)
+	assert.Equal(t, float64(123), v)
 
 	_, err = fromString("qrt", ArrayType)
 	assert.EqualError(t, err, "cannot parse string as object of type array. Value of string: \"qrt\"")

From f23542d2853826943d87cd7fa711b5e5f139655e Mon Sep 17 00:00:00 2001
From: Denis Bilenko <denis.bilenko@databricks.com>
Date: Wed, 15 Apr 2026 16:37:52 +0000
Subject: [PATCH 2/6] Add changelog entry for float precision fix

Co-authored-by: Isaac
---
 NEXT_CHANGELOG.md | 1 +
 1 file changed, 1 insertion(+)

diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md
index 17fc85feec..f1669287e5 100644
--- a/NEXT_CHANGELOG.md
+++ b/NEXT_CHANGELOG.md
@@ -11,6 +11,7 @@
 
 
 ### Bundles
+* Fix float precision loss when parsing number-type template variables during `bundle init` (denik/random-bugfixes-3)
 
 * Translate relative paths in `alert_task.workspace_path` on job tasks to fully qualified workspace paths, matching the behavior of other task path fields. Applies to both regular tasks and `for_each_task` nested tasks ([#4836](https://github.com/databricks/cli/pull/4836)).
 

From 2c46525980b07e906e68ddec42174c59584da50b Mon Sep 17 00:00:00 2001
From: Denis Bilenko <denis.bilenko@databricks.com>
Date: Wed, 22 Apr 2026 14:54:35 +0000
Subject: [PATCH 3/6] Add regression test for float precision fix

Adds an acceptance test that renders a template with a number-type
variable (default 1.1). Prior to the ParseFloat bit-size fix the
value rendered as 1.100000023841858; with the fix it renders as 1.1.

Task: 005.md

Co-authored-by: Isaac
---
 .../number-precision/databricks_template_schema.json     | 9 +++++++++
 .../templates-machinery/number-precision/out.test.toml   | 5 +++++
 .../templates-machinery/number-precision/output.txt      | 6 ++++++
 .../bundle/templates-machinery/number-precision/script   | 4 ++++
 .../number-precision/template/number.txt.tmpl            | 1 +
 5 files changed, 25 insertions(+)
 create mode 100644 acceptance/bundle/templates-machinery/number-precision/databricks_template_schema.json
 create mode 100644 acceptance/bundle/templates-machinery/number-precision/out.test.toml
 create mode 100644 acceptance/bundle/templates-machinery/number-precision/output.txt
 create mode 100644 acceptance/bundle/templates-machinery/number-precision/script
 create mode 100644 acceptance/bundle/templates-machinery/number-precision/template/number.txt.tmpl

diff --git a/acceptance/bundle/templates-machinery/number-precision/databricks_template_schema.json b/acceptance/bundle/templates-machinery/number-precision/databricks_template_schema.json
new file mode 100644
index 0000000000..9a1bfb55a5
--- /dev/null
+++ b/acceptance/bundle/templates-machinery/number-precision/databricks_template_schema.json
@@ -0,0 +1,9 @@
+{
+    "properties": {
+        "n": {
+            "type": "number",
+            "description": "A number variable",
+            "default": 1.1
+        }
+    }
+}
diff --git a/acceptance/bundle/templates-machinery/number-precision/out.test.toml b/acceptance/bundle/templates-machinery/number-precision/out.test.toml
new file mode 100644
index 0000000000..d560f1de04
--- /dev/null
+++ b/acceptance/bundle/templates-machinery/number-precision/out.test.toml
@@ -0,0 +1,5 @@
+Local = true
+Cloud = false
+
+[EnvMatrix]
+  DATABRICKS_BUNDLE_ENGINE = ["terraform", "direct"]
diff --git a/acceptance/bundle/templates-machinery/number-precision/output.txt b/acceptance/bundle/templates-machinery/number-precision/output.txt
new file mode 100644
index 0000000000..7b07f8a5b5
--- /dev/null
+++ b/acceptance/bundle/templates-machinery/number-precision/output.txt
@@ -0,0 +1,6 @@
+
+>>> [CLI] bundle init .
+✨ Successfully initialized template
+
+>>> cat number.txt
+n: 1.1
diff --git a/acceptance/bundle/templates-machinery/number-precision/script b/acceptance/bundle/templates-machinery/number-precision/script
new file mode 100644
index 0000000000..e15c9e54dc
--- /dev/null
+++ b/acceptance/bundle/templates-machinery/number-precision/script
@@ -0,0 +1,4 @@
+trace $CLI bundle init .
+
+trace cat number.txt
+rm number.txt
diff --git a/acceptance/bundle/templates-machinery/number-precision/template/number.txt.tmpl b/acceptance/bundle/templates-machinery/number-precision/template/number.txt.tmpl
new file mode 100644
index 0000000000..cb1344deb3
--- /dev/null
+++ b/acceptance/bundle/templates-machinery/number-precision/template/number.txt.tmpl
@@ -0,0 +1 @@
+n: {{ .n }}

From 4cd533df210aa41da0b27914a1bb7c72c1641b64 Mon Sep 17 00:00:00 2001
From: Denis Bilenko <denis.bilenko@databricks.com>
Date: Tue, 28 Apr 2026 08:27:56 +0000
Subject: [PATCH 4/6] Fix lint failures: parallel runners and float-compare

The lint check originally failed with 'parallel golangci-lint is running',
caused by concurrent worktrees colliding on the shared /tmp lockfile.
Restore allow-parallel-runners: true in .golangci.yaml.

After unblocking, testifylint's float-compare also flagged two assert.Equal
calls in libs/jsonschema/utils_test.go (introduced by the float precision
fix). Switch to assert.InDelta with delta=0 to express exact equality and
satisfy the linter.

Task: 006.md

Co-authored-by: Isaac
---
 .golangci.yaml                | 4 ++++
 libs/jsonschema/utils_test.go | 6 ++++--
 2 files changed, 8 insertions(+), 2 deletions(-)

diff --git a/.golangci.yaml b/.golangci.yaml
index 6f41b1cee2..876490b648 100644
--- a/.golangci.yaml
+++ b/.golangci.yaml
@@ -1,4 +1,8 @@
 version: "2"
+run:
+  # Needed when multiple worktrees or CI shards invoke golangci-lint
+  # concurrently; without it they collide on the shared /tmp lockfile.
+  allow-parallel-runners: true
 linters:
   default: none
   enable:
diff --git a/libs/jsonschema/utils_test.go b/libs/jsonschema/utils_test.go
index d0a46e6788..d17e4c1b2c 100644
--- a/libs/jsonschema/utils_test.go
+++ b/libs/jsonschema/utils_test.go
@@ -95,7 +95,9 @@ func TestTemplateFromString(t *testing.T) {
 
 	v, err = fromString("1.1", NumberType)
 	assert.NoError(t, err)
-	assert.Equal(t, 1.1, v)
+	// Delta 0: assert.Equal would trigger testifylint's float-compare; we want
+	// exact equality here to verify the float64 ParseFloat precision fix.
+	assert.InDelta(t, 1.1, v, 0)
 
 	v, err = fromString("12345", IntegerType)
 	assert.NoError(t, err)
@@ -103,7 +105,7 @@ func TestTemplateFromString(t *testing.T) {
 
 	v, err = fromString("123", NumberType)
 	assert.NoError(t, err)
-	assert.Equal(t, float64(123), v)
+	assert.InDelta(t, float64(123), v, 0)
 
 	_, err = fromString("qrt", ArrayType)
 	assert.EqualError(t, err, "cannot parse string as object of type array. Value of string: \"qrt\"")

From 70540d6186a9cc3ba142ddc700684a4a1511a21c Mon Sep 17 00:00:00 2001
From: Denis Bilenko <denis.bilenko@databricks.com>
Date: Tue, 28 Apr 2026 08:44:27 +0000
Subject: [PATCH 5/6] Revert .golangci.yaml change and tidy testifylint
 suppression

Drop the unrelated allow-parallel-runners restoration in .golangci.yaml
that was bundled into 2b6721afc. The parallel-runner setting is an
environment-only workaround (per-worktree TMPDIR is the durable fix,
tracked separately) and adding it here violates the repo's one-change
per-PR rule.

With the lint config no longer enabling testifylint's float-compare
across this branch, reword the two affected assertions to use
assert.Equal directly with an inline nolint:testifylint comment that
documents why exact float64 equality is the property under test.

Task: 007.md

Co-authored-by: Isaac
---
 .golangci.yaml                | 4 ----
 libs/jsonschema/utils_test.go | 8 ++++----
 2 files changed, 4 insertions(+), 8 deletions(-)

diff --git a/.golangci.yaml b/.golangci.yaml
index 876490b648..6f41b1cee2 100644
--- a/.golangci.yaml
+++ b/.golangci.yaml
@@ -1,8 +1,4 @@
 version: "2"
-run:
-  # Needed when multiple worktrees or CI shards invoke golangci-lint
-  # concurrently; without it they collide on the shared /tmp lockfile.
-  allow-parallel-runners: true
 linters:
   default: none
   enable:
diff --git a/libs/jsonschema/utils_test.go b/libs/jsonschema/utils_test.go
index d17e4c1b2c..beb126e390 100644
--- a/libs/jsonschema/utils_test.go
+++ b/libs/jsonschema/utils_test.go
@@ -95,9 +95,8 @@ func TestTemplateFromString(t *testing.T) {
 
 	v, err = fromString("1.1", NumberType)
 	assert.NoError(t, err)
-	// Delta 0: assert.Equal would trigger testifylint's float-compare; we want
-	// exact equality here to verify the float64 ParseFloat precision fix.
-	assert.InDelta(t, 1.1, v, 0)
+	//nolint:testifylint // exact float64 equality is the property under test
+	assert.Equal(t, 1.1, v)
 
 	v, err = fromString("12345", IntegerType)
 	assert.NoError(t, err)
@@ -105,7 +104,8 @@ func TestTemplateFromString(t *testing.T) {
 
 	v, err = fromString("123", NumberType)
 	assert.NoError(t, err)
-	assert.InDelta(t, float64(123), v, 0)
+	//nolint:testifylint // exact float64 equality is the property under test
+	assert.Equal(t, float64(123), v)
 
 	_, err = fromString("qrt", ArrayType)
 	assert.EqualError(t, err, "cannot parse string as object of type array. Value of string: \"qrt\"")

From 1da53a573171fa748b9fa6faac912cddc982cc66 Mon Sep 17 00:00:00 2001
From: Denis Bilenko <denis.bilenko@databricks.com>
Date: Tue, 28 Apr 2026 08:58:14 +0000
Subject: [PATCH 6/6] Update NEXT_CHANGELOG.md with PR #4992

---
 NEXT_CHANGELOG.md | 1 -
 1 file changed, 1 deletion(-)

diff --git a/NEXT_CHANGELOG.md b/NEXT_CHANGELOG.md
index f1669287e5..17fc85feec 100644
--- a/NEXT_CHANGELOG.md
+++ b/NEXT_CHANGELOG.md
@@ -11,7 +11,6 @@
 
 
 ### Bundles
-* Fix float precision loss when parsing number-type template variables during `bundle init` (denik/random-bugfixes-3)
 
 * Translate relative paths in `alert_task.workspace_path` on job tasks to fully qualified workspace paths, matching the behavior of other task path fields. Applies to both regular tasks and `for_each_task` nested tasks ([#4836](https://github.com/databricks/cli/pull/4836)).
 
