Skip to content

Remove faulty GitHub Actions Workflow for Python, fix: resolve explain-ambiguity, fix(ruby): resolve compact syntax mixin targets and prevent phantom concern hubs. - #1394

Open
FolatheDuckofDuckingburg wants to merge 27 commits into
Graphify-Labs:v8from
FolatheDuckofDuckingburg:v8

Conversation

@FolatheDuckofDuckingburg

@FolatheDuckofDuckingburg FolatheDuckofDuckingburg commented Jun 19, 2026

Copy link
Copy Markdown

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.

google-labs-jules Bot and others added 10 commits July 27, 2026 15:03
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
google-labs-jules Bot and others added 2 commits July 28, 2026 15:33
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

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 --prove to formally verify them

· 52 more finding(s) on lines outside this diff (see the check run).

@FolatheDuckofDuckingburg FolatheDuckofDuckingburg changed the title Add GitHub Actions workflow for Python with linting and tests Remove faulty GitHub Actions Workflow for Python, fix: resolve explain-ambiguity. Jul 28, 2026
google-labs-jules Bot and others added 2 commits July 29, 2026 15:13
…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

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 FolatheDuckofDuckingburg changed the title Remove faulty GitHub Actions Workflow for Python, fix: resolve explain-ambiguity. Remove faulty GitHub Actions Workflow for Python, fix: resolve explain-ambiguity, fix(ruby): resolve compact syntax mixin targets and prevent phantom concern hubs. Jul 29, 2026

@FolatheDuckofDuckingburg FolatheDuckofDuckingburg left a comment

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@FolatheDuckofDuckingburg approves (bc im not a maintainer)

@graphify-labs graphify-labs Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

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 codebenchmarks/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 resolvedbenchmarks/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).

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant