@sigloch/contracts 11.0.0 → 12.0.0
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/dist/se/analysis-freshness-rules.d.ts +0 -27
- package/dist/se/analysis-freshness-rules.js +1 -77
- package/dist/se/chain-metrics.d.ts +116 -0
- package/dist/se/chain-metrics.js +311 -0
- package/dist/se/evaluate-all.d.ts +2 -3
- package/dist/se/evaluate-all.js +1 -3
- package/dist/se/grammar-snapshot.d.ts +4 -4
- package/dist/se/grammar-snapshot.js +4 -17
- package/dist/se/index.d.ts +2 -1
- package/dist/se/index.js +3 -1
- package/dist/se/metric-rules.d.ts +6 -5
- package/dist/se/metric-rules.js +7 -6
- package/dist/se/module-crossings.d.ts +10 -0
- package/dist/se/module-crossings.js +3 -1
- package/dist/se/ontology.d.ts +3 -6
- package/dist/se/ontology.js +4 -23
- package/dist/se/readiness.d.ts +4 -110
- package/dist/se/readiness.js +4 -171
- package/dist/se/rule-due.d.ts +5 -14
- package/dist/se/rule-due.js +7 -18
- package/dist/se/rule-help.d.ts +1 -1
- package/dist/se/rule-help.js +2 -16
- package/dist/se/rules.d.ts +5 -13
- package/dist/se/similarity.js +4 -10
- package/package.json +1 -1
package/dist/se/readiness.d.ts
CHANGED
|
@@ -1,47 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* Dimensions emerge from graph state — no state machine.
|
|
2
|
+
* Stufen, Marken und Arbeitsschritte der Steuerung, dazu der Vertrag des Steuerungsraums.
|
|
4
3
|
* CR-SM-395: the phase axis is no longer a table. Each rule carries its stage; the mark
|
|
5
4
|
* (SRR/PDR/CDR/TRR/Bau) is derived from it — see "Stufen und Marken" below.
|
|
5
|
+
* CR-SM-401: die Dimension ist entfallen (Entscheidung des Autors 2026-10-07: „Stufe statt
|
|
6
|
+
* Dimension, Befunde zaehlen statt Prozent"). Es gibt EINE Einteilung der Regeln, die Stufe; die
|
|
7
|
+
* Zahl der Befunde je Stufe liefert `countByStage` in @sigloch/graphcode-client.
|
|
6
8
|
*/
|
|
7
9
|
import { z } from 'zod/v4';
|
|
8
|
-
export declare const ReadinessDimension: z.ZodEnum<{
|
|
9
|
-
req: "req";
|
|
10
|
-
uc: "uc";
|
|
11
|
-
arch: "arch";
|
|
12
|
-
alloc: "alloc";
|
|
13
|
-
ver: "ver";
|
|
14
|
-
schema: "schema";
|
|
15
|
-
cr: "cr";
|
|
16
|
-
ms: "ms";
|
|
17
|
-
}>;
|
|
18
|
-
export type ReadinessDimensionType = z.infer<typeof ReadinessDimension>;
|
|
19
|
-
export declare const ReadinessScore: z.ZodObject<{
|
|
20
|
-
dimension: z.ZodEnum<{
|
|
21
|
-
req: "req";
|
|
22
|
-
uc: "uc";
|
|
23
|
-
arch: "arch";
|
|
24
|
-
alloc: "alloc";
|
|
25
|
-
ver: "ver";
|
|
26
|
-
schema: "schema";
|
|
27
|
-
cr: "cr";
|
|
28
|
-
ms: "ms";
|
|
29
|
-
}>;
|
|
30
|
-
score: z.ZodNullable<z.ZodNumber>;
|
|
31
|
-
violations: z.ZodNumber;
|
|
32
|
-
applicable: z.ZodNumber;
|
|
33
|
-
coreApplicable: z.ZodNumber;
|
|
34
|
-
}, z.core.$strip>;
|
|
35
|
-
export type ReadinessScoreType = z.infer<typeof ReadinessScore>;
|
|
36
|
-
/**
|
|
37
|
-
* CR-SM-237: `overallScore` ist weg. Es war das **ungewichtete** Mittel der acht
|
|
38
|
-
* Dimensions-Scores — `ms` (3 Regeln) zählte so viel wie `arch` (~20 Regeln über Hunderte
|
|
39
|
-
* Elemente), die Zahl bewegte sich also mit dem Größenverhältnis der Dimensionen und nicht mit
|
|
40
|
-
* dem Zustand des Modells. Gelesen hat sie ohnehin niemand: der einzige Zugriff in der Familie
|
|
41
|
-
* war eine Formprüfung (`'overallScore' in x`) im inzwischen gelöschten `weight-vector.ts`.
|
|
42
|
-
* Ein interpretierbarer Ersatz (`1 − Σviolations / Σapplicable`) kommt, wenn er einen
|
|
43
|
-
* Konsumenten hat — nicht auf Vorrat.
|
|
44
|
-
*/
|
|
45
10
|
/**
|
|
46
11
|
* CR-SM-337 (ITEM-2026-059) — der STEUERUNGSRAUM im Bericht, Stufe 1: der Vertrag.
|
|
47
12
|
*
|
|
@@ -87,71 +52,6 @@ export declare const SteerSpace: z.ZodObject<{
|
|
|
87
52
|
}, z.core.$strip>>;
|
|
88
53
|
}, z.core.$strip>;
|
|
89
54
|
export type SteerSpaceType = z.infer<typeof SteerSpace>;
|
|
90
|
-
export declare const ReadinessReport: z.ZodObject<{
|
|
91
|
-
scores: z.ZodArray<z.ZodObject<{
|
|
92
|
-
dimension: z.ZodEnum<{
|
|
93
|
-
req: "req";
|
|
94
|
-
uc: "uc";
|
|
95
|
-
arch: "arch";
|
|
96
|
-
alloc: "alloc";
|
|
97
|
-
ver: "ver";
|
|
98
|
-
schema: "schema";
|
|
99
|
-
cr: "cr";
|
|
100
|
-
ms: "ms";
|
|
101
|
-
}>;
|
|
102
|
-
score: z.ZodNullable<z.ZodNumber>;
|
|
103
|
-
violations: z.ZodNumber;
|
|
104
|
-
applicable: z.ZodNumber;
|
|
105
|
-
coreApplicable: z.ZodNumber;
|
|
106
|
-
}, z.core.$strip>>;
|
|
107
|
-
timestamp: z.ZodISODateTime;
|
|
108
|
-
steer: z.ZodOptional<z.ZodObject<{
|
|
109
|
-
worst: z.ZodNumber;
|
|
110
|
-
worstAt: z.ZodNullable<z.ZodObject<{
|
|
111
|
-
ruleId: z.ZodString;
|
|
112
|
-
elementId: z.ZodString;
|
|
113
|
-
}, z.core.$strip>>;
|
|
114
|
-
mean: z.ZodNumber;
|
|
115
|
-
score: z.ZodNumber;
|
|
116
|
-
measured: z.ZodNumber;
|
|
117
|
-
terms: z.ZodArray<z.ZodObject<{
|
|
118
|
-
ruleId: z.ZodString;
|
|
119
|
-
elementId: z.ZodString;
|
|
120
|
-
value: z.ZodNumber;
|
|
121
|
-
threshold: z.ZodNumber;
|
|
122
|
-
overshoot: z.ZodNumber;
|
|
123
|
-
}, z.core.$strip>>;
|
|
124
|
-
}, z.core.$strip>>;
|
|
125
|
-
}, z.core.$strip>;
|
|
126
|
-
export type ReadinessReportType = z.infer<typeof ReadinessReport>;
|
|
127
|
-
/**
|
|
128
|
-
* CR-SM-305 — welche Profile in die readiness-Zahlen eingehen, und warum `conformance` nicht.
|
|
129
|
-
*
|
|
130
|
-
* Der Nenner jeder Dimension ist `Σ (Elemente der Grundgesamtheit)` ueber die Regeln der
|
|
131
|
-
* Dimension (`readiness-compute.ts`). Eine Regel, die DEKLARIERT, aber nicht AUSGEWERTET wird,
|
|
132
|
-
* traegt damit zum Nenner bei und liefert null Verstoesse — der Score STEIGT, weil eine
|
|
133
|
-
* Pruefung nicht gelaufen ist. Dieselbe Fail-open-Klasse wie ND-01/02 vor CR-SM-286, nur an der
|
|
134
|
-
* Stelle, die am lautesten gelesen wird.
|
|
135
|
-
*
|
|
136
|
-
* Gemessen ueber vier Familien-Repos, was die sechs RC-Regeln in `arch`/`ver`/`schema`
|
|
137
|
-
* geschenkt haetten: graph-view-edit `schema` +5,0 Punkte (Nenner 24 → 40), graphify `arch`
|
|
138
|
-
* +2,1 und `ver` +1,8, alles Uebrige ≤ 0,2. Der Ausschlag sitzt genau dort, wo die Zahl am
|
|
139
|
-
* meisten wiegt — in der kleinen Dimension.
|
|
140
|
-
*
|
|
141
|
-
* Deshalb steht keine RC-ID in `RULE_TO_DIMENSION`. Das ist keine Luecke,
|
|
142
|
-
* sondern die Aussage „nicht ausgewertet, also weder Zaehler noch Nenner";
|
|
143
|
-
* `computeApplicable` ueberspringt eine Regel ohne Dimension bereits von selbst
|
|
144
|
-
* (`if (!dim) continue`). Sichtbar wird RC ueber die Ableitung `ALL_RULE_DEFS minus
|
|
145
|
-
* ausgewertet` beim Host: sechs Regeln, die als NICHT GEPRUEFT dastehen, solange kein Lauf
|
|
146
|
-
* `CodeFacts` mitbringt.
|
|
147
|
-
*/
|
|
148
|
-
export declare const READINESS_SCORED_PROFILES: readonly ["se", "coding"];
|
|
149
|
-
/**
|
|
150
|
-
* Rule → dimension mapping. Some rules belong to multiple dimensions;
|
|
151
|
-
* here we assign primary dimension per rule. R-01 appears in 'ver' (primary)
|
|
152
|
-
* since its core concern is test verification coverage.
|
|
153
|
-
*/
|
|
154
|
-
export declare const RULE_TO_DIMENSION: Record<string, ReadinessDimensionType>;
|
|
155
55
|
/** Die Menge je Stufe, Index = Stufe − 1. */
|
|
156
56
|
export declare const STAGE_SETS: readonly ["System", "Anwendungsfall", "Anforderung", "Wirkkette", "Funktion", "Datenfluss", "Modul", "Schema", "Test", "Plan", "Bindung", "Abgleich"];
|
|
157
57
|
/** 1–12, oder `'immer'` fuer die Regeln ueber alle Elemente (R-08, R-18, CR-R03). */
|
|
@@ -185,8 +85,6 @@ export declare function markOfStage(stage: RuleStage): MarkType | null;
|
|
|
185
85
|
*
|
|
186
86
|
* - Risiko-Anforderungen (FM-01..03), Auftraege und Meilensteine (CR-R01..03, MS-01..03): keine
|
|
187
87
|
* Elemente, kein Befund.
|
|
188
|
-
* - Variantenvergleich und Annahmen-Review (TR-01, IR-01): melden erst, wenn die Analyse
|
|
189
|
-
* gestempelt ist.
|
|
190
88
|
* - Betriebsarten (CL-01): einzeln geprueft — die Regel laeuft ueber ACTOR, die es im Kern gibt,
|
|
191
89
|
* meldet aber erst, wenn ein UC eine `operatingMode` traegt. Die setzt nur das Einsatzkonzept.
|
|
192
90
|
* - Bindung und Abgleich (Stufen 11 und 12): nicht faellig, bis der Bau eroeffnet ist (`isDue`).
|
|
@@ -206,9 +104,5 @@ export declare const TASK_OWNED_RULES: Readonly<Partial<Record<Exclude<RuleTask,
|
|
|
206
104
|
export declare const TASK_ENTRY: Readonly<Record<Exclude<RuleTask, 'kern'>, string | null>>;
|
|
207
105
|
/** Der Eigentuemer einer Regel — der Kern, wenn kein Task sie beansprucht. */
|
|
208
106
|
export declare function taskOf(ruleId: string): RuleTask;
|
|
209
|
-
/** The 8 RULE_TO_DIMENSION topic scores (req/uc/arch/alloc/ver/schema/cr/ms). */
|
|
210
|
-
export declare const DIMENSION_READINESS_NAME = "dimension_readiness";
|
|
211
107
|
/** The marks derived from the rule stage (SRR/PDR/CDR/TRR/Bau). */
|
|
212
108
|
export declare const PHASE_READINESS_NAME = "phase_readiness";
|
|
213
|
-
/** Best-of-N ranking KPI: candidate dimension_readiness minus baseline. */
|
|
214
|
-
export declare const DIMENSION_READINESS_DELTA_NAME = "dimension_readiness_delta";
|
package/dist/se/readiness.js
CHANGED
|
@@ -1,60 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
* Dimensions emerge from graph state — no state machine.
|
|
2
|
+
* Stufen, Marken und Arbeitsschritte der Steuerung, dazu der Vertrag des Steuerungsraums.
|
|
4
3
|
* CR-SM-395: the phase axis is no longer a table. Each rule carries its stage; the mark
|
|
5
4
|
* (SRR/PDR/CDR/TRR/Bau) is derived from it — see "Stufen und Marken" below.
|
|
5
|
+
* CR-SM-401: die Dimension ist entfallen (Entscheidung des Autors 2026-10-07: „Stufe statt
|
|
6
|
+
* Dimension, Befunde zaehlen statt Prozent"). Es gibt EINE Einteilung der Regeln, die Stufe; die
|
|
7
|
+
* Zahl der Befunde je Stufe liefert `countByStage` in @sigloch/graphcode-client.
|
|
6
8
|
*/
|
|
7
9
|
import { z } from 'zod/v4';
|
|
8
|
-
export const ReadinessDimension = z.enum([
|
|
9
|
-
'req', // Requirements quality (BQ-01..07, RD-01..03)
|
|
10
|
-
'uc', // UC completeness (UC-01..06, R-14, FC-01..04)
|
|
11
|
-
'arch', // Functional architecture (R-02, R-03, R-10, R-12)
|
|
12
|
-
'alloc', // Module allocation (R-04)
|
|
13
|
-
'ver', // Test coverage (R-01, R-05)
|
|
14
|
-
'schema', // Interface completeness (R-26 binding, SC-02 usage)
|
|
15
|
-
'cr', // CR traceability (CR-R01..R03)
|
|
16
|
-
'ms', // Milestone planning (MS-01..02)
|
|
17
|
-
]);
|
|
18
|
-
export const ReadinessScore = z.object({
|
|
19
|
-
dimension: ReadinessDimension,
|
|
20
|
-
/**
|
|
21
|
-
* `1 - (violations / applicable)` — oder **`null`**, wenn die Dimension nicht messbar ist:
|
|
22
|
-
* nichts wurde geprueft (`applicable === 0`, CR-SM-395 — vorher 0,0) oder die Kernmenge ist
|
|
23
|
-
* leer (`coreApplicable === 0`, CR-SM-270).
|
|
24
|
-
*
|
|
25
|
-
* `null` heisst nie 0 %, so wie schon bei `graph_metrics` (CR-GC-326): "a value that is not
|
|
26
|
-
* measurable is not zero percent". Der Anlass war die Gegenrichtung — ein Modell ohne einen
|
|
27
|
-
* einzigen Use Case meldete `uc: 0,997, ready: true`, weil 306 FUNC ueber eine einzige
|
|
28
|
-
* Fremdtyp-Regel (FC-03) den Nenner fuellten, waehrend die dreizehn Regeln, die wirklich Use
|
|
29
|
-
* Cases pruefen, nichts zu pruefen hatten und ihr SCHWEIGEN sich als Erfolg las. Der Score
|
|
30
|
-
* zeigte damit in die falsche Richtung: je mehr importierte FUNCs ein Repo ohne Wozu-Ebene
|
|
31
|
-
* hat, desto reifer sah seine uc-Readiness aus.
|
|
32
|
-
*/
|
|
33
|
-
score: z.number().min(0).max(1).nullable(),
|
|
34
|
-
violations: z.number().int(),
|
|
35
|
-
applicable: z.number().int(),
|
|
36
|
-
/**
|
|
37
|
-
* CR-SM-270: die Kernmenge der Dimension — die Elemente der Typen, die die MEHRHEIT ihrer
|
|
38
|
-
* Regeln prueft (uc → UC/FCHAIN/ACTOR, arch → FUNC/MOD). Ist sie 0, ist `score` `null`.
|
|
39
|
-
*
|
|
40
|
-
* Sie steht im Bericht, weil sonst niemand das `null` erklaeren kann: `applicable` allein
|
|
41
|
-
* unterscheidet "nichts zu pruefen" (0) nicht von "nur Fremdtypen" (307). Genau die
|
|
42
|
-
* Unterscheidung, an der der dokumentierte Ausweg aus CR-SM-237 gescheitert ist.
|
|
43
|
-
*/
|
|
44
|
-
coreApplicable: z.number().int(),
|
|
45
|
-
// CR-SM-310: kein `ready` mehr. Ob eine Dimension zu schwach ist, urteilt der Konsument mit
|
|
46
|
-
// SEINER Schwelle (graphcode: generate.ts, focusThreshold aus der Config). Die Messung traegt
|
|
47
|
-
// kein Urteil — vorher stand es zweimal: hier als `ready` und beim Konsumenten.
|
|
48
|
-
});
|
|
49
|
-
/**
|
|
50
|
-
* CR-SM-237: `overallScore` ist weg. Es war das **ungewichtete** Mittel der acht
|
|
51
|
-
* Dimensions-Scores — `ms` (3 Regeln) zählte so viel wie `arch` (~20 Regeln über Hunderte
|
|
52
|
-
* Elemente), die Zahl bewegte sich also mit dem Größenverhältnis der Dimensionen und nicht mit
|
|
53
|
-
* dem Zustand des Modells. Gelesen hat sie ohnehin niemand: der einzige Zugriff in der Familie
|
|
54
|
-
* war eine Formprüfung (`'overallScore' in x`) im inzwischen gelöschten `weight-vector.ts`.
|
|
55
|
-
* Ein interpretierbarer Ersatz (`1 − Σviolations / Σapplicable`) kommt, wenn er einen
|
|
56
|
-
* Konsumenten hat — nicht auf Vorrat.
|
|
57
|
-
*/
|
|
58
10
|
/**
|
|
59
11
|
* CR-SM-337 (ITEM-2026-059) — der STEUERUNGSRAUM im Bericht, Stufe 1: der Vertrag.
|
|
60
12
|
*
|
|
@@ -108,119 +60,6 @@ export const SteerSpace = z.object({
|
|
|
108
60
|
/** Die Terme je Element, aus denen `worst` und `mean` entstehen. */
|
|
109
61
|
terms: z.array(SteerTerm),
|
|
110
62
|
});
|
|
111
|
-
export const ReadinessReport = z.object({
|
|
112
|
-
scores: z.array(ReadinessScore),
|
|
113
|
-
timestamp: z.iso.datetime(),
|
|
114
|
-
/**
|
|
115
|
-
* CR-SM-337: OPTIONAL, damit ein aelterer Produzent gueltig bleibt — der Vertrag wandert vor
|
|
116
|
-
* dem Fueller (Stufe 2, graphcode CR-GC-537). Fehlt das Feld, heisst das "dieser Produzent
|
|
117
|
-
* kennt den Steuerungsraum noch nicht", und das ist etwas anderes als `measured: 0`.
|
|
118
|
-
*/
|
|
119
|
-
steer: SteerSpace.optional(),
|
|
120
|
-
});
|
|
121
|
-
/**
|
|
122
|
-
* CR-SM-305 — welche Profile in die readiness-Zahlen eingehen, und warum `conformance` nicht.
|
|
123
|
-
*
|
|
124
|
-
* Der Nenner jeder Dimension ist `Σ (Elemente der Grundgesamtheit)` ueber die Regeln der
|
|
125
|
-
* Dimension (`readiness-compute.ts`). Eine Regel, die DEKLARIERT, aber nicht AUSGEWERTET wird,
|
|
126
|
-
* traegt damit zum Nenner bei und liefert null Verstoesse — der Score STEIGT, weil eine
|
|
127
|
-
* Pruefung nicht gelaufen ist. Dieselbe Fail-open-Klasse wie ND-01/02 vor CR-SM-286, nur an der
|
|
128
|
-
* Stelle, die am lautesten gelesen wird.
|
|
129
|
-
*
|
|
130
|
-
* Gemessen ueber vier Familien-Repos, was die sechs RC-Regeln in `arch`/`ver`/`schema`
|
|
131
|
-
* geschenkt haetten: graph-view-edit `schema` +5,0 Punkte (Nenner 24 → 40), graphify `arch`
|
|
132
|
-
* +2,1 und `ver` +1,8, alles Uebrige ≤ 0,2. Der Ausschlag sitzt genau dort, wo die Zahl am
|
|
133
|
-
* meisten wiegt — in der kleinen Dimension.
|
|
134
|
-
*
|
|
135
|
-
* Deshalb steht keine RC-ID in `RULE_TO_DIMENSION`. Das ist keine Luecke,
|
|
136
|
-
* sondern die Aussage „nicht ausgewertet, also weder Zaehler noch Nenner";
|
|
137
|
-
* `computeApplicable` ueberspringt eine Regel ohne Dimension bereits von selbst
|
|
138
|
-
* (`if (!dim) continue`). Sichtbar wird RC ueber die Ableitung `ALL_RULE_DEFS minus
|
|
139
|
-
* ausgewertet` beim Host: sechs Regeln, die als NICHT GEPRUEFT dastehen, solange kein Lauf
|
|
140
|
-
* `CodeFacts` mitbringt.
|
|
141
|
-
*/
|
|
142
|
-
export const READINESS_SCORED_PROFILES = ['se', 'coding'];
|
|
143
|
-
/**
|
|
144
|
-
* Rule → dimension mapping. Some rules belong to multiple dimensions;
|
|
145
|
-
* here we assign primary dimension per rule. R-01 appears in 'ver' (primary)
|
|
146
|
-
* since its core concern is test verification coverage.
|
|
147
|
-
*/
|
|
148
|
-
export const RULE_TO_DIMENSION = {
|
|
149
|
-
// req
|
|
150
|
-
'BQ-01': 'req', 'BQ-02': 'req', 'BQ-04': 'req',
|
|
151
|
-
'BQ-06': 'req', 'BQ-07': 'req',
|
|
152
|
-
'RD-01': 'req', 'RD-02': 'req',
|
|
153
|
-
// RD-04 is decomposition *breadth* — an architecture concern, not a requirement one
|
|
154
|
-
'RD-04': 'arch',
|
|
155
|
-
// CR-SM-311: die Untergrenze derselben Breite — ebenfalls Architektur
|
|
156
|
-
'RD-05': 'arch',
|
|
157
|
-
// trace/realization/allocation completeness rules (CR-228 D: previously unmapped → advisory fall-through)
|
|
158
|
-
'R-18': 'arch', 'R-19': 'ver', 'R-20': 'arch', 'R-21': 'ver',
|
|
159
|
-
// CR-SM-231: R-29 (Testdatei-Exklusivitaet) gehoert zu 'ver' wie R-19 — beide bewerten die
|
|
160
|
-
// Evidenz-Bindung einer Abnahme, R-19 ihre Praesenz, R-29 ihre Eindeutigkeit.
|
|
161
|
-
'R-29': 'ver',
|
|
162
|
-
'R-22': 'alloc', 'R-23': 'alloc', 'R-26': 'schema', 'R-32': 'ver',
|
|
163
|
-
// CR-SM-395: die Existenz-Regel des Systems. R-33 prueft den Graphen (kein Gruppen-Score).
|
|
164
|
-
'R-33': 'uc',
|
|
165
|
-
// CR-GC-366: R-30 (Wirkketten-Bindung) und R-31 (io-Verdrahtung) bewerten beide, ob ein
|
|
166
|
-
// Funktionsblock ueberhaupt im Bauplan haengt — dieselbe Dimension wie R-20 (realRef).
|
|
167
|
-
// NICHT 'uc': R-14..R-17 fragen, ob ein Behaelter gefuellt ist;
|
|
168
|
-
// diese beiden fragen von der FUNC aus, ob sie angeschlossen ist.
|
|
169
|
-
'R-30': 'arch', 'R-31': 'arch',
|
|
170
|
-
// uc
|
|
171
|
-
'UC-01': 'uc', 'UC-02': 'uc', 'UC-03': 'uc', 'UC-04': 'uc',
|
|
172
|
-
'R-15': 'uc', 'R-16': 'uc', 'R-17': 'uc',
|
|
173
|
-
// FC-04 (CR-SM-226): FCHAIN actor-bounded (trigger+consumer) — same dimension as FC-01..03.
|
|
174
|
-
'FC-02': 'uc', 'FC-03': 'uc', 'FC-04': 'uc',
|
|
175
|
-
'FC-05': 'uc', // CR-SM-363: Zusammenhang der Kette — dieselbe Dimension wie FC-04
|
|
176
|
-
// arch
|
|
177
|
-
'R-02': 'arch', 'R-10': 'arch', 'R-12': 'arch',
|
|
178
|
-
// alloc
|
|
179
|
-
'R-04': 'alloc',
|
|
180
|
-
// ver
|
|
181
|
-
'R-01': 'ver', 'R-05': 'ver',
|
|
182
|
-
// schema
|
|
183
|
-
'SC-02': 'schema', // SC-01/SC-03 deleted (BOK-CR-026) — R-26 is the binding rule
|
|
184
|
-
// SC-04 entfiel mit CR-SM-271: FLOW ohne SCHEMA ist jetzt Grammatik (R-18-Bein, error)
|
|
185
|
-
// und zaehlt damit unter R-18/'arch' statt als eigene 'schema'-Zeile.
|
|
186
|
-
// structural rules without primary dimension → assigned by closest concern
|
|
187
|
-
'R-08': 'arch',
|
|
188
|
-
// near-duplicate detection
|
|
189
|
-
'ND-01': 'arch', 'ND-02': 'schema',
|
|
190
|
-
// architecture metrics
|
|
191
|
-
// MT-03 is no longer here: it became a measurement (`allocationCohesion`), not a
|
|
192
|
-
// rule (CR-SM-223) — a per-module advisory would depress this score permanently.
|
|
193
|
-
'MT-01': 'alloc', 'MT-02': 'alloc',
|
|
194
|
-
// CR-SM-327: MT-04 misst die FUNC-Whitebox, nicht das Modul — Grundgesamtheit FUNC,
|
|
195
|
-
// also `arch` (Kern FUNC). In `alloc` waere sie eine Fremdtyp-Regel und wuerde deren
|
|
196
|
-
// Nenner um jede FUNC des Graphen aufblaehen (Klasse CR-SM-235/270, gemessen im CR).
|
|
197
|
-
'MT-04': 'arch',
|
|
198
|
-
// CR traceability
|
|
199
|
-
'CR-R01': 'cr', 'CR-R02': 'cr', 'CR-R03': 'cr', // architecture optimization
|
|
200
|
-
// CR-SM-283: BW-02 (Whitebox-Randbreite) ersetzt AO-D03 an dieser Stelle — dieselbe
|
|
201
|
-
// Dimension, denn beide fragen nach der Struktur des Funktionsschnitts, nicht nach Evidenz.
|
|
202
|
-
'BW-02': 'arch',
|
|
203
|
-
// allocation rules (CR-191)
|
|
204
|
-
'CR-01': 'arch', // milestone planning
|
|
205
|
-
'MS-01': 'ms', 'MS-02': 'ms', 'MS-03': 'ms',
|
|
206
|
-
// FMEA / risk
|
|
207
|
-
'FM-01': 'req', 'FM-02': 'req', 'FM-03': 'ver',
|
|
208
|
-
// CR-SM-227: analysis-artifact freshness presence — closest topical fit per artifact.
|
|
209
|
-
'AF-01': 'req', 'AF-03': 'req', // ConOps/Assumption-Review: requirements-adjacent judgment work
|
|
210
|
-
'IR-01': 'req', // CR-SM-355/397: die Anforderungen des Annahmen-Reviews existieren — Task-Ausgang von irr
|
|
211
|
-
'AF-02': 'arch', // Trade Study: architecture decision record
|
|
212
|
-
'TR-01': 'arch', // CR-SM-355: Trade-Entscheidung als CR — Task-Ausgang von trade
|
|
213
|
-
'AF-04': 'ver', // FMEA: risk/verification, same bucket as FM-03
|
|
214
|
-
'AF-05': 'ms', // Implementation Plan: milestone/planning
|
|
215
|
-
// NFR budget
|
|
216
|
-
'NFR-01': 'arch',
|
|
217
|
-
// cross-module IO (CR-192)
|
|
218
|
-
'IO-01': 'arch',
|
|
219
|
-
'IO-02': 'arch', // CR-SM-307: Flusstopologie, dieselbe Dimension wie R-10/IO-01.
|
|
220
|
-
// view rules (CR-184)
|
|
221
|
-
'VR-01': 'ver',
|
|
222
|
-
'CL-01': 'uc',
|
|
223
|
-
};
|
|
224
63
|
// ---------------------------------------------------------------------------
|
|
225
64
|
// Stufen und Marken (CR-SM-395) — die Reihenfolge der Mengen.
|
|
226
65
|
//
|
|
@@ -257,8 +96,6 @@ export function markOfStage(stage) {
|
|
|
257
96
|
*
|
|
258
97
|
* - Risiko-Anforderungen (FM-01..03), Auftraege und Meilensteine (CR-R01..03, MS-01..03): keine
|
|
259
98
|
* Elemente, kein Befund.
|
|
260
|
-
* - Variantenvergleich und Annahmen-Review (TR-01, IR-01): melden erst, wenn die Analyse
|
|
261
|
-
* gestempelt ist.
|
|
262
99
|
* - Betriebsarten (CL-01): einzeln geprueft — die Regel laeuft ueber ACTOR, die es im Kern gibt,
|
|
263
100
|
* meldet aber erst, wenn ein UC eine `operatingMode` traegt. Die setzt nur das Einsatzkonzept.
|
|
264
101
|
* - Bindung und Abgleich (Stufen 11 und 12): nicht faellig, bis der Bau eroeffnet ist (`isDue`).
|
|
@@ -294,9 +131,5 @@ export function taskOf(ruleId) {
|
|
|
294
131
|
// Sprachregelung (CR-SM-226) — naming SSOT so graphcode/graph-view-edit/
|
|
295
132
|
// article render the same terms instead of re-inventing string literals.
|
|
296
133
|
// ---------------------------------------------------------------------------
|
|
297
|
-
/** The 8 RULE_TO_DIMENSION topic scores (req/uc/arch/alloc/ver/schema/cr/ms). */
|
|
298
|
-
export const DIMENSION_READINESS_NAME = 'dimension_readiness';
|
|
299
134
|
/** The marks derived from the rule stage (SRR/PDR/CDR/TRR/Bau). */
|
|
300
135
|
export const PHASE_READINESS_NAME = 'phase_readiness';
|
|
301
|
-
/** Best-of-N ranking KPI: candidate dimension_readiness minus baseline. */
|
|
302
|
-
export const DIMENSION_READINESS_DELTA_NAME = 'dimension_readiness_delta';
|
package/dist/se/rule-due.d.ts
CHANGED
|
@@ -2,21 +2,12 @@ import type { OntologyGraph } from './ontology.js';
|
|
|
2
2
|
import type { RuleStage } from './readiness.js';
|
|
3
3
|
import type { RuleViolation } from './rules.js';
|
|
4
4
|
/**
|
|
5
|
-
* Gibt es einen offenen
|
|
6
|
-
* nicht auf die Elemente zeigen.
|
|
5
|
+
* Gibt es einen offenen Auftrag — einen CR mit `status: open`? Er muss nicht auf die Elemente zeigen.
|
|
7
6
|
*
|
|
8
|
-
* CR-SM-
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
* Anforderungen mit Test (CR-SM-397); Bauauftraege entstehen nur im Bauplan.
|
|
13
|
-
*
|
|
14
|
-
* Das Merkmal ist die Kante, die den CR zur Entscheidung macht: eine ausgehende
|
|
15
|
-
* `relation [label: decides]` (SP-1; TR-01 verlangt sie an jedem CR eines Variantenvergleichs).
|
|
16
|
-
* Kein neues Attribut. Nicht `architectureOnly`: das traegt heute kein offener CR, nur die
|
|
17
|
-
* verworfenen Optionen. Nicht „Umfang auf FUNC/MOD/SCHEMA": ein Entscheidungs-CR zeigt daneben
|
|
18
|
-
* mit gewoehnlichen Kanten auf das, was er betrifft, und ein Bauauftrag fuer eine Anforderung am
|
|
19
|
-
* Modul traegt seine Kante an der REQ (CR-SM-343).
|
|
7
|
+
* CR-SM-400 (Entscheidung des Autors 2026-10-07): ein offener CR IST ein Bauauftrag. Eine
|
|
8
|
+
* Entscheidung — das Ergebnis einer Analyse oder Optimierung — ist ein ERLEDIGTER Auftrag und
|
|
9
|
+
* eroeffnet deshalb keinen Bau. Der Filter auf `relation [label: decides]` (CR-SM-396) ist ohne
|
|
10
|
+
* Ersatz entfallen.
|
|
20
11
|
*/
|
|
21
12
|
export declare function hasOpenOrder(graph: OntologyGraph): boolean;
|
|
22
13
|
/** Ist die Regel an diesem Graphen faellig — ist ihre Menge nicht leer? */
|
package/dist/se/rule-due.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* leer ist. Fuer die Stufen 1 bis 10 ist die Menge die `domain` der Regel — eine Regel ueber eine
|
|
6
6
|
* leere Menge schweigt von selbst, dort ist nichts zu bauen. Fuer die Stufen 11 (Bindung) und 12
|
|
7
7
|
* (Abgleich Modell gegen Code) ist die Menge der BAU: er ist eroeffnet, sobald es einen offenen
|
|
8
|
-
*
|
|
8
|
+
* AUFTRAG gibt (`hasOpenOrder` — eine Entscheidung ist ein erledigter Auftrag) oder irgendeine
|
|
9
9
|
* Bindung. Vorher ist die Regel NICHT AUSGEWERTET — nicht bestanden.
|
|
10
10
|
*
|
|
11
11
|
* Zwei Leser, eine Funktion:
|
|
@@ -23,26 +23,15 @@
|
|
|
23
23
|
import { readRealRef, readTestRefs } from './ontology.js';
|
|
24
24
|
import { toEvaluableGraph } from './flat-graph.js';
|
|
25
25
|
/**
|
|
26
|
-
* Gibt es einen offenen
|
|
27
|
-
* nicht auf die Elemente zeigen.
|
|
26
|
+
* Gibt es einen offenen Auftrag — einen CR mit `status: open`? Er muss nicht auf die Elemente zeigen.
|
|
28
27
|
*
|
|
29
|
-
* CR-SM-
|
|
30
|
-
*
|
|
31
|
-
*
|
|
32
|
-
*
|
|
33
|
-
* Anforderungen mit Test (CR-SM-397); Bauauftraege entstehen nur im Bauplan.
|
|
34
|
-
*
|
|
35
|
-
* Das Merkmal ist die Kante, die den CR zur Entscheidung macht: eine ausgehende
|
|
36
|
-
* `relation [label: decides]` (SP-1; TR-01 verlangt sie an jedem CR eines Variantenvergleichs).
|
|
37
|
-
* Kein neues Attribut. Nicht `architectureOnly`: das traegt heute kein offener CR, nur die
|
|
38
|
-
* verworfenen Optionen. Nicht „Umfang auf FUNC/MOD/SCHEMA": ein Entscheidungs-CR zeigt daneben
|
|
39
|
-
* mit gewoehnlichen Kanten auf das, was er betrifft, und ein Bauauftrag fuer eine Anforderung am
|
|
40
|
-
* Modul traegt seine Kante an der REQ (CR-SM-343).
|
|
28
|
+
* CR-SM-400 (Entscheidung des Autors 2026-10-07): ein offener CR IST ein Bauauftrag. Eine
|
|
29
|
+
* Entscheidung — das Ergebnis einer Analyse oder Optimierung — ist ein ERLEDIGTER Auftrag und
|
|
30
|
+
* eroeffnet deshalb keinen Bau. Der Filter auf `relation [label: decides]` (CR-SM-396) ist ohne
|
|
31
|
+
* Ersatz entfallen.
|
|
41
32
|
*/
|
|
42
33
|
export function hasOpenOrder(graph) {
|
|
43
|
-
|
|
44
|
-
const decisions = new Set(g.traces.filter((t) => t.type === 'relation' && t.label === 'decides').map((t) => t.source));
|
|
45
|
-
return g.elements.some((e) => e.type === 'CR' && e.attributes?.status === 'open' && !decisions.has(e.id));
|
|
34
|
+
return toEvaluableGraph(graph).elements.some((e) => e.type === 'CR' && e.attributes?.status === 'open');
|
|
46
35
|
}
|
|
47
36
|
const BUILD_OPEN = new WeakMap();
|
|
48
37
|
/**
|
package/dist/se/rule-help.d.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* ## Was hier NICHT steht
|
|
13
13
|
*
|
|
14
14
|
* - **Abgeleitetes** — Titel, Severity, Meldung und `fix_hint` stehen an der Regeldefinition
|
|
15
|
-
* (`ALL_RULE_DEFS`),
|
|
15
|
+
* (`ALL_RULE_DEFS`), ebenso Stufe und Marke. Kein Wort davon wird
|
|
16
16
|
* hier wiederholt; ein zweiter Speicher derselben Wahrheit laeuft auseinander.
|
|
17
17
|
* - **`fix_hint` gegen `plain`/`se`** — `fix_hint` ist die Anweisung an den AGENTEN („Add a
|
|
18
18
|
* `verify` trace"), `plain`/`se` die Erklaerung fuer den MENSCHEN („was ist hier eigentlich
|
package/dist/se/rule-help.js
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
* ## Was hier NICHT steht
|
|
13
13
|
*
|
|
14
14
|
* - **Abgeleitetes** — Titel, Severity, Meldung und `fix_hint` stehen an der Regeldefinition
|
|
15
|
-
* (`ALL_RULE_DEFS`),
|
|
15
|
+
* (`ALL_RULE_DEFS`), ebenso Stufe und Marke. Kein Wort davon wird
|
|
16
16
|
* hier wiederholt; ein zweiter Speicher derselben Wahrheit laeuft auseinander.
|
|
17
17
|
* - **`fix_hint` gegen `plain`/`se`** — `fix_hint` ist die Anweisung an den AGENTEN („Add a
|
|
18
18
|
* `verify` trace"), `plain`/`se` die Erklaerung fuer den MENSCHEN („was ist hier eigentlich
|
|
@@ -209,7 +209,7 @@ export const RULE_HELP = {
|
|
|
209
209
|
},
|
|
210
210
|
'ND-02': {
|
|
211
211
|
plain: "Two data contracts describe the same thing twice → merge them, or say what distinguishes them.",
|
|
212
|
-
se: "Near-duplicate `SCHEMA` above 0.85 similarity (name, description
|
|
212
|
+
se: "Near-duplicate `SCHEMA` above 0.85 similarity (name, description and legal trace partners). Partners are filtered through `isValidTrace`: a rule must not reach its verdict via an edge R-18 rejects (CR-SM-286).",
|
|
213
213
|
vorschlag: 'Führe die doppelten Datenformate {n} zusammen oder grenze sie ab.',
|
|
214
214
|
},
|
|
215
215
|
'NFR-01': {
|
|
@@ -435,18 +435,4 @@ export const RULE_HELP = {
|
|
|
435
435
|
plain: "A test exists but no result was ever recorded, so nobody knows if it passed → record the outcome.",
|
|
436
436
|
se: "`TEST` with no `testResult` attribute — assumed pending, never assumed green.",
|
|
437
437
|
},
|
|
438
|
-
// CR-SM-355: die Ausgaenge von Variantenvergleich und Annahmen-Review. Sie melden erst, wenn die
|
|
439
|
-
// Analyse gestempelt ist — vorher schweigen sie von selbst (CR-SM-395).
|
|
440
|
-
'TR-01': {
|
|
441
|
-
plain: "The trade study is stamped, but the decision it produced is not on record as a CR (or the CR it names is missing or carries no decides edge) → record the decision as a CR and list its id in the stamp.",
|
|
442
|
-
se: "Task outcome rule (CR-SM-355): `analysisFreshness.trade.crRefs` names existing CR elements, each carrying a `relation` edge labelled `decides` (the SP-1 decision record).",
|
|
443
|
-
prompt: "se-trade",
|
|
444
|
-
vorschlag: 'Halte die Entscheidung des Variantenvergleichs für {n} als Änderungsauftrag fest.',
|
|
445
|
-
},
|
|
446
|
-
'IR-01': {
|
|
447
|
-
plain: "The assumption review names a requirement that does not exist → fix the reference or add the requirement with its test; an empty list is fine when no assumption was load-bearing.",
|
|
448
|
-
se: "Task outcome rule (CR-SM-355, CR-SM-397): every id in `analysisFreshness.assumption-review.reqRefs` resolves to a `REQ` element; empty is a legitimate outcome (low-risk assumptions stay in the record). The verifying `TEST` is R-01's finding. An analysis leaves requirements, never a build order.",
|
|
449
|
-
prompt: "se-irr",
|
|
450
|
-
vorschlag: 'Lege die Anforderungen an, die das Annahmen-Review für {n} nennt.',
|
|
451
|
-
},
|
|
452
438
|
};
|
package/dist/se/rules.d.ts
CHANGED
|
@@ -322,14 +322,12 @@ export interface RuleDefinition {
|
|
|
322
322
|
*/
|
|
323
323
|
evaluate: (graph: OntologyGraph, policy: MetricPolicy) => RuleViolation[];
|
|
324
324
|
/**
|
|
325
|
-
* CR-SM-235: die Grundgesamtheit, ueber die die Regel feuert — der
|
|
326
|
-
*
|
|
327
|
-
* gehoert:** MS-03 („CR ohne Milestone") feuert je CR, nicht je MS.
|
|
325
|
+
* CR-SM-235: die Grundgesamtheit, ueber die die Regel feuert — die Menge, an der ihre
|
|
326
|
+
* Faelligkeit haengt (`isDue`). **Der Elementtyp, ueber den sie feuert, nicht das Thema, dem
|
|
327
|
+
* sie gehoert:** MS-03 („CR ohne Milestone") feuert je CR, nicht je MS.
|
|
328
328
|
*
|
|
329
|
-
* Pflichtfeld, damit ein neuer Regeleintrag ohne Grundgesamtheit den Build bricht.
|
|
330
|
-
*
|
|
331
|
-
* fehlten dort — sie erhoehten den Zaehler, nie den Nenner, und jede neue Regel senkte den
|
|
332
|
-
* Score automatisch, bis jemand die zweite Tabelle nachzog.
|
|
329
|
+
* Pflichtfeld, damit ein neuer Regeleintrag ohne Grundgesamtheit den Build bricht. (Bis
|
|
330
|
+
* CR-SM-401 war sie auch der Nenner eines Prozentwerts je Dimension; den gibt es nicht mehr.)
|
|
333
331
|
*
|
|
334
332
|
* Mehrere Typen, wo die Regel ueber mehrere feuert (RD-04: FUNC, MOD und SYS als Eltern
|
|
335
333
|
* einer Zerlegung). `['all']` = jedes Nicht-SESSION-Element (R-08/R-18 pruefen Traces).
|
|
@@ -339,12 +337,6 @@ export interface RuleDefinition {
|
|
|
339
337
|
* Analyse-Freshness-Stempel (AF-01..05). Sie tragen KEINE
|
|
340
338
|
* Grundgesamtheit bei, denn sie haben keine — der Stempel haengt zwar unter SYS, geprueft
|
|
341
339
|
* wird aber der Graph, nicht das Element.
|
|
342
|
-
*
|
|
343
|
-
* Warum das zaehlt: mit `['SYS']` deklariert waren sie eine Ein-Element-Gruppe mit fast
|
|
344
|
-
* sicherem Verstoss. Eine Dimension ohne eigene Elemente (z. B. `req` in einem Graphen ohne
|
|
345
|
-
* eine einzige REQ) las dadurch **0 %** statt „nichts zu messen" — und der Executor
|
|
346
|
-
* fokussierte sie. Ein Graph-Check verfeinert eine Dimension, die es gibt; er erschafft
|
|
347
|
-
* keine.
|
|
348
340
|
*/
|
|
349
341
|
domain: readonly string[];
|
|
350
342
|
}
|
package/dist/se/similarity.js
CHANGED
|
@@ -52,14 +52,6 @@ function firstWord(name) {
|
|
|
52
52
|
return text.toLowerCase().split(/[^\p{L}\p{N}]+/u).find(w => w.length > 0) ?? '';
|
|
53
53
|
}
|
|
54
54
|
const byId = (a, b) => (a.id < b.id ? -1 : a.id > b.id ? 1 : 0);
|
|
55
|
-
/** Feld-Menge eines SCHEMA: `attributes.fields` (Array), sonst Beschreibungs-Token. */
|
|
56
|
-
function schemaFields(el) {
|
|
57
|
-
const fields = el.attributes?.fields;
|
|
58
|
-
if (Array.isArray(fields) && fields.length > 0) {
|
|
59
|
-
return new Set(fields.map(f => String(typeof f === 'object' && f !== null ? (f.name ?? JSON.stringify(f)) : f).toLowerCase()));
|
|
60
|
-
}
|
|
61
|
-
return tokens(el.description);
|
|
62
|
-
}
|
|
63
55
|
const CACHE = new WeakMap();
|
|
64
56
|
function build(graph) {
|
|
65
57
|
// ND-01: 0.35*descr_jaccard + 0.25*verb_match + 0.25*io_topology + 0.15*req_overlap
|
|
@@ -77,14 +69,16 @@ function build(graph) {
|
|
|
77
69
|
+ 0.15 * jaccard(fReq[i], fReq[j]))),
|
|
78
70
|
};
|
|
79
71
|
// ND-02: 0.50*field_jaccard + 0.30*descr_jaccard + 0.20*usage_overlap
|
|
72
|
+
// CR-SM-399: die Feldmenge eines SCHEMA IST seine Beschreibung — das Attribut `fields` (nie
|
|
73
|
+
// deklariert, 0 Traeger) wird nicht mehr gelesen. Beide Terme bleiben getrennt stehen: zu 0.8
|
|
74
|
+
// zusammengezogen wiche der Wert in der letzten Stelle ab, und kein Score soll sich bewegen.
|
|
80
75
|
const schemas = graph.elements.filter(e => e.type === 'SCHEMA').sort(byId);
|
|
81
|
-
const sFields = schemas.map(schemaFields);
|
|
82
76
|
const sDescr = schemas.map(s => tokens(s.description));
|
|
83
77
|
const sUse = schemas.map(s => partners(graph, s.id, ['relation', 'io', 'compose']));
|
|
84
78
|
const schema = {
|
|
85
79
|
ids: schemas.map(s => s.id),
|
|
86
80
|
matrix: schemas.map((_, i) => schemas.map((_, j) => i === j ? 1
|
|
87
|
-
: 0.5 * jaccard(
|
|
81
|
+
: 0.5 * jaccard(sDescr[i], sDescr[j])
|
|
88
82
|
+ 0.3 * jaccard(sDescr[i], sDescr[j])
|
|
89
83
|
+ 0.2 * jaccard(sUse[i], sUse[j]))),
|
|
90
84
|
};
|