AST-only update drops EXTRACTED code→semantic edges (watch.py sem_edges filter)
I maintainer di solito rispondono entro 1 giorno
Nessuno ha ancora preso questa issue.
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 86/100
Direzione di ricerca
Inizia in graphify/watch.py, nella fusione AST-only utilizzata da graphify update, quindi riproduci il problema con l’arco code-to-semantic EXTRACTED documentato. Aggiorna il comportamento di conservazione degli archi semantici e verifica che l’arco sopravviva a una ricostruzione AST-only senza perdere la gestione esistente dei nodi.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Summary
On an AST-only rebuild (graphify update / the watch path), watch.py preserves semantic nodes (any node with file_type != "code") but only preserves edges whose confidence is INFERRED/AMBIGUOUS or whose both endpoints are non-code. As a result, EXTRACTED edges that connect a code node to a preserved semantic node (e.g. a script node → an external service/database node) are silently dropped on every update, even though both endpoints remain in the graph.
Impact
Cross-file semantic relationships (script → external system, code → doc concept) vanish on the next graphify update, so the graph loses information the semantic pass had already extracted. They only come back after another full semantic run. This is easy to miss because the update still prints a successful rebuild.
Reproduction
- Build a graph with a semantic pass that adds, for example:
- node
Salient_Cloud_SFTPwithfile_type: document(any non-codetype) - edge
script_py -> Salient_Cloud_SFTPwithconfidence: EXTRACTED
- node
- Run
graphify update .. - The node survives; the edge is gone.
sem_nodes keeps anything non-code, so the node persists. sem_edges requires source not in code_ids and target not in code_ids, so a code→semantic edge fails the predicate and is discarded.
Relevant code
graphify/watch.py (AST-only merge, preserving semantic nodes/edges):
code_ids = {n["id"] for n in existing.get("nodes", []) if n.get("file_type") == "code"}
sem_nodes = [n for n in existing.get("nodes", []) if n.get("file_type") != "code"]
sem_edges = [e for e in existing.get("links", existing.get("edges", []))
if e.get("confidence") in ("INFERRED", "AMBIGUOUS")
or (e.get("source") not in code_ids and e.get("target") not in code_ids)]
Suggested fix
Keep any edge attached to a preserved semantic node:
code_ids = {n["id"] for n in existing.get("nodes", []) if n.get("file_type") == "code"}
sem_nodes = [n for n in existing.get("nodes", []) if n.get("file_type") != "code"]
sem_ids = {n["id"] for n in sem_nodes}
sem_edges = [e for e in existing.get("links", existing.get("edges", []))
if e.get("confidence") in ("INFERRED", "AMBIGUOUS")
or e.get("source") in sem_ids
or e.get("target") in sem_ids
or (e.get("source") not in code_ids and e.get("target") not in code_ids)]
I verified locally that this keeps code→semantic EXTRACTED edges across an AST-only rebuild.
Related observations
graphify/validate.py::validate_extractiononly warns and never coerces or rejects invalid values, andgraphify/build.pyprints onlyreal_errors[0]. So many invalidfile_typevalues can accumulate and stay invisible. In one real corpus the single reported error hid 83 issues (71 invalidfile_type, 6 missingfile_type, 6 edges missingsource_file).- The shipped skill prompt defines
file_typeascode|document|paper|image(e.g.skill-windows.md,skill-codex.md,skill-trae.md). That vocabulary omitsrationale, which the validator accepts, and is not enforced, so models emit ad-hoc values (python,doc,concept,service,database). Aligning the prompt withVALID_FILE_TYPES(and mentioningrationale) would prevent most of these.
- Lingua principale
- Python
- Stelle
- 124k
- Fork
- 11.9k
- Metriche di merge delle PR
- Nessuna PR unita negli ultimi 30g
Preparare l'ambiente
Questo progetto non fornisce container di sviluppo, Dockerfile né guida per i contributori, quindi l'ambiente è a tuo carico: parti dal suo README e consulta la nostra guida al primo contributo per i passaggi generali.
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di Graphify-Labs/graphify
-
test(elixir): add a defguardp regression testForse già presa @ClockZW l’ha presa 1 giorno fa. Apertagood first issue help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 90/100
Graphify-Labs/graphify#4076 ·
I maintainer di solito rispondono entro 1 giorno
-
test(php): parametrize the language-construct test across all constructsForse già presa @xiehuanyi l’ha presa oggi. Apertagood first issue help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
Graphify-Labs/graphify#4075 ·
I maintainer di solito rispondono entro 1 giorno
-
test(zig): assert a tagged-union nested-struct payload's fields are not mintedForse già presa @Jarvis-J-Jacob l’ha presa 1 giorno fa. Apertagood first issue help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
Graphify-Labs/graphify#4074 ·
I maintainer di solito rispondono entro 1 giorno
-
test(rust): positive same-family cross-language base resolutionForse già presa @xiehuanyi l’ha presa oggi. Apertagood first issue help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
Graphify-Labs/graphify#4073 ·
I maintainer di solito rispondono entro 1 giorno
-
fix(astro): port the U+2028 trailing-comment terminator from the Svelte maskerForse già presa @Sourya-Prabaharan l’ha presa 1 giorno fa. Apertagood first issue help wanted
Difficoltà 2/5 1-3 ore Idoneità per principianti 90/100
Graphify-Labs/graphify#4072 ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di Graphify-Labs/graphify
Issue simili
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 88/100
-
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 92/100
QuantEcon/lecture-python-programming#642 ·
I maintainer di solito rispondono entro 1 giorno
-
area/config area/profiles comp/cli needs-decision P3 sweeper:risk-compatibility type/feature
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
NousResearch/hermes-agent#133697 ·
I maintainer di solito rispondono entro 1 giorno
-
enhancement needs-triage
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
core
Difficoltà 2/5 1-3 ore Idoneità per principianti 88/100
vectorize-io/hindsight#5279 ·
I maintainer di solito rispondono entro 1 giorno