Skip to content

fix(shared): treat literal app.yaml env values as wired in doctor - #710

Open
fjakobs wants to merge 1 commit into
mainfrom
fjakobs/la-2050-doctor-literal-env-value
Open

fjakobs wants to merge 1 commit into
mainfrom
fjakobs/la-2050-doctor-literal-env-value

Conversation

@fjakobs

@fjakobs fjakobs commented Nov 6, 2026

Copy link
Copy Markdown
Collaborator

Problem

appkit doctor reports an app.yaml env entry with a literal value: as unwired. For example, this entry is valid and sets the variable on deploy:

env:
  - name: DATABRICKS_GENIE_SPACE_ID
    value: <space-id>

Doctor still fails the run on it:

  ✗  DATABRICKS_GENIE_SPACE_ID
     has no app.yaml entry — it won't be set in the environment of the deployed app

     Hint: Add to app.yaml: { name: DATABRICKS_GENIE_SPACE_ID, valueFrom: <binding> }, and declare that binding in databricks.yml.

1 error, 2 ok      (exit code 1)

When the var is also missing from the local .env, the config check adds the hint "wire it through app.yaml + databricks.yml for deploy", even though app.yaml already wires it.

Root cause

readBundleInfo (doctor/bundle.ts) only recorded app.yaml env entries that have valueFrom, in envToBinding. Two checks treated "is in envToBinding" as "app.yaml sets this var":

  • ENV_UNWIRED in checks-wiring.ts, which caused the false error.
  • wiredEnvVars for the config layer in run.ts, which caused the misleading hint.

Fix

  • BundleInfo gets wiredEnvVars, the app.yaml env names the platform sets on deploy: those with valueFrom or a non-null literal value.
    • value: "" counts as wired, because it does set the var.
    • A bare value: (YAML null) doesn't count.
  • ENV_UNWIRED and the config-layer hint both use wiredEnvVars.
  • envToBinding is unchanged: it's still the valueFrom → binding join used by VALUEFROM_UNBOUND and provenance.
  • A literal-valued resource stays external, so the live existence probe still checks the literal ID.
  • The doctor README's ENV_UNWIRED description now covers literal values.

Tests

  • checks-wiring.test.ts: a required plugin env var that app.yaml sets with a literal value produces no findings.
  • bundle.test.ts: valueFrom and literal entries (including value: "") are wired, a null value isn't, and literals stay out of envToBinding.

Verification

I built a minimal app (Genie plugin) whose app.yaml sets the space ID with a literal value: pointing at an existing Genie space, then ran the built appkit doctor --profile <profile> against a Databricks workspace:

Case Before After
Literal value: entry ✗ … has no app.yaml entry, exit 1 ✓ Auth, ✓ Genie Space, 2 ok, exit 0
Same, without a local .env config error plus "wire it through app.yaml…" hint, plus ENV_UNWIRED config error only, no hint, no ENV_UNWIRED
Control: app.yaml entry renamed — ENV_UNWIRED still reported, exit 1

These pass: pnpm build, pnpm docs:build, pnpm check:fix, pnpm -r typecheck and pnpm test (309 files, 5929 tests).

This pull request and its description were written by Isaac.

`appkit doctor` only recorded app.yaml env entries with `valueFrom`, so a
literal `{ name: X, value: ... }` entry was reported as ENV_UNWIRED (an
error that fails the run) and the config layer told users to wire a var
that was already wired.

Track every app.yaml env name the platform sets on deploy (`valueFrom` or
a non-null literal `value`) as `wiredEnvVars`, and use it for both checks.
`envToBinding` stays the valueFrom-to-binding join.

Co-authored-by: Isaac <no-reply@databricks.com>
Signed-off-by: Fabian Jakobs <fabian.jakobs@databricks.com>
@fjakobs
fjakobs requested a review from a team as a code owner November 6, 2026 15:17
@fjakobs
fjakobs requested a review from atilafassina November 6, 2026 15:17
@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

📦 Bundle size report

Compared against bundle-size-baseline.json (main).

@databricks/appkit

npm tarball (packed): 1.2 MB (+2 B) — gzipped download (dist + bin; excludes release-only docs/NOTICE).

dist raw gzip
JS (runtime) 1.3 MB 459 KB
Type declarations 465 KB 169 KB (-1 B)
Source maps 2.5 MB 859 KB
Other 11 KB 3.7 KB
Total 4.2 MB 1.5 MB (-1 B)
Per-entry composition (own code — deps external (as shipped))
Entry Initial (gz) Lazy (gz) Total (gz) node_modules (min) Own code (min)
. 106 KB 2.5 KB 109 KB external 344 KB
./beta 103 KB 482 B 104 KB external 310 KB
./testing 45 KB 32 KB 77 KB external 223 KB
./tsdown 520 B 0 B 520 B external 813 B
./type-generator 26 KB 0 B 26 KB external 74 KB

Chunks:

Entry Chunk Load Size (gz)
. index.js initial 102 KB
. utils.js initial 4.6 KB
. remote-tunnel-manager.js lazy 2.5 KB
./beta beta.js initial 83 KB
./beta modular.js initial 6.0 KB
./beta stream-manager.js initial 5.9 KB
./beta service-context.js initial 4.2 KB
./beta databricks.js initial 3.3 KB
./beta client.js initial 647 B
./beta index.js initial 20 B
./beta supervisor-api.js lazy 192 B
./beta databricks.js lazy 176 B
./beta index.js lazy 114 B
./testing manifest.js initial 32 KB
./testing index.js initial 10 KB
./testing wide-event-emitter.js initial 2.9 KB
./testing index.js lazy 28 KB
./testing remote-tunnel-manager.js lazy 2.5 KB
./testing utils.js lazy 1.8 KB
./tsdown index.js initial 520 B
./type-generator index.js initial 26 KB

@databricks/appkit-ui

npm tarball (packed): 397 KB (-4 B) — gzipped download (dist + bin; excludes release-only docs/NOTICE).

dist raw gzip
JS (runtime) 429 KB 147 KB
Type declarations 267 KB 98 KB (-1 B)
Source maps 853 KB 286 KB
CSS 16 KB 3.2 KB
Total 1.5 MB 534 KB (-1 B)
Per-entry composition (consumer bundle — deps bundled, peerDeps external)
Entry Initial (gz) Lazy (gz) Total (gz) node_modules (min) Own code (min)
./js 5.3 KB 49 KB 55 KB 208 KB 14 KB
./js/beta 2.1 KB 0 B 2.1 KB 0 B 5.0 KB
./react 433 KB 49 KB 481 KB 1.3 MB 177 KB
./react/beta 4.9 KB 0 B 4.9 KB 0 B 12 KB

Chunks:

Entry Chunk Load Size (gz)
./js index.js initial 5.2 KB
./js chunk initial 120 B
./js apache-arrow lazy 49 KB
./js/beta beta.js initial 2.1 KB
./react index.js initial 431 KB
./react tslib initial 2.1 KB
./react apache-arrow lazy 49 KB
./react/beta beta.js initial 4.9 KB

@github-actions

github-actions Bot commented Nov 6, 2026

Copy link
Copy Markdown
Contributor

🤖 AppKit PR bot

🔬 Run evals

Start an eval for this PR from the evals-monitor app: Go to Evals Monitor →

📦 Try this PR's app template

Scaffolds a new app from this PR's SDK build. Run it in any folder (requires the GitHub CLI — gh auth login — and the Databricks CLI):

gh run download 42241719596 -R databricks/appkit -n appkit-template-0.90.0-pr.dfdee7a-fjakobs-la-2050-doctor-literal-env-value-710 -D appkit-pr-710 \
  && unzip -o "appkit-pr-710/appkit-template-0.90.0-pr.dfdee7a-fjakobs-la-2050-doctor-literal-env-value-710.zip" -d "appkit-pr-710" \
  && databricks apps init --template "appkit-pr-710"

The template pins @databricks/appkit and @databricks/appkit-ui to tarballs built from this branch, so the scaffolded app runs against this PR's code.

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

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants