Conversation
There was a problem hiding this comment.
Graphify reviewed this change.
Worth a look — the grounded gate found no coupling regressions or blocking issues, but 2 advisory finding(s) below merit a look before merge.
Graphify review — findings
Adds first-class tracking of degraded resolution passes end-to-end: extract records each pass that fails via _record_degraded_pass (capturing the pass name, error type/message, and affected file suffixes) into a degraded_passes list that flows through extract_parallel and safe_extract_with_xaml_root. Propagates degraded_passes through build, build_from_json, and the CLI extract merge, and reconciles them on incremental merges in merge_raw_extraction and build_merge — carrying forward an existing pass only when its suffixes still have surviving AST nodes and a fresh pass hasn't superseded it, then re-sorting by pass name. On export, to_json lifts degraded_passes to the top level (dropping it from the nested graph dict to avoid dual persistence) only when non-empty, and diagnose_extraction/format_diagnostic_report surface the count and per-pass detail lines.
Worth a look
- build_from_json rejects previously ignored non-iterable degraded_passes metadata —
graphify/build.py:1481· Escalate · medium- agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review
- build() drops degraded metadata for later suffixes with the same pass —
graphify/build.py:1527· Escalate · medium- agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review
Analysis details — impact, health, verification
Impact & health
Graphify review
Impact — 3926 functions depend on the 1702 functions this change touches.
Health — this change adds coupling hotspots:
- new:
extract()— 657 callers, 46 callees - new:
_rebuild_code()— 142 callers, 54 callees - new:
build_from_json()— 219 callers, 20 callees - new:
build_merge()— 77 callers, 14 callees - new:
to_obsidian()— 38 callers, 14 callees - new:
to_json()— 62 callers, 7 callees - new:
extract_js()— 87 callers, 4 callees - new:
extract_files_direct()— 17 callers, 20 callees - …and 77 more — each is listed as a finding
Verification — 3926 functions in the blast radius were not formally verified this run (proofs are advisory here).
Gate & verification
graphify gate
PASS — objectively clean (no health regressions, tests not run — proofs not run this pass (advisory)). Grounded, not self-assessed.
Advisory (not blocking):
- verification_scope: 3725 function(s) in the blast radius were not formally verified this run
Test selection
Test selection
211 of 290 test file(s) selected (73%) via static blast radius.
tests/test_affected_cli.py— impacttests/test_agents_platform.py— impacttests/test_analyze.py— impacttests/test_astro_extraction.py— impacttests/test_astro_import_ids.py— impacttests/test_atomic_canvas_export.py— impacttests/test_atomic_writes.py— impacttests/test_benchmark.py— impacttests/test_benchmark_raw_graph.py— impacttests/test_build.py— impact, changed-testtests/test_build_merge_dedup_scope.py— impacttests/test_build_merge_hyperedges_and_prune.py— impacttests/test_build_merge_shrink_guard.py— impacttests/test_builtin_global_type_refs.py— impacttests/test_carried_hyperedge_remap.py— impacttests/test_case_sensitive_resolution.py— impacttests/test_charmap_encoding.py— impacttests/test_chunking.py— impacttests/test_cjs_module_extension.py— impacttests/test_claude_cli_backend.py— impacttests/test_cli_export.py— impacttests/test_cluster.py— impacttests/test_codebuddy.py— impacttests/test_community_labels_skill.py— impacttests/test_confidence.py— impacttests/test_corrupt_graph_json.py— impacttests/test_cpp_nested_and_cli.py— impacttests/test_cpp_objc_cross_file_calls.py— impacttests/test_cross_extension_reexport_self_cycle.py— impacttests/test_cross_language_call_resolution.py— impacttests/test_cross_repo_external_call_guards.py— impacttests/test_cross_repo_member_calls.py— impacttests/test_csharp_call_site_generic_args.py— impacttests/test_csharp_enum_members.py— impacttests/test_csharp_field_generic_args.py— impacttests/test_csharp_generic_callsites.py— impacttests/test_csharp_interface_dispatch.py— impacttests/test_csharp_member_calls.py— impacttests/test_csharp_member_nodes.py— impacttests/test_csharp_object_creation.py— impacttests/test_csharp_partial_classes.py— impacttests/test_csharp_type_resolution.py— impacttests/test_dedup.py— impacttests/test_dedup_remaps_hyperedges.py— impacttests/test_definition_file_portability.py— impacttests/test_detect.py— impacttests/test_devin.py— impacttests/test_dotnet.py— impacttests/test_duplicate_annotation_edges.py— impacttests/test_elixir_import_resolution.py— impact- … and 161 more
Selection is safe under the controlled-regression assumption; always-run tests + a periodic full run are the backstops. Advisory — it never changes the check verdict.
· 85 more finding(s) on lines outside this diff (see the check run).
Summary
Fixes #3667
Cross-file resolution failures were previously caught and logged, but the extraction artifacts gave no indication that a resolver had failed. This could leave graphs silently missing call/reference edges while appearing healthy.
This PR persists resolver failure metadata as
degraded_passesand exposes it through the graph, reports, and diagnostics.Changes
degraded_passesthrough extraction, build, watch, and CLI flows.graph.json.GRAPH_REPORT.md.graph.jsonandGRAPH_REPORT.mdoutput unchanged.Verification
tests/test_build.py: 94 passed.tests/test_watch.py: 234 passed, 13 skipped, 2 deselected.git diff --checkpasses.python -m graphify update .completed successfully.No unrelated changes are included.