@untangle-code/search 0.0.0-stage → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +661 -0
- package/NOTICE +90 -0
- package/README.md +433 -2
- package/THIRD_PARTY_LICENSES.md +29 -0
- package/dist/benchmark-integrity.d.ts +12 -0
- package/dist/benchmark-integrity.d.ts.map +1 -0
- package/dist/benchmark-integrity.js +10 -0
- package/dist/benchmark-integrity.js.map +1 -0
- package/dist/bm25.d.ts +46 -0
- package/dist/bm25.d.ts.map +1 -0
- package/dist/bm25.js +105 -0
- package/dist/bm25.js.map +1 -0
- package/dist/deadline.d.ts +4 -0
- package/dist/deadline.d.ts.map +1 -0
- package/dist/deadline.js +54 -0
- package/dist/deadline.js.map +1 -0
- package/dist/dedupe.d.ts +48 -0
- package/dist/dedupe.d.ts.map +1 -0
- package/dist/dedupe.js +58 -0
- package/dist/dedupe.js.map +1 -0
- package/dist/diversify.d.ts +45 -0
- package/dist/diversify.d.ts.map +1 -0
- package/dist/diversify.js +30 -0
- package/dist/diversify.js.map +1 -0
- package/dist/engine.d.ts +157 -0
- package/dist/engine.d.ts.map +1 -0
- package/dist/engine.js +1498 -0
- package/dist/engine.js.map +1 -0
- package/dist/enrichment.d.ts +16 -0
- package/dist/enrichment.d.ts.map +1 -0
- package/dist/enrichment.js +92 -0
- package/dist/enrichment.js.map +1 -0
- package/dist/filter.d.ts +86 -0
- package/dist/filter.d.ts.map +1 -0
- package/dist/filter.js +166 -0
- package/dist/filter.js.map +1 -0
- package/dist/findability.d.ts +144 -0
- package/dist/findability.d.ts.map +1 -0
- package/dist/findability.js +393 -0
- package/dist/findability.js.map +1 -0
- package/dist/format.d.ts +28 -0
- package/dist/format.d.ts.map +1 -0
- package/dist/format.js +172 -0
- package/dist/format.js.map +1 -0
- package/dist/fusion.d.ts +47 -0
- package/dist/fusion.d.ts.map +1 -0
- package/dist/fusion.js +84 -0
- package/dist/fusion.js.map +1 -0
- package/dist/glob.d.ts +50 -0
- package/dist/glob.d.ts.map +1 -0
- package/dist/glob.js +144 -0
- package/dist/glob.js.map +1 -0
- package/dist/grep.d.ts +76 -0
- package/dist/grep.d.ts.map +1 -0
- package/dist/grep.js +475 -0
- package/dist/grep.js.map +1 -0
- package/dist/index.d.ts +42 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +63 -0
- package/dist/index.js.map +1 -0
- package/dist/ledger.d.ts +45 -0
- package/dist/ledger.d.ts.map +1 -0
- package/dist/ledger.js +39 -0
- package/dist/ledger.js.map +1 -0
- package/dist/payload.d.ts +108 -0
- package/dist/payload.d.ts.map +1 -0
- package/dist/payload.js +263 -0
- package/dist/payload.js.map +1 -0
- package/dist/port.d.ts +112 -0
- package/dist/port.d.ts.map +1 -0
- package/dist/port.js +2 -0
- package/dist/port.js.map +1 -0
- package/dist/product-complexity.d.ts +89 -0
- package/dist/product-complexity.d.ts.map +1 -0
- package/dist/product-complexity.js +1367 -0
- package/dist/product-complexity.js.map +1 -0
- package/dist/regex-safety.d.ts +75 -0
- package/dist/regex-safety.d.ts.map +1 -0
- package/dist/regex-safety.js +902 -0
- package/dist/regex-safety.js.map +1 -0
- package/dist/relevance-prerequisites.d.ts +21 -0
- package/dist/relevance-prerequisites.d.ts.map +1 -0
- package/dist/relevance-prerequisites.js +47 -0
- package/dist/relevance-prerequisites.js.map +1 -0
- package/dist/relevance.d.ts +107 -0
- package/dist/relevance.d.ts.map +1 -0
- package/dist/relevance.js +199 -0
- package/dist/relevance.js.map +1 -0
- package/dist/retrieval.d.ts +46 -0
- package/dist/retrieval.d.ts.map +1 -0
- package/dist/retrieval.js +182 -0
- package/dist/retrieval.js.map +1 -0
- package/dist/scoring.d.ts +102 -0
- package/dist/scoring.d.ts.map +1 -0
- package/dist/scoring.js +175 -0
- package/dist/scoring.js.map +1 -0
- package/dist/sort.d.ts +21 -0
- package/dist/sort.d.ts.map +1 -0
- package/dist/sort.js +53 -0
- package/dist/sort.js.map +1 -0
- package/dist/symbol-match.d.ts +21 -0
- package/dist/symbol-match.d.ts.map +1 -0
- package/dist/symbol-match.js +72 -0
- package/dist/symbol-match.js.map +1 -0
- package/dist/tokenize.d.ts +41 -0
- package/dist/tokenize.d.ts.map +1 -0
- package/dist/tokenize.js +202 -0
- package/dist/tokenize.js.map +1 -0
- package/dist/types.d.ts +173 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +42 -0
- package/dist/types.js.map +1 -0
- package/package.json +61 -3
- package/src/benchmark-integrity.ts +25 -0
- package/src/bm25.ts +135 -0
- package/src/deadline.ts +59 -0
- package/src/dedupe.ts +99 -0
- package/src/diversify.ts +71 -0
- package/src/engine.ts +1957 -0
- package/src/enrichment.ts +115 -0
- package/src/filter.ts +267 -0
- package/src/findability.ts +580 -0
- package/src/format.ts +228 -0
- package/src/fusion.ts +121 -0
- package/src/glob.ts +151 -0
- package/src/grep.ts +618 -0
- package/src/index.ts +83 -0
- package/src/ledger.ts +72 -0
- package/src/payload.ts +382 -0
- package/src/port.ts +133 -0
- package/src/product-complexity.ts +2168 -0
- package/src/regex-safety.ts +1002 -0
- package/src/relevance-prerequisites.ts +83 -0
- package/src/relevance.ts +328 -0
- package/src/retrieval.ts +299 -0
- package/src/scoring.ts +321 -0
- package/src/sort.ts +86 -0
- package/src/symbol-match.ts +87 -0
- package/src/tokenize.ts +213 -0
- package/src/types.ts +206 -0
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Findability als Eigenschaft je Symbol (vision.md §1d).
|
|
3
|
+
*
|
|
4
|
+
* Die These, um die es hier geht, steht woertlich in vision.md §1d:
|
|
5
|
+
*
|
|
6
|
+
* > Wenn die Suche nach „Funktion X" nicht schnell an der richtigen Stelle
|
|
7
|
+
* > landet, ist das ein Befund ueber den Code — nicht nur ueber die Suche.
|
|
8
|
+
*
|
|
9
|
+
* Deshalb sucht sich hier ein Symbol SELBST: einmal mit seinem Namen, einmal
|
|
10
|
+
* mit seiner Signatur. Was dabei herauskommt — Rang, Streuung der Treffer,
|
|
11
|
+
* Sprungzahl — ist die Messung. Dass die Score-Zerlegung des Abrufkerns dabei
|
|
12
|
+
* mitlaeuft, ist kein Zufall: ohne sie liesse sich „der richtige Treffer
|
|
13
|
+
* rankt niedrig" nicht von „es gibt gar keinen Treffer" unterscheiden, und das
|
|
14
|
+
* sind zwei VERSCHIEDENE Befunde ueber den Code.
|
|
15
|
+
*
|
|
16
|
+
* ALLES HIER IST HEURISTIK, und die Domain erzwingt das strukturell:
|
|
17
|
+
* `isHeuristic` ist auf `true` typisiert, die Confidence auf `heuristic`
|
|
18
|
+
* festgenagelt. Ein Findability-Wert kann deshalb nirgends die Stelle eines
|
|
19
|
+
* gemessenen Complexity-Werts einnehmen.
|
|
20
|
+
*/
|
|
21
|
+
import type { Clock, FindabilityDiagnosisBasisV1, FindabilityDiagnosisV1, FindabilityDispersionV1, FindabilityHopsV1, FindabilityOutcomeV1, FindabilityRetrievalUnavailableReason, FindabilityUnavailableV1, PortCallOptions, SearchResultSetV1, SkipLedgerEntryV1 } from "@untangle-code/domain";
|
|
22
|
+
import type { SearchPort } from "./port.js";
|
|
23
|
+
/** Das Symbol, dessen Auffindbarkeit gemessen wird. */
|
|
24
|
+
export interface FindabilitySubject {
|
|
25
|
+
workspaceId: string;
|
|
26
|
+
repoId: string;
|
|
27
|
+
refId: string;
|
|
28
|
+
symbolId: string;
|
|
29
|
+
symbolName: string;
|
|
30
|
+
symbolFqn: string;
|
|
31
|
+
/** „/"-normalisierter, repo-relativer Pfad. */
|
|
32
|
+
filePath: string;
|
|
33
|
+
signature?: string;
|
|
34
|
+
}
|
|
35
|
+
/** Liefert die Sprungzahl vom Rang-1-Treffer zum Zielsymbol (Symbolgraph). */
|
|
36
|
+
export type HopsLookup = (input: {
|
|
37
|
+
fromSymbolId: string;
|
|
38
|
+
toSymbolId: string;
|
|
39
|
+
}) => FindabilityHopsV1 | undefined;
|
|
40
|
+
export interface FindabilityOptions {
|
|
41
|
+
/** Wie viele Treffer eine Sonde anfordert; Default 10. */
|
|
42
|
+
probeLimit?: number;
|
|
43
|
+
hops?: HopsLookup;
|
|
44
|
+
generationId: string;
|
|
45
|
+
/**
|
|
46
|
+
* Optionale Vorpruefung: ist das Symbol ueberhaupt indexiert? Fehlt sie,
|
|
47
|
+
* wird nicht geraten — dann bleibt nur, was die Suche selbst meldet.
|
|
48
|
+
* Antwortet sie `false`, entsteht ein Zustandsvermerk statt einer Messung:
|
|
49
|
+
* ein nicht indexiertes Symbol findet sich nicht, und das sagt nichts ueber
|
|
50
|
+
* seinen Code (vision.md §1d).
|
|
51
|
+
*/
|
|
52
|
+
isSymbolIndexed?: (symbolId: string) => boolean;
|
|
53
|
+
}
|
|
54
|
+
/**
|
|
55
|
+
* Schwellen der Diagnose. Sie sind Politik, keine Naturkonstanten — deshalb
|
|
56
|
+
* stehen sie hier benannt und werden in jedem Beleg (`threshold`) mitgeliefert,
|
|
57
|
+
* damit ein Leser die Aussage nachrechnen kann.
|
|
58
|
+
*/
|
|
59
|
+
export declare const FINDABILITY_THRESHOLDS: {
|
|
60
|
+
/** Ab diesem Rang gilt der eigene Treffer als „rankt niedrig". */
|
|
61
|
+
readonly weakRank: 3;
|
|
62
|
+
/** Ab dieser Streuung gilt die Verantwortlichkeit als zerfasert. */
|
|
63
|
+
readonly scatteredDispersion: 0.6;
|
|
64
|
+
/** Ab dieser Sprungzahl gilt der Weg als zu verflochten. */
|
|
65
|
+
readonly entangledHops: 2;
|
|
66
|
+
};
|
|
67
|
+
/** Benannte Formel hinter `FindabilityDispersionV1.dispersion`. */
|
|
68
|
+
export declare const DISPERSION_FORMULA = "(matchedFileCount - 1) / max(1, matchedHitCount - 1), clamped to [0, 1]";
|
|
69
|
+
/** Benannte Formel hinter `FindabilityV1.score`. */
|
|
70
|
+
export declare const FINDABILITY_SCORE_FORMULA = "0.5*rankScore(nameProbe) + 0.2*rankScore(signatureProbe) + 0.2*(1 - dispersion) + 0.1*hopScore, with rankScore(r) = 0 for no rank else 1/r, hopScore = 0.5 when hops are unknown else 1/(1+hops)";
|
|
71
|
+
/** Rangwert einer Sonde: Rang 1 → 1.0, Rang 2 → 0.5, kein Rang → 0. */
|
|
72
|
+
export declare function rankScore(rank: number | null): number;
|
|
73
|
+
/** Streuung ueber Dateien (siehe {@link DISPERSION_FORMULA}). */
|
|
74
|
+
export declare function computeDispersion(filePaths: readonly string[], ownFileHitCount: number): FindabilityDispersionV1;
|
|
75
|
+
/**
|
|
76
|
+
* Leitet die benannten Ursachen aus den Messwerten ab (vision.md §1d Tabelle).
|
|
77
|
+
*
|
|
78
|
+
* Nimmt bewusst KEINE losen Sonden entgegen, sondern nur einen
|
|
79
|
+
* {@link FindabilityDiagnosisBasisV1} — den Nachweis aus `packages/domain`,
|
|
80
|
+
* dass der Abruf tatsaechlich gelaufen ist. Ein Zustandsvermerk
|
|
81
|
+
* (`FindabilityUnavailableV1`) ist auf diesen Typ nicht zuweisbar, eine
|
|
82
|
+
* ausgefallene Sonde bekommt gar keinen Nachweis. Damit ist es im TYP
|
|
83
|
+
* unmoeglich, aus einem Werkzeugversagen eine Aussage ueber den Code zu
|
|
84
|
+
* machen — genau der Denkfehler, den vision.md §1d frueher offen liess.
|
|
85
|
+
*/
|
|
86
|
+
export declare function diagnose(subject: FindabilitySubject, basis: FindabilityDiagnosisBasisV1): FindabilityDiagnosisV1[];
|
|
87
|
+
/**
|
|
88
|
+
* Warncodes, mit denen der Abrufkern ein AUSGEFALLENES Suchziel meldet.
|
|
89
|
+
*
|
|
90
|
+
* Diese Liste ist noetig, weil `UntangleSearchEngine` ein ausgefallenes Ziel
|
|
91
|
+
* NICHT wirft, sondern nach spec.md §25.2 sichtbar degradiert: das Ergebnis
|
|
92
|
+
* kommt mit einer Gruppe weniger — im schlimmsten Fall ganz ohne Gruppe — und
|
|
93
|
+
* einer Warnung zurueck. Wer nur auf `hits.length` schaut, liest dann „kein
|
|
94
|
+
* Treffer", und genau daraus entstuende die falsche Aussage ueber den Code.
|
|
95
|
+
*/
|
|
96
|
+
export declare const FINDABILITY_RETRIEVAL_FAILURE_WARNING_CODES: readonly ["EMBEDDING_DIMENSION_MISMATCH", "EMBEDDING_UNAVAILABLE", "INDEX_INCOMPLETE", "INDEX_PROFILE_MISMATCH", "PROFILE_UNAVAILABLE", "QDRANT_SCHEMA_INCOMPATIBLE", "LANCEDB_UNAVAILABLE", "LANCEDB_SCHEMA_INCOMPATIBLE", "QDRANT_UNAVAILABLE", "SEARCH_BRANCH_UNAVAILABLE"];
|
|
97
|
+
/** Grund plus Begruendung fuer einen Zustandsvermerk. */
|
|
98
|
+
export interface FindabilityRetrievalFailureV1 {
|
|
99
|
+
reason: FindabilityRetrievalUnavailableReason;
|
|
100
|
+
detail: string;
|
|
101
|
+
}
|
|
102
|
+
/**
|
|
103
|
+
* Prueft ein Suchergebnis darauf, ob die Suche wirklich gelaufen ist.
|
|
104
|
+
*
|
|
105
|
+
* `undefined` heisst: sie lief. Alles andere ist ein Zustandsvermerk, kein
|
|
106
|
+
* Messwert. Eine Ergebnismenge ohne jede Profilgruppe zaehlt dabei als
|
|
107
|
+
* Ausfall — ohne Profil hat niemand gesucht, und „nichts gefunden" waere eine
|
|
108
|
+
* Behauptung ueber den Code, die auf keiner Beobachtung steht.
|
|
109
|
+
*
|
|
110
|
+
* DASSELBE GILT FUER EINE GRUPPE, DIE NICHT DURCHSUCHT WURDE (Befund B1 der
|
|
111
|
+
* Nachpruefung, Fall B). Liegt der Geltungsbereich der Sonde — Workspace,
|
|
112
|
+
* Repository, Ref des Symbols — vollstaendig ausserhalb der verdrahteten
|
|
113
|
+
* Ziele, liefert der Abrufkern trotzdem eine Gruppe: leer, mit
|
|
114
|
+
* `notSearchedReason` und einem Eintrag im Skip-Ledger. Wer nur `groups.length`
|
|
115
|
+
* zaehlt, sieht eine Gruppe und haelt die Sonde fuer gelaufen — und veroeffent-
|
|
116
|
+
* licht danach „no_match" und die Diagnose „undocumented" ueber ein Symbol,
|
|
117
|
+
* nach dem nie gesucht wurde. Deshalb zaehlen hier nur Gruppen, die
|
|
118
|
+
* TATSAECHLICH durchsucht wurden.
|
|
119
|
+
*/
|
|
120
|
+
export declare function detectRetrievalFailure(set: SearchResultSetV1): FindabilityRetrievalFailureV1 | undefined;
|
|
121
|
+
/**
|
|
122
|
+
* Uebersetzt einen Zustandsvermerk in einen Skip-Ledger-Eintrag (E4). Ein
|
|
123
|
+
* ausgefallener Abruf darf nicht nur im Datensatz stehen, sondern gehoert in
|
|
124
|
+
* dieselbe Liste wie jede andere Auslassung.
|
|
125
|
+
*/
|
|
126
|
+
export declare function findabilitySkipEntry(note: FindabilityUnavailableV1): SkipLedgerEntryV1;
|
|
127
|
+
/**
|
|
128
|
+
* Misst die Auffindbarkeit eines Symbols mit zwei Selbstsonden.
|
|
129
|
+
*
|
|
130
|
+
* Der Aufrufer stellt den Port; diese Funktion macht nichts anderes, als ihn
|
|
131
|
+
* zweimal zu fragen und das Ergebnis ehrlich zu verbuchen — insbesondere den
|
|
132
|
+
* Fall „nicht gefunden", der als Rang `null` MIT benanntem Grund im Datensatz
|
|
133
|
+
* steht und nicht als fehlender Wert verschwindet (E4).
|
|
134
|
+
*
|
|
135
|
+
* ZWEI ERGEBNISSE, NICHT EINS (vision.md §1d): lief die Suche, kommt eine
|
|
136
|
+
* `FindabilityV1`-MESSUNG zurueck. Lief sie nicht — Speicher nicht
|
|
137
|
+
* erreichbar, Profil fehlt, Symbol nicht indexiert —, kommt ein
|
|
138
|
+
* `FindabilityUnavailableV1`-ZUSTANDSVERMERK zurueck. Der traegt keinen Score
|
|
139
|
+
* und keine Diagnose, weil ein Werkzeugversagen kein Befund ueber den Code
|
|
140
|
+
* ist. Aufrufer MUESSEN die beiden Faelle unterscheiden; der Typ zwingt sie
|
|
141
|
+
* dazu.
|
|
142
|
+
*/
|
|
143
|
+
export declare function measureFindability(port: SearchPort, subject: FindabilitySubject, clock: Clock, options: FindabilityOptions, callOptions?: PortCallOptions): Promise<FindabilityOutcomeV1>;
|
|
144
|
+
//# sourceMappingURL=findability.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findability.d.ts","sourceRoot":"","sources":["../src/findability.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,OAAO,KAAK,EACV,KAAK,EACL,2BAA2B,EAC3B,sBAAsB,EACtB,uBAAuB,EAEvB,iBAAiB,EACjB,oBAAoB,EAIpB,qCAAqC,EACrC,wBAAwB,EAExB,eAAe,EACf,iBAAiB,EACjB,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAY/B,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,WAAW,CAAC;AAE5C,uDAAuD;AACvD,MAAM,WAAW,kBAAkB;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,CAAC;IACnB,SAAS,EAAE,MAAM,CAAC;IAClB,+CAA+C;IAC/C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,8EAA8E;AAC9E,MAAM,MAAM,UAAU,GAAG,CAAC,KAAK,EAAE;IAC/B,YAAY,EAAE,MAAM,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB,KAAK,iBAAiB,GAAG,SAAS,CAAC;AAEpC,MAAM,WAAW,kBAAkB;IACjC,0DAA0D;IAC1D,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,IAAI,CAAC,EAAE,UAAU,CAAC;IAClB,YAAY,EAAE,MAAM,CAAC;IACrB;;;;;;OAMG;IACH,eAAe,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC;CACjD;AAED;;;;GAIG;AACH,eAAO,MAAM,sBAAsB;IACjC,kEAAkE;;IAElE,oEAAoE;;IAEpE,4DAA4D;;CAEpD,CAAC;AAEX,mEAAmE;AACnE,eAAO,MAAM,kBAAkB,4EAC4C,CAAC;AAE5E,oDAAoD;AACpD,eAAO,MAAM,yBAAyB,qMAC8J,CAAC;AAErM,uEAAuE;AACvE,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CAErD;AA0ED,iEAAiE;AACjE,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,SAAS,MAAM,EAAE,EAC5B,eAAe,EAAE,MAAM,GACtB,uBAAuB,CAMzB;AAkBD;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CACtB,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,2BAA2B,GACjC,sBAAsB,EAAE,CA8E1B;AAMD;;;;;;;;GAQG;AACH,eAAO,MAAM,2CAA2C,gRAW9C,CAAC;AAEX,yDAAyD;AACzD,MAAM,WAAW,6BAA6B;IAC5C,MAAM,EAAE,qCAAqC,CAAC;IAC9C,MAAM,EAAE,MAAM,CAAC;CAChB;AAQD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,EAAE,iBAAiB,GACrB,6BAA6B,GAAG,SAAS,CAwB3C;AAQD;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,wBAAwB,GAAG,iBAAiB,CAYtF;AAED;;;;;;;;;;;;;;;GAeG;AACH,wBAAsB,kBAAkB,CACtC,IAAI,EAAE,UAAU,EAChB,OAAO,EAAE,kBAAkB,EAC3B,KAAK,EAAE,KAAK,EACZ,OAAO,EAAE,kBAAkB,EAC3B,WAAW,CAAC,EAAE,eAAe,GAC5B,OAAO,CAAC,oBAAoB,CAAC,CA8I/B"}
|
|
@@ -0,0 +1,393 @@
|
|
|
1
|
+
import { FINDABILITY_ALGORITHM_ID, RANKER_VERSION, buildFindabilityId, buildSkipLedgerEntry, isUntangleError, makeFindabilityUnavailable, openFindabilityDiagnosisBasis, sortByCodepoints, } from "@untangle-code/domain";
|
|
2
|
+
/**
|
|
3
|
+
* Schwellen der Diagnose. Sie sind Politik, keine Naturkonstanten — deshalb
|
|
4
|
+
* stehen sie hier benannt und werden in jedem Beleg (`threshold`) mitgeliefert,
|
|
5
|
+
* damit ein Leser die Aussage nachrechnen kann.
|
|
6
|
+
*/
|
|
7
|
+
export const FINDABILITY_THRESHOLDS = {
|
|
8
|
+
/** Ab diesem Rang gilt der eigene Treffer als „rankt niedrig". */
|
|
9
|
+
weakRank: 3,
|
|
10
|
+
/** Ab dieser Streuung gilt die Verantwortlichkeit als zerfasert. */
|
|
11
|
+
scatteredDispersion: 0.6,
|
|
12
|
+
/** Ab dieser Sprungzahl gilt der Weg als zu verflochten. */
|
|
13
|
+
entangledHops: 2,
|
|
14
|
+
};
|
|
15
|
+
/** Benannte Formel hinter `FindabilityDispersionV1.dispersion`. */
|
|
16
|
+
export const DISPERSION_FORMULA = "(matchedFileCount - 1) / max(1, matchedHitCount - 1), clamped to [0, 1]";
|
|
17
|
+
/** Benannte Formel hinter `FindabilityV1.score`. */
|
|
18
|
+
export const FINDABILITY_SCORE_FORMULA = "0.5*rankScore(nameProbe) + 0.2*rankScore(signatureProbe) + 0.2*(1 - dispersion) + 0.1*hopScore, with rankScore(r) = 0 for no rank else 1/r, hopScore = 0.5 when hops are unknown else 1/(1+hops)";
|
|
19
|
+
/** Rangwert einer Sonde: Rang 1 → 1.0, Rang 2 → 0.5, kein Rang → 0. */
|
|
20
|
+
export function rankScore(rank) {
|
|
21
|
+
return rank === null ? 0 : 1 / rank;
|
|
22
|
+
}
|
|
23
|
+
function heuristicConfidence(value, signals) {
|
|
24
|
+
return { value, basis: "heuristic", signals };
|
|
25
|
+
}
|
|
26
|
+
function evaluateProbe(kind, queryText, subject, set) {
|
|
27
|
+
// Alle Gruppen zusammen: eine Sonde fragt nach EINEM Symbol, und in welcher
|
|
28
|
+
// Profilgruppe es auftaucht, ist fuer die Auffindbarkeit unerheblich. Die
|
|
29
|
+
// Raenge bleiben gruppenintern korrekt, weil die Sonde den Rang des eigenen
|
|
30
|
+
// Treffers innerhalb SEINER Gruppe liest.
|
|
31
|
+
const hits = set.groups.flatMap((group) => group.hits);
|
|
32
|
+
const own = hits.find((hit) => hit.symbolId === subject.symbolId);
|
|
33
|
+
const topScore = hits[0]?.score.final;
|
|
34
|
+
const probe = {
|
|
35
|
+
kind,
|
|
36
|
+
queryText,
|
|
37
|
+
queryFingerprint: set.queryFingerprint,
|
|
38
|
+
rank: own === undefined ? null : own.rank,
|
|
39
|
+
...(own === undefined ? { rankMissingReason: rankMissingReasonFor(set, hits.length) } : {}),
|
|
40
|
+
hitCount: hits.length,
|
|
41
|
+
...(topScore === undefined ? {} : { topScore }),
|
|
42
|
+
...(own === undefined ? {} : { selfScore: own.score.final }),
|
|
43
|
+
};
|
|
44
|
+
return {
|
|
45
|
+
probe,
|
|
46
|
+
filePaths: hits.map((hit) => hit.filePath),
|
|
47
|
+
hitCount: hits.length,
|
|
48
|
+
ownFileHitCount: hits.filter((hit) => hit.filePath === subject.filePath).length,
|
|
49
|
+
};
|
|
50
|
+
}
|
|
51
|
+
/**
|
|
52
|
+
* Warum eine Sonde keinen Rang ergab — aus der ENTSCHEIDUNG, nie aus der
|
|
53
|
+
* Listenlaenge.
|
|
54
|
+
*
|
|
55
|
+
* Vorher stand hier `hits.length === 0 ? "no_match" : "outside_result_limit"`.
|
|
56
|
+
* Beide sind Behauptungen ueber den CODE. Eine Enthaltung ist aber eine
|
|
57
|
+
* Aussage ueber die KALIBRIERUNG: der Abruf lief, es gab Kandidaten, und die
|
|
58
|
+
* Policy hielt die Evidenz fuer unzureichend. Als `no_match` veroeffentlicht
|
|
59
|
+
* wurde daraus „dazu gibt es nichts" — und ein Symbol, das fuer seinen eigenen
|
|
60
|
+
* Namen auf Rang 1 stuende, galt als unauffindbar.
|
|
61
|
+
*/
|
|
62
|
+
function rankMissingReasonFor(set, hitCount) {
|
|
63
|
+
if (set.groups.some((group) => group.relevanceDecision?.status === "rejected")) {
|
|
64
|
+
return "relevance_policy_rejected";
|
|
65
|
+
}
|
|
66
|
+
// Kein Kandidat hat den Abruf ueberhaupt erreicht: dann ist „nichts
|
|
67
|
+
// gefunden" eine belegte Aussage und keine Vermutung.
|
|
68
|
+
if (set.groups.length > 0 &&
|
|
69
|
+
set.groups.every((group) => group.retrieval?.deduplicatedCandidateCount === 0)) {
|
|
70
|
+
return "no_match";
|
|
71
|
+
}
|
|
72
|
+
return hitCount === 0 ? "no_match" : "outside_result_limit";
|
|
73
|
+
}
|
|
74
|
+
/** Streuung ueber Dateien (siehe {@link DISPERSION_FORMULA}). */
|
|
75
|
+
export function computeDispersion(filePaths, ownFileHitCount) {
|
|
76
|
+
const matchedHitCount = filePaths.length;
|
|
77
|
+
const matchedFileCount = new Set(filePaths).size;
|
|
78
|
+
const raw = (matchedFileCount - 1) / Math.max(1, matchedHitCount - 1);
|
|
79
|
+
const dispersion = Math.min(1, Math.max(0, raw));
|
|
80
|
+
return { matchedFileCount, matchedHitCount, ownFileHitCount, dispersion };
|
|
81
|
+
}
|
|
82
|
+
function evidence(kind, observedValue, threshold, references, note) {
|
|
83
|
+
return {
|
|
84
|
+
kind,
|
|
85
|
+
observedValue,
|
|
86
|
+
threshold,
|
|
87
|
+
references,
|
|
88
|
+
...(note === undefined ? {} : { note }),
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Leitet die benannten Ursachen aus den Messwerten ab (vision.md §1d Tabelle).
|
|
93
|
+
*
|
|
94
|
+
* Nimmt bewusst KEINE losen Sonden entgegen, sondern nur einen
|
|
95
|
+
* {@link FindabilityDiagnosisBasisV1} — den Nachweis aus `packages/domain`,
|
|
96
|
+
* dass der Abruf tatsaechlich gelaufen ist. Ein Zustandsvermerk
|
|
97
|
+
* (`FindabilityUnavailableV1`) ist auf diesen Typ nicht zuweisbar, eine
|
|
98
|
+
* ausgefallene Sonde bekommt gar keinen Nachweis. Damit ist es im TYP
|
|
99
|
+
* unmoeglich, aus einem Werkzeugversagen eine Aussage ueber den Code zu
|
|
100
|
+
* machen — genau der Denkfehler, den vision.md §1d frueher offen liess.
|
|
101
|
+
*/
|
|
102
|
+
export function diagnose(subject, basis) {
|
|
103
|
+
const { nameProbe, dispersion, hops } = basis;
|
|
104
|
+
const diagnoses = [];
|
|
105
|
+
// Die Fallunterscheidung folgt der Tabelle aus vision.md §1d:
|
|
106
|
+
// „Gar kein passender Treffer" -> das Symbol taucht in seinen eigenen
|
|
107
|
+
// Suchergebnissen NICHT auf -> `undocumented`;
|
|
108
|
+
// „Der richtige Treffer rankt niedrig" -> es taucht auf, aber weit unten
|
|
109
|
+
// -> `weak-naming`.
|
|
110
|
+
// Wichtig: „kein Rang" heisst NICHT „keine Treffer". Der dichte Zweig
|
|
111
|
+
// liefert fast immer irgendetwas; entscheidend ist, ob das GESUCHTE Symbol
|
|
112
|
+
// darunter ist.
|
|
113
|
+
if (nameProbe.rank === null) {
|
|
114
|
+
diagnoses.push({
|
|
115
|
+
cause: "undocumented",
|
|
116
|
+
confidence: heuristicConfidence(nameProbe.hitCount === 0 ? 0.6 : 0.5, [
|
|
117
|
+
"self_not_in_own_name_results",
|
|
118
|
+
...(nameProbe.hitCount === 0 ? ["no_results_at_all"] : ["other_results_ranked_instead"]),
|
|
119
|
+
]),
|
|
120
|
+
evidence: [
|
|
121
|
+
evidence("hit_count", nameProbe.hitCount, 1, [subject.symbolFqn], "searching for the symbol's own name did not return the symbol itself"),
|
|
122
|
+
],
|
|
123
|
+
isHeuristic: true,
|
|
124
|
+
note: "the symbol's own name does not retrieve it; either the name carries no intent or nothing describes it",
|
|
125
|
+
});
|
|
126
|
+
}
|
|
127
|
+
else if (nameProbe.rank > FINDABILITY_THRESHOLDS.weakRank) {
|
|
128
|
+
diagnoses.push({
|
|
129
|
+
cause: "weak-naming",
|
|
130
|
+
confidence: heuristicConfidence(0.5, ["self_rank_below_threshold"]),
|
|
131
|
+
evidence: [
|
|
132
|
+
evidence("self_rank", nameProbe.rank, FINDABILITY_THRESHOLDS.weakRank, [subject.symbolFqn], "the symbol does not rank near the top for its own name"),
|
|
133
|
+
],
|
|
134
|
+
isHeuristic: true,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
if (dispersion.dispersion > FINDABILITY_THRESHOLDS.scatteredDispersion) {
|
|
138
|
+
diagnoses.push({
|
|
139
|
+
cause: "scattered-responsibility",
|
|
140
|
+
confidence: heuristicConfidence(0.5, ["high_file_dispersion"]),
|
|
141
|
+
evidence: [
|
|
142
|
+
evidence("matched_file_count", dispersion.matchedFileCount, FINDABILITY_THRESHOLDS.scatteredDispersion, [subject.filePath], `hits spread over ${dispersion.matchedFileCount} files (dispersion ${dispersion.dispersion.toFixed(3)})`),
|
|
143
|
+
],
|
|
144
|
+
isHeuristic: true,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
147
|
+
if (hops.hops !== null && hops.hops > FINDABILITY_THRESHOLDS.entangledHops) {
|
|
148
|
+
diagnoses.push({
|
|
149
|
+
cause: "high-entanglement",
|
|
150
|
+
confidence: heuristicConfidence(hops.pathUsesUncertainEdges ? 0.4 : 0.6, [
|
|
151
|
+
"hop_count_above_threshold",
|
|
152
|
+
...(hops.pathUsesUncertainEdges ? ["path_uses_uncertain_edges"] : []),
|
|
153
|
+
]),
|
|
154
|
+
evidence: [evidence("hop_count", hops.hops, FINDABILITY_THRESHOLDS.entangledHops, hops.path)],
|
|
155
|
+
isHeuristic: true,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
return diagnoses;
|
|
159
|
+
}
|
|
160
|
+
// ---------------------------------------------------------------------------
|
|
161
|
+
// Lief die Suche ueberhaupt? (vision.md §1d)
|
|
162
|
+
// ---------------------------------------------------------------------------
|
|
163
|
+
/**
|
|
164
|
+
* Warncodes, mit denen der Abrufkern ein AUSGEFALLENES Suchziel meldet.
|
|
165
|
+
*
|
|
166
|
+
* Diese Liste ist noetig, weil `UntangleSearchEngine` ein ausgefallenes Ziel
|
|
167
|
+
* NICHT wirft, sondern nach spec.md §25.2 sichtbar degradiert: das Ergebnis
|
|
168
|
+
* kommt mit einer Gruppe weniger — im schlimmsten Fall ganz ohne Gruppe — und
|
|
169
|
+
* einer Warnung zurueck. Wer nur auf `hits.length` schaut, liest dann „kein
|
|
170
|
+
* Treffer", und genau daraus entstuende die falsche Aussage ueber den Code.
|
|
171
|
+
*/
|
|
172
|
+
export const FINDABILITY_RETRIEVAL_FAILURE_WARNING_CODES = [
|
|
173
|
+
"EMBEDDING_DIMENSION_MISMATCH",
|
|
174
|
+
"EMBEDDING_UNAVAILABLE",
|
|
175
|
+
"INDEX_INCOMPLETE",
|
|
176
|
+
"INDEX_PROFILE_MISMATCH",
|
|
177
|
+
"PROFILE_UNAVAILABLE",
|
|
178
|
+
"QDRANT_SCHEMA_INCOMPATIBLE",
|
|
179
|
+
"LANCEDB_UNAVAILABLE",
|
|
180
|
+
"LANCEDB_SCHEMA_INCOMPATIBLE",
|
|
181
|
+
"QDRANT_UNAVAILABLE",
|
|
182
|
+
"SEARCH_BRANCH_UNAVAILABLE",
|
|
183
|
+
];
|
|
184
|
+
function reasonForCode(code) {
|
|
185
|
+
if (code === "INDEX_PROFILE_MISMATCH")
|
|
186
|
+
return "search_profile_missing";
|
|
187
|
+
if (code === "INDEX_INCOMPLETE")
|
|
188
|
+
return "symbol_not_indexed";
|
|
189
|
+
return "search_unavailable";
|
|
190
|
+
}
|
|
191
|
+
/**
|
|
192
|
+
* Prueft ein Suchergebnis darauf, ob die Suche wirklich gelaufen ist.
|
|
193
|
+
*
|
|
194
|
+
* `undefined` heisst: sie lief. Alles andere ist ein Zustandsvermerk, kein
|
|
195
|
+
* Messwert. Eine Ergebnismenge ohne jede Profilgruppe zaehlt dabei als
|
|
196
|
+
* Ausfall — ohne Profil hat niemand gesucht, und „nichts gefunden" waere eine
|
|
197
|
+
* Behauptung ueber den Code, die auf keiner Beobachtung steht.
|
|
198
|
+
*
|
|
199
|
+
* DASSELBE GILT FUER EINE GRUPPE, DIE NICHT DURCHSUCHT WURDE (Befund B1 der
|
|
200
|
+
* Nachpruefung, Fall B). Liegt der Geltungsbereich der Sonde — Workspace,
|
|
201
|
+
* Repository, Ref des Symbols — vollstaendig ausserhalb der verdrahteten
|
|
202
|
+
* Ziele, liefert der Abrufkern trotzdem eine Gruppe: leer, mit
|
|
203
|
+
* `notSearchedReason` und einem Eintrag im Skip-Ledger. Wer nur `groups.length`
|
|
204
|
+
* zaehlt, sieht eine Gruppe und haelt die Sonde fuer gelaufen — und veroeffent-
|
|
205
|
+
* licht danach „no_match" und die Diagnose „undocumented" ueber ein Symbol,
|
|
206
|
+
* nach dem nie gesucht wurde. Deshalb zaehlen hier nur Gruppen, die
|
|
207
|
+
* TATSAECHLICH durchsucht wurden.
|
|
208
|
+
*/
|
|
209
|
+
export function detectRetrievalFailure(set) {
|
|
210
|
+
const codes = new Set(FINDABILITY_RETRIEVAL_FAILURE_WARNING_CODES);
|
|
211
|
+
const failed = set.warnings.find((warning) => codes.has(warning.code));
|
|
212
|
+
if (failed !== undefined) {
|
|
213
|
+
return { reason: reasonForCode(failed.code), detail: `${failed.code}: ${failed.message}` };
|
|
214
|
+
}
|
|
215
|
+
if (set.groups.length === 0) {
|
|
216
|
+
return {
|
|
217
|
+
reason: "search_profile_missing",
|
|
218
|
+
detail: "the probe came back without a single profile group; no embedding profile answered, so nothing was actually searched",
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
const searched = set.groups.filter((group) => group.notSearchedReason === undefined);
|
|
222
|
+
if (searched.length === 0) {
|
|
223
|
+
const reasons = sortByCodepoints(set.groups.map((group) => group.notSearchedReason)).join("; ");
|
|
224
|
+
return {
|
|
225
|
+
reason: "probe_not_executed",
|
|
226
|
+
detail: `not one of the ${set.groups.length} profile group(s) was actually searched, so the probe observed nothing: ${reasons}`,
|
|
227
|
+
};
|
|
228
|
+
}
|
|
229
|
+
return undefined;
|
|
230
|
+
}
|
|
231
|
+
function failureForError(error) {
|
|
232
|
+
const message = error instanceof Error ? error.message : String(error);
|
|
233
|
+
const code = isUntangleError(error) ? error.code : "SEARCH_FAILED";
|
|
234
|
+
return { reason: reasonForCode(code), detail: `${code}: ${message}` };
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Uebersetzt einen Zustandsvermerk in einen Skip-Ledger-Eintrag (E4). Ein
|
|
238
|
+
* ausgefallener Abruf darf nicht nur im Datensatz stehen, sondern gehoert in
|
|
239
|
+
* dieselbe Liste wie jede andere Auslassung.
|
|
240
|
+
*/
|
|
241
|
+
export function findabilitySkipEntry(note) {
|
|
242
|
+
return buildSkipLedgerEntry({
|
|
243
|
+
stage: "findability",
|
|
244
|
+
subjectKind: "symbol",
|
|
245
|
+
subjectId: note.symbolId,
|
|
246
|
+
path: note.filePath,
|
|
247
|
+
repoId: note.repoId,
|
|
248
|
+
refId: note.refId,
|
|
249
|
+
reason: note.reason === "symbol_not_indexed" ? "missing_index_entry" : "provider_unavailable",
|
|
250
|
+
detail: `findability not measured for "${note.symbolFqn}" (${note.reason}): ${note.detail}`,
|
|
251
|
+
recoverable: true,
|
|
252
|
+
});
|
|
253
|
+
}
|
|
254
|
+
/**
|
|
255
|
+
* Misst die Auffindbarkeit eines Symbols mit zwei Selbstsonden.
|
|
256
|
+
*
|
|
257
|
+
* Der Aufrufer stellt den Port; diese Funktion macht nichts anderes, als ihn
|
|
258
|
+
* zweimal zu fragen und das Ergebnis ehrlich zu verbuchen — insbesondere den
|
|
259
|
+
* Fall „nicht gefunden", der als Rang `null` MIT benanntem Grund im Datensatz
|
|
260
|
+
* steht und nicht als fehlender Wert verschwindet (E4).
|
|
261
|
+
*
|
|
262
|
+
* ZWEI ERGEBNISSE, NICHT EINS (vision.md §1d): lief die Suche, kommt eine
|
|
263
|
+
* `FindabilityV1`-MESSUNG zurueck. Lief sie nicht — Speicher nicht
|
|
264
|
+
* erreichbar, Profil fehlt, Symbol nicht indexiert —, kommt ein
|
|
265
|
+
* `FindabilityUnavailableV1`-ZUSTANDSVERMERK zurueck. Der traegt keinen Score
|
|
266
|
+
* und keine Diagnose, weil ein Werkzeugversagen kein Befund ueber den Code
|
|
267
|
+
* ist. Aufrufer MUESSEN die beiden Faelle unterscheiden; der Typ zwingt sie
|
|
268
|
+
* dazu.
|
|
269
|
+
*/
|
|
270
|
+
export async function measureFindability(port, subject, clock, options, callOptions) {
|
|
271
|
+
const limit = options.probeLimit ?? 10;
|
|
272
|
+
const baseRequest = {
|
|
273
|
+
workspaceId: subject.workspaceId,
|
|
274
|
+
repositories: [subject.repoId],
|
|
275
|
+
refs: [subject.refId],
|
|
276
|
+
limit,
|
|
277
|
+
// Ausdruecklich gepinnt: eine veroeffentlichte Kennzahl darf nicht von
|
|
278
|
+
// einer ungepinnten Vorgabe abhaengen. Zoege der Default eines Tages nach
|
|
279
|
+
// `evidence`, bekaemen abgelehnte Sonden still einen Rang.
|
|
280
|
+
abstention: "strict",
|
|
281
|
+
};
|
|
282
|
+
const note = (failure, probeKinds) => makeFindabilityUnavailable({
|
|
283
|
+
workspaceId: subject.workspaceId,
|
|
284
|
+
repoId: subject.repoId,
|
|
285
|
+
refId: subject.refId,
|
|
286
|
+
symbolId: subject.symbolId,
|
|
287
|
+
symbolFqn: subject.symbolFqn,
|
|
288
|
+
filePath: subject.filePath,
|
|
289
|
+
reason: failure.reason,
|
|
290
|
+
detail: failure.detail,
|
|
291
|
+
probeKinds,
|
|
292
|
+
observedAt: clock.nowIso(),
|
|
293
|
+
generationId: options.generationId,
|
|
294
|
+
});
|
|
295
|
+
const bothProbes = ["self-name", "self-signature"];
|
|
296
|
+
if (options.isSymbolIndexed !== undefined && !options.isSymbolIndexed(subject.symbolId)) {
|
|
297
|
+
return note({
|
|
298
|
+
reason: "symbol_not_indexed",
|
|
299
|
+
detail: `symbol "${subject.symbolFqn}" is not in the index, so no probe could reach it`,
|
|
300
|
+
}, bothProbes);
|
|
301
|
+
}
|
|
302
|
+
let nameSet;
|
|
303
|
+
try {
|
|
304
|
+
nameSet = await port.search({ ...baseRequest, query: subject.symbolName }, callOptions);
|
|
305
|
+
}
|
|
306
|
+
catch (error) {
|
|
307
|
+
return note(failureForError(error), bothProbes);
|
|
308
|
+
}
|
|
309
|
+
const nameFailure = detectRetrievalFailure(nameSet);
|
|
310
|
+
if (nameFailure !== undefined)
|
|
311
|
+
return note(nameFailure, bothProbes);
|
|
312
|
+
const nameOutcome = evaluateProbe("self-name", subject.symbolName, subject, nameSet);
|
|
313
|
+
const signatureText = subject.signature ?? subject.symbolFqn;
|
|
314
|
+
let signatureSet;
|
|
315
|
+
try {
|
|
316
|
+
signatureSet = await port.search({ ...baseRequest, query: signatureText }, callOptions);
|
|
317
|
+
}
|
|
318
|
+
catch (error) {
|
|
319
|
+
return note(failureForError(error), ["self-signature"]);
|
|
320
|
+
}
|
|
321
|
+
const signatureFailure = detectRetrievalFailure(signatureSet);
|
|
322
|
+
if (signatureFailure !== undefined)
|
|
323
|
+
return note(signatureFailure, ["self-signature"]);
|
|
324
|
+
const signatureOutcome = evaluateProbe("self-signature", signatureText, subject, signatureSet);
|
|
325
|
+
const dispersion = computeDispersion([...nameOutcome.filePaths, ...signatureOutcome.filePaths], nameOutcome.ownFileHitCount + signatureOutcome.ownFileHitCount);
|
|
326
|
+
const topHit = nameSet.groups.flatMap((group) => group.hits)[0];
|
|
327
|
+
const hops = options.hops === undefined || topHit?.symbolId === undefined
|
|
328
|
+
? {
|
|
329
|
+
hops: null,
|
|
330
|
+
hopsMissingReason: options.hops === undefined
|
|
331
|
+
? "no_symbol_graph_lookup_wired"
|
|
332
|
+
: "top_hit_carries_no_symbol_id",
|
|
333
|
+
path: [],
|
|
334
|
+
pathUsesUncertainEdges: false,
|
|
335
|
+
}
|
|
336
|
+
: (options.hops({ fromSymbolId: topHit.symbolId, toSymbolId: subject.symbolId }) ?? {
|
|
337
|
+
hops: null,
|
|
338
|
+
hopsMissingReason: "no_path_in_symbol_graph",
|
|
339
|
+
path: [],
|
|
340
|
+
pathUsesUncertainEdges: false,
|
|
341
|
+
});
|
|
342
|
+
const hopScore = hops.hops === null ? 0.5 : 1 / (1 + hops.hops);
|
|
343
|
+
const score = 0.5 * rankScore(nameOutcome.probe.rank) +
|
|
344
|
+
0.2 * rankScore(signatureOutcome.probe.rank) +
|
|
345
|
+
0.2 * (1 - dispersion.dispersion) +
|
|
346
|
+
0.1 * hopScore;
|
|
347
|
+
const signals = [
|
|
348
|
+
"self_name_probe",
|
|
349
|
+
"self_signature_probe",
|
|
350
|
+
"file_dispersion",
|
|
351
|
+
hops.hops === null ? "hops_unknown" : "hop_count",
|
|
352
|
+
];
|
|
353
|
+
// Letzte Instanz vor der Diagnose: der Nachweis aus `packages/domain`. Er
|
|
354
|
+
// bleibt aus, sobald eine Sonde ein Werkzeugversagen meldet — dann gibt es
|
|
355
|
+
// schlicht nichts, woraus sich eine Diagnose bilden LIESSE.
|
|
356
|
+
const basis = openFindabilityDiagnosisBasis({
|
|
357
|
+
nameProbe: nameOutcome.probe,
|
|
358
|
+
signatureProbe: signatureOutcome.probe,
|
|
359
|
+
dispersion,
|
|
360
|
+
hops,
|
|
361
|
+
});
|
|
362
|
+
return {
|
|
363
|
+
schemaVersion: 1,
|
|
364
|
+
findabilityId: buildFindabilityId({
|
|
365
|
+
workspaceId: subject.workspaceId,
|
|
366
|
+
symbolId: subject.symbolId,
|
|
367
|
+
algorithm: FINDABILITY_ALGORITHM_ID,
|
|
368
|
+
rankerVersion: RANKER_VERSION,
|
|
369
|
+
}),
|
|
370
|
+
workspaceId: subject.workspaceId,
|
|
371
|
+
repoId: subject.repoId,
|
|
372
|
+
refId: subject.refId,
|
|
373
|
+
symbolId: subject.symbolId,
|
|
374
|
+
symbolFqn: subject.symbolFqn,
|
|
375
|
+
filePath: subject.filePath,
|
|
376
|
+
algorithm: FINDABILITY_ALGORITHM_ID,
|
|
377
|
+
rankerVersion: RANKER_VERSION,
|
|
378
|
+
score: Math.min(1, Math.max(0, score)),
|
|
379
|
+
isHeuristic: true,
|
|
380
|
+
nameProbe: nameOutcome.probe,
|
|
381
|
+
signatureProbe: signatureOutcome.probe,
|
|
382
|
+
dispersion,
|
|
383
|
+
dispersionFormula: DISPERSION_FORMULA,
|
|
384
|
+
hops,
|
|
385
|
+
// Die Gesamt-Confidence sinkt, wenn ein Bestandteil fehlt: eine Messung
|
|
386
|
+
// ohne Sprungzahl ist weniger belastbar als eine mit.
|
|
387
|
+
confidence: heuristicConfidence(hops.hops === null ? 0.5 : 0.7, signals),
|
|
388
|
+
diagnoses: basis === undefined ? [] : diagnose(subject, basis),
|
|
389
|
+
measuredAt: clock.nowIso(),
|
|
390
|
+
generationId: options.generationId,
|
|
391
|
+
};
|
|
392
|
+
}
|
|
393
|
+
//# sourceMappingURL=findability.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"findability.js","sourceRoot":"","sources":["../src/findability.ts"],"names":[],"mappings":"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"}
|
package/dist/format.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Ausgabeformate (Nutzerwunsch A4: „Text, JSON, JSONL").
|
|
3
|
+
*
|
|
4
|
+
* Drei Formate, drei Zwecke:
|
|
5
|
+
*
|
|
6
|
+
* - `text` — fuer Menschen im Terminal. Eine Zeile Kopf je Treffer, darunter
|
|
7
|
+
* die Score-Zerlegung in Klartext. Die Zerlegung ist hier KEIN Debug-Anhang,
|
|
8
|
+
* sondern der eigentliche Mehrwert: sie beantwortet „warum steht das oben?".
|
|
9
|
+
* - `json` — ein Dokument, vollstaendig, mit Ledger und Warnungen. Fuer
|
|
10
|
+
* Werkzeuge, die das Ganze wollen.
|
|
11
|
+
* - `jsonl` — eine Zeile je Treffer, streambar. Fuer Agents und Pipes.
|
|
12
|
+
* Die erste Zeile ist ein Kopfsatz mit Anfrage-Fingerabdruck, Warnungen und
|
|
13
|
+
* Ledger — sonst wuerde beim Streamen genau die Information verloren gehen,
|
|
14
|
+
* die E4 sichtbar machen soll.
|
|
15
|
+
*
|
|
16
|
+
* Alle drei sind deterministisch: gleiche Ergebnismenge, gleiche Bytes.
|
|
17
|
+
*/
|
|
18
|
+
import type { SearchGraphRelationsV1, SearchHitV1, SearchResultSetV1 } from "@untangle-code/domain";
|
|
19
|
+
import type { GrepResultSetV1, OutputFormat } from "./types.js";
|
|
20
|
+
/** Kompakte, aber vollstaendige Textdarstellung einer begrenzten Graphfacette. */
|
|
21
|
+
export declare function formatSearchGraphRelationsAsText(label: "context" | "linked", value: SearchGraphRelationsV1): string[];
|
|
22
|
+
/** Eine Trefferzeile plus Score-Zerlegung im Textformat. */
|
|
23
|
+
export declare function formatHitAsText(hit: SearchHitV1): string;
|
|
24
|
+
/** Formatiert eine ganze Ergebnismenge. */
|
|
25
|
+
export declare function formatSearchResultSet(set: SearchResultSetV1, format: OutputFormat): string;
|
|
26
|
+
/** Formatiert grep-Treffer. */
|
|
27
|
+
export declare function formatGrepResultSet(set: GrepResultSetV1, format: OutputFormat): string;
|
|
28
|
+
//# sourceMappingURL=format.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"format.d.ts","sourceRoot":"","sources":["../src/format.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AACH,OAAO,KAAK,EAEV,sBAAsB,EACtB,WAAW,EACX,iBAAiB,EAClB,MAAM,uBAAuB,CAAC;AAE/B,OAAO,KAAK,EAAE,eAAe,EAAE,YAAY,EAAE,MAAM,YAAY,CAAC;AAahE,kFAAkF;AAClF,wBAAgB,gCAAgC,CAC9C,KAAK,EAAE,SAAS,GAAG,QAAQ,EAC3B,KAAK,EAAE,sBAAsB,GAC5B,MAAM,EAAE,CAgBV;AAED,4DAA4D;AAC5D,wBAAgB,eAAe,CAAC,GAAG,EAAE,WAAW,GAAG,MAAM,CA0CxD;AAED,2CAA2C;AAC3C,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,iBAAiB,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CA0E1F;AAED,+BAA+B;AAC/B,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,eAAe,EAAE,MAAM,EAAE,YAAY,GAAG,MAAM,CA6CtF"}
|