Skip to content

Add example MLOps job scripts for Databricks, SageMaker and Snowflake - #71

Closed
Vedaant-J wants to merge 1 commit into
vedaant/mlops-mlflow-modelfrom
vedaant/mlops-job-templates
Closed

Vedaant-J wants to merge 1 commit into
vedaant/mlops-mlflow-modelfrom
vedaant/mlops-job-templates

Conversation

@Vedaant-J

@Vedaant-J Vedaant-J commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor

Series: kumo-engine MLOps series: every snapshot, training table, model and prediction run carries a self-contained _provenance.json; with kumo.mlops(...) stores each artifact under one artifact root, tracks fits and prediction runs in MLflow or Snowflake and registers models; volumes and stages can hold files; prediction runs are monitored for drift and realized performance.
Stack: Models, registry and job templates: #57 → #59 → #65 → #71
Merge order: one linear stack; merge bottom to top (#53 first)
This PR: Adds job templates that run kumo-engine on Databricks Jobs, SageMaker Pipelines, and Snowflake ML Jobs with Tasks.

Summary

This PR adds job templates that run kumo-engine on Databricks Jobs, SageMaker Pipelines, and Snowflake ML Jobs with Tasks. Two plain Python job scripts take CLI flags and run inside with kumo.mlops(kumo.MLOps(...)), so every artifact lands under one artifact root. Per-platform wiring schedules them, passes the flags, tracks the fit, and hands the trained model to the scoring job: by registry alias, or by its models/<bundle id> path without a registry.

Problem. A team that wants to retrain weekly and score daily can't answer these questions today:

  • How do I run fit and predict as a Databricks job, a SageMaker pipeline step, or a Snowflake Task?
  • How do I turn MLOps on in a scheduled script, so the snapshot, training table and model of each run are stored and traceable?
  • Where does the scoring job find the model the training job produced: an MLflow alias, a Snowflake registry alias, or a path?

Today none of these can be answered without reading engine source.

Cause. The repository ships only a local SDK example:

examples/
└── sdk-local/
    ├── README.md
    └── check.py

Change.

examples/
├── sdk-local/
└── mlops/                                   # new
    ├── README.md        # overview, flags, local run
    ├── fit_job.py       # inside kumo.mlops(): snapshot, training table, fit (stored, tracked, registered)
    ├── score_job.py     # load "champion" or --model-path, fresh or stored snapshot, trainer.predict
    ├── jobs.py          # flags, graph (users, items, orders), connectors, kumo.MLOps settings
    ├── databricks/  databricks.yml  README.md
    ├── sagemaker/   pipeline.py  README.md
    └── snowflake/   register_jobs.py  README.md
Platform Train Score Model handoff
Databricks (Asset Bundle) kumo_train: fit_job.py on a single-node CPU job cluster kumo_score: daily score_job.py into a UC table (created paused) --registry mlflow: MLOps(tracking=MlflowTracking(), registry=ModelRegistryLocation("<catalog>.<schema>.users_churn", alias="champion")) (#65); scoring loads models:/…@champion
SageMaker Pipelines (SDK v2) Fit training step Predict processing step --registry mlflow against SageMaker managed MLflow; scoring loads models:/users-churn@champion
Snowflake ML Jobs + Tasks (experimental: preview APIs, not run) KUMO_TRAIN: weekly KUMO_SCORE: daily into a table --registry snowflake: MLOps(tracking=SnowflakeTracking(...), registry=ModelOutputConfig(sf, location=ModelRegistryLocation("USERS_CHURN", alias="champion"))) (#59); scoring loads champion
Plain VM / workstation python fit_job.py python score_job.py no registry: the fit prints model: models/<bundle id>; scoring loads --model-path models/<bundle id> from the artifact root
  • The scripts use only the public API. Each builds a kumo.MLOps from its flags and runs inside with kumo.mlops(cfg). The snapshot, the training table and the model are stored under --artifact-root when they are produced (Export and load graph snapshots through any file destination #54, Record training-table lineage across export and reload #55, Record bundle_id and fit provenance in every model bundle #56). The fit is tracked and the model registered when --registry is given. Scoring writes --predictions-table when given.
  • Flags, no environment. --artifact-root, --source (databricks, snowflake or a Parquet directory), --catalog/--schema/--warehouse, --registry, --model-name, --model-path, --snapshot, --predictions-table, --query, --num-experiments and --scratch-dir. Credentials come from the platform identity. Only MLflow's own settings (MLFLOW_TRACKING_URI, ...) stay environment variables.
  • No job ids, no summary line. The scripts exit 0 on success and non-zero with a traceback on failure. The scheduler tracks its own runs.
  • Every score passes a binary threshold: 0.5, unless the model carries Add TrainingResult.with_scoring_defaults and Trainer.export #57 scoring defaults (trainer.result.scoring_defaults). The template query (PREDICT COUNT(orders.*, 0, 30, days) > 0 FOR EACH users.USER_ID) is binary, and a binary predict without a threshold fails.
  • Databricks.
    • Each task is a spark_python_task whose parameters are the flags. The artifact root is /Volumes/<catalog>/<schema>/<volume>/kumo, and the cluster env sets MLFLOW_TRACKING_URI=databricks and MLFLOW_REGISTRY_URI=databricks-uc.
    • Each task installs a requirements file, then the kumo-engine wheel. The file starts with --prefer-binary, because DBR 16.4's setuptools cannot build the SQLAlchemy sdist MLflow pulls.
    • A spark_python_task runs the script without __file__, so the scripts find their directory from sys.argv[0].
  • SageMaker. The training step passes the flags as container_arguments and the processing step as arguments. MLFLOW_TRACKING_URI is the tracking-server or MLflow App ARN, through sagemaker-mlflow. --instance-type is required.
  • Snowflake (experimental; built on preview APIs and not run):
    • MLJobDefinition.register defines the train and score jobs. Each Task runs MLJobDefinition.to_sql(job_args=<flags>, use_async=False) directly; the old task.sql existed only to pass job ids.
    • Tracking and the registry use the connector's own Snowpark session through the new SnowflakeConnector.session().
    • The artifact root must be an s3:// or gs:// URI that the external access integration reaches.

Real output of fit_job.py then score_job.py on a workstation, CPU, no registry. Data: --source <data dir> with synthetic users/items/orders (50 users, 20 items, 3,000 orders over 120 days), a 7-day query, one experiment. Hashes shortened:

$ python fit_job.py --source <data dir> --artifact-root <root> --query 'PREDICT COUNT(orders.*, 0, 7, days) > 0 FOR EACH users.USER_ID' --num-experiments 1
model: models/f48e17f0…
$ python score_job.py --source <data dir> --artifact-root <root> --model-path models/f48e17f0…
predictions: 50 rows
<root>/
  snapshots/7ff1fc83…/bee34f9aa0ea3e83/      _provenance.json  kumo_snapshot.json  index/…
  training_tables/tt-20b4fc72…/              _provenance.json  _SUCCESS  part-00000.parquet …
  models/f48e17f0…/                          _provenance.json  metrics.json  publication-manifest.json  model/  manifests/ …

Back-compat

Examples plus one additive connector method.

Situation Behaviour
Existing library calls Unchanged.
SnowflakeConnector.session() New; returns the Snowpark session the connector already reads through.
Engine wheel (CI runs tests from it) test_job_templates.py skips when examples/mlops is absent.

Known limitations

  • An earlier revision of the Databricks bundle and the SageMaker pipeline, configured through environment variables with the same engine calls, was deployed and run live. Both jobs/steps exited 0, the fit registered and moved champion, and scoring loaded it. This flag-based revision is verified locally only. The Snowflake template has not been run and is marked experimental.
  • Without --predictions-table, score_job.py stores nothing yet; the prediction-run store under predictions/<id>/ arrives with Record a manifest and output score statistics for every prediction run #67.
  • Use a standard (non-ML) Databricks runtime: the ML runtime's preinstalled torch, torchvision and pyOpenSSL conflict with kumo-engine's pins. Databricks GPU nodes need a GPU ML runtime, so the bundle uses a CPU node type with local NVMe disks.
  • SYSTEM$EXECUTE_ML_JOB, which MLJobDefinition.to_sql generates, is not a documented public API.

Testing Done

  • test_job_templates.py:
    • fit_job.py then score_job.py end to end on local Parquet (no registry): the fit prints model: models/<id>, the root holds models/<id>/_provenance.json, snapshots/… and training_tables/…, and the score loads --model-path models/<id> and scores every user;
    • the Databricks tasks pass the same --artifact-root and --registry mlflow to both scripts, and --predictions-table to the score job only;
    • the Snowflake tasks run each job's to_sql statement with the flags (--predictions-table on the score job only);
    • both scripts import when executed without __file__ (Databricks spark_python_task);
    • the SageMaker pipeline refuses to run without --instance-type, and SageMaker and Snowflake name the scripts;
    • every Python file under examples/mlops byte-compiles.
  • test_snowflake_connector.py: session() is the reader's session for the connector's target.
  • On this head, test_job_templates.py + test_snowflake_connector.py gave 20 passed. flake8 is clean on examples/mlops.

Checklist

  • No credentials or real identifiers; placeholders only
  • Tests added

🤖 Generated with Claude Code

@Vedaant-J

Vedaant-J commented Oct 21, 2026 •

Copy link
Copy Markdown
Contributor Author

Change map

File Function / scope What changed Why
examples/mlops/README.md overview new: the two job scripts inside kumo.mlops(), platform table (Snowflake marked experimental), flag table, local run with --model-path models/<bundle id>, exit status one index the platform READMEs point to
examples/mlops/databricks/README.md docs new: jobs, prerequisites (requirements file with --prefer-binary for DBR 16.4, experiment parent folder, dev target), privileges, __file__ fallback, what was run live Databricks setup
examples/mlops/databricks/databricks.yml kumo_train, kumo_score new: spark_python_task per script with the flags as parameters (volume artifact root, --registry mlflow), MLflow env for Unity Catalog, daily schedule (paused), requirements library before the wheel, default dev target Databricks Asset Bundle
examples/mlops/fit_job.py main new: inside kumo.mlops(jobs.mlops(...)): snapshot, training table, fit (stored, tracked, registered by the MLOps settings); prints model: models/<id>; finds its directory without __file__ the training job every platform runs
examples/mlops/jobs.py parse_args, source, mlops, build_graph, load_model, prediction_output new: CLI flags; connectors; kumo.MLOps with MlflowTracking + ModelRegistryLocation, SnowflakeTracking + ModelOutputConfig, or root only; load by alias or --model-path; optional predictions table one shared module the scripts and platforms configure
examples/mlops/sagemaker/README.md docs new: image and code channel, IAM, MLflow ARN and client/server versions, v2 → v3 mapping, what was run live SageMaker setup
examples/mlops/sagemaker/pipeline.py build_pipeline, main new: training step runs fit_job.py, processing step score_job.py, both with the flags; --instance-type required SageMaker Pipelines
examples/mlops/score_job.py main new: inside kumo.mlops(): load champion or --model-path, fresh or stored snapshot, trainer.predict with a threshold unless the model has scoring defaults; finds its directory without __file__ the scoring job every platform runs
examples/mlops/snowflake/README.md docs new: marked experimental (preview APIs); jobs and tasks, alias promotion, tracking session, privileges, unverified items Snowflake setup
examples/mlops/snowflake/register_jobs.py register, task_sql, main new (experimental): ML Job definitions with the scripts as entrypoints; each Task runs to_sql(job_args=<flags>) Snowflake ML Jobs
packages/kumo-engine/kumo/engine/connector/snowflake.py SnowflakeConnector.session new: the Snowpark session the connector reads through tracking and registry reuse the reader's session in a job container
packages/kumo-engine/test/test_job_templates.py new tests scripts compile; Databricks and Snowflake tasks pass the flags; fit then score end to end on local Parquet with the artifact-root layout and --model-path; scripts import without __file__; --instance-type required templates stay valid as the API changes
packages/kumo-engine/test/test_snowflake_connector.py test_session_is_the_readers_session session() comes from the reader's session cache for the connector's target coverage

Requirement: show how Databricks, SageMaker and Snowflake schedule kumo-engine jobs with MLOps on, track the fit and hand the model to scoring. Existing: kumo.MLOps (#50), the artifact-root stores (#54–#56), MLflow and Snowflake tracking and registries (#59, #60, #65, #68). Smallest: two plain scripts, one shared module, per-platform wiring, one connector method. Stopping condition: fit then score run end to end locally from the scripts, and each README states what was run live and what was not.

@copy-pr-bot

copy-pr-bot Bot commented Oct 21, 2026

Copy link
Copy Markdown

This pull request requires additional validation before any workflows can run on NVIDIA's runners.

Pull request vetters can view their responsibilities here.

Contributors can view more details about this message here.

@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 21, 2026 01:00 — with GitHub Actions Inactive
@coderabbitai

coderabbitai Bot commented Oct 21, 2026 •

Copy link
Copy Markdown

Review in Change Stack →

Warning

Review limit reached

Enable usage-based reviews in Billing to review now. Otherwise, wait until the next included review is available.

Next included review available in 24 minutes.

Check out review usage here.

View limit details

Limit details: You’ve used all 12 included reviews currently available.

Learn how review limits work.

Review configuration:

Run configuration
Commits

Reviewing files that changed from the base of the PR and between ecf304a and 1ea72bb.

Files selected for processing: 13
  • examples/mlops/README.md
  • examples/mlops/databricks/README.md
  • examples/mlops/databricks/databricks.yml
  • examples/mlops/fit_job.py
  • examples/mlops/jobs.py
  • examples/mlops/sagemaker/README.md
  • examples/mlops/sagemaker/pipeline.py
  • examples/mlops/score_job.py
  • examples/mlops/snowflake/README.md
  • examples/mlops/snowflake/register_jobs.py
  • packages/kumo-engine/kumo/engine/connector/snowflake.py
  • packages/kumo-engine/test/test_job_templates.py
  • packages/kumo-engine/test/test_snowflake_connector.py
Walkthrough

Adds shared training and scoring scripts with options for source data, model registration or loading, snapshots, and prediction output. Adds Databricks, SageMaker, and Snowflake configurations for running these jobs. The SageMaker pipeline runs a training step before its dependent scoring step. Tests cover job configuration, script loading, local fit-then-score execution, and Snowflake session access.

Sequence Diagram(s)

sequenceDiagram
  participant SageMakerPipeline
  participant fit_job.py
  participant MLflowRegistry
  participant score_job.py
  SageMakerPipeline->>fit_job.py: Run training step
  fit_job.py->>MLflowRegistry: Register model and update champion alias
  SageMakerPipeline->>score_job.py: Run dependent scoring step
  score_job.py->>MLflowRegistry: Load champion model
Loading

Priority: Normal

Merge Risk: Moderate · up to ecf30

The SageMaker example pipeline runs scoring but keeps no predictions, so a successful run produces nothing usable. Add a durable predictions destination, or document the limitation, before merging. The Databricks and Snowflake templates and the shared scripts are otherwise sound as an example.

Pre-merge checks: Passed 2 · Inconclusive 1

Failed Failed checks: 1 inconclusive

Check name Status Explanation Resolution
Change Map Design Review Inconclusive The required PR conversation comment beginning with <!-- kumo-pr-change-map --> is not available. The supplied review context contains no such comment, and the pull-request description is explicitly… Provide the complete change-map conversation comment and the omitted portion of the PR description, or make the linked conversation data available. Then review each mapped change against the actual diff and repository behavior.
Passed Passed checks: 2 passed
Check name Status Explanation
Pr Size Passed The pull request changes 13 files. The failure threshold is more than 40 files, so this check passes.
Public Resource Access Passed The pull request adds public documentation URLs for Databricks, AWS SageMaker, and Snowflake. Anonymous HEAD requests returned HTTP 200 for all 14 added URLs. Other URI-like values are local paths or …
Full details: Public Resource Access

Explanation

The pull request adds public documentation URLs for Databricks, AWS SageMaker, and Snowflake. Anonymous HEAD requests returned HTTP 200 for all 14 added URLs. Other URI-like values are local paths or illustrative placeholders, which this check excludes. No added external resource reference is confirmed inaccessible.

Full details: Change Map Design Review

Explanation

The required PR conversation comment beginning with &lt;!-- kumo-pr-change-map --&gt; is not available. The supplied review context contains no such comment, and the pull-request description is explicitly truncated. The repository only contains instructions describing that comment; it does not contain the comment itself. Therefore, this check cannot assess the proposed design against its stated rationale, smallest sufficient change, verification, and stopping condition.

Resolution

Provide the complete change-map conversation comment and the omitted portion of the PR description, or make the linked conversation data available. Then review each mapped change against the actual diff and repository behavior.

Finishing Touches: 💡 1
🛠️ Fix failing CI checks: 💡
  • Commit to this branch
  • Create a new PR
  • Autofix · Keep fixing CodeRabbit findings and required CI, and resolving merge conflicts

Comment @coderabbitai help to get the list of available commands.

@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from 91d11cd to 29f8c7f Compare October 21, 2026 01:56
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 21, 2026 01:56 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from 29f8c7f to 2aa4786 Compare October 21, 2026 07:18
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 21, 2026 07:18 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from 2aa4786 to 937102d Compare October 21, 2026 07:57
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 21, 2026 07:57 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from 937102d to dd4e481 Compare October 21, 2026 08:59
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 21, 2026 08:59 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from dd4e481 to 7b51c15 Compare October 21, 2026 09:02
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 21, 2026 09:02 — with GitHub Actions Inactive
@Vedaant-J Vedaant-J mentioned this pull request Oct 21, 2026
3 tasks done
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from 7b51c15 to cb68ce2 Compare October 21, 2026 10:06
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 21, 2026 10:06 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from cb68ce2 to e203171 Compare October 21, 2026 16:10
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 21, 2026 16:11 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from e203171 to af92e85 Compare October 21, 2026 16:42
@Vedaant-J
Vedaant-J had a problem deploying to gha-kumo-workflow-tests October 21, 2026 16:42 — with GitHub Actions Error
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 21, 2026 16:44 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 22, 2026 00:07 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from 56b8448 to bb2b95a Compare October 22, 2026 00:21
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 22, 2026 00:21 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from bb2b95a to 57045b8 Compare October 22, 2026 00:53
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 22, 2026 00:53 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from 57045b8 to da8b13f Compare October 22, 2026 02:22
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 22, 2026 02:22 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from da8b13f to 3fe4c18 Compare October 22, 2026 04:59
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 22, 2026 04:59 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 22, 2026 05:29 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 22, 2026 05:31 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from 2bfe866 to f380a89 Compare October 22, 2026 05:40
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 22, 2026 05:40 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from f380a89 to f21cf92 Compare October 22, 2026 19:16
@Vedaant-J
Vedaant-J temporarily deployed to gha-kumo-workflow-tests October 22, 2026 19:16 — with GitHub Actions Inactive
@Vedaant-J
Vedaant-J force-pushed the vedaant/mlops-job-templates branch from f21cf92 to f258bb5 Compare October 24, 2026 18:40
@Vedaant-J
Vedaant-J changed the base branch from vedaant/mlops-cli to vedaant/mlops-mlflow-model October 24, 2026 18:40

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 1


Review info
Run configuration
Commits

Reviewing files that changed from the base of the PR and between 9b8a83a and ecf304a.

Files selected for processing: 13
  • examples/mlops/README.md
  • examples/mlops/databricks/README.md
  • examples/mlops/databricks/databricks.yml
  • examples/mlops/fit_job.py
  • examples/mlops/jobs.py
  • examples/mlops/sagemaker/README.md
  • examples/mlops/sagemaker/pipeline.py
  • examples/mlops/score_job.py
  • examples/mlops/snowflake/README.md
  • examples/mlops/snowflake/register_jobs.py
  • packages/kumo-engine/kumo/engine/connector/snowflake.py
  • packages/kumo-engine/test/test_job_templates.py
  • packages/kumo-engine/test/test_snowflake_connector.py

Included review availability: This review used your included allowance. Your plan provides up to 12 included reviews per hour; 0 remain after this review.

Comment on lines +72 to +74
arguments=[
*flags, '--scratch-dir', '/opt/ml/processing/scratch'
],

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Major · Data Integrity & Integration · Quick win

Persist the processing step’s predictions.

Predict passes no --predictions-table or other output destination. score_job.main() therefore calls trainer.predict() without an output configuration, prints only a row count, and exits. The pipeline can report success without retaining any predictions. Add a supported persistent output destination to this step. (docs.aws.amazon.com)

Teams want to run kumo-engine fits and scoring on the scheduler they
already have, but there is no runnable example of wiring the engine,
MLOps settings and a registry into a scheduled job.

examples/mlops holds two plain Python job scripts (fit_job.py,
score_job.py) and a shared jobs.py. They take CLI flags
(--artifact-root, --source, --registry, --model-name, --model-path,
--predictions-table, ...), build kumo.MLOps from them and run inside
`with kumo.mlops(cfg)`, so snapshots, training tables and models are
stored under the artifact root (models/<bundle id>/). With a registry
the fit registers the model and moves `champion`; scoring loads it, or
--model-path from the root. Platform wiring: a Databricks Asset Bundle,
a SageMaker Pipeline and (experimental) Snowflake ML Jobs + Tasks, each
passing the flags. SnowflakeConnector.session() exposes the connector's
Snowpark session for SnowflakeTracking.

Verified with test_job_templates.py (local fit then score) and
test_snowflake_connector.py.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@Vedaant-J

Copy link
Copy Markdown
Contributor Author

Folded into #64 (prediction runs & monitoring): the job scripts are now examples under examples/mlops in #64, and SnowflakeConnector.session() moved to #60. The consolidated stack shows only the end state.

This branch was previously deployed

1 inactive deployment
gha-kumo-workflow-tests — 1ea72bbd Deployed Oct 24, 2026 by Vedaant-J via import #753
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.

1 participant