@ifc-lite/clash 2.0.0 → 2.1.2

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.
@@ -1 +1 @@
1
- {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/engine-ts/orchestrator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"orchestrator.js","sourceRoot":"","sources":["../../src/engine-ts/orchestrator.ts"],"names":[],"mappings":"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"}
package/dist/index.d.ts CHANGED
@@ -12,12 +12,14 @@ export { matchesSelector } from './selectors.js';
12
12
  export { clashMemberKey, clashMemberSet, inClashSet } from './members.js';
13
13
  export { DISCIPLINES, CLASH_RULE_PRESETS, inferClashSeverity, disciplineMatrixRules, rulesFromPresets, type Discipline, type DisciplineInfo, type ClashRulePreset, } from './disciplines.js';
14
14
  export { createClashEngine, type ClashEngine, type ClashBackend, type CreateClashEngineOptions } from './engine.js';
15
+ export { NonFiniteToleranceError } from './engine-ts/orchestrator.js';
15
16
  export { makeExclusionSet, isExcluded, pairKey, qualifiedKey } from './exclude.js';
16
17
  export { buildTriageSystemPrompt, buildTriageUserMessage, parseTriageResponse, type ClashTriageResult, } from './triage.js';
17
18
  export { groupClashes, isClusterGroupingIneffective, type GroupOptions } from './grouping.js';
18
19
  export { groupDuplicateSets } from './duplicate-sets.js';
19
20
  export { clashReviewKey, aggregateReviewStatus, reviewStatusToBcfTopicStatus, } from './review.js';
20
21
  export { compareClashRuns, type ClashRevisionDiff } from './lifecycle.js';
22
+ export { compareClashRevisions, type ClashRevisionSide, type ClashRevisionComparison, type ClashRevisionReasons, } from './revision.js';
21
23
  export { SEVERITY_RANK, TOUCHING_EPSILON, penetrationDepth, isTouching, sortClashes, summarizeClashes, ruleHadNoMatch, classifyRuleCoverage, describeEmptyRuleSides, type ClashSortBy, type RuleCoverageOutcome, } from './analysis.js';
22
24
  export { findDuplicates, DUPLICATES_RULE, type DuplicateOptions, } from './duplicates.js';
23
25
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACpH,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,eAAe,EACf,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AACzB;;;;;;;GAOG;AACH,OAAO,EACL,YAAY,EACZ,KAAK,QAAQ,GACd,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAIA;;;;;;;;GAQG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,EAChB,KAAK,UAAU,EACf,KAAK,cAAc,EACnB,KAAK,eAAe,GACrB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAE,KAAK,WAAW,EAAE,KAAK,YAAY,EAAE,KAAK,wBAAwB,EAAE,MAAM,aAAa,CAAC;AACpH,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,EACnB,KAAK,iBAAiB,GACvB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAAE,KAAK,iBAAiB,EAAE,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,qBAAqB,EACrB,KAAK,iBAAiB,EACtB,KAAK,uBAAuB,EAC5B,KAAK,oBAAoB,GAC1B,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,EACtB,KAAK,WAAW,EAChB,KAAK,mBAAmB,GACzB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,eAAe,EACf,KAAK,gBAAgB,GACtB,MAAM,iBAAiB,CAAC;AACzB;;;;;;;GAOG;AACH,OAAO,EACL,YAAY,EACZ,KAAK,QAAQ,GACd,MAAM,uBAAuB,CAAC"}
package/dist/index.js CHANGED
@@ -15,12 +15,14 @@ export { matchesSelector } from './selectors.js';
15
15
  export { clashMemberKey, clashMemberSet, inClashSet } from './members.js';
16
16
  export { DISCIPLINES, CLASH_RULE_PRESETS, inferClashSeverity, disciplineMatrixRules, rulesFromPresets, } from './disciplines.js';
17
17
  export { createClashEngine } from './engine.js';
18
+ export { NonFiniteToleranceError } from './engine-ts/orchestrator.js';
18
19
  export { makeExclusionSet, isExcluded, pairKey, qualifiedKey } from './exclude.js';
19
20
  export { buildTriageSystemPrompt, buildTriageUserMessage, parseTriageResponse, } from './triage.js';
20
21
  export { groupClashes, isClusterGroupingIneffective } from './grouping.js';
21
22
  export { groupDuplicateSets } from './duplicate-sets.js';
22
23
  export { clashReviewKey, aggregateReviewStatus, reviewStatusToBcfTopicStatus, } from './review.js';
23
24
  export { compareClashRuns } from './lifecycle.js';
25
+ export { compareClashRevisions, } from './revision.js';
24
26
  export { SEVERITY_RANK, TOUCHING_EPSILON, penetrationDepth, isTouching, sortClashes, summarizeClashes, ruleHadNoMatch, classifyRuleCoverage, describeEmptyRuleSides, } from './analysis.js';
25
27
  export { findDuplicates, DUPLICATES_RULE, } from './duplicates.js';
26
28
  /**
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;GAQG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,GAIjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAsE,MAAM,aAAa,CAAC;AACpH,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAqB,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAA0B,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,GAGvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,eAAe,GAEhB,MAAM,iBAAiB,CAAC;AACzB;;;;;;;GAOG;AACH,OAAO,EACL,YAAY,GAEb,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;GAQG;AAEH,cAAc,YAAY,CAAC;AAC3B,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAC1E,OAAO,EACL,WAAW,EACX,kBAAkB,EAClB,kBAAkB,EAClB,qBAAqB,EACrB,gBAAgB,GAIjB,MAAM,kBAAkB,CAAC;AAC1B,OAAO,EAAE,iBAAiB,EAAsE,MAAM,aAAa,CAAC;AACpH,OAAO,EAAE,uBAAuB,EAAE,MAAM,6BAA6B,CAAC;AACtE,OAAO,EAAE,gBAAgB,EAAE,UAAU,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,cAAc,CAAC;AACnF,OAAO,EACL,uBAAuB,EACvB,sBAAsB,EACtB,mBAAmB,GAEpB,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,YAAY,EAAE,4BAA4B,EAAqB,MAAM,eAAe,CAAC;AAC9F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AACzD,OAAO,EACL,cAAc,EACd,qBAAqB,EACrB,4BAA4B,GAC7B,MAAM,aAAa,CAAC;AACrB,OAAO,EAAE,gBAAgB,EAA0B,MAAM,gBAAgB,CAAC;AAC1E,OAAO,EACL,qBAAqB,GAItB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,aAAa,EACb,gBAAgB,EAChB,gBAAgB,EAChB,UAAU,EACV,WAAW,EACX,gBAAgB,EAChB,cAAc,EACd,oBAAoB,EACpB,sBAAsB,GAGvB,MAAM,eAAe,CAAC;AACvB,OAAO,EACL,cAAc,EACd,eAAe,GAEhB,MAAM,iBAAiB,CAAC;AACzB;;;;;;;GAOG;AACH,OAAO,EACL,YAAY,GAEb,MAAM,uBAAuB,CAAC"}
@@ -1,14 +1,42 @@
1
1
  import type { AABB } from '@ifc-lite/spatial';
2
2
  import type { Mat4, Vec3 } from '../types.js';
3
+ /**
4
+ * Thrown by {@link fromPositions} when every vertex is non-finite on at least
5
+ * one axis, so the axis has nothing finite to bound. Returning the box
6
+ * inverted (`min > max`) on that axis — as older revisions of this function
7
+ * did — is not a safe fallback: `boxesTouch` (`duplicate-metric.ts`) is only
8
+ * reached from the duplicates pass, not from the BVH broad phase
9
+ * (`@ifc-lite/spatial`) that `engine-ts/broad.ts` builds from `ClashElement.
10
+ * bounds`. There, an inverted box fails `min <= queryMax && max >= queryMin`
11
+ * on every query, so the element silently drops out of every spatial query —
12
+ * including the ones that would have found a genuine hard clash (#4254).
13
+ * Callers own the recovery: {@link fromPositions} cannot skip-and-report on
14
+ * its own (it has no element identity), so `step.ts` / `ifcx.ts` catch this,
15
+ * skip the one occurrence, and count+warn — the same shape as their existing
16
+ * `missingGlobalIds` handling — rather than aborting the whole clash run for
17
+ * one corrupt element among many.
18
+ */
19
+ export declare class NonFiniteAxisError extends Error {
20
+ readonly axes: readonly ('x' | 'y' | 'z')[];
21
+ readonly vertexCount: number;
22
+ constructor(axes: readonly ('x' | 'y' | 'z')[], vertexCount: number);
23
+ }
3
24
  /**
4
25
  * Axis-aligned bounds of a packed `[x,y,z,...]` position buffer.
5
26
  *
6
27
  * Non-finite coordinates (NaN and ±Infinity, checked after `transform` is
7
28
  * applied) never become bounds: an infinite bound makes `boxDistance` return
8
- * NaN, and a NaN distance passes every comparison-shaped gate downstream. If
9
- * NO vertex contributes a finite coordinate on an axis, the box is returned
10
- * inverted (`min > max`) on that axis, which is rejected by `boxesTouch`
11
- * rather than silently paired.
29
+ * NaN, and a NaN distance passes every comparison-shaped gate downstream. The
30
+ * finite coordinates of a partly poisoned vertex still count the rule is
31
+ * per coordinate, not per vertex.
32
+ *
33
+ * If NO vertex contributes a finite coordinate on some axis, there is no
34
+ * finite bound to report on that axis at all: this throws
35
+ * {@link NonFiniteAxisError} naming the axis rather than returning the box
36
+ * inverted (`min > max`) on it. An inverted box is not "rejected" anywhere on
37
+ * the path that matters — `@ifc-lite/spatial`'s `BVH.build`/`queryAABB`
38
+ * (reached via `engine-ts/broad.ts`) has no such check, so it would silently
39
+ * make the element invisible to every spatial query instead (#4254).
12
40
  */
13
41
  export declare function fromPositions(positions: Float32Array, transform?: Mat4): AABB;
14
42
  /** Expand bounds by `m` on every side. */
@@ -1 +1 @@
1
- {"version":3,"file":"aabb.d.ts","sourceRoot":"","sources":["../../src/math/aabb.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAY9C;;;;;;;;;GASG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CAoC7E;AAED,0CAA0C;AAC1C,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAEpC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAElD;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAEpD;AAED,mCAAmC;AACnC,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAE9D"}
1
+ {"version":3,"file":"aabb.d.ts","sourceRoot":"","sources":["../../src/math/aabb.ts"],"names":[],"mappings":"AAaA,OAAO,KAAK,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAC9C,OAAO,KAAK,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,aAAa,CAAC;AAY9C;;;;;;;;;;;;;;;GAeG;AACH,qBAAa,kBAAmB,SAAQ,KAAK;IAC3C,QAAQ,CAAC,IAAI,EAAE,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,CAAC;IAC5C,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAEjB,IAAI,EAAE,SAAS,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,CAAC,EAAE,EAAE,WAAW,EAAE,MAAM;CAWpE;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,aAAa,CAAC,SAAS,EAAE,YAAY,EAAE,SAAS,CAAC,EAAE,IAAI,GAAG,IAAI,CA+C7E;AAED,0CAA0C;AAC1C,wBAAgB,OAAO,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,MAAM,GAAG,IAAI,CAEhD;AAED,wBAAgB,MAAM,CAAC,CAAC,EAAE,IAAI,GAAG,IAAI,CAEpC;AAED,wBAAgB,UAAU,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,OAAO,CAEpD;AAED;;;;;GAKG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,MAAM,CAElD;AAED,mFAAmF;AACnF,wBAAgB,aAAa,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAEpD;AAED,mCAAmC;AACnC,wBAAgB,cAAc,CAAC,CAAC,EAAE,IAAI,EAAE,CAAC,EAAE,IAAI,GAAG,IAAI,CAErD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,GAAG,OAAO,CAE9D"}
package/dist/math/aabb.js CHANGED
@@ -10,15 +10,51 @@ function applyMat4(m, x, y, z) {
10
10
  m[2] * x + m[6] * y + m[10] * z + m[14],
11
11
  ];
12
12
  }
13
+ /**
14
+ * Thrown by {@link fromPositions} when every vertex is non-finite on at least
15
+ * one axis, so the axis has nothing finite to bound. Returning the box
16
+ * inverted (`min > max`) on that axis — as older revisions of this function
17
+ * did — is not a safe fallback: `boxesTouch` (`duplicate-metric.ts`) is only
18
+ * reached from the duplicates pass, not from the BVH broad phase
19
+ * (`@ifc-lite/spatial`) that `engine-ts/broad.ts` builds from `ClashElement.
20
+ * bounds`. There, an inverted box fails `min <= queryMax && max >= queryMin`
21
+ * on every query, so the element silently drops out of every spatial query —
22
+ * including the ones that would have found a genuine hard clash (#4254).
23
+ * Callers own the recovery: {@link fromPositions} cannot skip-and-report on
24
+ * its own (it has no element identity), so `step.ts` / `ifcx.ts` catch this,
25
+ * skip the one occurrence, and count+warn — the same shape as their existing
26
+ * `missingGlobalIds` handling — rather than aborting the whole clash run for
27
+ * one corrupt element among many.
28
+ */
29
+ export class NonFiniteAxisError extends Error {
30
+ axes;
31
+ vertexCount;
32
+ constructor(axes, vertexCount) {
33
+ super(`fromPositions: every vertex is non-finite on axis ${axes.join(', ')} ` +
34
+ `(${vertexCount} vertices scanned) — refusing to return an inverted ` +
35
+ `(min > max) box, which would silently drop this geometry from every ` +
36
+ `spatial query`);
37
+ this.name = 'NonFiniteAxisError';
38
+ this.axes = axes;
39
+ this.vertexCount = vertexCount;
40
+ }
41
+ }
13
42
  /**
14
43
  * Axis-aligned bounds of a packed `[x,y,z,...]` position buffer.
15
44
  *
16
45
  * Non-finite coordinates (NaN and ±Infinity, checked after `transform` is
17
46
  * applied) never become bounds: an infinite bound makes `boxDistance` return
18
- * NaN, and a NaN distance passes every comparison-shaped gate downstream. If
19
- * NO vertex contributes a finite coordinate on an axis, the box is returned
20
- * inverted (`min > max`) on that axis, which is rejected by `boxesTouch`
21
- * rather than silently paired.
47
+ * NaN, and a NaN distance passes every comparison-shaped gate downstream. The
48
+ * finite coordinates of a partly poisoned vertex still count the rule is
49
+ * per coordinate, not per vertex.
50
+ *
51
+ * If NO vertex contributes a finite coordinate on some axis, there is no
52
+ * finite bound to report on that axis at all: this throws
53
+ * {@link NonFiniteAxisError} naming the axis rather than returning the box
54
+ * inverted (`min > max`) on it. An inverted box is not "rejected" anywhere on
55
+ * the path that matters — `@ifc-lite/spatial`'s `BVH.build`/`queryAABB`
56
+ * (reached via `engine-ts/broad.ts`) has no such check, so it would silently
57
+ * make the element invisible to every spatial query instead (#4254).
22
58
  */
23
59
  export function fromPositions(positions, transform) {
24
60
  if (positions.length < 3) {
@@ -61,6 +97,20 @@ export function fromPositions(positions, transform) {
61
97
  maxZ = z;
62
98
  }
63
99
  }
100
+ // minX/maxX (etc.) only ever move together: the first finite coordinate
101
+ // seen on an axis sets both `< minX` and `> maxX` against itself, so a
102
+ // sentinel still sitting at ±Infinity here means NOT ONE vertex contributed
103
+ // a finite value on that axis — checking `min` alone is exhaustive.
104
+ const badAxes = [];
105
+ if (minX === Infinity)
106
+ badAxes.push('x');
107
+ if (minY === Infinity)
108
+ badAxes.push('y');
109
+ if (minZ === Infinity)
110
+ badAxes.push('z');
111
+ if (badAxes.length > 0) {
112
+ throw new NonFiniteAxisError(badAxes, Math.floor(positions.length / 3));
113
+ }
64
114
  return { min: [minX, minY, minZ], max: [maxX, maxY, maxZ] };
65
115
  }
66
116
  /** Expand bounds by `m` on every side. */
@@ -1 +1 @@
1
- {"version":3,"file":"aabb.js","sourceRoot":"","sources":["../../src/math/aabb.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"aabb.js","sourceRoot":"","sources":["../../src/math/aabb.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,68 @@
1
+ import type { Clash, ClashResult } from './types.js';
2
+ /**
3
+ * One side of a revision comparison: a completed run plus the durable
4
+ * identity of every model it drew elements from.
5
+ *
6
+ * `ClashElementRef.model` (carried on `Clash.a`/`Clash.b`) is the federation's
7
+ * per-LOAD id — `crypto.randomUUID()` in the viewer — so it is deliberately
8
+ * useless for asking "is this model still part of the comparison". `modelNames`
9
+ * is the caller-supplied bridge: a map from that ephemeral id, AS IT APPEARS ON
10
+ * THIS RESULT'S OWN CLASHES, to a durable identity (the model's display name /
11
+ * filename in the viewer). Two different `model` ids that map to the same name
12
+ * are treated as the same model reloaded; a name present in `previous` but
13
+ * absent from `next` is treated as a model the comparison lost entirely.
14
+ *
15
+ * This is a heuristic, not a proof: renaming a model between runs makes it
16
+ * look "missing" (its old name has no counterpart), and two distinctly loaded
17
+ * files that happen to share a display name look like one. Both failure modes
18
+ * point the same way — toward `unretested` rather than a wrongly-confident
19
+ * `resolved` — which is the direction this module exists to be safe in.
20
+ */
21
+ export interface ClashRevisionSide {
22
+ result: ClashResult;
23
+ /** Ephemeral `ClashElementRef.model` id → durable display identity. */
24
+ modelNames: Readonly<Record<string, string>>;
25
+ }
26
+ export interface ClashRevisionReasons {
27
+ /** Rule ids the baseline ran that the current run's `rulesRun` omits entirely. */
28
+ skippedRuleIds: string[];
29
+ /** Rule ids the current run ran but whose coverage matched 0 elements on a
30
+ * side (`ruleHadNoMatch`) — it ran, but compared nothing. */
31
+ noMatchRuleIds: string[];
32
+ /** Durable model names present in the baseline that have no counterpart
33
+ * (by name) among the current run's models. */
34
+ missingModelNames: string[];
35
+ }
36
+ export interface ClashRevisionComparison {
37
+ /** In the current run, not the baseline: new issues. */
38
+ added: Clash[];
39
+ /** In both runs: still open. Carries the current run's `Clash`. */
40
+ persistent: Clash[];
41
+ /** In the baseline, not the current run, AND safe to call fixed: every rule
42
+ * and model the clash depended on was genuinely re-checked. */
43
+ resolved: Clash[];
44
+ /** In the baseline, not the current run, but NOT safe to call fixed: the
45
+ * current run could not have found it even if it still existed (a skipped
46
+ * rule, an empty-match rule, or a model no longer in the comparison). Never
47
+ * silently folded into `resolved`. */
48
+ unretested: Clash[];
49
+ /** Why each `unretested` clash landed there, for a coordinator's UI banner. */
50
+ reasons: ClashRevisionReasons;
51
+ summary: {
52
+ added: number;
53
+ persistent: number;
54
+ resolved: number;
55
+ unretested: number;
56
+ };
57
+ }
58
+ /**
59
+ * Compare a saved baseline run to a current run, safely.
60
+ *
61
+ * Pure and deterministic: depends only on the two inputs. `resolved` only
62
+ * receives a clash whose rule ran (with real matches on both sides) in the
63
+ * current run AND whose two models both still have a same-named counterpart
64
+ * there — everything else that `compareClashRuns` would have called
65
+ * `resolved` moves to `unretested` instead.
66
+ */
67
+ export declare function compareClashRevisions(previous: ClashRevisionSide, next: ClashRevisionSide): ClashRevisionComparison;
68
+ //# sourceMappingURL=revision.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision.d.ts","sourceRoot":"","sources":["../src/revision.ts"],"names":[],"mappings":"AAqDA,OAAO,KAAK,EAAE,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAErD;;;;;;;;;;;;;;;;;;GAkBG;AACH,MAAM,WAAW,iBAAiB;IAChC,MAAM,EAAE,WAAW,CAAC;IACpB,uEAAuE;IACvE,UAAU,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CAC9C;AAED,MAAM,WAAW,oBAAoB;IACnC,kFAAkF;IAClF,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;kEAC8D;IAC9D,cAAc,EAAE,MAAM,EAAE,CAAC;IACzB;oDACgD;IAChD,iBAAiB,EAAE,MAAM,EAAE,CAAC;CAC7B;AAED,MAAM,WAAW,uBAAuB;IACtC,wDAAwD;IACxD,KAAK,EAAE,KAAK,EAAE,CAAC;IACf,mEAAmE;IACnE,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB;oEACgE;IAChE,QAAQ,EAAE,KAAK,EAAE,CAAC;IAClB;;;2CAGuC;IACvC,UAAU,EAAE,KAAK,EAAE,CAAC;IACpB,+EAA+E;IAC/E,OAAO,EAAE,oBAAoB,CAAC;IAC9B,OAAO,EAAE;QAAE,KAAK,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAA;KAAE,CAAC;CACtF;AAkGD;;;;;;;;GAQG;AACH,wBAAgB,qBAAqB,CACnC,QAAQ,EAAE,iBAAiB,EAC3B,IAAI,EAAE,iBAAiB,GACtB,uBAAuB,CAoEzB"}
@@ -0,0 +1,208 @@
1
+ /* This Source Code Form is subject to the terms of the Mozilla Public
2
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
3
+ * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4
+ /**
5
+ * The safety layer around `compareClashRuns` for a coordinator-facing
6
+ * "compare this run to a saved baseline" feature (#3928).
7
+ *
8
+ * `compareClashRuns` (lifecycle.ts) answers one narrow question — given two
9
+ * `ClashResult`s, which review keys appear in which — and it answers it well
10
+ * (see its own module doc for the model-re-mint handling). It does NOT know
11
+ * anything about the run's *conditions*: whether the same rules were run,
12
+ * whether a rule's selectors matched anything, or whether every model the
13
+ * baseline drew clashes from is still part of the comparison. A caller that
14
+ * feeds it two runs blindly can turn any of those into a false "resolved":
15
+ *
16
+ * - Drop a rule from the matrix between runs (a scope change) and every one of
17
+ * its previous clashes reads as fixed — nobody re-checked them, the rule
18
+ * simply didn't run.
19
+ * - A rule whose selector now matches zero elements on one side (renamed
20
+ * discipline, wrong model loaded) "ran" but compared nothing, so its
21
+ * previous clashes read as fixed for the same reason.
22
+ * - Unload one of the two models a clash spans and its elements vanish from
23
+ * `next.clashes` entirely — indistinguishable, at the `ClashResult` level,
24
+ * from the clash having been genuinely fixed.
25
+ *
26
+ * `compareClashRevisions` wraps `compareClashRuns` and reclassifies any
27
+ * `resolved` clash caught by one of those three conditions into a fourth
28
+ * bucket, `unretested`, so a coordinator is told "we don't know" instead of
29
+ * "fixed". Only `resolved` is at risk — `added` and `persistent` both assert
30
+ * a clash EXISTS in `next`, which the geometry backs directly; `resolved`
31
+ * asserts an ABSENCE, which a run can manufacture for reasons that have
32
+ * nothing to do with the model getting better.
33
+ *
34
+ * The condition-level checks above reason at RULE/MODEL granularity, but
35
+ * clash identity is per-ELEMENT. A rule can keep matching non-zero elements
36
+ * on both sides while silently dropping the ONE element a specific baseline
37
+ * clash depended on (a narrowed selector, or a re-scoped `membersA`/`membersB`
38
+ * filter) — invisible to a count-only coverage check. And a durable key can
39
+ * vanish entirely between exports (a re-minted GlobalId) — `compareClashRuns`
40
+ * correctly can't match old to new, so it reports a `resolved` half and an
41
+ * `added` half for what is really one still-live clash. Both cases are the
42
+ * SAME question in disguise: "was this clash's specific element actually
43
+ * re-examined in `next`, under this same rule?" — so `elementsReexamined`
44
+ * below answers that directly from `ruleCoverage[].matchedKeysA/B` (the
45
+ * durable keys the current run's rule actually matched), rather than from the
46
+ * coarser rule/model conditions. A rule with no tracked keys (an older result,
47
+ * or a hand-built fixture) cannot be verified and is treated as unsafe — the
48
+ * fail-safe direction this whole module exists to take.
49
+ */
50
+ import { ruleHadNoMatch } from './analysis.js';
51
+ import { compareClashRuns } from './lifecycle.js';
52
+ function ruleIdSet(result) {
53
+ return new Set(result.rulesRun.map((rule) => rule.id));
54
+ }
55
+ /** Rule ids in `result.ruleCoverage` whose selectors matched 0 elements on a
56
+ * side — the rule ran but compared nothing. Absent coverage (a result from
57
+ * before #… or a hand-built fixture) yields an empty set, never a crash. */
58
+ function noMatchRuleIdSet(result) {
59
+ const ids = new Set();
60
+ for (const coverage of result.ruleCoverage ?? []) {
61
+ if (ruleHadNoMatch(coverage))
62
+ ids.add(coverage.rule);
63
+ }
64
+ return ids;
65
+ }
66
+ /**
67
+ * Per rule id, the sets of durable keys the CURRENT run's rule actually
68
+ * matched, one set per side — element-level membership, not a count. A rule
69
+ * id is deliberately absent from the returned map (rather than mapped to an
70
+ * empty set) whenever it cannot be verified: the rule didn't run this time
71
+ * (dropped from `ruleCoverage` entirely), or the coverage entry predates
72
+ * key-tracking (`matchedKeysA` undefined — an older result or a hand-built
73
+ * fixture). Callers must read "absent" as "unknown", never as "matched
74
+ * nothing" — see `elementsReexamined`.
75
+ */
76
+ function ruleMatchedKeys(result) {
77
+ const map = new Map();
78
+ for (const coverage of result.ruleCoverage ?? []) {
79
+ if (coverage.matchedKeysA === undefined)
80
+ continue; // untracked: leave unmapped, not empty
81
+ const sideA = new Set(coverage.matchedKeysA);
82
+ const sideB = coverage.matchedKeysB === null ? null : new Set(coverage.matchedKeysB);
83
+ map.set(coverage.rule, { sideA, sideB });
84
+ }
85
+ return map;
86
+ }
87
+ /**
88
+ * Whether a clash's two elements are confirmed, by durable key, to still be
89
+ * matched by this SAME rule in the current run, in the roles the ORCHESTRATOR
90
+ * (`engine-ts/orchestrator.ts`) actually assigns them.
91
+ *
92
+ * Role-qualified, not order-independent, for a two-sided rule: `groupA`/
93
+ * `groupB` there are resolved once from `rule.a`/`membersA` and `rule.b`/
94
+ * `membersB`, and the broad phase only ever pairs `groupA[i] x groupB[j]` — a
95
+ * `NarrowRecord`'s `a` is always a global index drawn from `groupA`, `b`
96
+ * always from `groupB` (`broad.ts`). So `clash.a` is always "the element that
97
+ * matched side A" and `clash.b` always "the element that matched side B" for
98
+ * that rule, even when the two member sets overlap (the same physical element
99
+ * can appear as `a` in one clash instance and `b` in another, but never both
100
+ * within ONE clash record). Requiring the opposite assignment to also count
101
+ * would let a wall that moved from role A to role B alone — with its actual
102
+ * former partner never re-paired against it — read as "still matched",
103
+ * exactly the false `resolved` this module exists to prevent (the
104
+ * `matchedKeysA`/`matchedKeysB` union this replaces made precisely that
105
+ * mistake).
106
+ *
107
+ * `clashReviewKey` (review.ts) is order-independent, but that is a statement
108
+ * about MATCHING two `Clash` records across runs as "the same real-world
109
+ * clash" (so a and b can be seen in either order there without losing the
110
+ * pairing) — it says nothing about whether a role SWAP within one clash
111
+ * instance is safe to treat as "re-examined". It is not, here: the roles are
112
+ * fixed by the rule's own selector/membership resolution, not interchangeable.
113
+ *
114
+ * For a self-clash rule (`sideB === null`, no `b` side at all: `a` and `b` on
115
+ * such a clash are just two members of the one group, symmetric by
116
+ * construction), both elements are checked against the single set.
117
+ */
118
+ function elementsReexamined(clash, matchedKeys) {
119
+ const keys = matchedKeys.get(clash.rule);
120
+ if (!keys)
121
+ return false;
122
+ if (keys.sideB === null)
123
+ return keys.sideA.has(clash.a.key) && keys.sideA.has(clash.b.key);
124
+ return keys.sideA.has(clash.a.key) && keys.sideB.has(clash.b.key);
125
+ }
126
+ /** How many distinct model ids share each display name — a plain `Set` of
127
+ * names cannot tell "this name still has a model" from "this name has a
128
+ * DIFFERENT model than before", which is exactly what two same-named models
129
+ * (a common federation setup: several disciplines all exported as
130
+ * `mep.ifc`-style filenames) needs. */
131
+ function nameCounts(modelNames) {
132
+ const counts = new Map();
133
+ for (const name of Object.values(modelNames))
134
+ counts.set(name, (counts.get(name) ?? 0) + 1);
135
+ return counts;
136
+ }
137
+ /**
138
+ * Compare a saved baseline run to a current run, safely.
139
+ *
140
+ * Pure and deterministic: depends only on the two inputs. `resolved` only
141
+ * receives a clash whose rule ran (with real matches on both sides) in the
142
+ * current run AND whose two models both still have a same-named counterpart
143
+ * there — everything else that `compareClashRuns` would have called
144
+ * `resolved` moves to `unretested` instead.
145
+ */
146
+ export function compareClashRevisions(previous, next) {
147
+ const diff = compareClashRuns(previous.result, next.result);
148
+ const previousRuleIds = ruleIdSet(previous.result);
149
+ const nextRuleIds = ruleIdSet(next.result);
150
+ const skippedRuleIds = [...previousRuleIds].filter((id) => !nextRuleIds.has(id)).sort();
151
+ const noMatch = noMatchRuleIdSet(next.result);
152
+ const matchedKeys = ruleMatchedKeys(next.result);
153
+ // A name's count DROPPING between runs means at least one model under it is
154
+ // genuinely gone, and — because two models sharing a name are otherwise
155
+ // indistinguishable by anything this module is given — WHICH one cannot be
156
+ // known. Every previous model under that name is therefore treated as lost,
157
+ // which over-flags the survivor(s) too (a false `unretested`, the safe
158
+ // direction) rather than risk crediting a genuinely-gone model's clash as
159
+ // `resolved` (a false confirmation, the direction this module exists to
160
+ // prevent). A name whose count held steady or grew is NOT flagged: every
161
+ // previous model under it still has as many same-named counterparts as
162
+ // before, which is the best this heuristic can say without a firmer signal
163
+ // (content or size — see #3945's federation matcher for that fuller sense
164
+ // of "identity", not available here from a bare id→name map).
165
+ const previousCounts = nameCounts(previous.modelNames);
166
+ const nextCounts = nameCounts(next.modelNames);
167
+ const missingModelNames = [...previousCounts.keys()]
168
+ .filter((name) => (nextCounts.get(name) ?? 0) < (previousCounts.get(name) ?? 0))
169
+ .sort();
170
+ const missing = new Set(missingModelNames);
171
+ /** A previous-run model id is "lost" if it maps to a name whose count
172
+ * dropped in the current run. An id `previous.modelNames` never named is
173
+ * not lost — it just means the caller gave us nothing to say about it, and
174
+ * "unknown" must never manufacture a false confirmation either, so such a
175
+ * clash is left to the element-level check below. */
176
+ const modelLost = (modelId) => {
177
+ const name = previous.modelNames[modelId];
178
+ return name !== undefined && missing.has(name);
179
+ };
180
+ const resolved = [];
181
+ const unretested = [];
182
+ for (const clash of diff.resolved) {
183
+ const unsafe = skippedRuleIds.includes(clash.rule) ||
184
+ noMatch.has(clash.rule) ||
185
+ modelLost(clash.a.model) ||
186
+ modelLost(clash.b.model) ||
187
+ !elementsReexamined(clash, matchedKeys);
188
+ (unsafe ? unretested : resolved).push(clash);
189
+ }
190
+ return {
191
+ added: diff.added,
192
+ persistent: diff.persistent,
193
+ resolved,
194
+ unretested,
195
+ reasons: {
196
+ skippedRuleIds,
197
+ noMatchRuleIds: [...noMatch].sort(),
198
+ missingModelNames,
199
+ },
200
+ summary: {
201
+ added: diff.added.length,
202
+ persistent: diff.persistent.length,
203
+ resolved: resolved.length,
204
+ unretested: unretested.length,
205
+ },
206
+ };
207
+ }
208
+ //# sourceMappingURL=revision.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision.js","sourceRoot":"","sources":["../src/revision.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAE/D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6CG;AAEH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAyDlD,SAAS,SAAS,CAAC,MAAmB;IACpC,OAAO,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;AACzD,CAAC;AAED;;6EAE6E;AAC7E,SAAS,gBAAgB,CAAC,MAAmB;IAC3C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAU,CAAC;IAC9B,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QACjD,IAAI,cAAc,CAAC,QAAQ,CAAC;YAAE,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC;IACvD,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAaD;;;;;;;;;GASG;AACH,SAAS,eAAe,CAAC,MAAmB;IAC1C,MAAM,GAAG,GAAG,IAAI,GAAG,EAAoB,CAAC;IACxC,KAAK,MAAM,QAAQ,IAAI,MAAM,CAAC,YAAY,IAAI,EAAE,EAAE,CAAC;QACjD,IAAI,QAAQ,CAAC,YAAY,KAAK,SAAS;YAAE,SAAS,CAAC,uCAAuC;QAC1F,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,KAAK,GAAG,QAAQ,CAAC,YAAY,KAAK,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;QACrF,GAAG,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;IAC3C,CAAC;IACD,OAAO,GAAG,CAAC;AACb,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA8BG;AACH,SAAS,kBAAkB,CAAC,KAAY,EAAE,WAAkC;IAC1E,MAAM,IAAI,GAAG,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACzC,IAAI,CAAC,IAAI;QAAE,OAAO,KAAK,CAAC;IACxB,IAAI,IAAI,CAAC,KAAK,KAAK,IAAI;QAAE,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;IAC3F,OAAO,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AACpE,CAAC;AAED;;;;wCAIwC;AACxC,SAAS,UAAU,CAAC,UAA4C;IAC9D,MAAM,MAAM,GAAG,IAAI,GAAG,EAAkB,CAAC;IACzC,KAAK,MAAM,IAAI,IAAI,MAAM,CAAC,MAAM,CAAC,UAAU,CAAC;QAAE,MAAM,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;IAC5F,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;;;;;;GAQG;AACH,MAAM,UAAU,qBAAqB,CACnC,QAA2B,EAC3B,IAAuB;IAEvB,MAAM,IAAI,GAAG,gBAAgB,CAAC,QAAQ,CAAC,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC;IAE5D,MAAM,eAAe,GAAG,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IACnD,MAAM,WAAW,GAAG,SAAS,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC3C,MAAM,cAAc,GAAG,CAAC,GAAG,eAAe,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,CAAC,WAAW,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAExF,MAAM,OAAO,GAAG,gBAAgB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAC9C,MAAM,WAAW,GAAG,eAAe,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;IAEjD,4EAA4E;IAC5E,wEAAwE;IACxE,2EAA2E;IAC3E,4EAA4E;IAC5E,uEAAuE;IACvE,0EAA0E;IAC1E,wEAAwE;IACxE,yEAAyE;IACzE,uEAAuE;IACvE,2EAA2E;IAC3E,0EAA0E;IAC1E,8DAA8D;IAC9D,MAAM,cAAc,GAAG,UAAU,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAC;IACvD,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IAC/C,MAAM,iBAAiB,GAAG,CAAC,GAAG,cAAc,CAAC,IAAI,EAAE,CAAC;SACjD,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,GAAG,CAAC,cAAc,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC;SAC/E,IAAI,EAAE,CAAC;IACV,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,iBAAiB,CAAC,CAAC;IAE3C;;;;0DAIsD;IACtD,MAAM,SAAS,GAAG,CAAC,OAAe,EAAW,EAAE;QAC7C,MAAM,IAAI,GAAG,QAAQ,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC;QAC1C,OAAO,IAAI,KAAK,SAAS,IAAI,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACjD,CAAC,CAAC;IAEF,MAAM,QAAQ,GAAY,EAAE,CAAC;IAC7B,MAAM,UAAU,GAAY,EAAE,CAAC;IAC/B,KAAK,MAAM,KAAK,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;QAClC,MAAM,MAAM,GACV,cAAc,CAAC,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;YACnC,OAAO,CAAC,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC;YACvB,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YACxB,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;YACxB,CAAC,kBAAkB,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;QAC1C,CAAC,MAAM,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAC/C,CAAC;IAED,OAAO;QACL,KAAK,EAAE,IAAI,CAAC,KAAK;QACjB,UAAU,EAAE,IAAI,CAAC,UAAU;QAC3B,QAAQ;QACR,UAAU;QACV,OAAO,EAAE;YACP,cAAc;YACd,cAAc,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,IAAI,EAAE;YACnC,iBAAiB;SAClB;QACD,OAAO,EAAE;YACP,KAAK,EAAE,IAAI,CAAC,KAAK,CAAC,MAAM;YACxB,UAAU,EAAE,IAAI,CAAC,UAAU,CAAC,MAAM;YAClC,QAAQ,EAAE,QAAQ,CAAC,MAAM;YACzB,UAAU,EAAE,UAAU,CAAC,MAAM;SAC9B;KACF,CAAC;AACJ,CAAC"}
package/dist/types.d.ts CHANGED
@@ -219,6 +219,44 @@ export interface ClashRuleCoverage {
219
219
  */
220
220
  fromMembersA?: boolean;
221
221
  fromMembersB?: boolean;
222
+ /**
223
+ * The durable `key` (IfcGUID / USD prim path) of every element THIS rule
224
+ * matched on each side, deduplicated and sorted for determinism — not just
225
+ * a count. `compareClashRevisions` (revision.ts) needs this to ask "was
226
+ * this SPECIFIC element re-examined?", which `matchedA`/`matchedB` (counts
227
+ * only) cannot answer: a narrowed selector that drops one previously-
228
+ * matched element while keeping the total count non-zero is invisible to a
229
+ * count-only check. `matchedKeysB` mirrors `matchedB`'s `null` for a
230
+ * self-clash rule (no `b` side). Absent (not just empty) on a result
231
+ * recorded before this existed, or from a hand-built fixture — callers
232
+ * MUST treat an absent `matchedKeysA` as "cannot verify", never as "matched
233
+ * nothing".
234
+ */
235
+ matchedKeysA?: readonly string[];
236
+ matchedKeysB?: readonly string[] | null;
237
+ /**
238
+ * Broad-phase candidate pairs the geometry kernel actually narrow-phase
239
+ * tested for THIS rule (`RuleDetection.candidatesProcessed` in
240
+ * `engine-ts/kernel.ts`), surfaced here so a caller can tell "matched
241
+ * elements on both sides AND compared some of them" apart from "matched
242
+ * elements on both sides but the broad phase found nothing worth testing".
243
+ * `matchedA`/`matchedB` alone cannot make that distinction — they are
244
+ * selector-match counts taken before any geometry runs, so they read as
245
+ * full coverage even when the broad phase (BVH margin query) ends up
246
+ * empty (#4244).
247
+ *
248
+ * `0` here is NOT on its own evidence of a problem: two selected groups
249
+ * that are genuinely far apart (further than the rule's tolerance/
250
+ * clearance margin) legitimately produce zero candidate pairs and a real
251
+ * `'clean'` result — that is the ordinary, correct outcome for a rule
252
+ * whose matched elements never come close to touching. `classifyRuleCoverage`
253
+ * does not treat this field as a coverage signal for exactly that reason;
254
+ * it exists as a diagnostic a caller can inspect when a `'clean'` result
255
+ * looks suspicious for other reasons (e.g. a much larger selector match
256
+ * count than expected), not as an automatic verdict. Absent on a result
257
+ * recorded before this field existed, or from a hand-built fixture.
258
+ */
259
+ candidatesExamined?: number;
222
260
  }
223
261
  export interface ClashResult {
224
262
  clashes: Clash[];
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAyM/D,sEAAsE;AACtE,MAAM,CAAC,MAAM,qBAAqB,GAAiC,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAEpG,iEAAiE;AACjE,MAAM,CAAC,MAAM,2BAA2B,GAAsB,MAAM,CAAC;AAuErE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,SAAS,EAAE,KAAK;IAChB,oBAAoB,EAAE,IAAI;CAClB,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;+DAE+D;AAyM/D,sEAAsE;AACtE,MAAM,CAAC,MAAM,qBAAqB,GAAiC,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,CAAC;AAEpG,iEAAiE;AACjE,MAAM,CAAC,MAAM,2BAA2B,GAAsB,MAAM,CAAC;AA6GrE,MAAM,CAAC,MAAM,sBAAsB,GAAG;IACpC,SAAS,EAAE,KAAK;IAChB,oBAAoB,EAAE,IAAI;CAClB,CAAC"}