Skip to content

Accuracy

Every reference Tessera records carries a confidence. This page says what each level means and how often it is right, measured against compiler ground truth on public repositories.

Level Meaning Example
high Resolved through scope, an import (followed through re-exports and barrels), this/super, a typed receiver, a class name, or a Java package this.repo.save() where repo: UserRepo is a declared field
medium One definition in the repository has this name, or the receiver’s type came from a declared return type x.render() with an untyped x, when only one render exists
low Two to five definitions share the name; all are kept as one ambiguous group .load() with several load methods
name Unresolved, matched by name only. Output says so a call on a value whose type Tessera cannot see

A reference that resolves outside the repository (an npm package, the JDK, a type such as Map) is not reported as a reference to a repository symbol at all, so rows.get() on a Map never shows up under your own get.

refs --min-confidence high|medium|low and the MCP min_confidence argument drop weaker results. blast gives each caller the weakest confidence on its path.

Resolution is deep for TypeScript, TSX, JavaScript (ESM and CommonJS), and Java (imports, packages, fields, parameters, this, static calls, and overloads by argument count). Other languages use the same rules where they apply (scope, unique names) and otherwise stay at name level.

From tessera-bench, run on 2026-10-21 against scip-typescript and scip-java ground truth. Precision counts every reference Tessera reports for 200 sampled definitions per repository; resolved recall counts ground-truth references Tessera found at high or medium confidence.

Repository high precision direct calls typed receivers type references
excalidraw (TypeScript, React) 0.999 1.000 0.914 0.990
nest (TypeScript) 0.994 1.000 0.969 0.985
ghost core (JavaScript, TypeScript) 0.990 0.879 0.698 0.963
TypeScript/JavaScript 0.998 0.990 0.912 0.986
spring-petclinic (Java) 0.995 0.900 0.958 1.000
spring-petclinic-microservices (Java) 0.995 0.778 0.800 1.000
Java 0.995 0.872 0.935 1.000

The release gate for the deep tier is high-confidence precision of at least 0.95 and resolved recall of at least 0.85 for direct calls, typed receivers, and type references. It passes for TypeScript/JavaScript and for Java. Two repositories are below it in one category: Ghost’s typed receivers (53 sites), whose types come through chained calls (data.key("x").index(0)) and getters that Tessera does not follow yet, and the microservices sample (9 direct calls, 40 typed receivers). The Java corpus is small, so read its numbers with their sample sizes.

Precision at every level, with the number of references scored. Only high blocks a hook; the other levels are labelled in the output and should be read as the hints they are.

Repository high medium low name only
excalidraw 0.999 (5,808) 1.000 (76) 0.551 (158) 0.400 (25)
nest 0.994 (1,060) 0.682 (22) – 0.033 (123)
ghost core 0.990 (594) – 0.500 (26) 0.004 (242)
spring-petclinic 0.995 (415) 0.985 (65) 1.000 (3) 0.429 (7)
spring-petclinic-microservices 0.995 (182) 0.750 (4) 0.258 (31) 0.885 (26)
  • Ground truth: SCIP indexes built by scip-typescript and scip-java at pinned commits. Both attribute new X() to X’s constructor, and the scoring does the same. Sites the indexer itself could not resolve, and files it did not index, are not scored.
  • Sample: 40 definitions from each of five fan-in buckets per repository, fixed seed.
  • Not measured: plain identifier reads (KEYS.A used as a value), which Tessera does not record as references.
  • The harness is built to take adapters for other code-graph tools, with their versions and raw output published beside Tessera’s. None are published yet.

To reproduce, clone tessera-bench and run scripts/fetch.sh, scripts/scip.sh, and python3 -m bench.run tessera.