Skip to content

Fix: unify AST and semantic graphs with entity resolution and worked example - #213

Open
karthick1005 wants to merge 61 commits into
Graphify-Labs:v4from
karthick1005:feature/semantic-ast-alignment
Open

Fix: unify AST and semantic graphs with entity resolution and worked example#213
karthick1005 wants to merge 61 commits into
Graphify-Labs:v4from
karthick1005:feature/semantic-ast-alignment

Conversation

@karthick1005

@karthick1005 karthick1005 commented Apr 11, 2026

Copy link
Copy Markdown

Graph Unification: AST + Semantic Alignment with Worked Example

Status: Ready for review
Target: safishamsi/graphify
Fork: karthick1005/graphify


Summary

This contribution fixes a structural issue where AST and semantic extraction produced largely disconnected subgraphs and relied on brittle exact ID matching.

It introduces canonical identity, entity resolution, and entity-level semantic ↔ code linking, along with a worked example to validate the changes on a real-world backend system.


Problem

Currently:

  • AST and semantic extraction run independently
  • Nodes are merged only on exact ID equality
  • Semantic nodes often fail to align with AST nodes

Result:

  • Separate code graph and semantic graph
  • Minimal code ↔ concept connections
  • Semantic layer behaves as a detached subgraph

Solution

1. Canonical Identity

  • Added normalization for node IDs
  • Prevents duplication (e.g., SentenceTransformer vs sentence transformer)

2. Entity Resolution

  • Implemented post-build merging using:

    • string similarity
    • token overlap

3. Fine-Grained Code Extraction

  • Extract functions, classes, and methods
  • Enables entity-level alignment

4. Semantic ↔ Code Linking

  • Added:

    • link_code_to_concepts()
    • link_semantic_to_code()
    • link_concepts()
  • Establishes connections between:

    • functions/classes ↔ concepts

5. Alignment Pipeline

  • Introduced structured flow:

    canonicalize → resolve_entities → semantic linking → align_nodes
    

Worked Example

Added:

worked/leetcode-backend/

Includes:

  • graph.json — generated graph
  • README.md — corpus + usage
  • review.md — evaluation of graph quality

This example demonstrates:

  • Distributed system graph construction
  • Fine-grained entity extraction
  • Semantic ↔ code alignment
  • Improved graph connectivity

Result

  • Unified graph instead of parallel subgraphs
  • Code ↔ concept relationships established
  • Reduced reliance on exact ID matching
  • Semantic layer now enriches the AST graph

Files Changed

  • graphify/build.py — canonical ID + merge logic
  • graphify/align.py — entity resolution + linking
  • graphify/extract.py — fine-grained extraction
  • worked/leetcode-backend/* — validation example

Backwards Compatibility

  • No breaking changes
  • Existing pipelines continue to work
  • Improvements are additive

Motivation

The issue was observed while analyzing generated graphs, where semantic and AST layers remained disconnected.

This change ensures proper integration and improves the usefulness of the generated knowledge graph.


Closes

Fixes #198

Minidoracat and others added 30 commits April 8, 2026 19:39
* fix: git hooks fail when graphify is installed via pipx

When installed via pipx, the graphify module is only available in
pipx's isolated venv, not the system python3. The git hooks
(post-commit, post-checkout) hardcoded `python3` which cannot import
graphify in this case.

Detect the correct Python interpreter from the graphify binary's
shebang line, matching the approach already used in skill.md Step 1.
Falls back to python3 for system installs.

* fix: handle env-style shebangs and improve interpreter detection

- Use POSIX `command -v` instead of non-standard `which`
- Parse `#!/usr/bin/env python3` shebangs correctly (previous
  `tr -d ' '` would produce `/usr/bin/envpython3`)
- Add import validation fallback to python3 if resolved interpreter
  cannot import graphify
… buffer

* fix: suppress graspologic ANSI output that breaks PowerShell scrolling

graspologic's leiden() emits ANSI escape sequences (progress bars,
colored warnings) that corrupt PowerShell 5.1's scroll buffer on
Windows, disabling vertical scrolling. Redirect stdout/stderr to
StringIO during leiden() calls to prevent any escape codes from
reaching the terminal.

Add 2 tests verifying cluster() produces no stdout/stderr output.

Fixes Graphify-Labs#19

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

* docs: add PowerShell troubleshooting section to Windows skill

Document the PowerShell 5.1 scrolling issue and provide 4
workarounds: upgrade graphify, use Windows Terminal, reset
terminal, or uninstall graspologic to use Louvain fallback.

Fixes Graphify-Labs#19

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>

---------

Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
- Register 'trae' and 'trae-cn' in _PLATFORM_CONFIG (skill-trae.md,
  ~/.trae/skills/ and ~/.trae-cn/skills/, claude_md=False)
- Add CLI subcommands: graphify trae install/uninstall,
  graphify trae-cn install/uninstall (routes to _agents_install/uninstall)
- Update help text with new platform entries
- Create skill-trae.md (Agent-tool based extraction, AGENTS.md integration,
  no PreToolUse hook support per Trae limitations)
- Update README.md and README.zh-CN.md with Trae platform docs

Co-authored-by: lijinshuan <lijinshuan@bytedance.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…utput

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…y-Labs#109: extension drift, click detection, skill coverage, .graphify_python persistence

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ify-Labs#126)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…e relations in innerHTML (#sec)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…y-Labs#127)

Tree-sitter resolves call targets directly from source — marking them
INFERRED was incorrect. Cross-file class-level uses edges remain INFERRED.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…AST calls

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…Windows git hooks (Graphify-Labs#140)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…hify-Labs#105)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
safishamsi and others added 29 commits April 9, 2026 17:59
…he, graphifyignore parent discovery, MCP fixes

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…cription

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…port

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…nstall

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…attribute

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…r prompt itself

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…ort.py, bound collision loop

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…aceholder

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
 Graphify-Labs#195: skill.md requires general-purpose subagent type for extraction dispatch

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…tion, entity alignment, and fine-grained linking
…phify-Labs#222 and bump to 0.4.2

- extract.py: use str(path) for node IDs to prevent same-basename collision (Graphify-Labs#211)
- build.py: normalize from/to edge keys before KeyError (Graphify-Labs#216)
- export.py: guard ZeroDivisionError when graph has no edges (Graphify-Labs#217)
- hooks.py: remove stale CODE_EXTS filter, rebuild on any changed file (Graphify-Labs#222)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
…, Graphify-Labs#221 into 0.4.2

- build/validate: accept NetworkX <=3.1 "links" key alongside "edges" (Graphify-Labs#212)
- __main__: skip version check during install/uninstall, deduplicate paths (Graphify-Labs#220)
- all file IO: explicit encoding="utf-8" to prevent crashes on Windows CJK locales (Graphify-Labs#204)
- hooks: add newline="\n" on write to prevent CRLF shebang breakage on Windows (Graphify-Labs#204)
- export: strip trailing .md from safe_name so "CLAUDE.md" doesn't become "CLAUDE.md.md" (Graphify-Labs#221)
- report: add Community Hubs navigation block so Obsidian vault stays connected (Graphify-Labs#221)

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
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.

Semantic layer is mostly disconnected from the AST graph

7 participants