You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Data-shaped .json is deliberately skipped by extract_json (#1224 — AST-walking it exploded into orphan key-nodes), which is the right call for structure. But the current skip is total: the file contributes no node at all, so the path is absent from graph.json entirely and is unreachable from query / explain / affected.
Requesting a middle setting: emit a single file node for skipped data JSON — no key traversal, no children, no edges — so the file is discoverable without reintroducing #1224's node explosion.
Why this matters (concrete case)
Our repo runs two implementations of the same underwriting engine (Python and a Java port) and pins their agreed behaviour in shared parity corpora:
benchmarks/stateful_corpus.json
benchmarks/stateless_corpus.json
These are the contract between the two implementations — CI has dedicated parity, parity-java and parity-java-stateful jobs that consume them. They are arguably the most decision-relevant files in the repo for any "do these two implementations agree?" question.
Neither has ever appeared in our graph. Our project convention (and our CLAUDE.md) routes codebase questions through graphify query first, so the practical result is that a parity question returns a confident, well-formed answer assembled entirely from the implementations, with no indication that the file defining the agreed behaviour exists at all.
That is the part worth weighing: the failure is not an empty result, which would prompt a fallback to grep. It is a plausible result with a silent hole. Same class of concern as the "if someone uses the warning's silence as evidence their corpus is fully covered" point raised in #1666.
The same applies to other data JSON that is meaningful at file granularity — i18n catalogues (portal/src/locales/{en,ru}.json), Grafana dashboards, Postman collections.
Proposal
For a .json that fails manifest recognition, return exactly one node:
No key nodes, no nested traversal, no edges — the file node only. On our repo that is 8 nodes total, against the 561 orphan nodes #1224 was closed to prevent.
Benefits:
query / explain can surface that the file exists and where it lives.
Co-location edges (if any are derived elsewhere from directory structure) put it near the code that consumes it.
If a blanket file node is too broad, gating it behind a flag (--index-data-json) or a size ceiling would still cover the case, though the value is highest when it is on by default — the whole problem is that the gap is invisible unless you already know to look for it.
Alternative considered
Adding a probe key to our corpora (e.g. $schema) to make them manifest-recognised. Rejected: it would pull them down the manifest path and produce misleading dependency-shaped structure, and it asks every repo to mangle its data files to be visible to the tool.
Summary
Data-shaped
.jsonis deliberately skipped byextract_json(#1224 — AST-walking it exploded into orphan key-nodes), which is the right call for structure. But the current skip is total: the file contributes no node at all, so the path is absent fromgraph.jsonentirely and is unreachable fromquery/explain/affected.Requesting a middle setting: emit a single file node for skipped data JSON — no key traversal, no children, no edges — so the file is discoverable without reintroducing #1224's node explosion.
Why this matters (concrete case)
Our repo runs two implementations of the same underwriting engine (Python and a Java port) and pins their agreed behaviour in shared parity corpora:
benchmarks/stateful_corpus.jsonbenchmarks/stateless_corpus.jsonThese are the contract between the two implementations — CI has dedicated
parity,parity-javaandparity-java-statefuljobs that consume them. They are arguably the most decision-relevant files in the repo for any "do these two implementations agree?" question.Neither has ever appeared in our graph. Our project convention (and our
CLAUDE.md) routes codebase questions throughgraphify queryfirst, so the practical result is that a parity question returns a confident, well-formed answer assembled entirely from the implementations, with no indication that the file defining the agreed behaviour exists at all.That is the part worth weighing: the failure is not an empty result, which would prompt a fallback to grep. It is a plausible result with a silent hole. Same class of concern as the "if someone uses the warning's silence as evidence their corpus is fully covered" point raised in #1666.
The same applies to other data JSON that is meaningful at file granularity — i18n catalogues (
portal/src/locales/{en,ru}.json), Grafana dashboards, Postman collections.Proposal
For a
.jsonthat fails manifest recognition, return exactly one node:{ "id": "<path_qualified_id>", "label": "stateful_corpus.json", "file_type": "data", "source_file": "benchmarks/stateful_corpus.json", "source_location": "L1" }No key nodes, no nested traversal, no edges — the file node only. On our repo that is 8 nodes total, against the 561 orphan nodes #1224 was closed to prevent.
Benefits:
query/explaincan surface that the file exists and where it lives.If a blanket file node is too broad, gating it behind a flag (
--index-data-json) or a size ceiling would still cover the case, though the value is highest when it is on by default — the whole problem is that the gap is invisible unless you already know to look for it.Alternative considered
Adding a probe key to our corpora (e.g.
$schema) to make them manifest-recognised. Rejected: it would pull them down the manifest path and produce misleading dependency-shaped structure, and it asks every repo to mangle its data files to be visible to the tool.Environment
graphifyy) 0.9.20, uv tool install, macOS (Darwin 25.6.0), Python 3.12