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.
Files changed (549) hide show
  1. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/workflows/ci.yml +4 -0
  2. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.gitignore +1 -0
  3. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/AGENTS.md +58 -9
  4. terrine-0.1.0.dev2/CHANGELOG.md +653 -0
  5. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/Makefile +3 -1
  6. terrine-0.1.0.dev2/PKG-INFO +221 -0
  7. terrine-0.1.0.dev2/README.md +164 -0
  8. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/run_overhead.py +12 -12
  9. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/workloads.py +8 -8
  10. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/backend-compatibility.md +264 -18
  11. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/candidate-anchors.md +41 -3
  12. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/capabilities.md +21 -15
  13. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/common-feature-patterns.md +25 -40
  14. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/common-stack-interop.md +26 -7
  15. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/dataset-agent-tools.md +6 -2
  16. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/design-specs.md +15 -2
  17. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/design-validation.md +58 -0
  18. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/first-dataset.md +62 -23
  19. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/increment-compatibility.md +1 -1
  20. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/index.md +6 -3
  21. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/library-handoffs.md +128 -0
  22. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/limitations.md +2 -2
  23. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/materialization-runtime.md +1 -1
  24. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/ml-staging.md +3 -1
  25. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/public-api.md +89 -17
  26. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/semantic-layer-interop.md +1 -1
  27. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/sequential-panels.md +23 -19
  28. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/state-panels.md +15 -9
  29. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/temporal-attributes.md +8 -1
  30. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/temporal-engine.md +232 -91
  31. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/trajectories-survival.md +56 -22
  32. terrine-0.1.0.dev2/docs/reference/refusals.md +576 -0
  33. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/evals/agent_dataset_tools.yaml +2 -2
  34. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/bigquery/dataset.py +9 -9
  35. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/common_stack_interop.py +7 -7
  36. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/dataset_agent_tools.py +8 -11
  37. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/event_sequences.py +5 -5
  38. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/first_dataset.py +1 -1
  39. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/increment_parity.py +14 -14
  40. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/materialization_runtime.py +9 -9
  41. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/ml_staging.py +8 -8
  42. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/nonadditive_metrics.py +13 -13
  43. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/postgres/dataset.py +9 -9
  44. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/retention_and_winsorization.py +1 -1
  45. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/retention_metrics.py +5 -5
  46. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/sequential_trials.py +11 -13
  47. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/snowflake/dataset.py +9 -9
  48. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/state_panel.py +12 -14
  49. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/table_first_dataset.py +19 -18
  50. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/trajectories_survival.py +18 -19
  51. terrine-0.1.0.dev2/examples/unverified_backend.py +150 -0
  52. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/.test_durations +352 -255
  53. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/agent/test_dataset_tool_runtime.py +7 -7
  54. terrine-0.1.0.dev2/integration/backends/test_engine_registry.py +25 -0
  55. terrine-0.1.0.dev2/integration/backends/test_generic.py +805 -0
  56. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compat/test_native_catalog.py +7 -7
  57. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compile/test_boolean_outputs.py +8 -8
  58. terrine-0.1.0.dev2/integration/compile/test_design_describe.py +299 -0
  59. terrine-0.1.0.dev2/integration/compile/test_frame_runtime_window_export.py +350 -0
  60. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compile/test_retention.py +1 -1
  61. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compile/test_time_to_event.py +44 -4
  62. terrine-0.1.0.dev2/integration/conformance/test_engines.py +348 -0
  63. terrine-0.1.0.dev2/integration/conftest.py +24 -0
  64. terrine-0.1.0.dev2/integration/execution/test_generic_provider.py +439 -0
  65. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/handoffs/conftest.py +3 -0
  66. terrine-0.1.0.dev2/integration/handoffs/test_causal_grid.py +208 -0
  67. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/state_panels/test_state_panel_workflows.py +14 -14
  68. terrine-0.1.0.dev2/integration/test_model_from_tables.py +123 -0
  69. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_backend_capabilities.py +16 -10
  70. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_bigquery_admission.py +7 -7
  71. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_incremental_equivalence.py +31 -31
  72. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_ml_staging_duckdb.py +94 -23
  73. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_ml_staging_examples.py +15 -17
  74. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_postgres_admission.py +10 -9
  75. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_postgres_execution.py +10 -7
  76. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_postgres_shapes.py +33 -14
  77. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_postgres_windows.py +21 -38
  78. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_runtime_api.py +15 -15
  79. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_saved_plan_restart.py +16 -16
  80. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_snapshot_capture_bounds.py +7 -7
  81. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_snapshot_partition_consistency.py +9 -9
  82. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_snowflake_admission.py +7 -7
  83. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_snowflake_parity.py +13 -13
  84. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/pyproject.toml +4 -1
  85. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tach.toml +11 -7
  86. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/__init__.py +21 -1
  87. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/adapters/increment.py +32 -23
  88. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/adapters/opentelemetry.py +9 -2
  89. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/definitions.py +12 -6
  90. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/design_schema.py +39 -11
  91. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/policy.py +35 -13
  92. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/schemas.py +5 -3
  93. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/tools.py +30 -17
  94. terrine-0.1.0.dev2/terrine/backends/capabilities.py +64 -0
  95. terrine-0.1.0.dev2/terrine/backends/dialect.py +734 -0
  96. terrine-0.1.0.dev2/terrine/backends/engines/bigquery.py +192 -0
  97. terrine-0.1.0.dev2/terrine/backends/engines/duckdb.py +384 -0
  98. terrine-0.1.0.dev2/terrine/backends/engines/postgres.py +355 -0
  99. terrine-0.1.0.dev2/terrine/backends/engines/snowflake.py +277 -0
  100. terrine-0.1.0.dev2/terrine/backends/extrema.py +25 -0
  101. terrine-0.1.0.dev2/terrine/backends/joins.py +41 -0
  102. terrine-0.1.0.dev2/terrine/backends/numeric.py +484 -0
  103. terrine-0.1.0.dev2/terrine/backends/registry.py +284 -0
  104. terrine-0.1.0.dev2/terrine/backends/sequences.py +14 -0
  105. terrine-0.1.0.dev2/terrine/backends/timestamps.py +242 -0
  106. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/_asof.py +12 -10
  107. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/anchors.py +69 -41
  108. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/columns.py +136 -29
  109. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/cost.py +19 -9
  110. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/dispatch.py +12 -5
  111. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/layers.py +12 -6
  112. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/materialize.py +3 -2
  113. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/provenance.py +12 -9
  114. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/ranges.py +5 -3
  115. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/retention.py +1 -1
  116. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/_observations.py +10 -5
  117. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/calendar_comparison.py +20 -19
  118. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/cohorts.py +34 -17
  119. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/event_sequence.py +11 -7
  120. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/ltv.py +38 -12
  121. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/matched_t0.py +3 -0
  122. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/sequential.py +31 -33
  123. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/state_panel.py +12 -14
  124. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/time_to_event.py +13 -14
  125. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/data.py +414 -76
  126. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/export.py +10 -2
  127. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/manifest.py +43 -38
  128. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/reference.py +36 -12
  129. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/splits.py +115 -89
  130. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/errors.py +34 -4
  131. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_bigquery.py +81 -14
  132. terrine-0.1.0.dev2/terrine/execution/_generic.py +385 -0
  133. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_native.py +57 -8
  134. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_postgres.py +90 -82
  135. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_publish.py +1 -1
  136. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_snowflake.py +93 -23
  137. terrine-0.1.0.dev2/terrine/execution/backend.py +100 -0
  138. terrine-0.1.0.dev2/terrine/execution/gates.py +340 -0
  139. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/inputs.py +64 -20
  140. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/export/diff_diff.py +9 -6
  141. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/export/lifelines.py +18 -9
  142. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/export/preflight.py +28 -15
  143. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/export/surrogate.py +22 -7
  144. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/frame.py +190 -61
  145. terrine-0.1.0.dev2/terrine/metrics.py +154 -0
  146. terrine-0.1.0.dev2/terrine/model.py +746 -0
  147. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/orchestration/airflow.py +26 -7
  148. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/orchestration/dagster.py +29 -6
  149. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/recipes.py +105 -48
  150. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/api.py +50 -26
  151. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/backends/duckdb.py +5 -5
  152. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/control.py +7 -3
  153. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/graph.py +5 -5
  154. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/leases.py +9 -2
  155. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/planner.py +14 -6
  156. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/planning.py +20 -16
  157. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/saved_plan.py +18 -8
  158. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/snapshot.py +20 -13
  159. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/state.py +2 -2
  160. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/bind.py +75 -58
  161. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/io.py +32 -4
  162. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/models.py +19 -19
  163. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/rules.py +16 -11
  164. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/sql.py +92 -27
  165. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/simulate/baseline.yaml +11 -11
  166. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/simulate/scale.py +25 -8
  167. terrine-0.1.0.dev2/terrine/spec/anchors.py +249 -0
  168. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/dataset.py +54 -13
  169. terrine-0.1.0.dev2/terrine/spec/describe.py +735 -0
  170. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/design.py +80 -41
  171. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/expressions.py +161 -89
  172. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/io.py +88 -56
  173. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/panels.py +149 -68
  174. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/sequence.py +26 -21
  175. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/state_panel.py +100 -48
  176. terrine-0.1.0.dev2/terrine/spec/trajectory.py +174 -0
  177. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/transforms.py +5 -0
  178. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/validate.py +355 -133
  179. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/aggregate.py +202 -113
  180. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/attributes.py +98 -74
  181. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/daily.py +54 -74
  182. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/first.py +9 -31
  183. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/lookup.py +15 -10
  184. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/nonadditive.py +22 -10
  185. terrine-0.1.0.dev2/terrine/temporal/prefix.py +144 -0
  186. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/readiness.py +8 -2
  187. terrine-0.1.0.dev2/terrine/windows.py +84 -0
  188. terrine-0.1.0.dev2/tests/.test_durations +2033 -0
  189. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/_worlds.py +9 -9
  190. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/adapters/test_airflow.py +24 -0
  191. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/adapters/test_dagster.py +27 -1
  192. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/fixtures/catalog.yaml +7 -7
  193. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_inspect_design.py +57 -17
  194. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_materialize.py +1 -1
  195. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_plan_authorization.py +3 -3
  196. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_policy.py +56 -1
  197. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_schemas.py +9 -5
  198. terrine-0.1.0.dev2/tests/backends/test_engine_registry.py +225 -0
  199. terrine-0.1.0.dev2/tests/backends/test_generic.py +457 -0
  200. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/backends/test_numeric.py +58 -5
  201. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/backends/test_sequences.py +1 -1
  202. terrine-0.1.0.dev2/tests/backends/test_timestamps.py +150 -0
  203. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/fixtures/catalog.yaml +23 -23
  204. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/test_increment_semantics.py +9 -1
  205. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_anchors.py +89 -26
  206. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_cohorts.py +17 -0
  207. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_columns.py +143 -18
  208. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_completeness_columns.py +1 -1
  209. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_event_sequence.py +18 -34
  210. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_ltv.py +74 -11
  211. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_matched_t0.py +10 -10
  212. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_nonadditive.py +24 -24
  213. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_panels.py +76 -40
  214. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_persisted_layers.py +33 -18
  215. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_range_scaling.py +11 -10
  216. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_retention.py +14 -11
  217. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_state_panel.py +45 -25
  218. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_time_to_event.py +14 -14
  219. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/conftest.py +14 -0
  220. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_definition.py +21 -14
  221. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_manifest.py +71 -3
  222. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_runtime_staging.py +1 -1
  223. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_splits.py +30 -9
  224. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_staging.py +18 -2
  225. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_training_view.py +60 -14
  226. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_winsorization_definition.py +3 -0
  227. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/documentation.py +5 -1
  228. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/execution/test_backend_provider.py +129 -27
  229. terrine-0.1.0.dev2/tests/execution/test_gates.py +392 -0
  230. terrine-0.1.0.dev2/tests/execution/test_generic.py +311 -0
  231. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/execution/test_inputs.py +9 -9
  232. terrine-0.1.0.dev2/tests/execution/test_sql_verification.py +106 -0
  233. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/conftest.py +3 -0
  234. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/test_preflight.py +14 -0
  235. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/test_surrogate.py +25 -0
  236. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/test_warehouse_preflight.py +40 -0
  237. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/baseline.py +3 -0
  238. terrine-0.1.0.dev2/tests/fixtures/definition_v2.json +1 -0
  239. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/interop.py +9 -9
  240. terrine-0.1.0.dev2/tests/fixtures/readme.py +73 -0
  241. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/test_baseline.py +3 -0
  242. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/winsorization.py +14 -14
  243. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/integration/study_api_smoke.py +9 -9
  244. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/parity/test_increment_frames.py +14 -14
  245. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/test_event_sequences.py +5 -5
  246. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_api.py +8 -8
  247. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_backend_capabilities.py +3 -2
  248. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_control_ipc.py +3 -5
  249. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_graph.py +1 -1
  250. terrine-0.1.0.dev2/tests/runtime/test_input_refusals.py +194 -0
  251. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_layers.py +49 -12
  252. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_planning.py +7 -4
  253. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_saved_plan.py +9 -9
  254. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_snapshot.py +10 -10
  255. terrine-0.1.0.dev2/tests/semantic/test_catalog.py +280 -0
  256. terrine-0.1.0.dev2/tests/semantic/test_from_tables.py +686 -0
  257. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/semantic/test_metric_rules.py +17 -1
  258. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/semantic/test_rules_import.py +7 -3
  259. terrine-0.1.0.dev2/tests/semantic/test_sql.py +94 -0
  260. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/simulate/test_scale_generator.py +44 -8
  261. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_calendar_comparison.py +24 -19
  262. terrine-0.1.0.dev2/tests/spec/test_describe.py +358 -0
  263. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_design_io.py +170 -61
  264. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_expressions.py +0 -13
  265. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_nonadditive_spec.py +37 -3
  266. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_panels.py +18 -26
  267. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_recipes.py +213 -40
  268. terrine-0.1.0.dev2/tests/spec/test_refusals.py +477 -0
  269. terrine-0.1.0.dev2/tests/spec/test_retention.py +51 -0
  270. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_sequence.py +4 -1
  271. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_state_panel.py +22 -15
  272. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_validate.py +198 -76
  273. terrine-0.1.0.dev2/tests/temporal/__init__.py +0 -0
  274. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_first_occurrence.py +21 -0
  275. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_nonadditive.py +4 -4
  276. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_prefix_lookup.py +80 -5
  277. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_readiness.py +5 -0
  278. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_scd2_attributes.py +34 -29
  279. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_semantic_binding.py +45 -45
  280. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_sparse_state.py +10 -2
  281. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_window_aggregates.py +128 -8
  282. terrine-0.1.0.dev2/tests/test_engine_dispatch.py +401 -0
  283. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_errors.py +0 -22
  284. terrine-0.1.0.dev2/tests/test_frame.py +211 -0
  285. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_frame_runtime.py +37 -2
  286. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_metadata.py +216 -41
  287. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_optional_dependencies.py +1 -0
  288. terrine-0.1.0.dev2/tests/test_public_docstrings.py +41 -0
  289. terrine-0.1.0.dev2/tests/test_windows.py +39 -0
  290. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/uv.lock +1 -1
  291. terrine-0.1.0.dev0/CHANGELOG.md +0 -300
  292. terrine-0.1.0.dev0/PKG-INFO +0 -164
  293. terrine-0.1.0.dev0/README.md +0 -107
  294. terrine-0.1.0.dev0/docs/reference/refusals.md +0 -498
  295. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-16-terrine-build.md +0 -416
  296. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-16-terrine-dataset-workflows.md +0 -164
  297. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-16-terrine-study-api.md +0 -312
  298. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-16-terrine-temporal.md +0 -345
  299. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-17-terrine-frame.md +0 -182
  300. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-event-sequences.md +0 -200
  301. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-materialization-runtime.md +0 -267
  302. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-ml-staging.md +0 -201
  303. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-orchestrators.md +0 -131
  304. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-sequential-panels.md +0 -183
  305. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-trajectories-survival.md +0 -269
  306. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-18-terrine-warehouse-scale.md +0 -163
  307. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-agent-tools.md +0 -181
  308. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-fast-tests-inventory.md +0 -478
  309. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-fast-tests-ledger.md +0 -561
  310. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-fast-tests.md +0 -145
  311. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-interop.md +0 -202
  312. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-library-handoffs.md +0 -81
  313. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-19-terrine-release-readiness.md +0 -100
  314. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-20-terrine-test-tiers.md +0 -113
  315. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-21-terrine-postgres-execution.md +0 -170
  316. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-22-bigquery-execution.md +0 -66
  317. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-22-ibis-study-queries.md +0 -73
  318. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-22-postgres-float-windows.md +0 -56
  319. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-23-exact-float-windows.md +0 -88
  320. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-23-snowflake-execution.md +0 -323
  321. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-24-mutation-audit.md +0 -80
  322. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-24-test-suite-speed.md +0 -68
  323. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-26-public-readiness.md +0 -255
  324. terrine-0.1.0.dev0/docs/superpowers/plans/2026-10-26-table-first-binding-and-recipes.md +0 -184
  325. terrine-0.1.0.dev0/docs/superpowers/plans/ledger-compile.md +0 -345
  326. terrine-0.1.0.dev0/docs/superpowers/plans/ledger-dataset.md +0 -136
  327. terrine-0.1.0.dev0/docs/superpowers/plans/ledger-runtime.md +0 -180
  328. terrine-0.1.0.dev0/docs/superpowers/plans/ledger-test-tiers-misc.md +0 -14
  329. terrine-0.1.0.dev0/docs/superpowers/plans/ledger-test-tiers-state-panels.md +0 -37
  330. terrine-0.1.0.dev0/docs/superpowers/plans/ledger-test-tiers-temporal.md +0 -29
  331. terrine-0.1.0.dev0/docs/superpowers/specs/2026-10-16-terrine-handoff.md +0 -635
  332. terrine-0.1.0.dev0/docs/superpowers/specs/2026-10-17-terrine-frame-design.md +0 -135
  333. terrine-0.1.0.dev0/docs/superpowers/specs/2026-10-18-terrine-scope-datasets-only.md +0 -76
  334. terrine-0.1.0.dev0/docs/superpowers/specs/2026-10-26-table-first-binding-and-recipes-design.md +0 -146
  335. terrine-0.1.0.dev0/integration/compile/test_frame_runtime_window_export.py +0 -34
  336. terrine-0.1.0.dev0/integration/conftest.py +0 -1
  337. terrine-0.1.0.dev0/integration/test_model_from_tables.py +0 -177
  338. terrine-0.1.0.dev0/terrine/backends/capabilities.py +0 -117
  339. terrine-0.1.0.dev0/terrine/backends/dialect.py +0 -55
  340. terrine-0.1.0.dev0/terrine/backends/extrema.py +0 -40
  341. terrine-0.1.0.dev0/terrine/backends/joins.py +0 -75
  342. terrine-0.1.0.dev0/terrine/backends/numeric.py +0 -657
  343. terrine-0.1.0.dev0/terrine/backends/sequences.py +0 -40
  344. terrine-0.1.0.dev0/terrine/backends/timestamps.py +0 -421
  345. terrine-0.1.0.dev0/terrine/execution/backend.py +0 -349
  346. terrine-0.1.0.dev0/terrine/execution/gates.py +0 -90
  347. terrine-0.1.0.dev0/terrine/model.py +0 -397
  348. terrine-0.1.0.dev0/terrine/spec/anchors.py +0 -107
  349. terrine-0.1.0.dev0/terrine/spec/trajectory.py +0 -144
  350. terrine-0.1.0.dev0/terrine/temporal/prefix.py +0 -104
  351. terrine-0.1.0.dev0/terrine/windows.py +0 -54
  352. terrine-0.1.0.dev0/tests/.test_durations +0 -1229
  353. terrine-0.1.0.dev0/tests/backends/test_timestamps.py +0 -62
  354. terrine-0.1.0.dev0/tests/semantic/test_catalog.py +0 -458
  355. terrine-0.1.0.dev0/tests/semantic/test_sql.py +0 -32
  356. terrine-0.1.0.dev0/tests/spec/test_retention.py +0 -27
  357. terrine-0.1.0.dev0/tests/test_frame.py +0 -74
  358. terrine-0.1.0.dev0/tests/test_windows.py +0 -28
  359. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/CLA.md +0 -0
  360. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/workflows/cla.yml +0 -0
  361. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/workflows/release.yml +0 -0
  362. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/workflows/scale.yml +0 -0
  363. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.github/workflows/warehouse-backends.yml +0 -0
  364. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.kata.toml +0 -0
  365. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.pre-commit-config.yaml +0 -0
  366. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.python-version +0 -0
  367. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/.roborev.toml +0 -0
  368. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/CLAUDE.md +0 -0
  369. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/CONTRIBUTING.md +0 -0
  370. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/LICENSE +0 -0
  371. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/NOTICE +0 -0
  372. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/THIRD_PARTY_NOTICES.txt +0 -0
  373. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/README.md +0 -0
  374. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/report.py +0 -0
  375. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/results/duckdb-scale-v2-small.json +0 -0
  376. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/run_duckdb.py +0 -0
  377. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/run_live.py +0 -0
  378. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/benchmarks/workloads/small.json +0 -0
  379. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/cost-and-residency.md +0 -0
  380. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/orchestrators.md +0 -0
  381. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/shared-dataset-contract.md +0 -0
  382. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/guides/synthetic-worlds.md +0 -0
  383. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/index.md +0 -0
  384. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/research/edge-case-designs.md +0 -0
  385. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/research/landscape.md +0 -0
  386. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/research/ohdsi-study-design.md +0 -0
  387. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/docs/research/point-in-time-feature-apis.md +0 -0
  388. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/batch_scoring.py +0 -0
  389. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/orchestrators/airflow_materialization.py +0 -0
  390. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/orchestrators/dagster_materialization.py +0 -0
  391. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/examples/orchestrators/dbt_core_after_build.py +0 -0
  392. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/agent/test_dataset_tool_example.py +0 -0
  393. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/agent/test_dataset_tool_flow.py +0 -0
  394. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/backends/test_numeric.py +0 -0
  395. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compile/test_column_runtime_contracts.py +0 -0
  396. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/compile/test_ltv.py +0 -0
  397. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/handoffs/__init__.py +0 -0
  398. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/handoffs/test_diff_diff.py +0 -0
  399. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/handoffs/test_library_handoffs.py +0 -0
  400. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/handoffs/test_lifelines.py +0 -0
  401. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/parity/test_increment_panel_parity.py +0 -0
  402. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/temporal/test_retention_bands.py +0 -0
  403. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/temporal/test_window_quotient_composition.py +0 -0
  404. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/test_independence.py +0 -0
  405. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/bigquery_fixtures.py +0 -0
  406. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/postgres_fixtures.py +0 -0
  407. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/snowflake_fixtures.py +0 -0
  408. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_bigquery_execution.py +0 -0
  409. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_bigquery_parity.py +0 -0
  410. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_duckdb_compiler_scale.py +0 -0
  411. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_duckdb_runtime_recovery.py +0 -0
  412. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_duckdb_scale.py +0 -0
  413. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_live_warehouse_scale.py +0 -0
  414. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_materialization_example.py +0 -0
  415. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_orchestrator_adapters.py +0 -0
  416. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_planning.py +0 -0
  417. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_postgres_timestamps.py +0 -0
  418. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_request_replay_process.py +0 -0
  419. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_runtime_cli.py +0 -0
  420. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_runtime_control.py +0 -0
  421. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_runtime_cost_budget.py +0 -0
  422. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_snowflake_execution.py +0 -0
  423. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/integration/warehouse_execution/test_winsorization_definition.py +0 -0
  424. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/mkdocs.yml +0 -0
  425. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/scripts/mutate.py +0 -0
  426. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/_time.py +0 -0
  427. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/adapters/__init__.py +0 -0
  428. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/agent/__init__.py +0 -0
  429. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/backends/__init__.py +0 -0
  430. {terrine-0.1.0.dev0/tests → terrine-0.1.0.dev2/terrine/backends/engines}/__init__.py +0 -0
  431. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/__init__.py +0 -0
  432. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/_predicates.py +0 -0
  433. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/__init__.py +0 -0
  434. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/event_panel.py +0 -0
  435. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/compile/shapes/life_table.py +0 -0
  436. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/__init__.py +0 -0
  437. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/training.py +0 -0
  438. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/dataset/transforms.py +0 -0
  439. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/__init__.py +0 -0
  440. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/execution/_metadata.py +0 -0
  441. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/export/__init__.py +0 -0
  442. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/orchestration/__init__.py +0 -0
  443. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/py.typed +0 -0
  444. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/__init__.py +0 -0
  445. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/arrow.py +0 -0
  446. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/backends/base.py +0 -0
  447. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/changes.py +0 -0
  448. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/cli.py +0 -0
  449. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/cost.py +0 -0
  450. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/events.py +0 -0
  451. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/execute.py +0 -0
  452. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/gc.py +0 -0
  453. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/layers.py +0 -0
  454. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/materialize.py +0 -0
  455. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/owner.py +0 -0
  456. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/status.py +0 -0
  457. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/runtime/synchronization.py +0 -0
  458. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/__init__.py +0 -0
  459. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/semantic/time.py +0 -0
  460. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/simulate/__init__.py +0 -0
  461. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/simulate/generate.py +0 -0
  462. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/simulate/world.py +0 -0
  463. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/spec/__init__.py +0 -0
  464. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/__init__.py +0 -0
  465. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/ranges.py +0 -0
  466. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/retention.py +0 -0
  467. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/sequence.py +0 -0
  468. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/sessionize.py +0 -0
  469. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/terrine/temporal/sketches.py +0 -0
  470. {terrine-0.1.0.dev0/tests/backends → terrine-0.1.0.dev2/tests}/__init__.py +0 -0
  471. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/_timing.py +0 -0
  472. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/adapters/test_dbt_core_after_build.py +0 -0
  473. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/conftest.py +0 -0
  474. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/agent/test_requests.py +0 -0
  475. {terrine-0.1.0.dev0/tests/compat → terrine-0.1.0.dev2/tests/backends}/__init__.py +0 -0
  476. {terrine-0.1.0.dev0/tests/compile → terrine-0.1.0.dev2/tests/compat}/__init__.py +0 -0
  477. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/fixtures/increment.yaml +0 -0
  478. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/fixtures/same-name-collision.yaml +0 -0
  479. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/fixtures/unsupported-metric.yaml +0 -0
  480. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compat/test_semantic_interop.py +0 -0
  481. {terrine-0.1.0.dev0/tests/dataset → terrine-0.1.0.dev2/tests/compile}/__init__.py +0 -0
  482. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_cost_estimates.py +0 -0
  483. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_survival_bounds.py +0 -0
  484. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/compile/test_winsorization.py +0 -0
  485. {terrine-0.1.0.dev0/tests/execution → terrine-0.1.0.dev2/tests/dataset}/__init__.py +0 -0
  486. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/dataset/test_label_support.py +0 -0
  487. {terrine-0.1.0.dev0/tests/fixtures → terrine-0.1.0.dev2/tests/execution}/__init__.py +0 -0
  488. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/execution/test_snowflake_session.py +0 -0
  489. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/test_diff_diff.py +0 -0
  490. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/export/test_lifelines.py +0 -0
  491. {terrine-0.1.0.dev0/tests/integration → terrine-0.1.0.dev2/tests/fixtures}/__init__.py +0 -0
  492. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/materialized_frame_v1.json +0 -0
  493. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_definition.json +0 -0
  494. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_fitted_definition.json +0 -0
  495. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_fitted_transform.json +0 -0
  496. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_invocation.json +0 -0
  497. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_manifest.json +0 -0
  498. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_plan_request.json +0 -0
  499. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/fixtures/pre_rename_saved_plan.json +0 -0
  500. {terrine-0.1.0.dev0/tests/parity → terrine-0.1.0.dev2/tests/integration}/__init__.py +0 -0
  501. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/integration/distribution_smoke.py +0 -0
  502. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/integration/postgres_scratch.py +0 -0
  503. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/integration/test_benchmark_failure_reporting.py +0 -0
  504. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/integration/test_live_scale_gate.py +0 -0
  505. {terrine-0.1.0.dev0/tests/reference → terrine-0.1.0.dev2/tests/parity}/__init__.py +0 -0
  506. {terrine-0.1.0.dev0/tests/runtime → terrine-0.1.0.dev2/tests/reference}/__init__.py +0 -0
  507. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/baseline.py +0 -0
  508. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/nonadditive.py +0 -0
  509. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/panels.py +0 -0
  510. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/ranges.py +0 -0
  511. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/retention.py +0 -0
  512. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/scale_metrics.py +0 -0
  513. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/test_baseline.py +0 -0
  514. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/reference/test_panels.py +0 -0
  515. {terrine-0.1.0.dev0/tests/semantic → terrine-0.1.0.dev2/tests/runtime}/__init__.py +0 -0
  516. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_arrow_output.py +0 -0
  517. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_batch_cleanup.py +0 -0
  518. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_cancel_publication.py +0 -0
  519. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_cli.py +0 -0
  520. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_control_recovery.py +0 -0
  521. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_cost_estimates.py +0 -0
  522. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_duckdb_publication.py +0 -0
  523. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_execute.py +0 -0
  524. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_gc.py +0 -0
  525. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_imports.py +0 -0
  526. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_invalidation.py +0 -0
  527. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_leases.py +0 -0
  528. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_opentelemetry.py +0 -0
  529. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_planner.py +0 -0
  530. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_recovery_lease.py +0 -0
  531. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_request_replay.py +0 -0
  532. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_run_events.py +0 -0
  533. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_run_status.py +0 -0
  534. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_snapshot_lifecycle.py +0 -0
  535. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/runtime/test_state.py +0 -0
  536. {terrine-0.1.0.dev0/tests/simulate → terrine-0.1.0.dev2/tests/semantic}/__init__.py +0 -0
  537. {terrine-0.1.0.dev0/tests/spec → terrine-0.1.0.dev2/tests/simulate}/__init__.py +0 -0
  538. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/simulate/test_world.py +0 -0
  539. {terrine-0.1.0.dev0/tests/temporal → terrine-0.1.0.dev2/tests/spec}/__init__.py +0 -0
  540. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/spec/test_sketch_refusal.py +0 -0
  541. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_range_scaling.py +0 -0
  542. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_retention.py +0 -0
  543. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_sequence.py +0 -0
  544. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_sessionize.py +0 -0
  545. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/temporal/test_sketches.py +0 -0
  546. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_common_stack_interop.py +0 -0
  547. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_distribution.py +0 -0
  548. {terrine-0.1.0.dev0 → terrine-0.1.0.dev2}/tests/test_documentation.py +0 -0
  549. {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
@@ -14,6 +14,7 @@ dist/
14
14
  build/
15
15
  *.egg-info/
16
16
  .superpowers/
17
+ docs/superpowers/
17
18
  .worktrees/
18
19
 
19
20
  # Local mutation campaigns
@@ -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); they fail, never skip, without
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, add a
246
- dispatched helper in `terrine/backends/` (`dialect`, `numeric`, `timestamps`,
247
- `joins`, `extrema`) with a live parity test, not a workaround at each call
248
- site. Supporting a new warehouse means implementing those helpers for it.
249
- Known Ibis gaps: no ASOF JOIN on BigQuery, NULL-propagating LEAST/GREATEST
250
- there, and `interval * column` lowered through `EXTRACT(SECOND ...)` (multiply
251
- integer seconds, then `.as_interval("s")`).
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/`), and admitted user SQL relations.
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).