@sigloch/contracts 10.13.0 → 11.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 +49 -15
- package/dist/se/analysis-freshness-rules.js +109 -34
- package/dist/se/ao-rules.js +3 -3
- 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 +5 -0
- package/dist/se/evaluate-all.js +2 -1
- 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 +91 -90
- package/dist/se/index.d.ts +3 -2
- package/dist/se/index.js +4 -2
- package/dist/se/metric-rules.d.ts +3 -0
- package/dist/se/metric-rules.js +3 -3
- 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 -4
- package/dist/se/ontology.js +37 -14
- package/dist/se/placeholder.d.ts +1 -0
- package/dist/se/placeholder.js +13 -0
- package/dist/se/quality-rules.js +8 -8
- package/dist/se/readiness.d.ts +45 -47
- package/dist/se/readiness.js +57 -120
- package/dist/se/rule-due.d.ts +35 -0
- package/dist/se/rule-due.js +83 -0
- package/dist/se/rule-help.d.ts +19 -3
- package/dist/se/rule-help.js +97 -26
- package/dist/se/rules.d.ts +18 -0
- package/dist/se/rules.js +119 -73
- package/dist/se/schema-quality-rules.d.ts +1 -1
- package/dist/se/schema-quality-rules.js +1 -1
- package/dist/se/uc-quality-rules.js +6 -6
- package/dist/se/view-rules.js +6 -4
- package/package.json +1 -1
package/dist/se/readiness.d.ts
CHANGED
|
@@ -1,32 +1,29 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CR-120: Readiness dimension schemas for dynamic phase readiness.
|
|
3
3
|
* Dimensions emerge from graph state — no state machine.
|
|
4
|
-
* CR-SM-
|
|
5
|
-
*
|
|
6
|
-
* ad-hoc) phase-gate grouping. `RULE_TO_PHASE` below is the one replacement:
|
|
7
|
-
* a rule → SRR/PDR/CDR/TRR mapping, same shape and same completeness
|
|
8
|
-
* guarantee as `RULE_TO_DIMENSION`, exported so no consumer reinvents it.
|
|
4
|
+
* CR-SM-395: the phase axis is no longer a table. Each rule carries its stage; the mark
|
|
5
|
+
* (SRR/PDR/CDR/TRR/Bau) is derived from it — see "Stufen und Marken" below.
|
|
9
6
|
*/
|
|
10
7
|
import { z } from 'zod/v4';
|
|
11
8
|
export declare const ReadinessDimension: z.ZodEnum<{
|
|
12
|
-
schema: "schema";
|
|
13
9
|
req: "req";
|
|
14
10
|
uc: "uc";
|
|
15
11
|
arch: "arch";
|
|
16
12
|
alloc: "alloc";
|
|
17
13
|
ver: "ver";
|
|
14
|
+
schema: "schema";
|
|
18
15
|
cr: "cr";
|
|
19
16
|
ms: "ms";
|
|
20
17
|
}>;
|
|
21
18
|
export type ReadinessDimensionType = z.infer<typeof ReadinessDimension>;
|
|
22
19
|
export declare const ReadinessScore: z.ZodObject<{
|
|
23
20
|
dimension: z.ZodEnum<{
|
|
24
|
-
schema: "schema";
|
|
25
21
|
req: "req";
|
|
26
22
|
uc: "uc";
|
|
27
23
|
arch: "arch";
|
|
28
24
|
alloc: "alloc";
|
|
29
25
|
ver: "ver";
|
|
26
|
+
schema: "schema";
|
|
30
27
|
cr: "cr";
|
|
31
28
|
ms: "ms";
|
|
32
29
|
}>;
|
|
@@ -93,12 +90,12 @@ export type SteerSpaceType = z.infer<typeof SteerSpace>;
|
|
|
93
90
|
export declare const ReadinessReport: z.ZodObject<{
|
|
94
91
|
scores: z.ZodArray<z.ZodObject<{
|
|
95
92
|
dimension: z.ZodEnum<{
|
|
96
|
-
schema: "schema";
|
|
97
93
|
req: "req";
|
|
98
94
|
uc: "uc";
|
|
99
95
|
arch: "arch";
|
|
100
96
|
alloc: "alloc";
|
|
101
97
|
ver: "ver";
|
|
98
|
+
schema: "schema";
|
|
102
99
|
cr: "cr";
|
|
103
100
|
ms: "ms";
|
|
104
101
|
}>;
|
|
@@ -141,7 +138,7 @@ export type ReadinessReportType = z.infer<typeof ReadinessReport>;
|
|
|
141
138
|
* +2,1 und `ver` +1,8, alles Uebrige ≤ 0,2. Der Ausschlag sitzt genau dort, wo die Zahl am
|
|
142
139
|
* meisten wiegt — in der kleinen Dimension.
|
|
143
140
|
*
|
|
144
|
-
* Deshalb steht keine RC-ID in `RULE_TO_DIMENSION
|
|
141
|
+
* Deshalb steht keine RC-ID in `RULE_TO_DIMENSION`. Das ist keine Luecke,
|
|
145
142
|
* sondern die Aussage „nicht ausgewertet, also weder Zaehler noch Nenner";
|
|
146
143
|
* `computeApplicable` ueberspringt eine Regel ohne Dimension bereits von selbst
|
|
147
144
|
* (`if (!dim) continue`). Sichtbar wird RC ueber die Ableitung `ALL_RULE_DEFS minus
|
|
@@ -155,62 +152,63 @@ export declare const READINESS_SCORED_PROFILES: readonly ["se", "coding"];
|
|
|
155
152
|
* since its core concern is test verification coverage.
|
|
156
153
|
*/
|
|
157
154
|
export declare const RULE_TO_DIMENSION: Record<string, ReadinessDimensionType>;
|
|
158
|
-
/**
|
|
159
|
-
export declare const
|
|
155
|
+
/** Die Menge je Stufe, Index = Stufe − 1. */
|
|
156
|
+
export declare const STAGE_SETS: readonly ["System", "Anwendungsfall", "Anforderung", "Wirkkette", "Funktion", "Datenfluss", "Modul", "Schema", "Test", "Plan", "Bindung", "Abgleich"];
|
|
157
|
+
/** 1–12, oder `'immer'` fuer die Regeln ueber alle Elemente (R-08, R-18, CR-R03). */
|
|
158
|
+
export type RuleStage = 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 'immer';
|
|
159
|
+
/**
|
|
160
|
+
* `existence` — die Regel verlangt, dass es die Menge ihrer Stufe gibt („kein Anwendungsfall →
|
|
161
|
+
* lege einen an"). `analysis` — sie verlangt ein Analyse-Artefakt; nur solche Befunde duerfen mit
|
|
162
|
+
* Begruendung abgenommen werden.
|
|
163
|
+
*/
|
|
164
|
+
export type RuleRole = 'existence' | 'analysis';
|
|
165
|
+
/** Die Marken in Reihenfolge. */
|
|
166
|
+
export declare const Mark: z.ZodEnum<{
|
|
160
167
|
SRR: "SRR";
|
|
161
168
|
PDR: "PDR";
|
|
162
169
|
CDR: "CDR";
|
|
163
170
|
TRR: "TRR";
|
|
171
|
+
Bau: "Bau";
|
|
164
172
|
}>;
|
|
165
|
-
export type
|
|
166
|
-
/**
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
* single-owner convention as RULE_TO_DIMENSION.
|
|
171
|
-
*/
|
|
172
|
-
export declare const RULE_TO_PHASE: Record<string, PhaseGateType>;
|
|
173
|
+
export type MarkType = z.infer<typeof Mark>;
|
|
174
|
+
/** Die letzte Stufe VOR jeder Marke. */
|
|
175
|
+
export declare const MARK_STAGE: Readonly<Record<MarkType, number>>;
|
|
176
|
+
/** Die Marke, hinter der eine Stufe liegt. `'immer'` gehoert keiner einzelnen Marke. */
|
|
177
|
+
export declare function markOfStage(stage: RuleStage): MarkType | null;
|
|
173
178
|
/**
|
|
174
|
-
* CR-SM-
|
|
175
|
-
* Element tragen muss, damit die Regel ueberhaupt ausgewertet ist.
|
|
179
|
+
* Die Arbeitsschritte (CR-SM-350, gekuerzt CR-SM-395).
|
|
176
180
|
*
|
|
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.
|
|
181
|
+
* CR-SM-350 fuehrte je Regel einen Eigentuemer: den KERN (die Schleife, die die Spezifikation baut)
|
|
182
|
+
* oder einen Task (Einsatzkonzept, Fehlerbetrachtung, Plan, Realisierung …), damit der Kern nicht
|
|
183
|
+
* um Detailregeln fremder Artefakte kreist. Das leistet jetzt die FAELLIGKEIT: eine Regel ueber eine
|
|
184
|
+
* Menge, die es noch nicht gibt, schweigt von selbst, und die Stufe ordnet den Rest.
|
|
189
185
|
*
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
*
|
|
193
|
-
*
|
|
194
|
-
*
|
|
186
|
+
* - Risiko-Anforderungen (FM-01..03), Auftraege und Meilensteine (CR-R01..03, MS-01..03): keine
|
|
187
|
+
* Elemente, kein Befund.
|
|
188
|
+
* - Variantenvergleich und Annahmen-Review (TR-01, IR-01): melden erst, wenn die Analyse
|
|
189
|
+
* gestempelt ist.
|
|
190
|
+
* - Betriebsarten (CL-01): einzeln geprueft — die Regel laeuft ueber ACTOR, die es im Kern gibt,
|
|
191
|
+
* meldet aber erst, wenn ein UC eine `operatingMode` traegt. Die setzt nur das Einsatzkonzept.
|
|
192
|
+
* - Bindung und Abgleich (Stufen 11 und 12): nicht faellig, bis der Bau eroeffnet ist (`isDue`).
|
|
195
193
|
*
|
|
196
|
-
*
|
|
197
|
-
*
|
|
194
|
+
* Es bleibt EINE Zuordnung, die die Faelligkeit nicht leistet: die Textqualitaet der Anforderungen
|
|
195
|
+
* (BQ-*) meldet an jeder REQ, sobald es eine gibt — sie gehoert einem eigenen Arbeitsschritt.
|
|
196
|
+
* Und es bleibt, welche Regel welche Analyse eroeffnet (`TASK_ENTRY`).
|
|
198
197
|
*/
|
|
199
|
-
export declare const RULE_TASKS: readonly ["kern", "conops", "trade", "irr", "fmea", "plan", "anforderungsqualitaet"
|
|
198
|
+
export declare const RULE_TASKS: readonly ["kern", "conops", "trade", "irr", "fmea", "plan", "anforderungsqualitaet"];
|
|
200
199
|
export type RuleTask = (typeof RULE_TASKS)[number];
|
|
201
|
-
/** Die Regeln
|
|
202
|
-
export declare const TASK_OWNED_RULES: Readonly<Record<Exclude<RuleTask, 'kern'>, readonly string[]
|
|
200
|
+
/** Die Regeln, die ein Arbeitsschritt dem Kern abnimmt. Jede Regel hoechstens einmal — der Test haelt das fest. */
|
|
201
|
+
export declare const TASK_OWNED_RULES: Readonly<Partial<Record<Exclude<RuleTask, 'kern'>, readonly string[]>>>;
|
|
203
202
|
/**
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
* (Realisierung: die erste Bindung).
|
|
203
|
+
* Analyse → die Regel, die „diese Analyse fehlt" sagt (ihr Skill steht an der Regelhilfe,
|
|
204
|
+
* `RULE_HELP[…].prompt`). `null` = der Arbeitsschritt wird ausdruecklich gerufen.
|
|
207
205
|
*/
|
|
208
206
|
export declare const TASK_ENTRY: Readonly<Record<Exclude<RuleTask, 'kern'>, string | null>>;
|
|
209
207
|
/** Der Eigentuemer einer Regel — der Kern, wenn kein Task sie beansprucht. */
|
|
210
208
|
export declare function taskOf(ruleId: string): RuleTask;
|
|
211
209
|
/** The 8 RULE_TO_DIMENSION topic scores (req/uc/arch/alloc/ver/schema/cr/ms). */
|
|
212
210
|
export declare const DIMENSION_READINESS_NAME = "dimension_readiness";
|
|
213
|
-
/** The
|
|
211
|
+
/** The marks derived from the rule stage (SRR/PDR/CDR/TRR/Bau). */
|
|
214
212
|
export declare const PHASE_READINESS_NAME = "phase_readiness";
|
|
215
213
|
/** Best-of-N ranking KPI: candidate dimension_readiness minus baseline. */
|
|
216
214
|
export declare const DIMENSION_READINESS_DELTA_NAME = "dimension_readiness_delta";
|
package/dist/se/readiness.js
CHANGED
|
@@ -1,11 +1,8 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* CR-120: Readiness dimension schemas for dynamic phase readiness.
|
|
3
3
|
* Dimensions emerge from graph state — no state machine.
|
|
4
|
-
* CR-SM-
|
|
5
|
-
*
|
|
6
|
-
* ad-hoc) phase-gate grouping. `RULE_TO_PHASE` below is the one replacement:
|
|
7
|
-
* a rule → SRR/PDR/CDR/TRR mapping, same shape and same completeness
|
|
8
|
-
* guarantee as `RULE_TO_DIMENSION`, exported so no consumer reinvents it.
|
|
4
|
+
* CR-SM-395: the phase axis is no longer a table. Each rule carries its stage; the mark
|
|
5
|
+
* (SRR/PDR/CDR/TRR/Bau) is derived from it — see "Stufen und Marken" below.
|
|
9
6
|
*/
|
|
10
7
|
import { z } from 'zod/v4';
|
|
11
8
|
export const ReadinessDimension = z.enum([
|
|
@@ -21,8 +18,9 @@ export const ReadinessDimension = z.enum([
|
|
|
21
18
|
export const ReadinessScore = z.object({
|
|
22
19
|
dimension: ReadinessDimension,
|
|
23
20
|
/**
|
|
24
|
-
* `1 - (violations / applicable)` — oder **`null`**, wenn die Dimension nicht messbar ist
|
|
25
|
-
* (CR-SM-
|
|
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).
|
|
26
24
|
*
|
|
27
25
|
* `null` heisst nie 0 %, so wie schon bei `graph_metrics` (CR-GC-326): "a value that is not
|
|
28
26
|
* measurable is not zero percent". Der Anlass war die Gegenrichtung — ein Modell ohne einen
|
|
@@ -134,7 +132,7 @@ export const ReadinessReport = z.object({
|
|
|
134
132
|
* +2,1 und `ver` +1,8, alles Uebrige ≤ 0,2. Der Ausschlag sitzt genau dort, wo die Zahl am
|
|
135
133
|
* meisten wiegt — in der kleinen Dimension.
|
|
136
134
|
*
|
|
137
|
-
* Deshalb steht keine RC-ID in `RULE_TO_DIMENSION
|
|
135
|
+
* Deshalb steht keine RC-ID in `RULE_TO_DIMENSION`. Das ist keine Luecke,
|
|
138
136
|
* sondern die Aussage „nicht ausgewertet, also weder Zaehler noch Nenner";
|
|
139
137
|
* `computeApplicable` ueberspringt eine Regel ohne Dimension bereits von selbst
|
|
140
138
|
* (`if (!dim) continue`). Sichtbar wird RC ueber die Ableitung `ALL_RULE_DEFS minus
|
|
@@ -152,9 +150,6 @@ export const RULE_TO_DIMENSION = {
|
|
|
152
150
|
'BQ-01': 'req', 'BQ-02': 'req', 'BQ-04': 'req',
|
|
153
151
|
'BQ-06': 'req', 'BQ-07': 'req',
|
|
154
152
|
'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
153
|
// RD-04 is decomposition *breadth* — an architecture concern, not a requirement one
|
|
159
154
|
'RD-04': 'arch',
|
|
160
155
|
// CR-SM-311: die Untergrenze derselben Breite — ebenfalls Architektur
|
|
@@ -164,7 +159,10 @@ export const RULE_TO_DIMENSION = {
|
|
|
164
159
|
// CR-SM-231: R-29 (Testdatei-Exklusivitaet) gehoert zu 'ver' wie R-19 — beide bewerten die
|
|
165
160
|
// Evidenz-Bindung einer Abnahme, R-19 ihre Praesenz, R-29 ihre Eindeutigkeit.
|
|
166
161
|
'R-29': 'ver',
|
|
167
|
-
'R-22': 'alloc', 'R-23': 'alloc', 'R-26': 'schema', 'R-32': '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
|
|
168
166
|
// Funktionsblock ueberhaupt im Bauplan haengt — dieselbe Dimension wie R-20 (realRef).
|
|
169
167
|
// NICHT 'uc': R-14..R-17 fragen, ob ein Behaelter gefuellt ist;
|
|
170
168
|
// diese beiden fragen von der FUNC aus, ob sie angeschlossen ist.
|
|
@@ -209,7 +207,7 @@ export const RULE_TO_DIMENSION = {
|
|
|
209
207
|
'FM-01': 'req', 'FM-02': 'req', 'FM-03': 'ver',
|
|
210
208
|
// CR-SM-227: analysis-artifact freshness presence — closest topical fit per artifact.
|
|
211
209
|
'AF-01': 'req', 'AF-03': 'req', // ConOps/Assumption-Review: requirements-adjacent judgment work
|
|
212
|
-
'IR-01': 'req', // CR-SM-355: Annahmen-
|
|
210
|
+
'IR-01': 'req', // CR-SM-355/397: die Anforderungen des Annahmen-Reviews existieren — Task-Ausgang von irr
|
|
213
211
|
'AF-02': 'arch', // Trade Study: architecture decision record
|
|
214
212
|
'TR-01': 'arch', // CR-SM-355: Trade-Entscheidung als CR — Task-Ausgang von trade
|
|
215
213
|
'AF-04': 'ver', // FMEA: risk/verification, same bucket as FM-03
|
|
@@ -224,120 +222,60 @@ export const RULE_TO_DIMENSION = {
|
|
|
224
222
|
'CL-01': 'uc',
|
|
225
223
|
};
|
|
226
224
|
// ---------------------------------------------------------------------------
|
|
227
|
-
//
|
|
228
|
-
//
|
|
229
|
-
//
|
|
230
|
-
//
|
|
231
|
-
//
|
|
232
|
-
//
|
|
233
|
-
//
|
|
234
|
-
//
|
|
225
|
+
// Stufen und Marken (CR-SM-395) — die Reihenfolge der Mengen.
|
|
226
|
+
//
|
|
227
|
+
// Jede Regel traegt an ihrer Definition eine STUFE (`RuleDefinition.stage`): die spaeteste Menge,
|
|
228
|
+
// die sie BRAUCHT — nicht der Typ, ueber den sie laeuft (FM-03 laeuft ueber REQ, verlangt aber
|
|
229
|
+
// einen TEST: Stufe 9). Die Stufen ordnen, sie verbieten nichts.
|
|
230
|
+
//
|
|
231
|
+
// Eine MARKE liegt zwischen zwei Stufen und wird aus der Stufe berechnet (`markOfStage`). Es gibt
|
|
232
|
+
// keine zweite Zuordnung: `RULE_TO_PHASE` (CR-SM-226, 67 Handeintraege) ist entfallen, die Marke je
|
|
233
|
+
// Regel steht abgeleitet in `ALL_RULE_DEFS[].mark`.
|
|
235
234
|
// ---------------------------------------------------------------------------
|
|
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;
|
|
235
|
+
/** Die Menge je Stufe, Index = Stufe − 1. */
|
|
236
|
+
export const STAGE_SETS = [
|
|
237
|
+
'System', 'Anwendungsfall', 'Anforderung', 'Wirkkette', 'Funktion', 'Datenfluss', 'Modul',
|
|
238
|
+
'Schema', 'Test', 'Plan', 'Bindung', 'Abgleich',
|
|
239
|
+
];
|
|
240
|
+
/** Die Marken in Reihenfolge. */
|
|
241
|
+
export const Mark = z.enum(['SRR', 'PDR', 'CDR', 'TRR', 'Bau']);
|
|
242
|
+
/** Die letzte Stufe VOR jeder Marke. */
|
|
243
|
+
export const MARK_STAGE = { SRR: 4, PDR: 7, CDR: 8, TRR: 9, Bau: 12 };
|
|
244
|
+
/** Die Marke, hinter der eine Stufe liegt. `'immer'` gehoert keiner einzelnen Marke. */
|
|
245
|
+
export function markOfStage(stage) {
|
|
246
|
+
if (stage === 'immer')
|
|
247
|
+
return null;
|
|
248
|
+
return Mark.options.find((m) => stage <= MARK_STAGE[m]) ?? null;
|
|
309
249
|
}
|
|
310
250
|
/**
|
|
311
|
-
* Die
|
|
251
|
+
* Die Arbeitsschritte (CR-SM-350, gekuerzt CR-SM-395).
|
|
252
|
+
*
|
|
253
|
+
* CR-SM-350 fuehrte je Regel einen Eigentuemer: den KERN (die Schleife, die die Spezifikation baut)
|
|
254
|
+
* oder einen Task (Einsatzkonzept, Fehlerbetrachtung, Plan, Realisierung …), damit der Kern nicht
|
|
255
|
+
* um Detailregeln fremder Artefakte kreist. Das leistet jetzt die FAELLIGKEIT: eine Regel ueber eine
|
|
256
|
+
* Menge, die es noch nicht gibt, schweigt von selbst, und die Stufe ordnet den Rest.
|
|
312
257
|
*
|
|
313
|
-
*
|
|
314
|
-
*
|
|
315
|
-
*
|
|
316
|
-
*
|
|
317
|
-
*
|
|
258
|
+
* - Risiko-Anforderungen (FM-01..03), Auftraege und Meilensteine (CR-R01..03, MS-01..03): keine
|
|
259
|
+
* Elemente, kein Befund.
|
|
260
|
+
* - Variantenvergleich und Annahmen-Review (TR-01, IR-01): melden erst, wenn die Analyse
|
|
261
|
+
* gestempelt ist.
|
|
262
|
+
* - Betriebsarten (CL-01): einzeln geprueft — die Regel laeuft ueber ACTOR, die es im Kern gibt,
|
|
263
|
+
* meldet aber erst, wenn ein UC eine `operatingMode` traegt. Die setzt nur das Einsatzkonzept.
|
|
264
|
+
* - Bindung und Abgleich (Stufen 11 und 12): nicht faellig, bis der Bau eroeffnet ist (`isDue`).
|
|
318
265
|
*
|
|
319
|
-
*
|
|
320
|
-
*
|
|
266
|
+
* Es bleibt EINE Zuordnung, die die Faelligkeit nicht leistet: die Textqualitaet der Anforderungen
|
|
267
|
+
* (BQ-*) meldet an jeder REQ, sobald es eine gibt — sie gehoert einem eigenen Arbeitsschritt.
|
|
268
|
+
* Und es bleibt, welche Regel welche Analyse eroeffnet (`TASK_ENTRY`).
|
|
321
269
|
*/
|
|
322
|
-
export const RULE_TASKS = ['kern', 'conops', 'trade', 'irr', 'fmea', 'plan', 'anforderungsqualitaet'
|
|
323
|
-
/** Die Regeln
|
|
270
|
+
export const RULE_TASKS = ['kern', 'conops', 'trade', 'irr', 'fmea', 'plan', 'anforderungsqualitaet'];
|
|
271
|
+
/** Die Regeln, die ein Arbeitsschritt dem Kern abnimmt. Jede Regel hoechstens einmal — der Test haelt das fest. */
|
|
324
272
|
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.
|
|
273
|
+
// Annahme (CR-SM-350): BQ bekommt einen eigenen Task, ohne automatischen Eintrittspunkt.
|
|
334
274
|
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
275
|
};
|
|
337
276
|
/**
|
|
338
|
-
*
|
|
339
|
-
*
|
|
340
|
-
* (Realisierung: die erste Bindung).
|
|
277
|
+
* Analyse → die Regel, die „diese Analyse fehlt" sagt (ihr Skill steht an der Regelhilfe,
|
|
278
|
+
* `RULE_HELP[…].prompt`). `null` = der Arbeitsschritt wird ausdruecklich gerufen.
|
|
341
279
|
*/
|
|
342
280
|
export const TASK_ENTRY = {
|
|
343
281
|
conops: 'AF-01',
|
|
@@ -346,9 +284,8 @@ export const TASK_ENTRY = {
|
|
|
346
284
|
fmea: 'AF-04',
|
|
347
285
|
plan: 'AF-05',
|
|
348
286
|
anforderungsqualitaet: null,
|
|
349
|
-
realisierung: null,
|
|
350
287
|
};
|
|
351
|
-
const OWNER = new Map(Object.entries(TASK_OWNED_RULES).flatMap(([task, ids]) => ids.map((id) => [id, task])));
|
|
288
|
+
const OWNER = new Map(Object.entries(TASK_OWNED_RULES).flatMap(([task, ids]) => (ids ?? []).map((id) => [id, task])));
|
|
352
289
|
/** Der Eigentuemer einer Regel — der Kern, wenn kein Task sie beansprucht. */
|
|
353
290
|
export function taskOf(ruleId) {
|
|
354
291
|
return OWNER.get(ruleId) ?? 'kern';
|
|
@@ -359,7 +296,7 @@ export function taskOf(ruleId) {
|
|
|
359
296
|
// ---------------------------------------------------------------------------
|
|
360
297
|
/** The 8 RULE_TO_DIMENSION topic scores (req/uc/arch/alloc/ver/schema/cr/ms). */
|
|
361
298
|
export const DIMENSION_READINESS_NAME = 'dimension_readiness';
|
|
362
|
-
/** The
|
|
299
|
+
/** The marks derived from the rule stage (SRR/PDR/CDR/TRR/Bau). */
|
|
363
300
|
export const PHASE_READINESS_NAME = 'phase_readiness';
|
|
364
301
|
/** Best-of-N ranking KPI: candidate dimension_readiness minus baseline. */
|
|
365
302
|
export const DIMENSION_READINESS_DELTA_NAME = 'dimension_readiness_delta';
|
|
@@ -0,0 +1,35 @@
|
|
|
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 BAUAUFTRAG — einen CR mit `status: open`, aus dem Code entsteht? Er muss
|
|
6
|
+
* nicht auf die Elemente zeigen.
|
|
7
|
+
*
|
|
8
|
+
* CR-SM-396 (Entscheidung des Autors 2026-10-06): ein reiner ENTSCHEIDUNGS-CR zaehlt nicht. Der
|
|
9
|
+
* Variantenvergleich haelt sein Ergebnis als CR fest; solange nur solche offen sind, ist nichts
|
|
10
|
+
* beauftragt — der Entwurf bliebe sonst mit dem ersten Variantenvergleich „im Bau" und truege die
|
|
11
|
+
* ganze Bindung als Arbeitsliste. Die uebrigen Analysen hinterlassen gar keinen CR, sondern
|
|
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).
|
|
20
|
+
*/
|
|
21
|
+
export declare function hasOpenOrder(graph: OntologyGraph): boolean;
|
|
22
|
+
/** Ist die Regel an diesem Graphen faellig — ist ihre Menge nicht leer? */
|
|
23
|
+
export declare function isDue(rule: {
|
|
24
|
+
stage: RuleStage;
|
|
25
|
+
domain: readonly string[];
|
|
26
|
+
}, graph: OntologyGraph): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Wickelt das `evaluate` der Regeln, deren Menge nicht ihre `domain` ist (Stufen 11 und 12) — am
|
|
29
|
+
* Katalog, einmal. Die uebrigen Regeln kommen unveraendert (dieselbe Referenz) zurueck.
|
|
30
|
+
*/
|
|
31
|
+
export declare function whenDue<A extends unknown[], R extends {
|
|
32
|
+
stage: RuleStage;
|
|
33
|
+
domain: readonly string[];
|
|
34
|
+
evaluate: (graph: OntologyGraph, ...rest: A) => RuleViolation[];
|
|
35
|
+
}>(rules: readonly R[]): R[];
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* FAELLIGKEIT (CR-SM-395) — der EINE Mechanismus, mit dem eine Regel auf ihren Zeitpunkt wartet.
|
|
3
|
+
*
|
|
4
|
+
* Jede Regel hat eine Menge: die Elemente, die sie prueft. Faellig ist sie, sobald die Menge nicht
|
|
5
|
+
* leer ist. Fuer die Stufen 1 bis 10 ist die Menge die `domain` der Regel — eine Regel ueber eine
|
|
6
|
+
* leere Menge schweigt von selbst, dort ist nichts zu bauen. Fuer die Stufen 11 (Bindung) und 12
|
|
7
|
+
* (Abgleich Modell gegen Code) ist die Menge der BAU: er ist eroeffnet, sobald es einen offenen
|
|
8
|
+
* BAUAUFTRAG gibt (`hasOpenOrder` — ein offener Entscheidungs-CR ist keiner) oder irgendeine
|
|
9
|
+
* Bindung. Vorher ist die Regel NICHT AUSGEWERTET — nicht bestanden.
|
|
10
|
+
*
|
|
11
|
+
* Zwei Leser, eine Funktion:
|
|
12
|
+
* - AUSWERTUNG: `whenDue` wickelt das `evaluate` der Regeln der Stufen 11 und 12 am Katalog
|
|
13
|
+
* (`V3_RULES`, `VIEW_RULES`, `CODE_CONFORMANCE_RULES`). Wer immer die Regel ruft, bekommt das
|
|
14
|
+
* Schweigen — auch ein direkter `rule.evaluate`-Aufruf.
|
|
15
|
+
* - READINESS: wer einen Anteil bildet, fragt `isDue` und laesst eine nicht faellige Regel aus
|
|
16
|
+
* Zaehler UND Nenner — sonst liest sich ihr Schweigen als Erfolg.
|
|
17
|
+
*
|
|
18
|
+
* Ersetzt `RULE_PRECONDITION` / `ruleApplies` / `withPrecondition` / `realizationBegun`
|
|
19
|
+
* (CR-SM-392): dort war „der Bau hat begonnen" eine benannte Vorbedingung an vier Regeln, mit dem
|
|
20
|
+
* Bauplan-Stempel als Ausloeser. Der Stempel wird nicht mehr gelesen; die Fuehrung uebernimmt
|
|
21
|
+
* AF-05 („es gibt Ungebautes, aber keinen offenen Auftrag").
|
|
22
|
+
*/
|
|
23
|
+
import { readRealRef, readTestRefs } from './ontology.js';
|
|
24
|
+
import { toEvaluableGraph } from './flat-graph.js';
|
|
25
|
+
/**
|
|
26
|
+
* Gibt es einen offenen BAUAUFTRAG — einen CR mit `status: open`, aus dem Code entsteht? Er muss
|
|
27
|
+
* nicht auf die Elemente zeigen.
|
|
28
|
+
*
|
|
29
|
+
* CR-SM-396 (Entscheidung des Autors 2026-10-06): ein reiner ENTSCHEIDUNGS-CR zaehlt nicht. Der
|
|
30
|
+
* Variantenvergleich haelt sein Ergebnis als CR fest; solange nur solche offen sind, ist nichts
|
|
31
|
+
* beauftragt — der Entwurf bliebe sonst mit dem ersten Variantenvergleich „im Bau" und truege die
|
|
32
|
+
* ganze Bindung als Arbeitsliste. Die uebrigen Analysen hinterlassen gar keinen CR, sondern
|
|
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).
|
|
41
|
+
*/
|
|
42
|
+
export function hasOpenOrder(graph) {
|
|
43
|
+
const g = toEvaluableGraph(graph);
|
|
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));
|
|
46
|
+
}
|
|
47
|
+
const BUILD_OPEN = new WeakMap();
|
|
48
|
+
/**
|
|
49
|
+
* Ist der Bau eroeffnet? Ein offener Auftrag ODER eine Bindung — ein `realRef` an irgendeinem
|
|
50
|
+
* Element oder `testRefs` an einem TEST. Eine Bindung von Hand, ohne Bauplan, zaehlt genauso.
|
|
51
|
+
* Gezaehlt wird die ANWESENHEIT des Attributs, nicht seine Gueltigkeit: eine ungueltige Bindung
|
|
52
|
+
* (leere Liste, alte Objektform) ist ein Bindungsversuch, und R-19/R-20/R-26 sind die einzigen
|
|
53
|
+
* Regeln, die sie melden — an „gueltig" gebunden schwiegen sie genau dort.
|
|
54
|
+
*
|
|
55
|
+
* Nimmt die flache wie die genestete Form; das Ergebnis haengt an der Graph-Identitaet wie `indexOf`.
|
|
56
|
+
*/
|
|
57
|
+
function buildOpen(graph) {
|
|
58
|
+
const cached = BUILD_OPEN.get(graph);
|
|
59
|
+
if (cached !== undefined)
|
|
60
|
+
return cached;
|
|
61
|
+
const open = hasOpenOrder(graph) ||
|
|
62
|
+
toEvaluableGraph(graph).elements.some((e) => readRealRef(e.attributes).state !== 'absent' ||
|
|
63
|
+
(e.type === 'TEST' && readTestRefs(e.attributes).state !== 'absent'));
|
|
64
|
+
BUILD_OPEN.set(graph, open);
|
|
65
|
+
return open;
|
|
66
|
+
}
|
|
67
|
+
/** Ist die Regel an diesem Graphen faellig — ist ihre Menge nicht leer? */
|
|
68
|
+
export function isDue(rule, graph) {
|
|
69
|
+
if (rule.stage === 11 || rule.stage === 12)
|
|
70
|
+
return buildOpen(graph);
|
|
71
|
+
if (rule.domain.includes('graph'))
|
|
72
|
+
return true;
|
|
73
|
+
return graph.elements.some((e) => rule.domain.includes('all') || rule.domain.includes(e.type));
|
|
74
|
+
}
|
|
75
|
+
/**
|
|
76
|
+
* Wickelt das `evaluate` der Regeln, deren Menge nicht ihre `domain` ist (Stufen 11 und 12) — am
|
|
77
|
+
* Katalog, einmal. Die uebrigen Regeln kommen unveraendert (dieselbe Referenz) zurueck.
|
|
78
|
+
*/
|
|
79
|
+
export function whenDue(rules) {
|
|
80
|
+
return rules.map((rule) => rule.stage === 11 || rule.stage === 12
|
|
81
|
+
? { ...rule, evaluate: (graph, ...rest) => (isDue(rule, graph) ? rule.evaluate(graph, ...rest) : []) }
|
|
82
|
+
: rule);
|
|
83
|
+
}
|
package/dist/se/rule-help.d.ts
CHANGED
|
@@ -31,12 +31,18 @@
|
|
|
31
31
|
* umformulierter Satz darf keinen Major ausloesen, deshalb steht im Golden-File nur die
|
|
32
32
|
* Schluesselmenge, nicht die Prosa.
|
|
33
33
|
*
|
|
34
|
-
* Sprache: Englisch, wie die Regelbeschreibungen selbst
|
|
35
|
-
*
|
|
34
|
+
* Sprache: Englisch, wie die Regelbeschreibungen selbst — ausser `vorschlag`, der Satz, den ein Nutzer
|
|
35
|
+
* seinem Agenten schickt (CR-SM-384): Deutsch, weil er in der Sprache des Nutzers steht, nicht in der
|
|
36
|
+
* des Katalogs. Bis CR-SM-384 lag er als `VORSCHLAG_REGEL` in graphcode, ein paralleler Pfad zu
|
|
37
|
+
* `plain` und `fix_hint` mit derselben Driftgefahr wie oben. Reine Strings — der `./browser`-Eintrag
|
|
38
|
+
* bleibt transitiv `node:`-frei (CR-SM-230), Strings ziehen nichts nach.
|
|
36
39
|
*
|
|
37
40
|
* @author andreas@siglochconsulting
|
|
38
41
|
*/
|
|
39
|
-
/**
|
|
42
|
+
/**
|
|
43
|
+
* Ein verfasster Hilfeeintrag: die zwei Klartext-Schichten, dazu ein Kopier-Prompt, wo einer passt,
|
|
44
|
+
* und — fuer die Regeln des Kern-Fokus — der Vorschlag an den Nutzer.
|
|
45
|
+
*/
|
|
40
46
|
export interface RuleHelpEntry {
|
|
41
47
|
/** Schicht 0 — ohne SE-Jargon; endet mit der EINEN einfachen Handlung. */
|
|
42
48
|
readonly plain: string;
|
|
@@ -44,6 +50,16 @@ export interface RuleHelpEntry {
|
|
|
44
50
|
readonly se: string;
|
|
45
51
|
/** Schicht 2 — ein kopierbarer Prompt (`se:*`-Skill oder MCP-Aufruf), wo einer passt. */
|
|
46
52
|
readonly prompt?: string;
|
|
53
|
+
/**
|
|
54
|
+
* Schicht 3 (CR-SM-384) — der naechste Schritt als Bitte des NUTZERS an seinen Agenten: ein deutscher
|
|
55
|
+
* Satz, Imperativ, `{n}` = die Namen der Fund-Elemente. Keine Werkzeugnamen, keine Regel-IDs, keine
|
|
56
|
+
* Fix-Vorlage — der Nutzer entscheidet, der Agent fuehrt aus (graphcode CR-GC-729/730). Genau an den
|
|
57
|
+
* Regeln, die den Kern-Fokus stellen koennen: Task `kern`, Schwere nicht `info`, kein Eintrittspunkt
|
|
58
|
+
* einer Analyse (die haben ihren eigenen Satz beim Konsumenten). Beidseitig erzwungen im Test.
|
|
59
|
+
* CR-SM-395: seit die Arbeitsschritt-Zuordnung auf die Anforderungsqualitaet gekuerzt ist, sind das
|
|
60
|
+
* auch die Regeln ueber Risiken, Auftraege, Meilensteine, Bindung und Abgleich.
|
|
61
|
+
*/
|
|
62
|
+
readonly vorschlag?: string;
|
|
47
63
|
}
|
|
48
64
|
/**
|
|
49
65
|
* Je Regel-ID der Hilfeeintrag — Katalogregeln (`ALL_RULE_DEFS`) UND Conformance-Regeln
|