@sigloch/se-engine 1.7.0 → 1.7.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -34,7 +34,7 @@
34
34
  * Element-Erzeugung braucht (FCHAIN, REQ-Pre/Postcondition, TEST), sind mit
35
35
  * additiven Kanten prinzipiell nicht ausdrückbar — bewusst kein Template.
36
36
  */
37
- import { isValidTrace, BOUNDED_PATTERNS, REQUIRED_PATTERNS, maxOccurs, schemaSimilarity } from '@sigloch/contracts/se';
37
+ import { isValidTrace, flowProducers, BOUNDED_PATTERNS, REQUIRED_PATTERNS, maxOccurs, schemaSimilarity } from '@sigloch/contracts/se';
38
38
  function byId(g, id) {
39
39
  return g.elements.find((e) => e.id === id);
40
40
  }
@@ -139,6 +139,28 @@ function relationToMentioned(types) {
139
139
  * von mehreren" wäre geraten — und ein falsch alloziertes FUNC verfälscht
140
140
  * `coherence`/`modifiability`, also genau die Zahlen, auf denen das Ranking sitzt.
141
141
  */
142
+ /**
143
+ * Der vierte Waechter: wuerde diese Kante einen ZWEITEN Produzenten an einen FLOW haengen?
144
+ * (CR-SM-347)
145
+ *
146
+ * `isValidTrace` prueft die Grammatik, `retireFor` die Obergrenze aus `BOUNDED_PATTERNS` —
147
+ * IO-02 faellt durch beide: die vier io-Zeilen tragen kein `cardinality`-Feld, und
148
+ * Kardinalitaet begrenzt ohnehin die QUELL-, nicht die ZIEL-Seite. Ohne diesen Riegel schlug
149
+ * die R-31-Vorlage im Release 1.7.0 eine Kante vor, die das Gate mit `IO-02:error` abwies.
150
+ * Dieselbe Klasse wie der kinds-Riegel aus CR-SM-342, nur fuer eine Mengen- statt einer
151
+ * Grammatikregel.
152
+ *
153
+ * Das Praedikat kommt AUS der Regel (`flowProducers` in contracts), nicht aus einem Nachbau
154
+ * hier — zwei Fassungen derselben Mengenfrage waeren die zweite Wahrheit aus CR-SM-286/-302.
155
+ * Nur die Produzentenrichtung ist begrenzt: `FLOW -io-> FUNC` (ein weiterer Leser) bleibt
156
+ * frei, das ist die normale 1:n-Form.
157
+ */
158
+ function wuerdeZweitenProduzentenSchaffen(g, source, target, traceType) {
159
+ if (traceType !== 'io' || target.type !== 'FLOW')
160
+ return false;
161
+ const producers = flowProducers(g).get(target.id);
162
+ return !!producers && producers.size >= 1 && !producers.has(source.id);
163
+ }
142
164
  function edgeToMentioned(opts) {
143
165
  return (v, g) => {
144
166
  const el = byId(g, v.element_id);
@@ -164,6 +186,8 @@ function edgeToMentioned(opts) {
164
186
  // entscheidet, ob der Edit ein Anhängen (kein retire), ein Umhängen
165
187
  // (genau ein retire) oder nicht ausdrückbar ist ('blocked' → nächster
166
188
  // Kandidat; Option C statt eines Edits, den das Gate sicher abweist).
189
+ if (wuerdeZweitenProduzentenSchaffen(g, source, target, opts.traceType))
190
+ continue;
167
191
  const retire = retireFor(g, source, target, opts.traceType);
168
192
  if (retire === 'blocked')
169
193
  continue;
@@ -227,6 +251,8 @@ function edgeToCandidate(opts) {
227
251
  sourceKinds: source.kinds, targetKinds: target.kinds,
228
252
  }))
229
253
  continue;
254
+ if (wuerdeZweitenProduzentenSchaffen(g, source, target, opts.traceType))
255
+ continue;
230
256
  const retire = retireFor(g, source, target, opts.traceType);
231
257
  if (retire === 'blocked')
232
258
  continue;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sigloch/se-engine",
3
- "version": "1.7.0",
3
+ "version": "1.7.1",
4
4
  "type": "module",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
@@ -42,9 +42,9 @@
42
42
  "access": "public"
43
43
  },
44
44
  "peerDependencies": {
45
- "@sigloch/contracts": ">=10 <11"
45
+ "@sigloch/contracts": ">=10.8 <11"
46
46
  },
47
47
  "devDependencies": {
48
- "@sigloch/contracts": ">=10 <11"
48
+ "@sigloch/contracts": ">=10.8 <11"
49
49
  }
50
50
  }