@fabricorg/databricks-testkit 0.7.2 → 0.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.cjs CHANGED
@@ -747,7 +747,7 @@ async function runLiveSuite(spec, runtime = {}) {
747
747
  const startedAt = (/* @__PURE__ */ new Date()).toISOString();
748
748
  const ownedWarehouse = runtime.warehouse === void 0;
749
749
  const client = runtime.client ?? createClientFromEnv(env);
750
- const warehouse2 = runtime.warehouse ?? (hasWarehouseConfig(env) ? await createWorkspaceContext({ env, client }) : unavailableWarehouseContext());
750
+ const warehouse3 = runtime.warehouse ?? (hasWarehouseConfig(env) ? await createWorkspaceContext({ env, client }) : unavailableWarehouseContext());
751
751
  const results = [];
752
752
  try {
753
753
  for (const check of spec.checks) {
@@ -762,7 +762,7 @@ async function runLiveSuite(spec, runtime = {}) {
762
762
  }
763
763
  const before = performance.now();
764
764
  try {
765
- const details = await check.run({ env, warehouse: warehouse2, client });
765
+ const details = await check.run({ env, warehouse: warehouse3, client });
766
766
  results.push({
767
767
  id: check.id,
768
768
  description: check.description,
@@ -781,7 +781,7 @@ async function runLiveSuite(spec, runtime = {}) {
781
781
  }
782
782
  }
783
783
  } finally {
784
- if (ownedWarehouse) await warehouse2.close();
784
+ if (ownedWarehouse) await warehouse3.close();
785
785
  }
786
786
  const success = required3.every(
787
787
  (id) => results.find((result) => result.id === id)?.status === "pass"
@@ -896,8 +896,8 @@ function sqlRoundTripCheck() {
896
896
  id: "sql",
897
897
  description: "SQL Statement Execution round-trip",
898
898
  configured: (env) => Boolean(env.DATABRICKS_WAREHOUSE_ID || env.DATABRICKS_HTTP_PATH),
899
- async run({ warehouse: warehouse2 }) {
900
- const rows = await warehouse2.query("SELECT 1 AS dbx_test_ok");
899
+ async run({ warehouse: warehouse3 }) {
900
+ const rows = await warehouse3.query("SELECT 1 AS dbx_test_ok");
901
901
  if (Number(rows[0]?.dbx_test_ok) !== 1)
902
902
  throw new Error("SQL round-trip returned an unexpected value");
903
903
  return { rows: rows.length };
@@ -941,9 +941,9 @@ function deltaContractCheck(tableEnv = "DBX_TEST_DELTA_TABLE", columns = []) {
941
941
  id: "delta-contract",
942
942
  description: "Delta table schema contract",
943
943
  configured: (env) => Boolean(env[tableEnv]),
944
- async run({ env, warehouse: warehouse2 }) {
944
+ async run({ env, warehouse: warehouse3 }) {
945
945
  const table = env[tableEnv];
946
- const rows = await warehouse2.query(`DESCRIBE TABLE ${table}`);
946
+ const rows = await warehouse3.query(`DESCRIBE TABLE ${table}`);
947
947
  assertDeltaContract(table, rows, columns);
948
948
  return { table, columns: rows.length };
949
949
  }
@@ -954,10 +954,10 @@ function unityCatalogAccessCheck() {
954
954
  id: "uc-grants",
955
955
  description: "Unity Catalog allow/deny access assertions",
956
956
  configured: (env) => Boolean(env.DBX_TEST_UC_ALLOWED_TABLE && env.DBX_TEST_UC_DENIED_TABLE),
957
- async run({ env, warehouse: warehouse2 }) {
958
- await warehouse2.query(`SELECT * FROM ${env.DBX_TEST_UC_ALLOWED_TABLE} LIMIT 1`);
957
+ async run({ env, warehouse: warehouse3 }) {
958
+ await warehouse3.query(`SELECT * FROM ${env.DBX_TEST_UC_ALLOWED_TABLE} LIMIT 1`);
959
959
  try {
960
- await warehouse2.query(`SELECT * FROM ${env.DBX_TEST_UC_DENIED_TABLE} LIMIT 1`);
960
+ await warehouse3.query(`SELECT * FROM ${env.DBX_TEST_UC_DENIED_TABLE} LIMIT 1`);
961
961
  } catch (error) {
962
962
  if (/permission.?denied|insufficient.?priv|403|unauthoriz/i.test(String(error))) {
963
963
  return { allowed: env.DBX_TEST_UC_ALLOWED_TABLE, denied: env.DBX_TEST_UC_DENIED_TABLE };
@@ -1325,9 +1325,9 @@ function secretScopeCheck() {
1325
1325
  scope
1326
1326
  });
1327
1327
  const actual = new Set((response.secrets ?? []).map((secret) => secret.key).filter(Boolean));
1328
- const missing = expected.filter((key) => !actual.has(key));
1329
- if (missing.length > 0) {
1330
- throw new Error(`Secret scope ${scope} is missing keys: ${missing.join(", ")}`);
1328
+ const missing2 = expected.filter((key) => !actual.has(key));
1329
+ if (missing2.length > 0) {
1330
+ throw new Error(`Secret scope ${scope} is missing keys: ${missing2.join(", ")}`);
1331
1331
  }
1332
1332
  return { scope, expectedKeys: expected.length };
1333
1333
  }
@@ -1348,10 +1348,10 @@ function appHealthCheck(options = {}) {
1348
1348
  const actual = new Set(
1349
1349
  (app.resources ?? []).map((resource) => resource.name).filter(Boolean)
1350
1350
  );
1351
- const missing = expected.filter((resource) => !actual.has(resource));
1352
- if (missing.length > 0) {
1351
+ const missing2 = expected.filter((resource) => !actual.has(resource));
1352
+ if (missing2.length > 0) {
1353
1353
  throw new Error(
1354
- `Databricks App ${name} is missing resource bindings: ${missing.join(", ")}`
1354
+ `Databricks App ${name} is missing resource bindings: ${missing2.join(", ")}`
1355
1355
  );
1356
1356
  }
1357
1357
  const appUrl = env.DBX_TEST_APP_URL ?? app.url ?? app.app_url;
@@ -1422,7 +1422,7 @@ function autoLoaderIngestionCheck(options = {}) {
1422
1422
  configured: (env) => Boolean(
1423
1423
  env.DBX_TEST_AUTOLOADER_PIPELINE_ID && env.DBX_TEST_AUTOLOADER_TABLE && env.DBX_TEST_AUTOLOADER_FIXTURE && env.DBX_TEST_VOLUME
1424
1424
  ),
1425
- async run({ env, client, warehouse: warehouse2 }) {
1425
+ async run({ env, client, warehouse: warehouse3 }) {
1426
1426
  const pipelineId = env.DBX_TEST_AUTOLOADER_PIPELINE_ID;
1427
1427
  if (pipelineId === env.DBX_TEST_PIPELINE_ID) {
1428
1428
  throw new Error("DBX_TEST_AUTOLOADER_PIPELINE_ID must not be the production pipeline");
@@ -1447,7 +1447,7 @@ function autoLoaderIngestionCheck(options = {}) {
1447
1447
  pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 1e4)
1448
1448
  });
1449
1449
  const table = env.DBX_TEST_AUTOLOADER_TABLE;
1450
- const rows = await warehouse2.query(
1450
+ const rows = await warehouse3.query(
1451
1451
  `SELECT COUNT(*) AS n, SUM(CASE WHEN _rescued_data IS NOT NULL THEN 1 ELSE 0 END) AS rescued FROM ${table}`
1452
1452
  );
1453
1453
  const count = Number(rows[0]?.n ?? 0);
@@ -1473,7 +1473,7 @@ function performanceBudgetCheck() {
1473
1473
  id: "performance",
1474
1474
  description: "SQL Statement Execution p95 stays within the configured latency budget",
1475
1475
  configured: (env) => Boolean(env.DBX_TEST_PERFORMANCE_P95_MS),
1476
- async run({ env, warehouse: warehouse2 }) {
1476
+ async run({ env, warehouse: warehouse3 }) {
1477
1477
  const budgetMs = Number(env.DBX_TEST_PERFORMANCE_P95_MS);
1478
1478
  const runs = Number(env.DBX_TEST_PERFORMANCE_RUNS ?? 7);
1479
1479
  if (!Number.isFinite(budgetMs) || budgetMs <= 0) {
@@ -1482,11 +1482,11 @@ function performanceBudgetCheck() {
1482
1482
  if (!Number.isInteger(runs) || runs < 3 || runs > 100) {
1483
1483
  throw new Error("DBX_TEST_PERFORMANCE_RUNS must be an integer from 3 to 100");
1484
1484
  }
1485
- await warehouse2.query("SELECT 1 AS warmup");
1485
+ await warehouse3.query("SELECT 1 AS warmup");
1486
1486
  const durations = [];
1487
1487
  for (let index = 0; index < runs; index += 1) {
1488
1488
  const started = performance.now();
1489
- await warehouse2.query("SELECT 1 AS performance_probe");
1489
+ await warehouse3.query("SELECT 1 AS performance_probe");
1490
1490
  durations.push(performance.now() - started);
1491
1491
  }
1492
1492
  durations.sort((left, right) => left - right);
@@ -1508,15 +1508,15 @@ function failureRecoveryCheck() {
1508
1508
  id: "failure-recovery",
1509
1509
  description: "A failed statement is isolated and a subsequent statement recovers",
1510
1510
  configured: (env) => Boolean(env.DATABRICKS_WAREHOUSE_ID || env.DATABRICKS_HTTP_PATH),
1511
- async run({ warehouse: warehouse2 }) {
1511
+ async run({ warehouse: warehouse3 }) {
1512
1512
  let failedAsExpected = false;
1513
1513
  try {
1514
- await warehouse2.query("SELECT * FROM __fabric_experiments_expected_missing_table__");
1514
+ await warehouse3.query("SELECT * FROM __fabric_experiments_expected_missing_table__");
1515
1515
  } catch {
1516
1516
  failedAsExpected = true;
1517
1517
  }
1518
1518
  if (!failedAsExpected) throw new Error("Injected failure unexpectedly succeeded");
1519
- const rows = await warehouse2.query("SELECT 1 AS recovered");
1519
+ const rows = await warehouse3.query("SELECT 1 AS recovered");
1520
1520
  if (Number(rows[0]?.recovered) !== 1) {
1521
1521
  throw new Error("Statement execution did not recover after the injected failure");
1522
1522
  }
@@ -1554,20 +1554,20 @@ function backupRestoreCheck() {
1554
1554
  id: "backup-restore",
1555
1555
  description: "Delta DEEP CLONE backup restores a dropped scratch table",
1556
1556
  configured: (env) => Boolean(env.DATABRICKS_WAREHOUSE_ID || env.DATABRICKS_HTTP_PATH),
1557
- async run({ warehouse: warehouse2 }) {
1558
- const source = warehouse2.qual(safeName("backup_source"));
1559
- const backup = warehouse2.qual(safeName("backup_clone"));
1557
+ async run({ warehouse: warehouse3 }) {
1558
+ const source = warehouse3.qual(safeName("backup_source"));
1559
+ const backup = warehouse3.qual(safeName("backup_clone"));
1560
1560
  try {
1561
- await warehouse2.exec(`CREATE TABLE ${source} USING DELTA AS SELECT 7 AS value`);
1562
- await warehouse2.exec(`CREATE TABLE ${backup} DEEP CLONE ${source}`);
1563
- await warehouse2.exec(`DROP TABLE ${source}`);
1564
- await warehouse2.exec(`CREATE TABLE ${source} DEEP CLONE ${backup}`);
1565
- const rows = await warehouse2.query(`SELECT value FROM ${source}`);
1561
+ await warehouse3.exec(`CREATE TABLE ${source} USING DELTA AS SELECT 7 AS value`);
1562
+ await warehouse3.exec(`CREATE TABLE ${backup} DEEP CLONE ${source}`);
1563
+ await warehouse3.exec(`DROP TABLE ${source}`);
1564
+ await warehouse3.exec(`CREATE TABLE ${source} DEEP CLONE ${backup}`);
1565
+ const rows = await warehouse3.query(`SELECT value FROM ${source}`);
1566
1566
  if (Number(rows[0]?.value) !== 7) throw new Error("Restored Delta table lost its data");
1567
1567
  return { restoredRows: rows.length, deepClone: true };
1568
1568
  } finally {
1569
- await warehouse2.exec(`DROP TABLE IF EXISTS ${source}`).catch(() => void 0);
1570
- await warehouse2.exec(`DROP TABLE IF EXISTS ${backup}`).catch(() => void 0);
1569
+ await warehouse3.exec(`DROP TABLE IF EXISTS ${source}`).catch(() => void 0);
1570
+ await warehouse3.exec(`DROP TABLE IF EXISTS ${backup}`).catch(() => void 0);
1571
1571
  }
1572
1572
  }
1573
1573
  };
@@ -1577,25 +1577,25 @@ function rollbackCheck() {
1577
1577
  id: "rollback",
1578
1578
  description: "Delta time-travel rollback restores a known-good table version",
1579
1579
  configured: (env) => Boolean(env.DATABRICKS_WAREHOUSE_ID || env.DATABRICKS_HTTP_PATH),
1580
- async run({ warehouse: warehouse2 }) {
1581
- const table = warehouse2.qual(safeName("rollback_probe"));
1580
+ async run({ warehouse: warehouse3 }) {
1581
+ const table = warehouse3.qual(safeName("rollback_probe"));
1582
1582
  try {
1583
- await warehouse2.exec(`CREATE TABLE ${table} (value INT) USING DELTA`);
1584
- await warehouse2.exec(`INSERT INTO ${table} VALUES (1)`);
1585
- const history = await warehouse2.query(`DESCRIBE HISTORY ${table} LIMIT 1`);
1583
+ await warehouse3.exec(`CREATE TABLE ${table} (value INT) USING DELTA`);
1584
+ await warehouse3.exec(`INSERT INTO ${table} VALUES (1)`);
1585
+ const history = await warehouse3.query(`DESCRIBE HISTORY ${table} LIMIT 1`);
1586
1586
  const knownGoodVersion = Number(history[0]?.version);
1587
1587
  if (!Number.isInteger(knownGoodVersion)) {
1588
1588
  throw new Error("Delta history did not return a known-good version");
1589
1589
  }
1590
- await warehouse2.exec(`INSERT INTO ${table} VALUES (999)`);
1591
- await warehouse2.exec(`RESTORE TABLE ${table} TO VERSION AS OF ${knownGoodVersion}`);
1592
- const rows = await warehouse2.query(`SELECT value FROM ${table} ORDER BY value`);
1590
+ await warehouse3.exec(`INSERT INTO ${table} VALUES (999)`);
1591
+ await warehouse3.exec(`RESTORE TABLE ${table} TO VERSION AS OF ${knownGoodVersion}`);
1592
+ const rows = await warehouse3.query(`SELECT value FROM ${table} ORDER BY value`);
1593
1593
  if (rows.length !== 1 || Number(rows[0]?.value) !== 1) {
1594
1594
  throw new Error("Delta rollback did not restore the known-good contents");
1595
1595
  }
1596
1596
  return { knownGoodVersion, restoredRows: rows.length };
1597
1597
  } finally {
1598
- await warehouse2.exec(`DROP TABLE IF EXISTS ${table}`).catch(() => void 0);
1598
+ await warehouse3.exec(`DROP TABLE IF EXISTS ${table}`).catch(() => void 0);
1599
1599
  }
1600
1600
  }
1601
1601
  };
@@ -1605,13 +1605,13 @@ function serverlessComputeCheck() {
1605
1605
  id: "azure-serverless",
1606
1606
  description: "Azure Databricks serverless SQL warehouse is enabled and executes SQL",
1607
1607
  configured: (env) => Boolean(env.DATABRICKS_WAREHOUSE_ID),
1608
- async run({ env, client, warehouse: warehouse2 }) {
1608
+ async run({ env, client, warehouse: warehouse3 }) {
1609
1609
  const id = env.DATABRICKS_WAREHOUSE_ID;
1610
1610
  const details = await client.get(`/api/2.0/sql/warehouses/${encodeURIComponent(id)}`);
1611
1611
  if (details.enable_serverless_compute !== true) {
1612
1612
  throw new Error(`SQL warehouse ${id} is not configured for serverless compute`);
1613
1613
  }
1614
- const rows = await warehouse2.query("SELECT current_catalog() AS catalog");
1614
+ const rows = await warehouse3.query("SELECT current_catalog() AS catalog");
1615
1615
  return { warehouseId: id, name: details.name, state: details.state, rows: rows.length };
1616
1616
  }
1617
1617
  };
@@ -1731,15 +1731,15 @@ function createTargetPackRegistry(packs) {
1731
1731
  }
1732
1732
  return registry;
1733
1733
  }
1734
- function doctorTargetPack(pack, env = process.env, requiredChecks = pack.requiredChecks ?? []) {
1735
- const requirements = (pack.requirements ?? []).map((requirement2) => ({
1736
- id: requirement2.id,
1737
- description: requirement2.description,
1738
- satisfied: requirement2.anyOf.some((name) => Boolean(env[name]?.trim())),
1739
- required: requirement2.required !== false,
1740
- variables: [...requirement2.anyOf]
1734
+ function doctorTargetPack(pack, env = process.env, requiredChecks = []) {
1735
+ const requirements = (pack.requirements ?? []).map((requirement3) => ({
1736
+ id: requirement3.id,
1737
+ description: requirement3.description,
1738
+ satisfied: requirement3.anyOf.some((name) => Boolean(env[name]?.trim())),
1739
+ required: requirement3.required !== false,
1740
+ variables: [...requirement3.anyOf]
1741
1741
  }));
1742
- const required3 = new Set(requiredChecks);
1742
+ const required3 = new Set(resolveRequiredChecks(pack, requiredChecks));
1743
1743
  const checks = pack.checks().map((check) => ({
1744
1744
  id: check.id,
1745
1745
  description: check.description,
@@ -1747,7 +1747,7 @@ function doctorTargetPack(pack, env = process.env, requiredChecks = pack.require
1747
1747
  required: required3.has(check.id)
1748
1748
  }));
1749
1749
  const known = new Set(checks.map((check) => check.id));
1750
- const missingRequirements = requirements.filter((requirement2) => requirement2.required && !requirement2.satisfied).map((requirement2) => requirement2.id);
1750
+ const missingRequirements = requirements.filter((requirement3) => requirement3.required && !requirement3.satisfied).map((requirement3) => requirement3.id);
1751
1751
  const missingRequiredChecks = [
1752
1752
  ...checks.filter((check) => check.required && !check.configured).map((check) => check.id),
1753
1753
  ...[...required3].filter((id) => !known.has(id))
@@ -1768,11 +1768,11 @@ function doctorTargetPack(pack, env = process.env, requiredChecks = pack.require
1768
1768
  }
1769
1769
  function defineTargetPackRun(pack, options = {}) {
1770
1770
  const env = options.env ?? process.env;
1771
- const requiredChecks = [...options.requiredChecks ?? pack.requiredChecks ?? []];
1771
+ const requiredChecks = resolveRequiredChecks(pack, options.requiredChecks);
1772
1772
  const doctor = doctorTargetPack(pack, env, requiredChecks);
1773
1773
  if (!doctor.ready) {
1774
- const missing = [...doctor.missingRequirements, ...doctor.missingRequiredChecks].join(", ");
1775
- throw new Error(`Target pack '${pack.id}' is not configured: ${missing}`);
1774
+ const missing2 = [...doctor.missingRequirements, ...doctor.missingRequiredChecks].join(", ");
1775
+ throw new Error(`Target pack '${pack.id}' is not configured: ${missing2}`);
1776
1776
  }
1777
1777
  const targetPack = evidenceMetadata(pack, env);
1778
1778
  const suite = defineLiveSuite({
@@ -1785,6 +1785,9 @@ function defineTargetPackRun(pack, options = {}) {
1785
1785
  });
1786
1786
  return { pack, run: (runtime) => suite.run(runtime) };
1787
1787
  }
1788
+ function resolveRequiredChecks(pack, additional = []) {
1789
+ return [.../* @__PURE__ */ new Set([...pack.requiredChecks ?? [], ...additional])];
1790
+ }
1788
1791
  async function runTargetPack(pack, options = {}, runtime) {
1789
1792
  return defineTargetPackRun(pack, options).run(runtime);
1790
1793
  }
@@ -2494,7 +2497,579 @@ function createLakeflowJobsTargetPack() {
2494
2497
  });
2495
2498
  }
2496
2499
 
2500
+ // src/next-workload-checks.ts
2501
+ init_workspace_client();
2502
+ function missing(env, names) {
2503
+ return names.filter((name) => !env[name]?.trim());
2504
+ }
2505
+ function requireEnv(env, names) {
2506
+ const absent = missing(env, names);
2507
+ if (absent.length > 0) throw new Error(`Missing required configuration: ${absent.join(", ")}`);
2508
+ }
2509
+ async function assertBooleanSql(label, statement, query) {
2510
+ if (!statement) throw new Error(`${label} assertion SQL is not configured`);
2511
+ const rows = await query(statement);
2512
+ const value = rows[0] ? Object.values(rows[0])[0] : void 0;
2513
+ if (!(value === true || value === 1 || value === "1" || value === "true")) {
2514
+ throw new Error(`${label} assertion did not return a truthy first column`);
2515
+ }
2516
+ }
2517
+ async function certificationJob(label, jobIdValue, env, client) {
2518
+ const jobId = Number(jobIdValue);
2519
+ if (!Number.isSafeInteger(jobId) || jobId <= 0) {
2520
+ throw new Error(`${label} job id must be a positive integer`);
2521
+ }
2522
+ const submitted = await client.post("/api/2.1/jobs/run-now", {
2523
+ job_id: jobId
2524
+ });
2525
+ if (!Number.isSafeInteger(submitted.run_id)) {
2526
+ throw new Error(`${label} certification job returned no run_id`);
2527
+ }
2528
+ const run = await waitForDatabricksRun(client, submitted.run_id, {
2529
+ timeoutMs: Number(env.DBX_TEST_TIMEOUT_MS ?? 36e5),
2530
+ pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 1e4)
2531
+ });
2532
+ const result = run.state?.result_state;
2533
+ if (result !== "SUCCESS") {
2534
+ throw new Error(`${label} certification job ${jobId} ended in ${result ?? "UNKNOWN"}`);
2535
+ }
2536
+ return { jobId, runId: submitted.run_id };
2537
+ }
2538
+ function jobAndAssertionsCheck(spec) {
2539
+ const names = [spec.job, ...spec.assertions.map(({ env }) => env)];
2540
+ return {
2541
+ id: spec.id,
2542
+ description: spec.description,
2543
+ configured: (env) => missing(env, names).length === 0,
2544
+ async run({ env, client, warehouse: warehouse3 }) {
2545
+ requireEnv(env, names);
2546
+ const job = await certificationJob(spec.label, env[spec.job], env, client);
2547
+ for (const assertion of spec.assertions) {
2548
+ await assertBooleanSql(assertion.label, env[assertion.env], warehouse3.query);
2549
+ }
2550
+ return {
2551
+ ...job,
2552
+ assertions: Object.fromEntries(spec.assertions.map(({ label }) => [label, true]))
2553
+ };
2554
+ }
2555
+ };
2556
+ }
2557
+ function semanticAnalyticsCheck() {
2558
+ return jobAndAssertionsCheck({
2559
+ id: "semantic-analytics",
2560
+ description: "Metric views, materialization, SQL alerts and query-performance evidence are healthy",
2561
+ label: "Semantic analytics",
2562
+ job: "DBX_TEST_SEMANTIC_ANALYTICS_JOB_ID",
2563
+ assertions: [
2564
+ { env: "DBX_TEST_METRIC_VIEW_ASSERTION_SQL", label: "Metric view query" },
2565
+ { env: "DBX_TEST_METRIC_MATERIALIZATION_ASSERTION_SQL", label: "Metric materialization" },
2566
+ { env: "DBX_TEST_SQL_ALERT_ASSERTION_SQL", label: "SQL alert" },
2567
+ { env: "DBX_TEST_QUERY_PERFORMANCE_ASSERTION_SQL", label: "Query performance" }
2568
+ ]
2569
+ });
2570
+ }
2571
+ function aiFunctionsBatchInferenceCheck() {
2572
+ return jobAndAssertionsCheck({
2573
+ id: "ai-functions-batch-inference",
2574
+ description: "AI Functions batch and streaming inference produce governed durable output",
2575
+ label: "AI Functions batch inference",
2576
+ job: "DBX_TEST_AI_FUNCTIONS_JOB_ID",
2577
+ assertions: [
2578
+ { env: "DBX_TEST_AI_FUNCTIONS_OUTPUT_ASSERTION_SQL", label: "AI Functions output" },
2579
+ { env: "DBX_TEST_BATCH_INFERENCE_QUALITY_ASSERTION_SQL", label: "Batch inference quality" },
2580
+ { env: "DBX_TEST_BATCH_INFERENCE_LINEAGE_ASSERTION_SQL", label: "Batch inference lineage" }
2581
+ ]
2582
+ });
2583
+ }
2584
+ function agentOrchestrationResponsesCheck() {
2585
+ return jobAndAssertionsCheck({
2586
+ id: "agent-orchestration-responses",
2587
+ description: "Knowledge Assistant, multi-agent orchestration and Responses API produce grounded governed evidence",
2588
+ label: "Agent orchestration and Responses",
2589
+ job: "DBX_TEST_AGENT_ORCHESTRATION_JOB_ID",
2590
+ assertions: [
2591
+ { env: "DBX_TEST_KNOWLEDGE_ASSISTANT_ASSERTION_SQL", label: "Knowledge Assistant" },
2592
+ { env: "DBX_TEST_MULTI_AGENT_ASSERTION_SQL", label: "Multi-agent orchestration" },
2593
+ { env: "DBX_TEST_RESPONSES_API_ASSERTION_SQL", label: "Responses API" },
2594
+ { env: "DBX_TEST_AGENT_GROUNDEDNESS_ASSERTION_SQL", label: "Agent groundedness" }
2595
+ ]
2596
+ });
2597
+ }
2598
+ function aiRuntimeTrainingCheck() {
2599
+ return jobAndAssertionsCheck({
2600
+ id: "ai-runtime-training",
2601
+ description: "AI Runtime training or fine-tuning produces MLflow and Unity Catalog evidence",
2602
+ label: "AI Runtime training",
2603
+ job: "DBX_TEST_AI_RUNTIME_JOB_ID",
2604
+ assertions: [
2605
+ { env: "DBX_TEST_AI_RUNTIME_RUN_ASSERTION_SQL", label: "AI Runtime run" },
2606
+ { env: "DBX_TEST_AI_RUNTIME_EVAL_ASSERTION_SQL", label: "AI Runtime evaluation" },
2607
+ { env: "DBX_TEST_AI_RUNTIME_MODEL_ASSERTION_SQL", label: "AI Runtime registered model" }
2608
+ ]
2609
+ });
2610
+ }
2611
+ function lakebaseAutoscalingFeatureStoreCheck() {
2612
+ return jobAndAssertionsCheck({
2613
+ id: "lakebase-autoscaling-feature-store",
2614
+ description: "Lakebase Autoscaling Online Feature Store publishes fresh features and serves lookups",
2615
+ label: "Lakebase Autoscaling feature store",
2616
+ job: "DBX_TEST_ONLINE_FEATURE_STORE_JOB_ID",
2617
+ assertions: [
2618
+ { env: "DBX_TEST_ONLINE_STORE_ASSERTION_SQL", label: "Online store publication" },
2619
+ { env: "DBX_TEST_FEATURE_SERVING_ASSERTION_SQL", label: "Feature Serving lookup" },
2620
+ { env: "DBX_TEST_ONLINE_FEATURE_FRESHNESS_ASSERTION_SQL", label: "Online feature freshness" }
2621
+ ]
2622
+ });
2623
+ }
2624
+ function declarativeBundlesCheck() {
2625
+ return jobAndAssertionsCheck({
2626
+ id: "declarative-bundles",
2627
+ description: "A validated bundle deployment runs the exact candidate and records provenance",
2628
+ label: "Declarative Automation Bundle",
2629
+ job: "DBX_TEST_BUNDLE_JOB_ID",
2630
+ assertions: [
2631
+ { env: "DBX_TEST_BUNDLE_PROVENANCE_ASSERTION_SQL", label: "Bundle provenance" },
2632
+ { env: "DBX_TEST_BUNDLE_CANDIDATE_ASSERTION_SQL", label: "Bundle candidate" },
2633
+ { env: "DBX_TEST_BUNDLE_ROLLBACK_ASSERTION_SQL", label: "Bundle rollback" }
2634
+ ]
2635
+ });
2636
+ }
2637
+ function lakehouseOptimizationCheck() {
2638
+ const names = [
2639
+ "DBX_TEST_PREDICTIVE_OPTIMIZATION_ASSERTION_SQL",
2640
+ "DBX_TEST_LIQUID_CLUSTERING_ASSERTION_SQL",
2641
+ "DBX_TEST_ICEBERG_INTEROP_ASSERTION_SQL"
2642
+ ];
2643
+ return {
2644
+ id: "lakehouse-optimization",
2645
+ description: "Predictive Optimization, liquid clustering and Iceberg interoperability satisfy table contracts",
2646
+ configured: (env) => missing(env, names).length === 0,
2647
+ async run({ env, warehouse: warehouse3 }) {
2648
+ requireEnv(env, names);
2649
+ await assertBooleanSql(
2650
+ "Predictive Optimization",
2651
+ env.DBX_TEST_PREDICTIVE_OPTIMIZATION_ASSERTION_SQL,
2652
+ warehouse3.query
2653
+ );
2654
+ await assertBooleanSql(
2655
+ "Liquid clustering",
2656
+ env.DBX_TEST_LIQUID_CLUSTERING_ASSERTION_SQL,
2657
+ warehouse3.query
2658
+ );
2659
+ await assertBooleanSql(
2660
+ "Iceberg interoperability",
2661
+ env.DBX_TEST_ICEBERG_INTEROP_ASSERTION_SQL,
2662
+ warehouse3.query
2663
+ );
2664
+ return { predictiveOptimization: true, liquidClustering: true, icebergInterop: true };
2665
+ }
2666
+ };
2667
+ }
2668
+ function marketplaceOpenSharingCheck() {
2669
+ return jobAndAssertionsCheck({
2670
+ id: "marketplace-open-sharing",
2671
+ description: "Marketplace provider and consumer flows preserve OpenSharing governance and asset usability",
2672
+ label: "Marketplace and OpenSharing",
2673
+ job: "DBX_TEST_MARKETPLACE_JOB_ID",
2674
+ assertions: [
2675
+ { env: "DBX_TEST_MARKETPLACE_LISTING_ASSERTION_SQL", label: "Marketplace listing" },
2676
+ { env: "DBX_TEST_OPEN_SHARING_RECIPIENT_ASSERTION_SQL", label: "OpenSharing recipient" },
2677
+ { env: "DBX_TEST_MARKETPLACE_ASSET_ASSERTION_SQL", label: "Marketplace asset" }
2678
+ ]
2679
+ });
2680
+ }
2681
+
2682
+ // src/next-target-packs.ts
2683
+ var DOCS2 = "https://experiments.fabric.pro/docs/testing/target-packs/";
2684
+ var AZURE_M2M_SCOPE = "Azure Databricks, dedicated service principal using OAuth M2M, public network path; named managed or disposable certification fixtures";
2685
+ var workspace = {
2686
+ id: "workspace",
2687
+ description: "Databricks workspace host",
2688
+ anyOf: ["DATABRICKS_HOST"]
2689
+ };
2690
+ var auth = {
2691
+ id: "authentication",
2692
+ description: "Databricks OAuth M2M authentication",
2693
+ anyOf: ["DATABRICKS_CLIENT_ID"],
2694
+ secret: true
2695
+ };
2696
+ var warehouse = {
2697
+ id: "warehouse",
2698
+ description: "SQL warehouse for durable evidence assertions",
2699
+ anyOf: ["DATABRICKS_WAREHOUSE_ID", "DATABRICKS_HTTP_PATH"]
2700
+ };
2701
+ var requirement = (id, description, ...anyOf) => ({
2702
+ id,
2703
+ description,
2704
+ anyOf
2705
+ });
2706
+ var identityChecks = () => [restrictedPrincipalCheck()];
2707
+ function createSemanticAnalyticsTargetPack() {
2708
+ return defineTargetPack({
2709
+ id: "semantic-analytics",
2710
+ name: "Semantic analytics and SQL operations",
2711
+ description: "Unity Catalog metric views, materialization, SQL alerts and query-performance regression.",
2712
+ version: "1.0.0",
2713
+ maturity: "shipped",
2714
+ capabilities: [
2715
+ "semantics.metric-views",
2716
+ "semantics.materialization",
2717
+ "sql.alerts",
2718
+ "sql.query-performance"
2719
+ ],
2720
+ checks: () => [...identityChecks(), semanticAnalyticsCheck()],
2721
+ requiredChecks: ["restricted-principal", "semantic-analytics"],
2722
+ requirements: [
2723
+ workspace,
2724
+ auth,
2725
+ warehouse,
2726
+ requirement(
2727
+ "semantic-job",
2728
+ "Metric-view certification Job",
2729
+ "DBX_TEST_SEMANTIC_ANALYTICS_JOB_ID"
2730
+ ),
2731
+ requirement(
2732
+ "metric-view",
2733
+ "Metric-view query assertion",
2734
+ "DBX_TEST_METRIC_VIEW_ASSERTION_SQL"
2735
+ ),
2736
+ requirement(
2737
+ "metric-materialization",
2738
+ "Metric-view materialization assertion",
2739
+ "DBX_TEST_METRIC_MATERIALIZATION_ASSERTION_SQL"
2740
+ ),
2741
+ requirement("sql-alert", "SQL alert assertion", "DBX_TEST_SQL_ALERT_ASSERTION_SQL"),
2742
+ requirement(
2743
+ "query-performance",
2744
+ "Query performance assertion",
2745
+ "DBX_TEST_QUERY_PERFORMANCE_ASSERTION_SQL"
2746
+ )
2747
+ ],
2748
+ docsUrl: `${DOCS2}#semantic-analytics-and-sql-operations`,
2749
+ certificationScopes: [
2750
+ `${AZURE_M2M_SCOPE}; metric view, materialization, alert and query history`
2751
+ ]
2752
+ });
2753
+ }
2754
+ function createAiFunctionsBatchInferenceTargetPack() {
2755
+ return defineTargetPack({
2756
+ id: "ai-functions-batch-inference",
2757
+ name: "AI Functions and batch inference",
2758
+ description: "Governed batch or streaming inference through Databricks AI Functions.",
2759
+ version: "1.0.0",
2760
+ maturity: "shipped",
2761
+ capabilities: [
2762
+ "ai-functions.inference",
2763
+ "batch-inference.quality",
2764
+ "streaming-inference",
2765
+ "inference.lineage"
2766
+ ],
2767
+ checks: () => [...identityChecks(), aiFunctionsBatchInferenceCheck()],
2768
+ requiredChecks: ["restricted-principal", "ai-functions-batch-inference"],
2769
+ requirements: [
2770
+ workspace,
2771
+ auth,
2772
+ warehouse,
2773
+ requirement("ai-functions-job", "AI Functions inference Job", "DBX_TEST_AI_FUNCTIONS_JOB_ID"),
2774
+ requirement(
2775
+ "ai-functions-output",
2776
+ "Inference output assertion",
2777
+ "DBX_TEST_AI_FUNCTIONS_OUTPUT_ASSERTION_SQL"
2778
+ ),
2779
+ requirement(
2780
+ "batch-quality",
2781
+ "Inference quality assertion",
2782
+ "DBX_TEST_BATCH_INFERENCE_QUALITY_ASSERTION_SQL"
2783
+ ),
2784
+ requirement(
2785
+ "batch-lineage",
2786
+ "Inference lineage assertion",
2787
+ "DBX_TEST_BATCH_INFERENCE_LINEAGE_ASSERTION_SQL"
2788
+ )
2789
+ ],
2790
+ docsUrl: `${DOCS2}#ai-functions-and-batch-inference`,
2791
+ certificationScopes: [
2792
+ `${AZURE_M2M_SCOPE}; AI Functions Job with durable output, quality and lineage`
2793
+ ]
2794
+ });
2795
+ }
2796
+ function createAgentOrchestrationTargetPack() {
2797
+ return defineTargetPack({
2798
+ id: "agent-orchestration-responses",
2799
+ name: "Knowledge Assistant, multi-agent and Responses",
2800
+ description: "Knowledge Assistant and multi-agent application behavior through the Responses API.",
2801
+ version: "1.0.0",
2802
+ maturity: "shipped",
2803
+ capabilities: [
2804
+ "agents.knowledge-assistant",
2805
+ "agents.multi-agent",
2806
+ "agents.responses-api",
2807
+ "agents.groundedness"
2808
+ ],
2809
+ checks: () => [...identityChecks(), agentOrchestrationResponsesCheck()],
2810
+ requiredChecks: ["restricted-principal", "agent-orchestration-responses"],
2811
+ requirements: [
2812
+ workspace,
2813
+ auth,
2814
+ warehouse,
2815
+ requirement(
2816
+ "agent-orchestration-job",
2817
+ "Agent orchestration certification Job",
2818
+ "DBX_TEST_AGENT_ORCHESTRATION_JOB_ID"
2819
+ ),
2820
+ requirement(
2821
+ "knowledge-assistant",
2822
+ "Knowledge Assistant assertion",
2823
+ "DBX_TEST_KNOWLEDGE_ASSISTANT_ASSERTION_SQL"
2824
+ ),
2825
+ requirement("multi-agent", "Multi-agent assertion", "DBX_TEST_MULTI_AGENT_ASSERTION_SQL"),
2826
+ requirement(
2827
+ "responses-api",
2828
+ "Responses API assertion",
2829
+ "DBX_TEST_RESPONSES_API_ASSERTION_SQL"
2830
+ ),
2831
+ requirement(
2832
+ "agent-groundedness",
2833
+ "Groundedness assertion",
2834
+ "DBX_TEST_AGENT_GROUNDEDNESS_ASSERTION_SQL"
2835
+ )
2836
+ ],
2837
+ docsUrl: `${DOCS2}#knowledge-assistant-multi-agent-and-responses`,
2838
+ certificationScopes: [
2839
+ `${AZURE_M2M_SCOPE}; Databricks preview agent surfaces with durable groundedness evidence`
2840
+ ]
2841
+ });
2842
+ }
2843
+ function createAiRuntimeTrainingTargetPack() {
2844
+ return defineTargetPack({
2845
+ id: "ai-runtime-training",
2846
+ name: "AI Runtime training and fine-tuning",
2847
+ description: "AI Runtime training or fine-tuning with MLflow and Unity Catalog model evidence.",
2848
+ version: "1.0.0",
2849
+ maturity: "shipped",
2850
+ capabilities: [
2851
+ "ai-runtime.training",
2852
+ "ai-runtime.fine-tuning",
2853
+ "mlflow.training-evaluation",
2854
+ "models.unity-catalog"
2855
+ ],
2856
+ checks: () => [...identityChecks(), aiRuntimeTrainingCheck()],
2857
+ requiredChecks: ["restricted-principal", "ai-runtime-training"],
2858
+ requirements: [
2859
+ workspace,
2860
+ auth,
2861
+ warehouse,
2862
+ requirement("ai-runtime-job", "AI Runtime certification Job", "DBX_TEST_AI_RUNTIME_JOB_ID"),
2863
+ requirement(
2864
+ "ai-runtime-run",
2865
+ "Training-run assertion",
2866
+ "DBX_TEST_AI_RUNTIME_RUN_ASSERTION_SQL"
2867
+ ),
2868
+ requirement(
2869
+ "ai-runtime-eval",
2870
+ "Training evaluation assertion",
2871
+ "DBX_TEST_AI_RUNTIME_EVAL_ASSERTION_SQL"
2872
+ ),
2873
+ requirement(
2874
+ "ai-runtime-model",
2875
+ "Registered-model assertion",
2876
+ "DBX_TEST_AI_RUNTIME_MODEL_ASSERTION_SQL"
2877
+ )
2878
+ ],
2879
+ docsUrl: `${DOCS2}#ai-runtime-training-and-fine-tuning`,
2880
+ certificationScopes: [
2881
+ `${AZURE_M2M_SCOPE}; serverless GPU AI Runtime candidate tracked in MLflow and Unity Catalog`
2882
+ ]
2883
+ });
2884
+ }
2885
+ function createLakebaseAutoscalingFeatureStoreTargetPack() {
2886
+ return defineTargetPack({
2887
+ id: "lakebase-autoscaling-features",
2888
+ name: "Lakebase Autoscaling Online Feature Store",
2889
+ description: "Online feature publication, freshness and Feature Serving lookup behavior.",
2890
+ version: "1.0.0",
2891
+ maturity: "shipped",
2892
+ capabilities: [
2893
+ "lakebase.autoscaling",
2894
+ "features.online-store",
2895
+ "features.serving-endpoint",
2896
+ "features.online-freshness"
2897
+ ],
2898
+ checks: () => [...identityChecks(), lakebaseAutoscalingFeatureStoreCheck()],
2899
+ requiredChecks: ["restricted-principal", "lakebase-autoscaling-feature-store"],
2900
+ requirements: [
2901
+ workspace,
2902
+ auth,
2903
+ warehouse,
2904
+ requirement(
2905
+ "online-feature-job",
2906
+ "Online Feature Store publication Job",
2907
+ "DBX_TEST_ONLINE_FEATURE_STORE_JOB_ID"
2908
+ ),
2909
+ requirement(
2910
+ "online-store",
2911
+ "Online publication assertion",
2912
+ "DBX_TEST_ONLINE_STORE_ASSERTION_SQL"
2913
+ ),
2914
+ requirement(
2915
+ "feature-serving",
2916
+ "Feature Serving lookup assertion",
2917
+ "DBX_TEST_FEATURE_SERVING_ASSERTION_SQL"
2918
+ ),
2919
+ requirement(
2920
+ "feature-freshness",
2921
+ "Online freshness assertion",
2922
+ "DBX_TEST_ONLINE_FEATURE_FRESHNESS_ASSERTION_SQL"
2923
+ )
2924
+ ],
2925
+ docsUrl: `${DOCS2}#lakebase-autoscaling-online-feature-store`,
2926
+ certificationScopes: [
2927
+ `${AZURE_M2M_SCOPE}; Lakebase Autoscaling store and Feature Serving lookup`
2928
+ ]
2929
+ });
2930
+ }
2931
+ function createDeclarativeBundlesTargetPack() {
2932
+ return defineTargetPack({
2933
+ id: "declarative-bundles",
2934
+ name: "Declarative Automation Bundles",
2935
+ description: "Bundle validation, exact-candidate deployment, execution provenance and rollback.",
2936
+ version: "1.0.0",
2937
+ maturity: "shipped",
2938
+ capabilities: [
2939
+ "bundles.validation",
2940
+ "bundles.deployment",
2941
+ "bundles.provenance",
2942
+ "bundles.rollback"
2943
+ ],
2944
+ checks: () => [...identityChecks(), declarativeBundlesCheck()],
2945
+ requiredChecks: ["restricted-principal", "declarative-bundles"],
2946
+ requirements: [
2947
+ workspace,
2948
+ auth,
2949
+ warehouse,
2950
+ requirement("bundle-job", "Bundle-managed certification Job", "DBX_TEST_BUNDLE_JOB_ID"),
2951
+ requirement(
2952
+ "bundle-provenance",
2953
+ "Deployment provenance assertion",
2954
+ "DBX_TEST_BUNDLE_PROVENANCE_ASSERTION_SQL"
2955
+ ),
2956
+ requirement(
2957
+ "bundle-candidate",
2958
+ "Exact-candidate assertion",
2959
+ "DBX_TEST_BUNDLE_CANDIDATE_ASSERTION_SQL"
2960
+ ),
2961
+ requirement(
2962
+ "bundle-rollback",
2963
+ "Rollback assertion",
2964
+ "DBX_TEST_BUNDLE_ROLLBACK_ASSERTION_SQL"
2965
+ )
2966
+ ],
2967
+ docsUrl: `${DOCS2}#declarative-automation-bundles`,
2968
+ certificationScopes: [
2969
+ `${AZURE_M2M_SCOPE}; validate/deploy/run/rollback lifecycle for an immutable bundle target`
2970
+ ]
2971
+ });
2972
+ }
2973
+ function createLakehouseOptimizationTargetPack() {
2974
+ return defineTargetPack({
2975
+ id: "lakehouse-optimization",
2976
+ name: "Lakehouse optimization and Iceberg interoperability",
2977
+ description: "Predictive Optimization, liquid clustering and governed Iceberg interoperability.",
2978
+ version: "1.0.0",
2979
+ maturity: "shipped",
2980
+ capabilities: [
2981
+ "tables.predictive-optimization",
2982
+ "tables.liquid-clustering",
2983
+ "tables.iceberg",
2984
+ "tables.interoperability"
2985
+ ],
2986
+ checks: () => [...identityChecks(), lakehouseOptimizationCheck()],
2987
+ requiredChecks: ["restricted-principal", "lakehouse-optimization"],
2988
+ requirements: [
2989
+ workspace,
2990
+ auth,
2991
+ warehouse,
2992
+ requirement(
2993
+ "predictive-optimization",
2994
+ "Predictive Optimization assertion",
2995
+ "DBX_TEST_PREDICTIVE_OPTIMIZATION_ASSERTION_SQL"
2996
+ ),
2997
+ requirement(
2998
+ "liquid-clustering",
2999
+ "Liquid clustering assertion",
3000
+ "DBX_TEST_LIQUID_CLUSTERING_ASSERTION_SQL"
3001
+ ),
3002
+ requirement(
3003
+ "iceberg-interop",
3004
+ "Iceberg interoperability assertion",
3005
+ "DBX_TEST_ICEBERG_INTEROP_ASSERTION_SQL"
3006
+ )
3007
+ ],
3008
+ docsUrl: `${DOCS2}#lakehouse-optimization-and-iceberg`,
3009
+ certificationScopes: [`${AZURE_M2M_SCOPE}; Unity Catalog managed Delta and Iceberg fixtures`]
3010
+ });
3011
+ }
3012
+ function createMarketplaceOpenSharingTargetPack() {
3013
+ return defineTargetPack({
3014
+ id: "marketplace-open-sharing",
3015
+ name: "Marketplace and OpenSharing",
3016
+ description: "Provider listing, recipient access and usable governed data or AI assets.",
3017
+ version: "1.0.0",
3018
+ maturity: "shipped",
3019
+ capabilities: [
3020
+ "marketplace.provider",
3021
+ "marketplace.consumer",
3022
+ "open-sharing.recipient",
3023
+ "marketplace.ai-assets"
3024
+ ],
3025
+ checks: () => [...identityChecks(), marketplaceOpenSharingCheck()],
3026
+ requiredChecks: ["restricted-principal", "marketplace-open-sharing"],
3027
+ requirements: [
3028
+ workspace,
3029
+ auth,
3030
+ warehouse,
3031
+ requirement(
3032
+ "marketplace-job",
3033
+ "Marketplace certification Job",
3034
+ "DBX_TEST_MARKETPLACE_JOB_ID"
3035
+ ),
3036
+ requirement(
3037
+ "marketplace-listing",
3038
+ "Listing assertion",
3039
+ "DBX_TEST_MARKETPLACE_LISTING_ASSERTION_SQL"
3040
+ ),
3041
+ requirement(
3042
+ "open-sharing-recipient",
3043
+ "Recipient assertion",
3044
+ "DBX_TEST_OPEN_SHARING_RECIPIENT_ASSERTION_SQL"
3045
+ ),
3046
+ requirement(
3047
+ "marketplace-asset",
3048
+ "Shared asset usability assertion",
3049
+ "DBX_TEST_MARKETPLACE_ASSET_ASSERTION_SQL"
3050
+ )
3051
+ ],
3052
+ docsUrl: `${DOCS2}#marketplace-and-opensharing`,
3053
+ certificationScopes: [
3054
+ `${AZURE_M2M_SCOPE}; private listing provider and recipient lifecycle with governed asset access`
3055
+ ]
3056
+ });
3057
+ }
3058
+ function createNextTargetPacks() {
3059
+ return [
3060
+ createSemanticAnalyticsTargetPack(),
3061
+ createAiFunctionsBatchInferenceTargetPack(),
3062
+ createAgentOrchestrationTargetPack(),
3063
+ createAiRuntimeTrainingTargetPack(),
3064
+ createLakebaseAutoscalingFeatureStoreTargetPack(),
3065
+ createDeclarativeBundlesTargetPack(),
3066
+ createLakehouseOptimizationTargetPack(),
3067
+ createMarketplaceOpenSharingTargetPack()
3068
+ ];
3069
+ }
3070
+
2497
3071
  // src/advanced-workload-checks.ts
3072
+ init_workspace_client();
2498
3073
  init_workspace_context();
2499
3074
  var DatabricksAdvancedWorkloadsAdapter = class {
2500
3075
  constructor(client) {
@@ -2568,6 +3143,15 @@ var DatabricksAdvancedWorkloadsAdapter = class {
2568
3143
  warehouse(id) {
2569
3144
  return this.client.get(`/api/2.0/sql/warehouses/${segment(id)}`);
2570
3145
  }
3146
+ app(name) {
3147
+ return this.client.get(`/api/2.0/apps/${segment(name)}`);
3148
+ }
3149
+ agentService(fullName) {
3150
+ return this.client.get(`/api/2.1/unity-catalog/agent-services/${segment(fullName)}`);
3151
+ }
3152
+ agentServicePermissions(fullName) {
3153
+ return this.client.get(`/api/2.1/unity-catalog/permissions/AGENT_SERVICE/${segment(fullName)}`);
3154
+ }
2571
3155
  };
2572
3156
  function segment(value) {
2573
3157
  return encodeURIComponent(value);
@@ -2578,9 +3162,9 @@ function adapter(client) {
2578
3162
  function required2(env, names) {
2579
3163
  return names.filter((name) => !env[name]?.trim());
2580
3164
  }
2581
- function requireEnv(env, names) {
2582
- const missing = required2(env, names);
2583
- if (missing.length > 0) throw new Error(`Missing required configuration: ${missing.join(", ")}`);
3165
+ function requireEnv2(env, names) {
3166
+ const missing2 = required2(env, names);
3167
+ if (missing2.length > 0) throw new Error(`Missing required configuration: ${missing2.join(", ")}`);
2584
3168
  }
2585
3169
  function parseJson(value, name) {
2586
3170
  if (!value) return void 0;
@@ -2614,6 +3198,27 @@ async function booleanSql(label, sql, query) {
2614
3198
  throw new Error(`${label} assertion did not return a truthy first column`);
2615
3199
  }
2616
3200
  }
3201
+ async function runCertificationJob(label, jobIdValue, env, client, options = {}) {
3202
+ const jobId = Number(jobIdValue);
3203
+ if (!Number.isSafeInteger(jobId) || jobId <= 0) {
3204
+ throw new Error(`${label} job id must be a positive integer`);
3205
+ }
3206
+ const submitted = await client.post("/api/2.1/jobs/run-now", {
3207
+ job_id: jobId
3208
+ });
3209
+ if (!Number.isSafeInteger(submitted.run_id)) {
3210
+ throw new Error(`${label} certification job returned no run_id`);
3211
+ }
3212
+ const run = await waitForDatabricksRun(client, submitted.run_id, {
3213
+ timeoutMs: options.timeoutMs ?? Number(env.DBX_TEST_TIMEOUT_MS ?? 9e5),
3214
+ pollIntervalMs: Number(env.DBX_TEST_POLL_INTERVAL_MS ?? 1e4)
3215
+ });
3216
+ const result = run.state?.result_state;
3217
+ if (result !== "SUCCESS") {
3218
+ throw new Error(`${label} certification job ${jobId} ended in ${result ?? "UNKNOWN"}`);
3219
+ }
3220
+ return { jobId, runId: submitted.run_id };
3221
+ }
2617
3222
  function advancedStreamingCdcCheck() {
2618
3223
  const names = [
2619
3224
  "DBX_TEST_STREAMING_PIPELINE_ID",
@@ -2625,8 +3230,8 @@ function advancedStreamingCdcCheck() {
2625
3230
  id: "streaming-cdc",
2626
3231
  description: "Streaming pipeline, streaming table and CDC assertions are healthy",
2627
3232
  configured: (env) => required2(env, names).length === 0,
2628
- async run({ env, client, warehouse: warehouse2 }) {
2629
- requireEnv(env, names);
3233
+ async run({ env, client, warehouse: warehouse3 }) {
3234
+ requireEnv2(env, names);
2630
3235
  const api = adapter(client);
2631
3236
  const pipeline = await api.pipeline(env.DBX_TEST_STREAMING_PIPELINE_ID);
2632
3237
  assertNotFailed("Streaming pipeline", pipeline.state);
@@ -2635,11 +3240,11 @@ function advancedStreamingCdcCheck() {
2635
3240
  if (!["STREAMING_TABLE", "MATERIALIZED_VIEW", "DELTA"].includes(tableType)) {
2636
3241
  throw new Error(`Streaming target has unsupported table type ${tableType || "UNKNOWN"}`);
2637
3242
  }
2638
- await booleanSql("CDC", env.DBX_TEST_CDC_ASSERTION_SQL, warehouse2.query);
3243
+ await booleanSql("CDC", env.DBX_TEST_CDC_ASSERTION_SQL, warehouse3.query);
2639
3244
  await booleanSql(
2640
3245
  "Streaming freshness",
2641
3246
  env.DBX_TEST_STREAMING_ASSERTION_SQL,
2642
- warehouse2.query
3247
+ warehouse3.query
2643
3248
  );
2644
3249
  return { pipelineId: pipeline.pipeline_id, table: env.DBX_TEST_STREAMING_TABLE, tableType };
2645
3250
  }
@@ -2651,8 +3256,8 @@ function lakeflowConnectCheck() {
2651
3256
  id: "lakeflow-connect",
2652
3257
  description: "Lakeflow Connect ingestion pipeline exists and is not failed",
2653
3258
  configured: (env) => required2(env, names).length === 0,
2654
- async run({ env, client, warehouse: warehouse2 }) {
2655
- requireEnv(env, names);
3259
+ async run({ env, client, warehouse: warehouse3 }) {
3260
+ requireEnv2(env, names);
2656
3261
  const id = env.DBX_TEST_CONNECT_PIPELINE_ID;
2657
3262
  const pipeline = await adapter(client).pipeline(id);
2658
3263
  assertNotFailed("Lakeflow Connect pipeline", pipeline.state);
@@ -2663,7 +3268,7 @@ function lakeflowConnectCheck() {
2663
3268
  await booleanSql(
2664
3269
  "Lakeflow Connect replication",
2665
3270
  env.DBX_TEST_CONNECT_ASSERTION_SQL,
2666
- warehouse2.query
3271
+ warehouse3.query
2667
3272
  );
2668
3273
  return {
2669
3274
  pipelineId: pipeline.pipeline_id ?? id,
@@ -2703,7 +3308,7 @@ function genieCheck() {
2703
3308
  description: "Genie space is accessible and can optionally start a grounded conversation",
2704
3309
  configured: (env) => required2(env, names).length === 0,
2705
3310
  async run({ env, client }) {
2706
- requireEnv(env, names);
3311
+ requireEnv2(env, names);
2707
3312
  const api = adapter(client);
2708
3313
  const id = env.DBX_TEST_GENIE_SPACE_ID;
2709
3314
  const space = await api.genieSpace(id);
@@ -2733,7 +3338,7 @@ function mlflowLifecycleCheck() {
2733
3338
  description: "MLflow experiment and Unity Catalog model version are accessible",
2734
3339
  configured: (env) => required2(env, names).length === 0,
2735
3340
  async run({ env, client }) {
2736
- requireEnv(env, names);
3341
+ requireEnv2(env, names);
2737
3342
  const api = adapter(client);
2738
3343
  const experiment = await api.experiment(env.DBX_TEST_MLFLOW_EXPERIMENT_ID);
2739
3344
  const model = await api.registeredModel(env.DBX_TEST_REGISTERED_MODEL);
@@ -2757,8 +3362,8 @@ function featureEngineeringServingCheck() {
2757
3362
  configured: (env) => Boolean(
2758
3363
  env.DBX_TEST_FEATURE_TABLE && env.DBX_TEST_FEATURE_ASSERTION_SQL && (env.DBX_TEST_ONLINE_TABLE || env.DBX_TEST_FEATURE_SERVING_PIPELINE_ID)
2759
3364
  ),
2760
- async run({ env, client, warehouse: warehouse2 }) {
2761
- requireEnv(env, ["DBX_TEST_FEATURE_TABLE"]);
3365
+ async run({ env, client, warehouse: warehouse3 }) {
3366
+ requireEnv2(env, ["DBX_TEST_FEATURE_TABLE"]);
2762
3367
  if (!env.DBX_TEST_ONLINE_TABLE && !env.DBX_TEST_FEATURE_SERVING_PIPELINE_ID) {
2763
3368
  throw new Error(
2764
3369
  "Feature serving requires DBX_TEST_ONLINE_TABLE or DBX_TEST_FEATURE_SERVING_PIPELINE_ID"
@@ -2781,7 +3386,7 @@ function featureEngineeringServingCheck() {
2781
3386
  assertNotFailed("Synced Table pipeline", state);
2782
3387
  servingResource = pipeline.pipeline_id ?? pipelineId;
2783
3388
  }
2784
- await booleanSql("Feature freshness", env.DBX_TEST_FEATURE_ASSERTION_SQL, warehouse2.query);
3389
+ await booleanSql("Feature freshness", env.DBX_TEST_FEATURE_ASSERTION_SQL, warehouse3.query);
2785
3390
  return {
2786
3391
  featureTable: source.full_name ?? env.DBX_TEST_FEATURE_TABLE,
2787
3392
  servingResource,
@@ -2801,7 +3406,7 @@ function modelServingCheck() {
2801
3406
  description: "Model Serving endpoint is ready and can optionally serve an inference request",
2802
3407
  configured: (env) => required2(env, names).length === 0,
2803
3408
  async run({ env, client }) {
2804
- requireEnv(env, names);
3409
+ requireEnv2(env, names);
2805
3410
  if (env.DBX_TEST_AI_GATEWAY_REQUIRED !== "1") {
2806
3411
  throw new Error("DBX_TEST_AI_GATEWAY_REQUIRED must be 1 for the Model Serving target pack");
2807
3412
  }
@@ -2837,7 +3442,7 @@ function evalJudgeModelServingCheck() {
2837
3442
  description: "Databricks Model Serving satisfies the deterministic evaluator chat contract",
2838
3443
  configured: (env) => required2(env, names).length === 0,
2839
3444
  async run({ env, client }) {
2840
- requireEnv(env, names);
3445
+ requireEnv2(env, names);
2841
3446
  const api = adapter(client);
2842
3447
  const name = env.DBX_TEST_EVAL_SERVING_ENDPOINT;
2843
3448
  const endpoint = await api.servingEndpoint(name);
@@ -2877,7 +3482,7 @@ function vectorSearchCheck() {
2877
3482
  description: "Vector Search endpoint and index are online",
2878
3483
  configured: (env) => required2(env, names).length === 0,
2879
3484
  async run({ env, client }) {
2880
- requireEnv(env, names);
3485
+ requireEnv2(env, names);
2881
3486
  const api = adapter(client);
2882
3487
  const endpoint = await api.vectorSearchEndpoint(env.DBX_TEST_VECTOR_ENDPOINT);
2883
3488
  assertReady("Vector Search endpoint", endpoint.endpoint_status?.state, ["ONLINE", "READY"]);
@@ -2904,7 +3509,7 @@ function ragAgentCheck() {
2904
3509
  description: "RAG retrieval and agent serving endpoint return non-empty responses",
2905
3510
  configured: (env) => required2(env, names).length === 0,
2906
3511
  async run({ env, client }) {
2907
- requireEnv(env, names);
3512
+ requireEnv2(env, names);
2908
3513
  const api = adapter(client);
2909
3514
  let retrieval;
2910
3515
  if (env.DBX_TEST_VECTOR_QUERY_JSON) {
@@ -2948,13 +3553,13 @@ function federationSharingCleanRoomsCheck() {
2948
3553
  id: "federation-sharing-cleanrooms",
2949
3554
  description: "Lakehouse Federation connection, Delta Share and Clean Room are accessible",
2950
3555
  configured: (env) => required2(env, names).length === 0,
2951
- async run({ env, client, warehouse: warehouse2 }) {
2952
- requireEnv(env, names);
3556
+ async run({ env, client, warehouse: warehouse3 }) {
3557
+ requireEnv2(env, names);
2953
3558
  const api = adapter(client);
2954
3559
  const connection = await api.connection(env.DBX_TEST_CONNECTION);
2955
3560
  const share = await api.share(env.DBX_TEST_SHARE);
2956
3561
  const room = await api.cleanRoom(env.DBX_TEST_CLEAN_ROOM);
2957
- await booleanSql("Federated query", env.DBX_TEST_FEDERATION_ASSERTION_SQL, warehouse2.query);
3562
+ await booleanSql("Federated query", env.DBX_TEST_FEDERATION_ASSERTION_SQL, warehouse3.query);
2958
3563
  return {
2959
3564
  connection: connection.name ?? env.DBX_TEST_CONNECTION,
2960
3565
  share: share.name ?? env.DBX_TEST_SHARE,
@@ -2973,8 +3578,8 @@ function securityPostureCostCheck() {
2973
3578
  id: "security-cost",
2974
3579
  description: "Network access controls, compute policy and cost guardrail are enforced",
2975
3580
  configured: (env) => required2(env, names).length === 0,
2976
- async run({ env, client, warehouse: warehouse2 }) {
2977
- requireEnv(env, names);
3581
+ async run({ env, client, warehouse: warehouse3 }) {
3582
+ requireEnv2(env, names);
2978
3583
  const api = adapter(client);
2979
3584
  const access = await api.ipAccessList(env.DBX_TEST_IP_ACCESS_LIST_ID);
2980
3585
  if (access.enabled === false) throw new Error("Configured IP access list is disabled");
@@ -2984,7 +3589,7 @@ function securityPostureCostCheck() {
2984
3589
  if (env.DBX_TEST_EXPECT_HOST_SUFFIX && !env.DATABRICKS_HOST?.endsWith(env.DBX_TEST_EXPECT_HOST_SUFFIX)) {
2985
3590
  throw new Error(`Workspace host does not end with ${env.DBX_TEST_EXPECT_HOST_SUFFIX}`);
2986
3591
  }
2987
- await booleanSql("Cost guardrail", env.DBX_TEST_COST_ASSERTION_SQL, warehouse2.query);
3592
+ await booleanSql("Cost guardrail", env.DBX_TEST_COST_ASSERTION_SQL, warehouse3.query);
2988
3593
  return {
2989
3594
  ipAccessList: access.list_id ?? env.DBX_TEST_IP_ACCESS_LIST_ID,
2990
3595
  policy: policy.policy_id ?? policy.name,
@@ -2993,6 +3598,201 @@ function securityPostureCostCheck() {
2993
3598
  }
2994
3599
  };
2995
3600
  }
3601
+ function mlflow3GenAiQualityCheck() {
3602
+ const names = [
3603
+ "DBX_TEST_MLFLOW3_JOB_ID",
3604
+ "DBX_TEST_MLFLOW3_TRACE_ASSERTION_SQL",
3605
+ "DBX_TEST_MLFLOW3_EVAL_ASSERTION_SQL",
3606
+ "DBX_TEST_MLFLOW3_SCORER_ASSERTION_SQL",
3607
+ "DBX_TEST_MLFLOW3_MONITOR_ASSERTION_SQL",
3608
+ "DBX_TEST_AI_SEARCH_EVAL_ASSERTION_SQL"
3609
+ ];
3610
+ return {
3611
+ id: "mlflow3-genai-quality",
3612
+ description: "MLflow 3 tracing, offline agent evaluation and production scorer monitoring produce durable evidence",
3613
+ configured: (env) => required2(env, names).length === 0,
3614
+ async run({ env, client, warehouse: warehouse3 }) {
3615
+ requireEnv2(env, names);
3616
+ const job = await runCertificationJob(
3617
+ "MLflow 3 GenAI",
3618
+ env.DBX_TEST_MLFLOW3_JOB_ID,
3619
+ env,
3620
+ client,
3621
+ { timeoutMs: Number(env.DBX_TEST_MLFLOW3_TIMEOUT_MS ?? 72e5) }
3622
+ );
3623
+ await booleanSql("MLflow 3 trace", env.DBX_TEST_MLFLOW3_TRACE_ASSERTION_SQL, warehouse3.query);
3624
+ await booleanSql(
3625
+ "MLflow 3 offline evaluation",
3626
+ env.DBX_TEST_MLFLOW3_EVAL_ASSERTION_SQL,
3627
+ warehouse3.query
3628
+ );
3629
+ await booleanSql(
3630
+ "MLflow 3 production scorer lifecycle",
3631
+ env.DBX_TEST_MLFLOW3_SCORER_ASSERTION_SQL,
3632
+ warehouse3.query
3633
+ );
3634
+ await booleanSql(
3635
+ "MLflow 3 production monitoring",
3636
+ env.DBX_TEST_MLFLOW3_MONITOR_ASSERTION_SQL,
3637
+ warehouse3.query
3638
+ );
3639
+ await booleanSql(
3640
+ "AI Search retrieval quality",
3641
+ env.DBX_TEST_AI_SEARCH_EVAL_ASSERTION_SQL,
3642
+ warehouse3.query
3643
+ );
3644
+ return {
3645
+ ...job,
3646
+ traces: true,
3647
+ offlineEvaluation: true,
3648
+ scorerLifecycle: true,
3649
+ monitor: true,
3650
+ aiSearchEvaluation: true
3651
+ };
3652
+ }
3653
+ };
3654
+ }
3655
+ function agentEvaluationPipelineCheck() {
3656
+ const names = ["DBX_TEST_AGENT_EVAL_E2E_JOB_ID", "DBX_TEST_AGENT_EVAL_ASSERTION_SQL"];
3657
+ return {
3658
+ id: "agent-evaluation-pipeline",
3659
+ description: "Experiments API, outbox, Temporal worker, Model Serving judge, SQL score sink and Quality completion execute end to end",
3660
+ configured: (env) => required2(env, names).length === 0,
3661
+ async run({ env, client, warehouse: warehouse3 }) {
3662
+ requireEnv2(env, names);
3663
+ const job = await runCertificationJob(
3664
+ "Agent evaluation end-to-end",
3665
+ env.DBX_TEST_AGENT_EVAL_E2E_JOB_ID,
3666
+ env,
3667
+ client
3668
+ );
3669
+ await booleanSql(
3670
+ "Agent evaluation terminal Quality evidence",
3671
+ env.DBX_TEST_AGENT_EVAL_ASSERTION_SQL,
3672
+ warehouse3.query
3673
+ );
3674
+ return { ...job, api: true, outbox: true, temporal: true, judged: true, persisted: true };
3675
+ }
3676
+ };
3677
+ }
3678
+ function managedMcpAgentsCheck() {
3679
+ const names = [
3680
+ "DBX_TEST_MCP_JOB_ID",
3681
+ "DBX_TEST_MCP_MANAGED_ASSERTION_SQL",
3682
+ "DBX_TEST_MCP_SERVICE_ASSERTION_SQL",
3683
+ "DBX_TEST_MCP_DENY_ASSERTION_SQL"
3684
+ ];
3685
+ return {
3686
+ id: "managed-mcp-agents",
3687
+ description: "Managed MCP and Unity Catalog MCP Services support list, call and deny behavior",
3688
+ configured: (env) => required2(env, names).length === 0,
3689
+ async run({ env, client, warehouse: warehouse3 }) {
3690
+ requireEnv2(env, names);
3691
+ const job = await runCertificationJob("Databricks MCP", env.DBX_TEST_MCP_JOB_ID, env, client);
3692
+ await booleanSql(
3693
+ "Managed MCP list/call",
3694
+ env.DBX_TEST_MCP_MANAGED_ASSERTION_SQL,
3695
+ warehouse3.query
3696
+ );
3697
+ await booleanSql(
3698
+ "Unity Catalog MCP Service list/call",
3699
+ env.DBX_TEST_MCP_SERVICE_ASSERTION_SQL,
3700
+ warehouse3.query
3701
+ );
3702
+ await booleanSql(
3703
+ "MCP excluded-tool denial",
3704
+ env.DBX_TEST_MCP_DENY_ASSERTION_SQL,
3705
+ warehouse3.query
3706
+ );
3707
+ return { ...job, managedServer: true, mcpService: true, denyControl: true };
3708
+ }
3709
+ };
3710
+ }
3711
+ function dataQualityAppTelemetryCheck() {
3712
+ const names = [
3713
+ "DBX_TEST_TELEMETRY_APP_NAME",
3714
+ "DBX_TEST_DQM_ASSERTION_SQL",
3715
+ "DBX_TEST_APP_LOGS_ASSERTION_SQL",
3716
+ "DBX_TEST_APP_SPANS_ASSERTION_SQL",
3717
+ "DBX_TEST_APP_METRICS_ASSERTION_SQL"
3718
+ ];
3719
+ return {
3720
+ id: "data-quality-app-telemetry",
3721
+ description: "Unity Catalog data quality monitoring and Databricks Apps logs, spans and metrics are current",
3722
+ configured: (env) => required2(env, names).length === 0,
3723
+ async run({ env, client, warehouse: warehouse3 }) {
3724
+ requireEnv2(env, names);
3725
+ const appName = env.DBX_TEST_TELEMETRY_APP_NAME;
3726
+ const app = await adapter(client).app(appName);
3727
+ const destinations = Array.isArray(app.telemetry_export_destinations) ? app.telemetry_export_destinations : [];
3728
+ const unityCatalog = destinations.find(
3729
+ (destination) => isObject(destination) && isObject(destination.unity_catalog)
3730
+ );
3731
+ if (!isObject(unityCatalog) || !isObject(unityCatalog.unity_catalog)) {
3732
+ throw new Error(`Databricks App ${appName} has no Unity Catalog telemetry destination`);
3733
+ }
3734
+ const tables = unityCatalog.unity_catalog;
3735
+ for (const field of ["logs_table", "traces_table", "metrics_table"]) {
3736
+ if (typeof tables[field] !== "string" || !tables[field]) {
3737
+ throw new Error(`Databricks App ${appName} telemetry destination has no ${field}`);
3738
+ }
3739
+ }
3740
+ await booleanSql("Data Quality Monitoring", env.DBX_TEST_DQM_ASSERTION_SQL, warehouse3.query);
3741
+ await booleanSql("App logs", env.DBX_TEST_APP_LOGS_ASSERTION_SQL, warehouse3.query);
3742
+ await booleanSql("App spans", env.DBX_TEST_APP_SPANS_ASSERTION_SQL, warehouse3.query);
3743
+ await booleanSql("App metrics", env.DBX_TEST_APP_METRICS_ASSERTION_SQL, warehouse3.query);
3744
+ return { app: appName, unityCatalogTelemetry: true, dataQualityMonitoring: true };
3745
+ }
3746
+ };
3747
+ }
3748
+ function agentServicesEnrollmentCheck() {
3749
+ const names = [
3750
+ "DBX_TEST_AGENT_SERVICE_FULL_NAME",
3751
+ "DBX_TEST_AGENT_SERVICE_CONNECTION",
3752
+ "DBX_TEST_AGENT_SERVICE_EXECUTE_PRINCIPAL"
3753
+ ];
3754
+ return {
3755
+ id: "agent-services-enrollment",
3756
+ description: "A customer-owned Harness agent is registered as an external Unity Catalog Agent Service with governed access",
3757
+ configured: (env) => required2(env, names).length === 0,
3758
+ async run({ env, client }) {
3759
+ requireEnv2(env, names);
3760
+ const fullName = env.DBX_TEST_AGENT_SERVICE_FULL_NAME;
3761
+ const api = adapter(client);
3762
+ const service = await api.agentService(fullName);
3763
+ if (service.agent_service_type !== "AGENT_SERVICE_TYPE_EXTERNAL") {
3764
+ throw new Error(`${fullName} is not an external Agent Service`);
3765
+ }
3766
+ const expectedConnection = env.DBX_TEST_AGENT_SERVICE_CONNECTION;
3767
+ const actualConnection = service.config?.connection?.name ?? "";
3768
+ if (actualConnection !== expectedConnection && actualConnection.split("/").at(-1) !== expectedConnection) {
3769
+ throw new Error(`${fullName} uses unexpected connection ${actualConnection || "UNKNOWN"}`);
3770
+ }
3771
+ if (!service.config?.base_path?.startsWith("/")) {
3772
+ throw new Error(`${fullName} has no absolute external base path`);
3773
+ }
3774
+ const permissions = await api.agentServicePermissions(fullName);
3775
+ const assignments = Array.isArray(permissions.privilege_assignments) ? permissions.privilege_assignments : [];
3776
+ const expectedPrincipal = env.DBX_TEST_AGENT_SERVICE_EXECUTE_PRINCIPAL;
3777
+ const assignment = assignments.find(
3778
+ (entry) => isObject(entry) && entry.principal === expectedPrincipal
3779
+ );
3780
+ const privileges = isObject(assignment) && Array.isArray(assignment.privileges) ? assignment.privileges : [];
3781
+ const canExecute = privileges.some(
3782
+ (privilege) => isObject(privilege) && privilege.privilege === "EXECUTE"
3783
+ );
3784
+ if (!canExecute) {
3785
+ throw new Error(`${expectedPrincipal} does not have EXECUTE on ${fullName}`);
3786
+ }
3787
+ return {
3788
+ fullName: service.full_name ?? service.name ?? fullName,
3789
+ connection: actualConnection,
3790
+ executePrincipal: expectedPrincipal,
3791
+ runtimeInvocationAvailable: false
3792
+ };
3793
+ }
3794
+ };
3795
+ }
2996
3796
  function regionalDrCheck(options = {}) {
2997
3797
  const names = [
2998
3798
  "DBX_TEST_DR_HOST",
@@ -3004,7 +3804,7 @@ function regionalDrCheck(options = {}) {
3004
3804
  description: "Secondary-region workspace authentication and SQL warehouse are reachable",
3005
3805
  configured: (env) => required2(env, names).length === 0,
3006
3806
  async run({ env }) {
3007
- requireEnv(env, names);
3807
+ requireEnv2(env, names);
3008
3808
  const drEnv = {
3009
3809
  ...env,
3010
3810
  DATABRICKS_HOST: env.DBX_TEST_DR_HOST,
@@ -3034,14 +3834,14 @@ function regionalDrCheck(options = {}) {
3034
3834
  }
3035
3835
 
3036
3836
  // src/advanced-target-packs.ts
3037
- var DOCS2 = "https://experiments.fabric.pro/docs/testing/target-packs/";
3038
- var AZURE_M2M_SCOPE = "Azure Databricks, dedicated service principal using OAuth M2M, public network path; named managed or disposable certification fixtures";
3039
- var workspace = {
3837
+ var DOCS3 = "https://experiments.fabric.pro/docs/testing/target-packs/";
3838
+ var AZURE_M2M_SCOPE2 = "Azure Databricks, dedicated service principal using OAuth M2M, public network path; named managed or disposable certification fixtures";
3839
+ var workspace2 = {
3040
3840
  id: "workspace",
3041
3841
  description: "Databricks workspace host",
3042
3842
  anyOf: ["DATABRICKS_HOST"]
3043
3843
  };
3044
- var auth = {
3844
+ var auth2 = {
3045
3845
  id: "authentication",
3046
3846
  description: "Databricks OAuth, OIDC, bearer, or PAT authentication",
3047
3847
  anyOf: [
@@ -3053,12 +3853,12 @@ var auth = {
3053
3853
  ],
3054
3854
  secret: true
3055
3855
  };
3056
- var warehouse = {
3856
+ var warehouse2 = {
3057
3857
  id: "warehouse",
3058
3858
  description: "SQL warehouse for data-plane assertions",
3059
3859
  anyOf: ["DATABRICKS_WAREHOUSE_ID", "DATABRICKS_HTTP_PATH"]
3060
3860
  };
3061
- var requirement = (id, description, ...anyOf) => ({
3861
+ var requirement2 = (id, description, ...anyOf) => ({
3062
3862
  id,
3063
3863
  description,
3064
3864
  anyOf
@@ -3077,33 +3877,33 @@ function createAdvancedStreamingTargetPack() {
3077
3877
  "lakeflow-connect.replication"
3078
3878
  ],
3079
3879
  checks: () => [restrictedPrincipalCheck(), advancedStreamingCdcCheck(), lakeflowConnectCheck()],
3080
- requiredChecks: ["streaming-cdc", "lakeflow-connect"],
3880
+ requiredChecks: ["restricted-principal", "streaming-cdc", "lakeflow-connect"],
3081
3881
  requirements: [
3082
- workspace,
3083
- auth,
3084
- warehouse,
3085
- requirement("streaming-pipeline", "Streaming pipeline ID", "DBX_TEST_STREAMING_PIPELINE_ID"),
3086
- requirement("streaming-table", "Streaming target table", "DBX_TEST_STREAMING_TABLE"),
3087
- requirement(
3882
+ workspace2,
3883
+ auth2,
3884
+ warehouse2,
3885
+ requirement2("streaming-pipeline", "Streaming pipeline ID", "DBX_TEST_STREAMING_PIPELINE_ID"),
3886
+ requirement2("streaming-table", "Streaming target table", "DBX_TEST_STREAMING_TABLE"),
3887
+ requirement2(
3088
3888
  "connect-pipeline",
3089
3889
  "Lakeflow Connect ingestion pipeline",
3090
3890
  "DBX_TEST_CONNECT_PIPELINE_ID"
3091
3891
  ),
3092
- requirement(
3892
+ requirement2(
3093
3893
  "streaming-assertion",
3094
3894
  "Streaming freshness SQL",
3095
3895
  "DBX_TEST_STREAMING_ASSERTION_SQL"
3096
3896
  ),
3097
- requirement("cdc-assertion", "CDC correctness SQL", "DBX_TEST_CDC_ASSERTION_SQL"),
3098
- requirement(
3897
+ requirement2("cdc-assertion", "CDC correctness SQL", "DBX_TEST_CDC_ASSERTION_SQL"),
3898
+ requirement2(
3099
3899
  "connect-assertion",
3100
3900
  "Lakeflow Connect replication SQL",
3101
3901
  "DBX_TEST_CONNECT_ASSERTION_SQL"
3102
3902
  )
3103
3903
  ],
3104
- docsUrl: `${DOCS2}#advanced-streaming-cdc-and-lakeflow-connect`,
3904
+ docsUrl: `${DOCS3}#advanced-streaming-cdc-and-lakeflow-connect`,
3105
3905
  certificationScopes: [
3106
- `${AZURE_M2M_SCOPE}; serverless Lakeflow pipeline AUTO CDC and query-based PostgreSQL foreign-catalog ingestion`
3906
+ `${AZURE_M2M_SCOPE2}; serverless Lakeflow pipeline AUTO CDC and query-based PostgreSQL foreign-catalog ingestion`
3107
3907
  ]
3108
3908
  });
3109
3909
  }
@@ -3116,21 +3916,21 @@ function createAiBiGenieTargetPack() {
3116
3916
  maturity: "live-gated",
3117
3917
  capabilities: ["aibi.dashboard", "genie.space", "genie.conversation"],
3118
3918
  checks: () => [restrictedPrincipalCheck(), aiBiDashboardCheck(), genieCheck()],
3119
- requiredChecks: ["aibi-dashboard", "genie"],
3919
+ requiredChecks: ["restricted-principal", "aibi-dashboard", "genie"],
3120
3920
  requirements: [
3121
- workspace,
3122
- auth,
3123
- requirement("dashboard", "AI/BI dashboard ID", "DBX_TEST_DASHBOARD_ID"),
3124
- requirement("genie-space", "Genie space ID", "DBX_TEST_GENIE_SPACE_ID"),
3125
- requirement(
3921
+ workspace2,
3922
+ auth2,
3923
+ requirement2("dashboard", "AI/BI dashboard ID", "DBX_TEST_DASHBOARD_ID"),
3924
+ requirement2("genie-space", "Genie space ID", "DBX_TEST_GENIE_SPACE_ID"),
3925
+ requirement2(
3126
3926
  "genie-question",
3127
3927
  "Grounded Genie certification question",
3128
3928
  "DBX_TEST_GENIE_QUESTION"
3129
3929
  )
3130
3930
  ],
3131
- docsUrl: `${DOCS2}#aibi-dashboards-and-genie`,
3931
+ docsUrl: `${DOCS3}#aibi-dashboards-and-genie`,
3132
3932
  certificationScopes: [
3133
- `${AZURE_M2M_SCOPE}; published AI/BI dashboard revision and Genie conversation start`
3933
+ `${AZURE_M2M_SCOPE2}; published AI/BI dashboard revision and Genie conversation start`
3134
3934
  ]
3135
3935
  });
3136
3936
  }
@@ -3148,21 +3948,21 @@ function createMlflowLifecycleTargetPack() {
3148
3948
  "models.lifecycle"
3149
3949
  ],
3150
3950
  checks: () => [restrictedPrincipalCheck(), mlflowLifecycleCheck()],
3151
- requiredChecks: ["mlflow-lifecycle"],
3951
+ requiredChecks: ["restricted-principal", "mlflow-lifecycle"],
3152
3952
  requirements: [
3153
- workspace,
3154
- auth,
3155
- requirement("experiment", "MLflow experiment ID", "DBX_TEST_MLFLOW_EXPERIMENT_ID"),
3156
- requirement(
3953
+ workspace2,
3954
+ auth2,
3955
+ requirement2("experiment", "MLflow experiment ID", "DBX_TEST_MLFLOW_EXPERIMENT_ID"),
3956
+ requirement2(
3157
3957
  "registered-model",
3158
3958
  "Unity Catalog registered model",
3159
3959
  "DBX_TEST_REGISTERED_MODEL"
3160
3960
  ),
3161
- requirement("model-version", "Registered model version", "DBX_TEST_MODEL_VERSION")
3961
+ requirement2("model-version", "Registered model version", "DBX_TEST_MODEL_VERSION")
3162
3962
  ],
3163
- docsUrl: `${DOCS2}#mlflow-and-model-lifecycle`,
3963
+ docsUrl: `${DOCS3}#mlflow-and-model-lifecycle`,
3164
3964
  certificationScopes: [
3165
- `${AZURE_M2M_SCOPE}; MLflow experiment and configured Unity Catalog model version`
3965
+ `${AZURE_M2M_SCOPE2}; MLflow experiment and configured Unity Catalog model version`
3166
3966
  ]
3167
3967
  });
3168
3968
  }
@@ -3180,27 +3980,27 @@ function createFeatureEngineeringTargetPack() {
3180
3980
  "features.serving"
3181
3981
  ],
3182
3982
  checks: () => [restrictedPrincipalCheck(), featureEngineeringServingCheck()],
3183
- requiredChecks: ["feature-engineering"],
3983
+ requiredChecks: ["restricted-principal", "feature-engineering"],
3184
3984
  requirements: [
3185
- workspace,
3186
- auth,
3187
- warehouse,
3188
- requirement("feature-table", "Unity Catalog feature table", "DBX_TEST_FEATURE_TABLE"),
3189
- requirement(
3985
+ workspace2,
3986
+ auth2,
3987
+ warehouse2,
3988
+ requirement2("feature-table", "Unity Catalog feature table", "DBX_TEST_FEATURE_TABLE"),
3989
+ requirement2(
3190
3990
  "online-materialization",
3191
3991
  "Databricks Online Table or Synced Table pipeline",
3192
3992
  "DBX_TEST_ONLINE_TABLE",
3193
3993
  "DBX_TEST_FEATURE_SERVING_PIPELINE_ID"
3194
3994
  ),
3195
- requirement(
3995
+ requirement2(
3196
3996
  "feature-assertion",
3197
3997
  "Feature freshness/correctness SQL",
3198
3998
  "DBX_TEST_FEATURE_ASSERTION_SQL"
3199
3999
  )
3200
4000
  ],
3201
- docsUrl: `${DOCS2}#feature-engineering-and-serving`,
4001
+ docsUrl: `${DOCS3}#feature-engineering-and-serving`,
3202
4002
  certificationScopes: [
3203
- `${AZURE_M2M_SCOPE}; Delta feature table, PostgreSQL-backed Synced Table, and SQL freshness`
4003
+ `${AZURE_M2M_SCOPE2}; Delta feature table, PostgreSQL-backed Synced Table, and SQL freshness`
3204
4004
  ]
3205
4005
  });
3206
4006
  }
@@ -3217,25 +4017,25 @@ function createModelServingTargetPack() {
3217
4017
  "ai-gateway.configuration"
3218
4018
  ],
3219
4019
  checks: () => [restrictedPrincipalCheck(), modelServingCheck()],
3220
- requiredChecks: ["model-serving"],
4020
+ requiredChecks: ["restricted-principal", "model-serving"],
3221
4021
  requirements: [
3222
- workspace,
3223
- auth,
3224
- requirement("serving-endpoint", "Model Serving endpoint name", "DBX_TEST_SERVING_ENDPOINT"),
3225
- requirement(
4022
+ workspace2,
4023
+ auth2,
4024
+ requirement2("serving-endpoint", "Model Serving endpoint name", "DBX_TEST_SERVING_ENDPOINT"),
4025
+ requirement2(
3226
4026
  "serving-request",
3227
4027
  "Safe inference request JSON",
3228
4028
  "DBX_TEST_SERVING_REQUEST_JSON"
3229
4029
  ),
3230
- requirement(
4030
+ requirement2(
3231
4031
  "ai-gateway",
3232
4032
  "AI Gateway enforcement flag set to 1",
3233
4033
  "DBX_TEST_AI_GATEWAY_REQUIRED"
3234
4034
  )
3235
4035
  ],
3236
- docsUrl: `${DOCS2}#model-serving-and-ai-gateway`,
4036
+ docsUrl: `${DOCS3}#model-serving-and-ai-gateway`,
3237
4037
  certificationScopes: [
3238
- `${AZURE_M2M_SCOPE}; custom-model inference and AI Gateway inference-table configuration`
4038
+ `${AZURE_M2M_SCOPE2}; custom-model inference and AI Gateway inference-table configuration`
3239
4039
  ]
3240
4040
  });
3241
4041
  }
@@ -3253,19 +4053,19 @@ function createVectorRagAgentsTargetPack() {
3253
4053
  "agents.serving"
3254
4054
  ],
3255
4055
  checks: () => [restrictedPrincipalCheck(), vectorSearchCheck(), ragAgentCheck()],
3256
- requiredChecks: ["vector-search", "rag-agent"],
4056
+ requiredChecks: ["restricted-principal", "vector-search", "rag-agent"],
3257
4057
  requirements: [
3258
- workspace,
3259
- auth,
3260
- requirement("vector-endpoint", "Vector Search endpoint", "DBX_TEST_VECTOR_ENDPOINT"),
3261
- requirement("vector-index", "Vector Search index", "DBX_TEST_VECTOR_INDEX"),
3262
- requirement("vector-query", "Vector retrieval request JSON", "DBX_TEST_VECTOR_QUERY_JSON"),
3263
- requirement("agent-endpoint", "Agent serving endpoint", "DBX_TEST_AGENT_ENDPOINT"),
3264
- requirement("agent-request", "Safe agent request JSON", "DBX_TEST_AGENT_REQUEST_JSON")
4058
+ workspace2,
4059
+ auth2,
4060
+ requirement2("vector-endpoint", "Vector Search endpoint", "DBX_TEST_VECTOR_ENDPOINT"),
4061
+ requirement2("vector-index", "Vector Search index", "DBX_TEST_VECTOR_INDEX"),
4062
+ requirement2("vector-query", "Vector retrieval request JSON", "DBX_TEST_VECTOR_QUERY_JSON"),
4063
+ requirement2("agent-endpoint", "Agent serving endpoint", "DBX_TEST_AGENT_ENDPOINT"),
4064
+ requirement2("agent-request", "Safe agent request JSON", "DBX_TEST_AGENT_REQUEST_JSON")
3265
4065
  ],
3266
- docsUrl: `${DOCS2}#vector-search-rag-and-agents`,
4066
+ docsUrl: `${DOCS3}#vector-search-rag-and-agents`,
3267
4067
  certificationScopes: [
3268
- `${AZURE_M2M_SCOPE}; Delta Sync vector retrieval and custom PyFunc agent invocation`
4068
+ `${AZURE_M2M_SCOPE2}; Delta Sync vector retrieval and custom PyFunc agent invocation`
3269
4069
  ]
3270
4070
  });
3271
4071
  }
@@ -3283,23 +4083,23 @@ function createFederationSharingTargetPack() {
3283
4083
  "clean-rooms.access"
3284
4084
  ],
3285
4085
  checks: () => [restrictedPrincipalCheck(), federationSharingCleanRoomsCheck()],
3286
- requiredChecks: ["federation-sharing-cleanrooms"],
4086
+ requiredChecks: ["restricted-principal", "federation-sharing-cleanrooms"],
3287
4087
  requirements: [
3288
- workspace,
3289
- auth,
3290
- warehouse,
3291
- requirement("connection", "Lakehouse Federation connection", "DBX_TEST_CONNECTION"),
3292
- requirement("share", "Delta Sharing share", "DBX_TEST_SHARE"),
3293
- requirement("clean-room", "Clean Room name", "DBX_TEST_CLEAN_ROOM"),
3294
- requirement(
4088
+ workspace2,
4089
+ auth2,
4090
+ warehouse2,
4091
+ requirement2("connection", "Lakehouse Federation connection", "DBX_TEST_CONNECTION"),
4092
+ requirement2("share", "Delta Sharing share", "DBX_TEST_SHARE"),
4093
+ requirement2("clean-room", "Clean Room name", "DBX_TEST_CLEAN_ROOM"),
4094
+ requirement2(
3295
4095
  "federation-assertion",
3296
4096
  "Federated data-plane SQL",
3297
4097
  "DBX_TEST_FEDERATION_ASSERTION_SQL"
3298
4098
  )
3299
4099
  ],
3300
- docsUrl: `${DOCS2}#federation-delta-sharing-and-clean-rooms`,
4100
+ docsUrl: `${DOCS3}#federation-delta-sharing-and-clean-rooms`,
3301
4101
  certificationScopes: [
3302
- `${AZURE_M2M_SCOPE}; managed PostgreSQL federation, Delta Sharing table, and two-metastore Clean Room`
4102
+ `${AZURE_M2M_SCOPE2}; managed PostgreSQL federation, Delta Sharing table, and two-metastore Clean Room`
3303
4103
  ]
3304
4104
  });
3305
4105
  }
@@ -3317,25 +4117,253 @@ function createSecurityCostDrTargetPack() {
3317
4117
  "dr.secondary-region"
3318
4118
  ],
3319
4119
  checks: () => [restrictedPrincipalCheck(), securityPostureCostCheck(), regionalDrCheck()],
3320
- requiredChecks: ["security-cost", "regional-dr"],
4120
+ requiredChecks: ["restricted-principal", "security-cost", "regional-dr"],
3321
4121
  requirements: [
3322
- workspace,
3323
- auth,
3324
- warehouse,
3325
- requirement(
4122
+ workspace2,
4123
+ auth2,
4124
+ warehouse2,
4125
+ requirement2(
3326
4126
  "ip-access-list",
3327
4127
  "Enabled workspace IP access list",
3328
4128
  "DBX_TEST_IP_ACCESS_LIST_ID"
3329
4129
  ),
3330
- requirement("cluster-policy", "Compute policy ID", "DBX_TEST_CLUSTER_POLICY_ID"),
3331
- requirement("cost-assertion", "Boolean SQL cost guardrail", "DBX_TEST_COST_ASSERTION_SQL"),
3332
- requirement("dr-workspace", "Secondary workspace host", "DBX_TEST_DR_HOST"),
3333
- requirement("dr-warehouse", "Running secondary-region warehouse", "DBX_TEST_DR_WAREHOUSE_ID"),
3334
- requirement("dr-assertion", "Secondary-region workload SQL", "DBX_TEST_DR_ASSERTION_SQL")
4130
+ requirement2("cluster-policy", "Compute policy ID", "DBX_TEST_CLUSTER_POLICY_ID"),
4131
+ requirement2("cost-assertion", "Boolean SQL cost guardrail", "DBX_TEST_COST_ASSERTION_SQL"),
4132
+ requirement2("dr-workspace", "Secondary workspace host", "DBX_TEST_DR_HOST"),
4133
+ requirement2("dr-warehouse", "Running secondary-region warehouse", "DBX_TEST_DR_WAREHOUSE_ID"),
4134
+ requirement2("dr-assertion", "Secondary-region workload SQL", "DBX_TEST_DR_ASSERTION_SQL")
4135
+ ],
4136
+ docsUrl: `${DOCS3}#networking-security-cost-and-regional-dr`,
4137
+ certificationScopes: [
4138
+ `${AZURE_M2M_SCOPE2}; TEST-NET block list, bounded compute policy, billing system-table guardrail, and West US 3 serverless DR warehouse`
4139
+ ]
4140
+ });
4141
+ }
4142
+ function createMlflow3AgentQualityTargetPack() {
4143
+ return defineTargetPack({
4144
+ id: "mlflow3-agent-quality",
4145
+ name: "MLflow 3 agent quality and monitoring",
4146
+ description: "Native MLflow 3 traces, offline agent evaluation, production scorer lifecycle and online monitoring.",
4147
+ version: "1.0.0",
4148
+ maturity: "shipped",
4149
+ capabilities: [
4150
+ "mlflow3.tracing",
4151
+ "mlflow3.agent-evaluation",
4152
+ "mlflow3.production-scorers",
4153
+ "mlflow3.production-monitoring",
4154
+ "ai-search.retrieval-evaluation"
4155
+ ],
4156
+ checks: () => [restrictedPrincipalCheck(), mlflow3GenAiQualityCheck()],
4157
+ requiredChecks: ["restricted-principal", "mlflow3-genai-quality"],
4158
+ requirements: [
4159
+ workspace2,
4160
+ auth2,
4161
+ warehouse2,
4162
+ requirement2("mlflow3-job", "Native MLflow 3 certification Job", "DBX_TEST_MLFLOW3_JOB_ID"),
4163
+ requirement2(
4164
+ "mlflow3-traces",
4165
+ "Boolean SQL proving a fresh MLflow 3 trace",
4166
+ "DBX_TEST_MLFLOW3_TRACE_ASSERTION_SQL"
4167
+ ),
4168
+ requirement2(
4169
+ "mlflow3-evaluation",
4170
+ "Boolean SQL proving offline agent evaluation results",
4171
+ "DBX_TEST_MLFLOW3_EVAL_ASSERTION_SQL"
4172
+ ),
4173
+ requirement2(
4174
+ "mlflow3-scorers",
4175
+ "Boolean SQL proving production scorer lifecycle evidence",
4176
+ "DBX_TEST_MLFLOW3_SCORER_ASSERTION_SQL"
4177
+ ),
4178
+ requirement2(
4179
+ "mlflow3-monitoring",
4180
+ "Boolean SQL proving production monitoring output",
4181
+ "DBX_TEST_MLFLOW3_MONITOR_ASSERTION_SQL"
4182
+ ),
4183
+ requirement2(
4184
+ "ai-search-evaluation",
4185
+ "Boolean SQL proving AI Search retrieval-quality thresholds",
4186
+ "DBX_TEST_AI_SEARCH_EVAL_ASSERTION_SQL"
4187
+ )
4188
+ ],
4189
+ docsUrl: `${DOCS3}#mlflow-3-agent-quality-and-monitoring`,
4190
+ certificationScopes: [
4191
+ `${AZURE_M2M_SCOPE2}; Python-native MLflow 3 trace, evaluation, complete scorer lifecycle and monitor evidence`
4192
+ ]
4193
+ });
4194
+ }
4195
+ function createAgentEvaluationPipelineTargetPack() {
4196
+ return defineTargetPack({
4197
+ id: "agent-evaluation-pipeline",
4198
+ name: "Agent evaluation delivery pipeline",
4199
+ description: "Exact-candidate API submission, outbox dispatch, Temporal execution, Databricks judge inference, SQL score persistence and Quality completion.",
4200
+ version: "1.0.0",
4201
+ maturity: "live-gated",
4202
+ capabilities: [
4203
+ "agent-evals.api-submission",
4204
+ "agent-evals.temporal-dispatch",
4205
+ "agent-evals.model-serving-judge",
4206
+ "agent-evals.sql-persistence",
4207
+ "agent-evals.quality-evidence"
4208
+ ],
4209
+ checks: () => [
4210
+ restrictedPrincipalCheck(),
4211
+ evalJudgeModelServingCheck(),
4212
+ agentEvaluationPipelineCheck()
4213
+ ],
4214
+ requiredChecks: ["restricted-principal", "model-eval-judge", "agent-evaluation-pipeline"],
4215
+ requirements: [
4216
+ workspace2,
4217
+ auth2,
4218
+ warehouse2,
4219
+ requirement2(
4220
+ "eval-serving-endpoint",
4221
+ "Databricks Model Serving endpoint satisfying the evaluator chat contract",
4222
+ "DBX_TEST_EVAL_SERVING_ENDPOINT"
4223
+ ),
4224
+ requirement2(
4225
+ "agent-eval-job",
4226
+ "Exact-candidate end-to-end agent evaluation certification Job",
4227
+ "DBX_TEST_AGENT_EVAL_E2E_JOB_ID"
4228
+ ),
4229
+ requirement2(
4230
+ "agent-eval-evidence",
4231
+ "Boolean SQL proving terminal scores and Quality evidence",
4232
+ "DBX_TEST_AGENT_EVAL_ASSERTION_SQL"
4233
+ )
4234
+ ],
4235
+ docsUrl: `${DOCS3}#agent-evaluation-delivery-pipeline`,
4236
+ certificationScopes: [
4237
+ `${AZURE_M2M_SCOPE2}; Experiments API through customer worker and Databricks judge to SQL/Quality`
4238
+ ]
4239
+ });
4240
+ }
4241
+ function createManagedMcpAgentsTargetPack() {
4242
+ return defineTargetPack({
4243
+ id: "managed-mcp-agents",
4244
+ name: "Managed MCP and MCP Services",
4245
+ description: "Streamable HTTP tool discovery and calls for Databricks managed MCP servers and governed Unity Catalog MCP Services, including a deny control.",
4246
+ version: "1.0.0",
4247
+ maturity: "live-gated",
4248
+ capabilities: [
4249
+ "mcp.managed.list-call",
4250
+ "mcp.services.list-call",
4251
+ "mcp.unity-catalog-governance",
4252
+ "mcp.denial"
4253
+ ],
4254
+ checks: () => [restrictedPrincipalCheck(), managedMcpAgentsCheck()],
4255
+ requiredChecks: ["restricted-principal", "managed-mcp-agents"],
4256
+ requirements: [
4257
+ workspace2,
4258
+ auth2,
4259
+ warehouse2,
4260
+ requirement2("mcp-job", "Native Streamable HTTP MCP certification Job", "DBX_TEST_MCP_JOB_ID"),
4261
+ requirement2(
4262
+ "managed-mcp",
4263
+ "Boolean SQL proving managed MCP list/call behavior",
4264
+ "DBX_TEST_MCP_MANAGED_ASSERTION_SQL"
4265
+ ),
4266
+ requirement2(
4267
+ "mcp-service",
4268
+ "Boolean SQL proving UC MCP Service list/call behavior",
4269
+ "DBX_TEST_MCP_SERVICE_ASSERTION_SQL"
4270
+ ),
4271
+ requirement2(
4272
+ "mcp-denial",
4273
+ "Boolean SQL proving an MCP tool excluded by UC selectors was denied",
4274
+ "DBX_TEST_MCP_DENY_ASSERTION_SQL"
4275
+ )
4276
+ ],
4277
+ docsUrl: `${DOCS3}#managed-mcp-and-mcp-services`,
4278
+ certificationScopes: [
4279
+ `${AZURE_M2M_SCOPE2}; managed AI Search or SQL MCP plus a UC MCP Service over Streamable HTTP`
4280
+ ]
4281
+ });
4282
+ }
4283
+ function createDataQualityObservabilityTargetPack() {
4284
+ return defineTargetPack({
4285
+ id: "data-quality-observability",
4286
+ name: "Data quality and Databricks Apps observability",
4287
+ description: "Unity Catalog Data Quality Monitoring plus Databricks Apps OpenTelemetry logs, spans and metrics.",
4288
+ version: "1.0.0",
4289
+ maturity: "shipped",
4290
+ capabilities: [
4291
+ "data-quality.freshness-completeness",
4292
+ "apps.telemetry.logs",
4293
+ "apps.telemetry.traces",
4294
+ "apps.telemetry.metrics"
4295
+ ],
4296
+ checks: () => [restrictedPrincipalCheck(), dataQualityAppTelemetryCheck()],
4297
+ requiredChecks: ["restricted-principal", "data-quality-app-telemetry"],
4298
+ requirements: [
4299
+ workspace2,
4300
+ auth2,
4301
+ warehouse2,
4302
+ requirement2("telemetry-app", "App with UC telemetry export", "DBX_TEST_TELEMETRY_APP_NAME"),
4303
+ requirement2(
4304
+ "data-quality",
4305
+ "Boolean SQL over current Data Quality Monitoring results",
4306
+ "DBX_TEST_DQM_ASSERTION_SQL"
4307
+ ),
4308
+ requirement2(
4309
+ "app-logs",
4310
+ "Boolean SQL proving current app logs",
4311
+ "DBX_TEST_APP_LOGS_ASSERTION_SQL"
4312
+ ),
4313
+ requirement2(
4314
+ "app-spans",
4315
+ "Boolean SQL proving current app spans",
4316
+ "DBX_TEST_APP_SPANS_ASSERTION_SQL"
4317
+ ),
4318
+ requirement2(
4319
+ "app-metrics",
4320
+ "Boolean SQL proving current app metrics",
4321
+ "DBX_TEST_APP_METRICS_ASSERTION_SQL"
4322
+ )
4323
+ ],
4324
+ docsUrl: `${DOCS3}#data-quality-and-databricks-apps-observability`,
4325
+ certificationScopes: [
4326
+ `${AZURE_M2M_SCOPE2}; system.data_quality_monitoring.table_results and UC OTel tables`
4327
+ ]
4328
+ });
4329
+ }
4330
+ function createAgentServicesEnrollmentTargetPack() {
4331
+ return defineTargetPack({
4332
+ id: "agent-services-enrollment",
4333
+ name: "Unity Catalog Agent Services enrollment",
4334
+ description: "Customer-owned Fabric Harness agents registered as external Unity Catalog Agent Services with explicit EXECUTE grants.",
4335
+ version: "1.0.0",
4336
+ maturity: "shipped",
4337
+ capabilities: [
4338
+ "agent-services.external-registration",
4339
+ "agent-services.discovery",
4340
+ "agent-services.permissions",
4341
+ "harness.customer-worker-enrollment"
4342
+ ],
4343
+ checks: () => [restrictedPrincipalCheck(), agentServicesEnrollmentCheck()],
4344
+ requiredChecks: ["restricted-principal", "agent-services-enrollment"],
4345
+ requirements: [
4346
+ workspace2,
4347
+ auth2,
4348
+ requirement2(
4349
+ "agent-service",
4350
+ "External Unity Catalog Agent Service full name",
4351
+ "DBX_TEST_AGENT_SERVICE_FULL_NAME"
4352
+ ),
4353
+ requirement2(
4354
+ "agent-connection",
4355
+ "Expected Unity Catalog HTTP connection",
4356
+ "DBX_TEST_AGENT_SERVICE_CONNECTION"
4357
+ ),
4358
+ requirement2(
4359
+ "agent-execute-principal",
4360
+ "Principal expected to have EXECUTE",
4361
+ "DBX_TEST_AGENT_SERVICE_EXECUTE_PRINCIPAL"
4362
+ )
3335
4363
  ],
3336
- docsUrl: `${DOCS2}#networking-security-cost-and-regional-dr`,
4364
+ docsUrl: `${DOCS3}#unity-catalog-agent-services-enrollment`,
3337
4365
  certificationScopes: [
3338
- `${AZURE_M2M_SCOPE}; TEST-NET block list, bounded compute policy, billing system-table guardrail, and West US 3 serverless DR warehouse`
4366
+ `${AZURE_M2M_SCOPE2}; Agent Services Beta registration/discovery/ACL only; runtime invocation is not claimed`
3339
4367
  ]
3340
4368
  });
3341
4369
  }
@@ -3348,7 +4376,12 @@ function createAdvancedTargetPacks() {
3348
4376
  createModelServingTargetPack(),
3349
4377
  createVectorRagAgentsTargetPack(),
3350
4378
  createFederationSharingTargetPack(),
3351
- createSecurityCostDrTargetPack()
4379
+ createSecurityCostDrTargetPack(),
4380
+ createMlflow3AgentQualityTargetPack(),
4381
+ createManagedMcpAgentsTargetPack(),
4382
+ createDataQualityObservabilityTargetPack(),
4383
+ createAgentServicesEnrollmentTargetPack(),
4384
+ createAgentEvaluationPipelineTargetPack()
3352
4385
  ];
3353
4386
  }
3354
4387
 
@@ -3357,7 +4390,8 @@ function createBuiltinTargetPacks() {
3357
4390
  return [
3358
4391
  ...createFoundationTargetPacks(),
3359
4392
  createLakeflowJobsTargetPack(),
3360
- ...createAdvancedTargetPacks()
4393
+ ...createAdvancedTargetPacks(),
4394
+ ...createNextTargetPacks()
3361
4395
  ];
3362
4396
  }
3363
4397
  var builtinTargetPacks = createBuiltinTargetPacks();
@@ -3368,7 +4402,12 @@ init_workspace_client();
3368
4402
  exports.DatabricksAdvancedWorkloadsAdapter = DatabricksAdvancedWorkloadsAdapter;
3369
4403
  exports.DatabricksJobsAdapter = DatabricksJobsAdapter;
3370
4404
  exports.advancedStreamingCdcCheck = advancedStreamingCdcCheck;
4405
+ exports.agentEvaluationPipelineCheck = agentEvaluationPipelineCheck;
4406
+ exports.agentOrchestrationResponsesCheck = agentOrchestrationResponsesCheck;
4407
+ exports.agentServicesEnrollmentCheck = agentServicesEnrollmentCheck;
3371
4408
  exports.aiBiDashboardCheck = aiBiDashboardCheck;
4409
+ exports.aiFunctionsBatchInferenceCheck = aiFunctionsBatchInferenceCheck;
4410
+ exports.aiRuntimeTrainingCheck = aiRuntimeTrainingCheck;
3372
4411
  exports.appHealthCheck = appHealthCheck;
3373
4412
  exports.assertDeltaContract = assertDeltaContract;
3374
4413
  exports.autoLoaderIngestionCheck = autoLoaderIngestionCheck;
@@ -3378,10 +4417,17 @@ exports.classicComputeCheck = classicComputeCheck;
3378
4417
  exports.compareToGolden = compareToGolden;
3379
4418
  exports.createAdvancedStreamingTargetPack = createAdvancedStreamingTargetPack;
3380
4419
  exports.createAdvancedTargetPacks = createAdvancedTargetPacks;
4420
+ exports.createAgentEvaluationPipelineTargetPack = createAgentEvaluationPipelineTargetPack;
4421
+ exports.createAgentOrchestrationTargetPack = createAgentOrchestrationTargetPack;
4422
+ exports.createAgentServicesEnrollmentTargetPack = createAgentServicesEnrollmentTargetPack;
3381
4423
  exports.createAiBiGenieTargetPack = createAiBiGenieTargetPack;
4424
+ exports.createAiFunctionsBatchInferenceTargetPack = createAiFunctionsBatchInferenceTargetPack;
4425
+ exports.createAiRuntimeTrainingTargetPack = createAiRuntimeTrainingTargetPack;
3382
4426
  exports.createAppsOperationalFoundationPack = createAppsOperationalFoundationPack;
3383
4427
  exports.createBuiltinTargetPacks = createBuiltinTargetPacks;
3384
4428
  exports.createClientFromEnv = createClientFromEnv;
4429
+ exports.createDataQualityObservabilityTargetPack = createDataQualityObservabilityTargetPack;
4430
+ exports.createDeclarativeBundlesTargetPack = createDeclarativeBundlesTargetPack;
3385
4431
  exports.createDuckDbContext = createDuckDbContext;
3386
4432
  exports.createEphemeralLakebaseBranch = createEphemeralLakebaseBranch;
3387
4433
  exports.createExecutionContext = createExecutionContext;
@@ -3389,20 +4435,29 @@ exports.createFeatureEngineeringTargetPack = createFeatureEngineeringTargetPack;
3389
4435
  exports.createFederationSharingTargetPack = createFederationSharingTargetPack;
3390
4436
  exports.createFoundationTargetPacks = createFoundationTargetPacks;
3391
4437
  exports.createJobsCodeFoundationPack = createJobsCodeFoundationPack;
4438
+ exports.createLakebaseAutoscalingFeatureStoreTargetPack = createLakebaseAutoscalingFeatureStoreTargetPack;
3392
4439
  exports.createLakebaseTestProvider = createLakebaseTestProvider;
3393
4440
  exports.createLakeflowFoundationPack = createLakeflowFoundationPack;
3394
4441
  exports.createLakeflowJobsTargetPack = createLakeflowJobsTargetPack;
4442
+ exports.createLakehouseOptimizationTargetPack = createLakehouseOptimizationTargetPack;
4443
+ exports.createManagedMcpAgentsTargetPack = createManagedMcpAgentsTargetPack;
4444
+ exports.createMarketplaceOpenSharingTargetPack = createMarketplaceOpenSharingTargetPack;
4445
+ exports.createMlflow3AgentQualityTargetPack = createMlflow3AgentQualityTargetPack;
3395
4446
  exports.createMlflowLifecycleTargetPack = createMlflowLifecycleTargetPack;
3396
4447
  exports.createMockDatabricksClient = createMockDatabricksClient;
3397
4448
  exports.createModelServingTargetPack = createModelServingTargetPack;
4449
+ exports.createNextTargetPacks = createNextTargetPacks;
3398
4450
  exports.createSecurityCostDrTargetPack = createSecurityCostDrTargetPack;
4451
+ exports.createSemanticAnalyticsTargetPack = createSemanticAnalyticsTargetPack;
3399
4452
  exports.createSqlDeltaFoundationPack = createSqlDeltaFoundationPack;
3400
4453
  exports.createTargetPackRegistry = createTargetPackRegistry;
3401
4454
  exports.createUnityStorageFoundationPack = createUnityStorageFoundationPack;
3402
4455
  exports.createVectorRagAgentsTargetPack = createVectorRagAgentsTargetPack;
3403
4456
  exports.createWorkspaceContext = createWorkspaceContext;
3404
4457
  exports.customLiveCheck = customLiveCheck;
4458
+ exports.dataQualityAppTelemetryCheck = dataQualityAppTelemetryCheck;
3405
4459
  exports.dbtBuildCheck = dbtBuildCheck;
4460
+ exports.declarativeBundlesCheck = declarativeBundlesCheck;
3406
4461
  exports.defineLiveSuite = defineLiveSuite;
3407
4462
  exports.defineTargetPack = defineTargetPack;
3408
4463
  exports.defineTargetPackRun = defineTargetPackRun;
@@ -3422,9 +4477,14 @@ exports.genieCheck = genieCheck;
3422
4477
  exports.jobRunCheck = jobRunCheck;
3423
4478
  exports.jobsCertificationCheck = jobsCertificationCheck;
3424
4479
  exports.jobsOrchestrationCheck = jobsOrchestrationCheck;
4480
+ exports.lakebaseAutoscalingFeatureStoreCheck = lakebaseAutoscalingFeatureStoreCheck;
3425
4481
  exports.lakebaseCredentialCheck = lakebaseCredentialCheck;
3426
4482
  exports.lakebaseRoundTripCheck = lakebaseRoundTripCheck;
3427
4483
  exports.lakeflowConnectCheck = lakeflowConnectCheck;
4484
+ exports.lakehouseOptimizationCheck = lakehouseOptimizationCheck;
4485
+ exports.managedMcpAgentsCheck = managedMcpAgentsCheck;
4486
+ exports.marketplaceOpenSharingCheck = marketplaceOpenSharingCheck;
4487
+ exports.mlflow3GenAiQualityCheck = mlflow3GenAiQualityCheck;
3428
4488
  exports.mlflowLifecycleCheck = mlflowLifecycleCheck;
3429
4489
  exports.modelServingCheck = modelServingCheck;
3430
4490
  exports.normalizeJobRun = normalizeJobRun;
@@ -3442,6 +4502,7 @@ exports.renderJUnit = renderJUnit;
3442
4502
  exports.resolveFixtureRows = resolveFixtureRows;
3443
4503
  exports.resolveLakebaseProject = resolveLakebaseProject;
3444
4504
  exports.resolveProfile = resolveProfile;
4505
+ exports.resolveRequiredChecks = resolveRequiredChecks;
3445
4506
  exports.resolveTokenProvider = resolveTokenProvider;
3446
4507
  exports.restrictedPrincipalCheck = restrictedPrincipalCheck;
3447
4508
  exports.rollbackCheck = rollbackCheck;
@@ -3450,6 +4511,7 @@ exports.runTargetPack = runTargetPack;
3450
4511
  exports.secretRotationCheck = secretRotationCheck;
3451
4512
  exports.secretScopeCheck = secretScopeCheck;
3452
4513
  exports.securityPostureCostCheck = securityPostureCostCheck;
4514
+ exports.semanticAnalyticsCheck = semanticAnalyticsCheck;
3453
4515
  exports.serverlessComputeCheck = serverlessComputeCheck;
3454
4516
  exports.sqlRoundTripCheck = sqlRoundTripCheck;
3455
4517
  exports.toLakebaseBranchId = toLakebaseBranchId;