terrine 0.1.0.dev0__tar.gz → 0.1.0.dev2__tar.gz
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.
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/workflows/ci.yml +4 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.gitignore +1 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/AGENTS.md +58 -9
- terrine-0.1.0.dev2/CHANGELOG.md +653 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/Makefile +3 -1
- terrine-0.1.0.dev2/PKG-INFO +221 -0
- terrine-0.1.0.dev2/README.md +164 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/run_overhead.py +12 -12
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/workloads.py +8 -8
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/backend-compatibility.md +264 -18
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/candidate-anchors.md +41 -3
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/capabilities.md +21 -15
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/common-feature-patterns.md +25 -40
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/common-stack-interop.md +26 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/dataset-agent-tools.md +6 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/design-specs.md +15 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/design-validation.md +58 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/first-dataset.md +62 -23
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/increment-compatibility.md +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/index.md +6 -3
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/library-handoffs.md +128 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/limitations.md +2 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/materialization-runtime.md +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/ml-staging.md +3 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/public-api.md +89 -17
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/semantic-layer-interop.md +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/sequential-panels.md +23 -19
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/state-panels.md +15 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/temporal-attributes.md +8 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/temporal-engine.md +232 -91
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/trajectories-survival.md +56 -22
- terrine-0.1.0.dev2/docs/reference/refusals.md +576 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/evals/agent_dataset_tools.yaml +2 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/bigquery/dataset.py +9 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/common_stack_interop.py +7 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/dataset_agent_tools.py +8 -11
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/event_sequences.py +5 -5
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/first_dataset.py +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/increment_parity.py +14 -14
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/materialization_runtime.py +9 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/ml_staging.py +8 -8
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/nonadditive_metrics.py +13 -13
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/postgres/dataset.py +9 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/retention_and_winsorization.py +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/retention_metrics.py +5 -5
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/sequential_trials.py +11 -13
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/snowflake/dataset.py +9 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/state_panel.py +12 -14
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/table_first_dataset.py +19 -18
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/trajectories_survival.py +18 -19
- terrine-0.1.0.dev2/examples/unverified_backend.py +150 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/.test_durations +352 -255
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/agent/test_dataset_tool_runtime.py +7 -7
- terrine-0.1.0.dev2/integration/backends/test_engine_registry.py +25 -0
- terrine-0.1.0.dev2/integration/backends/test_generic.py +805 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compat/test_native_catalog.py +7 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compile/test_boolean_outputs.py +8 -8
- terrine-0.1.0.dev2/integration/compile/test_design_describe.py +299 -0
- terrine-0.1.0.dev2/integration/compile/test_frame_runtime_window_export.py +350 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compile/test_retention.py +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compile/test_time_to_event.py +44 -4
- terrine-0.1.0.dev2/integration/conformance/test_engines.py +348 -0
- terrine-0.1.0.dev2/integration/conftest.py +24 -0
- terrine-0.1.0.dev2/integration/execution/test_generic_provider.py +439 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/handoffs/conftest.py +3 -0
- terrine-0.1.0.dev2/integration/handoffs/test_causal_grid.py +208 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/state_panels/test_state_panel_workflows.py +14 -14
- terrine-0.1.0.dev2/integration/test_model_from_tables.py +123 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_backend_capabilities.py +16 -10
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_bigquery_admission.py +7 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_incremental_equivalence.py +31 -31
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_ml_staging_duckdb.py +94 -23
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_ml_staging_examples.py +15 -17
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_postgres_admission.py +10 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_postgres_execution.py +10 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_postgres_shapes.py +33 -14
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_postgres_windows.py +21 -38
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_runtime_api.py +15 -15
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_saved_plan_restart.py +16 -16
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_snapshot_capture_bounds.py +7 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_snapshot_partition_consistency.py +9 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_snowflake_admission.py +7 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_snowflake_parity.py +13 -13
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/pyproject.toml +4 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tach.toml +11 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/__init__.py +21 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/adapters/increment.py +32 -23
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/adapters/opentelemetry.py +9 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/definitions.py +12 -6
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/design_schema.py +39 -11
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/policy.py +35 -13
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/schemas.py +5 -3
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/tools.py +30 -17
- terrine-0.1.0.dev2/terrine/backends/capabilities.py +64 -0
- terrine-0.1.0.dev2/terrine/backends/dialect.py +734 -0
- terrine-0.1.0.dev2/terrine/backends/engines/bigquery.py +192 -0
- terrine-0.1.0.dev2/terrine/backends/engines/duckdb.py +384 -0
- terrine-0.1.0.dev2/terrine/backends/engines/postgres.py +355 -0
- terrine-0.1.0.dev2/terrine/backends/engines/snowflake.py +277 -0
- terrine-0.1.0.dev2/terrine/backends/extrema.py +25 -0
- terrine-0.1.0.dev2/terrine/backends/joins.py +41 -0
- terrine-0.1.0.dev2/terrine/backends/numeric.py +484 -0
- terrine-0.1.0.dev2/terrine/backends/registry.py +284 -0
- terrine-0.1.0.dev2/terrine/backends/sequences.py +14 -0
- terrine-0.1.0.dev2/terrine/backends/timestamps.py +242 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/_asof.py +12 -10
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/anchors.py +69 -41
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/columns.py +136 -29
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/cost.py +19 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/dispatch.py +12 -5
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/layers.py +12 -6
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/materialize.py +3 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/provenance.py +12 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/ranges.py +5 -3
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/retention.py +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/_observations.py +10 -5
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/calendar_comparison.py +20 -19
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/cohorts.py +34 -17
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/event_sequence.py +11 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/ltv.py +38 -12
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/matched_t0.py +3 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/sequential.py +31 -33
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/state_panel.py +12 -14
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/time_to_event.py +13 -14
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/data.py +414 -76
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/export.py +10 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/manifest.py +43 -38
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/reference.py +36 -12
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/splits.py +115 -89
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/errors.py +34 -4
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_bigquery.py +81 -14
- terrine-0.1.0.dev2/terrine/execution/_generic.py +385 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_native.py +57 -8
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_postgres.py +90 -82
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_publish.py +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_snowflake.py +93 -23
- terrine-0.1.0.dev2/terrine/execution/backend.py +100 -0
- terrine-0.1.0.dev2/terrine/execution/gates.py +340 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/inputs.py +64 -20
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/export/diff_diff.py +9 -6
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/export/lifelines.py +18 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/export/preflight.py +28 -15
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/export/surrogate.py +22 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/frame.py +190 -61
- terrine-0.1.0.dev2/terrine/metrics.py +154 -0
- terrine-0.1.0.dev2/terrine/model.py +746 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/orchestration/airflow.py +26 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/orchestration/dagster.py +29 -6
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/recipes.py +105 -48
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/api.py +50 -26
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/backends/duckdb.py +5 -5
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/control.py +7 -3
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/graph.py +5 -5
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/leases.py +9 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/planner.py +14 -6
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/planning.py +20 -16
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/saved_plan.py +18 -8
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/snapshot.py +20 -13
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/state.py +2 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/bind.py +75 -58
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/io.py +32 -4
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/models.py +19 -19
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/rules.py +16 -11
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/sql.py +92 -27
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/simulate/baseline.yaml +11 -11
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/simulate/scale.py +25 -8
- terrine-0.1.0.dev2/terrine/spec/anchors.py +249 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/dataset.py +54 -13
- terrine-0.1.0.dev2/terrine/spec/describe.py +735 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/design.py +80 -41
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/expressions.py +161 -89
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/io.py +88 -56
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/panels.py +149 -68
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/sequence.py +26 -21
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/state_panel.py +100 -48
- terrine-0.1.0.dev2/terrine/spec/trajectory.py +174 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/transforms.py +5 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/validate.py +355 -133
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/aggregate.py +202 -113
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/attributes.py +98 -74
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/daily.py +54 -74
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/first.py +9 -31
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/lookup.py +15 -10
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/nonadditive.py +22 -10
- terrine-0.1.0.dev2/terrine/temporal/prefix.py +144 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/readiness.py +8 -2
- terrine-0.1.0.dev2/terrine/windows.py +84 -0
- terrine-0.1.0.dev2/tests/.test_durations +2033 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/_worlds.py +9 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/adapters/test_airflow.py +24 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/adapters/test_dagster.py +27 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/fixtures/catalog.yaml +7 -7
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_inspect_design.py +57 -17
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_materialize.py +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_plan_authorization.py +3 -3
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_policy.py +56 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_schemas.py +9 -5
- terrine-0.1.0.dev2/tests/backends/test_engine_registry.py +225 -0
- terrine-0.1.0.dev2/tests/backends/test_generic.py +457 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/backends/test_numeric.py +58 -5
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/backends/test_sequences.py +1 -1
- terrine-0.1.0.dev2/tests/backends/test_timestamps.py +150 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/fixtures/catalog.yaml +23 -23
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/test_increment_semantics.py +9 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_anchors.py +89 -26
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_cohorts.py +17 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_columns.py +143 -18
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_completeness_columns.py +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_event_sequence.py +18 -34
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_ltv.py +74 -11
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_matched_t0.py +10 -10
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_nonadditive.py +24 -24
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_panels.py +76 -40
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_persisted_layers.py +33 -18
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_range_scaling.py +11 -10
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_retention.py +14 -11
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_state_panel.py +45 -25
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_time_to_event.py +14 -14
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/conftest.py +14 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_definition.py +21 -14
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_manifest.py +71 -3
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_runtime_staging.py +1 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_splits.py +30 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_staging.py +18 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_training_view.py +60 -14
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_winsorization_definition.py +3 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/documentation.py +5 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/execution/test_backend_provider.py +129 -27
- terrine-0.1.0.dev2/tests/execution/test_gates.py +392 -0
- terrine-0.1.0.dev2/tests/execution/test_generic.py +311 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/execution/test_inputs.py +9 -9
- terrine-0.1.0.dev2/tests/execution/test_sql_verification.py +106 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/conftest.py +3 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/test_preflight.py +14 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/test_surrogate.py +25 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/test_warehouse_preflight.py +40 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/baseline.py +3 -0
- terrine-0.1.0.dev2/tests/fixtures/definition_v2.json +1 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/interop.py +9 -9
- terrine-0.1.0.dev2/tests/fixtures/readme.py +73 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/test_baseline.py +3 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/winsorization.py +14 -14
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/integration/study_api_smoke.py +9 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/parity/test_increment_frames.py +14 -14
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/test_event_sequences.py +5 -5
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_api.py +8 -8
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_backend_capabilities.py +3 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_control_ipc.py +3 -5
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_graph.py +1 -1
- terrine-0.1.0.dev2/tests/runtime/test_input_refusals.py +194 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_layers.py +49 -12
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_planning.py +7 -4
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_saved_plan.py +9 -9
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_snapshot.py +10 -10
- terrine-0.1.0.dev2/tests/semantic/test_catalog.py +280 -0
- terrine-0.1.0.dev2/tests/semantic/test_from_tables.py +686 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/semantic/test_metric_rules.py +17 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/semantic/test_rules_import.py +7 -3
- terrine-0.1.0.dev2/tests/semantic/test_sql.py +94 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/simulate/test_scale_generator.py +44 -8
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_calendar_comparison.py +24 -19
- terrine-0.1.0.dev2/tests/spec/test_describe.py +358 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_design_io.py +170 -61
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_expressions.py +0 -13
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_nonadditive_spec.py +37 -3
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_panels.py +18 -26
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_recipes.py +213 -40
- terrine-0.1.0.dev2/tests/spec/test_refusals.py +477 -0
- terrine-0.1.0.dev2/tests/spec/test_retention.py +51 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_sequence.py +4 -1
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_state_panel.py +22 -15
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_validate.py +198 -76
- terrine-0.1.0.dev2/tests/temporal/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_first_occurrence.py +21 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_nonadditive.py +4 -4
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_prefix_lookup.py +80 -5
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_readiness.py +5 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_scd2_attributes.py +34 -29
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_semantic_binding.py +45 -45
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_sparse_state.py +10 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_window_aggregates.py +128 -8
- terrine-0.1.0.dev2/tests/test_engine_dispatch.py +401 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_errors.py +0 -22
- terrine-0.1.0.dev2/tests/test_frame.py +211 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_frame_runtime.py +37 -2
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_metadata.py +216 -41
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_optional_dependencies.py +1 -0
- terrine-0.1.0.dev2/tests/test_public_docstrings.py +41 -0
- terrine-0.1.0.dev2/tests/test_windows.py +39 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/uv.lock +1 -1
- terrine-0.1.0.dev0/CHANGELOG.md +0 -300
- terrine-0.1.0.dev0/PKG-INFO +0 -164
- terrine-0.1.0.dev0/README.md +0 -107
- terrine-0.1.0.dev0/docs/reference/refusals.md +0 -498
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-16-terrine-build.md +0 -416
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-16-terrine-dataset-workflows.md +0 -164
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-16-terrine-study-api.md +0 -312
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-16-terrine-temporal.md +0 -345
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-17-terrine-frame.md +0 -182
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-event-sequences.md +0 -200
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-materialization-runtime.md +0 -267
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-ml-staging.md +0 -201
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-orchestrators.md +0 -131
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-sequential-panels.md +0 -183
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-trajectories-survival.md +0 -269
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-warehouse-scale.md +0 -163
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-agent-tools.md +0 -181
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-fast-tests-inventory.md +0 -478
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-fast-tests-ledger.md +0 -561
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-fast-tests.md +0 -145
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-interop.md +0 -202
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-library-handoffs.md +0 -81
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-release-readiness.md +0 -100
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-20-terrine-test-tiers.md +0 -113
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-21-terrine-postgres-execution.md +0 -170
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-22-bigquery-execution.md +0 -66
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-22-ibis-study-queries.md +0 -73
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-22-postgres-float-windows.md +0 -56
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-23-exact-float-windows.md +0 -88
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-23-snowflake-execution.md +0 -323
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-24-mutation-audit.md +0 -80
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-24-test-suite-speed.md +0 -68
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-26-public-readiness.md +0 -255
- terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-26-table-first-binding-and-recipes.md +0 -184
- terrine-0.1.0.dev0/docs/superpowers/plans/ledger-compile.md +0 -345
- terrine-0.1.0.dev0/docs/superpowers/plans/ledger-dataset.md +0 -136
- terrine-0.1.0.dev0/docs/superpowers/plans/ledger-runtime.md +0 -180
- terrine-0.1.0.dev0/docs/superpowers/plans/ledger-test-tiers-misc.md +0 -14
- terrine-0.1.0.dev0/docs/superpowers/plans/ledger-test-tiers-state-panels.md +0 -37
- terrine-0.1.0.dev0/docs/superpowers/plans/ledger-test-tiers-temporal.md +0 -29
- terrine-0.1.0.dev0/docs/superpowers/specs/2026-10-16-terrine-handoff.md +0 -635
- terrine-0.1.0.dev0/docs/superpowers/specs/2026-10-17-terrine-frame-design.md +0 -135
- terrine-0.1.0.dev0/docs/superpowers/specs/2026-10-18-terrine-scope-datasets-only.md +0 -76
- terrine-0.1.0.dev0/docs/superpowers/specs/2026-10-26-table-first-binding-and-recipes-design.md +0 -146
- terrine-0.1.0.dev0/integration/compile/test_frame_runtime_window_export.py +0 -34
- terrine-0.1.0.dev0/integration/conftest.py +0 -1
- terrine-0.1.0.dev0/integration/test_model_from_tables.py +0 -177
- terrine-0.1.0.dev0/terrine/backends/capabilities.py +0 -117
- terrine-0.1.0.dev0/terrine/backends/dialect.py +0 -55
- terrine-0.1.0.dev0/terrine/backends/extrema.py +0 -40
- terrine-0.1.0.dev0/terrine/backends/joins.py +0 -75
- terrine-0.1.0.dev0/terrine/backends/numeric.py +0 -657
- terrine-0.1.0.dev0/terrine/backends/sequences.py +0 -40
- terrine-0.1.0.dev0/terrine/backends/timestamps.py +0 -421
- terrine-0.1.0.dev0/terrine/execution/backend.py +0 -349
- terrine-0.1.0.dev0/terrine/execution/gates.py +0 -90
- terrine-0.1.0.dev0/terrine/model.py +0 -397
- terrine-0.1.0.dev0/terrine/spec/anchors.py +0 -107
- terrine-0.1.0.dev0/terrine/spec/trajectory.py +0 -144
- terrine-0.1.0.dev0/terrine/temporal/prefix.py +0 -104
- terrine-0.1.0.dev0/terrine/windows.py +0 -54
- terrine-0.1.0.dev0/tests/.test_durations +0 -1229
- terrine-0.1.0.dev0/tests/backends/test_timestamps.py +0 -62
- terrine-0.1.0.dev0/tests/semantic/test_catalog.py +0 -458
- terrine-0.1.0.dev0/tests/semantic/test_sql.py +0 -32
- terrine-0.1.0.dev0/tests/spec/test_retention.py +0 -27
- terrine-0.1.0.dev0/tests/test_frame.py +0 -74
- terrine-0.1.0.dev0/tests/test_windows.py +0 -28
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/CLA.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/workflows/cla.yml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/workflows/release.yml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/workflows/scale.yml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/workflows/warehouse-backends.yml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.kata.toml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.pre-commit-config.yaml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.python-version +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.roborev.toml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/CLAUDE.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/CONTRIBUTING.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/LICENSE +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/NOTICE +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/THIRD_PARTY_NOTICES.txt +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/README.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/report.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/results/duckdb-scale-v2-small.json +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/run_duckdb.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/run_live.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/workloads/small.json +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/cost-and-residency.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/orchestrators.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/shared-dataset-contract.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/synthetic-worlds.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/index.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/research/edge-case-designs.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/research/landscape.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/research/ohdsi-study-design.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/research/point-in-time-feature-apis.md +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/batch_scoring.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/orchestrators/airflow_materialization.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/orchestrators/dagster_materialization.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/orchestrators/dbt_core_after_build.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/agent/test_dataset_tool_example.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/agent/test_dataset_tool_flow.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/backends/test_numeric.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compile/test_column_runtime_contracts.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compile/test_ltv.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/handoffs/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/handoffs/test_diff_diff.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/handoffs/test_library_handoffs.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/handoffs/test_lifelines.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/parity/test_increment_panel_parity.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/temporal/test_retention_bands.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/temporal/test_window_quotient_composition.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/test_independence.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/bigquery_fixtures.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/postgres_fixtures.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/snowflake_fixtures.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_bigquery_execution.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_bigquery_parity.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_duckdb_compiler_scale.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_duckdb_runtime_recovery.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_duckdb_scale.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_live_warehouse_scale.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_materialization_example.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_orchestrator_adapters.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_planning.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_postgres_timestamps.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_request_replay_process.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_runtime_cli.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_runtime_control.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_runtime_cost_budget.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_snowflake_execution.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_winsorization_definition.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/mkdocs.yml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/scripts/mutate.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/_time.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/adapters/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/backends/__init__.py +0 -0
- {terrine-0.1.0.dev0/tests → terrine-0.1.0.dev2/terrine/backends/engines}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/_predicates.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/event_panel.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/life_table.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/training.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/transforms.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_metadata.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/export/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/orchestration/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/py.typed +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/arrow.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/backends/base.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/changes.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/cli.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/cost.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/events.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/execute.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/gc.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/layers.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/materialize.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/owner.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/status.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/synchronization.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/time.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/simulate/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/simulate/generate.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/simulate/world.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/ranges.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/retention.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/sequence.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/sessionize.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/sketches.py +0 -0
- {terrine-0.1.0.dev0/tests/backends → terrine-0.1.0.dev2/tests}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/_timing.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/adapters/test_dbt_core_after_build.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/conftest.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_requests.py +0 -0
- {terrine-0.1.0.dev0/tests/compat → terrine-0.1.0.dev2/tests/backends}/__init__.py +0 -0
- {terrine-0.1.0.dev0/tests/compile → terrine-0.1.0.dev2/tests/compat}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/fixtures/increment.yaml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/fixtures/same-name-collision.yaml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/fixtures/unsupported-metric.yaml +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/test_semantic_interop.py +0 -0
- {terrine-0.1.0.dev0/tests/dataset → terrine-0.1.0.dev2/tests/compile}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_cost_estimates.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_survival_bounds.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_winsorization.py +0 -0
- {terrine-0.1.0.dev0/tests/execution → terrine-0.1.0.dev2/tests/dataset}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_label_support.py +0 -0
- {terrine-0.1.0.dev0/tests/fixtures → terrine-0.1.0.dev2/tests/execution}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/execution/test_snowflake_session.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/test_diff_diff.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/test_lifelines.py +0 -0
- {terrine-0.1.0.dev0/tests/integration → terrine-0.1.0.dev2/tests/fixtures}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/materialized_frame_v1.json +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_definition.json +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_fitted_definition.json +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_fitted_transform.json +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_invocation.json +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_manifest.json +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_plan_request.json +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_saved_plan.json +0 -0
- {terrine-0.1.0.dev0/tests/parity → terrine-0.1.0.dev2/tests/integration}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/integration/distribution_smoke.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/integration/postgres_scratch.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/integration/test_benchmark_failure_reporting.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/integration/test_live_scale_gate.py +0 -0
- {terrine-0.1.0.dev0/tests/reference → terrine-0.1.0.dev2/tests/parity}/__init__.py +0 -0
- {terrine-0.1.0.dev0/tests/runtime → terrine-0.1.0.dev2/tests/reference}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/baseline.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/nonadditive.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/panels.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/ranges.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/retention.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/scale_metrics.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/test_baseline.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/test_panels.py +0 -0
- {terrine-0.1.0.dev0/tests/semantic → terrine-0.1.0.dev2/tests/runtime}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_arrow_output.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_batch_cleanup.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_cancel_publication.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_cli.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_control_recovery.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_cost_estimates.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_duckdb_publication.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_execute.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_gc.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_imports.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_invalidation.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_leases.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_opentelemetry.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_planner.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_recovery_lease.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_request_replay.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_run_events.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_run_status.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_snapshot_lifecycle.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_state.py +0 -0
- {terrine-0.1.0.dev0/tests/simulate → terrine-0.1.0.dev2/tests/semantic}/__init__.py +0 -0
- {terrine-0.1.0.dev0/tests/spec → terrine-0.1.0.dev2/tests/simulate}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/simulate/test_world.py +0 -0
- {terrine-0.1.0.dev0/tests/temporal → terrine-0.1.0.dev2/tests/spec}/__init__.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_sketch_refusal.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_range_scaling.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_retention.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_sequence.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_sessionize.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_sketches.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_common_stack_interop.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_distribution.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_documentation.py +0 -0
- {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_mutation_runner.py +0 -0
|
@@ -72,6 +72,10 @@ jobs:
|
|
|
72
72
|
--splits 6 --group ${{ matrix.group }}
|
|
73
73
|
--splitting-algorithm least_duration
|
|
74
74
|
--durations-path integration/.test_durations
|
|
75
|
+
# The same known answers compiled through the portable base expression
|
|
76
|
+
# policy; about twenty seconds beside the native run.
|
|
77
|
+
- if: matrix.group == 1
|
|
78
|
+
run: uv run pytest -q integration/conformance --generic-dialect
|
|
75
79
|
docs-and-examples:
|
|
76
80
|
runs-on: ubuntu-latest
|
|
77
81
|
timeout-minutes: 30
|
|
@@ -94,12 +94,30 @@ Reached schedules and deadlines use notify.* for the current owner, or the autho
|
|
|
94
94
|
random sample without replacement; the default executes every mutant.
|
|
95
95
|
Campaigns are local only, not part of ordinary checks or CI.
|
|
96
96
|
- `make test-postgres` runs the live PostgreSQL probes (`@pytest.mark.postgres`,
|
|
97
|
-
deselected by default)
|
|
97
|
+
deselected by default) and then the conformance known answers with the
|
|
98
|
+
portable base expression policy forced; they fail, never skip, without
|
|
98
99
|
`TERRINE_TEST_POSTGRES_*` settings. Start a throwaway local server with
|
|
99
100
|
`eval "$(uv run python -m tests.integration.postgres_scratch start)"` and stop it
|
|
100
101
|
with `uv run python -m tests.integration.postgres_scratch stop`. CI runs them
|
|
101
102
|
on every push against a PostgreSQL 16 service container. Each probe owns a
|
|
102
103
|
uniquely named schema; never share a warehouse namespace between tests.
|
|
104
|
+
- `uv run pytest integration/conformance` runs known answers on DuckDB by default,
|
|
105
|
+
with parameters derived from the verified engine registry. Select the same cases
|
|
106
|
+
on a configured scratch warehouse with
|
|
107
|
+
`uv run --extra <engine> pytest integration/conformance -m <engine>` for
|
|
108
|
+
`postgres`, `bigquery` or `snowflake`; they are also included in the matching
|
|
109
|
+
`make test-<engine>` target. The module's connection-fixture table must cover
|
|
110
|
+
every registered engine. Add `--generic-dialect` to compile the same known
|
|
111
|
+
answers with the portable base expression policy on each real connection
|
|
112
|
+
(`uv run pytest integration/conformance --generic-dialect`; with
|
|
113
|
+
`--extra postgres ... -m postgres` on the scratch server). The forced run
|
|
114
|
+
takes about twenty seconds per backend and is part of the integration and
|
|
115
|
+
PostgreSQL checks on every push; the portable policy's own numerical and
|
|
116
|
+
relational oracles live in `integration/backends/test_generic.py` and force
|
|
117
|
+
it unconditionally, and its real unregistered-backend reads on Ibis SQLite
|
|
118
|
+
live in `integration/execution/test_generic_provider.py`. Test module
|
|
119
|
+
basenames under `integration/` must be unique: the tree has no packages, so
|
|
120
|
+
two `test_x.py` files cannot both be collected.
|
|
103
121
|
- `make test-bigquery` runs the live BigQuery probes (`@pytest.mark.bigquery`,
|
|
104
122
|
deselected by default); they fail, never skip, without
|
|
105
123
|
`TERRINE_TEST_BIGQUERY_PROJECT`, `TERRINE_TEST_BIGQUERY_DATASET` and
|
|
@@ -242,16 +260,47 @@ Reached schedules and deadlines use notify.* for the current owner, or the autho
|
|
|
242
260
|
raw SQL strings or `@ibis.udf.*.builtin` bindings to native functions there;
|
|
243
261
|
ruff (`TID251`) rejects `ibis.udf` and `ibis.to_sql` outside the allowed
|
|
244
262
|
packages.
|
|
245
|
-
- When Ibis lacks or mistranslates an operation on a supported backend,
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
263
|
+
- When Ibis lacks or mistranslates an operation on a supported backend, implement
|
|
264
|
+
the override in that engine's `terrine/backends/engines/<name>.py` dialect,
|
|
265
|
+
with a live parity test, not a workaround at each call site. Shared helpers
|
|
266
|
+
(`numeric`, `timestamps`, `joins`, `extrema`, `sequences`) delegate engine
|
|
267
|
+
differences to the selected dialect. Native function bindings belong in
|
|
268
|
+
concrete engine modules. Known Ibis gaps: no ASOF JOIN on BigQuery,
|
|
269
|
+
NULL-propagating LEAST/GREATEST there, and `interval * column` lowered through
|
|
270
|
+
`EXTRACT(SECOND ...)` (multiply integer seconds, then `.as_interval("s")`).
|
|
252
271
|
- Raw SQL is acceptable only for: terrine's own DuckDB runtime state tables
|
|
253
272
|
(`terrine/runtime/`), backend-provider catalog introspection and transaction
|
|
254
|
-
control (`terrine/execution/`),
|
|
273
|
+
control (`terrine/execution/`), admitted user SQL relations, and the existing
|
|
274
|
+
qualified read-only PostgreSQL identity callback in `terrine/backends/engines/`.
|
|
275
|
+
- `terrine/backends/registry.py` owns verified engine names, capability values,
|
|
276
|
+
feature boundaries and lazy dialect, identity and execution-provider paths.
|
|
277
|
+
Add an engine through that registry and one concrete dialect override module,
|
|
278
|
+
with admission evidence; do not introduce supported-engine lists in consumers.
|
|
279
|
+
Capability inspection is metadata-only and never runs querying identity admission.
|
|
280
|
+
`tests/test_engine_dispatch.py` rejects engine-name selection outside those
|
|
281
|
+
modules; it is a heuristic review aid, not proof of centralized dispatch.
|
|
282
|
+
- Backends have three tiers. Verified engines are the `ENGINES` registrations
|
|
283
|
+
with native dialect overrides and consistent-view providers. Any other
|
|
284
|
+
genuine Ibis backend is unverified: it refuses by default and, only after a
|
|
285
|
+
Model's `allow_unverified=True`, runs read-only statement-scoped reads under
|
|
286
|
+
the separate `GENERIC` record, whose expression policy is the unmodified
|
|
287
|
+
base `Dialect` in `terrine/backends/dialect.py` and whose provider is
|
|
288
|
+
`terrine/execution/_generic.py`. Raw drivers, name-only objects and failed
|
|
289
|
+
registered identities stay refused with or without the flag, as do every
|
|
290
|
+
effect (staging, retained capture, publication, reopening) on an unverified
|
|
291
|
+
backend. Extend the portable tier by completing the base `Dialect` method
|
|
292
|
+
or adding an operation-specific coded refusal there, never by naming a
|
|
293
|
+
backend; a base default must not advertise an operation a registered
|
|
294
|
+
engine's `operations` declaration excludes, so add the engine override that
|
|
295
|
+
keeps its refusal. The portable policy answers exactly or refuses by code:
|
|
296
|
+
lazy scalar known-answer witnesses (exact decimals, UTC wall clocks across
|
|
297
|
+
daylight saving) run once per execution context before source rows are
|
|
298
|
+
read, and accumulations are withheld by a derived magnitude bound rather
|
|
299
|
+
than trusted to the backend.
|
|
300
|
+
- The PostgreSQL engine's identity callback owns the existing qualified,
|
|
301
|
+
read-only `SELECT pg_catalog.version()` admission exception. It checks the
|
|
302
|
+
Ibis floor before reading identity and refuses before source metadata access;
|
|
303
|
+
expression policies otherwise issue no connection probes.
|
|
255
304
|
- Warehouse results match the DuckDB reference within a stated tolerance
|
|
256
305
|
(floats: tight, relative to the window's absolute sum, since cancellation
|
|
257
306
|
defeats a purely relative bound; exact for counts and decimal sums).
|