sql-code-graph 1.37.0__tar.gz → 1.38.0__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 (641) hide show
  1. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.gitignore +3 -0
  2. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/PKG-INFO +1 -1
  3. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/docs/cli.md +8 -0
  4. sql_code_graph-1.38.0/plan/metrics/lineage_gold_set_synthetic.json +374 -0
  5. sql_code_graph-1.38.0/plan/research/snowflake_oracle_groundtruth_prep.md +245 -0
  6. sql_code_graph-1.38.0/plan/sprints/lineage_gold_regression_and_temp_collapse.md +496 -0
  7. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/pyproject.toml +1 -1
  8. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/__init__.py +1 -1
  9. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/analyze.py +42 -0
  10. sql_code_graph-1.38.0/src/sqlcg/lineage/temp_collapse.py +252 -0
  11. sql_code_graph-1.38.0/tests/fixtures/gold_set/int/f_brand.sql +7 -0
  12. sql_code_graph-1.38.0/tests/fixtures/gold_set/int/f_compo.sql +7 -0
  13. sql_code_graph-1.38.0/tests/fixtures/gold_set/int/f_fx.sql +7 -0
  14. sql_code_graph-1.38.0/tests/fixtures/gold_set/int/f_loc.sql +5 -0
  15. sql_code_graph-1.38.0/tests/fixtures/gold_set/int/f_orders.sql +7 -0
  16. sql_code_graph-1.38.0/tests/fixtures/gold_set/int/gmdf/f_freight_cost.sql +61 -0
  17. sql_code_graph-1.38.0/tests/fixtures/gold_set/int/gmdf/f_freight_ktn.sql +58 -0
  18. sql_code_graph-1.38.0/tests/fixtures/gold_set/int/gmdf/f_freight_misc.sql +68 -0
  19. sql_code_graph-1.38.0/tests/fixtures/gold_set/template/dim_person_temp.sql +15 -0
  20. sql_code_graph-1.38.0/tests/fixtures/gold_set/template/dim_staff.sql +26 -0
  21. sql_code_graph-1.38.0/tests/fixtures/gold_set/template/f_compet_article.sql +35 -0
  22. sql_code_graph-1.38.0/tests/integration/test_lineage_gold_set.py +255 -0
  23. sql_code_graph-1.38.0/tests/integration/test_temp_collapse_primitive.py +379 -0
  24. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/uv.lock +1 -1
  25. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.claude/agents/api-documenter.md +0 -0
  26. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.claude/agents/architect-planner.md +0 -0
  27. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.claude/agents/architect-reviewer.md +0 -0
  28. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.claude/agents/code-reviewer.md +0 -0
  29. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.claude/agents/developer.md +0 -0
  30. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.claude/agents/plan-reviewer.md +0 -0
  31. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.claude/agents/sprint-planner.md +0 -0
  32. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.github/ISSUE_TEMPLATE/bug_report.yml +0 -0
  33. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  34. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
  35. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.github/workflows/benchmark.yml +0 -0
  36. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.github/workflows/e2e-tests.yml +0 -0
  37. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.github/workflows/release.yml +0 -0
  38. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.github/workflows/test.yml +0 -0
  39. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.pre-commit-config.yaml +0 -0
  40. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/.sqlcgignore +0 -0
  41. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/ARCHITECTURE_REVIEW.md +0 -0
  42. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/ARCHITECTURE_REVIEW_ARCHIVE.md +0 -0
  43. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/CHANGELOG.md +0 -0
  44. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/CLAUDE.md +0 -0
  45. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/README.md +0 -0
  46. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/docs/AIRBNB_PARSE_REPORT.md +0 -0
  47. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/docs/getting-started.md +0 -0
  48. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/docs/releasing-pypi.md +0 -0
  49. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/e2e_firstuser_report.md +0 -0
  50. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/e2e_run_20260528_101413.output +0 -0
  51. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/main.py +0 -0
  52. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/WORKFLOW.md +0 -0
  53. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/measurements/pr2_catalog_load_eval.json +0 -0
  54. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/measurements/pr3_repo_native_plateau.json +0 -0
  55. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/measurements/pr4_transform_kinds.json +0 -0
  56. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/measurements/pr5_extraction_recall_taxonomy.json +0 -0
  57. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/measurements/sprint_08_changelogs_fullindex.json +0 -0
  58. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/measurements/sprint_08_fullcorpus_index.json +0 -0
  59. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/createkind_dwh_after.json +0 -0
  60. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/createkind_dwh_before.json +0 -0
  61. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/gain_1.29.0_05c6943.json +0 -0
  62. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/gain_1.30.0_2c8ac25.json +0 -0
  63. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/gain_1.30.1_26271fc.json +0 -0
  64. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/gain_1.31.0_a40c837.json +0 -0
  65. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/gain_1.32.0_c1bec3c.json +0 -0
  66. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/gain_1.36.2_f6a335a.json +0 -0
  67. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/gain_drop_alter_phantom_baseline_v1361.json +0 -0
  68. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/identifier_live_acceptance.md +0 -0
  69. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/identifier_live_after_v1.36.0.json +0 -0
  70. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/identifier_live_before_v1.35.3.json +0 -0
  71. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/lineage5_dwh_after_pr5.json +0 -0
  72. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/lineage5_dwh_before_master.json +0 -0
  73. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/pr4_star_promote_after.json +0 -0
  74. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/pr4_star_promote_before.json +0 -0
  75. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/pr_b_phantom_after.json +0 -0
  76. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/pr_b_phantom_before.json +0 -0
  77. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/pr_c_merge_after.json +0 -0
  78. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/pr_c_merge_before.json +0 -0
  79. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/schema_comparison_with_schema.json +0 -0
  80. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/schema_comparison_without_schema.json +0 -0
  81. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/sprint_08_changelogs_fullindex.json +0 -0
  82. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/sprint_08_fullcorpus_index.json +0 -0
  83. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/metrics/sprint_pool_300s_plan.json +0 -0
  84. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/column_coverage_diagnostic.md +0 -0
  85. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/column_coverage_findings.md +0 -0
  86. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/dwh_graph_analysis.md +0 -0
  87. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/dwh_positional_insert_column_blindspot.md +0 -0
  88. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/feature_acceptance_dwh.md +0 -0
  89. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/graph_health_sprint_postmortem.md +0 -0
  90. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/island_lever_live_verification.md +0 -0
  91. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/issue38_pr2_live_acceptance.md +0 -0
  92. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/issue38_pr3_live_acceptance.md +0 -0
  93. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/lineage_identity_sprint_postmortem.md +0 -0
  94. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/pr_impact_followups_2026-06-14.md +0 -0
  95. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/sprint_03_v0.3.1_postmortem.md +0 -0
  96. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/sprint_3.1_postmortem.md +0 -0
  97. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/reports/v1_14_dialect_query_config_postmortem.md +0 -0
  98. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/research/blueprint.md +0 -0
  99. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/research/coverage_parse_failure_diagnosis.md +0 -0
  100. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/research/investigation_e5_e4.md +0 -0
  101. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/research/observed_usage_overlay_query_history_tableau.md +0 -0
  102. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/research/parse_diagnostics.md +0 -0
  103. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/research/parsing_errors_experiment.md +0 -0
  104. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/research/snowflake_en_test_suite.md +0 -0
  105. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/research/sql_only_coverage_lever_post_pr2.md +0 -0
  106. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/research/sqlcg.md +0 -0
  107. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/bundle_claude_skill.md +0 -0
  108. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/ci_tests_pool_flake_fix.md +0 -0
  109. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/column_lineage_recall_metric.md +0 -0
  110. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/coverage_p1_p3_p4.md +0 -0
  111. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/coverage_p1_p5_metric.md +0 -0
  112. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/coverage_parse_failures.md +0 -0
  113. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/diff-impact-producer-file.md +0 -0
  114. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/e8_dual_emission.md +0 -0
  115. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/feature_34_unused_presentation_segregation.md +0 -0
  116. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/feature_35_external_downstream_injection.md +0 -0
  117. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/feature_F2_bundle_claude_skill.md +0 -0
  118. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/feature_generic_var_name_resolution.md +0 -0
  119. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/feature_kuzu_to_duckdb_migration.md +0 -0
  120. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/fix_backward_self_heal_index_at_sha.md +0 -0
  121. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/fix_downstream_sink_location.md +0 -0
  122. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/fix_drop_alter_phantom_source_node.md +0 -0
  123. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/fix_dynamic_table_parsing.md +0 -0
  124. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/fix_expand_qualify_perf.md +0 -0
  125. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/fix_firstuser_findings.md +0 -0
  126. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/fix_issue29_live_test_followups.md +0 -0
  127. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/fix_schema_case_mismatch.md +0 -0
  128. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/gain_coverage_metrics.md +0 -0
  129. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/graph_health_catalog_and_metrics.md +0 -0
  130. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/hygiene_config_path_and_survivors.md +0 -0
  131. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/issue-38-backfill-cte-bridge.md +0 -0
  132. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/issue-38-residual-source-extraction.md +0 -0
  133. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/issue-38-selects-from-island-lever.md +0 -0
  134. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/living_codebase_resync.md +0 -0
  135. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/mcp_server_self_healing.md +0 -0
  136. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/positional_insert_clone_blindspot.md +0 -0
  137. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_01.md +0 -0
  138. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_01_deployment_pypi.md +0 -0
  139. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_02.md +0 -0
  140. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_02_v0.3.0_core.md +0 -0
  141. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_03.md +0 -0
  142. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_04_column_lineage.md +0 -0
  143. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_04_column_lineage_fix.md +0 -0
  144. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_05_star_resolution.md +0 -0
  145. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_06_lineage_coverage.md +0 -0
  146. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_07_open_ecodes.md +0 -0
  147. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_07_perf_and_live_test.md +0 -0
  148. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_08_perf_upsert.md +0 -0
  149. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_09_lineage_coverage.md +0 -0
  150. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_10_anchor_tools.md +0 -0
  151. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_11_v1.0.2_bugfix.md +0 -0
  152. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_12_v1.1.0.md +0 -0
  153. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_13_v1.1.0_cluster_b.md +0 -0
  154. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_lineage_identity_and_session_context.md +0 -0
  155. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/sprint_postmortem_fixes.md +0 -0
  156. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/temp_table_namespacing.md +0 -0
  157. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/trust_layer.md +0 -0
  158. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/unfilled_table_impact.md +0 -0
  159. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/v1.1.0_cluster_b_provenance_trust.md +0 -0
  160. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/v1.1.0_live_graph_freshness.md +0 -0
  161. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/v1.1.1_batch_upsert_perf.md +0 -0
  162. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/v1.14.0_dialect_and_query_config_fixes.md +0 -0
  163. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/v1_1_2_bugfix.md +0 -0
  164. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/v1_1_3_union_cte_star.md +0 -0
  165. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/v1_2_0_read_proxy.md +0 -0
  166. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/v1_2_1_bugfix.md +0 -0
  167. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/version-parity-and-restart.md +0 -0
  168. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/plan/sprints/viz_usability_neighborhood_highlight.md +0 -0
  169. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/profile.html +0 -0
  170. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/pyrightconfig.json +0 -0
  171. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/scripts/collect_parse_errors.py +0 -0
  172. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/scripts/column_coverage_check.py +0 -0
  173. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/scripts/generate_cli_docs.sh +0 -0
  174. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/__main__.py +0 -0
  175. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/__init__.py +0 -0
  176. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/__init__.py +0 -0
  177. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/catalog.py +0 -0
  178. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/db.py +0 -0
  179. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/find.py +0 -0
  180. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/gain.py +0 -0
  181. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/git.py +0 -0
  182. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/index.py +0 -0
  183. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/install.py +0 -0
  184. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/mcp.py +0 -0
  185. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/reindex.py +0 -0
  186. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/report.py +0 -0
  187. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/uninstall.py +0 -0
  188. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/viz.py +0 -0
  189. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/commands/watch.py +0 -0
  190. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/coverage.py +0 -0
  191. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/cli/main.py +0 -0
  192. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/__init__.py +0 -0
  193. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/config.py +0 -0
  194. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/duckdb_backend.py +0 -0
  195. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/freshness.py +0 -0
  196. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/graph_db.py +0 -0
  197. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/jobs.py +0 -0
  198. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/noise_match.py +0 -0
  199. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/queries.cypher +0 -0
  200. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/queries.py +0 -0
  201. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/queries.sql +0 -0
  202. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/schema.cypher +0 -0
  203. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/core/schema.py +0 -0
  204. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/indexer/__init__.py +0 -0
  205. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/indexer/dbt_adapter.py +0 -0
  206. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/indexer/error_classify.py +0 -0
  207. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/indexer/git_delta.py +0 -0
  208. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/indexer/indexer.py +0 -0
  209. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/indexer/pool.py +0 -0
  210. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/indexer/walker.py +0 -0
  211. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/indexer/watcher.py +0 -0
  212. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/lineage/__init__.py +0 -0
  213. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/lineage/aggregator.py +0 -0
  214. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/lineage/schema_resolver.py +0 -0
  215. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/metrics/__init__.py +0 -0
  216. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/metrics/store.py +0 -0
  217. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/parsers/__init__.py +0 -0
  218. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/parsers/ansi_parser.py +0 -0
  219. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/parsers/base.py +0 -0
  220. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/parsers/bigquery_parser.py +0 -0
  221. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/parsers/dynamic_name.py +0 -0
  222. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/parsers/postgres_parser.py +0 -0
  223. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/parsers/registry.py +0 -0
  224. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/parsers/snowflake_parser.py +0 -0
  225. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/parsers/tsql_parser.py +0 -0
  226. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/__init__.py +0 -0
  227. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/control.py +0 -0
  228. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/exceptions.py +0 -0
  229. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/models.py +0 -0
  230. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/noise_filter.py +0 -0
  231. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/read_client.py +0 -0
  232. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/selfheal.py +0 -0
  233. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/server.py +0 -0
  234. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/skill.py +0 -0
  235. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/tools.py +0 -0
  236. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/server/writer.py +0 -0
  237. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/utils/__init__.py +0 -0
  238. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/utils/hashing.py +0 -0
  239. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/utils/ignore.py +0 -0
  240. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/utils/logging.py +0 -0
  241. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/viz/__init__.py +0 -0
  242. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/viz/assets/force-graph.min.js +0 -0
  243. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/viz/assets/template.html +0 -0
  244. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/viz/data.py +0 -0
  245. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/viz/render.py +0 -0
  246. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/src/sqlcg/viz/tags.py +0 -0
  247. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/__init__.py +0 -0
  248. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/__init__.py +0 -0
  249. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/adversarial/200_join.sql +0 -0
  250. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/adversarial/500_union.sql +0 -0
  251. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/bench_indexer.py +0 -0
  252. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/conftest.py +0 -0
  253. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
  254. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
  255. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
  256. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
  257. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
  258. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
  259. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
  260. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
  261. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
  262. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
  263. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/tpch/q01.sql +0 -0
  264. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/tpch/q02.sql +0 -0
  265. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/tpch/q03.sql +0 -0
  266. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/tpch/q04.sql +0 -0
  267. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/benchmarks/tpch/q05.sql +0 -0
  268. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/conftest.py +0 -0
  269. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/__init__.py +0 -0
  270. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/conftest.py +0 -0
  271. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_F2_skill_install_e2e.py +0 -0
  272. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_airbnb_e2e.py +0 -0
  273. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_cli_index.py +0 -0
  274. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_empty_impact_cli_e2e.py +0 -0
  275. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_git_hook_install.py +0 -0
  276. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_golden_lineage.py +0 -0
  277. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_mcp_lifecycle.py +0 -0
  278. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_mcp_tools.py +0 -0
  279. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_parse_diagnostics_cli.py +0 -0
  280. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_pr_impact_cli_e2e.py +0 -0
  281. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_selfheal_e2e.py +0 -0
  282. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_star_resolution_e2e.py +0 -0
  283. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_viz_cli_e2e.py +0 -0
  284. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/e2e/test_watch.py +0 -0
  285. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
  286. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
  287. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
  288. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
  289. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
  290. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/raw_listings.sql +0 -0
  291. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
  292. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/src_hosts.sql +0 -0
  293. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/src_listings.sql +0 -0
  294. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/airbnb/src_reviews.sql +0 -0
  295. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/bigquery/.gitkeep +0 -0
  296. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/duckdb_parity/kuzu_reference.json +0 -0
  297. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/jaffle_shop/customers.sql +0 -0
  298. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/jaffle_shop/orders.sql +0 -0
  299. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
  300. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/snowflake/base_tables.sql +0 -0
  301. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/snowflake/reports.sql +0 -0
  302. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/snowflake/views.sql +0 -0
  303. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/star_corpus/ddl_src.sql +0 -0
  304. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/star_corpus/ddl_tgt.sql +0 -0
  305. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/star_corpus/etl_alias_star.sql +0 -0
  306. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/star_corpus/etl_star.sql +0 -0
  307. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/synthetic/base_tables.sql +0 -0
  308. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/synthetic/reports.sql +0 -0
  309. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/fixtures/synthetic/views.sql +0 -0
  310. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/__init__.py +0 -0
  311. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/snowflake/__init__.py +0 -0
  312. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/snowflake/test_identifier_var_sink_resolution_integration.py +0 -0
  313. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/snowflake/test_insert_select.py +0 -0
  314. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/snowflake/test_qualify_bare_tables_command_guard_integration.py +0 -0
  315. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_T34_presentation_segregation.py +0 -0
  316. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_T35_external_consumers.py +0 -0
  317. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_analyze_case_fold.py +0 -0
  318. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_anchor_tools.py +0 -0
  319. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_backfill_impact_consistency.py +0 -0
  320. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_bare_column_cte_lineage.py +0 -0
  321. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_bulk_upsert.py +0 -0
  322. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_case_split_seed_regression.py +0 -0
  323. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_catalog_kind_upgrade.py +0 -0
  324. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_catalog_load_integration.py +0 -0
  325. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_cli_index_clear_before_rebuild.py +0 -0
  326. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_column_coverage_patterns.py +0 -0
  327. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_column_lineage_e2e.py +0 -0
  328. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_coverage_metrics_integration.py +0 -0
  329. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_cross_file_lineage.py +0 -0
  330. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_cte_key_namespacing_integration.py +0 -0
  331. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_cte_recall_guard.py +0 -0
  332. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_cte_schema_alias_guard.py +0 -0
  333. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_cte_source_node_invariant.py +0 -0
  334. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_dialect_auto_resolution.py +0 -0
  335. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_dialect_matrix.py +0 -0
  336. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_duckdb_parity.py +0 -0
  337. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_e36_xfile_regression_guard.py +0 -0
  338. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_empty_impact_blast_radius.py +0 -0
  339. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_empty_index_rollback_guard.py +0 -0
  340. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_freshness_mcp.py +0 -0
  341. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_gating_join_retrofit.py +0 -0
  342. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_hygiene_config_root_reconciliation.py +0 -0
  343. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_identity_counters_integration.py +0 -0
  344. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_impact_consumer_parity.py +0 -0
  345. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_incremental_reindex_parity.py +0 -0
  346. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_index_degraded_files_metric.py +0 -0
  347. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_index_filter_node_exclusion.py +0 -0
  348. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_indexer_batching.py +0 -0
  349. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_indexer_commits.py +0 -0
  350. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_indexer_to_graph.py +0 -0
  351. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_issue38_cte_insert_regression.py +0 -0
  352. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_join_col_resolution.py +0 -0
  353. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_key_normalization_chokepoint.py +0 -0
  354. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_live_anchors.py +0 -0
  355. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_mvcc_rebuild.py +0 -0
  356. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_non_table_create_coverage_no_regression.py +0 -0
  357. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_non_table_create_kind_in_graph.py +0 -0
  358. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_parse_diagnostics.py +0 -0
  359. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_phantom_drop_alter_node.py +0 -0
  360. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_phantom_non_table_create_node.py +0 -0
  361. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_pr1_confidence_reason.py +0 -0
  362. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_pr2_source_location.py +0 -0
  363. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_pr3_kind_tagging.py +0 -0
  364. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_pr_impact_integration.py +0 -0
  365. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_qualify_failed_persist.py +0 -0
  366. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_read_via_server.py +0 -0
  367. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_readonly_under_lock.py +0 -0
  368. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_reindex_via_server.py +0 -0
  369. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_repo_relative_cte_namespaces.py +0 -0
  370. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_resolvable_write_col_edges_integration.py +0 -0
  371. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_resync.py +0 -0
  372. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_selects_from_completeness.py +0 -0
  373. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_selects_from_cte_body_source.py +0 -0
  374. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_selects_from_subscope_source.py +0 -0
  375. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_single_writer_queue.py +0 -0
  376. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_skip_counts_integration.py +0 -0
  377. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_star_promote_temp_columns.py +0 -0
  378. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_star_resolution.py +0 -0
  379. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_temp_table_lineage.py +0 -0
  380. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_temp_table_namespacing.py +0 -0
  381. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_tool_version_stamp_integration.py +0 -0
  382. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_union_cte_star_recall_guard.py +0 -0
  383. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_usage_derived_catalog.py +0 -0
  384. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_use_schema_session_context_integration.py +0 -0
  385. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_user_surface_recall_guard.py +0 -0
  386. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_v141_surface_guards.py +0 -0
  387. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_v1_14_0_dialect_and_query_config_fixes.py +0 -0
  388. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_view_kind_in_graph.py +0 -0
  389. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_viz_data_build.py +0 -0
  390. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/integration/test_write_memory_ceiling.py +0 -0
  391. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/perf/__init__.py +0 -0
  392. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/perf/test_perf.py +0 -0
  393. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E10/__init__.py +0 -0
  394. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E11/__init__.py +0 -0
  395. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E12/__init__.py +0 -0
  396. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E12/e12_json_path.sql +0 -0
  397. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E12/e12_lateral_flatten.sql +0 -0
  398. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E12/test_e12.py +0 -0
  399. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E13/__init__.py +0 -0
  400. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E14/__init__.py +0 -0
  401. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E15/__init__.py +0 -0
  402. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E16/__init__.py +0 -0
  403. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E16/e16_merge.sql +0 -0
  404. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E16/e16_merge_delete.sql +0 -0
  405. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E16/test_e16.py +0 -0
  406. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E17/__init__.py +0 -0
  407. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E18/__init__.py +0 -0
  408. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E18/e18_decode.sql +0 -0
  409. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E18/e18_iff_decode.sql +0 -0
  410. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E18/e18_nvl2.sql +0 -0
  411. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E18/test_e18.py +0 -0
  412. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E19/__init__.py +0 -0
  413. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E2/__init__.py +0 -0
  414. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E2/e2_expr_alias.sql +0 -0
  415. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E2/e2_function_alias.sql +0 -0
  416. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E2/e2_multiply_alias.sql +0 -0
  417. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E2/test_e2.py +0 -0
  418. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E20/__init__.py +0 -0
  419. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E21/__init__.py +0 -0
  420. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E21/e21_alias_forward_ref.sql +0 -0
  421. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E21/e21_three_level_chain.sql +0 -0
  422. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E21/test_e21.py +0 -0
  423. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E22/__init__.py +0 -0
  424. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E23/__init__.py +0 -0
  425. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E23/e23_stored_proc.sql +0 -0
  426. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E23/e23_stored_proc_multi.sql +0 -0
  427. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E23/test_e23.py +0 -0
  428. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E24/__init__.py +0 -0
  429. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E25/__init__.py +0 -0
  430. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E25/e25_cross_db.sql +0 -0
  431. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E25/e25_two_part.sql +0 -0
  432. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E25/test_e25.py +0 -0
  433. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E25/test_e25_full_id.py +0 -0
  434. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E26/__init__.py +0 -0
  435. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E27/__init__.py +0 -0
  436. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E27/e27_nested_udf.sql +0 -0
  437. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E27/e27_udf.sql +0 -0
  438. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E27/test_e27.py +0 -0
  439. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E28/__init__.py +0 -0
  440. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E29/__init__.py +0 -0
  441. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E3/__init__.py +0 -0
  442. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E3/e3_alter_table.sql +0 -0
  443. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E3/e3_create_sequence.sql +0 -0
  444. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E3/e3_ddl_only.sql +0 -0
  445. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E3/test_e3.py +0 -0
  446. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E30/__init__.py +0 -0
  447. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E31/__init__.py +0 -0
  448. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E32/__init__.py +0 -0
  449. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E33/__init__.py +0 -0
  450. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E34/__init__.py +0 -0
  451. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E35/__init__.py +0 -0
  452. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E36/__init__.py +0 -0
  453. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E36/e36_temp_multi_use.sql +0 -0
  454. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E36/e36_temp_table.sql +0 -0
  455. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E36/test_e36.py +0 -0
  456. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E36/test_e36_xfile.py +0 -0
  457. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E37/__init__.py +0 -0
  458. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E38/__init__.py +0 -0
  459. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E4/__init__.py +0 -0
  460. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E4/e4_execute_immediate.sql +0 -0
  461. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E4/e4_if_not_exists.sql +0 -0
  462. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E4/e4_unexpected_token.sql +0 -0
  463. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E4/e4_unpivot.sql +0 -0
  464. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E4/test_e4.py +0 -0
  465. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E5/__init__.py +0 -0
  466. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E5/e5_cte_missing_source.sql +0 -0
  467. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E5/e5_multi_cte.sql +0 -0
  468. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E5/e5_nested_cte.sql +0 -0
  469. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E5/test_e5.py +0 -0
  470. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E5/test_e5_cte_projection.py +0 -0
  471. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E8/__init__.py +0 -0
  472. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E8/e8_dynamic_sources.sql +0 -0
  473. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E8/e8_seq_nextval.sql +0 -0
  474. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E8/e8_uuid.sql +0 -0
  475. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E8/test_e8.py +0 -0
  476. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E9/__init__.py +0 -0
  477. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_aggregates/__init__.py +0 -0
  478. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +0 -0
  479. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +0 -0
  480. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +0 -0
  481. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_aggregates/test_e_aggregates.py +0 -0
  482. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/__init__.py +0 -0
  483. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/fixture_date_aliased.sql +0 -0
  484. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +0 -0
  485. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +0 -0
  486. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +0 -0
  487. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/E_date_functions/test_e_date_functions.py +0 -0
  488. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/README.md +0 -0
  489. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/__init__.py +0 -0
  490. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/anchors/__init__.py +0 -0
  491. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/anchors/fixture_etl.sql +0 -0
  492. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/anchors/fixture_omloopsnelheid.sql +0 -0
  493. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/anchors/fixture_semantic.sql +0 -0
  494. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/anchors/fixture_source.sql +0 -0
  495. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +0 -0
  496. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +0 -0
  497. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/conftest.py +0 -0
  498. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/snowflake/test_plan_review_gates.py +0 -0
  499. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/__init__.py +0 -0
  500. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/snowflake/__init__.py +0 -0
  501. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/snowflake/test_qualify_bare_tables_command_guard.py +0 -0
  502. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/snowflake/test_scripting_noise.py +0 -0
  503. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_BugB_escalation_uses_init_path.py +0 -0
  504. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_BugC_hook_upgrade.py +0 -0
  505. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_F2_install_skill.py +0 -0
  506. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_F2_skill_render.py +0 -0
  507. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_F2_uninstall_skill.py +0 -0
  508. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_T09_01_qualify_once.py +0 -0
  509. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_T09_02_ddl_skip.py +0 -0
  510. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_T09_04_subprocess_isolate.py +0 -0
  511. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_T09_06_log_verbosity.py +0 -0
  512. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_T35_config_external_consumers.py +0 -0
  513. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_aggregator.py +0 -0
  514. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_aggregator_skip.py +0 -0
  515. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_analyze_case_fold.py +0 -0
  516. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_base_parser.py +0 -0
  517. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_branch_monitor.py +0 -0
  518. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_bulk_upsert_invariant.py +0 -0
  519. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_canonical_target_resolution.py +0 -0
  520. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_catalog_csv_parsing.py +0 -0
  521. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_catalog_missing_warning.py +0 -0
  522. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_classify_non_table_create_kind.py +0 -0
  523. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_cli.py +0 -0
  524. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_cli_doc_flag_staleness.py +0 -0
  525. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_cli_help.py +0 -0
  526. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_clone_positional_insert_blindspot.py +0 -0
  527. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_closure_depth.py +0 -0
  528. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_column_lineage_wiring.py +0 -0
  529. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_config.py +0 -0
  530. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_coverage_metrics.py +0 -0
  531. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_cte_key_namespacing.py +0 -0
  532. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_cte_source_gap_metric.py +0 -0
  533. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_data_models.py +0 -0
  534. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_db_info.py +0 -0
  535. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_db_info_coverage.py +0 -0
  536. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_db_path_isolation_fixture.py +0 -0
  537. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_doc_links.py +0 -0
  538. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_doc_markdown_link_existence.py +0 -0
  539. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_dominant_cause.py +0 -0
  540. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_duckdb_backend.py +0 -0
  541. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_duckdb_backend_shared.py +0 -0
  542. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_dynamic_name_resolution.py +0 -0
  543. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_e5_view_alias_resolution.py +0 -0
  544. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_e8_dual_emission.py +0 -0
  545. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_e8_temp_chain_key_mismatch.py +0 -0
  546. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_empty_propagation_unit.py +0 -0
  547. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_extract_select_output_columns.py +0 -0
  548. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_file_ignore_defaults.py +0 -0
  549. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_find_cmd.py +0 -0
  550. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_firstuser_findings.py +0 -0
  551. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_freshness_helper.py +0 -0
  552. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_gain_coverage.py +0 -0
  553. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_gain_ratio.py +0 -0
  554. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_gating_join_field_docstrings.py +0 -0
  555. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_git_delta.py +0 -0
  556. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_git_hooks.py +0 -0
  557. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_git_hooks_notify.py +0 -0
  558. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_graph_backend.py +0 -0
  559. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_graph_completeness_invariant.py +0 -0
  560. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_hard_kill_pool.py +0 -0
  561. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_has_column_precedence_upsert.py +0 -0
  562. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_hook_reindex_detach.py +0 -0
  563. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_hygiene_config_warning.py +0 -0
  564. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_identifier_var_sink_resolution.py +0 -0
  565. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_identity_counters.py +0 -0
  566. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_include_working_tree.py +0 -0
  567. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_index_cmd.py +0 -0
  568. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_index_filter_config.py +0 -0
  569. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_index_flags.py +0 -0
  570. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_index_progress.py +0 -0
  571. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_index_summary_degraded_metric.py +0 -0
  572. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_indexer_progress.py +0 -0
  573. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_indexer_quality.py +0 -0
  574. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_install.py +0 -0
  575. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_install_message.py +0 -0
  576. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_issue_63_readonly_lock.py +0 -0
  577. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_jobs.py +0 -0
  578. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_join_col_resolve_marker.py +0 -0
  579. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_judgement.py +0 -0
  580. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_lineage_conversion.py +0 -0
  581. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_literal_column_skip.py +0 -0
  582. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_mcp_best_practices.py +0 -0
  583. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_mcp_control.py +0 -0
  584. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_mcp_stdio_smoke.py +0 -0
  585. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_merge_column_lineage.py +0 -0
  586. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_metrics.py +0 -0
  587. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_noise_filter.py +0 -0
  588. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_normalize_keys.py +0 -0
  589. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_parse_failed_classification.py +0 -0
  590. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_parse_file_dependency_filter.py +0 -0
  591. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_parse_quality.py +0 -0
  592. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_parser.py +0 -0
  593. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_perf_scaling_guard.py +0 -0
  594. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_phantom_drop_alter_source.py +0 -0
  595. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_phantom_non_table_create_source.py +0 -0
  596. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_pr07_observability.py +0 -0
  597. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_pr6_execute_immediate_unwrap.py +0 -0
  598. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_pr_impact_unit.py +0 -0
  599. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_qualify_failed_unit.py +0 -0
  600. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_queries_loader.py +0 -0
  601. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_read_client.py +0 -0
  602. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_repo_relative_cte_namespaces.py +0 -0
  603. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_resolvable_write_col_edges_unit.py +0 -0
  604. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_resolve_join_columns_sql.py +0 -0
  605. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_resolve_pass2_passes_dependency_filter.py +0 -0
  606. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_schema_resolver.py +0 -0
  607. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_selects_from_completeness_unit.py +0 -0
  608. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_selfheal_detector.py +0 -0
  609. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_selfheal_pr1_messages.py +0 -0
  610. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_selfheal_reexec.py +0 -0
  611. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_selfheal_watcher.py +0 -0
  612. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_server.py +0 -0
  613. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_skip_counts_persistence.py +0 -0
  614. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_snowflake_strip_alter_set_tag.py +0 -0
  615. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_sprint_06_t04_t05.py +0 -0
  616. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_star_resolution_unit.py +0 -0
  617. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_star_schema_unit.py +0 -0
  618. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_submit_feedback.py +0 -0
  619. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_subprocess_isolate.py +0 -0
  620. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_t02_expression_name_extraction.py +0 -0
  621. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_t03_ddl_skip.py +0 -0
  622. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_temp_table_namespacing.py +0 -0
  623. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_timeout_cancel.py +0 -0
  624. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_tool_version_stamp.py +0 -0
  625. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_tools_hints.py +0 -0
  626. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_tools_warnings.py +0 -0
  627. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_transform_kind_classification.py +0 -0
  628. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_uninstall.py +0 -0
  629. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_unknown_sentinel_skip.py +0 -0
  630. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_unqualified_fallback.py +0 -0
  631. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_upsert_batch_invariant.py +0 -0
  632. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_use_schema_session_context.py +0 -0
  633. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_version_parity.py +0 -0
  634. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_view_classification.py +0 -0
  635. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_viz_config_schemas.py +0 -0
  636. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_viz_facets.py +0 -0
  637. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_viz_render_self_contained.py +0 -0
  638. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_walker.py +0 -0
  639. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_watcher.py +0 -0
  640. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_worker_error_classification.py +0 -0
  641. {sql_code_graph-1.37.0 → sql_code_graph-1.38.0}/tests/unit/test_writer_queue.py +0 -0
@@ -70,6 +70,9 @@ anomaly.csv
70
70
 
71
71
  # Local-only golden lineage ground truth — names private DWH columns
72
72
  tests/e2e/golden_lineage.yaml
73
+ # Real-name lineage oracle — names private internal DWH tables; NEVER commit.
74
+ # The committed, anonymized oracle is plan/metrics/lineage_gold_set_synthetic.json.
75
+ plan/metrics/lineage_gold_set.json
73
76
  # Local-only scratch script for bootstrapping the golden set
74
77
  scratch_bootstrap_golden.py
75
78
  .claude/worktrees/
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sql-code-graph
3
- Version: 1.37.0
3
+ Version: 1.38.0
4
4
  Summary: SQL code graph analyzer and lineage tracer
5
5
  Project-URL: Homepage, https://github.com/Warhorze/sql-code-graph
6
6
  Project-URL: Repository, https://github.com/Warhorze/sql-code-graph
@@ -473,11 +473,19 @@ and consumers that read the table only via COLUMN_LINEAGE / STAR_SOURCE
473
473
  one-hop consumer completeness ``find_table_usages`` already has. Stays
474
474
  one-hop (NOT transitive — that is ``downstream``'s job).
475
475
 
476
+ With ``--through-temps`` the consumer set is augmented with the downstream
477
+ **temp-collapsed** closure: physical tables reachable from this table only
478
+ by threading through ``kind IN ('cte','derived','temp')`` intermediates,
479
+ computed from the structural COLUMN_LINEAGE hops (read-only; it never
480
+ mutates the graph). This recovers consumers — e.g. the star-into-temp
481
+ final target — that the one-hop default and TEMP_INLINE do not surface.
482
+
476
483
  ### Options
477
484
 
478
485
  | Option | Type | Required | Repeatable | Default | Description |
479
486
  | --- | --- | --- | --- | --- | --- |
480
487
  | --raw | BOOLEAN | No | No | False | Disable noise filtering on results |
488
+ | --through-temps | BOOLEAN | No | No | False | Also report consumers reachable only THROUGH a temp/cte/derived intermediate (table-grain temp-collapsed closure). Off by default — the default impact stays one-hop and does not thread temps. |
481
489
 
482
490
  ## `sqlcg analyze failures`
483
491
 
@@ -0,0 +1,374 @@
1
+ {
2
+ "name": "lineage_gold_set_synthetic",
3
+ "version": 1,
4
+ "created": "2026-06-15",
5
+ "purpose": "SYNTHETIC anonymized hand-labelled table-level lineage edges. Names are fabricated and map 1:1 onto the synthetic fixtures under tests/fixtures/gold_set/. NO real internal names. Re-keyed straight from the real-name oracle (kept out of git); totals hold: 39 present / 4 gating-join correct-absence / 1 star-into-temp residual. in_current_graph reflects the structural COLUMN_LINEAGE edge (transform != TEMP_INLINE).",
6
+ "key_convention": "lowercase schema.table; INSERT targets resolve schema via in-file USE SCHEMA",
7
+ "edges": [
8
+ {
9
+ "src": "raw.src_orders",
10
+ "dst": "mart.f_orders",
11
+ "file": "int/f_orders.sql",
12
+ "line": 5,
13
+ "shape": "single-source INSERT...SELECT",
14
+ "in_current_graph": true
15
+ },
16
+ {
17
+ "src": "raw.src_compo",
18
+ "dst": "mart.f_compo",
19
+ "file": "int/f_compo.sql",
20
+ "line": 5,
21
+ "shape": "single-source INSERT...SELECT",
22
+ "in_current_graph": true
23
+ },
24
+ {
25
+ "src": "raw.src_brand",
26
+ "dst": "mart.f_brand",
27
+ "file": "int/f_brand.sql",
28
+ "line": 5,
29
+ "shape": "single-source INSERT...SELECT",
30
+ "in_current_graph": true
31
+ },
32
+ {
33
+ "src": "raw.src_loc",
34
+ "dst": "mart.f_loc",
35
+ "file": "int/f_loc.sql",
36
+ "line": 3,
37
+ "shape": "single-source INSERT...SELECT",
38
+ "in_current_graph": true
39
+ },
40
+ {
41
+ "src": "raw.src_fx",
42
+ "dst": "mart.f_fx",
43
+ "file": "int/f_fx.sql",
44
+ "line": 5,
45
+ "shape": "single-source INSERT...SELECT",
46
+ "in_current_graph": true
47
+ },
48
+ {
49
+ "src": "raw.src_emp_a",
50
+ "dst": "stgmart.dim_staff",
51
+ "file": "template/dim_staff.sql",
52
+ "line": 50,
53
+ "shape": "multi-join INSERT...SELECT",
54
+ "in_current_graph": true
55
+ },
56
+ {
57
+ "src": "raw.src_emp_b",
58
+ "dst": "stgmart.dim_staff",
59
+ "file": "template/dim_staff.sql",
60
+ "line": 54,
61
+ "shape": "multi-join INSERT...SELECT",
62
+ "in_current_graph": true
63
+ },
64
+ {
65
+ "src": "stg.dim_store",
66
+ "dst": "stgmart.dim_staff",
67
+ "file": "template/dim_staff.sql",
68
+ "line": 58,
69
+ "shape": "multi-join INSERT...SELECT",
70
+ "in_current_graph": false,
71
+ "note": "GATING-JOIN only: bouw.* appears only in JOIN/ON predicates, never projected. Correct that no DATA edge exists. Reclassified: not a recall miss.",
72
+ "gating_join_correct_absence": true
73
+ },
74
+ {
75
+ "src": "raw.dim_person",
76
+ "dst": "stgmart.dim_staff",
77
+ "file": "template/dim_staff.sql",
78
+ "line": 62,
79
+ "shape": "multi-join INSERT...SELECT",
80
+ "in_current_graph": false,
81
+ "note": "GATING-JOIN only: emp.* used only in ON predicates, not projected. Correct absence, not a recall miss.",
82
+ "gating_join_correct_absence": true
83
+ },
84
+ {
85
+ "src": "stg.dim_contract",
86
+ "dst": "stgmart.dim_staff",
87
+ "file": "template/dim_staff.sql",
88
+ "line": 66,
89
+ "shape": "multi-join INSERT...SELECT",
90
+ "in_current_graph": false,
91
+ "note": "GATING-JOIN only: wc.* used only in ON predicates, not projected. Correct absence, not a recall miss.",
92
+ "gating_join_correct_absence": true
93
+ },
94
+ {
95
+ "src": "stg.dim_dept",
96
+ "dst": "stgmart.dim_staff",
97
+ "file": "template/dim_staff.sql",
98
+ "line": 70,
99
+ "shape": "multi-join INSERT...SELECT",
100
+ "in_current_graph": true
101
+ },
102
+ {
103
+ "src": "raw.src_ord_hdr",
104
+ "dst": "mart.f_freight_ktn",
105
+ "file": "int/gmdf/f_freight_ktn.sql",
106
+ "line": 26,
107
+ "shape": "CTE-mediated INSERT...SELECT (base behind ORDER_TABEL CTE)",
108
+ "in_current_graph": true
109
+ },
110
+ {
111
+ "src": "raw.src_ord_org",
112
+ "dst": "mart.f_freight_ktn",
113
+ "file": "int/gmdf/f_freight_ktn.sql",
114
+ "line": 27,
115
+ "shape": "CTE-mediated INSERT...SELECT",
116
+ "in_current_graph": true
117
+ },
118
+ {
119
+ "src": "stg.dim_weborder",
120
+ "dst": "mart.f_freight_ktn",
121
+ "file": "int/gmdf/f_freight_ktn.sql",
122
+ "line": 29,
123
+ "shape": "CTE-mediated INSERT...SELECT",
124
+ "in_current_graph": true
125
+ },
126
+ {
127
+ "src": "stg.dim_article",
128
+ "dst": "mart.f_freight_ktn",
129
+ "file": "int/gmdf/f_freight_ktn.sql",
130
+ "line": 31,
131
+ "shape": "CTE-mediated INSERT...SELECT",
132
+ "in_current_graph": true
133
+ },
134
+ {
135
+ "src": "stg.dim_date",
136
+ "dst": "mart.f_freight_ktn",
137
+ "file": "int/gmdf/f_freight_ktn.sql",
138
+ "line": 78,
139
+ "shape": "CTE-mediated INSERT...SELECT",
140
+ "in_current_graph": true
141
+ },
142
+ {
143
+ "src": "raw.src_inbound",
144
+ "dst": "mart.f_freight_ktn",
145
+ "file": "int/gmdf/f_freight_ktn.sql",
146
+ "line": 94,
147
+ "shape": "CTE/subquery-mediated INSERT...SELECT",
148
+ "in_current_graph": true
149
+ },
150
+ {
151
+ "src": "raw.src_tariff",
152
+ "dst": "mart.f_freight_ktn",
153
+ "file": "int/gmdf/f_freight_ktn.sql",
154
+ "line": 139,
155
+ "shape": "CTE/subquery-mediated INSERT...SELECT",
156
+ "in_current_graph": true
157
+ },
158
+ {
159
+ "src": "raw.src_colli",
160
+ "dst": "mart.f_freight_ktn",
161
+ "file": "int/gmdf/f_freight_ktn.sql",
162
+ "line": 179,
163
+ "shape": "CTE/subquery-mediated INSERT...SELECT",
164
+ "in_current_graph": true
165
+ },
166
+ {
167
+ "src": "raw.src_pcs",
168
+ "dst": "mart.f_freight_ktn",
169
+ "file": "int/gmdf/f_freight_ktn.sql",
170
+ "line": 213,
171
+ "shape": "CTE/subquery-mediated INSERT...SELECT",
172
+ "in_current_graph": true
173
+ },
174
+ {
175
+ "src": "raw.src_returns",
176
+ "dst": "mart.f_freight_ktn",
177
+ "file": "int/gmdf/f_freight_ktn.sql",
178
+ "line": 264,
179
+ "shape": "CTE/subquery-mediated INSERT...SELECT",
180
+ "in_current_graph": true
181
+ },
182
+ {
183
+ "src": "raw.src_ord_hdr",
184
+ "dst": "mart.f_freight_misc",
185
+ "file": "int/gmdf/f_freight_misc.sql",
186
+ "line": 34,
187
+ "shape": "CTE-mediated INSERT...SELECT",
188
+ "in_current_graph": true
189
+ },
190
+ {
191
+ "src": "raw.src_ord_org",
192
+ "dst": "mart.f_freight_misc",
193
+ "file": "int/gmdf/f_freight_misc.sql",
194
+ "line": 35,
195
+ "shape": "CTE-mediated INSERT...SELECT",
196
+ "in_current_graph": true
197
+ },
198
+ {
199
+ "src": "stg.dim_weborder",
200
+ "dst": "mart.f_freight_misc",
201
+ "file": "int/gmdf/f_freight_misc.sql",
202
+ "line": 37,
203
+ "shape": "CTE-mediated INSERT...SELECT",
204
+ "in_current_graph": true
205
+ },
206
+ {
207
+ "src": "stg.dim_weborderline",
208
+ "dst": "mart.f_freight_misc",
209
+ "file": "int/gmdf/f_freight_misc.sql",
210
+ "line": 57,
211
+ "shape": "CTE-mediated INSERT...SELECT",
212
+ "in_current_graph": true
213
+ },
214
+ {
215
+ "src": "raw.src_mail",
216
+ "dst": "mart.f_freight_misc",
217
+ "file": "int/gmdf/f_freight_misc.sql",
218
+ "line": -1,
219
+ "shape": "subquery-mediated INSERT...SELECT",
220
+ "in_current_graph": true
221
+ },
222
+ {
223
+ "src": "raw.src_voip",
224
+ "dst": "mart.f_freight_misc",
225
+ "file": "int/gmdf/f_freight_misc.sql",
226
+ "line": -1,
227
+ "shape": "subquery-mediated INSERT...SELECT",
228
+ "in_current_graph": true
229
+ },
230
+ {
231
+ "src": "raw.src_giftcard",
232
+ "dst": "mart.f_freight_misc",
233
+ "file": "int/gmdf/f_freight_misc.sql",
234
+ "line": -1,
235
+ "shape": "subquery-mediated INSERT...SELECT",
236
+ "in_current_graph": true
237
+ },
238
+ {
239
+ "src": "raw.f_freight_ktn",
240
+ "dst": "mart.f_freight_misc",
241
+ "file": "int/gmdf/f_freight_misc.sql",
242
+ "line": -1,
243
+ "shape": "cross-file: reads sibling f_freight_ktn output",
244
+ "in_current_graph": true
245
+ },
246
+ {
247
+ "src": "raw.f_freight_cost",
248
+ "dst": "mart.f_freight_misc",
249
+ "file": "int/gmdf/f_freight_misc.sql",
250
+ "line": -1,
251
+ "shape": "cross-file: reads sibling f_freight_cost output",
252
+ "in_current_graph": true
253
+ },
254
+ {
255
+ "src": "stg.src_po",
256
+ "dst": "mart.f_freight_cost",
257
+ "file": "int/gmdf/f_freight_cost.sql",
258
+ "line": 14,
259
+ "shape": "CTE-mediated INSERT...SELECT",
260
+ "in_current_graph": true
261
+ },
262
+ {
263
+ "src": "stg.dim_po",
264
+ "dst": "mart.f_freight_cost",
265
+ "file": "int/gmdf/f_freight_cost.sql",
266
+ "line": 15,
267
+ "shape": "CTE-mediated INSERT...SELECT",
268
+ "in_current_graph": true
269
+ },
270
+ {
271
+ "src": "stg.dim_weborderline",
272
+ "dst": "mart.f_freight_cost",
273
+ "file": "int/gmdf/f_freight_cost.sql",
274
+ "line": 20,
275
+ "shape": "subquery-mediated INSERT...SELECT",
276
+ "in_current_graph": false,
277
+ "note": "FILTER-ONLY: appears only inside a WHERE ... IN (subquery) predicate, no column projected to output. Correct absence, not a recall miss.",
278
+ "gating_join_correct_absence": true
279
+ },
280
+ {
281
+ "src": "raw.src_invoice",
282
+ "dst": "mart.f_freight_cost",
283
+ "file": "int/gmdf/f_freight_cost.sql",
284
+ "line": 41,
285
+ "shape": "CTE-mediated INSERT...SELECT",
286
+ "in_current_graph": true
287
+ },
288
+ {
289
+ "src": "raw.src_invoiceline",
290
+ "dst": "mart.f_freight_cost",
291
+ "file": "int/gmdf/f_freight_cost.sql",
292
+ "line": 65,
293
+ "shape": "CTE-mediated INSERT...SELECT",
294
+ "in_current_graph": true
295
+ },
296
+ {
297
+ "src": "stg.dim_article",
298
+ "dst": "mart.f_freight_cost",
299
+ "file": "int/gmdf/f_freight_cost.sql",
300
+ "line": -1,
301
+ "shape": "CTE-mediated INSERT...SELECT",
302
+ "in_current_graph": true
303
+ },
304
+ {
305
+ "src": "stg.dim_date",
306
+ "dst": "mart.f_freight_cost",
307
+ "file": "int/gmdf/f_freight_cost.sql",
308
+ "line": -1,
309
+ "shape": "CTE-mediated INSERT...SELECT",
310
+ "in_current_graph": true
311
+ },
312
+ {
313
+ "src": "raw.src_inbound",
314
+ "dst": "mart.f_freight_cost",
315
+ "file": "int/gmdf/f_freight_cost.sql",
316
+ "line": -1,
317
+ "shape": "CTE-mediated INSERT...SELECT",
318
+ "in_current_graph": true
319
+ },
320
+ {
321
+ "src": "raw.src_emp_backup",
322
+ "dst": "mart.tmp_emp",
323
+ "file": "template/dim_person_temp.sql",
324
+ "line": 18,
325
+ "shape": "TEMP-chain hop 1: src -> CREATE TEMP",
326
+ "in_current_graph": true,
327
+ "note": "structural hop; temp node namespaced dim_person_temp.sql::mart.tmp_emp"
328
+ },
329
+ {
330
+ "src": "mart.tmp_emp",
331
+ "dst": "mart.dim_person",
332
+ "file": "template/dim_person_temp.sql",
333
+ "line": 69,
334
+ "shape": "TEMP-chain hop 2: temp -> final INSERT",
335
+ "in_current_graph": true,
336
+ "note": "structural hop"
337
+ },
338
+ {
339
+ "src": "raw.src_emp_backup",
340
+ "dst": "mart.dim_person",
341
+ "file": "template/dim_person_temp.sql",
342
+ "line": -1,
343
+ "shape": "TEMP-collapsed transitive (the TRUE business edge / oracle GT)",
344
+ "in_current_graph": false,
345
+ "note": "NOT emitted as TEMP_INLINE here because IN-hop is SELECT e.* into temp and the source has no indexed DDL columns -> only volgnr reaches the temp -> composition has no matching column. This is the star-into-temp gap; the structural hops exist but the collapsed edge is absent."
346
+ },
347
+ {
348
+ "src": "raw.src_compet_price",
349
+ "dst": "stgmart.f_compet_article",
350
+ "file": "template/f_compet_article.sql",
351
+ "line": 35,
352
+ "shape": "TEMP+CTE-mediated; TEMP_INLINE fires (explicit cols)",
353
+ "in_current_graph": true,
354
+ "note": "20 TEMP_INLINE collapsed edges emitted here; structural hops also present"
355
+ },
356
+ {
357
+ "src": "stg.dim_art2",
358
+ "dst": "stgmart.f_compet_article",
359
+ "file": "template/f_compet_article.sql",
360
+ "line": -1,
361
+ "shape": "TEMP-mediated, collapsed via TEMP_INLINE",
362
+ "in_current_graph": true
363
+ },
364
+ {
365
+ "src": "stg.dim_compet",
366
+ "dst": "stgmart.f_compet_article",
367
+ "file": "template/f_compet_article.sql",
368
+ "line": -1,
369
+ "shape": "TEMP-mediated, collapsed via TEMP_INLINE",
370
+ "in_current_graph": true
371
+ }
372
+ ],
373
+ "source_note": "Anonymized 1:1 from the local-only real-name oracle; mapping not committed."
374
+ }
@@ -0,0 +1,245 @@
1
+ # Snowflake ACCESS_HISTORY ground-truth oracle — groundwork research
2
+
3
+ > **ANONYMIZED for the public repo.** All table/column/file names below are SYNTHETIC and map onto `tests/fixtures/gold_set/` + `plan/metrics/lineage_gold_set_synthetic.json`. The original real-name research (naming private internal DWH objects) is kept local-only and is NOT committed.
4
+
5
+
6
+ **Date:** 2026-06-15
7
+ **Status:** Research. Nothing implemented, nothing planned. Read-only investigation on
8
+ live corpus + parser source. Feeds a future planner for the `ACCESS_HISTORY`-as-oracle
9
+ (Tier 3) work in [`observed_usage_overlay_query_history_tableau.md`](observed_usage_overlay_query_history_tableau.md).
10
+ **Author context:** dispatched to answer three gating questions before any oracle plan.
11
+
12
+ ## Lead verdict (FINDING 1 — the gate)
13
+
14
+ **The graph TODAY retains the FULL per-hop temp trace AND additively emits the collapsed
15
+ edge. Both representations coexist.** The temp-collapse-for-diff primitive can READ
16
+ existing structural hops directly — no preservation work is needed first. VERDICT:
17
+ **per-hop temp edges are already PRESERVED; the diff primitive reads them as-is.**
18
+
19
+ ---
20
+
21
+ ## FINDING 1 — Does the graph retain per-hop temp trace, or collapse it?
22
+
23
+ ### The question
24
+ For a real `src → TEMP → final` chain, does the graph store TWO hops (`src→temp`,
25
+ `temp→final`, temp node having real in/out edges) OR a single collapsed `src→final`
26
+ ("TEMP_INLINE"), OR both? This determines whether the eventual temp-collapse-for-diff
27
+ primitive can READ existing hops, or whether per-hop temp edges must first be PRESERVED.
28
+
29
+ ### Method
30
+ - Read the parser's temp pipeline: [`base.py:519-556`](../../src/sqlcg/parsers/base.py)
31
+ (temp identity / namespacing), [`base.py:1200-1234`](../../src/sqlcg/parsers/base.py)
32
+ (temp leaf stamped `role="temp"`, namespaced key), and
33
+ [`ansi_parser.py:264`](../../src/sqlcg/parsers/ansi_parser.py) →
34
+ [`_emit_transitive_temp_edges`](../../src/sqlcg/parsers/ansi_parser.py) (`:273-…`).
35
+ - Read the recall/health exclusion: [`coverage.py:69,83,368,382`](../../src/sqlcg/cli/coverage.py)
36
+ (`WHERE cl.transform IS DISTINCT FROM 'TEMP_INLINE'` + `t.kind IN ('cte','derived','temp')`).
37
+ - Read the indexer edge persistence: [`indexer.py:1780`](../../src/sqlcg/indexer/indexer.py)
38
+ (`edge.transform` stored on every COLUMN_LINEAGE row) and the dedup precedence at
39
+ [`indexer.py:182-201`](../../src/sqlcg/indexer/indexer.py) (structural never replaced by TEMP_INLINE).
40
+ - **Parsed two REAL corpus files** (no full reindex; one-file `parse_file` calls, free-mem ~1.7GB,
41
+ one process) with `SnowflakeParser(SchemaResolver(dialect='snowflake'))` on master (v1.36.0).
42
+
43
+ ### Findings (measured fact)
44
+
45
+ **Example A — [`dim_person_temp.sql`](tests/fixtures/gold_set/template/dim_person_temp.sql)**
46
+ chain: `raw.src_emp_backup → tmp_emp → mart.dim_person`.
47
+ The parser emitted, as distinct table-level structural edges:
48
+
49
+ ```
50
+ CREATE_TABLE raw.src_emp_backup [table] -> dim_person_temp.sql::mart.tmp_emp [temp] (line 18)
51
+ INSERT dim_person_temp.sql::mart.tmp_emp [temp] -> mart.dim_person [table] (line 69)
52
+ ```
53
+
54
+ So the temp node `dim_person_temp.sql::mart.tmp_emp` (namespaced, `role="temp"`)
55
+ carries a **real incoming edge** and a **real outgoing edge** — TWO hops, fact.
56
+
57
+ **Example B — [`f_compet_article.sql`](tests/fixtures/gold_set/template/f_compet_article.sql)**
58
+ chain: 4 base tables → `tmp_f_compet_article` → `stgmart.f_compet_article`.
59
+ Parser emitted **5 structural hops** into/out of the temp node **PLUS 20 TEMP_INLINE
60
+ collapsed edges** (`transform='TEMP_INLINE'`), e.g. `raw.src_compet_price → stgmart.f_compet_article`.
61
+ So here **BOTH** the per-hop trace and the collapsed edge exist simultaneously.
62
+
63
+ ### Why the two examples differ (load-bearing nuance)
64
+ In Example A the IN-hop is `SELECT e.*, ROW_NUMBER()… AS volgnr FROM src`. The `e.*`
65
+ star **does not expand** into per-column edges (the source has no indexed DDL columns),
66
+ so the temp's only *named* incoming column is `volgnr`. The OUT-hop consumes 27 explicit
67
+ named columns, none of which is `volgnr`. `_emit_transitive_temp_edges` composes
68
+ `x→temp→y` **by matching temp column NAME** ([`ansi_parser.py:273-308`](../../src/sqlcg/parsers/ansi_parser.py)),
69
+ so **0** TEMP_INLINE edges fire. In Example B the IN-hop projects explicit named columns,
70
+ the names match, and 20 collapsed edges fire.
71
+
72
+ **Measured fact:** structural per-hop edges are present in BOTH cases. **Inference:** the
73
+ collapsed `src→final` TEMP_INLINE edge is present only when the temp's incoming columns
74
+ are named (not `SELECT *` into a column-less source). This is the **star-into-temp gap**.
75
+
76
+ ### Verdict (FINDING 1)
77
+ - **Per-hop temp trace: ALWAYS PRESERVED.** The temp is a namespaced `role="temp"` node
78
+ with real `COLUMN_LINEAGE` in and out edges; `transform` is persisted per edge
79
+ ([`indexer.py:1780`](../../src/sqlcg/indexer/indexer.py)); structural hops are
80
+ recall/health-counted ([`coverage.py:69,83`](../../src/sqlcg/cli/coverage.py)).
81
+ - **Collapsed `src→final`: present additively when columns are named, absent on star-into-temp;**
82
+ always excluded from recall/health (`transform='TEMP_INLINE'`,
83
+ [`coverage.py:368,382,864`](../../src/sqlcg/cli/coverage.py)).
84
+ - **BOTH** representations exist (when TEMP_INLINE fires); structural-only when it doesn't.
85
+
86
+ **Decision this informs:** the temp-collapse-for-diff primitive can READ existing
87
+ structural hops to build a temp-collapsed closure on OUR side — no schema change, no
88
+ preservation pass needed. It must NOT depend on the existing TEMP_INLINE edge being
89
+ present (the star-into-temp gap means it is sometimes absent); it should compose the
90
+ **structural** hops itself (same `x→temp→y` logic, but keyed on the temp NODE, not on
91
+ column-name match, so star-into-temp chains still collapse at table grain).
92
+
93
+ ---
94
+
95
+ ## FINDING 2 — Edge model for the oracle (design spec, not code)
96
+
97
+ ### Hard invariant (state it, do not violate)
98
+ > **The stored graph MUST retain the full per-hop temp trace. Temp collapse for diffing
99
+ > is COMPARISON-TIME ONLY and NON-DESTRUCTIVE.** The whole DWH is temp-mediated (277/…
100
+ > SQL files create temp tables — grep below); collapsing the stored graph would destroy
101
+ > impact analysis and is irreversible. The oracle diff builds a *transient* temp-collapsed
102
+ > view of both sides at comparison time and discards it.
103
+
104
+ This invariant is already honoured by the codebase: TEMP_INLINE is *additive* and the
105
+ dedup precedence ([`indexer.py:196-201`](../../src/sqlcg/indexer/indexer.py)) forbids a
106
+ derived edge from shadowing a structural one. The oracle must follow the same discipline
107
+ — never mutate stored hops.
108
+
109
+ ### Both sides temp-collapsed identically before diffing
110
+ A temp-mediated ETL chain must NOT register as a false recall-miss. Per the architect
111
+ review §(b) (verified on-branch), Snowflake's `ACCESS_HISTORY` records `src→temp` and
112
+ `temp→final` as **two separate per-query rows and never the transitive `src→final`** — it
113
+ does not stitch temps across statements. Our graph also stores two structural hops. So:
114
+
115
+ - **OUR side (`E_ours*`):** compose structural hops through every `role="temp"` /
116
+ `kind IN ('cte','derived','temp')` node to a bounded-depth fixpoint, then drop edges
117
+ with a temp endpoint. Equivalent to the existing TEMP_INLINE composition but driven off
118
+ structural hops (so it is robust to the star-into-temp gap). For the oracle comparison
119
+ the TEMP_INLINE edges may be *counted in the numerator* (architect §(b) rule 3) — but
120
+ they stay out of the internal `edge_health_*` self-metric.
121
+ - **ORACLE side (`E_oracle*`):** contract temp nodes out of the per-row oracle edges the
122
+ same way (architect §(b) rules 1-2), then drop temp-endpoint edges, leaving only
123
+ persistent endpoints.
124
+
125
+ Both sides then have identical temp-collapsed semantics → comparable. **TEMP_INLINE counts
126
+ in the oracle numerator** (for temp-mediated chains it is the only edge that matches the
127
+ oracle's collapsed GT); it is reported separately from `edge_health_*`.
128
+
129
+ ### baseSources-derived, persistent endpoints only, OBJECT_DEPENDENCIES as falsifier
130
+ - Derive oracle table edges from **`OBJECTS_MODIFIED[].columns[].baseSources`** collapsed
131
+ to table grain (architect §(c) correction to §3.1) — NOT the `BASE_OBJECTS_ACCESSED ×
132
+ OBJECTS_MODIFIED` array cross product, which over-approximates within multi-target queries
133
+ and artificially depresses recall. Keep the cross product only as a labelled coarse upper bound.
134
+ - Restrict the closed `E_oracle*` to **persistent endpoints** (non-temp, non-transient),
135
+ classified by a **structural** signal (CREATE TEMP/TRANSIENT DDL via QUERY_HISTORY join,
136
+ or the ephemeral-objectId heuristic) — **NOT** name patterns and **NOT** `objectDomain`
137
+ (a TEMPORARY table reports `objectDomain="Table"`; architect §3.2 step-5 correction).
138
+ - **`OBJECT_DEPENDENCIES`** is the exact, non-windowed view-layer falsifier: a view→base
139
+ edge we have that it contradicts is a parser bug; one it confirms is GT regardless of
140
+ the window. It does NOT cover temp/transient or one-off DML — complement, not replacement.
141
+
142
+ ### Risks the architect review flagged — quantify what is measurable here
143
+ - **baseSources population rate:** CANNOT be measured without warehouse access (no
144
+ ACCESS_HISTORY rows on this box). Open. This is the single biggest unknown for the oracle
145
+ denominator — if `baseSources` is sparsely populated, the oracle under-counts and recall
146
+ is overstated. Must be measured on a live export before any plan commits.
147
+ - **Dynamic-SQL / IDENTIFIER($var) provenance:** `ACCESS_HISTORY` captures the *executed*
148
+ objects (a strength), but the producing `QUERY_ID` is the inner execution, complicating the
149
+ `client_environment`/`QUERY_TAG` provenance join (the session tag is on the outer call).
150
+ Corpus-side `IDENTIFIER($var)` prevalence is already known from prior research (the 142-file
151
+ lever; generic-var resolution shipped v1.36.0, +777 resolvable edges). For the oracle this
152
+ is a name-matching residual, not a blocker.
153
+ - **Star-into-temp gap (NEW, measured here):** when a CREATE TEMP uses `SELECT *` from a
154
+ column-less source, our TEMP_INLINE edge does not fire (Example A). The structural hops
155
+ still exist, so a *node-keyed* (not column-keyed) temp collapse on OUR side recovers the
156
+ table-grain edge. Prevalence: see below — likely material given how common `SELECT e.*`
157
+ into a temp is in this DWH. The diff primitive MUST collapse on structural hops, not rely
158
+ on TEMP_INLINE presence.
159
+
160
+ ### Prevalence (measured fact)
161
+ - **277 SQL files** create a temp/transient table
162
+ (`grep -rilE "create\s+(or replace\s+)?(temporary|temp|transient)\s+table"` on dwh).
163
+ Temp-mediation is the dominant ETL shape, so the temp-collapse step is not optional —
164
+ it gates the whole oracle metric (architect: "the single most common pattern in this DWH").
165
+
166
+ ---
167
+
168
+ ## FINDING 3 — Hand-labelled gold set (usable today)
169
+
170
+ Saved as [`lineage_gold_set.json`](../metrics/lineage_gold_set.json): **44 KNOWN-TRUE
171
+ table→table edges** drawn from 8 real corpus files, each verified by reading the SQL, each
172
+ checked against what the CURRENT parser (master v1.36.0) produces.
173
+
174
+ ### Result (measured fact)
175
+ | Bucket | Count | Meaning |
176
+ |--------|-------|---------|
177
+ | Present as structural edge | **39 / 44** | parser correctly extracts the data edge |
178
+ | Correct-by-design absence (gating/filter join) | **4** | table joined only in ON / WHERE-IN predicate, never projected → correctly NO data edge |
179
+ | Real candidate gap | **1** | `raw.src_emp_backup → mart.dim_person` (the star-into-temp TEMP_INLINE non-firing in Example A; both structural hops present, collapsed edge absent) |
180
+
181
+ The 4 "absences" were initially logged as misses, then read-verified as the **gating-join**
182
+ distinction the project already ships a metric for (e.g. `stg.dim_store`, `raw.dim_person`,
183
+ `stg.dim_contract` in [`dim_staff.sql`](tests/fixtures/gold_set/template/dim_staff.sql)
184
+ appear only in JOIN/ON predicates; `stg.dim_weborderline` in
185
+ [`f_freight_cost.sql`](tests/fixtures/gold_set/int/gmdf/f_freight_cost.sql)
186
+ only in a `WHERE … IN (subquery)`). These are CORRECT for column/data lineage and are
187
+ labelled `gating_join_correct_absence: true` in the JSON.
188
+
189
+ ### Interpretation
190
+ On unambiguous single- and multi-source `INSERT…SELECT` and CTE-mediated writes the current
191
+ parser is **correct** (39/39 of the data-bearing edges; 4/4 correct absences). The only gap
192
+ is the temp-transitive collapse on star-into-temp — exactly the FINDING-1 mechanism. The
193
+ gold set is a usable **correctness oracle today**: re-run it after any parser change to catch
194
+ regressions, and as the tie-breaker for the temp-closure logic the architect review specified
195
+ (no automated Snowflake source emits the `src→final` temp-collapsed edge directly).
196
+
197
+ ---
198
+
199
+ ## Classification
200
+
201
+ | Finding | Class | Reasoning |
202
+ |---------|-------|-----------|
203
+ | Per-hop temp trace preserved + TEMP_INLINE additive | **non-issue** (already done) | structural hops always stored; diff primitive reads them as-is |
204
+ | Star-into-temp: TEMP_INLINE doesn't fire on `SELECT *` into column-less source | **coverage lever** (for the oracle), bounded | structural hops exist, so a node-keyed collapse recovers the table edge; only the column-grain collapsed edge is lost |
205
+ | baseSources population rate / dynamic-SQL provenance | **future-proofing / open** | unmeasurable without a live ACCESS_HISTORY export |
206
+ | Gold set (44 edges) | **active asset** | usable today as a regression oracle, independent of ACCESS_HISTORY |
207
+
208
+ ---
209
+
210
+ ## Ranked recommendation (what to build first)
211
+
212
+ 1. **Comparison-time temp-collapse primitive that composes STRUCTURAL hops (node-keyed),
213
+ non-destructive.** This is the #1 oracle prerequisite and FINDING 1 proves the inputs
214
+ already exist. Build it to collapse `x→temp→y` at table grain off the structural edges
215
+ (robust to the star-into-temp gap), NOT off the TEMP_INLINE edges. Validate against the
216
+ gold set's temp chains. No graph mutation.
217
+ 2. **Wire the gold set into a cheap CI/regression check NOW** (44 edges, no warehouse). It
218
+ already pays off: it pins the 39 correct edges and the 4 gating-join absences so a future
219
+ refactor can't silently regress them.
220
+ 3. **Defer the ACCESS_HISTORY ingest itself until a live `baseSources` export is measured.**
221
+ The denominator depends entirely on `baseSources` population, which is unmeasured here.
222
+ Pull a small windowed export first, measure population rate + temp prevalence in the
223
+ arrays, THEN plan the overlay.
224
+
225
+ ### Risks / what would change the verdict
226
+ - If `baseSources` is sparsely populated on the live account, the oracle denominator is
227
+ unreliable and Tier 3 should be reconsidered before building. (Verdict on FINDING 1 is
228
+ unaffected — it is purely about OUR graph.)
229
+ - If the star-into-temp gap turns out to affect a large share of temp chains at *table*
230
+ grain too (not just column grain), the node-keyed collapse in rec #1 becomes load-bearing
231
+ rather than a nicety. Measure star-into-temp prevalence (below) before sizing it.
232
+
233
+ ---
234
+
235
+ ## What I could NOT determine
236
+ - **`baseSources` population rate** on the live account — no ACCESS_HISTORY access from this
237
+ box; needs a live export. This is the gating unknown for the oracle denominator.
238
+ - **Star-into-temp prevalence across the 277 temp files** — I confirmed the mechanism on 1
239
+ file (Example A) and its absence on another (Example B) but did NOT count how many of the
240
+ 277 temp-creating files use `SELECT *`/`SELECT alias.*` into a column-less-source temp.
241
+ A grep + per-file parse over the 277 would quantify how much of the temp-collapse must run
242
+ on structural hops vs. can lean on existing TEMP_INLINE. Recommend measuring before sizing rec #1.
243
+ - **OBJECT_DEPENDENCIES view-layer agreement rate** — needs the live export; not checkable here.
244
+ - **Whether any temp/permanent NAME COLLISION exists in the live arrays** (architect §(b) rule 4
245
+ danger zone) — needs the export; our side is safe (temps are namespaced) but the oracle side is not.