Skip to content

aitools: Hint the AI Runtime skill only on air subcommands - #7622

Draft
artemy-kolesnikov wants to merge 3 commits into
mainfrom
CNXT-2593-air-only-aitools-hint
Draft

artemy-kolesnikov wants to merge 3 commits into
mainfrom
CNXT-2593-air-only-aitools-hint

Conversation

@artemy-kolesnikov

@artemy-kolesnikov artemy-kolesnikov commented Nov 13, 2026 •

Copy link
Copy Markdown

Title: aitools: Hint the AI Runtime skill only on air subcommands

Changes

The Claude Code install hint (agents.MaybeHint, run from the root PersistentPreRunE since #5918) printed one generic line on every non-aitools command:

Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install

This change limits the hint to runnable databricks air subcommands (run, get, list, logs, cancel, convert-to-dabs, images/images push, pools/pools list/pools get). There it names the skill, says what it covers, and gives both the install and a no-install preview:

Tip: the databricks-ai-runtime skill is not installed. It documents the air workload YAML, GPU types, secrets, and how to follow and debug runs. Install it: databricks aitools install --skills-only --skills databricks-ai-runtime (to read it first without installing: databricks aitools install --path <dir> --skills databricks-ai-runtime)
  • Other commands get no hint, including auth profiles, version, jobs list and apps init (apps init still prints its own APPS_INIT_TIP).
  • Bare air and air --help: cobra renders help without running PersistentPreRunE, so the hook can't fire there. The air help footer now has the benefit line and the --path preview under the existing "Coding agent skill" line.
  • Detection (AIR path): an exact databricks-ai-runtime dir (symlinks followed) in ~/.databricks/aitools/skills, the legacy ~/.databricks/agent-skills, or the project store <dir>/.databricks/aitools/skills, where <dir> is cwd or any parent up to the repository root (projectDirs, the same walk DatabricksTooling uses). Or the databricks plugin, counted only when its record applies to cwd (databricksPluginActiveIn); a plugin installed for another project no longer silences the hint. Before this change, any databricks* skill (for example only databricks-jobs) counted as installed. HasDatabricksSkillsIn and its other callers (apps init, version --check) are unchanged.
  • Unchanged: Claude-only gating, the CLAUDE_CODE_SESSION_ID throttle (at most once per hour per session; with no session id the hint prints on every air command, as before), and the telemetry kind (INSTALL_TEXT). No new enum value; ExecutionContext.Command already tells air commands apart.
  • .nextchanges/cli/air-skill-hint.md is added.

Why

In a coding-agent run (Claude Code), the agent saw the generic hint on databricks auth profiles. It read the hint as unrelated setup noise and went to docs instead of the skill. This change keeps the hint to relevant (air) commands, naming the skill and a concrete benefit, with a no-install preview. #7452's description makes the same point: calls with no task to apply the skills to "do not convert".

Needs maintainer sign-off on the hint wording. The generic hint is an existing feature, and removing it from non-air commands is a product call. If a generic hint should stay somewhere, the AIR branch of this change can be kept and the generic one restored for those commands, with a separate throttle key per hint kind. Otherwise a generic hint on an earlier command uses up the session's one hint before the agent reaches air.

Why this is based on main, not stacked on #7452 or #7578:

Tests

New or changed unit tests:

  • libs/aitools/agents/hint_test.go:
    • TestMaybeHint_AIRSubcommandsHint: runnable air subcommands, including nested ones.
    • TestMaybeHint_NonAIRCommandsSilent: auth profiles, current-user me, clusters list, jobs list, bundle deploy, workspace list, version, aitools install, experimental aitools install, bare air, hidden experimental air.
    • TestMaybeHint_AIRSkillDetection and TestMaybeHint_AIRSkillInRepositoryRoot: canonical, legacy, symlinked and project stores; repository root seen from a subdirectory; other databricks* skills only; a file named like the skill; a plugin for this project vs. an unrelated project.
    • TestMaybeHint_SessionThrottle: with a session id, only the first air command is hinted, and an earlier non-air command doesn't use up the hint. With no session id, every air command is hinted.
    • TestMaybeHint_OtherSessionStillHinted, TestAIRHintText.
    • Every hint and silence assertion also checks the telemetry events: one INSTALL_TEXT event, or none.
  • cmd/air/hint_test.go:
    • TestRunnableAirCommandsGetSkillHint walks the real air tree, so a new subcommand is covered automatically.
    • TestBareAirAndHelpShowFooterWithoutPreRun runs bare air and air --help, and asserts the footer content and that the pre-run hook did not run.
  • cmd/air/air_test.go: TestHelpFooterOnlyOnAirCommand also asserts the skill line, the benefit line and the --path preview.

Existing tests changed on purpose (they pinned the old policy):

  • hint_test.go: the regularCmd() stub (a parentless current-user) is replaced by commandAt("air list"), since non-air commands no longer hint. TestMaybeHint_SkillsInstalledSilent, _LegacySkillsInstalledSilent and _NonDatabricksSkillStillHints are folded into the detection table. Their premise, that any databricks* skill silences the hint, is the bug. _AIToolsCommandSilent is now a row in the non-air table. TestClaudeToolingInstalled_LogsPluginVersion became TestAIRSkillAvailable_LogsPluginDetection. claudeToolingInstalled and isAIToolsCommand had no other callers and were removed.
  • acceptance/cmd/aitools/claude-config-dir: used $CLI version to exercise CLAUDE_CONFIG_DIR plugin detection. version no longer hints, so it uses $CLI air list against the mock server. The four expected outcomes are unchanged.
  • acceptance/cmd/aitools/telemetry/hint: the authenticated case is air list (event air_list / INSTALL_TEXT). jobs list and version now show no hint and no event. A new case runs aitools install --path, shows it writes no ~/.databricks/aitools state, and shows the next air command is still hinted.
  • acceptance/cmd/aitools/telemetry/apps-init-tip: apps init no longer prints the generic line or logs its INSTALL_TEXT event. Its own APPS_INIT_TIP is unchanged.
  • acceptance/cmd/version: version --check from Claude Code printed the generic hint. Now it prints nothing. MaybeVersionCheckTip still skips Claude Code, so Claude gets no tip there; tell us if you'd rather it get the tip like other agents.
  • acceptance/air/help: golden updated for the footer.

Results: go test ./libs/aitools/... ./cmd/air/... ./cmd/root/... ./cmd/version/... ./libs/telemetry/... passes. Acceptance TestAccept/cmd/aitools, TestAccept/cmd/version, TestAccept/air, TestAccept/cmd/apps and TestAccept/apps pass. golangci-lint on the touched packages reports 0 issues, and gofmt, validate_nextchanges.py and validate_whitespace.py are clean.

Manual end-to-end check: a local build in a fresh temp HOME, no workspace calls, run under the Claude Code Bash tool (non-TTY):

Command (CLAUDECODE=1, no session id) main stderr This change
auth profiles generic hint + config error config error only
version generic hint nothing
air list generic hint + auth error air skill hint + auth error
air --help / bare air footer without benefit/preview footer with benefit + --path preview
aitools install --path $HOME/preview --skills databricks-ai-runtime writes SKILL.md, no state same; next air list still hinted
air list with only databricks-jobs installed silent (bug) air skill hint
air list with databricks-ai-runtime in <cwd>/.databricks/aitools/skills generic hint (bug) silent
air list with the plugin installed for another project silent (bug) air skill hint
air list, then air get 1, same session id hint once hint once
air list / auth profiles without CLAUDECODE silent silent

This pull request and its description were written by Isaac.

The Claude Code install hint fired on every non-aitools command with a
generic line ("Databricks skills are not installed..."). Coding agents
treat it as unrelated noise on commands like `auth profiles`, and it
never named the skill that helps with the task at hand.

MaybeHint now fires only on runnable `databricks air` subcommands and
names the databricks-ai-runtime skill, what it covers, the install
command, and a no-install preview (`aitools install --path`). Detection
looks for that skill by exact name in the home stores and the project
store (cwd up to the repository root), and counts the databricks plugin
only when it applies to cwd. Bare `air` and `air --help` render help
without the pre-run hook, so the air help footer now carries the same
benefit line and the preview command. Telemetry keeps INSTALL_TEXT and
the per-session throttle is unchanged.

Co-authored-by: Isaac <no-reply@databricks.com>
@github-actions github-actions Bot added the AIR Databricks AI Runtime CLI label Nov 13, 2026
@github-actions

github-actions Bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Contributor

Commit: f38ee96c0 | Workflow run

Regression test report

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

5 tests: regression=5 unreleased=0 coverage=0 failing=0
test branch main (c4559ed) latest (v1.26.0)
TestAccept/air/help ✅ ❌ ❌
TestAccept/cmd/aitools/claude-config-dir ✅ ❌ ❌
TestAccept/cmd/aitools/telemetry/apps-init-tip ✅ ❌ ❌
TestAccept/cmd/aitools/telemetry/hint ✅ ❌ ❌
TestAccept/cmd/version ✅ ❌ ❌
TestAccept/air/help: branch ✅ | main (c4559ed) ❌ | latest (v1.26.0) ❌

main (c4559ed):

acceptance_test.go:1374: Diff:
        --- air/help/output.txt
        +++ /tmp/TestAcceptairhelp1359300322/002/output.txt
        @@ -43,10 +43,6 @@
           Quickstart (AWS)         https://docs.databricks.com/aws/en/machine-learning/ai-runtime/quickstart
           Quickstart (Azure)       https://learn.microsoft.com/azure/databricks/machine-learning/ai-runtime/quickstart
           Coding agent skill       databricks aitools install --skills-only --skills databricks-ai-runtime
        -                           Teaches coding agents the workload YAML, GPU types, secrets,
        -                           and how to follow and debug runs.
        -  Preview the skill        databricks aitools install --path <dir> --skills databricks-ai-runtime
        -                           Writes the skill files to <dir> without installing anything.
         
         === list help

latest (v1.26.0):

acceptance_test.go:1374: Diff:
        --- air/help/output.txt
        +++ /tmp/TestAcceptairhelp670906697/002/output.txt
        @@ -2,31 +2,23 @@
         === help
         
         >>> [CLI] air --help
        -Run GPU workloads on Databricks serverless compute.
        +Run and manage AI Runtime training workloads on Databricks serverless GPU compute.
         
        -Describe a workload in a YAML file and submit it with "databricks air run".
        -Follow a run with "databricks air logs" and "databricks air get", or see your
        -active runs with "databricks air list".
        +These commands are under active development.
         
         Usage:
           databricks air [command]
         
        -Run workloads:
        -  run             Submit a workload from a YAML config
        -
        -Manage runs:
        +Available Commands:
           cancel          Cancel one or more runs
        -  get             Show a run's status, configuration, and timing
        -  list            List your active runs
        -  logs            Stream or fetch a run's logs
        +  convert-to-dabs Convert an AIR run YAML into a Databricks Asset Bundle
        +  get             Show status, configuration, and timing details for a specified run
        +  images          Manage container images for AI Runtime
        +  list            List active runs for the current user
        +  logs            Stream or fetch logs for a run
        +  pools           View provisioned GPU pools
        +  run             Submit a training workload from a YAML config
         
        -Package and deploy:
        -  convert-to-dabs Convert a workload YAML into a Databricks Asset Bundle
        -  images          Push container images for custom environments
        -
        -Provisioned capacity:
        -  pools           View provisioned GPU pools, if any (not required to run)
        -
         Flags:
           -h, --help   help for air
         
        @@ -38,16 +23,6 @@
         
         Use "databricks air [command] --help" for more information about a command.
         
        -Learn more:
        -  YAML fields and example  databricks air run -h config
        -  Quickstart (AWS)         https://docs.databricks.com/aws/en/machine-learning/ai-runtime/quickstart
        -  Quickstart (Azure)       https://learn.microsoft.com/azure/databricks/machine-learning/ai-runtime/quickstart
        -  Coding agent skill       databricks aitools install --skills-only --skills databricks-ai-runtime
        -                           Teaches coding agents the workload YAML, GPU types, secrets,
        -                           and how to follow and debug runs.
        -  Preview the skill        databricks aitools install --path <dir> --skills databricks-ai-runtime
        -                           Writes the skill files to <dir> without installing anything.
        -
         === list help
         
         >>> [CLI] air list --help
        @@ -56,9 +31,7 @@
         Filters:
           Use --filter KEY=VALUE per condition. A run must match every condition.
         
        -  accelerator_type  Accelerator family or full YAML type. Examples:
        -                    A10, H100, GPU_1xA10, GPU_8xH100.
        -                    Workspace types: databricks air run -h config.compute.accelerator_type
        +  accelerator_type  Accelerator type, such as A10 or H100.
           experiment        Case-insensitive glob matched against the experiment name.
           num_accelerators  Total GPU count.
           user              Run creator identifier.
        @@ -69,8 +42,6 @@
         Examples:
           databricks air list --filter accelerator_type=H100
         
        -  databricks air list --filter accelerator_type=GPU_8xH100
        -
           databricks air list --all-status \
             --filter 'experiment=qwen*' \
             --filter num_accelerators=8 \
        @@ -92,9 +63,9 @@
         === get help
         
         >>> [CLI] air get --help
        -Show a run's status, configuration, and timing.
        +Show status, configuration, and timing details for a specified run.
         
        -JOB_RUN_ID is the job run ID returned by "databricks air run".
        +JOB_RUN_ID is the job run ID returned by "air run".
         
         Usage:
           databricks air get JOB_RUN_ID [flags]
        @@ -111,18 +81,14 @@
         === pools help
         
         >>> [CLI] air pools --help
        -View GPU pools provisioned for your workspace.
        +View provisioned GPU pools
         
        -A GPU pool is dedicated accelerator capacity that your Databricks account team
        -provisions. Pools are optional: a run uses one only when its YAML sets
        -compute.pool_id.
        -
         Usage:
           databricks air pools [flags]
           databricks air pools [command]
         
         Available Commands:
        -  get         Show a GPU pool and its accelerator usage
        +  get         Show a GPU pool, including its accelerator usage (POOL_ID may be omitted when the workspace has exactly one pool)
           list        List the GPU pools available to the current workspace
         
         Flags:
        @@ -139,7 +99,7 @@
         === images help
         
         >>> [CLI] air images --help
        -Push container images for custom environments
        +Manage container images for AI Runtime
         
         Usage:
           databricks air images [flags]
        @@ -163,7 +123,7 @@
         
         >>> [CLI] air images push --help
         This CLI command is in Preview. For current feature status and requirements, see:
        -  AWS: https://docs.databricks.com/aws/en/machine-learning/ai-runtime/connecting/cli/docker-images
        +  AWS: https://docs.databricks.com/aws/en/machine-learning/ai-runtime/cli/docker-images
           Azure: https://learn.microsoft.com/azure/databricks/machine-learning/ai-runtime/connecting/cli/docker-images
         
         Push a container image to Databricks Artifact Registry under the specified Unity Catalog catalog and schema.
        @@ -199,7 +159,7 @@
         Stream logs from an active run until it completes, or fetch logs from a
         completed run.
         
        -JOB_RUN_ID is the job run ID returned by "databricks air run".
        +JOB_RUN_ID is the job run ID returned by "air run".
         
         Usage:
           databricks air logs JOB_RUN_ID [flags]
TestAccept/cmd/aitools/claude-config-dir: branch ✅ | main (c4559ed) ❌ | latest (v1.26.0) ❌

main (c4559ed):

acceptance_test.go:1374: Diff:
        --- cmd/aitools/claude-config-dir/output.txt
        +++ /tmp/TestAcceptcmdaitoolsclaude-config-dir1651275885/002/output.txt
        @@ -7,7 +7,7 @@
         === Custom directory takes precedence over the default installation
         
         >>> CLAUDE_CONFIG_DIR=missing [CLI] air list
        -Tip: the databricks-ai-runtime skill is not installed. It documents the air workload YAML, GPU types, secrets, and how to follow and debug runs. Install it: databricks aitools install --skills-only --skills databricks-ai-runtime (to read it first without installing: databricks aitools install --path <dir> --skills databricks-ai-runtime)
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         No active runs found. Use --all-status to include runs that are no longer active.
         
         === Empty override uses the default installation

latest (v1.26.0): same output as main (c4559ed)

TestAccept/cmd/aitools/telemetry/apps-init-tip: branch ✅ | main (c4559ed) ❌ | latest (v1.26.0) ❌

main (c4559ed):

acceptance_test.go:1242: Substituted DATABRICKS_CLI_GITHUB_API_URL "$DATABRICKS_HOST" -> "http://127.0.0.1:33809" ("[DATABRICKS_HOST]")
    acceptance_test.go:1242: Substituted DATABRICKS_SKILLS_BASE_URL "$DATABRICKS_HOST" -> "http://127.0.0.1:33809" ("[DATABRICKS_HOST]")
    acceptance_test.go:1374: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1374
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1115
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n=== apps init with flags prints the tip: one hint-shown event per hint printed\n\n>>> [CLI] apps init --template ./template --skip-install --name app-tip\n✔ Creating project\n\n✔ Project created successfully!\n\n  Location: [TEST_TMP_DIR]/app-tip\n  Files: 3\n\nTip: coding agents detected without Databricks skills. Run 'databricks aitools install' to install them.\n\n>>> print_telemetry\n{\"command\":\"apps_init\",\"exit_code\":0,\"aitools_hint_event\":{\"hint_kind\":\"APPS_INIT_TIP\"}}\n\n=== plugin installed: no hint, no tip, no event\n\n>>> [CLI] apps init --template ./template --skip-install --name app-plugin\n✔ Creating project\n\n✔ Project created successfully!\n\n  Location: [TEST_TMP_DIR]/app-plugin\n  Files: 3\n\n\n>>> print_telemetry\n"
        	            	actual  : "\n=== apps init with flags prints the tip: one hint-shown event per hint printed\n\n>>> [CLI] apps init --template ./template --skip-install --name app-tip\nDatabricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install\n✔ Creating project\n\n✔ Project created successfully!\n\n  Location: [TEST_TMP_DIR]/app-tip\n  Files: 3\n\nTip: coding agents detected without Databricks skills. Run 'databricks aitools install' to install them.\n\n>>> print_telemetry\n{\"command\":\"apps_init\",\"exit_code\":0,\"aitools_hint_event\":{\"hint_kind\":\"INSTALL_TEXT\"}}\n{\"command\":\"apps_init\",\"exit_code\":0,\"aitools_hint_event\":{\"hint_kind\":\"APPS_INIT_TIP\"}}\n\n=== plugin installed: no hint, no tip, no event\n\n>>> [CLI] apps init --template ./template --skip-install --name app-plugin\n✔ Creating project\n\n✔ Project created successfully!\n\n  Location: [TEST_TMP_DIR]/app-plugin\n  Files: 3\n\n\n>>> print_telemetry\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -4,2 +4,3 @@
        	            	 >>> [CLI] apps init --template ./template --skip-install --name app-tip
        	            	+Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
        	            	 ✔ Creating project
        	            	@@ -14,2 +15,3 @@
        	            	 >>> print_telemetry
        	            	+{"command":"apps_init","exit_code":0,"aitools_hint_event":{"hint_kind":"INSTALL_TEXT"}}
        	            	 {"command":"apps_init","exit_code":0,"aitools_hint_event":{"hint_kind":"APPS_INIT_TIP"}}
        	Test:       	TestAccept/cmd/aitools/telemetry/apps-init-tip
        	Messages:   	cmd/aitools/telemetry/apps-init-tip/output.txt vs /tmp/TestAcceptcmdaitoolstelemetryapps-init-tip846238697/002/output.txt
    acceptance_test.go:1152: LOG.apps-init: 
    acceptance_test.go:1152: LOG.apps-init-plugin: 
FAIL

latest (v1.26.0):

acceptance_test.go:1242: Substituted DATABRICKS_CLI_GITHUB_API_URL "$DATABRICKS_HOST" -> "http://127.0.0.1:44879" ("[DATABRICKS_HOST]")
    acceptance_test.go:1242: Substituted DATABRICKS_SKILLS_BASE_URL "$DATABRICKS_HOST" -> "http://127.0.0.1:44879" ("[DATABRICKS_HOST]")
    acceptance_test.go:1374: 
        	Error Trace:	/home/runner/work/cli/cli/libs/testdiff/testdiff.go:22
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1374
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:1115
        	            				/home/runner/work/cli/cli/acceptance/acceptance_test.go:660
        	Error:      	Not equal: 
        	            	expected: "\n=== apps init with flags prints the tip: one hint-shown event per hint printed\n\n>>> [CLI] apps init --template ./template --skip-install --name app-tip\n✔ Creating project\n\n✔ Project created successfully!\n\n  Location: [TEST_TMP_DIR]/app-tip\n  Files: 3\n\nTip: coding agents detected without Databricks skills. Run 'databricks aitools install' to install them.\n\n>>> print_telemetry\n{\"command\":\"apps_init\",\"exit_code\":0,\"aitools_hint_event\":{\"hint_kind\":\"APPS_INIT_TIP\"}}\n\n=== plugin installed: no hint, no tip, no event\n\n>>> [CLI] apps init --template ./template --skip-install --name app-plugin\n✔ Creating project\n\n✔ Project created successfully!\n\n  Location: [TEST_TMP_DIR]/app-plugin\n  Files: 3\n\n\n>>> print_telemetry\n"
        	            	actual  : "\n=== apps init with flags prints the tip: one hint-shown event per hint printed\n\n>>> [CLI] apps init --template ./template --skip-install --name app-tip\nDatabricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install\n✔ Creating project\n\n✔ Project created successfully!\n\n  Location: [TEST_TMP_DIR]/app-tip\n  Files: 3\n\nTip: coding agents detected without Databricks skills. Run 'databricks aitools install' to install them.\n\n>>> print_telemetry\n\n=== plugin installed: no hint, no tip, no event\n\n>>> [CLI] apps init --template ./template --skip-install --name app-plugin\n✔ Creating project\n\n✔ Project created successfully!\n\n  Location: [TEST_TMP_DIR]/app-plugin\n  Files: 3\n\nTip: coding agents detected without Databricks skills. Run 'databricks aitools install' to install them.\n\n>>> print_telemetry\n"
        	            	
        	            	Diff:
        	            	--- Expected
        	            	+++ Actual
        	            	@@ -4,2 +4,3 @@
        	            	 >>> [CLI] apps init --template ./template --skip-install --name app-tip
        	            	+Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
        	            	 ✔ Creating project
        	            	@@ -14,3 +15,2 @@
        	            	 >>> print_telemetry
        	            	-{"command":"apps_init","exit_code":0,"aitools_hint_event":{"hint_kind":"APPS_INIT_TIP"}}
        	            	 
        	            	@@ -26,2 +26,3 @@
        	            	 
        	            	+Tip: coding agents detected without Databricks skills. Run 'databricks aitools install' to install them.
        	            	 
        	Test:       	TestAccept/cmd/aitools/telemetry/apps-init-tip
        	Messages:   	cmd/aitools/telemetry/apps-init-tip/output.txt vs /tmp/TestAcceptcmdaitoolstelemetryapps-init-tip1175964579/002/output.txt
    acceptance_test.go:1152: LOG.apps-init: 
    acceptance_test.go:1152: LOG.apps-init-plugin:
TestAccept/cmd/aitools/telemetry/hint: branch ✅ | main (c4559ed) ❌ | latest (v1.26.0) ❌

main (c4559ed):

acceptance_test.go:1242: Substituted DATABRICKS_CLI_GITHUB_API_URL "$DATABRICKS_HOST" -> "http://127.0.0.1:32971" ("[DATABRICKS_HOST]")
    acceptance_test.go:1242: Substituted DATABRICKS_SKILLS_BASE_URL "$DATABRICKS_HOST" -> "http://127.0.0.1:32971" ("[DATABRICKS_HOST]")
    acceptance_test.go:1374: Diff:
        --- cmd/aitools/telemetry/hint/output.txt
        +++ /tmp/TestAcceptcmdaitoolstelemetryhint619346260/002/output.txt
        @@ -2,7 +2,7 @@
         === hint printed on an air command: one hint-shown event is uploaded
         
         >>> [CLI] air list
        -Tip: the databricks-ai-runtime skill is not installed. It documents the air workload YAML, GPU types, secrets, and how to follow and debug runs. Install it: databricks aitools install --skills-only --skills databricks-ai-runtime (to read it first without installing: databricks aitools install --path <dir> --skills databricks-ai-runtime)
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         No active runs found. Use --all-status to include runs that are no longer active.
         
         >>> print_telemetry
        @@ -11,10 +11,13 @@
         === commands outside air print no hint and log no event
         
         >>> [CLI] jobs list
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         
         >>> print_telemetry
        +{"command":"jobs_list","exit_code":0,"aitools_hint_event":{"hint_kind":"INSTALL_TEXT"}}
         
         >>> [CLI] version
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         Databricks CLI v[CLI_VERSION]
         
         === previewing a skill with --path installs nothing, so air still hints
        @@ -32,7 +31,7 @@
         no aitools state in HOME
         
         >>> [CLI] air list
        -Tip: the databricks-ai-runtime skill is not installed. It documents the air workload YAML, GPU types, secrets, and how to follow and debug runs. Install it: databricks aitools install --skills-only --skills databricks-ai-runtime (to read it first without installing: databricks aitools install --path <dir> --skills databricks-ai-runtime)
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         No active runs found. Use --all-status to include runs that are no longer active.
         
         >>> print_telemetry

latest (v1.26.0):

acceptance_test.go:1242: Substituted DATABRICKS_CLI_GITHUB_API_URL "$DATABRICKS_HOST" -> "http://127.0.0.1:33907" ("[DATABRICKS_HOST]")
    acceptance_test.go:1242: Substituted DATABRICKS_SKILLS_BASE_URL "$DATABRICKS_HOST" -> "http://127.0.0.1:33907" ("[DATABRICKS_HOST]")
    acceptance_test.go:1374: Diff:
        --- cmd/aitools/telemetry/hint/output.txt
        +++ /tmp/TestAcceptcmdaitoolstelemetryhint3988219012/002/output.txt
        @@ -2,19 +2,20 @@
         === hint printed on an air command: one hint-shown event is uploaded
         
         >>> [CLI] air list
        -Tip: the databricks-ai-runtime skill is not installed. It documents the air workload YAML, GPU types, secrets, and how to follow and debug runs. Install it: databricks aitools install --skills-only --skills databricks-ai-runtime (to read it first without installing: databricks aitools install --path <dir> --skills databricks-ai-runtime)
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         No active runs found. Use --all-status to include runs that are no longer active.
         
         >>> print_telemetry
        -{"command":"air_list","exit_code":0,"aitools_hint_event":{"hint_kind":"INSTALL_TEXT"}}
         
         === commands outside air print no hint and log no event
         
         >>> [CLI] jobs list
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         
         >>> print_telemetry
         
         >>> [CLI] version
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         Databricks CLI v[CLI_VERSION]
         
         === previewing a skill with --path installs nothing, so air still hints
        @@ -24,19 +14,14 @@
         Wrote 1 skill to ./preview
         
         >>> print_telemetry
        -{"command":"aitools_install","exit_code":0,"aitools_command_event":{"command":"INSTALL","stage":"STARTED","interactive":false,"install_mode":"PATH"}}
        -{"command":"aitools_install","exit_code":0,"aitools_command_event":{"command":"INSTALL","stage":"STEP_COMPLETED","step":"FLAGS_VALIDATED","interactive":false,"install_mode":"PATH"}}
        -{"command":"aitools_install","exit_code":0,"aitools_command_event":{"command":"INSTALL","stage":"STEP_COMPLETED","step":"SKILLS_DUMPED","interactive":false,"install_mode":"PATH"}}
        -{"command":"aitools_install","exit_code":0,"aitools_command_event":{"command":"INSTALL","stage":"FINISHED","outcome":"SUCCESS","interactive":false,"install_mode":"PATH"}}
         preview/databricks-test/SKILL.md
         no aitools state in HOME
         
         >>> [CLI] air list
        -Tip: the databricks-ai-runtime skill is not installed. It documents the air workload YAML, GPU types, secrets, and how to follow and debug runs. Install it: databricks aitools install --skills-only --skills databricks-ai-runtime (to read it first without installing: databricks aitools install --path <dir> --skills databricks-ai-runtime)
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         No active runs found. Use --all-status to include runs that are no longer active.
         
         >>> print_telemetry
        -{"command":"air_list","exit_code":0,"aitools_hint_event":{"hint_kind":"INSTALL_TEXT"}}
         
         === plugin installed: no hint, no event
TestAccept/cmd/version: branch ✅ | main (c4559ed) ❌ | latest (v1.26.0) ❌

main (c4559ed):

acceptance_test.go:1374: Diff:
        --- cmd/version/output.txt
        +++ /tmp/TestAcceptcmdversion4258538838/002/output.txt
        @@ -38,5 +38,6 @@
         === version --check from Claude Code prints no hint
         
         >>> [CLI] version --check
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         Databricks CLI v[CLI_VERSION]
         This is a development build; skipping the update check.

latest (v1.26.0):

acceptance_test.go:1374: Diff:
        --- cmd/version/output.txt
        +++ /tmp/TestAcceptcmdversion3697278367/002/output.txt
        @@ -8,7 +8,7 @@
         
         >>> [CLI] version --check
         Databricks CLI v[CLI_VERSION]
        -This is a development build; skipping the update check.
        +Could not reach GitHub to check for a newer version. See https://github.com/databricks/cli/releases for the latest release.
         
         === version --check --output json
         
        @@ -16,15 +16,14 @@
         {
           "current_version": "[CLI_VERSION]",
           "update_available": false,
        -  "development_build": true
        +  "check_failed": true
         }
         
         === version --check with a coding agent and no Databricks tooling
         
         >>> [CLI] version --check
         Databricks CLI v[CLI_VERSION]
        -This is a development build; skipping the update check.
        -Tip: coding agents detected without Databricks skills. Run 'databricks aitools install' to install them.
        +Could not reach GitHub to check for a newer version. See https://github.com/databricks/cli/releases for the latest release.
         
         === version --check --output json with a coding agent prints no tip
         
        @@ -32,11 +25,12 @@
         {
           "current_version": "[CLI_VERSION]",
           "update_available": false,
        -  "development_build": true
        +  "check_failed": true
         }
         
         === version --check from Claude Code prints no hint
         
         >>> [CLI] version --check
        +Databricks skills are not installed. To work with Databricks reliably, first run: databricks aitools install
         Databricks CLI v[CLI_VERSION]
        -This is a development build; skipping the update check.
        +Could not reach GitHub to check for a newer version. See https://github.com/databricks/cli/releases for the latest release.
        
FAIL

@eng-dev-ecosystem-bot

eng-dev-ecosystem-bot commented Nov 13, 2026 •

Copy link
Copy Markdown
Collaborator

✅ Integration test report

Commit: f38ee96

Run: 43532347309

Env 🔄​flaky 💚​RECOVERED ✅​pass 🙈​skip Time
💚​ aws linux-2core-8gb 1 270 20 4:58
💚​ aws-windows-latest-4core-16gb 1 272 18 4:09
💚​ azure linux-2core-8gb 1 269 20 4:24
🔄​ azure-windows-latest-4core-16gb 1 1 270 18 4:10
💚​ gcp linux-2core-8gb 1 270 20 4:57
💚​ gcp-windows-latest-4core-16gb 1 272 18 3:30
Test Name aws linux-2core-8gb aws-windows-latest-4core-16gb azure linux-2core-8gb azure-windows-latest-4core-16gb gcp linux-2core-8gb gcp-windows-latest-4core-16gb
💚​ TestAccept 💚​R 💚​R 💚​R 💚​R 💚​R 💚​R
🔄​ TestSyncIncrementalFileOverwritesFolder ✅​p ✅​p ✅​p 🔄​f ✅​p ✅​p
Top 3 slowest tests (at least 2 minutes):
duration env testname
3:41 aws-windows-latest-4core-16gb TestAccept
3:35 azure-windows-latest-4core-16gb TestAccept
3:27 gcp-windows-latest-4core-16gb TestAccept

artemy-kolesnikov and others added 2 commits November 13, 2026 23:48
Co-authored-by: Isaac <no-reply@databricks.com>
Windows paths contain backslashes, so interpolating them into the manifest
string produced invalid JSON escapes and the plugin record was silently
dropped, hinting when the test expected silence. Marshal the manifest
instead.

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

AIR Databricks AI Runtime CLI

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants