Features — pinky-provider
Update date : 2026-05-28 00:43
MVP scope
Rule: an object type is in MVP if it can be deployed via create_or_alter / from_dict()
without special case handling. Objects requiring custom DDL paths, post-create SQL, or non-trivial
workarounds are v2 or later.
| Object | MVP | Notes |
|---|---|---|
| database | ✓ | |
| schema | ✓ | _log_level post-create = non-blocking SQL, not a blocker |
| warehouse | ✓ | |
| role | ✓ | |
| database_role | ✓ | |
| grant | ✓ | |
| network_policy | ✓ | |
| network_rule | ✓ | or_replace only — no friction |
| secret | ✓ | or_replace only — no friction |
| notification_integration | ✓ | |
| stage | ✓ | |
| table | ✓ | column diff handled by ADR-0007 |
| stream | ✓ | IF NOT EXISTS — stateful, no friction |
| view | ✓ | column comments = non-blocking warning |
| dynamic_table | ✓ | columns pop before from_dict() — handled |
| procedure | ✓ | try/except pattern (ADR-0006) — handled |
| user_defined_function | ✓ | or_replace + copy_grants |
| task (standalone) | ✓ | serverless |
| task.dagv1 | ✓ | |
| event_table | ✓ | _storage_lifecycle_policy = non-blocking SQL |
| tag | ✓ | |
| alert | ✓ | |
| streamlit | ✓ | |
| api_integration | ✓ | |
| external_volume | ✓ | |
| compute_pool | ✓ | Enterprise only |
| external_access_integration | v2 | SQL fallback — absent Core API |
| storage_lifecycle_policy | v2 | SQL fallback — absent Core API |
| semantic_view | later | upstream standard not yet stable |
| iceberg_table | v2 | subtleties with EXTERNAL_VOLUME (open question) |
CI gate before PyPI: integration tests against a real Snowflake account — 4 consecutive releases without regression — before any publication.
Test pattern per type: create → idempotent re-apply → field change → re-apply (ALTER/REPLACE) → delete.
Implementation order: simple objects first (warehouse, role, grant, stage, secret…) to build the test infrastructure, then tables (all types) and callables (procedure, UDF, task) which are the complex ones — but already proven patterns from work. Iceberg and hybrid tables are out of scope.
Roadmap
| Phase | What |
|---|---|
| After MVP | semantic_view — wait for upstream standard stabilisation |
| After CI gate | PyPI publication (semver, CHANGELOG, README before/after) |
| v2 | export — reverse-engineer fetch() → .yml |
| v3 | validate — offline JSON Schema, integrable as pre-commit hook |
| Backlog | plan --compare multi-env, mermaid graph viz, drift detection, DCM bridge, suite UDFs, budget per schema |
| Integration | pinky-tools output → direct input to pinky-provider apply |
Open questions
| Status | Question |
|---|---|
| ✅ Decided | DROP scope = 1 schema, DROP what is no longer in YAMLs |
| ❓ Open | CI → Snowflake auth: reuse existing IAM or switch to key pair? |
| ❓ Open | plan output format: JSON (like DCM) or human-readable text (like Terraform)? |
| ❓ Open | Mid-deploy error handling: rollback / continue / log+fail? |
| ❓ Open | Iceberg Tables: subtleties with EXTERNAL_VOLUME? |
| ❓ Open | Provider tests: unit mocks or integration on dedicated schema? |
| ❓ Open | Multi-schema scope (admin-project: PUBLIC objects + database-level warehouses) |
| ❓ Open | GET_CONTACTS() accessible from SP with DEPLOYER role? (needs testing) |
| ❓ Open | Power Automate Teams workflow — creation + webhook reception |
| ❓ Open | FINALIZE_TASK: design decided, implementation pending |
| ❓ Open | Contact naming: by domain or by person? |
| ✅ Decided | streamlit in MVP |