@sigloch/contracts 10.14.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 +37 -30
- package/dist/se/analysis-freshness-rules.js +41 -81
- package/dist/se/ao-rules.js +3 -3
- package/dist/se/chain-metrics.d.ts +116 -0
- package/dist/se/chain-metrics.js +311 -0
- package/dist/se/conformance-rules.d.ts +4 -0
- package/dist/se/conformance-rules.js +37 -32
- package/dist/se/cr-quality-rules.js +4 -76
- package/dist/se/evaluate-all.d.ts +7 -3
- package/dist/se/evaluate-all.js +3 -4
- package/dist/se/fchain-quality-rules.js +4 -4
- package/dist/se/fmea-rules.js +4 -4
- package/dist/se/format-e-parser.js +1 -1
- package/dist/se/grammar-snapshot.d.ts +6 -6
- package/dist/se/grammar-snapshot.js +90 -103
- package/dist/se/index.d.ts +4 -2
- package/dist/se/index.js +6 -2
- package/dist/se/metric-rules.d.ts +9 -5
- package/dist/se/metric-rules.js +10 -9
- package/dist/se/module-crossings.d.ts +10 -0
- package/dist/se/module-crossings.js +3 -1
- package/dist/se/near-duplicate-rules.d.ts +2 -0
- package/dist/se/near-duplicate-rules.js +2 -2
- package/dist/se/ontology.d.ts +23 -7
- package/dist/se/ontology.js +29 -26
- package/dist/se/quality-rules.js +5 -5
- package/dist/se/readiness.d.ts +41 -149
- package/dist/se/readiness.js +50 -280
- package/dist/se/rule-due.d.ts +26 -0
- package/dist/se/rule-due.js +72 -0
- package/dist/se/rule-help.d.ts +3 -1
- package/dist/se/rule-help.js +47 -31
- package/dist/se/rules.d.ts +23 -13
- package/dist/se/rules.js +112 -72
- package/dist/se/schema-quality-rules.d.ts +1 -1
- package/dist/se/schema-quality-rules.js +1 -1
- package/dist/se/similarity.js +4 -10
- package/dist/se/uc-quality-rules.js +4 -4
- package/dist/se/view-rules.js +6 -4
- package/package.json +1 -1
package/dist/se/readiness.d.ts
CHANGED
|
@@ -1,50 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* guarantee as `RULE_TO_DIMENSION`, exported so no consumer reinvents it.
|
|
2
|
+
* Stufen, Marken und Arbeitsschritte der Steuerung, dazu der Vertrag des Steuerungsraums.
|
|
3
|
+
* CR-SM-395: the phase axis is no longer a table. Each rule carries its stage; the mark
|
|
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.
|
|
9
8
|
*/
|
|
10
9
|
import { z } from 'zod/v4';
|
|
11
|
-
export declare const ReadinessDimension: z.ZodEnum<{
|
|
12
|
-
schema: "schema";
|
|
13
|
-
req: "req";
|
|
14
|
-
uc: "uc";
|
|
15
|
-
arch: "arch";
|
|
16
|
-
alloc: "alloc";
|
|
17
|
-
ver: "ver";
|
|
18
|
-
cr: "cr";
|
|
19
|
-
ms: "ms";
|
|
20
|
-
}>;
|
|
21
|
-
export type ReadinessDimensionType = z.infer<typeof ReadinessDimension>;
|
|
22
|
-
export declare const ReadinessScore: z.ZodObject<{
|
|
23
|
-
dimension: z.ZodEnum<{
|
|
24
|
-
schema: "schema";
|
|
25
|
-
req: "req";
|
|
26
|
-
uc: "uc";
|
|
27
|
-
arch: "arch";
|
|
28
|
-
alloc: "alloc";
|
|
29
|
-
ver: "ver";
|
|
30
|
-
cr: "cr";
|
|
31
|
-
ms: "ms";
|
|
32
|
-
}>;
|
|
33
|
-
score: z.ZodNullable<z.ZodNumber>;
|
|
34
|
-
violations: z.ZodNumber;
|
|
35
|
-
applicable: z.ZodNumber;
|
|
36
|
-
coreApplicable: z.ZodNumber;
|
|
37
|
-
}, z.core.$strip>;
|
|
38
|
-
export type ReadinessScoreType = z.infer<typeof ReadinessScore>;
|
|
39
|
-
/**
|
|
40
|
-
* CR-SM-237: `overallScore` ist weg. Es war das **ungewichtete** Mittel der acht
|
|
41
|
-
* Dimensions-Scores — `ms` (3 Regeln) zählte so viel wie `arch` (~20 Regeln über Hunderte
|
|
42
|
-
* Elemente), die Zahl bewegte sich also mit dem Größenverhältnis der Dimensionen und nicht mit
|
|
43
|
-
* dem Zustand des Modells. Gelesen hat sie ohnehin niemand: der einzige Zugriff in der Familie
|
|
44
|
-
* war eine Formprüfung (`'overallScore' in x`) im inzwischen gelöschten `weight-vector.ts`.
|
|
45
|
-
* Ein interpretierbarer Ersatz (`1 − Σviolations / Σapplicable`) kommt, wenn er einen
|
|
46
|
-
* Konsumenten hat — nicht auf Vorrat.
|
|
47
|
-
*/
|
|
48
10
|
/**
|
|
49
11
|
* CR-SM-337 (ITEM-2026-059) — der STEUERUNGSRAUM im Bericht, Stufe 1: der Vertrag.
|
|
50
12
|
*
|
|
@@ -90,127 +52,57 @@ export declare const SteerSpace: z.ZodObject<{
|
|
|
90
52
|
}, z.core.$strip>>;
|
|
91
53
|
}, z.core.$strip>;
|
|
92
54
|
export type SteerSpaceType = z.infer<typeof SteerSpace>;
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
req: "req";
|
|
98
|
-
uc: "uc";
|
|
99
|
-
arch: "arch";
|
|
100
|
-
alloc: "alloc";
|
|
101
|
-
ver: "ver";
|
|
102
|
-
cr: "cr";
|
|
103
|
-
ms: "ms";
|
|
104
|
-
}>;
|
|
105
|
-
score: z.ZodNullable<z.ZodNumber>;
|
|
106
|
-
violations: z.ZodNumber;
|
|
107
|
-
applicable: z.ZodNumber;
|
|
108
|
-
coreApplicable: z.ZodNumber;
|
|
109
|
-
}, z.core.$strip>>;
|
|
110
|
-
timestamp: z.ZodISODateTime;
|
|
111
|
-
steer: z.ZodOptional<z.ZodObject<{
|
|
112
|
-
worst: z.ZodNumber;
|
|
113
|
-
worstAt: z.ZodNullable<z.ZodObject<{
|
|
114
|
-
ruleId: z.ZodString;
|
|
115
|
-
elementId: z.ZodString;
|
|
116
|
-
}, z.core.$strip>>;
|
|
117
|
-
mean: z.ZodNumber;
|
|
118
|
-
score: z.ZodNumber;
|
|
119
|
-
measured: z.ZodNumber;
|
|
120
|
-
terms: z.ZodArray<z.ZodObject<{
|
|
121
|
-
ruleId: z.ZodString;
|
|
122
|
-
elementId: z.ZodString;
|
|
123
|
-
value: z.ZodNumber;
|
|
124
|
-
threshold: z.ZodNumber;
|
|
125
|
-
overshoot: z.ZodNumber;
|
|
126
|
-
}, z.core.$strip>>;
|
|
127
|
-
}, z.core.$strip>>;
|
|
128
|
-
}, z.core.$strip>;
|
|
129
|
-
export type ReadinessReportType = z.infer<typeof ReadinessReport>;
|
|
130
|
-
/**
|
|
131
|
-
* CR-SM-305 — welche Profile in die readiness-Zahlen eingehen, und warum `conformance` nicht.
|
|
132
|
-
*
|
|
133
|
-
* Der Nenner jeder Dimension ist `Σ (Elemente der Grundgesamtheit)` ueber die Regeln der
|
|
134
|
-
* Dimension (`readiness-compute.ts`). Eine Regel, die DEKLARIERT, aber nicht AUSGEWERTET wird,
|
|
135
|
-
* traegt damit zum Nenner bei und liefert null Verstoesse — der Score STEIGT, weil eine
|
|
136
|
-
* Pruefung nicht gelaufen ist. Dieselbe Fail-open-Klasse wie ND-01/02 vor CR-SM-286, nur an der
|
|
137
|
-
* Stelle, die am lautesten gelesen wird.
|
|
138
|
-
*
|
|
139
|
-
* Gemessen ueber vier Familien-Repos, was die sechs RC-Regeln in `arch`/`ver`/`schema`
|
|
140
|
-
* geschenkt haetten: graph-view-edit `schema` +5,0 Punkte (Nenner 24 → 40), graphify `arch`
|
|
141
|
-
* +2,1 und `ver` +1,8, alles Uebrige ≤ 0,2. Der Ausschlag sitzt genau dort, wo die Zahl am
|
|
142
|
-
* meisten wiegt — in der kleinen Dimension.
|
|
143
|
-
*
|
|
144
|
-
* Deshalb steht keine RC-ID in `RULE_TO_DIMENSION` oder `RULE_TO_PHASE`. Das ist keine Luecke,
|
|
145
|
-
* sondern die Aussage „nicht ausgewertet, also weder Zaehler noch Nenner";
|
|
146
|
-
* `computeApplicable` ueberspringt eine Regel ohne Dimension bereits von selbst
|
|
147
|
-
* (`if (!dim) continue`). Sichtbar wird RC ueber die Ableitung `ALL_RULE_DEFS minus
|
|
148
|
-
* ausgewertet` beim Host: sechs Regeln, die als NICHT GEPRUEFT dastehen, solange kein Lauf
|
|
149
|
-
* `CodeFacts` mitbringt.
|
|
150
|
-
*/
|
|
151
|
-
export declare const READINESS_SCORED_PROFILES: readonly ["se", "coding"];
|
|
55
|
+
/** Die Menge je Stufe, Index = Stufe − 1. */
|
|
56
|
+
export declare const STAGE_SETS: readonly ["System", "Anwendungsfall", "Anforderung", "Wirkkette", "Funktion", "Datenfluss", "Modul", "Schema", "Test", "Plan", "Bindung", "Abgleich"];
|
|
57
|
+
/** 1–12, oder `'immer'` fuer die Regeln ueber alle Elemente (R-08, R-18, CR-R03). */
|
|
58
|
+
export type RuleStage = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 'immer';
|
|
152
59
|
/**
|
|
153
|
-
*
|
|
154
|
-
*
|
|
155
|
-
*
|
|
60
|
+
* `existence` — die Regel verlangt, dass es die Menge ihrer Stufe gibt („kein Anwendungsfall →
|
|
61
|
+
* lege einen an"). `analysis` — sie verlangt ein Analyse-Artefakt; nur solche Befunde duerfen mit
|
|
62
|
+
* Begruendung abgenommen werden.
|
|
156
63
|
*/
|
|
157
|
-
export
|
|
158
|
-
/**
|
|
159
|
-
export declare const
|
|
64
|
+
export type RuleRole = 'existence' | 'analysis';
|
|
65
|
+
/** Die Marken in Reihenfolge. */
|
|
66
|
+
export declare const Mark: z.ZodEnum<{
|
|
160
67
|
SRR: "SRR";
|
|
161
68
|
PDR: "PDR";
|
|
162
69
|
CDR: "CDR";
|
|
163
70
|
TRR: "TRR";
|
|
71
|
+
Bau: "Bau";
|
|
164
72
|
}>;
|
|
165
|
-
export type
|
|
73
|
+
export type MarkType = z.infer<typeof Mark>;
|
|
74
|
+
/** Die letzte Stufe VOR jeder Marke. */
|
|
75
|
+
export declare const MARK_STAGE: Readonly<Record<MarkType, number>>;
|
|
76
|
+
/** Die Marke, hinter der eine Stufe liegt. `'immer'` gehoert keiner einzelnen Marke. */
|
|
77
|
+
export declare function markOfStage(stage: RuleStage): MarkType | null;
|
|
166
78
|
/**
|
|
167
|
-
*
|
|
168
|
-
* PDR = architecture/functional completeness, CDR = critical design/schema
|
|
169
|
-
* completeness, TRR = test readiness. Primary-gate assignment, same
|
|
170
|
-
* single-owner convention as RULE_TO_DIMENSION.
|
|
171
|
-
*/
|
|
172
|
-
export declare const RULE_TO_PHASE: Record<string, PhaseGateType>;
|
|
173
|
-
/**
|
|
174
|
-
* CR-SM-343 — die VORBEDINGUNG einer Regel: der Elementtyp, von dem der Graph mindestens ein
|
|
175
|
-
* Element tragen muss, damit die Regel ueberhaupt ausgewertet ist.
|
|
79
|
+
* Die Arbeitsschritte (CR-SM-350, gekuerzt CR-SM-395).
|
|
176
80
|
*
|
|
177
|
-
*
|
|
178
|
-
*
|
|
179
|
-
*
|
|
180
|
-
*
|
|
181
|
-
* dort NICHT GESTELLT, nicht bestanden. Wer einen Anteil bildet, fragt `ruleApplies` und laesst
|
|
182
|
-
* eine nicht anwendbare Regel aus Zaehler UND Nenner.
|
|
183
|
-
*/
|
|
184
|
-
export declare const RULE_PRECONDITION: Readonly<Record<string, string>>;
|
|
185
|
-
/** Ist die Regel an einem Graphen mit diesen Typ-Zaehlungen ausgewertet? (CR-SM-343) */
|
|
186
|
-
export declare function ruleApplies(ruleId: string, countByType: Readonly<Record<string, number>>): boolean;
|
|
187
|
-
/**
|
|
188
|
-
* Die Eigentuemer-Spalte (CR-SM-350, Entscheidung 2026-09-22): welcher TASK eine Regel bearbeitet.
|
|
81
|
+
* CR-SM-350 fuehrte je Regel einen Eigentuemer: den KERN (die Schleife, die die Spezifikation baut)
|
|
82
|
+
* oder einen Task (Einsatzkonzept, Fehlerbetrachtung, Plan, Realisierung …), damit der Kern nicht
|
|
83
|
+
* um Detailregeln fremder Artefakte kreist. Das leistet jetzt die FAELLIGKEIT: eine Regel ueber eine
|
|
84
|
+
* Menge, die es noch nicht gibt, schweigt von selbst, und die Stufe ordnet den Rest.
|
|
189
85
|
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
* und
|
|
86
|
+
* - Risiko-Anforderungen (FM-01..03), Auftraege und Meilensteine (CR-R01..03, MS-01..03): keine
|
|
87
|
+
* Elemente, kein Befund.
|
|
88
|
+
* - Betriebsarten (CL-01): einzeln geprueft — die Regel laeuft ueber ACTOR, die es im Kern gibt,
|
|
89
|
+
* meldet aber erst, wenn ein UC eine `operatingMode` traegt. Die setzt nur das Einsatzkonzept.
|
|
90
|
+
* - Bindung und Abgleich (Stufen 11 und 12): nicht faellig, bis der Bau eroeffnet ist (`isDue`).
|
|
195
91
|
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
92
|
+
* Es bleibt EINE Zuordnung, die die Faelligkeit nicht leistet: die Textqualitaet der Anforderungen
|
|
93
|
+
* (BQ-*) meldet an jeder REQ, sobald es eine gibt — sie gehoert einem eigenen Arbeitsschritt.
|
|
94
|
+
* Und es bleibt, welche Regel welche Analyse eroeffnet (`TASK_ENTRY`).
|
|
198
95
|
*/
|
|
199
|
-
export declare const RULE_TASKS: readonly ["kern", "conops", "trade", "irr", "fmea", "plan", "anforderungsqualitaet"
|
|
96
|
+
export declare const RULE_TASKS: readonly ["kern", "conops", "trade", "irr", "fmea", "plan", "anforderungsqualitaet"];
|
|
200
97
|
export type RuleTask = (typeof RULE_TASKS)[number];
|
|
201
|
-
/** Die Regeln
|
|
202
|
-
export declare const TASK_OWNED_RULES: Readonly<Record<Exclude<RuleTask, 'kern'>, readonly string[]
|
|
98
|
+
/** Die Regeln, die ein Arbeitsschritt dem Kern abnimmt. Jede Regel hoechstens einmal — der Test haelt das fest. */
|
|
99
|
+
export declare const TASK_OWNED_RULES: Readonly<Partial<Record<Exclude<RuleTask, 'kern'>, readonly string[]>>>;
|
|
203
100
|
/**
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
* (Realisierung: die erste Bindung).
|
|
101
|
+
* Analyse → die Regel, die „diese Analyse fehlt" sagt (ihr Skill steht an der Regelhilfe,
|
|
102
|
+
* `RULE_HELP[…].prompt`). `null` = der Arbeitsschritt wird ausdruecklich gerufen.
|
|
207
103
|
*/
|
|
208
104
|
export declare const TASK_ENTRY: Readonly<Record<Exclude<RuleTask, 'kern'>, string | null>>;
|
|
209
105
|
/** Der Eigentuemer einer Regel — der Kern, wenn kein Task sie beansprucht. */
|
|
210
106
|
export declare function taskOf(ruleId: string): RuleTask;
|
|
211
|
-
/** The
|
|
212
|
-
export declare const DIMENSION_READINESS_NAME = "dimension_readiness";
|
|
213
|
-
/** The 4 RULE_TO_PHASE gate scores (SRR/PDR/CDR/TRR). */
|
|
107
|
+
/** The marks derived from the rule stage (SRR/PDR/CDR/TRR/Bau). */
|
|
214
108
|
export declare const PHASE_READINESS_NAME = "phase_readiness";
|
|
215
|
-
/** Best-of-N ranking KPI: candidate dimension_readiness minus baseline. */
|
|
216
|
-
export declare const DIMENSION_READINESS_DELTA_NAME = "dimension_readiness_delta";
|
package/dist/se/readiness.js
CHANGED
|
@@ -1,62 +1,12 @@
|
|
|
1
1
|
/**
|
|
2
|
-
*
|
|
3
|
-
*
|
|
4
|
-
*
|
|
5
|
-
*
|
|
6
|
-
*
|
|
7
|
-
*
|
|
8
|
-
* guarantee as `RULE_TO_DIMENSION`, exported so no consumer reinvents it.
|
|
2
|
+
* Stufen, Marken und Arbeitsschritte der Steuerung, dazu der Vertrag des Steuerungsraums.
|
|
3
|
+
* CR-SM-395: the phase axis is no longer a table. Each rule carries its stage; the mark
|
|
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.
|
|
9
8
|
*/
|
|
10
9
|
import { z } from 'zod/v4';
|
|
11
|
-
export const ReadinessDimension = z.enum([
|
|
12
|
-
'req', // Requirements quality (BQ-01..07, RD-01..03)
|
|
13
|
-
'uc', // UC completeness (UC-01..06, R-14, FC-01..04)
|
|
14
|
-
'arch', // Functional architecture (R-02, R-03, R-10, R-12)
|
|
15
|
-
'alloc', // Module allocation (R-04)
|
|
16
|
-
'ver', // Test coverage (R-01, R-05)
|
|
17
|
-
'schema', // Interface completeness (R-26 binding, SC-02 usage)
|
|
18
|
-
'cr', // CR traceability (CR-R01..R03)
|
|
19
|
-
'ms', // Milestone planning (MS-01..02)
|
|
20
|
-
]);
|
|
21
|
-
export const ReadinessScore = z.object({
|
|
22
|
-
dimension: ReadinessDimension,
|
|
23
|
-
/**
|
|
24
|
-
* `1 - (violations / applicable)` — oder **`null`**, wenn die Dimension nicht messbar ist
|
|
25
|
-
* (CR-SM-270).
|
|
26
|
-
*
|
|
27
|
-
* `null` heisst nie 0 %, so wie schon bei `graph_metrics` (CR-GC-326): "a value that is not
|
|
28
|
-
* measurable is not zero percent". Der Anlass war die Gegenrichtung — ein Modell ohne einen
|
|
29
|
-
* einzigen Use Case meldete `uc: 0,997, ready: true`, weil 306 FUNC ueber eine einzige
|
|
30
|
-
* Fremdtyp-Regel (FC-03) den Nenner fuellten, waehrend die dreizehn Regeln, die wirklich Use
|
|
31
|
-
* Cases pruefen, nichts zu pruefen hatten und ihr SCHWEIGEN sich als Erfolg las. Der Score
|
|
32
|
-
* zeigte damit in die falsche Richtung: je mehr importierte FUNCs ein Repo ohne Wozu-Ebene
|
|
33
|
-
* hat, desto reifer sah seine uc-Readiness aus.
|
|
34
|
-
*/
|
|
35
|
-
score: z.number().min(0).max(1).nullable(),
|
|
36
|
-
violations: z.number().int(),
|
|
37
|
-
applicable: z.number().int(),
|
|
38
|
-
/**
|
|
39
|
-
* CR-SM-270: die Kernmenge der Dimension — die Elemente der Typen, die die MEHRHEIT ihrer
|
|
40
|
-
* Regeln prueft (uc → UC/FCHAIN/ACTOR, arch → FUNC/MOD). Ist sie 0, ist `score` `null`.
|
|
41
|
-
*
|
|
42
|
-
* Sie steht im Bericht, weil sonst niemand das `null` erklaeren kann: `applicable` allein
|
|
43
|
-
* unterscheidet "nichts zu pruefen" (0) nicht von "nur Fremdtypen" (307). Genau die
|
|
44
|
-
* Unterscheidung, an der der dokumentierte Ausweg aus CR-SM-237 gescheitert ist.
|
|
45
|
-
*/
|
|
46
|
-
coreApplicable: z.number().int(),
|
|
47
|
-
// CR-SM-310: kein `ready` mehr. Ob eine Dimension zu schwach ist, urteilt der Konsument mit
|
|
48
|
-
// SEINER Schwelle (graphcode: generate.ts, focusThreshold aus der Config). Die Messung traegt
|
|
49
|
-
// kein Urteil — vorher stand es zweimal: hier als `ready` und beim Konsumenten.
|
|
50
|
-
});
|
|
51
|
-
/**
|
|
52
|
-
* CR-SM-237: `overallScore` ist weg. Es war das **ungewichtete** Mittel der acht
|
|
53
|
-
* Dimensions-Scores — `ms` (3 Regeln) zählte so viel wie `arch` (~20 Regeln über Hunderte
|
|
54
|
-
* Elemente), die Zahl bewegte sich also mit dem Größenverhältnis der Dimensionen und nicht mit
|
|
55
|
-
* dem Zustand des Modells. Gelesen hat sie ohnehin niemand: der einzige Zugriff in der Familie
|
|
56
|
-
* war eine Formprüfung (`'overallScore' in x`) im inzwischen gelöschten `weight-vector.ts`.
|
|
57
|
-
* Ein interpretierbarer Ersatz (`1 − Σviolations / Σapplicable`) kommt, wenn er einen
|
|
58
|
-
* Konsumenten hat — nicht auf Vorrat.
|
|
59
|
-
*/
|
|
60
10
|
/**
|
|
61
11
|
* CR-SM-337 (ITEM-2026-059) — der STEUERUNGSRAUM im Bericht, Stufe 1: der Vertrag.
|
|
62
12
|
*
|
|
@@ -110,234 +60,59 @@ export const SteerSpace = z.object({
|
|
|
110
60
|
/** Die Terme je Element, aus denen `worst` und `mean` entstehen. */
|
|
111
61
|
terms: z.array(SteerTerm),
|
|
112
62
|
});
|
|
113
|
-
export const ReadinessReport = z.object({
|
|
114
|
-
scores: z.array(ReadinessScore),
|
|
115
|
-
timestamp: z.iso.datetime(),
|
|
116
|
-
/**
|
|
117
|
-
* CR-SM-337: OPTIONAL, damit ein aelterer Produzent gueltig bleibt — der Vertrag wandert vor
|
|
118
|
-
* dem Fueller (Stufe 2, graphcode CR-GC-537). Fehlt das Feld, heisst das "dieser Produzent
|
|
119
|
-
* kennt den Steuerungsraum noch nicht", und das ist etwas anderes als `measured: 0`.
|
|
120
|
-
*/
|
|
121
|
-
steer: SteerSpace.optional(),
|
|
122
|
-
});
|
|
123
|
-
/**
|
|
124
|
-
* CR-SM-305 — welche Profile in die readiness-Zahlen eingehen, und warum `conformance` nicht.
|
|
125
|
-
*
|
|
126
|
-
* Der Nenner jeder Dimension ist `Σ (Elemente der Grundgesamtheit)` ueber die Regeln der
|
|
127
|
-
* Dimension (`readiness-compute.ts`). Eine Regel, die DEKLARIERT, aber nicht AUSGEWERTET wird,
|
|
128
|
-
* traegt damit zum Nenner bei und liefert null Verstoesse — der Score STEIGT, weil eine
|
|
129
|
-
* Pruefung nicht gelaufen ist. Dieselbe Fail-open-Klasse wie ND-01/02 vor CR-SM-286, nur an der
|
|
130
|
-
* Stelle, die am lautesten gelesen wird.
|
|
131
|
-
*
|
|
132
|
-
* Gemessen ueber vier Familien-Repos, was die sechs RC-Regeln in `arch`/`ver`/`schema`
|
|
133
|
-
* geschenkt haetten: graph-view-edit `schema` +5,0 Punkte (Nenner 24 → 40), graphify `arch`
|
|
134
|
-
* +2,1 und `ver` +1,8, alles Uebrige ≤ 0,2. Der Ausschlag sitzt genau dort, wo die Zahl am
|
|
135
|
-
* meisten wiegt — in der kleinen Dimension.
|
|
136
|
-
*
|
|
137
|
-
* Deshalb steht keine RC-ID in `RULE_TO_DIMENSION` oder `RULE_TO_PHASE`. Das ist keine Luecke,
|
|
138
|
-
* sondern die Aussage „nicht ausgewertet, also weder Zaehler noch Nenner";
|
|
139
|
-
* `computeApplicable` ueberspringt eine Regel ohne Dimension bereits von selbst
|
|
140
|
-
* (`if (!dim) continue`). Sichtbar wird RC ueber die Ableitung `ALL_RULE_DEFS minus
|
|
141
|
-
* ausgewertet` beim Host: sechs Regeln, die als NICHT GEPRUEFT dastehen, solange kein Lauf
|
|
142
|
-
* `CodeFacts` mitbringt.
|
|
143
|
-
*/
|
|
144
|
-
export const READINESS_SCORED_PROFILES = ['se', 'coding'];
|
|
145
|
-
/**
|
|
146
|
-
* Rule → dimension mapping. Some rules belong to multiple dimensions;
|
|
147
|
-
* here we assign primary dimension per rule. R-01 appears in 'ver' (primary)
|
|
148
|
-
* since its core concern is test verification coverage.
|
|
149
|
-
*/
|
|
150
|
-
export const RULE_TO_DIMENSION = {
|
|
151
|
-
// req
|
|
152
|
-
'BQ-01': 'req', 'BQ-02': 'req', 'BQ-04': 'req',
|
|
153
|
-
'BQ-06': 'req', 'BQ-07': 'req',
|
|
154
|
-
'RD-01': 'req', 'RD-02': 'req',
|
|
155
|
-
// CR-SM-343: CR-R05 (Blatt-REQ ohne Bauauftrag) — ein Mangel der Anforderungsdeckung, nicht
|
|
156
|
-
// der CR-Hygiene; zaehlt nur, wenn der Graph ueberhaupt CR-Knoten traegt (RULE_PRECONDITION).
|
|
157
|
-
'CR-R05': 'req',
|
|
158
|
-
// RD-04 is decomposition *breadth* — an architecture concern, not a requirement one
|
|
159
|
-
'RD-04': 'arch',
|
|
160
|
-
// CR-SM-311: die Untergrenze derselben Breite — ebenfalls Architektur
|
|
161
|
-
'RD-05': 'arch',
|
|
162
|
-
// trace/realization/allocation completeness rules (CR-228 D: previously unmapped → advisory fall-through)
|
|
163
|
-
'R-18': 'arch', 'R-19': 'ver', 'R-20': 'arch', 'R-21': 'ver',
|
|
164
|
-
// CR-SM-231: R-29 (Testdatei-Exklusivitaet) gehoert zu 'ver' wie R-19 — beide bewerten die
|
|
165
|
-
// Evidenz-Bindung einer Abnahme, R-19 ihre Praesenz, R-29 ihre Eindeutigkeit.
|
|
166
|
-
'R-29': 'ver',
|
|
167
|
-
'R-22': 'alloc', 'R-23': 'alloc', 'R-26': 'schema', 'R-32': 'ver', // CR-GC-366: R-30 (Wirkketten-Bindung) und R-31 (io-Verdrahtung) bewerten beide, ob ein
|
|
168
|
-
// Funktionsblock ueberhaupt im Bauplan haengt — dieselbe Dimension wie R-20 (realRef).
|
|
169
|
-
// NICHT 'uc': R-14..R-17 fragen, ob ein Behaelter gefuellt ist;
|
|
170
|
-
// diese beiden fragen von der FUNC aus, ob sie angeschlossen ist.
|
|
171
|
-
'R-30': 'arch', 'R-31': 'arch',
|
|
172
|
-
// uc
|
|
173
|
-
'UC-01': 'uc', 'UC-02': 'uc', 'UC-03': 'uc', 'UC-04': 'uc',
|
|
174
|
-
'R-15': 'uc', 'R-16': 'uc', 'R-17': 'uc',
|
|
175
|
-
// FC-04 (CR-SM-226): FCHAIN actor-bounded (trigger+consumer) — same dimension as FC-01..03.
|
|
176
|
-
'FC-02': 'uc', 'FC-03': 'uc', 'FC-04': 'uc',
|
|
177
|
-
'FC-05': 'uc', // CR-SM-363: Zusammenhang der Kette — dieselbe Dimension wie FC-04
|
|
178
|
-
// arch
|
|
179
|
-
'R-02': 'arch', 'R-10': 'arch', 'R-12': 'arch',
|
|
180
|
-
// alloc
|
|
181
|
-
'R-04': 'alloc',
|
|
182
|
-
// ver
|
|
183
|
-
'R-01': 'ver', 'R-05': 'ver',
|
|
184
|
-
// schema
|
|
185
|
-
'SC-02': 'schema', // SC-01/SC-03 deleted (BOK-CR-026) — R-26 is the binding rule
|
|
186
|
-
// SC-04 entfiel mit CR-SM-271: FLOW ohne SCHEMA ist jetzt Grammatik (R-18-Bein, error)
|
|
187
|
-
// und zaehlt damit unter R-18/'arch' statt als eigene 'schema'-Zeile.
|
|
188
|
-
// structural rules without primary dimension → assigned by closest concern
|
|
189
|
-
'R-08': 'arch',
|
|
190
|
-
// near-duplicate detection
|
|
191
|
-
'ND-01': 'arch', 'ND-02': 'schema',
|
|
192
|
-
// architecture metrics
|
|
193
|
-
// MT-03 is no longer here: it became a measurement (`allocationCohesion`), not a
|
|
194
|
-
// rule (CR-SM-223) — a per-module advisory would depress this score permanently.
|
|
195
|
-
'MT-01': 'alloc', 'MT-02': 'alloc',
|
|
196
|
-
// CR-SM-327: MT-04 misst die FUNC-Whitebox, nicht das Modul — Grundgesamtheit FUNC,
|
|
197
|
-
// also `arch` (Kern FUNC). In `alloc` waere sie eine Fremdtyp-Regel und wuerde deren
|
|
198
|
-
// Nenner um jede FUNC des Graphen aufblaehen (Klasse CR-SM-235/270, gemessen im CR).
|
|
199
|
-
'MT-04': 'arch',
|
|
200
|
-
// CR traceability
|
|
201
|
-
'CR-R01': 'cr', 'CR-R02': 'cr', 'CR-R03': 'cr', // architecture optimization
|
|
202
|
-
// CR-SM-283: BW-02 (Whitebox-Randbreite) ersetzt AO-D03 an dieser Stelle — dieselbe
|
|
203
|
-
// Dimension, denn beide fragen nach der Struktur des Funktionsschnitts, nicht nach Evidenz.
|
|
204
|
-
'BW-02': 'arch',
|
|
205
|
-
// allocation rules (CR-191)
|
|
206
|
-
'CR-01': 'arch', // milestone planning
|
|
207
|
-
'MS-01': 'ms', 'MS-02': 'ms', 'MS-03': 'ms',
|
|
208
|
-
// FMEA / risk
|
|
209
|
-
'FM-01': 'req', 'FM-02': 'req', 'FM-03': 'ver',
|
|
210
|
-
// CR-SM-227: analysis-artifact freshness presence — closest topical fit per artifact.
|
|
211
|
-
'AF-01': 'req', 'AF-03': 'req', // ConOps/Assumption-Review: requirements-adjacent judgment work
|
|
212
|
-
'IR-01': 'req', // CR-SM-355: Annahmen-Review promoviert zu CR — Task-Ausgang von irr
|
|
213
|
-
'AF-02': 'arch', // Trade Study: architecture decision record
|
|
214
|
-
'TR-01': 'arch', // CR-SM-355: Trade-Entscheidung als CR — Task-Ausgang von trade
|
|
215
|
-
'AF-04': 'ver', // FMEA: risk/verification, same bucket as FM-03
|
|
216
|
-
'AF-05': 'ms', // Implementation Plan: milestone/planning
|
|
217
|
-
// NFR budget
|
|
218
|
-
'NFR-01': 'arch',
|
|
219
|
-
// cross-module IO (CR-192)
|
|
220
|
-
'IO-01': 'arch',
|
|
221
|
-
'IO-02': 'arch', // CR-SM-307: Flusstopologie, dieselbe Dimension wie R-10/IO-01.
|
|
222
|
-
// view rules (CR-184)
|
|
223
|
-
'VR-01': 'ver',
|
|
224
|
-
'CL-01': 'uc',
|
|
225
|
-
};
|
|
226
63
|
// ---------------------------------------------------------------------------
|
|
227
|
-
//
|
|
228
|
-
//
|
|
229
|
-
//
|
|
230
|
-
//
|
|
231
|
-
//
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
64
|
+
// Stufen und Marken (CR-SM-395) — die Reihenfolge der Mengen.
|
|
65
|
+
//
|
|
66
|
+
// Jede Regel traegt an ihrer Definition eine STUFE (`RuleDefinition.stage`): die spaeteste Menge,
|
|
67
|
+
// die sie BRAUCHT — nicht der Typ, ueber den sie laeuft (FM-03 laeuft ueber REQ, verlangt aber
|
|
68
|
+
// einen TEST: Stufe 9). Die Stufen ordnen, sie verbieten nichts.
|
|
69
|
+
//
|
|
70
|
+
// Eine MARKE liegt zwischen zwei Stufen und wird aus der Stufe berechnet (`markOfStage`). Es gibt
|
|
71
|
+
// keine zweite Zuordnung: `RULE_TO_PHASE` (CR-SM-226, 67 Handeintraege) ist entfallen, die Marke je
|
|
72
|
+
// Regel steht abgeleitet in `ALL_RULE_DEFS[].mark`.
|
|
235
73
|
// ---------------------------------------------------------------------------
|
|
236
|
-
/**
|
|
237
|
-
export const
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
*/
|
|
244
|
-
export const
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
'AF-02': 'PDR', 'AF-03': 'PDR', // Trade Study, Assumption Review
|
|
251
|
-
'AF-04': 'CDR', // FMEA
|
|
252
|
-
'AF-05': 'PDR', // Implementation Plan
|
|
253
|
-
'TR-01': 'PDR', 'IR-01': 'PDR', // CR-SM-355: Task-Ausgaenge von trade / irr — dasselbe Gate wie ihr Eintritt
|
|
254
|
-
// SRR — requirements/scope clarity, system+UC boundary definition.
|
|
255
|
-
'BQ-01': 'SRR', 'BQ-02': 'SRR', 'BQ-04': 'SRR', 'BQ-06': 'SRR', 'BQ-07': 'SRR',
|
|
256
|
-
'RD-01': 'SRR', 'RD-02': 'SRR',
|
|
257
|
-
'UC-01': 'SRR', 'UC-02': 'SRR', 'UC-03': 'SRR', 'UC-04': 'SRR',
|
|
258
|
-
'R-16': 'SRR', 'R-17': 'SRR',
|
|
259
|
-
'FC-02': 'SRR',
|
|
260
|
-
'CL-01': 'SRR',
|
|
261
|
-
'FM-01': 'SRR', 'FM-02': 'SRR',
|
|
262
|
-
'CR-R01': 'SRR', 'CR-R03': 'SRR',
|
|
263
|
-
'MS-01': 'SRR', 'MS-02': 'SRR', 'MS-03': 'SRR',
|
|
264
|
-
// PDR — architecture/functional completeness.
|
|
265
|
-
'RD-04': 'PDR', 'RD-05': 'PDR',
|
|
266
|
-
'R-02': 'PDR', 'R-08': 'PDR', 'R-10': 'PDR', 'R-12': 'PDR', 'R-18': 'PDR',
|
|
267
|
-
'R-04': 'PDR', 'R-22': 'PDR', 'R-23': 'PDR',
|
|
268
|
-
'R-15': 'PDR',
|
|
269
|
-
'FC-03': 'PDR', 'FC-04': 'PDR', 'FC-05': 'PDR',
|
|
270
|
-
// CR-GC-366: Anschluss des Funktionsbaus — gehoert an dasselbe Gate wie R-15/IO-01,
|
|
271
|
-
// die auf derselben Kette aufsetzen.
|
|
272
|
-
'R-30': 'PDR', 'R-31': 'PDR',
|
|
273
|
-
'MT-01': 'PDR', 'MT-02': 'PDR', 'MT-04': 'PDR', // CR-SM-327: dieselbe Reifephase wie MT-02
|
|
274
|
-
'ND-01': 'PDR',
|
|
275
|
-
'BW-02': 'PDR', 'CR-01': 'PDR', 'IO-01': 'PDR', 'IO-02': 'PDR', // CR-SM-226: extended to all FCHAIN FUNC-pairs, added to the phase axis.
|
|
276
|
-
// CDR — critical design/schema completeness.
|
|
277
|
-
'SC-02': 'CDR', // SC-04 entfiel mit CR-SM-271 — der FLOW-ohne-SCHEMA-Fall haengt an R-18/PDR
|
|
278
|
-
'ND-02': 'CDR',
|
|
279
|
-
'NFR-01': 'CDR',
|
|
280
|
-
// TRR — test readiness.
|
|
281
|
-
'R-01': 'TRR', 'R-05': 'TRR', 'R-32': 'TRR', 'R-19': 'TRR', 'R-20': 'TRR', 'R-21': 'TRR',
|
|
282
|
-
'R-26': 'TRR', // CR-SM-354: dieselbe Aussage wie R-20 (Praesenz von Code) — as-built ist TRR, nicht CDR
|
|
283
|
-
// CR-SM-231: eine doppelt beanspruchte Testdatei laesst den TRR-Gate dieselbe Evidenz
|
|
284
|
-
// doppelt zaehlen — der Befund gehoert genau an dieses Gate.
|
|
285
|
-
'R-29': 'TRR',
|
|
286
|
-
'VR-01': 'TRR',
|
|
287
|
-
'FM-03': 'TRR',
|
|
288
|
-
'CR-R02': 'TRR',
|
|
289
|
-
'CR-R05': 'TRR', // CR-SM-343: dieselbe Phase wie AF-05 (Implementierungsplan)
|
|
290
|
-
};
|
|
291
|
-
/**
|
|
292
|
-
* CR-SM-343 — die VORBEDINGUNG einer Regel: der Elementtyp, von dem der Graph mindestens ein
|
|
293
|
-
* Element tragen muss, damit die Regel ueberhaupt ausgewertet ist.
|
|
294
|
-
*
|
|
295
|
-
* Der Nenner einer Dimension ist `Σ Grundgesamtheit` ueber ihre Regeln (`domain`). Eine Regel,
|
|
296
|
-
* die mangels Gegenstand schweigt, truege dort ihre ganze Grundgesamtheit bei und liefert null
|
|
297
|
-
* Verstoesse — der Score STIEGE, weil nicht geprueft wurde. CR-R05 fragt nach einem Bauauftrag;
|
|
298
|
-
* ein Graph ohne einen einzigen CR (`cr: docs`) hat keinen Plan im Graphen, also ist die Frage
|
|
299
|
-
* dort NICHT GESTELLT, nicht bestanden. Wer einen Anteil bildet, fragt `ruleApplies` und laesst
|
|
300
|
-
* eine nicht anwendbare Regel aus Zaehler UND Nenner.
|
|
301
|
-
*/
|
|
302
|
-
export const RULE_PRECONDITION = {
|
|
303
|
-
'CR-R05': 'CR',
|
|
304
|
-
};
|
|
305
|
-
/** Ist die Regel an einem Graphen mit diesen Typ-Zaehlungen ausgewertet? (CR-SM-343) */
|
|
306
|
-
export function ruleApplies(ruleId, countByType) {
|
|
307
|
-
const required = RULE_PRECONDITION[ruleId];
|
|
308
|
-
return required === undefined || (countByType[required] ?? 0) > 0;
|
|
74
|
+
/** Die Menge je Stufe, Index = Stufe − 1. */
|
|
75
|
+
export const STAGE_SETS = [
|
|
76
|
+
'System', 'Anwendungsfall', 'Anforderung', 'Wirkkette', 'Funktion', 'Datenfluss', 'Modul',
|
|
77
|
+
'Schema', 'Test', 'Plan', 'Bindung', 'Abgleich',
|
|
78
|
+
];
|
|
79
|
+
/** Die Marken in Reihenfolge. */
|
|
80
|
+
export const Mark = z.enum(['SRR', 'PDR', 'CDR', 'TRR', 'Bau']);
|
|
81
|
+
/** Die letzte Stufe VOR jeder Marke. */
|
|
82
|
+
export const MARK_STAGE = { SRR: 4, PDR: 7, CDR: 8, TRR: 9, Bau: 12 };
|
|
83
|
+
/** Die Marke, hinter der eine Stufe liegt. `'immer'` gehoert keiner einzelnen Marke. */
|
|
84
|
+
export function markOfStage(stage) {
|
|
85
|
+
if (stage === 'immer')
|
|
86
|
+
return null;
|
|
87
|
+
return Mark.options.find((m) => stage <= MARK_STAGE[m]) ?? null;
|
|
309
88
|
}
|
|
310
89
|
/**
|
|
311
|
-
* Die
|
|
90
|
+
* Die Arbeitsschritte (CR-SM-350, gekuerzt CR-SM-395).
|
|
91
|
+
*
|
|
92
|
+
* CR-SM-350 fuehrte je Regel einen Eigentuemer: den KERN (die Schleife, die die Spezifikation baut)
|
|
93
|
+
* oder einen Task (Einsatzkonzept, Fehlerbetrachtung, Plan, Realisierung …), damit der Kern nicht
|
|
94
|
+
* um Detailregeln fremder Artefakte kreist. Das leistet jetzt die FAELLIGKEIT: eine Regel ueber eine
|
|
95
|
+
* Menge, die es noch nicht gibt, schweigt von selbst, und die Stufe ordnet den Rest.
|
|
312
96
|
*
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
* und
|
|
97
|
+
* - Risiko-Anforderungen (FM-01..03), Auftraege und Meilensteine (CR-R01..03, MS-01..03): keine
|
|
98
|
+
* Elemente, kein Befund.
|
|
99
|
+
* - Betriebsarten (CL-01): einzeln geprueft — die Regel laeuft ueber ACTOR, die es im Kern gibt,
|
|
100
|
+
* meldet aber erst, wenn ein UC eine `operatingMode` traegt. Die setzt nur das Einsatzkonzept.
|
|
101
|
+
* - Bindung und Abgleich (Stufen 11 und 12): nicht faellig, bis der Bau eroeffnet ist (`isDue`).
|
|
318
102
|
*
|
|
319
|
-
*
|
|
320
|
-
*
|
|
103
|
+
* Es bleibt EINE Zuordnung, die die Faelligkeit nicht leistet: die Textqualitaet der Anforderungen
|
|
104
|
+
* (BQ-*) meldet an jeder REQ, sobald es eine gibt — sie gehoert einem eigenen Arbeitsschritt.
|
|
105
|
+
* Und es bleibt, welche Regel welche Analyse eroeffnet (`TASK_ENTRY`).
|
|
321
106
|
*/
|
|
322
|
-
export const RULE_TASKS = ['kern', 'conops', 'trade', 'irr', 'fmea', 'plan', 'anforderungsqualitaet'
|
|
323
|
-
/** Die Regeln
|
|
107
|
+
export const RULE_TASKS = ['kern', 'conops', 'trade', 'irr', 'fmea', 'plan', 'anforderungsqualitaet'];
|
|
108
|
+
/** Die Regeln, die ein Arbeitsschritt dem Kern abnimmt. Jede Regel hoechstens einmal — der Test haelt das fest. */
|
|
324
109
|
export const TASK_OWNED_RULES = {
|
|
325
|
-
|
|
326
|
-
trade: ['TR-01'], // CR-SM-355: Trade-Entscheidung als CR
|
|
327
|
-
irr: ['IR-01'], // CR-SM-355: Annahmen-Review promoviert zu CR
|
|
328
|
-
fmea: ['FM-01', 'FM-02', 'FM-03'],
|
|
329
|
-
// CR-SM-377: CR-R05 (Blatt-REQ ohne Bauauftrag, CR-SM-343) fragt nach einem CR — die Antwort
|
|
330
|
-
// schreibt der Plan-Task (se-plan), nicht die Generierungsschleife. FC-05 bleibt Kern: die
|
|
331
|
-
// Kette zu schliessen ist Spezifikationsarbeit wie FC-04.
|
|
332
|
-
plan: ['MS-01', 'MS-02', 'MS-03', 'CR-R01', 'CR-R02', 'CR-R03', 'CR-R05'],
|
|
333
|
-
// Annahme (CR-SM-350): BQ bekommt einen eigenen Task, vorerst ohne automatischen Eintrittspunkt.
|
|
110
|
+
// Annahme (CR-SM-350): BQ bekommt einen eigenen Task, ohne automatischen Eintrittspunkt.
|
|
334
111
|
anforderungsqualitaet: ['BQ-01', 'BQ-02', 'BQ-04', 'BQ-06', 'BQ-07'],
|
|
335
|
-
realisierung: ['R-19', 'R-20', 'R-26', 'R-29', 'R-32', 'VR-01', 'RC-01', 'RC-02', 'RC-03', 'RC-04', 'RC-05', 'RC-06', 'RC-07', 'RC-08', 'RC-09', 'RC-10'],
|
|
336
112
|
};
|
|
337
113
|
/**
|
|
338
|
-
*
|
|
339
|
-
*
|
|
340
|
-
* (Realisierung: die erste Bindung).
|
|
114
|
+
* Analyse → die Regel, die „diese Analyse fehlt" sagt (ihr Skill steht an der Regelhilfe,
|
|
115
|
+
* `RULE_HELP[…].prompt`). `null` = der Arbeitsschritt wird ausdruecklich gerufen.
|
|
341
116
|
*/
|
|
342
117
|
export const TASK_ENTRY = {
|
|
343
118
|
conops: 'AF-01',
|
|
@@ -346,9 +121,8 @@ export const TASK_ENTRY = {
|
|
|
346
121
|
fmea: 'AF-04',
|
|
347
122
|
plan: 'AF-05',
|
|
348
123
|
anforderungsqualitaet: null,
|
|
349
|
-
realisierung: null,
|
|
350
124
|
};
|
|
351
|
-
const OWNER = new Map(Object.entries(TASK_OWNED_RULES).flatMap(([task, ids]) => ids.map((id) => [id, task])));
|
|
125
|
+
const OWNER = new Map(Object.entries(TASK_OWNED_RULES).flatMap(([task, ids]) => (ids ?? []).map((id) => [id, task])));
|
|
352
126
|
/** Der Eigentuemer einer Regel — der Kern, wenn kein Task sie beansprucht. */
|
|
353
127
|
export function taskOf(ruleId) {
|
|
354
128
|
return OWNER.get(ruleId) ?? 'kern';
|
|
@@ -357,9 +131,5 @@ export function taskOf(ruleId) {
|
|
|
357
131
|
// Sprachregelung (CR-SM-226) — naming SSOT so graphcode/graph-view-edit/
|
|
358
132
|
// article render the same terms instead of re-inventing string literals.
|
|
359
133
|
// ---------------------------------------------------------------------------
|
|
360
|
-
/** The
|
|
361
|
-
export const DIMENSION_READINESS_NAME = 'dimension_readiness';
|
|
362
|
-
/** The 4 RULE_TO_PHASE gate scores (SRR/PDR/CDR/TRR). */
|
|
134
|
+
/** The marks derived from the rule stage (SRR/PDR/CDR/TRR/Bau). */
|
|
363
135
|
export const PHASE_READINESS_NAME = 'phase_readiness';
|
|
364
|
-
/** Best-of-N ranking KPI: candidate dimension_readiness minus baseline. */
|
|
365
|
-
export const DIMENSION_READINESS_DELTA_NAME = 'dimension_readiness_delta';
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import type { OntologyGraph } from './ontology.js';
|
|
2
|
+
import type { RuleStage } from './readiness.js';
|
|
3
|
+
import type { RuleViolation } from './rules.js';
|
|
4
|
+
/**
|
|
5
|
+
* Gibt es einen offenen Auftrag — einen CR mit `status: open`? Er muss nicht auf die Elemente zeigen.
|
|
6
|
+
*
|
|
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.
|
|
11
|
+
*/
|
|
12
|
+
export declare function hasOpenOrder(graph: OntologyGraph): boolean;
|
|
13
|
+
/** Ist die Regel an diesem Graphen faellig — ist ihre Menge nicht leer? */
|
|
14
|
+
export declare function isDue(rule: {
|
|
15
|
+
stage: RuleStage;
|
|
16
|
+
domain: readonly string[];
|
|
17
|
+
}, graph: OntologyGraph): boolean;
|
|
18
|
+
/**
|
|
19
|
+
* Wickelt das `evaluate` der Regeln, deren Menge nicht ihre `domain` ist (Stufen 11 und 12) — am
|
|
20
|
+
* Katalog, einmal. Die uebrigen Regeln kommen unveraendert (dieselbe Referenz) zurueck.
|
|
21
|
+
*/
|
|
22
|
+
export declare function whenDue<A extends unknown[], R extends {
|
|
23
|
+
stage: RuleStage;
|
|
24
|
+
domain: readonly string[];
|
|
25
|
+
evaluate: (graph: OntologyGraph, ...rest: A) => RuleViolation[];
|
|
26
|
+
}>(rules: readonly R[]): R[];
|