Handbooks
Konzepte

Analysetreue

Zwei Analyse-Tiers erzeugen identisch aussehende Ausgabe. Das ist eine Falle — deshalb deklariert jeder Adapter, was er liefern kann, und das Handbook legt es offen.

Das Problem

Handbooks analysiert 18 Sprachen mit zwei Engines:

  • Full-Tier — ein handgeschriebener Adapter pro Sprache, mit typgetriebener Aufrufauflösung, geerbten Membern, Zustandsverfolgung pro Attribut und Statement-Spans.
  • Generic-Tier — eine einzige konfigurationsgetriebene Engine mit einer deklarativen Spezifikation pro Sprache. Das Datei- und Funktionsinventar ist exakt; Aufrufbeziehungen sind Best-Effort.

Beide erzeugen dieselbe Zwischendarstellung. Nichts Nachgelagertes kann sie anhand von Knoten und Kanten auseinanderhalten.

Genau das ist die Falle. Ein Leser — und erst recht ein Agent — würde eine Generic-Tier-Aufrufkante für einen Fakt in Python-Qualität halten und entsprechend darauf schließen.

Die Lösung: deklarieren, festhalten, offenlegen

1. Jeder Adapter deklariert, was er liefern kann

interface AdapterCapabilities {
  tier: 'full' | 'generic';
  callTypes: readonly CallType[]; // which edge kinds it can actually produce
  selfAttrs: boolean; // can it track self/this attribute reads and writes?
  statementSpans: boolean; // can it report statement spans (resync precision)?
}

Dieses Feld ist verpflichtend, nicht optional. Adapter kann jeder registrieren, und ein handgestrickter Adapter, der nichts deklariert, fällt schlicht aus den Graph-Metadaten heraus, statt eine erfundene Treue-Angabe verpasst zu bekommen.

2. Phase 1 hält sie pro Sprache fest

phase1/graph.json (excerpt)
{
  "metadata": {
    "language": "multi",
    "languages": {
      "typescript": { "tier": "full", "selfAttrs": true, "statementSpans": true, "callTypes": ["..."] },
      "kotlin": { "tier": "generic", "selfAttrs": false, "statementSpans": false, "callTypes": ["..."] }
    }
  }
}

Pro Sprache, nicht pro Graph — ein mehrsprachiger Lauf mischt Tiers, und ein einzelnes language: "multi"-Label würde das vollständig verdecken.

3. Das Handbook sagt es dort, wo Vertrauen entsteht

Sobald irgendeine Generic-Tier-Sprache vorkommt, bekommt der Überblick eine zusätzliche Zeile, direkt unter der Systemprosa:

Analysetreue — die Aufrufbeziehungen für Kotlin, Scala stammen aus dem generischen (konfigurationsgetriebenen) Analyzer: Sie sind Best-Effort und können unvollständig sein. Das Dateiinventar und die Struktur dieser Sprachen sind exakt.

Und nirgendwo, wenn jede Sprache Full-Tier ist — so bleibt der Normalfall frei von Rauschen. Dieselbe Offenlegung erscheint in der HTML-Site, im Agent-Locator-Index und in llms-full.txt.

Welches Tier hat meine Sprache?

Full-Tier: Python, TypeScript (und JavaScript), Go, Rust, Java, C#, C/C++, Ruby, PHP, Swift, Dart, Solidity, Shell.

Generic-Tier: Kotlin, Scala, Zig, Objective-C, OCaml.

Dateiendungen und Einschränkungen stehen unter Sprachunterstützung.

Was „Best-Effort" tatsächlich kostet

Full-TierGeneric-Tier
Dateiinventarexaktexakt
Funktions- und Methodeninventarexaktexakt
Zeilenbereiche und Signaturenexaktexakt
Direkte Aufrufe per Nameexaktmeistens
self.method() / this.method()aufgelöstoft
self.attr.method() über einen bekannten Typaufgelöstnein
param.method() über eine Typannotationaufgelöstnein
Geerbte Memberaufgelöstnein
Zustandsverfolgung pro Attributjanein
Statement-Spans (resync-Präzision)janein

Alles, wonach geroutet wird — wo eine Datei liegt, welche Funktionen sie enthält, welche Zeilen diese belegen — ist in beiden Tiers exakt. Was degradiert, ist der Beziehungs-Graph, und der beeinflusst Gruppierungsqualität und Co-Change-Hinweise, keine Adressen.

Zwei ehrliche Vorbehalte

Swift. Die mitgelieferte Grammatik bricht den Prozess auf V8 ≥ 13 ab — gemessen fatal in 5 von 5 Fällen auf Node 24, problemlos auf Node 21, und einzigartig unter den neunzehn Grammatiken. Der Adapter verweigert bereits bei der Discovery auf einem solchen Runtime und nennt die Abhilfe (node --liftoff-only), statt den ganzen Lauf mit sich zu reißen.

Shell. Ein Skript mit einem case-Statement wird übersprungen, weil diese Grammatik wirft — ihr externer Scanner importiert ein Symbol, das der gepinnte WASM-Linker nicht bereitstellt. Da case allgegenwärtig ist, betrifft das die meisten nicht-trivialen Skripte (gemessen an nvm: alle 6 Dateien, alle 122 Funktionen) — Shell-Abdeckung also als partiell behandeln. Das Scan-Log nennt die Ursache, und jedes übersprungene Skript steht einzeln mit reason: "unparsable" in phase1/scan-coverage.json — eine Lücke, die sich aufzählen lässt, statt geraten werden zu müssen.

Beide Fälle werden während des Scans über den Logger gemeldet. Mit -v ausführen, um sie zu sehen.

Eine Sprache ein Tier höher heben

Eine Generic-Tier-Sprache ist eine deklarative Spezifikation, kein Parser — siehe Eine Sprache hinzufügen. Sie zum Full-Tier zu befördern heißt, LanguageAdapter direkt zu implementieren und ehrliche Capabilities zu deklarieren. Der Adaptervertrag ist mit Absicht klein.

Auf dieser Seite