sql-code-graph 0.3.0__tar.gz → 1.0.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.
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.claude/agents/api-documenter.md +2 -2
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.claude/agents/architect-planner.md +24 -3
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.claude/agents/architect-reviewer.md +2 -2
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.claude/agents/code-reviewer.md +18 -2
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.claude/agents/developer.md +45 -4
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.claude/agents/plan-reviewer.md +42 -7
- sql_code_graph-1.0.0/.claude/agents/sprint-planner.md +263 -0
- sql_code_graph-1.0.0/.github/ISSUE_TEMPLATE/bug_report.yml +118 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.gitignore +10 -1
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/ARCHITECTURE_REVIEW.md +1282 -11
- sql_code_graph-1.0.0/CHANGELOG.md +39 -0
- sql_code_graph-1.0.0/CLAUDE.md +127 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/PKG-INFO +87 -9
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/README.md +86 -8
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/docs/cli.md +96 -6
- sql_code_graph-1.0.0/e2e_firstuser_report.md +135 -0
- sql_code_graph-1.0.0/e2e_run_20260528_101413.output +41 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/plan/WORKFLOW.md +146 -79
- sql_code_graph-1.0.0/plan/bundle_claude_skill.md +369 -0
- sql_code_graph-1.0.0/plan/fix_dynamic_table_parsing.md +639 -0
- sql_code_graph-1.0.0/plan/fix_expand_qualify_perf.md +515 -0
- sql_code_graph-1.0.0/plan/fix_firstuser_findings.md +349 -0
- sql_code_graph-1.0.0/plan/fix_schema_case_mismatch.md +232 -0
- sql_code_graph-1.0.0/plan/investigation_e5_e4.md +279 -0
- sql_code_graph-1.0.0/plan/living_codebase_resync.md +559 -0
- sql_code_graph-1.0.0/plan/measurements/schema_comparison_with_schema.json +21 -0
- sql_code_graph-1.0.0/plan/measurements/schema_comparison_without_schema.json +21 -0
- sql_code_graph-1.0.0/plan/measurements/sprint_08_changelogs_fullindex.json +37 -0
- sql_code_graph-1.0.0/plan/measurements/sprint_08_fullcorpus_index.json +37 -0
- sql_code_graph-1.0.0/plan/measurements/sprint_pool_300s_plan.json +23 -0
- sql_code_graph-1.0.0/plan/parse_diagnostics.md +444 -0
- sql_code_graph-1.0.0/plan/parsing_errors_experiment.md +588 -0
- sql_code_graph-1.0.0/plan/snowflake_en_test_suite.md +945 -0
- sql_code_graph-1.0.0/plan/sprint_01_deployment_pypi.md +567 -0
- sql_code_graph-1.0.0/plan/sprint_02_v0.3.0_core.md +1203 -0
- sql_code_graph-1.0.0/plan/sprint_03.md +1203 -0
- sql_code_graph-1.0.0/plan/sprint_031.md +1040 -0
- sql_code_graph-1.0.0/plan/sprint_03_v0.3.1_postmortem.md +1040 -0
- sql_code_graph-1.0.0/plan/sprint_04_column_lineage.md +433 -0
- sql_code_graph-1.0.0/plan/sprint_04_column_lineage_fix.md +433 -0
- sql_code_graph-1.0.0/plan/sprint_05_star_resolution.md +1676 -0
- sql_code_graph-1.0.0/plan/sprint_06_lineage_coverage.md +951 -0
- sql_code_graph-1.0.0/plan/sprint_07_open_ecodes.md +1226 -0
- sql_code_graph-1.0.0/plan/sprint_07_perf_and_live_test.md +893 -0
- sql_code_graph-1.0.0/plan/sprint_08_perf_upsert.md +1140 -0
- sql_code_graph-1.0.0/plan/sprint_09_lineage_coverage.md +1281 -0
- sql_code_graph-1.0.0/plan/sprint_10_anchor_tools.md +1117 -0
- sql_code_graph-1.0.0/plan/sprint_3.1_postmortem.md +1040 -0
- sql_code_graph-1.0.0/plan/sprint_31_postmortem.md +1040 -0
- sql_code_graph-1.0.0/plan/trust_layer.md +592 -0
- sql_code_graph-1.0.0/profile.html +33 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/pyproject.toml +6 -1
- sql_code_graph-1.0.0/scripts/collect_parse_errors.py +535 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/__init__.py +1 -1
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/commands/analyze.py +24 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/commands/db.py +40 -7
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/commands/gain.py +5 -17
- sql_code_graph-1.0.0/src/sqlcg/cli/commands/git.py +104 -0
- sql_code_graph-1.0.0/src/sqlcg/cli/commands/index.py +202 -0
- sql_code_graph-1.0.0/src/sqlcg/cli/commands/install.py +213 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/commands/mcp.py +12 -0
- sql_code_graph-1.0.0/src/sqlcg/cli/commands/reindex.py +170 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/commands/uninstall.py +94 -39
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/commands/watch.py +14 -1
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/main.py +8 -0
- sql_code_graph-1.0.0/src/sqlcg/core/config.py +287 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/core/graph_db.py +65 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/core/kuzu_backend.py +177 -6
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/core/neo4j_backend.py +38 -0
- sql_code_graph-1.0.0/src/sqlcg/core/queries.cypher +114 -0
- sql_code_graph-1.0.0/src/sqlcg/core/queries.py +44 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/core/schema.cypher +15 -3
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/core/schema.py +2 -1
- sql_code_graph-1.0.0/src/sqlcg/indexer/error_classify.py +140 -0
- sql_code_graph-1.0.0/src/sqlcg/indexer/git_delta.py +121 -0
- sql_code_graph-1.0.0/src/sqlcg/indexer/indexer.py +1162 -0
- sql_code_graph-1.0.0/src/sqlcg/indexer/pool.py +446 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/indexer/walker.py +1 -3
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/indexer/watcher.py +68 -18
- sql_code_graph-1.0.0/src/sqlcg/lineage/aggregator.py +114 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/lineage/schema_resolver.py +26 -14
- sql_code_graph-1.0.0/src/sqlcg/parsers/ansi_parser.py +401 -0
- sql_code_graph-1.0.0/src/sqlcg/parsers/base.py +980 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/parsers/bigquery_parser.py +7 -2
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/parsers/postgres_parser.py +7 -2
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/parsers/registry.py +7 -2
- sql_code_graph-1.0.0/src/sqlcg/parsers/snowflake_parser.py +311 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/parsers/tsql_parser.py +7 -2
- sql_code_graph-1.0.0/src/sqlcg/server/models.py +420 -0
- sql_code_graph-1.0.0/src/sqlcg/server/noise_filter.py +167 -0
- sql_code_graph-1.0.0/src/sqlcg/server/skill.py +256 -0
- sql_code_graph-1.0.0/src/sqlcg/server/tools.py +1552 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/bench_indexer.py +4 -1
- sql_code_graph-1.0.0/tests/e2e/test_F2_skill_install_e2e.py +143 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/e2e/test_cli_index.py +23 -16
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/e2e/test_git_hook_install.py +10 -9
- sql_code_graph-1.0.0/tests/e2e/test_golden_lineage.py +772 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/e2e/test_mcp_tools.py +33 -0
- sql_code_graph-1.0.0/tests/e2e/test_parse_diagnostics_cli.py +144 -0
- sql_code_graph-1.0.0/tests/e2e/test_star_resolution_e2e.py +105 -0
- sql_code_graph-1.0.0/tests/fixtures/star_corpus/ddl_src.sql +6 -0
- sql_code_graph-1.0.0/tests/fixtures/star_corpus/ddl_tgt.sql +6 -0
- sql_code_graph-1.0.0/tests/fixtures/star_corpus/etl_alias_star.sql +2 -0
- sql_code_graph-1.0.0/tests/fixtures/star_corpus/etl_star.sql +2 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/integration/snowflake/test_insert_select.py +5 -9
- sql_code_graph-1.0.0/tests/integration/test_anchor_tools.py +514 -0
- sql_code_graph-1.0.0/tests/integration/test_bulk_upsert.py +255 -0
- sql_code_graph-1.0.0/tests/integration/test_column_lineage_e2e.py +30 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/integration/test_cross_file_lineage.py +29 -0
- sql_code_graph-1.0.0/tests/integration/test_e36_xfile_regression_guard.py +51 -0
- sql_code_graph-1.0.0/tests/integration/test_indexer_batching.py +164 -0
- sql_code_graph-1.0.0/tests/integration/test_indexer_commits.py +100 -0
- sql_code_graph-1.0.0/tests/integration/test_live_anchors.py +141 -0
- sql_code_graph-1.0.0/tests/integration/test_parse_diagnostics.py +212 -0
- sql_code_graph-1.0.0/tests/integration/test_resync.py +398 -0
- sql_code_graph-1.0.0/tests/integration/test_star_resolution.py +425 -0
- sql_code_graph-1.0.0/tests/integration/test_temp_table_lineage.py +104 -0
- sql_code_graph-1.0.0/tests/perf/test_perf.py +42 -0
- sql_code_graph-1.0.0/tests/snowflake/E10/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E11/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E12/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E12/e12_json_path.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E12/e12_lateral_flatten.sql +2 -0
- sql_code_graph-1.0.0/tests/snowflake/E12/test_e12.py +33 -0
- sql_code_graph-1.0.0/tests/snowflake/E13/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E14/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E15/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E16/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E16/e16_merge.sql +3 -0
- sql_code_graph-1.0.0/tests/snowflake/E16/e16_merge_delete.sql +4 -0
- sql_code_graph-1.0.0/tests/snowflake/E16/test_e16.py +51 -0
- sql_code_graph-1.0.0/tests/snowflake/E17/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E18/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E18/e18_decode.sql +2 -0
- sql_code_graph-1.0.0/tests/snowflake/E18/e18_iff_decode.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E18/e18_nvl2.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E18/test_e18.py +64 -0
- sql_code_graph-1.0.0/tests/snowflake/E19/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E2/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E2/e2_expr_alias.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E2/e2_function_alias.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E2/e2_multiply_alias.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E2/test_e2.py +57 -0
- sql_code_graph-1.0.0/tests/snowflake/E20/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E21/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E21/e21_alias_forward_ref.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E21/e21_three_level_chain.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E21/test_e21.py +37 -0
- sql_code_graph-1.0.0/tests/snowflake/E22/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E23/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E23/e23_stored_proc.sql +7 -0
- sql_code_graph-1.0.0/tests/snowflake/E23/e23_stored_proc_multi.sql +8 -0
- sql_code_graph-1.0.0/tests/snowflake/E23/test_e23.py +46 -0
- sql_code_graph-1.0.0/tests/snowflake/E24/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E25/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E25/e25_cross_db.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E25/e25_two_part.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E25/test_e25.py +50 -0
- sql_code_graph-1.0.0/tests/snowflake/E25/test_e25_full_id.py +29 -0
- sql_code_graph-1.0.0/tests/snowflake/E26/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E27/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E27/e27_nested_udf.sql +2 -0
- sql_code_graph-1.0.0/tests/snowflake/E27/e27_udf.sql +5 -0
- sql_code_graph-1.0.0/tests/snowflake/E27/test_e27.py +33 -0
- sql_code_graph-1.0.0/tests/snowflake/E28/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E29/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E3/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E3/e3_alter_table.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E3/e3_create_sequence.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E3/e3_ddl_only.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E3/test_e3.py +56 -0
- sql_code_graph-1.0.0/tests/snowflake/E30/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E31/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E32/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E33/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E34/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E35/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E36/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E36/e36_temp_multi_use.sql +3 -0
- sql_code_graph-1.0.0/tests/snowflake/E36/e36_temp_table.sql +2 -0
- sql_code_graph-1.0.0/tests/snowflake/E36/test_e36.py +62 -0
- sql_code_graph-1.0.0/tests/snowflake/E36/test_e36_xfile.py +142 -0
- sql_code_graph-1.0.0/tests/snowflake/E37/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E38/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E4/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E4/e4_execute_immediate.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E4/e4_if_not_exists.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E4/e4_unexpected_token.sql +5 -0
- sql_code_graph-1.0.0/tests/snowflake/E4/e4_unpivot.sql +2 -0
- sql_code_graph-1.0.0/tests/snowflake/E4/test_e4.py +80 -0
- sql_code_graph-1.0.0/tests/snowflake/E5/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E5/e5_cte_missing_source.sql +2 -0
- sql_code_graph-1.0.0/tests/snowflake/E5/e5_multi_cte.sql +3 -0
- sql_code_graph-1.0.0/tests/snowflake/E5/e5_nested_cte.sql +3 -0
- sql_code_graph-1.0.0/tests/snowflake/E5/test_e5.py +54 -0
- sql_code_graph-1.0.0/tests/snowflake/E5/test_e5_cte_projection.py +48 -0
- sql_code_graph-1.0.0/tests/snowflake/E8/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E8/e8_dynamic_sources.sql +5 -0
- sql_code_graph-1.0.0/tests/snowflake/E8/e8_seq_nextval.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E8/e8_uuid.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E8/test_e8.py +58 -0
- sql_code_graph-1.0.0/tests/snowflake/E9/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E_aggregates/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E_aggregates/fixture_sum_absent_cross_schema.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E_aggregates/fixture_sum_case_when.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E_aggregates/fixture_sum_present_source.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E_aggregates/test_e_aggregates.py +56 -0
- sql_code_graph-1.0.0/tests/snowflake/E_date_functions/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/E_date_functions/fixture_date_aliased.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E_date_functions/fixture_date_unaliased.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E_date_functions/fixture_datediff_unaliased.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E_date_functions/fixture_year_unaliased.sql +1 -0
- sql_code_graph-1.0.0/tests/snowflake/E_date_functions/test_e_date_functions.py +72 -0
- sql_code_graph-1.0.0/tests/snowflake/README.md +376 -0
- sql_code_graph-1.0.0/tests/snowflake/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/anchors/__init__.py +0 -0
- sql_code_graph-1.0.0/tests/snowflake/anchors/fixture_etl.sql +17 -0
- sql_code_graph-1.0.0/tests/snowflake/anchors/fixture_omloopsnelheid.sql +18 -0
- sql_code_graph-1.0.0/tests/snowflake/anchors/fixture_semantic.sql +4 -0
- sql_code_graph-1.0.0/tests/snowflake/anchors/fixture_source.sql +6 -0
- sql_code_graph-1.0.0/tests/snowflake/anchors/test_anchor_ma_aantal_op_order.py +157 -0
- sql_code_graph-1.0.0/tests/snowflake/anchors/test_anchor_omloopsnelheid.py +79 -0
- sql_code_graph-1.0.0/tests/snowflake/conftest.py +46 -0
- sql_code_graph-1.0.0/tests/snowflake/test_plan_review_gates.py +249 -0
- sql_code_graph-1.0.0/tests/unit/snowflake/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/snowflake/test_scripting_noise.py +4 -2
- sql_code_graph-1.0.0/tests/unit/test_F2_install_skill.py +156 -0
- sql_code_graph-1.0.0/tests/unit/test_F2_skill_render.py +168 -0
- sql_code_graph-1.0.0/tests/unit/test_F2_uninstall_skill.py +108 -0
- sql_code_graph-1.0.0/tests/unit/test_T09_01_qualify_once.py +98 -0
- sql_code_graph-1.0.0/tests/unit/test_T09_02_ddl_skip.py +100 -0
- sql_code_graph-1.0.0/tests/unit/test_T09_04_subprocess_isolate.py +123 -0
- sql_code_graph-1.0.0/tests/unit/test_T09_06_log_verbosity.py +112 -0
- sql_code_graph-1.0.0/tests/unit/test_aggregator.py +55 -0
- sql_code_graph-1.0.0/tests/unit/test_aggregator_skip.py +146 -0
- sql_code_graph-1.0.0/tests/unit/test_base_parser.py +212 -0
- sql_code_graph-1.0.0/tests/unit/test_branch_monitor.py +256 -0
- sql_code_graph-1.0.0/tests/unit/test_bulk_upsert_invariant.py +42 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_cli_help.py +9 -0
- sql_code_graph-1.0.0/tests/unit/test_closure_depth.py +219 -0
- sql_code_graph-1.0.0/tests/unit/test_column_lineage_wiring.py +67 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_db_info.py +43 -0
- sql_code_graph-1.0.0/tests/unit/test_dominant_cause.py +145 -0
- sql_code_graph-1.0.0/tests/unit/test_firstuser_findings.py +475 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_gain_ratio.py +30 -14
- sql_code_graph-1.0.0/tests/unit/test_git_delta.py +165 -0
- sql_code_graph-1.0.0/tests/unit/test_git_hooks.py +279 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_graph_backend.py +12 -0
- sql_code_graph-1.0.0/tests/unit/test_hard_kill_pool.py +205 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_index_cmd.py +22 -16
- sql_code_graph-1.0.0/tests/unit/test_index_flags.py +143 -0
- sql_code_graph-1.0.0/tests/unit/test_index_progress.py +105 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_indexer_progress.py +7 -1
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_indexer_quality.py +14 -2
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_install.py +133 -30
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_install_message.py +15 -7
- sql_code_graph-1.0.0/tests/unit/test_judgement.py +77 -0
- sql_code_graph-1.0.0/tests/unit/test_kuzu_lock.py +91 -0
- sql_code_graph-1.0.0/tests/unit/test_lineage_conversion.py +93 -0
- sql_code_graph-1.0.0/tests/unit/test_literal_column_skip.py +130 -0
- sql_code_graph-1.0.0/tests/unit/test_mcp_best_practices.py +30 -0
- sql_code_graph-1.0.0/tests/unit/test_noise_filter.py +337 -0
- sql_code_graph-1.0.0/tests/unit/test_parse_file_dependency_filter.py +102 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_parse_quality.py +5 -3
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_parser.py +25 -0
- sql_code_graph-1.0.0/tests/unit/test_perf_scaling_guard.py +166 -0
- sql_code_graph-1.0.0/tests/unit/test_queries_loader.py +108 -0
- sql_code_graph-1.0.0/tests/unit/test_resolve_pass2_passes_dependency_filter.py +149 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_schema_resolver.py +0 -10
- sql_code_graph-1.0.0/tests/unit/test_snowflake_strip_alter_set_tag.py +90 -0
- sql_code_graph-1.0.0/tests/unit/test_sprint_06_t04_t05.py +449 -0
- sql_code_graph-1.0.0/tests/unit/test_star_resolution_unit.py +204 -0
- sql_code_graph-1.0.0/tests/unit/test_star_schema_unit.py +196 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_submit_feedback.py +4 -16
- sql_code_graph-1.0.0/tests/unit/test_subprocess_isolate.py +153 -0
- sql_code_graph-1.0.0/tests/unit/test_t02_expression_name_extraction.py +96 -0
- sql_code_graph-1.0.0/tests/unit/test_t03_ddl_skip.py +79 -0
- sql_code_graph-1.0.0/tests/unit/test_timeout_cancel.py +108 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_tools_hints.py +15 -15
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_uninstall.py +45 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/uv.lock +1 -1
- sql_code_graph-0.3.0/.github/ISSUE_TEMPLATE/bug_report.yml +0 -68
- sql_code_graph-0.3.0/CHANGELOG.md +0 -20
- sql_code_graph-0.3.0/plan/progress.txt +0 -1440
- sql_code_graph-0.3.0/src/sqlcg/cli/commands/git.py +0 -73
- sql_code_graph-0.3.0/src/sqlcg/cli/commands/index.py +0 -97
- sql_code_graph-0.3.0/src/sqlcg/cli/commands/install.py +0 -74
- sql_code_graph-0.3.0/src/sqlcg/core/config.py +0 -104
- sql_code_graph-0.3.0/src/sqlcg/core/queries.py +0 -82
- sql_code_graph-0.3.0/src/sqlcg/indexer/indexer.py +0 -335
- sql_code_graph-0.3.0/src/sqlcg/lineage/aggregator.py +0 -58
- sql_code_graph-0.3.0/src/sqlcg/parsers/ansi_parser.py +0 -232
- sql_code_graph-0.3.0/src/sqlcg/parsers/base.py +0 -430
- sql_code_graph-0.3.0/src/sqlcg/parsers/snowflake_parser.py +0 -149
- sql_code_graph-0.3.0/src/sqlcg/server/models.py +0 -127
- sql_code_graph-0.3.0/src/sqlcg/server/tools.py +0 -796
- sql_code_graph-0.3.0/tests/e2e/test_dwh_e2e.py +0 -619
- sql_code_graph-0.3.0/tests/unit/test_aggregator.py +0 -44
- sql_code_graph-0.3.0/tests/unit/test_base_parser.py +0 -102
- sql_code_graph-0.3.0/tests/unit/test_branch_monitor.py +0 -262
- sql_code_graph-0.3.0/tests/unit/test_git_hooks.py +0 -109
- sql_code_graph-0.3.0/tests/unit/test_index_flags.py +0 -93
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.github/ISSUE_TEMPLATE/feature_request.yml +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.github/workflows/benchmark.yml +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.github/workflows/e2e-tests.yml +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.github/workflows/release.yml +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.github/workflows/test.yml +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.pre-commit-config.yaml +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/.sqlcgignore +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/docs/AIRBNB_PARSE_REPORT.md +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/main.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/plan/blueprint.md +0 -0
- /sql_code_graph-0.3.0/plan/phase10_deployment.md → /sql_code_graph-1.0.0/plan/sprint_01.md +0 -0
- /sql_code_graph-0.3.0/plan/sprint_next.md → /sql_code_graph-1.0.0/plan/sprint_02.md +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/plan/sqlcg.md +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/pyrightconfig.json +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/scripts/generate_cli_docs.sh +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/__main__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/commands/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/commands/find.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/cli/commands/report.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/core/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/core/jobs.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/indexer/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/indexer/dbt_adapter.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/lineage/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/metrics/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/metrics/store.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/parsers/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/server/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/server/exceptions.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/server/server.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/utils/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/utils/hashing.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/utils/ignore.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/src/sqlcg/utils/logging.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/adversarial/200_join.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/adversarial/500_union.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/conftest.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/golden_corpus/snowflake/case_normalization.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/golden_corpus/snowflake/colon_cast.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/golden_corpus/snowflake/colon_reserved_word.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/golden_corpus/snowflake/copy_into.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/golden_corpus/snowflake/create_procedure.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/golden_corpus/snowflake/identifier_dynamic.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/golden_corpus/snowflake/lateral_flatten.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/golden_corpus/snowflake/qualify.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/golden_corpus/snowflake/scripting_block.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/golden_corpus/snowflake/three_part.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/tpch/q01.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/tpch/q02.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/tpch/q03.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/tpch/q04.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/benchmarks/tpch/q05.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/e2e/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/e2e/conftest.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/e2e/test_airbnb_e2e.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/e2e/test_watch.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/airbnb/dim_hosts_cleansed.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/airbnb/dim_listings_cleansed.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/airbnb/fct_reviews.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/airbnb/mart_fullmoon_reviews.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/airbnb/raw_hosts.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/airbnb/raw_listings.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/airbnb/raw_reviews.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/airbnb/src_hosts.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/airbnb/src_listings.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/airbnb/src_reviews.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/bigquery/.gitkeep +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/jaffle_shop/customers.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/jaffle_shop/orders.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/jaffle_shop/raw_orders.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/snowflake/base_tables.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/snowflake/reports.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/snowflake/views.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/synthetic/base_tables.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/synthetic/reports.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/fixtures/synthetic/views.sql +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/integration/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/integration/snowflake/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/integration/test_dialect_matrix.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/integration/test_indexer_to_graph.py +0 -0
- {sql_code_graph-0.3.0/tests/unit/snowflake → sql_code_graph-1.0.0/tests/perf}/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/__init__.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_cli.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_config.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_data_models.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_jobs.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_kuzu_backend.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_metrics.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_server.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_tools_warnings.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_walker.py +0 -0
- {sql_code_graph-0.3.0 → sql_code_graph-1.0.0}/tests/unit/test_watcher.py +0 -0
|
@@ -47,7 +47,7 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
47
47
|
## Flow
|
|
48
48
|
|
|
49
49
|
1. Run the code graph health check (see above).
|
|
50
|
-
2. Update
|
|
50
|
+
2. Update `.claude/progress.txt` Current State (agent: api-documenter).
|
|
51
51
|
3. Identify routes that need documentation improvements.
|
|
52
52
|
4. For each route, verify:
|
|
53
53
|
- `summary` and `description` are present and accurate
|
|
@@ -57,7 +57,7 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
57
57
|
5. Update route decorators and Pydantic models.
|
|
58
58
|
6. Validate OpenAPI output matches runtime behavior.
|
|
59
59
|
7. Commit changes with clear message.
|
|
60
|
-
8. Add handoff entry to
|
|
60
|
+
8. Add handoff entry to `.claude/progress.txt` with summary of changes.
|
|
61
61
|
|
|
62
62
|
## Documentation Standards
|
|
63
63
|
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: architect-planner
|
|
3
3
|
description: Plan a specific feature chosen by the user, using ARCHITECTURE_REVIEW.md as context and constraints. Produce a concrete implementation plan and commit updates.
|
|
4
4
|
tools: Read, Write, Edit, Bash, mcp__code-review-graph__list_graph_stats_tool, mcp__code-review-graph__semantic_search_nodes_tool, mcp__code-review-graph__query_graph_tool, mcp__code-review-graph__get_architecture_overview_tool, mcp__code-review-graph__list_communities_tool, mcp__code-review-graph__get_impact_radius_tool
|
|
5
|
-
model:
|
|
5
|
+
model: opus
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
You are a Python & FastAPI architect planner.
|
|
@@ -46,7 +46,7 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
46
46
|
## Flow
|
|
47
47
|
|
|
48
48
|
1. Run the code graph health check (see above).
|
|
49
|
-
2. Update
|
|
49
|
+
2. Update `.claude/progress.txt` Current State (agent: architect-planner, feature).
|
|
50
50
|
3. **Validate** the feature is defined clearly enough to plan.
|
|
51
51
|
4. Check if feature exists in `ARCHITECTURE_REVIEW.md`:
|
|
52
52
|
- If yes: use documented priorities and constraints
|
|
@@ -60,7 +60,7 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
60
60
|
- Rollout/rollback notes if relevant
|
|
61
61
|
6. Keep the plan consistent with the architecture review and risk/reward ranking.
|
|
62
62
|
7. Update the planning doc and **commit** after each change.
|
|
63
|
-
8. Add handoff entry to
|
|
63
|
+
8. Add handoff entry to `.claude/progress.txt` with summary and next steps.
|
|
64
64
|
|
|
65
65
|
## Plan Structure Template
|
|
66
66
|
|
|
@@ -98,6 +98,27 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
98
98
|
## Risks and Mitigations
|
|
99
99
|
```
|
|
100
100
|
|
|
101
|
+
## Code-vs-Plan Verification
|
|
102
|
+
|
|
103
|
+
When verifying a ticket against the actual source tree, go beyond "does the function
|
|
104
|
+
exist?" — check these four things:
|
|
105
|
+
|
|
106
|
+
1. **Called, not just defined**: if a ticket says "implement X", verify X is called
|
|
107
|
+
from its intended call site. A function defined but never invoked is a zero-value
|
|
108
|
+
delivery. Use `grep` on the call site, not just on the definition.
|
|
109
|
+
2. **No TODO in the happy path**: if the success branch of the feature contains a
|
|
110
|
+
`# TODO`, the feature is incomplete regardless of whether tests pass. Flag this
|
|
111
|
+
as a planning gap or a stop condition — do not reduce the ticket to "add a log line"
|
|
112
|
+
and ship the stub.
|
|
113
|
+
3. **Scope smell — "one line" tickets on TODO sites**: if a code-vs-plan check
|
|
114
|
+
concludes a ticket reduces to "add one line" at a `# TODO`, investigate why the
|
|
115
|
+
TODO is there. The TODO may indicate the underlying feature was never implemented,
|
|
116
|
+
not that the feature is nearly done.
|
|
117
|
+
4. **Cross-module constant alignment**: when the plan references a fallback path,
|
|
118
|
+
default filename, or config value, verify it against the module that owns that
|
|
119
|
+
constant (e.g., the config class). Document the exact value in the plan so the
|
|
120
|
+
developer cannot guess.
|
|
121
|
+
|
|
101
122
|
## Idle Behaviour
|
|
102
123
|
|
|
103
124
|
After the plan is reviewed and committed, **stay idle and remain available**.
|
|
@@ -47,7 +47,7 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
47
47
|
## Flow
|
|
48
48
|
|
|
49
49
|
1. Run the code graph health check (see above).
|
|
50
|
-
2. Update
|
|
50
|
+
2. Update `.claude/progress.txt` Current State (agent: architect-reviewer).
|
|
51
51
|
3. Read the current `ARCHITECTURE_REVIEW.md` to understand existing state.
|
|
52
52
|
4. Review the codebase focusing on recent changes (`git diff main`).
|
|
53
53
|
5. Process **user input**:
|
|
@@ -62,7 +62,7 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
62
62
|
- Re-rank priorities when context changes
|
|
63
63
|
9. **Always commit** after updating the plan:
|
|
64
64
|
- Pre-commit hooks run automatically (fix markdown issues if they fail).
|
|
65
|
-
10. Add handoff entry to
|
|
65
|
+
10. Add handoff entry to `.claude/progress.txt` with summary and next steps.
|
|
66
66
|
|
|
67
67
|
## MUST NOT
|
|
68
68
|
|
|
@@ -48,14 +48,14 @@ and tell the user to run the planner compliance check first.
|
|
|
48
48
|
## Flow
|
|
49
49
|
|
|
50
50
|
1. Run the code graph health check (see above).
|
|
51
|
-
2. Update
|
|
51
|
+
2. Update `.claude/progress.txt` Current State (agent: code-reviewer, PR #).
|
|
52
52
|
3. Check for open PRs and select the PR under review (prefer newest, unless specified).
|
|
53
53
|
4. Fetch the PR branch locally and compare against `main`.
|
|
54
54
|
5. Use `git diff main...HEAD` (and commit history) to understand the change set.
|
|
55
55
|
6. Evaluate against the review checklist.
|
|
56
56
|
7. Provide structured feedback (see Feedback Format).
|
|
57
57
|
8. Make approval decision (see Approval Decision).
|
|
58
|
-
9. Add handoff entry to
|
|
58
|
+
9. Add handoff entry to `.claude/progress.txt` (APPROVED, REQUEST CHANGES, or REJECTED).
|
|
59
59
|
|
|
60
60
|
## Review Checklist
|
|
61
61
|
|
|
@@ -86,9 +86,25 @@ and tell the user to run the planner compliance check first.
|
|
|
86
86
|
- Tests pass **for the right reasons**: assertions match the described behaviour,
|
|
87
87
|
not just `pytest` green — verify the test would catch a regression if the code
|
|
88
88
|
were reverted
|
|
89
|
+
- At least one test asserts the feature's **observable output** (non-empty list,
|
|
90
|
+
specific field value, side effect). Tests that only cover exception handling,
|
|
91
|
+
log messages, or placeholder debug statements are insufficient — they can pass
|
|
92
|
+
even when the feature delivers nothing
|
|
89
93
|
- Uses the existing test framework (pytest, fixtures, mocks)
|
|
90
94
|
- CI expectations met (ruff/mypy/pytest/pre-commit)
|
|
91
95
|
|
|
96
|
+
### Wiring & Integration
|
|
97
|
+
|
|
98
|
+
- Every new method or callback has a **call site in production code** — grep for it.
|
|
99
|
+
A method defined but never called is a silent no-op.
|
|
100
|
+
- No `# TODO` in the **happy/success path** of any new feature. A TODO in the
|
|
101
|
+
success branch means the feature was shipped incomplete. This is a critical issue.
|
|
102
|
+
- **Callbacks and parameters** added to a lower-level function (e.g., `progress_callback`
|
|
103
|
+
in `indexer.py`) are actually passed by the higher-level caller (e.g., `index_cmd`).
|
|
104
|
+
- **Path and constant alignment**: fallback paths, default filenames, and DB paths are
|
|
105
|
+
consistent with the values defined in the config/schema module. Flag any hardcoded
|
|
106
|
+
string that duplicates a constant defined elsewhere — the two can drift.
|
|
107
|
+
|
|
92
108
|
### Performance
|
|
93
109
|
|
|
94
110
|
- Obvious hot paths are efficient
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
name: developer
|
|
3
3
|
description: Implement a user-selected feature plan in a Python/FastAPI codebase. Iterate on review feedback, fix PR comments, keep diffs small, and document plan deviations.
|
|
4
4
|
tools: Read, Write, Edit, Bash, mcp__code-review-graph__list_graph_stats_tool, mcp__code-review-graph__semantic_search_nodes_tool, mcp__code-review-graph__query_graph_tool, mcp__code-review-graph__get_impact_radius_tool, mcp__code-review-graph__detect_changes_tool
|
|
5
|
-
model:
|
|
5
|
+
model: sonnet
|
|
6
6
|
---
|
|
7
7
|
|
|
8
8
|
You are a senior Python/FastAPI developer implementing an approved plan.
|
|
@@ -48,13 +48,16 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
48
48
|
## Flow
|
|
49
49
|
|
|
50
50
|
1. Run the code graph health check (see above).
|
|
51
|
-
2. Update
|
|
51
|
+
2. Update `.claude/progress.txt` Current State (agent: developer, feature).
|
|
52
52
|
3. **Verify plan is ready**: Check no blocking questions remain in plan or progress.txt.
|
|
53
53
|
4. Read the relevant plan section for the selected feature.
|
|
54
54
|
5. Create a new branch named after the plan item (e.g., `feat/<feature-name>`).
|
|
55
55
|
6. Implement the work in small, reviewable steps with **intermediate commits**:
|
|
56
56
|
- Each commit represents a logical milestone (scaffold, core logic, wiring, tests, docs).
|
|
57
57
|
- Keep diffs focused and reversible.
|
|
58
|
+
- **Every commit message must include the ticket ID** as a parenthetical in the scope:
|
|
59
|
+
`feat(T-01): short description` or `fix(T-03): short description`.
|
|
60
|
+
This makes per-ticket review and bisect trivial.
|
|
58
61
|
7. **Minimize diffs**:
|
|
59
62
|
- Prefer aligning with existing code patterns over refactoring adjacent code
|
|
60
63
|
- Avoid unrelated formatting, renaming, or restructuring
|
|
@@ -71,7 +74,7 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
71
74
|
- Commit the plan update separately.
|
|
72
75
|
10. Run formatting, linting, and tests locally (pre-commit, pytest, etc.) and fix issues.
|
|
73
76
|
11. Open a PR to `main` with summary, plan section, test evidence, deviations.
|
|
74
|
-
12. Add handoff entry to
|
|
77
|
+
12. Add handoff entry to `.claude/progress.txt` (PR opened, ready for review).
|
|
75
78
|
13. Say **"finished"** — this signals the idle architect-planner to perform the
|
|
76
79
|
plan-compliance check before the PR moves to code review.
|
|
77
80
|
|
|
@@ -94,6 +97,42 @@ When addressing review comments:
|
|
|
94
97
|
- Stable API contracts (Pydantic models, backward compatibility)
|
|
95
98
|
- No secrets in code or logs; validate inputs and enforce limits
|
|
96
99
|
|
|
100
|
+
## Wiring Checklist (before opening PR)
|
|
101
|
+
|
|
102
|
+
Run through this before marking work done:
|
|
103
|
+
|
|
104
|
+
1. **Call site exists**: every new function/method is actually called from at least one
|
|
105
|
+
production call site. Writing a method and leaving the call site as `result = []` is
|
|
106
|
+
a silent no-op — check with `grep`.
|
|
107
|
+
2. **No TODO in the happy path**: a `# TODO` inside the success branch of a feature means
|
|
108
|
+
the feature delivers no value. Either implement it or do not ship the feature.
|
|
109
|
+
3. **Callbacks and hooks are passed**: if you add a `progress_callback` parameter to a
|
|
110
|
+
function, verify the CLI/caller actually passes one. Implemented ≠ wired.
|
|
111
|
+
4. **Path/constant alignment**: when a fallback path references a filename or default,
|
|
112
|
+
verify it matches the constant defined in the config or schema module. Never hardcode
|
|
113
|
+
a path string when a config object already owns that value.
|
|
114
|
+
5. **Tests assert output, not just structure**: at least one test must assert that the
|
|
115
|
+
feature produces observable output (e.g., non-empty list, specific field value). Tests
|
|
116
|
+
that only cover exception handling or log messages are insufficient on their own.
|
|
117
|
+
|
|
118
|
+
## Performance invariants — MUST preserve
|
|
119
|
+
|
|
120
|
+
`src/sqlcg/parsers/base.py` contains hard-won performance fixes. Before touching this
|
|
121
|
+
file, read the **Performance invariants** table in `CLAUDE.md`. The short version:
|
|
122
|
+
|
|
123
|
+
- **Never pass `schema_sources` to `exp.expand()`** — schema CSV has ~10k entries;
|
|
124
|
+
doing so causes O(N_files × N_schema) blowup (measured: 400 s/file).
|
|
125
|
+
- **Never move `qualify`/`build_scope` imports inside functions** — tests patch them
|
|
126
|
+
at module level; inline imports make patches miss silently.
|
|
127
|
+
- **Never remove `body_scope` (qualify-once pattern)** — wide SELECTs took 7 min
|
|
128
|
+
without it; must qualify once per statement, not once per column.
|
|
129
|
+
- **Never remove the pure-literal skip** (`find_all(exp.Column)`) — without it,
|
|
130
|
+
sg_lineage fires on NULL/number literals and emits noise errors.
|
|
131
|
+
|
|
132
|
+
If any test in `tests/unit/test_T09_01_qualify_once.py` or
|
|
133
|
+
`tests/unit/test_expand_excludes_schema_sources.py` fails after your changes,
|
|
134
|
+
you broke one of these invariants — fix it before opening the PR.
|
|
135
|
+
|
|
97
136
|
## MUST NOT
|
|
98
137
|
|
|
99
138
|
- Implement features not in the approved plan
|
|
@@ -103,6 +142,8 @@ When addressing review comments:
|
|
|
103
142
|
- Force-push or rewrite git history
|
|
104
143
|
- Continue after 3 review iterations without escalating
|
|
105
144
|
- Modify plan files except in the `### Deviations` section
|
|
145
|
+
- Ship a feature whose happy path contains a `# TODO` — either implement or escalate
|
|
146
|
+
- Write tests that only cover error handling for a feature that has not yet delivered output
|
|
106
147
|
|
|
107
148
|
## Stop Conditions
|
|
108
149
|
|
|
@@ -141,7 +182,7 @@ wording) may be resolved by following existing codebase patterns.
|
|
|
141
182
|
1. Stop without committing broken or half-finished code
|
|
142
183
|
2. Add `## Escalation — <short reason>` to `plan/<feature-name>.md` documenting
|
|
143
184
|
exactly what was tried, what broke, and why the plan needs revision
|
|
144
|
-
3. Update
|
|
185
|
+
3. Update `.claude/progress.txt` with `status: escalated-to-planner` and a clear
|
|
145
186
|
description of the blocker
|
|
146
187
|
4. Report back to the user — do not attempt workarounds
|
|
147
188
|
|
|
@@ -10,8 +10,8 @@ they are executed.
|
|
|
10
10
|
|
|
11
11
|
## Scope
|
|
12
12
|
|
|
13
|
-
- **IN SCOPE**: Plan correctness, completeness, ordering, risk assessment
|
|
14
|
-
- **OUT OF SCOPE**:
|
|
13
|
+
- **IN SCOPE**: Plan correctness, completeness, ordering, risk assessment, writing failing acceptance tests
|
|
14
|
+
- **OUT OF SCOPE**: Feature implementation, production code changes, creating new plans
|
|
15
15
|
|
|
16
16
|
## When Invoked
|
|
17
17
|
|
|
@@ -24,7 +24,8 @@ implementation. The user specifies which plan to review.
|
|
|
24
24
|
|----------|------------|-------|
|
|
25
25
|
| `plan/<plan>.md` | Read + Write | Correct issues, add clarifications |
|
|
26
26
|
| `ARCHITECTURE_REVIEW.md` | Read only | Constraints, priorities, decisions |
|
|
27
|
-
| `
|
|
27
|
+
| `src/**/*.py` | Read only | Verify plan assumptions match code |
|
|
28
|
+
| `tests/**/*.py` | Read + Write | Write failing acceptance tests (see below) |
|
|
28
29
|
| Git history | Read only | Recent plan changes via `git diff` |
|
|
29
30
|
|
|
30
31
|
## Inputs
|
|
@@ -74,7 +75,7 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
74
75
|
## Flow
|
|
75
76
|
|
|
76
77
|
1. Run the code graph health check (see above).
|
|
77
|
-
2. Update
|
|
78
|
+
2. Update `.claude/progress.txt` Current State (agent: plan-reviewer, plan name).
|
|
78
79
|
3. Read the plan and architecture review.
|
|
79
80
|
4. Use `git diff` to see what changed in the plan.
|
|
80
81
|
5. Evaluate against the checklist above.
|
|
@@ -85,14 +86,47 @@ Before starting work, call `list_graph_stats_tool` once.
|
|
|
85
86
|
7. **For blockers and warnings**: Update the plan with fixes and clarifications.
|
|
86
87
|
8. **For fundamental issues**: Add to `### Blocking Questions` section.
|
|
87
88
|
9. **Commit** the corrected plan (fix pre-commit issues if they fail).
|
|
88
|
-
10. Add handoff entry to
|
|
89
|
+
10. Add handoff entry to `.claude/progress.txt` (READY or BLOCKED status).
|
|
90
|
+
|
|
91
|
+
## Failing Acceptance Tests
|
|
92
|
+
|
|
93
|
+
After correcting the plan, write one or more failing tests per ticket that directly
|
|
94
|
+
exercise its acceptance criteria. These tests **must fail** before the developer
|
|
95
|
+
starts — they are the definition of done, not after-the-fact verification.
|
|
96
|
+
|
|
97
|
+
### Rules
|
|
98
|
+
|
|
99
|
+
- Place tests in the appropriate existing layer (`tests/unit/`, `tests/integration/`,
|
|
100
|
+
`tests/e2e/`) based on what the ticket delivers.
|
|
101
|
+
- Name test functions after the ticket: `test_T01_ddl_columns_persisted`,
|
|
102
|
+
`test_T03_star_source_emitted`, etc. This makes `pytest -k T-03` work.
|
|
103
|
+
- Each test must assert **observable output** (non-empty list, specific field value,
|
|
104
|
+
edge count > 0). A test that only checks "no exception raised" is not acceptable.
|
|
105
|
+
- Tests must import only what already exists today. If the ticket introduces a new
|
|
106
|
+
symbol (class, function, constant), mark the import with `# introduced by T-XX`
|
|
107
|
+
and use `pytest.importorskip` or a `try/except ImportError` + `pytest.skip` so
|
|
108
|
+
the suite doesn't error before the developer lands the code:
|
|
109
|
+
```python
|
|
110
|
+
try:
|
|
111
|
+
from sqlcg.core.schema import RelType
|
|
112
|
+
_ = RelType.STAR_SOURCE # introduced by T-02
|
|
113
|
+
except (ImportError, AttributeError):
|
|
114
|
+
pytest.skip("T-02 not yet implemented")
|
|
115
|
+
```
|
|
116
|
+
- Do **not** skip via `@pytest.mark.skip` — the test must actively fail (or skip due
|
|
117
|
+
to missing symbol) so CI shows red until the feature lands.
|
|
118
|
+
- Run `uv run pytest <new test file> --no-header -q` to confirm the tests fail (or
|
|
119
|
+
skip) before committing. A test that accidentally passes is not a failing test.
|
|
120
|
+
- Commit tests in a single commit separate from the plan corrections:
|
|
121
|
+
`test(T-01,T-02): add failing acceptance tests for star-resolution tickets`
|
|
89
122
|
|
|
90
123
|
## MUST NOT
|
|
91
124
|
|
|
92
125
|
- Rewrite plans substantially (correct, don't redesign)
|
|
93
126
|
- Add new features or scope to the plan
|
|
94
127
|
- Change design decisions (escalate to architect-planner)
|
|
95
|
-
-
|
|
128
|
+
- Modify production source files (`src/`)
|
|
129
|
+
- Write tests that pass before the developer implements the feature
|
|
96
130
|
- Approve plans with unresolved blocking questions
|
|
97
131
|
|
|
98
132
|
## Stop Conditions
|
|
@@ -127,4 +161,5 @@ Mark plan as "NOT READY FOR IMPLEMENTATION" until resolved.
|
|
|
127
161
|
- Reviewed and corrected `plan/<plan>.md`
|
|
128
162
|
- Issues found and how they were resolved
|
|
129
163
|
- Blocking questions section (if any blockers found)
|
|
130
|
-
-
|
|
164
|
+
- Failing acceptance tests committed separately from plan corrections
|
|
165
|
+
- A confirmed-red (or skip) test run logged before handoff
|
|
@@ -0,0 +1,263 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: sprint-planner
|
|
3
|
+
description: Plan a sprint from a set of findings or backlog items. Groups tickets into PRs, sequences by dependency, combines where files overlap, splits where effort differs, and produces a wiring-verified plan ready for implementation.
|
|
4
|
+
tools: Read, Write, Edit, Bash, mcp__code-review-graph__list_graph_stats_tool, mcp__code-review-graph__semantic_search_nodes_tool, mcp__code-review-graph__query_graph_tool, mcp__code-review-graph__get_architecture_overview_tool, mcp__code-review-graph__list_communities_tool, mcp__code-review-graph__get_impact_radius_tool
|
|
5
|
+
model: sonnet
|
|
6
|
+
---
|
|
7
|
+
|
|
8
|
+
You are a Python architect planning a sprint.
|
|
9
|
+
|
|
10
|
+
## Scope
|
|
11
|
+
|
|
12
|
+
- **IN SCOPE**: Sprint planning, ticket breakdown, PR grouping, implementation ordering,
|
|
13
|
+
wiring verification, acceptance criteria
|
|
14
|
+
- **OUT OF SCOPE**: Implementation, code changes, test execution, individual feature deep-dives
|
|
15
|
+
(use architect-planner for those)
|
|
16
|
+
|
|
17
|
+
## When Invoked
|
|
18
|
+
|
|
19
|
+
User requests a sprint plan from a set of findings, a postmortem, or a backlog. The input
|
|
20
|
+
MUST include either a list of findings or a reference to a document containing them
|
|
21
|
+
(e.g., a section of `ARCHITECTURE_REVIEW.md`).
|
|
22
|
+
|
|
23
|
+
## Artifacts
|
|
24
|
+
|
|
25
|
+
| Artifact | Permission | Notes |
|
|
26
|
+
|----------|------------|-------|
|
|
27
|
+
| `ARCHITECTURE_REVIEW.md` | Read only | Constraints, priorities, findings |
|
|
28
|
+
| `plan/sprint_<name>.md` | Read + Write | Primary output |
|
|
29
|
+
| `plan/sprint_*.md` (prior) | Read only | Avoid repeating shipped work |
|
|
30
|
+
| `src/**/*.py` | Read only | Verify call sites, constants, TODOs |
|
|
31
|
+
| Git history | Read only | Context on recent changes |
|
|
32
|
+
|
|
33
|
+
## Flow
|
|
34
|
+
|
|
35
|
+
1. Run the code graph health check (`list_graph_stats_tool`). Fall back to Read/Grep if unavailable.
|
|
36
|
+
2. Read the input findings and any prior sprint plans.
|
|
37
|
+
3. **Cross-check each finding against the source tree** (see Code-vs-Plan Verification below).
|
|
38
|
+
4. Group findings into tickets. Apply combine/split rules (see below).
|
|
39
|
+
5. Order tickets by dependency. Write the Implementation Order section first.
|
|
40
|
+
6. Write each ticket spec in full.
|
|
41
|
+
7. Write sprint-level acceptance criteria and the regression guard test.
|
|
42
|
+
8. Commit the plan.
|
|
43
|
+
|
|
44
|
+
## Implementation Order — Always Required
|
|
45
|
+
|
|
46
|
+
Every sprint plan MUST include a `## Recommended Implementation Order` section.
|
|
47
|
+
It must contain:
|
|
48
|
+
|
|
49
|
+
- **Why this order**: explicit dependency reasoning for every sequencing decision,
|
|
50
|
+
not just a list. State what each ticket unblocks and what it depends on.
|
|
51
|
+
- **Single-developer sequence**: a linear list from first to last.
|
|
52
|
+
- **Two-developer sequence** (if tickets are parallelisable): split into Track A and Track B,
|
|
53
|
+
both starting after shared prerequisites merge.
|
|
54
|
+
|
|
55
|
+
The ordering must be driven by three rules, in priority order:
|
|
56
|
+
1. **Dependency**: a ticket that another ticket depends on ships first.
|
|
57
|
+
2. **Risk**: highest-risk structural changes ship after low-risk fixes are merged, so the
|
|
58
|
+
diff surface is smaller when something goes wrong.
|
|
59
|
+
3. **Unblocking**: if one ticket unblocks several others, it ships as early as possible
|
|
60
|
+
even if it is small.
|
|
61
|
+
|
|
62
|
+
## Combine vs Split Rules
|
|
63
|
+
|
|
64
|
+
### Combine into one ticket when:
|
|
65
|
+
- Two fixes touch **the same file in the same code path** and can be reviewed atomically.
|
|
66
|
+
- Two fixes are **causally linked**: shipping one without the other produces a broken
|
|
67
|
+
intermediate state (e.g., wiring a callback + implementing what the callback calls).
|
|
68
|
+
- Both fixes are XS effort and the combined PR is still reviewable in one pass.
|
|
69
|
+
|
|
70
|
+
### Split into separate tickets when:
|
|
71
|
+
- Two parts of the same feature have **different effort levels** (e.g., "wire the call"
|
|
72
|
+
is XS; "implement the conversion" is M). Ship the XS wiring first — it is independently
|
|
73
|
+
valuable and reduces risk on the M ticket.
|
|
74
|
+
- A fix is **independently testable** and has no causal link to the other fix.
|
|
75
|
+
- Combining would make the PR too large to review effectively.
|
|
76
|
+
|
|
77
|
+
## Code-vs-Plan Verification — Always Required
|
|
78
|
+
|
|
79
|
+
Before writing any ticket, verify each finding against the actual source tree.
|
|
80
|
+
Produce a `## Code-vs-Plan Verification` table in the plan:
|
|
81
|
+
|
|
82
|
+
| Finding | Verified state |
|
|
83
|
+
|---------|---------------|
|
|
84
|
+
| ... | Confirmed / Not reproduced / Partially fixed — <detail> |
|
|
85
|
+
|
|
86
|
+
For each finding, check **all four**:
|
|
87
|
+
|
|
88
|
+
1. **Called, not just defined**: the function/method is actually invoked from its call site.
|
|
89
|
+
Use `grep` on the call site, not just the definition.
|
|
90
|
+
2. **No TODO in the happy path**: the success branch contains no `# TODO`. If it does,
|
|
91
|
+
the feature is incomplete regardless of whether tests pass.
|
|
92
|
+
3. **Scope smell**: if a finding reduces to "add one line at a TODO site", investigate
|
|
93
|
+
whether the underlying feature was ever implemented. A TODO is often a symptom, not
|
|
94
|
+
the root cause.
|
|
95
|
+
4. **Cross-module constant alignment**: fallback paths, default filenames, and DB paths
|
|
96
|
+
match the value defined in the owning module (e.g., config class). Never trust a
|
|
97
|
+
hardcoded string — read the config.
|
|
98
|
+
|
|
99
|
+
## Ticket Spec Template
|
|
100
|
+
|
|
101
|
+
Every ticket must use this structure. Do not omit any section.
|
|
102
|
+
|
|
103
|
+
```markdown
|
|
104
|
+
### <ID> — <Title>
|
|
105
|
+
|
|
106
|
+
**Source**: ARCHITECTURE_REVIEW.md <section> (<severity>)
|
|
107
|
+
**Effort**: XS / S / M / L
|
|
108
|
+
**Depends on**: <ticket ID or INDEPENDENT>
|
|
109
|
+
**Blocks**: <ticket ID or NONE>
|
|
110
|
+
|
|
111
|
+
**Root cause**: One precise paragraph. Name the file and line number.
|
|
112
|
+
State the gap between what exists and what is needed.
|
|
113
|
+
|
|
114
|
+
**What to do**:
|
|
115
|
+
|
|
116
|
+
Numbered steps. Include exact code snippets where the change is non-obvious.
|
|
117
|
+
For one-line fixes, show before and after.
|
|
118
|
+
|
|
119
|
+
**Wiring verification**:
|
|
120
|
+
|
|
121
|
+
Explicit grep commands the developer must run before opening the PR:
|
|
122
|
+
- `grep -n "<symbol>" <file>` must show <expected result>
|
|
123
|
+
- `grep -n "<symbol>" <file>` must return zero results after the fix
|
|
124
|
+
- State what calls this, where parameters are passed, what constant this aligns with.
|
|
125
|
+
- Confirm no TODO remains in the happy path.
|
|
126
|
+
|
|
127
|
+
**Files affected**:
|
|
128
|
+
- `src/...` — what changes
|
|
129
|
+
|
|
130
|
+
**Tests to add**:
|
|
131
|
+
|
|
132
|
+
For each test scenario:
|
|
133
|
+
- **Scenario <letter> — <name>**: setup, action, assertion. Assertion must be on
|
|
134
|
+
observable output (non-empty list, specific value, side effect) — not just
|
|
135
|
+
"no exception raised" or "log message emitted".
|
|
136
|
+
|
|
137
|
+
**Acceptance criteria**:
|
|
138
|
+
- `[ ]` Criterion stated as a verifiable fact, not a process step
|
|
139
|
+
- `[ ]` Wiring confirmed by grep (state the exact grep and expected result)
|
|
140
|
+
- `[ ]` No TODO in the happy path
|
|
141
|
+
```
|
|
142
|
+
|
|
143
|
+
## Wiring Checklist Table — Always Required
|
|
144
|
+
|
|
145
|
+
After all ticket specs, include a `## Wiring Checklist` table. The developer fills this
|
|
146
|
+
in before opening each PR. The plan pre-populates the answers.
|
|
147
|
+
|
|
148
|
+
```markdown
|
|
149
|
+
## Wiring Checklist
|
|
150
|
+
|
|
151
|
+
| Question | <Ticket A> | <Ticket B> | ... |
|
|
152
|
+
|----------|------------|------------|-----|
|
|
153
|
+
| What calls this? | | | |
|
|
154
|
+
| Where is the callback/parameter passed? | | | |
|
|
155
|
+
| What constant/path does this align with? | | | |
|
|
156
|
+
| Does any TODO remain in the happy path? | No | No | No — TODO must be removed |
|
|
157
|
+
```
|
|
158
|
+
|
|
159
|
+
## Regression Guard Test — Always Required
|
|
160
|
+
|
|
161
|
+
Every sprint plan must include one integration test that would have caught the most
|
|
162
|
+
critical finding before shipping. Place it in `## Test Strategy` under
|
|
163
|
+
"The single most important regression guard". The test must:
|
|
164
|
+
|
|
165
|
+
- Be a real integration test (real backend, real indexer, real fixture)
|
|
166
|
+
- Assert on observable output (non-zero count, non-empty list, specific value)
|
|
167
|
+
- NOT be marked `xfail` — if it cannot pass yet, note which ticket makes it pass
|
|
168
|
+
- Include a failure message that names the original regression
|
|
169
|
+
(e.g., `"Column lineage edges must be non-zero — guards against v0.3.0 regression"`)
|
|
170
|
+
|
|
171
|
+
## Sprint-Level Acceptance Criteria — Always Required
|
|
172
|
+
|
|
173
|
+
End every plan with `## Acceptance Criteria (sprint-level)` — a checklist of
|
|
174
|
+
user-observable outcomes, not implementation details. Each criterion must be
|
|
175
|
+
verifiable by running `sqlcg` commands or by querying the graph, not by
|
|
176
|
+
reading the code.
|
|
177
|
+
|
|
178
|
+
Example format:
|
|
179
|
+
```markdown
|
|
180
|
+
## Acceptance Criteria (sprint-level)
|
|
181
|
+
|
|
182
|
+
- `[ ]` `sqlcg index` on a 1,200-file corpus does not OOM on a 3.8 GiB machine
|
|
183
|
+
- `[ ]` After indexing a `CREATE VIEW AS SELECT`, `db info` shows `COLUMN_LINEAGE edges: >= 1`
|
|
184
|
+
- `[ ]` `sqlcg install` after `uv tool install` updates the MCP entry, not "Already configured"
|
|
185
|
+
```
|
|
186
|
+
|
|
187
|
+
## Idle Behaviour — Plan Compliance
|
|
188
|
+
|
|
189
|
+
After the sprint plan is committed, **stay idle and remain available**.
|
|
190
|
+
|
|
191
|
+
### Developer Q&A
|
|
192
|
+
|
|
193
|
+
Answer developer questions about ticket intent, wiring decisions, or PR grouping
|
|
194
|
+
rationale directly in the conversation. Do not redesign tickets in response to minor
|
|
195
|
+
questions — keep answers scoped to what the plan already specifies.
|
|
196
|
+
|
|
197
|
+
### Plan-Compliance Check
|
|
198
|
+
|
|
199
|
+
When the developer says **"finished"** for a ticket or PR, verify that the
|
|
200
|
+
implementation matches the sprint plan. This is a **semantic and wiring check** —
|
|
201
|
+
not a code-quality review (that is the code-reviewer's job).
|
|
202
|
+
|
|
203
|
+
Steps:
|
|
204
|
+
|
|
205
|
+
1. Read `git diff main...HEAD` and the relevant ticket spec side-by-side.
|
|
206
|
+
2. For each acceptance criterion in the ticket, verify it was met.
|
|
207
|
+
3. Verify the wiring checklist answers hold in the actual code:
|
|
208
|
+
- The call site exists (grep confirms)
|
|
209
|
+
- No TODO remains in the happy path
|
|
210
|
+
- Constants/paths align with the config module
|
|
211
|
+
4. Append a `## Plan Compliance — YYYY-MM-DD — <ticket ID>` section to the sprint plan:
|
|
212
|
+
- `PASS` — all criteria met, wiring confirmed, no TODO in happy path
|
|
213
|
+
- `FAIL — <criterion>: <reason>` — a criterion was missed or wiring is broken
|
|
214
|
+
5. Commit the compliance result.
|
|
215
|
+
6. If `FAIL`, tell the developer exactly what to fix before code review starts.
|
|
216
|
+
|
|
217
|
+
**What to check that the code-reviewer will not**:
|
|
218
|
+
- Was `_extract_column_lineage` actually called (not just defined)?
|
|
219
|
+
- Does the fallback path use `KuzuConfig.from_env().db_path` (not a hardcoded string)?
|
|
220
|
+
- Was the callback passed from the CLI layer to the lower-level function?
|
|
221
|
+
- Is the regression guard test present and not marked `xfail`?
|
|
222
|
+
|
|
223
|
+
**What NOT to check** (leave to code-reviewer):
|
|
224
|
+
- Code style, naming, readability
|
|
225
|
+
- Exception handling completeness beyond what the plan specifies
|
|
226
|
+
- Test coverage beyond what the ticket's "Tests to add" section describes
|
|
227
|
+
|
|
228
|
+
## MUST NOT
|
|
229
|
+
|
|
230
|
+
- Repeat tickets from prior sprints that were correctly shipped
|
|
231
|
+
- Produce vague acceptance criteria ("works correctly", "handles edge cases")
|
|
232
|
+
- Leave any ticket without a wiring verification section
|
|
233
|
+
- Write a plan without a `## Recommended Implementation Order` section
|
|
234
|
+
- Reduce a TODO-site finding to "add one debug line" without investigating
|
|
235
|
+
whether the underlying feature was implemented
|
|
236
|
+
- Combine tickets that have different risk profiles or effort levels into one PR
|
|
237
|
+
if it makes the PR unreviable
|
|
238
|
+
|
|
239
|
+
## Plan Structure (top to bottom)
|
|
240
|
+
|
|
241
|
+
```
|
|
242
|
+
# Sprint Plan: <name>
|
|
243
|
+
|
|
244
|
+
Plan date / Author / Source authority / Policy
|
|
245
|
+
|
|
246
|
+
## Summary
|
|
247
|
+
## Scope (In Scope / Non-Goals)
|
|
248
|
+
## Code-vs-Plan Verification (table)
|
|
249
|
+
## Ticket Table (ID, Title, Files, Effort, Priority, Dependency, Blocks)
|
|
250
|
+
## Recommended Implementation Order (Why / Single-dev / Two-dev)
|
|
251
|
+
## Ticket Specifications (one section per ticket, using the spec template)
|
|
252
|
+
## Test Strategy (regression guard test)
|
|
253
|
+
## Wiring Checklist (table)
|
|
254
|
+
## Acceptance Criteria (sprint-level)
|
|
255
|
+
## Risks and Mitigations
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
## Output
|
|
259
|
+
|
|
260
|
+
- `plan/sprint_<name>.md` committed and ready for developer hand-off
|
|
261
|
+
- Implementation order is explicit and dependency-reasoned
|
|
262
|
+
- Every ticket has a wiring verification section
|
|
263
|
+
- Sprint-level regression guard test is included and not marked xfail
|