v1.6.0
·
8 commits
to main
since this release
Added
- code-graph: capture Go call/reference target import-path qualifiers on
pending_edges(target_module) and classifyexternaledges bygo.modmodule membership in the resolution-rate metric (ADR-0038, Layer A). - code-graph: definition-side
pkg:qualifier on Go symbols + package-qualified resolution (precise cross-package linking,AMBIGUOUSproducer, cross-repodeferred) — ADR-0038, Layer B. - code-graph: qualified-target capture for TypeScript (def-side
pkg:qualifier from the repo-relative file path + call-sidetarget_modulefrom the import specifier), extending package-qualified resolution beyond Go; the resolution-rateexternalclassification is now language-aware so non-Go qualifiers classify bypkg:-existence rather than the Gogo.modmembership test — ADR-0038, Layer C. - code-graph: qualified-target capture for Python (def-side dotted-module
pkg:qualifier + call-sidetarget_modulefrom import statements, relative imports normalized against the source file) — ADR-0038, Layer C. - code-graph: definition-side namespace
pkg:qualifier for C# symbols (enclosing blocknamespaceor file-scoped namespace), extending package-qualified resolution — ADR-0038, Layer C. - code-graph: call-side C# qualified-target capture —
configs/csharp.jsonsupplies the@reference.callcaptures the inferred tagger pool omits forinvocation_expressionvia an additiveextra_tags_query(appended to, never replacing, the resolved query). Ausing-alias receiver yields a namespacetarget_module(the alias target's FQN minus its final type segment); a bare type resolved byusing-namespace search, a namespace-rooted member chain (ambiguous namespace/type split), andthis/local-variable receivers stay unqualified under the authoritative-qualifier invariant — ADR-0038, Layer C. - code-graph:
RunResult.Ambiguouscounter andRESOLVER_AMBIGUOUSdiagnostic event (candidate set) make the qualified-resolution ambiguous producer observable (ADR-0038 follow-up). - code-graph:
graph retagbackfills def-sidepkg:on already-indexed Go/TS/Python symbols without re-extraction and (by default) drains the per-repo resolver, closing the Layer B/C rollout resolution-rate dip;--resolve=falsefor tag-only runs. C# requires a re-index (ADR-0038 follow-up). - code-graph:
relationships.target_modulerecords the module qualifier that pinned each qualified-resolved edge (provenance) — ADR-0038 follow-up. - code-graph: the
/healthcode-graph-resolution panel now reports the terminal-externaledge count alongside the unresolved split (informational; the resolution-rate gate is unchanged) — ADR-0038 follow-up. - code-graph: one-hop re-export following — TypeScript barrel re-exports (
export * from,export { X } from) resolve through the barrel to the defining module, staying package-qualified (ADR-0038 follow-up). - code-graph: Python
__init__.pyre-export following —from .mod import Xin a package init resolvespkg.Xto its defining module via the shared one-hop follow (ADR-0038 follow-up). - code-graph: Go value-method calls on explicitly-typed receivers (
var x pkg.T, parameters) capture the receiver type's package qualifier;:=-inferred receivers stay unqualified (ADR-0038 follow-up). - code-graph: Java qualified-target capture — def-side
pkg:from thepackagedeclaration (and call-sidetarget_modulefrom imported FQNs where Java call edges exist), generalizing the C# lexical-namespace model. Kotlin/F# remain grammar-gated (ADR-0038 follow-up). - intake: copy the verbatim source file into
~/.anton-core/data/knowledge/<item-type>/<id><ext>after a successfulsave --source-path/bulk-import, so raw inputs survive DB loss (Layer 1 durability).bulk-importsummary gainscopies_written/copy_failuresand its per-filejsonlline gainscopy_failed;savereports the durable copy location assaved_path. Theitem save/item bulk-importoutput contracts now enumerate these keys.
Fixed
- code-graph: nested C# block namespaces now qualify with their full dotted path —
namespace Acme { namespace Web { … } }stamps def-sidepkg:Acme.Web, not just the innermostpkg:Web. The enclosing-namespace walk concatenates everynamespace_declarationancestor instead of returning at the first; the truncated form mismatched the call-side qualifier (full FQN minus its last segment), so nested-namespace symbols referenced through ausingalias could never resolve. Single dotted declarations (namespace Acme.Web) and file-scoped namespaces were already correct — ADR-0038, Layer C. - code-graph: a
CALLSedge now resolves against a method definition, not only a free function. The candidate lookup matched the call's conservativefunctionexpected-kind exactly againstitems.kind, so a call whose target is a method (every C# call, and most calls in any OO language) never resolved; the candidate-kind match now treats aCALLStarget as a callable (function or method). Pre-existing and latent — every prior resolve fixture used free functions — first exercised by C# call-side capture (ADR-0038, Layer C). - code-graph: the resolver now persists the normalized TypeScript/Python
target_module(def-sidepkg:form, e.g.src/util) on a pending edge that stays unresolved, instead of leaving the raw import specifier (./util). The language-aware resolution-rate reader testspkg:<target_module>existence, so a persisted raw specifier silently dropped an in-corpus relative/aliased-import gap asexternaland under-counted unresolved edges — ADR-0038, Layer C. - code-graph: nested-
go.modwalk — def-sidepkg:and resolution-rate module membership resolve against the nearest enclosing module, fixing monorepo misclassification (ADR-0038 follow-up). - code-graph: Python multi-segment relative imports (
from .pkg.mod import x) resolve to the nested module (ADR-0038 follow-up). - code-graph: TypeScript
index.tsimplicit resolution — an index module's def-sidepkg:is its directory (src/feature), matching./featureimports (ADR-0038 follow-up). - code-graph: guard the indexer's per-repo module-path cache (
Indexer.repoRootBySlug) with a mutex —repos syncindexes multiple repos concurrently through one shared indexer, so the unsynchronized cache read/write was a data race (pre-existing; mirrors the mutex the slug cache already takes) — ADR-0038 follow-up. - code-graph: a failed best-effort module-path persist (or stale-key sweep) during indexing now emits a
WARN MODULE_PATH_PERSIST_FAILED/MODULE_PATH_SWEEP_FAILEDevent instead of a bare log line. The Go resolution-rate metric classifies edges by module membership read from those rows, so a silently-lost write could otherwise leave thecode_graph_resolutionpanel falsely healthy — ADR-0038 follow-up. - code-graph:
graph retagnow reportsstatus: "partial"for a repo whosepkg:tags committed but whose post-tag resolver drain failed, so a status-only scan no longer reads a half-completed repo as fully successful — ADR-0038 follow-up.
Changed
- intake:
saved_pathnow records the durable copy location (<item-type>/<id><ext>) instead of the user's original path;retry --target extractionandpurge --target legacy-stubsresolve it against the data root and re-read the copy. Thesave --saved-pathflag is removed (the path is computed now). report health— thecode_graph_resolutionpanel no longer counts calls
into the standard library or unindexed dependencies as unresolved. The
resolution-rate reader excludes any pending edge whose target name is defined
nowhere in the indexed corpus (generalising the language-level externals
filter), so a single-repo index stops peggingwarningover expected
external call targets; a target the corpus does define stays counted, so the
ratio measures edges the resolver could link but has not. The panel detail
now readsN% of code-graph edges unresolvedrather thanN% orphaned items
— the figure counts edges, not graph nodes. Precise classification via
fully-qualified target monikers is tracked in
docs/adr/0038-code-graph-qualified-target-capture.md.