Remove faulty GitHub Actions Workflow for Python, fix: resolve explain-ambiguity, fix(ruby): resolve compact syntax mixin targets and prevent phantom concern hubs. - #1394
Conversation
This workflow installs Python dependencies, runs linting with flake8, and executes tests using pytest for the 'v8' branch.
… in _ensure_stat_index()
1. Resolve explain-ambiguity handling in the `graphify explain` command. When multiple matches tie for the top score, the command lists those ambiguous nodes and exits with code 2. 2. Allow deterministic bypass of fuzzy resolution if an exact node ID is passed. 3. Fix test_semantic_prune_removes_orphan_entries in tests/test_cache.py by varying the file content/length between consecutive writes to bypass the stat fastpath. 4. Add regression test for explain-ambiguity tied top-scores. Co-authored-by: FolatheDuckofDuckingburg <268987568+FolatheDuckofDuckingburg@users.noreply.github.com>
…ake8 checks 1. Resolve explain-ambiguity handling in the `graphify explain` command. When multiple matches tie for the top score, the command lists those ambiguous nodes and exits with code 2. 2. Allow deterministic bypass of fuzzy resolution if an exact node ID is passed. 3. Fix test_semantic_prune_removes_orphan_entries in tests/test_cache.py by varying the file content/length between consecutive writes to bypass the stat fastpath. 4. Add regression test for explain-ambiguity tied top-scores. 5. Remove unused global variable declaration in graphify/cache.py to pass flake8 static analysis checks. Co-authored-by: FolatheDuckofDuckingburg <268987568+FolatheDuckofDuckingburg@users.noreply.github.com>
…ake8 checks 1. Resolve explain-ambiguity handling in the `graphify explain` command. When multiple matches tie for the top score, the command lists those ambiguous nodes and exits with code 2. 2. Allow deterministic bypass of fuzzy matching if an exact node ID is passed. 3. Fix test_semantic_prune_removes_orphan_entries in tests/test_cache.py by varying the file content/length between consecutive writes to bypass the stat fastpath. 4. Add regression test for explain-ambiguity tied top-scores. 5. Remove unused global variable declaration in graphify/cache.py to pass flake8 static analysis checks. 6. Remove faulty non-standard .github/workflows/python-app.yml file to prevent broken CI check suites. Co-authored-by: FolatheDuckofDuckingburg <268987568+FolatheDuckofDuckingburg@users.noreply.github.com>
…ake8 checks 1. Resolve explain-ambiguity handling in the `graphify explain` command. When multiple matches tie for the top score, the command lists those ambiguous nodes and exits with code 2. 2. Allow deterministic bypass of fuzzy matching if an exact node ID is passed. 3. Fix test_semantic_prune_removes_orphan_entries in tests/test_cache.py by varying the file content/length between consecutive writes to bypass the stat fastpath. 4. Add regression test for explain-ambiguity tied top-scores. 5. Remove unused global variable declaration in graphify/cache.py to pass flake8 static analysis checks. Co-authored-by: FolatheDuckofDuckingburg <268987568+FolatheDuckofDuckingburg@users.noreply.github.com>
…ake8 checks 1. Resolve explain-ambiguity handling in the `graphify explain` command. When multiple matches tie for the top score, the command lists those ambiguous nodes and exits with code 2. 2. Allow deterministic bypass of fuzzy matching if an exact node ID is passed. 3. Fix test_semantic_prune_removes_orphan_entries in tests/test_cache.py by varying the file content/length between consecutive writes to bypass the stat fastpath. 4. Add regression test for explain-ambiguity tied top-scores. 5. Remove unused global variable declaration in graphify/cache.py to pass flake8 static analysis checks. Co-authored-by: FolatheDuckofDuckingburg <268987568+FolatheDuckofDuckingburg@users.noreply.github.com>
…ake8 checks 1. Resolve explain-ambiguity handling in the `graphify explain` command. When multiple matches tie for the top score, the command lists those ambiguous nodes and exits with code 2. 2. Allow deterministic bypass of fuzzy matching if an exact node ID is passed. 3. Fix test_semantic_prune_removes_orphan_entries in tests/test_cache.py by varying the file content/length between consecutive writes to bypass the stat fastpath. 4. Add regression test for explain-ambiguity tied top-scores. 5. Remove unused global variable declaration in graphify/cache.py to pass flake8 static analysis checks. 6. Delete faulty python-app.yml workflow file to prevent CI check failures. Co-authored-by: FolatheDuckofDuckingburg <268987568+FolatheDuckofDuckingburg@users.noreply.github.com>
…ake8 checks 1. Resolve explain-ambiguity handling in the `graphify explain` command. When multiple matches tie for the top score, the command lists those ambiguous nodes and exits with code 2. 2. Allow deterministic bypass of fuzzy matching if an exact node ID is passed. 3. Fix test_semantic_prune_removes_orphan_entries in tests/test_cache.py by varying the file content/length between consecutive writes to bypass the stat fastpath. 4. Add regression test for explain-ambiguity tied top-scores. 5. Remove unused global variable declaration in graphify/cache.py to pass flake8 static analysis checks. 6. Remove faulty non-standard python-app.yml workflow file. Co-authored-by: FolatheDuckofDuckingburg <268987568+FolatheDuckofDuckingburg@users.noreply.github.com>
…61486418-7b0fe8a2 fix: resolve explain-ambiguity and stat resolution cache test failure
Merge 'origin/v9' into current branch using 'ours' merge strategy to resolve conflicts on graphify/cache.py, graphify/__main__.py, and uv.lock. Keeps the newer 'v8' implementation intact while preserving the clean merge history. Co-authored-by: FolatheDuckofDuckingburg <268987568+FolatheDuckofDuckingburg@users.noreply.github.com>
…584917657-3015880b Merge branch origin/v9 into v8
Integrates Windsurf's `.codeium/config.json` configuration manager natively into `graphify/__main__.py`. This enables `graphify install --platform windsurf` and `graphify windsurf install|uninstall` commands. Existing custom configurations in `.codeium/config.json` are parsed and merged gracefully on install, and safely unmerged on uninstall, preventing data loss. Extensive unit tests have been added to verify these behaviors under various scenarios. Co-authored-by: FolatheDuckofDuckingburg <268987568+FolatheDuckofDuckingburg@users.noreply.github.com>
…568688589-1fd6de31 feat(install): add native windsurf configuration management
There was a problem hiding this comment.
Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).
Graphify reviewed this change.
Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).
Graphify review — findings
This pull request rolls back the CHANGELOG to move the previously documented 0.9.13/0.9.12 release entries into an "Unreleased" section, and touches a wide range of extractor, analysis, export, and skill-generation code along with their corresponding tests. The changed surface spans multiple language extractors (Fortran, C#, Kotlin, Ruby/rake, Bash, etc.), graph build/reconciliation logic, HTML/Canvas/viz export, security/path validation, and skillgen fragment/expected-output files, plus a Persian translation doc update. Given the truncated diff, the changes appear to be a broad rework across extraction, serving, and rationale-generation areas rather than a single feature. A reviewer should verify the CHANGELOG restructuring is intentional and check that the symbol renames and test updates are consistent across the affected modules.
No blocking issues surfaced.
Analysis details — impact, health, verification
Impact & health
graphify review
Impact — 5735 function(s) in the blast radius of 4710 changed node(s).
Health — regressions introduced by this change:
- worsened (Ca·Ce 240→7011):
main()(Ca=57 Ce=123) — fans out to 123 callees (efferent coupling); 57 callers depend on it (afferent coupling) - new offender:
_extract_generic()(Ca=18 Ce=14) — fans out to 14 callees (efferent coupling); 18 callers depend on it (afferent coupling) - new offender:
to_html()(Ca=17 Ce=8) — fans out to 8 callees (efferent coupling); 17 callers depend on it (afferent coupling) - new offender:
install()(Ca=12 Ce=11) — fans out to 11 callees (efferent coupling); 12 callers depend on it (afferent coupling) - new offender:
_resolve_js_module_path()(Ca=29 Ce=4) — 29 callers depend on it (afferent coupling) - new offender:
extract_objc()(Ca=26 Ce=4) — 26 callers depend on it (afferent coupling) - new offender:
codebuddy_install()(Ca=21 Ce=4) — 21 callers depend on it (afferent coupling) - new offender:
extract_bash()(Ca=19 Ce=4) — 19 callers depend on it (afferent coupling) - new offender:
gemini_install()(Ca=11 Ce=6) — fans out to 6 callees (efferent coupling); 11 callers depend on it (afferent coupling) - new offender:
extract_fortran()(Ca=14 Ce=4) — 14 callers depend on it (afferent coupling) - new offender:
extract_json()(Ca=13 Ce=4) — 13 callers depend on it (afferent coupling) - new offender:
_collect_js_symbol_resolution_facts()(Ca=2 Ce=25) — fans out to 25 callees (efferent coupling) - new offender:
extract_go()(Ca=16 Ce=3) — 16 callers depend on it (afferent coupling) - new offender:
extract_julia()(Ca=15 Ce=3) — 15 callers depend on it (afferent coupling) - new offender:
extract_rust()(Ca=15 Ce=3) — 15 callers depend on it (afferent coupling) - new offender:
claude_install()(Ca=15 Ce=3) — 15 callers depend on it (afferent coupling) - new offender:
extract_dm()(Ca=14 Ce=3) — 14 callers depend on it (afferent coupling) - new offender:
extract_pascal()(Ca=14 Ce=3) — 14 callers depend on it (afferent coupling) - new offender:
extract_powershell()(Ca=14 Ce=3) — 14 callers depend on it (afferent coupling) - new offender:
_project_uninstall()(Ca=3 Ce=13) — fans out to 13 callees (efferent coupling) - new offender:
_project_install()(Ca=3 Ce=12) — fans out to 12 callees (efferent coupling) - new offender:
extract_verilog()(Ca=9 Ce=4) — 9 callers depend on it (afferent coupling) - new offender:
_copy_skill_file()(Ca=12 Ce=3) — 12 callers depend on it (afferent coupling) - new offender:
_agents_install()(Ca=7 Ce=5) — 7 callers depend on it (afferent coupling) - new offender:
extract_apex()(Ca=14 Ce=2) — 14 callers depend on it (afferent coupling) - new offender:
codebuddy_uninstall()(Ca=14 Ce=2) — 14 callers depend on it (afferent coupling) - new offender:
extract_dmm()(Ca=6 Ce=4) — 6 callers depend on it (afferent coupling) - worsened (Ca·Ce 0→21):
_agents_install()(Ca=21 Ce=1) — 21 callers depend on it (afferent coupling) - new offender:
extract_markdown()(Ca=10 Ce=2) — 10 callers depend on it (afferent coupling) - new offender:
extract_dmf()(Ca=6 Ce=3) — 6 callers depend on it (afferent coupling) - new offender:
_resolve_js_import_target()(Ca=6 Ce=3) — 6 callers depend on it (afferent coupling) - new offender:
extract_delphi_form()(Ca=9 Ce=2) — 9 callers depend on it (afferent coupling) - new offender:
extract_sln()(Ca=9 Ce=2) — 9 callers depend on it (afferent coupling) - new offender:
claude_uninstall()(Ca=9 Ce=2) — 9 callers depend on it (afferent coupling) - new offender:
extract_dmi()(Ca=4 Ce=4) — high coupling complexity (Ca·Ce = 16) - new offender:
extract_dart()(Ca=8 Ce=2) — 8 callers depend on it (afferent coupling) - new offender:
extract_lazarus_form()(Ca=8 Ce=2) — 8 callers depend on it (afferent coupling) - new offender:
_remove_skill_file()(Ca=16 Ce=1) — 16 callers depend on it (afferent coupling) - new offender:
_agents_uninstall()(Ca=7 Ce=2) — 7 callers depend on it (afferent coupling) - new offender:
gemini_uninstall()(Ca=7 Ce=2) — 7 callers depend on it (afferent coupling) - new offender:
uninstall_all()(Ca=1 Ce=13) — fans out to 13 callees (efferent coupling) - new offender:
extract_sql()(Ca=4 Ce=3) — high coupling complexity (Ca·Ce = 12) - new offender:
_resolve_tsconfig_alias()(Ca=4 Ce=3) — high coupling complexity (Ca·Ce = 12) - worsened (Ca·Ce 0→12):
_install()(Ca=12 Ce=1) — 12 callers depend on it (afferent coupling) - new offender:
_collect_python_symbol_resolution_facts()(Ca=1 Ce=10) — fans out to 10 callees (efferent coupling) - new offender:
_extract_pascal_regex()(Ca=1 Ce=10) — fans out to 10 callees (efferent coupling) - new offender:
_js_extra_walk()(Ca=1 Ce=6) — fans out to 6 callees (efferent coupling) - new offender:
walk()(Ca=0 Ce=41) — fans out to 41 callees (efferent coupling) - new offender:
walk_calls()(Ca=0 Ce=12) — fans out to 12 callees (efferent coupling) - new offender:
walk()(Ca=0 Ce=6) — fans out to 6 callees (efferent coupling) - new offender:
walk()(Ca=0 Ce=6) — fans out to 6 callees (efferent coupling) - new offender:
walk()(Ca=0 Ce=6) — fans out to 6 callees (efferent coupling)
Verification — 5735 function(s) need re-proving (callee-first):
tools_skillgen_gen_write_artifacts → tools_skillgen_gen_v8_baseline_ref → tools_skillgen_gen_v8_available → tools_skillgen_gen_render_frontmatter → tools_skillgen_gen_normalise → tools_skillgen_gen_read_fragment → tools_skillgen_gen_render_core → tools_skillgen_gen_render_agents_md_hooks → tools_skillgen_gen_platform_reference_sources → tools_skillgen_gen_render …
Gate & verification
graphify gate
PASS — objectively clean (no health regressions, tests not run — proofs not enforced this run (re-run with --prove to verify the blast radius)). Grounded, not self-assessed.
Advisory (not blocking):
- verification_scope: 5726 function(s) in blast radius — re-run with
--proveto formally verify them
· 52 more finding(s) on lines outside this diff (see the check run).
…oncern hubs - Maintain an active `ruby_namespace` stack during Ruby AST extraction to normalize both compact (`module A::B`) and nested (`module A; module B; end; end`) module/class definitions to the same fully qualified names (e.g. `Billing::TotalsConcern`). - Update the Ruby cross-file resolver in `graphify/ruby_resolution.py` to parse full constant reference paths, performing scoped lexical lookup. - Restrict fallback to last-segment matching to single-segment mixin constants only, avoiding phantom mixes_in edges from `extend ActiveSupport::Concern` to unrelated local modules named `Concern`. - Add comprehensive TDD tests reproducing the compact syntax mixin resolution and active support concern hub isolation. Co-authored-by: FolatheDuckofDuckingburg <268987568+FolatheDuckofDuckingburg@users.noreply.github.com>
…981953082-422f3bef fix(ruby): resolve compact syntax mixin targets and prevent phantom concern hubs
There was a problem hiding this comment.
Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).
Graphify reviewed this change.
Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).
Graphify review — findings
This pull request replaces the top of the CHANGELOG, collapsing several previously released version sections into a new "Unreleased" section (with a 0.4.21 (2026-04-17) changelog symbol referenced). It also touches a broad set of extraction, build, resolution, serve, LLM, and CLI modules across the graphify codebase, along with a correspondingly large set of test files and skillgen tooling fixtures. The changes span many areas including language extractors (JS imports, XAML/Terraform, member-call resolution for C#/Java/SystemVerilog), graph build/merge/prune/cache logic, community labeling, the serve/search path, and install/detect utilities. Reviewers should treat this as a wide surface-area change and verify each module's edits against its associated tests rather than assuming a single focused intent.
No blocking issues surfaced.
Analysis details — impact, health, verification
Impact & health
Graphify review
Impact — 5739 functions depend on the 4714 node(s) this change touches.
Health — this change adds coupling hotspots:
- worse:
main()— 57 callers, 123 callees - new:
_extract_generic()— 18 callers, 14 callees - new:
to_html()— 17 callers, 8 callees - new:
install()— 12 callers, 11 callees - new:
_resolve_js_module_path()— 29 callers, 4 callees - new:
extract_objc()— 26 callers, 4 callees - new:
codebuddy_install()— 21 callers, 4 callees - new:
extract_bash()— 19 callers, 4 callees - …and 44 more
Verification — 5739 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: 5730 function(s) in the blast radius were not formally verified this run
· 52 more finding(s) on lines outside this diff (see the check run).
FolatheDuckofDuckingburg
left a comment
There was a problem hiding this comment.
@FolatheDuckofDuckingburg approves (bc im not a maintainer)
There was a problem hiding this comment.
Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).
Graphify reviewed this change.
Looks safe to merge — no coupling regressions and no blocking issues, checked against the code graph (not a self-assessment).
Graphify review — findings
This PR adds a new benchmarks/ directory containing a framework for measuring Graphify's impact on coding agent performance. It introduces documentation (README, methodology), a .gitignore, a test runner (runner.py), and an evaluator (evaluator.py) with task categories, metrics, and fixture/task structure. The changed symbol list also references numerous existing tests and graphify extraction/install modules, suggesting accompanying modifications across the caching, Ruby resolution, install, and extraction code paths. Reviewer surface area spans the new benchmark tooling plus touched areas in test suites (cache, install, ruby resolution), extraction logic, and main install entry points.
Worth a look
- _check_imports executes arbitrary top-level imports of agent-supplied code —
benchmarks/evaluator.py· Escalate · high- agreed by 2 of 2 members but NOT verified (no proof, no reproducing execution) — consensus is not a verdict; needs human review
- Missing imports are reported as resolved —
benchmarks/evaluator.py:93· 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 — 1605 functions depend on the 688 node(s) this change touches.
Health — this change adds coupling hotspots:
- worse:
extract()— 345 callers, 27 callees - new:
walk()— 2 callers, 41 callees - worse:
collect_files()— 14 callers, 5 callees - worse:
_extract_python_rationale()— 1 callers, 56 callees - new:
install()— 8 callers, 5 callees - worse:
_install()— 12 callers, 1 callees - worse:
_xaml_csharp_class_nodes()— 1 callers, 6 callees - new:
walk_calls()— 0 callers, 12 callees - …and 1 more
Verification — 1605 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: 1604 function(s) in the blast radius were not formally verified this run
· 9 more finding(s) on lines outside this diff (see the check run).
Resolves issue #2302 where Ruby include targets declared with compact syntax (module Foo::Bar) never resolve, and extend ActiveSupport::Concern collides with any local module named Concern. Normalizes compact and nested class/module declarations during AST extraction, and resolves mixin references via lexical lookup.