@modernrelay/orbit-core 0.13.6 → 0.14.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/index.js CHANGED
@@ -1,5 +1,5 @@
1
- import { DIAGNOSTIC_SAMPLE_CAP, encodeStringTable, collectTransfers, deriveClusters, resolveClusterCenters, clusterCentroids, EnvelopeSequencer, RequestLedger } from './chunk-FG6TQANI.js';
2
- export { DEFAULT_CLUSTER_CENTER_RADIUS, DEFAULT_LAYOUT_SEED, DIAGNOSTIC_SAMPLE_CAP, acceptColumnar, clusterCentroids, collectTransfers, decodeStringTable, deriveClusters, encodeStringTable, generateClusterCenters, judgeEpoch, resolveClusterCenters } from './chunk-FG6TQANI.js';
1
+ import { DIAGNOSTIC_SAMPLE_CAP, encodeStringTable, collectTransfers, deriveClusters, resolveClusterCenters, clusterCentroids, EnvelopeSequencer, RequestLedger } from './chunk-KRCG2JFN.js';
2
+ export { DEFAULT_CLUSTER_CENTER_RADIUS, DEFAULT_LAYOUT_SEED, DIAGNOSTIC_SAMPLE_CAP, acceptColumnar, clusterCentroids, collectTransfers, decodeStringTable, deriveClusters, encodeStringTable, generateClusterCenters, judgeEpoch, resolveClusterCenters } from './chunk-KRCG2JFN.js';
3
3
  import { createStore } from 'zustand/vanilla';
4
4
 
5
5
  // src/errors.ts
@@ -349,7 +349,7 @@ function validateGroupSpecs(specs, nodeIndex) {
349
349
  severity: "error",
350
350
  count,
351
351
  sampleIds: samples,
352
- message: `groups rejected before scene rewrite (\xA716.3 acyclic/singly-parented): ${kinds} \u2014 the previous group configuration stays active`
352
+ message: `groups rejected before scene rewrite: ${kinds} \u2014 the previous group configuration stays active`
353
353
  }
354
354
  };
355
355
  }
@@ -419,7 +419,7 @@ function validateGroupBySpec(spec) {
419
419
  if (!expandOk) problems.push("semanticZoom.expandAbove must be a finite number");
420
420
  if (collapseOk && expandOk && !(sz.expandAbove > sz.collapseBelow)) {
421
421
  problems.push(
422
- "semanticZoom.expandAbove must be strictly greater than collapseBelow (hysteresis, R-16.3-22)"
422
+ "semanticZoom.expandAbove must be strictly greater than collapseBelow to provide a hysteresis gap"
423
423
  );
424
424
  }
425
425
  }
@@ -429,7 +429,7 @@ function validateGroupBySpec(spec) {
429
429
  severity: "error",
430
430
  count: problems.length,
431
431
  sampleIds: [],
432
- message: `groupBy rejected (\xA716.3/D4): ${problems.join("; ")} \u2014 the previous groupBy configuration stays active`
432
+ message: `groupBy rejected: ${problems.join("; ")} \u2014 the previous groupBy configuration stays active`
433
433
  };
434
434
  }
435
435
  function deriveGroupsByKey(nodes, by, isCollapsedKey) {
@@ -476,7 +476,7 @@ function deriveGroupsByKey(nodes, by, isCollapsedKey) {
476
476
  severity: "warning",
477
477
  count: errorCount,
478
478
  sampleIds: errorSamples,
479
- message: "groupBy.by threw; the affected nodes derived as ungrouped (\xA716.3/\xA78)"
479
+ message: "groupBy.by threw; the affected nodes derived as ungrouped"
480
480
  }
481
481
  };
482
482
  }
@@ -701,27 +701,27 @@ var EMPTY_INDEX = /* @__PURE__ */ new Map();
701
701
  var Reconciler = class {
702
702
  datasetKey = null;
703
703
  hasScene = false;
704
- // Previous scene, kept for the structural diff (§7.2).
704
+ // Previous scene, kept for the structural diff.
705
705
  prevIdByIndex = [];
706
706
  prevIndexById = EMPTY_INDEX;
707
707
  prevEdgeIdByIndex = [];
708
708
  prevLinks = new Uint32Array(0);
709
709
  /**
710
710
  * Declared node.x/y as of the previous reconcile, for nodes that declared
711
- * them. Lets Priority 1 distinguish a CHANGED declaration (caller intent
711
+ * them. Lets Priority 1 distinguish a CHANGED declaration (caller intent
712
712
  * wins over any cache) from an unchanged one (defers to live drift). Fresh
713
713
  * per pass, so departed ids drop and a re-add treats its declaration as new.
714
714
  */
715
715
  prevDeclared = /* @__PURE__ */ new Map();
716
716
  /**
717
- * CPU position mirror for the CURRENT scene, indexed by slot (§7.1 posBuf).
717
+ * CPU position mirror for the CURRENT scene, indexed by slot.
718
718
  * Owned copy — never aliases a published scene's positions array, so
719
719
  * noteEnginePositions never mutates an already-published RenderScene.
720
720
  */
721
721
  livePositions = new Float32Array(0);
722
722
  /**
723
- * Ids removed from the scene → last known finite position (§7.1/§7.3
724
- * leave-and-return guarantee). Map insertion order doubles as LRU order;
723
+ * Ids removed from the scene → last known finite position, preserving the
724
+ * leave-and-return guarantee. Map insertion order doubles as LRU order;
725
725
  * invariant: never overlaps the current scene's id set.
726
726
  */
727
727
  departed = /* @__PURE__ */ new Map();
@@ -835,7 +835,7 @@ var Reconciler = class {
835
835
  }
836
836
  /**
837
837
  * Copy engine-read positions into the live cache for the CURRENT scene's
838
- * slots (§7.1 per-event readback — simulation end, pre-structural-swap).
838
+ * slots.
839
839
  * Extra trailing floats are ignored; a short buffer updates a prefix.
840
840
  */
841
841
  noteEnginePositions(positions) {
@@ -1391,7 +1391,7 @@ function mergeDiagnostics(merge) {
1391
1391
  severity: "info",
1392
1392
  count: merge.shadowedCount,
1393
1393
  sampleIds: merge.shadowedSamples,
1394
- message: `${merge.shadowedCount} overlay node row(s) shadowed by a same-id row admitted earlier (\xA77.5); rows retained`
1394
+ message: `${merge.shadowedCount} overlay node row(s) shadowed by a same-id row admitted earlier; rows retained`
1395
1395
  });
1396
1396
  }
1397
1397
  if (merge.duplicateEdgeCount > 0) {
@@ -1441,7 +1441,7 @@ function sessionCommitDiagnostics(tallies, danglingCount, danglingSamples = [])
1441
1441
  severity: "warning",
1442
1442
  count: danglingCount,
1443
1443
  sampleIds: danglingSamples.slice(0, DIAGNOSTIC_SAMPLE_CAP),
1444
- message: `${danglingCount} ingested edge(s) still awaiting an endpoint at commit (pending-endpoint index; \xA77.5)`
1444
+ message: `${danglingCount} ingested edge(s) still awaiting an endpoint at commit (the endpoint was not ingested before the session committed)`
1445
1445
  });
1446
1446
  }
1447
1447
  return out;
@@ -1571,7 +1571,7 @@ var IncrementalAlphaComposer = class {
1571
1571
  bufB = null;
1572
1572
  staleA = [];
1573
1573
  staleB = [];
1574
- /** Which buffer the NEXT nextBuffer() call returns (0 = A, 1 = B). */
1574
+ /** Which buffer the NEXT nextBuffer call returns (0 = A, 1 = B). */
1575
1575
  next = 0;
1576
1576
  // --- seed key ---
1577
1577
  seededBase = null;
@@ -1674,7 +1674,7 @@ var PressureSampler = class {
1674
1674
  /**
1675
1675
  * Record one onFrame tick. `settled` marks a tick that arrived while the
1676
1676
  * scene was at rest (sim settled, no pending commit work) — the idle-
1677
- * wakeup counter, which reads 0 when the ADR-005 gated clock is honest.
1677
+ * wakeup counter, which reads 0 when the gated activity clock is honest.
1678
1678
  */
1679
1679
  noteFrame(timeMs, settled) {
1680
1680
  this.frames += 1;
@@ -1844,7 +1844,7 @@ var DegradeController = class {
1844
1844
  /**
1845
1845
  * Resource-admission trigger: engage the NEXT not-yet-engaged step in the
1846
1846
  * declared order. Null when the order is exhausted — the caller must then
1847
- * REJECT before allocating (§17: never silently erase semantic styling).
1847
+ * REJECT before allocating.
1848
1848
  */
1849
1849
  engageNextResourceStep(visible) {
1850
1850
  for (const step of this.limits.resourceDegradationOrder) {
@@ -2057,8 +2057,8 @@ var LinkPickIndex = class {
2057
2057
  while (!r.done) r = it.next();
2058
2058
  }
2059
2059
  /**
2060
- * Incremental build: yields whenever `now() − sliceStart ≥ budgetMs` so a
2061
- * scheduler can spread the work across idle frames (§17 long-task budget).
2060
+ * Incremental build: yields whenever `now − sliceStart ≥ budgetMs` so a
2061
+ * scheduler can spread the work across idle frames.
2062
2062
  * Pure generator — no rAF/timers here; the caller owns scheduling.
2063
2063
  *
2064
2064
  * The previous grid stays armed and queryable until the new one commits on
@@ -2222,7 +2222,7 @@ var LinkPickIndex = class {
2222
2222
  * Nearest link within `tolerance` (space units) of the space point
2223
2223
  * `(x, y)`, or null. Scans the candidate cells covering the tolerance
2224
2224
  * disc's bounding box (typically the 3×3 neighborhood; more when the
2225
- * tolerance exceeds the cell size), applies the optional §9.1 visibility
2225
+ * tolerance exceeds the cell size), applies the optional visibility
2226
2226
  * mask per candidate, then runs the exact point→segment distance test.
2227
2227
  * Nearest wins; exact-distance ties break toward the LOWER link index.
2228
2228
  * Returns null while unbuilt/invalidated (picking disarmed).
@@ -2374,7 +2374,7 @@ var EdgePickingFacade = class {
2374
2374
  this.generation++;
2375
2375
  this.index.invalidate();
2376
2376
  }
2377
- /** §9.1 mask pass-through stub: applied per candidate at query time. */
2377
+ /** mask pass-through stub: applied per candidate at query time. */
2378
2378
  setLinkVisibilityMask(mask) {
2379
2379
  this.mask = mask;
2380
2380
  }
@@ -2734,7 +2734,7 @@ function throwAborted2(signal, sourceId, targetId) {
2734
2734
  const reason = signal.reason;
2735
2735
  throw new OrbitOperationError(
2736
2736
  reason === void 0 ? { code: "aborted" } : { code: "aborted", cause: reason },
2737
- `local find('${sourceId}' \u2192 '${targetId}') aborted mid-scan (\xA716.2)`
2737
+ `local find('${sourceId}' \u2192 '${targetId}') aborted mid-scan`
2738
2738
  );
2739
2739
  }
2740
2740
  function createLocalPathService(getBase) {
@@ -2919,7 +2919,7 @@ function throwAborted3(signal, query) {
2919
2919
  const reason = signal.reason;
2920
2920
  throw new OrbitOperationError(
2921
2921
  reason === void 0 ? { code: "aborted" } : { code: "aborted", cause: reason },
2922
- `local search('${query}') aborted mid-scan (\xA716.5)`
2922
+ `local search('${query}') aborted mid-scan`
2923
2923
  );
2924
2924
  }
2925
2925
  function createLocalSearchService(getBase) {
@@ -3291,8 +3291,8 @@ var WorkerLane = class {
3291
3291
  }
3292
3292
  return this.availableState;
3293
3293
  }
3294
- /** Async worker death (P1: a constructed-but-dead worker must strand
3295
- * NOTHING): every pending request rejects as 'worker-failed' so callers
3294
+ /** A constructed-but-dead worker must strand NOTHING: every pending
3295
+ * request rejects as 'worker-failed' so callers
3296
3296
  * run their main-lane fallback, the lane goes permanently unavailable,
3297
3297
  * and the unavailability callback fires (the instance one-shots it). */
3298
3298
  fail(reason) {
@@ -3348,7 +3348,7 @@ var WorkerLane = class {
3348
3348
  }
3349
3349
  /** Abort everything in flight (epoch advance / detach / dataset swap).
3350
3350
  * The ledger's controllers fire each pending promise's abort listener;
3351
- * the sweep below catches anything tracked before a listener attached
3351
+ * the sweep below catches anything tracked before a listener attached
3352
3352
  * rejects stay idempotent through the delete guard. */
3353
3353
  abortAll() {
3354
3354
  this.ledger.abortAll();
@@ -3817,7 +3817,7 @@ var MetricStore = class {
3817
3817
  /** Admitted async columns by metric name; NaN encodes null. */
3818
3818
  columns = /* @__PURE__ */ new Map();
3819
3819
  degreePasses = 0;
3820
- /** §17 telemetry: estimated bytes of metric storage held (S13-T07). */
3820
+ /** telemetry: estimated bytes of metric storage held. */
3821
3821
  estimatedBytes() {
3822
3822
  let bytes = 0;
3823
3823
  for (const col of this.columns.values()) bytes += col.byteLength;
@@ -3848,10 +3848,10 @@ var MetricStore = class {
3848
3848
  }
3849
3849
  }
3850
3850
  /**
3851
- * Joins async metric columns against the accepted model (§12).
3851
+ * Joins async metric columns against the accepted model.
3852
3852
  * Revision-gated PER COLUMN (I1): a column whose issue-time
3853
3853
  * `forModelRevision` stamp differs from `opts.modelRevision` is discarded
3854
- * (info diagnostic — a normal async race outcome, §9.2). A missing or
3854
+ * (info diagnostic — a normal async race outcome). A missing or
3855
3855
  * mismatched stamp is never defaulted to the current revision — that
3856
3856
  * would make the gate self-satisfying.
3857
3857
  * Structural rejections ('index' length mismatch, missing/mismatched ids)
@@ -3869,7 +3869,7 @@ var MetricStore = class {
3869
3869
  "info",
3870
3870
  1,
3871
3871
  [column.metric],
3872
- `metric column '${column.metric}' discarded: computed for model revision ${String(column.forModelRevision)} but the update was issued at revision ${String(opts.modelRevision)} (\xA712/I1 revision-gated admission)`
3872
+ `metric column '${column.metric}' discarded: computed for model revision ${String(column.forModelRevision)} but the update was issued at revision ${String(opts.modelRevision)}`
3873
3873
  )
3874
3874
  );
3875
3875
  continue;
@@ -3979,7 +3979,7 @@ var MetricStore = class {
3979
3979
  }
3980
3980
  /**
3981
3981
  * Raw column in accepted-base order, or null when unavailable. NaN encodes
3982
- * null (§12) — consumers exclude NaN slots from domains. Do NOT mutate:
3982
+ * null — consumers exclude NaN slots from domains. Do NOT mutate:
3983
3983
  * this is the live cache, not a copy.
3984
3984
  */
3985
3985
  metricValues(metric) {
@@ -4025,7 +4025,7 @@ var MetricStore = class {
4025
4025
  };
4026
4026
 
4027
4027
  // src/capabilityPolicy.ts
4028
- var CLUSTER_FORCE_DEGRADATION_REASON = "clusters requested but the engine capability record does not declare clusterForce; the cluster force is inert while membership, cluster labels, and centroids still work (\xA716.3/R-13-39)";
4028
+ var CLUSTER_FORCE_DEGRADATION_REASON = "clusters requested but the engine capability record does not declare clusterForce; the cluster force is inert while membership, cluster labels, and centroids still work";
4029
4029
  function degradation(feature, reason) {
4030
4030
  return Object.freeze({ feature, reason });
4031
4031
  }
@@ -4038,7 +4038,7 @@ function resolveEnginePolicy(capabilities, requested) {
4038
4038
  degradations.push(
4039
4039
  degradation(
4040
4040
  "edgeArrows",
4041
- "edgeArrows requested but the engine capability record does not declare edgeArrows; the prop is inert (\xA716.12)"
4041
+ "edgeArrows requested but the engine capability record does not declare edgeArrows; the prop is inert"
4042
4042
  )
4043
4043
  );
4044
4044
  }
@@ -4046,7 +4046,7 @@ function resolveEnginePolicy(capabilities, requested) {
4046
4046
  degradations.push(
4047
4047
  degradation(
4048
4048
  "images",
4049
- "node images requested but the engine capability record does not declare pointImages; placeholder glyphs render and image refs are retained (\xA78/\xA713)"
4049
+ "node images requested but the engine capability record does not declare pointImages; placeholder glyphs render and image refs are retained"
4050
4050
  )
4051
4051
  );
4052
4052
  }
@@ -4069,14 +4069,14 @@ function assertCapabilityMethodParity(engine) {
4069
4069
  const mismatches = [];
4070
4070
  const capabilities = engine.capabilities;
4071
4071
  if (capabilities === null || typeof capabilities !== "object") {
4072
- mismatches.push("engine.capabilities is missing or not an object (\xA713 static declaration)");
4072
+ mismatches.push("engine.capabilities is missing or not an object");
4073
4073
  return mismatches;
4074
4074
  }
4075
4075
  const caps = capabilities;
4076
4076
  const getPositions = engine.getPositions;
4077
4077
  if (caps.trackedPositions === true && typeof getPositions !== "function") {
4078
4078
  mismatches.push(
4079
- "capabilities.trackedPositions is declared but engine.getPositions is absent (\xA713 tracked readback)"
4079
+ "capabilities.trackedPositions is declared but engine.getPositions is absent"
4080
4080
  );
4081
4081
  }
4082
4082
  return mismatches;
@@ -4163,7 +4163,7 @@ var ImageAtlasPipeline = class {
4163
4163
  generation = null;
4164
4164
  flushScheduled = false;
4165
4165
  disposed = false;
4166
- /** D5/F11-06: evicted-entry bitmaps awaiting close — closed AFTER the
4166
+ /** Evicted-entry bitmaps awaiting close — closed AFTER the
4167
4167
  * flush that carries their removeSlots, so the instance's recovery-replay
4168
4168
  * map (pruned synchronously in the batch callback) can never re-send a
4169
4169
  * closed bitmap. */
@@ -4397,7 +4397,7 @@ var ImageAtlasPipeline = class {
4397
4397
  return index;
4398
4398
  }
4399
4399
  /**
4400
- * I2 (roster-atomic resource mappings, F11-03): the SYNCHRONOUS point→slot
4400
+ * Roster-atomic resource mappings: the SYNCHRONOUS point→slot
4401
4401
  * mapping for the last requested roster — a slot appears only when its ref
4402
4402
  * is resolved AND the engine has already received the bitmap (delivered);
4403
4403
  * pending, failed, evicted, and reused-but-undelivered refs are the −1
@@ -4477,12 +4477,12 @@ var SoftMask = class {
4477
4477
  edgeHideLane;
4478
4478
  edgeDimLane;
4479
4479
  sources = /* @__PURE__ */ new Set();
4480
- /** Dedicated internal source implementing the §9 node→edge cascade. */
4480
+ /** Dedicated internal source implementing the node→edge cascade. */
4481
4481
  cascadeSource = null;
4482
4482
  overflowedFlag = false;
4483
4483
  /** Total memberships currently held across all sources and lanes. */
4484
4484
  totalHeld = 0;
4485
- /** §17 O(Δ) op counters (F10-02 gate instrumentation). */
4485
+ /** O(Δ) op counters. */
4486
4486
  statsBox = {
4487
4487
  slotsVisited: 0,
4488
4488
  zeroCrossings: 0,
@@ -4505,12 +4505,12 @@ var SoftMask = class {
4505
4505
  return this.edgeCap;
4506
4506
  }
4507
4507
  /** One-time latch: some counter hit 0xFFFF and an increment was dropped.
4508
- * Counts may drift afterwards; the caller reports it (§9.1 overflow guard). */
4508
+ * Counts may drift afterwards; the caller reports it. */
4509
4509
  get overflowed() {
4510
4510
  return this.overflowedFlag;
4511
4511
  }
4512
4512
  // Live counter columns (read-only views by convention — do not mutate;
4513
- // references are replaced on grow()).
4513
+ // references are replaced on grow).
4514
4514
  get nodeHideFailures() {
4515
4515
  return this.nodeHideLane.counters;
4516
4516
  }
@@ -4525,7 +4525,7 @@ var SoftMask = class {
4525
4525
  }
4526
4526
  /**
4527
4527
  * Grows capacities for structure changes (existing slot state is
4528
- * preserved; new slots start fully visible). Capacities never shrink
4528
+ * preserved; new slots start fully visible). Capacities never shrink
4529
4529
  * a smaller value is a no-op for that dimension.
4530
4530
  */
4531
4531
  grow(nodeCapacity, edgeCapacity) {
@@ -4550,7 +4550,7 @@ var SoftMask = class {
4550
4550
  this.edgeCap = edgeCapacity;
4551
4551
  }
4552
4552
  }
4553
- /** Registers a new failure source. No cap on source count (§9.1). */
4553
+ /** Registers a new failure source. No cap on source count. */
4554
4554
  acquire(name) {
4555
4555
  const state = {
4556
4556
  name,
@@ -4605,11 +4605,11 @@ var SoftMask = class {
4605
4605
  };
4606
4606
  }
4607
4607
  /**
4608
- * §9 edge cascade over the mask lane: recomputes, from the CURRENT node
4608
+ * edge cascade over the mask lane: recomputes, from the CURRENT node
4609
4609
  * hide lane, the set of edges with at least one hidden endpoint, and feeds
4610
4610
  * it to the dedicated internal cascade source (edge hide lane only).
4611
- * `links` is the flat `[src0, tgt0, src1, tgt1, …]` node-slot pair buffer
4612
- * (§7.1 CSR input shape); edge slot i has endpoints at links[2i]/[2i+1].
4611
+ * `links` is the flat `[src0, tgt0, src1, tgt1, …]` node-slot pair buffer;
4612
+ * edge slot i has endpoints at links[2i]/[2i+1].
4613
4613
  * O(E) scan per call — typically once per drain — but only edges whose
4614
4614
  * cascade state changed produce counter deltas (and thus dirty entries).
4615
4615
  * Edges beyond `links.length / 2` are treated as having no hidden
@@ -4640,11 +4640,11 @@ var SoftMask = class {
4640
4640
  }
4641
4641
  if (hide[source] !== 0 || hide[target] !== 0) failing.push(i);
4642
4642
  }
4643
- this.cascadeSource ??= this.acquire("\xA79.1 node\u2192edge cascade");
4643
+ this.cascadeSource ??= this.acquire("node\u2192edge cascade");
4644
4644
  this.cascadeSource.setEdgeFailures(failing);
4645
4645
  }
4646
4646
  /**
4647
- * O(incident-edges) delta form of the §9.1 cascade (F10-02): for each node
4647
+ * O(incident-edges) delta form of the cascade: for each node
4648
4648
  * whose HIDE visibility crossed zero, recompute only its incident edges'
4649
4649
  * cascade state from the CURRENT node counters and apply the delta through
4650
4650
  * the same internal cascade source the full form uses — the two compose
@@ -4656,7 +4656,7 @@ var SoftMask = class {
4656
4656
  applyNodeCascadeToEdgesDelta(links, incidence, crossedNodes) {
4657
4657
  if (crossedNodes.length === 0) return;
4658
4658
  const hide = this.nodeHideLane.counters;
4659
- this.cascadeSource ??= this.acquire("\xA79.1 node\u2192edge cascade");
4659
+ this.cascadeSource ??= this.acquire("node\u2192edge cascade");
4660
4660
  const nowFailing = [];
4661
4661
  const nowClear = [];
4662
4662
  for (let k = 0; k < crossedNodes.length; k++) {
@@ -4686,7 +4686,7 @@ var SoftMask = class {
4686
4686
  edgeVisibleCount: this.edgeHideLane.zeroCount
4687
4687
  };
4688
4688
  }
4689
- /** §17 telemetry: estimated bytes of mask storage held (S13-T07):
4689
+ /** telemetry: estimated bytes of mask storage held:
4690
4690
  * four counter lanes (+pending trackers) and per-source flag columns. */
4691
4691
  estimatedBytes() {
4692
4692
  let bytes = 0;
@@ -4698,7 +4698,7 @@ var SoftMask = class {
4698
4698
  }
4699
4699
  return bytes;
4700
4700
  }
4701
- /** §17 O(Δ) op counters (live object — snapshot before comparing). */
4701
+ /** O(Δ) op counters (live object — snapshot before comparing). */
4702
4702
  get stats() {
4703
4703
  return this.statsBox;
4704
4704
  }
@@ -4720,7 +4720,7 @@ var SoftMask = class {
4720
4720
  isEdgeVisible(index) {
4721
4721
  return this.edgeHideLane.counters[index] === 0;
4722
4722
  }
4723
- /** Dimmed iff visible AND dimFailures > 0 (§9.1). */
4723
+ /** Dimmed iff visible AND dimFailures > 0. */
4724
4724
  isNodeDimmed(index) {
4725
4725
  return this.isNodeVisible(index) && (this.nodeDimLane.counters[index] ?? 0) > 0;
4726
4726
  }
@@ -4781,7 +4781,7 @@ var SoftMask = class {
4781
4781
  mem.holes = 0;
4782
4782
  }
4783
4783
  /**
4784
- * O(Δ) delta ops on one lane membership (F10-02). Adds and removes are
4784
+ * O(Δ) delta ops on one lane membership. Adds and removes are
4785
4785
  * idempotent per slot (adding a member / removing a non-member is a
4786
4786
  * no-op); removed slots leave HOLES in `list` (compacted past 50%), so
4787
4787
  * replace/clear passes must honor the bit0 guard above. `crossings`, when
@@ -4882,7 +4882,7 @@ var SoftMask = class {
4882
4882
  this.applyMembership(this.edgeDimLane, state.edgeDim, null);
4883
4883
  }
4884
4884
  /** Debug balanced-increment assert: whenever no source holds any
4885
- * membership, every counter must read zero (skipped once overflowed
4885
+ * membership, every counter must read zero (skipped once overflowed
4886
4886
  * clamped increments legitimately drift the books). */
4887
4887
  assertBalancedIfIdle() {
4888
4888
  if (!DEBUG || this.overflowedFlag || this.totalHeld !== 0) return;
@@ -4904,7 +4904,7 @@ var SVG_MAX_ELEMENTS_DEFAULT = 5e4;
4904
4904
  var SvgBudgetError = class extends Error {
4905
4905
  constructor(elementCount, limit) {
4906
4906
  super(
4907
- `SVG export of ${elementCount} elements exceeds the ${limit}-element budget \u2014 filter/isolate first, or use the raster-hybrid fallback (\xA716.14)`
4907
+ `SVG export of ${elementCount} elements exceeds the ${limit}-element budget \u2014 filter/isolate first, or use the raster-hybrid fallback`
4908
4908
  );
4909
4909
  this.elementCount = elementCount;
4910
4910
  this.limit = limit;
@@ -5264,7 +5264,7 @@ function upperBound(values, sorted, target) {
5264
5264
  return lo;
5265
5265
  }
5266
5266
  var TypedColumnCrossfilter = class {
5267
- /** Test instrumentation; see CrossfilterStats. Reset with resetStats(). */
5267
+ /** Test instrumentation; see CrossfilterStats. Reset with resetStats. */
5268
5268
  stats = {
5269
5269
  slotsWalked: 0,
5270
5270
  fullSorts: 0,
@@ -5272,7 +5272,7 @@ var TypedColumnCrossfilter = class {
5272
5272
  binUpdates: 0,
5273
5273
  filteredRecomputes: 0
5274
5274
  };
5275
- /** Count of dims whose filtered layer is live-maintained (F10-02). */
5275
+ /** Count of dims whose filtered layer is live-maintained. */
5276
5276
  liveDims = 0;
5277
5277
  dims = [];
5278
5278
  byKey = /* @__PURE__ */ new Map();
@@ -5298,7 +5298,7 @@ var TypedColumnCrossfilter = class {
5298
5298
  this.stats.binUpdates = 0;
5299
5299
  this.stats.filteredRecomputes = 0;
5300
5300
  }
5301
- /** §17 telemetry: estimated bytes of typed-column storage held (S13-T07).
5301
+ /** telemetry: estimated bytes of typed-column storage held.
5302
5302
  * Documented components: per-dim value/permutation/bin/code/pass arrays,
5303
5303
  * the global failure counter, and the external mask. */
5304
5304
  estimatedBytes() {
@@ -5313,7 +5313,7 @@ var TypedColumnCrossfilter = class {
5313
5313
  }
5314
5314
  return bytes;
5315
5315
  }
5316
- /** F10-02 live-layer bookkeeping — the ONLY writer of `filteredLive`. */
5316
+ /** live-layer bookkeeping — the ONLY writer of `filteredLive`. */
5317
5317
  setFilteredLive(dim, live) {
5318
5318
  if (dim.filteredLive === live) return;
5319
5319
  dim.filteredLive = live;
@@ -5376,8 +5376,8 @@ var TypedColumnCrossfilter = class {
5376
5376
  }
5377
5377
  /**
5378
5378
  * External node-mask predicate for the joint "filtered" second layer (the
5379
- * instance wires the §9.1 filter-prop node mask in). Affects summaries only,
5380
- * never selection visibility. Length must equal rowCount(). Notifies on
5379
+ * instance wires the filter-prop node mask in). Affects summaries only,
5380
+ * never selection visibility. Length must equal rowCount. Notifies on
5381
5381
  * observable change; does NOT advance selectionRevision.
5382
5382
  */
5383
5383
  setExternalMask(passSlots) {
@@ -5402,7 +5402,7 @@ var TypedColumnCrossfilter = class {
5402
5402
  this.notify();
5403
5403
  }
5404
5404
  /**
5405
- * Immutable summary. The filtered layer is recomputed lazily when dirty
5405
+ * Immutable summary. The filtered layer is recomputed lazily when dirty
5406
5406
  * O(rows) per dirty summarize (v0.7 tier; see module doc). Returned objects
5407
5407
  * are frozen and never mutated by later operations.
5408
5408
  */
@@ -5454,7 +5454,7 @@ var TypedColumnCrossfilter = class {
5454
5454
  return Object.freeze(domain !== void 0 ? { ...base, domain } : base);
5455
5455
  }
5456
5456
  /**
5457
- * Incrementally extend columns with new rows (S9-T09 subset): no full
5457
+ * Incrementally extend columns with new rows: no full
5458
5458
  * rebuild, no full re-argsort — the pre-sorted old permutation merges with
5459
5459
  * the sorted new block. Brushes stay by key and are applied to the NEW slots
5460
5460
  * only; the returned delta covers only new slots. Keeps selectionRevision;
@@ -5708,16 +5708,16 @@ var TypedColumnCrossfilter = class {
5708
5708
  }
5709
5709
  }
5710
5710
  /**
5711
- * F10-02 inline maintenance of LIVE filtered layers, dispatched from the
5711
+ * inline maintenance of LIVE filtered layers, dispatched from the
5712
5712
  * one place that knows the failCount transition. `boundary` is the
5713
5713
  * other-failures picture at the interesting side of the flip (after for
5714
5714
  * shown, before for hidden):
5715
- * - 0 → the slot crossed the FULLY-VISIBLE boundary: every other live
5716
- * layer counts it (own layers ignore the own-dim brush, so the brushed
5717
- * dim's layer is provably unchanged by its own flip);
5718
- * - 1 → exactly one OTHER dim still fails the slot: only that dim's
5719
- * what-if-I-cleared-mine layer flips;
5720
- * - ≥2 → no layer can change.
5715
+ * - 0 → the slot crossed the FULLY-VISIBLE boundary: every other live
5716
+ * layer counts it (own layers ignore the own-dim brush, so the brushed
5717
+ * dim's layer is provably unchanged by its own flip);
5718
+ * - 1 → exactly one OTHER dim still fails the slot: only that dim's
5719
+ * what-if-I-cleared-mine layer flips;
5720
+ * - ≥2 → no layer can change.
5721
5721
  * External-mask-excluded and hygiene-invalid slots contribute nothing
5722
5722
  * either way and are skipped.
5723
5723
  */
@@ -6022,7 +6022,7 @@ function assertSerializable(value, slice) {
6022
6022
  switch (typeof v) {
6023
6023
  case "function":
6024
6024
  throw new TypeError(
6025
- `history command for slice "${slice}" carries a function at ${path} \u2014 commands are value diffs, not closures (\xA716.14)`
6025
+ `history command for slice "${slice}" carries a function at ${path} \u2014 commands are value diffs, not closures`
6026
6026
  );
6027
6027
  case "symbol":
6028
6028
  case "bigint":
@@ -6037,7 +6037,7 @@ function assertSerializable(value, slice) {
6037
6037
  if (v === null) return;
6038
6038
  if (v instanceof Map || v instanceof Set) {
6039
6039
  throw new TypeError(
6040
- `history command for slice "${slice}" carries a ${v instanceof Map ? "Map" : "Set"} at ${path} \u2014 convert to arrays/objects before recording (\xA716.14)`
6040
+ `history command for slice "${slice}" carries a ${v instanceof Map ? "Map" : "Set"} at ${path} \u2014 convert to arrays/objects before recording`
6041
6041
  );
6042
6042
  }
6043
6043
  if (seen.has(v)) {
@@ -6059,7 +6059,7 @@ var HistoryKernel = class {
6059
6059
  debug;
6060
6060
  undoStack = [];
6061
6061
  redoStack = [];
6062
- /** Nested begin() joins the outer transaction (depth-counted). */
6062
+ /** Nested begin joins the outer transaction (depth-counted). */
6063
6063
  txDepth = 0;
6064
6064
  txCommands = [];
6065
6065
  txLabel;
@@ -6125,7 +6125,7 @@ var HistoryKernel = class {
6125
6125
  }
6126
6126
  this.pushEntry({ label: void 0, commands: [command] }, null);
6127
6127
  }
6128
- /** Close a transaction; the outermost end() pushes one stack entry. */
6128
+ /** Close a transaction; the outermost end pushes one stack entry. */
6129
6129
  end() {
6130
6130
  if (!this.enabled) return;
6131
6131
  if (this.txDepth === 0) throw new Error("HistoryKernel.end() without a matching begin()");
@@ -6395,7 +6395,7 @@ function createGraphInstance(opts) {
6395
6395
  if (accepted === null) {
6396
6396
  throw new OrbitOperationError(
6397
6397
  { code: "aborted", cause: "no accepted base" },
6398
- "expansion requires an accepted base dataset (\xA79.2)"
6398
+ "expansion requires an accepted base dataset"
6399
6399
  );
6400
6400
  }
6401
6401
  return { accepted, adjacency: acceptedAdjacencyOf() };
@@ -6628,7 +6628,7 @@ function createGraphInstance(opts) {
6628
6628
  severity: "error",
6629
6629
  count: 1,
6630
6630
  sampleIds: [],
6631
- message: "columnar snapshot mutated while worker acceptance was pending \u2014 rejected whole (\xA75: source coordinates are immutable; publish a new sourceRevision)"
6631
+ message: "columnar snapshot mutated while worker acceptance was pending \u2014 rejected whole (source coordinates are immutable; publish a new sourceRevision)"
6632
6632
  }
6633
6633
  ];
6634
6634
  publish({ diagnostics: composeDiagnostics() });
@@ -6662,7 +6662,7 @@ function createGraphInstance(opts) {
6662
6662
  severity: "error",
6663
6663
  count: 1,
6664
6664
  sampleIds: [],
6665
- message: "columnar snapshot mutated while worker acceptance was pending \u2014 rejected whole (\xA75: source coordinates are immutable; publish a new sourceRevision)"
6665
+ message: "columnar snapshot mutated while worker acceptance was pending \u2014 rejected whole (source coordinates are immutable; publish a new sourceRevision)"
6666
6666
  }
6667
6667
  ];
6668
6668
  publish({ diagnostics: composeDiagnostics() });
@@ -6754,7 +6754,7 @@ function createGraphInstance(opts) {
6754
6754
  if (event.engaged && !capLabelsNudged) {
6755
6755
  capLabelsNudged = true;
6756
6756
  console.warn(
6757
- "orbit: cap-dom-labels engaged \u2014 DOM labels are hard-capped at the label budget above limits.domLabelNodes visible nodes (\xA717). A GPU label lane (labelStrategy 'sdf') is the planned scale path (S13-T05, deferred)."
6757
+ "orbit: cap-dom-labels engaged \u2014 DOM labels are hard-capped at the label budget above limits.domLabelNodes visible nodes. A GPU label lane (labelStrategy 'sdf') is the planned scale path."
6758
6758
  );
6759
6759
  }
6760
6760
  scheduleViewportRerank();
@@ -7407,7 +7407,7 @@ function createGraphInstance(opts) {
7407
7407
  severity: "warning",
7408
7408
  count: errorCount,
7409
7409
  sampleIds: samples,
7410
- message: `filter predicate threw for ${errorCount} item(s); failing open \u2014 throwing predicates never hide data (\xA79.1)`
7410
+ message: `filter predicate threw for ${errorCount} item(s); failing open \u2014 throwing predicates never hide data`
7411
7411
  }
7412
7412
  ];
7413
7413
  } else {
@@ -7918,7 +7918,7 @@ function createGraphInstance(opts) {
7918
7918
  }
7919
7919
  function requireCrossfilterEngine() {
7920
7920
  if (crossfilterEngine === null) {
7921
- throw new Error("crossfilter session is not available (set the crossfilter prop first, \xA716.6)");
7921
+ throw new Error("crossfilter session is not available; set the crossfilter prop first");
7922
7922
  }
7923
7923
  return crossfilterEngine;
7924
7924
  }
@@ -7969,13 +7969,13 @@ function createGraphInstance(opts) {
7969
7969
  const eng = crossfilterEngine;
7970
7970
  if (eng === null) {
7971
7971
  throw new TypeError(
7972
- "playTimeline: the crossfilter prop must configure dimensions first (\xA716.6)"
7972
+ "playTimeline: the crossfilter prop must configure dimensions first"
7973
7973
  );
7974
7974
  }
7975
7975
  const summary = eng.summarize(key);
7976
7976
  if (summary.kind === "categorical" || summary.domain === void 0) {
7977
7977
  throw new TypeError(
7978
- `playTimeline: dimension "${key}" must be numeric/temporal with a non-empty domain (\xA716.6)`
7978
+ `playTimeline: dimension "${key}" must be numeric/temporal with a non-empty domain`
7979
7979
  );
7980
7980
  }
7981
7981
  const { min, max } = summary.domain;
@@ -7997,7 +7997,7 @@ function createGraphInstance(opts) {
7997
7997
  );
7998
7998
  }
7999
7999
  if (mode !== "sliding" && mode !== "cumulative") {
8000
- throw new TypeError(`playTimeline: unsupported mode "${String(mode)}" (\xA716.6)`);
8000
+ throw new TypeError(`playTimeline: unsupported mode "${String(mode)}"`);
8001
8001
  }
8002
8002
  stopTimelineTimer();
8003
8003
  timelineSessionSeq += 1;
@@ -8470,7 +8470,7 @@ function createGraphInstance(opts) {
8470
8470
  severity: "warning",
8471
8471
  count: overload,
8472
8472
  sampleIds: [],
8473
- message: `showLabelsFor exceeds tracked-label capacity; ${overload} forced label(s) omitted (\xA714)`
8473
+ message: `showLabelsFor exceeds tracked-label capacity; ${overload} forced label(s) omitted`
8474
8474
  }
8475
8475
  ];
8476
8476
  diagsChanged = true;
@@ -8746,7 +8746,7 @@ function createGraphInstance(opts) {
8746
8746
  severity: "warning",
8747
8747
  count: state.streak,
8748
8748
  sampleIds: [],
8749
- message: `${channel} reprojected on ${state.streak} consecutive commits with identical sampled outputs \u2014 likely an inline lambda prop; hoist or memoize it (\xA78)`
8749
+ message: `${channel} reprojected on ${state.streak} consecutive commits with identical sampled outputs \u2014 likely an inline lambda prop; hoist or memoize it`
8750
8750
  }
8751
8751
  ];
8752
8752
  }
@@ -9148,9 +9148,9 @@ function createGraphInstance(opts) {
9148
9148
  nodeIds: orderByAcceptedBase(full.nodeIds, nodeIndexBase()),
9149
9149
  edgeIds: orderByAcceptedBase(full.edgeIds, edgeIndexById),
9150
9150
  // Group namespace: the raw full-state form stays TOLERANT (deduped,
9151
- // not validated — pinned pre-S12 behavior); ids that stop naming a
9151
+ // not validated — pinned legacy behavior); ids that stop naming a
9152
9152
  // resolved group prune through the ownership path whenever the groups
9153
- // RESOLUTION changes (§16.2/§16.3). selectGroups() is the validating
9153
+ // RESOLUTION changes. selectGroups is the validating
9154
9154
  // mutator.
9155
9155
  groupIds: dedupeFirstOccurrence(full.groupIds)
9156
9156
  });
@@ -9429,7 +9429,7 @@ function createGraphInstance(opts) {
9429
9429
  if (DEV) {
9430
9430
  rejectGroupOp(
9431
9431
  "warning",
9432
- "groupNodes ignored: membership is derived and read-only under groupBy (\xA716.3) \u2014 change the groupBy accessor or remove it",
9432
+ "groupNodes ignored: membership is derived and read-only under groupBy \u2014 change the groupBy accessor or remove it",
9433
9433
  spec.id
9434
9434
  );
9435
9435
  }
@@ -9452,7 +9452,7 @@ function createGraphInstance(opts) {
9452
9452
  if (DEV) {
9453
9453
  rejectGroupOp(
9454
9454
  "warning",
9455
- "ungroup ignored: membership is derived and read-only under groupBy (\xA716.3) \u2014 change the groupBy accessor or remove it",
9455
+ "ungroup ignored: membership is derived and read-only under groupBy \u2014 change the groupBy accessor or remove it",
9456
9456
  groupId
9457
9457
  );
9458
9458
  }
@@ -9477,7 +9477,7 @@ function createGraphInstance(opts) {
9477
9477
  if (DEV) {
9478
9478
  rejectGroupOp(
9479
9479
  "warning",
9480
- "setGroupCollapsed ignored: groups and groupBy are both configured (\xA716.3 config error) \u2014 remove one",
9480
+ "setGroupCollapsed ignored: groups and groupBy are both configured \u2014 remove one",
9481
9481
  groupId
9482
9482
  );
9483
9483
  }
@@ -9488,7 +9488,7 @@ function createGraphInstance(opts) {
9488
9488
  if (DEV) {
9489
9489
  rejectGroupOp(
9490
9490
  "warning",
9491
- `setGroupCollapsed ignored: no derived group '${groupId}' in the current derivation (\xA716.3)`,
9491
+ `setGroupCollapsed ignored: no derived group '${groupId}' in the current derivation`,
9492
9492
  groupId
9493
9493
  );
9494
9494
  }
@@ -9702,7 +9702,7 @@ function createGraphInstance(opts) {
9702
9702
  function invalidateReplaceSessions(owner) {
9703
9703
  for (const s of [...openSessions]) {
9704
9704
  if (s === owner || s.purpose !== "replace") continue;
9705
- abortSessionInternal(s, "stale-base: the model changed outside the session (\xA77.5)", false);
9705
+ abortSessionInternal(s, "stale-base: the model changed outside the session", false);
9706
9706
  }
9707
9707
  }
9708
9708
  function abortAllSessions(except, cause) {
@@ -9771,7 +9771,7 @@ function createGraphInstance(opts) {
9771
9771
  if (expansionHandles.size === 0 && expansionLedger.size === 0) return;
9772
9772
  const err = new OrbitOperationError(
9773
9773
  { code: "aborted", cause: "dataset-changed" },
9774
- "expansion aborted: the datasetKey changed (\xA75/\xA79.2)"
9774
+ "expansion aborted: the datasetKey changed"
9775
9775
  );
9776
9776
  for (const [requestId, handle] of expansionHandles) {
9777
9777
  handle.abort(err);
@@ -9792,7 +9792,7 @@ function createGraphInstance(opts) {
9792
9792
  scopeExtraIds.clear();
9793
9793
  expansionOverlays.clear();
9794
9794
  abortExpansionsForDatasetSwap();
9795
- abortSearchFlight("dataset-changed", "search aborted: the datasetKey changed (\xA75/\xA716.5)");
9795
+ abortSearchFlight("dataset-changed", "search aborted: the datasetKey changed");
9796
9796
  resetMaskState();
9797
9797
  historyKernel.clear();
9798
9798
  stopTimelineTimer();
@@ -9954,7 +9954,7 @@ function createGraphInstance(opts) {
9954
9954
  const labelRerank = recomputeCandidates();
9955
9955
  const patch = {
9956
9956
  revisions,
9957
- // Counts are ACCEPTED-MODEL counts; the scene may be scoped (§9.2).
9957
+ // Counts are ACCEPTED-MODEL counts; the scene may be scoped.
9958
9958
  nodeCount: p.merged.nodes.length,
9959
9959
  edgeCount: p.merged.edges.length,
9960
9960
  diagnostics: composeDiagnostics()
@@ -10014,7 +10014,7 @@ function createGraphInstance(opts) {
10014
10014
  cancelFlushTimer(rec);
10015
10015
  return rejectOperation(
10016
10016
  { code: "overlay-id-conflict", overlayId: id },
10017
- `overlayId '${id}' is already reserved by an open or committed overlay for this dataset (\xA77.5)`
10017
+ `overlayId '${id}' is already reserved by an open or committed overlay for this dataset`
10018
10018
  );
10019
10019
  }
10020
10020
  reservedOverlayIds.set(id, rec);
@@ -10086,14 +10086,14 @@ function createGraphInstance(opts) {
10086
10086
  if (rec.atomic && queuedBytes > rec.maxPendingBytes) {
10087
10087
  return rejectOperation(
10088
10088
  { code: "queue-overflow", queuedBytes, limit: rec.maxPendingBytes },
10089
- `append(): atomic session would queue ${queuedBytes} bytes, exceeding its non-drainable budget of ${rec.maxPendingBytes}; the append was rejected and the session remains open (\xA77.5)`
10089
+ `append(): atomic session would queue ${queuedBytes} bytes, exceeding its non-drainable budget of ${rec.maxPendingBytes}; the append was rejected and the session remains open`
10090
10090
  );
10091
10091
  }
10092
10092
  const overflowLimit = rec.maxPendingBytes * INGEST_OVERFLOW_FACTOR;
10093
10093
  if (bytes > overflowLimit) {
10094
10094
  return rejectOperation(
10095
10095
  { code: "queue-overflow", queuedBytes: bytes, limit: overflowLimit },
10096
- `append(): batch of ${bytes} bytes exceeds the absolute cap of ${overflowLimit} (\xA77.5)`
10096
+ `append(): batch of ${bytes} bytes exceeds the absolute cap of ${overflowLimit}`
10097
10097
  );
10098
10098
  }
10099
10099
  const counts = stageBatch(
@@ -10151,7 +10151,7 @@ function createGraphInstance(opts) {
10151
10151
  };
10152
10152
  }
10153
10153
  const datasetChanged = baseAccepted !== null && baseAccepted.datasetKey !== rec.datasetKey;
10154
- abortAllSessions(rec, "replaced: a replace session committed (\xA77.5)");
10154
+ abortAllSessions(rec, "replaced: a replace session committed");
10155
10155
  const overlaysCleared = clearOverlayState();
10156
10156
  const newBase = baseFromContribution(rec.datasetKey, sourceRevision, c, []);
10157
10157
  const commitDiags = sessionCommitDiagnostics(rec.tallies, newBase.pendingEdges.length);
@@ -10249,7 +10249,7 @@ function createGraphInstance(opts) {
10249
10249
  code: "resource-limit",
10250
10250
  detail: { reason: err instanceof Error ? err.message : String(err) }
10251
10251
  },
10252
- `commit() failed; session rolled back (\xA77.5)`
10252
+ `commit() failed; session rolled back`
10253
10253
  );
10254
10254
  }
10255
10255
  rec.state = "committed";
@@ -10273,16 +10273,16 @@ function createGraphInstance(opts) {
10273
10273
  }
10274
10274
  if (purpose === "replace") {
10275
10275
  if (opts2.sourceRevision === void 0) {
10276
- throw new TypeError("beginIngest: purpose:'replace' requires sourceRevision (\xA77.5)");
10276
+ throw new TypeError("beginIngest: purpose:'replace' requires sourceRevision");
10277
10277
  }
10278
10278
  if (opts2.atomic === false) {
10279
10279
  throw new TypeError(
10280
- "beginIngest: replace sessions are always atomic \u2014 progressive replace frames would expose rows before their sourceRevision existed (\xA77.5)"
10280
+ "beginIngest: replace sessions are always atomic \u2014 progressive replace frames would expose rows before their sourceRevision existed"
10281
10281
  );
10282
10282
  }
10283
10283
  if (baseSource === "declarative") {
10284
10284
  throw new TypeError(
10285
- "beginIngest: purpose:'replace' is unavailable while a declarative data source is active; keep applying snapshots via applyHostUpdate, or use an overlay session (\xA77.5/T16)"
10285
+ "beginIngest: purpose:'replace' is unavailable while a declarative data source is active; keep applying snapshots via applyHostUpdate, or use an overlay session"
10286
10286
  );
10287
10287
  }
10288
10288
  }
@@ -10297,7 +10297,7 @@ function createGraphInstance(opts) {
10297
10297
  if (baseAccepted === null || baseAccepted.datasetKey !== opts2.datasetKey) {
10298
10298
  throw new OrbitOperationError(
10299
10299
  { code: "stale-revision", expected: currentModel, actual: opts2.baseModelRevision },
10300
- baseAccepted === null ? "beginIngest: overlay sessions require an accepted base dataset (\xA77.5 lineage)" : `beginIngest: overlay sessions must name the current datasetKey '${baseAccepted.datasetKey}', got '${opts2.datasetKey}' (\xA77.5 lineage)`
10300
+ baseAccepted === null ? "beginIngest: overlay sessions require an accepted base dataset" : `beginIngest: overlay sessions must name the current datasetKey '${baseAccepted.datasetKey}', got '${opts2.datasetKey}'`
10301
10301
  );
10302
10302
  }
10303
10303
  }
@@ -10306,7 +10306,7 @@ function createGraphInstance(opts) {
10306
10306
  purpose,
10307
10307
  datasetKey: opts2.datasetKey,
10308
10308
  sourceRevision: opts2.sourceRevision ?? null,
10309
- // replace is always atomic; overlays default atomic:true (§7.5).
10309
+ // replace is always atomic; overlays default atomic:true.
10310
10310
  atomic: purpose === "replace" ? true : opts2.atomic ?? true,
10311
10311
  overlayId,
10312
10312
  maxFlushLatencyMs: opts2.maxFlushLatencyMs ?? INGEST_MAX_FLUSH_LATENCY_MS_DEFAULT,
@@ -10419,11 +10419,11 @@ function createGraphInstance(opts) {
10419
10419
  pushServiceDiagnostic(
10420
10420
  "service-aborted",
10421
10421
  "info",
10422
- `expansion result for '${id}' discarded before admission: ${why} (\xA79.2)`
10422
+ `expansion result for '${id}' discarded before admission: ${why}`
10423
10423
  );
10424
10424
  throw new OrbitOperationError(
10425
10425
  { code: "aborted", cause: why },
10426
- `expandNode('${id}') result discarded: ${why} (\xA79.2)`
10426
+ `expandNode('${id}') result discarded: ${why}`
10427
10427
  );
10428
10428
  }
10429
10429
  async function mergeExpansionSession(id, ctx, at, batches, provenance) {
@@ -10644,14 +10644,14 @@ function createGraphInstance(opts) {
10644
10644
  expansionPromises.delete(id);
10645
10645
  const err = new OrbitOperationError(
10646
10646
  { code: "aborted", cause: "collapsed" },
10647
- `expandNode('${id}') aborted by retractExpansion() (\xA79.2/\xA716.3)`
10647
+ `expandNode('${id}') aborted by retractExpansion()`
10648
10648
  );
10649
10649
  expansionHandles.get(requestId)?.abort(err);
10650
10650
  expansionRejectors.get(requestId)?.(err);
10651
10651
  pushServiceDiagnostic(
10652
10652
  "service-aborted",
10653
10653
  "info",
10654
- `pending expansion of '${id}' aborted by retractExpansion() (\xA79.2)`
10654
+ `pending expansion of '${id}' aborted by retractExpansion()`
10655
10655
  );
10656
10656
  publish({ pendingExpansions: expansionLedger.ids() });
10657
10657
  }
@@ -10858,14 +10858,14 @@ function createGraphInstance(opts) {
10858
10858
  if (ctx.signal.aborted) {
10859
10859
  throw new OrbitOperationError(
10860
10860
  { code: "aborted", cause: "superseded" },
10861
- `search('${query}') was superseded before admission (\xA716.5)`
10861
+ `search('${query}') was superseded before admission`
10862
10862
  );
10863
10863
  }
10864
10864
  const denial = acceptanceQueue.admit(() => searchAdmissible(ctx, at));
10865
10865
  if (denial !== null) {
10866
10866
  throw new OrbitOperationError(
10867
10867
  { code: "aborted", cause: denial },
10868
- `search('${query}') result discarded: ${denial} (\xA79.2/\xA716.5)`
10868
+ `search('${query}') result discarded: ${denial}`
10869
10869
  );
10870
10870
  }
10871
10871
  if (accepted === null) return raw;
@@ -10896,7 +10896,7 @@ function createGraphInstance(opts) {
10896
10896
  const at = revisionSnapshot();
10897
10897
  const key = serviceCacheKey({
10898
10898
  serviceId: "search",
10899
- // `fields` is defensive insurance (F12-03): searchIndex is
10899
+ // `fields` is defensive insurance: searchIndex is
10900
10900
  // construction-only (D7) so it cannot legitimately change, but keying
10901
10901
  // it here guarantees a cached result can never outlive the field
10902
10902
  // configuration it was computed under.
@@ -10910,7 +10910,7 @@ function createGraphInstance(opts) {
10910
10910
  searchFlight = null;
10911
10911
  const err = new OrbitOperationError(
10912
10912
  { code: "aborted", cause: "superseded" },
10913
- `search('${query}') superseded the older in-flight query (\xA716.5)`
10913
+ `search('${query}') superseded the older in-flight query`
10914
10914
  );
10915
10915
  flight.handle.abort(err);
10916
10916
  flight.reject(err);
@@ -10976,7 +10976,7 @@ function createGraphInstance(opts) {
10976
10976
  searchFlight = null;
10977
10977
  const err = new OrbitOperationError(
10978
10978
  { code: "aborted", cause: "cleared" },
10979
- "search cleared while in flight (\xA716.5)"
10979
+ "search cleared while in flight"
10980
10980
  );
10981
10981
  flight.handle.abort(err);
10982
10982
  flight.reject(err);
@@ -11043,7 +11043,7 @@ function createGraphInstance(opts) {
11043
11043
  if (denial !== null) {
11044
11044
  throw new OrbitOperationError(
11045
11045
  { code: "aborted", cause: "stale" },
11046
- `findPath('${sourceId}' \u2192 '${targetId}') discarded: ${denial} (\xA79.2)`
11046
+ `findPath('${sourceId}' \u2192 '${targetId}') discarded: ${denial}`
11047
11047
  );
11048
11048
  }
11049
11049
  if (token !== pathSeq || result === null) return result;
@@ -11135,7 +11135,7 @@ function createGraphInstance(opts) {
11135
11135
  findings.push(`mode: unknown filter mode '${String(spec.mode)}'`);
11136
11136
  }
11137
11137
  if (findings.length > 0) {
11138
- throw new TypeError(`applyHostUpdate: invalid filter (\xA79.1): ${findings.join("; ")}`);
11138
+ throw new TypeError(`applyHostUpdate: invalid filter: ${findings.join("; ")}`);
11139
11139
  }
11140
11140
  }
11141
11141
  const prev = store.getState();
@@ -11175,7 +11175,7 @@ function createGraphInstance(opts) {
11175
11175
  severity: "error",
11176
11176
  count: issues.length,
11177
11177
  sampleIds: issues.slice(0, DIAGNOSTIC_SAMPLE_CAP).map((i) => i.where),
11178
- message: `columnar snapshot rejected whole (\xA75.1): ${issues[0].where} \u2014 ${issues[0].detail}`
11178
+ message: `columnar snapshot rejected whole: ${issues[0].where} \u2014 ${issues[0].detail}`
11179
11179
  }
11180
11180
  ];
11181
11181
  columnarRejected = true;
@@ -11196,14 +11196,14 @@ function createGraphInstance(opts) {
11196
11196
  const isReplay = baseAccepted !== null && baseAccepted.datasetKey === data.datasetKey && baseAccepted.sourceRevision === data.sourceRevision;
11197
11197
  if (!isReplay) {
11198
11198
  const nextAccepted = preAccepted ?? validateSnapshot(data);
11199
- abortAllSessions(null, "replaced: a declarative snapshot was applied (\xA77.5)");
11199
+ abortAllSessions(null, "replaced: a declarative snapshot was applied");
11200
11200
  overlayIdsCleared = clearOverlayState();
11201
11201
  datasetKeyChanged = baseAccepted !== null && baseAccepted.datasetKey !== data.datasetKey;
11202
11202
  if (datasetKeyChanged) {
11203
11203
  reconciler = new Reconciler();
11204
11204
  engineDiags = [];
11205
11205
  abortExpansionsForDatasetSwap();
11206
- abortSearchFlight("dataset-changed", "search aborted: the datasetKey changed (\xA75/\xA716.5)");
11206
+ abortSearchFlight("dataset-changed", "search aborted: the datasetKey changed");
11207
11207
  resetMaskState();
11208
11208
  historyKernel.clear();
11209
11209
  stopTimelineTimer();
@@ -11318,7 +11318,7 @@ function createGraphInstance(opts) {
11318
11318
  severity: "error",
11319
11319
  count: 1,
11320
11320
  sampleIds: [],
11321
- message: "groups and groupBy are mutually exclusive (\xA716.3 R-16.3-15): NEITHER applies until the host removes one"
11321
+ message: "groups and groupBy are mutually exclusive: NEITHER applies until the host removes one"
11322
11322
  }
11323
11323
  ];
11324
11324
  groupsDiagsChanged = true;
@@ -11356,7 +11356,7 @@ function createGraphInstance(opts) {
11356
11356
  severity: "warning",
11357
11357
  count: 1,
11358
11358
  sampleIds: [],
11359
- message: "parallelEdgeGrouping is inoperative: the accepted edge list has no same-endpoint-pair parallels (ids synthesized from (type,source,target)-style dedupe already collapse them) \u2014 the toggle changed nothing (\xA716.3 R-16.3-24)"
11359
+ message: "parallelEdgeGrouping is inoperative: the accepted edge list has no same-endpoint-pair parallels (ids synthesized from (type,source,target)-style dedupe already collapse them) \u2014 the toggle changed nothing"
11360
11360
  }
11361
11361
  ];
11362
11362
  parallelRejected = true;
@@ -11436,7 +11436,7 @@ function createGraphInstance(opts) {
11436
11436
  severity: "warning",
11437
11437
  count: update.metrics.length,
11438
11438
  sampleIds: update.metrics.slice(0, DIAGNOSTIC_SAMPLE_CAP).map((c) => c.metric),
11439
- message: "metric columns discarded: no accepted model to join against (\xA712)"
11439
+ message: "metric columns discarded: no accepted model to join against"
11440
11440
  }
11441
11441
  ];
11442
11442
  } else {
@@ -11445,7 +11445,7 @@ function createGraphInstance(opts) {
11445
11445
  count: accepted.nodes.length,
11446
11446
  // I1: columns must be stamped with the revision current at ISSUE
11447
11447
  // time — never the post-update revision (that made the gate
11448
- // self-satisfying, F11-01).
11448
+ // self-satisfying).
11449
11449
  modelRevision: issuedModelSeq
11450
11450
  });
11451
11451
  metricDiags = res.diagnostics;
@@ -11582,7 +11582,7 @@ function createGraphInstance(opts) {
11582
11582
  severity: "warning",
11583
11583
  count: 1,
11584
11584
  sampleIds: [],
11585
- message: "searchIndex is construction-only (\xA716.5/D7): pass it to createGraphInstance options (or key-remount <Graph>) \u2014 this update's searchIndex was ignored"
11585
+ message: "searchIndex is construction-only: pass it to createGraphInstance options (or key-remount <Graph>) \u2014 this update's searchIndex was ignored"
11586
11586
  }
11587
11587
  ];
11588
11588
  searchIndexRejected = true;
@@ -12019,9 +12019,9 @@ function createGraphInstance(opts) {
12019
12019
  applyEmphasis(s.engine, node === null ? null : index);
12020
12020
  emit("nodeHover", { node });
12021
12021
  },
12022
- // §13 native-route edge events (§7.4 mapping). Host onLink* events are
12022
+ // native-route edge events. Host onLink* events are
12023
12023
  // honored regardless of the committed route — an adapter that surfaces
12024
- // them despite declaring linkPicking:false is a harmless pass-through
12024
+ // them despite declaring linkPicking:false is a harmless pass-through
12025
12025
  // but only the 'native' route RELIES on them; the fallback route feeds
12026
12026
  // the same typed events through the pointer samplers.
12027
12027
  onLinkClick(linkIndex) {
@@ -12058,7 +12058,7 @@ function createGraphInstance(opts) {
12058
12058
  const prevented = emit("nodeDragEnd", { node, x, y });
12059
12059
  if (!prevented) writePin(node.id, [x, y]);
12060
12060
  },
12061
- // §14/§15: right-click / long-press → typed 'contextMenu' event. The
12061
+ // Right-click or long-press → typed 'contextMenu' event. The
12062
12062
  // core adds NO built-in follow-up — components own the menu.
12063
12063
  onContextMenu(index, screen) {
12064
12064
  if (!active()) return;
@@ -12072,7 +12072,7 @@ function createGraphInstance(opts) {
12072
12072
  emit("contextMenu", { target: { kind: "node", node }, screen: screenPt });
12073
12073
  },
12074
12074
  /**
12075
- * §13/§17 overlay scheduler tick (adapter activity clock). Per tick:
12075
+ * Overlay scheduler tick (adapter activity clock). Per tick:
12076
12076
  * (1) sim-hot degradation — while the simulation runs, ONE getPositions
12077
12077
  * readback refreshes the CPU cache at a capped >=500ms cadence (M0:
12078
12078
  * tracked readback stalls ~18ms, so the lane NEVER reads back per
@@ -12299,8 +12299,8 @@ function createGraphInstance(opts) {
12299
12299
  route,
12300
12300
  screenToSpace: (p) => eng.screenToSpace?.(p) ?? null,
12301
12301
  medianLinkWidthPx: () => medianLinkWidthPx(lastLinkWidths),
12302
- // S9-T18: the facade's per-candidate visibility mask reads the LIVE
12303
- // §9.1 mask — no re-arm needed on mask changes (§13 grid invariance).
12302
+ // the facade's per-candidate visibility mask reads the LIVE
12303
+ // mask — no re-arm needed on mask changes.
12304
12304
  linkVisible: (linkIndex) => maskEdgeVisibleAt(linkIndex)
12305
12305
  });
12306
12306
  const restartAlpha = layout === "force" ? 1 : null;
@@ -12405,7 +12405,7 @@ function createGraphInstance(opts) {
12405
12405
  if (g.requestAnimationFrame === wrapper) g.requestAnimationFrame = native;
12406
12406
  if (registrations > 0 && !destroyed) {
12407
12407
  console.warn(
12408
- `orbit: ${registrations} requestAnimationFrame registration(s) observed over 500ms while this instance is quiescent (\xA717/S13-T06 one-frame-loop). If no app-owned animation is running, a second frame loop is leaking.`
12408
+ `orbit: ${registrations} requestAnimationFrame registration(s) observed over 500ms while this instance is quiescent. If no app-owned animation is running, a second frame loop is leaking.`
12409
12409
  );
12410
12410
  }
12411
12411
  }, 500);
@@ -12480,7 +12480,7 @@ function createGraphInstance(opts) {
12480
12480
  function warnViewStateDrop(channel, why) {
12481
12481
  if (!DEV || viewStateDropWarned.has(channel)) return;
12482
12482
  viewStateDropWarned.add(channel);
12483
- console.warn(`orbit: getViewState omitted ${channel} \u2014 ${why} (\xA716.14)`);
12483
+ console.warn(`orbit: getViewState omitted ${channel} \u2014 ${why}`);
12484
12484
  }
12485
12485
  function serializableScaleOf(channel, value) {
12486
12486
  if (value === void 0) return void 0;
@@ -12597,7 +12597,7 @@ function createGraphInstance(opts) {
12597
12597
  if (visible.length > limit) {
12598
12598
  throw new OrbitOperationError(
12599
12599
  { code: "export-materialization-too-large", rowCount: visible.length, limit },
12600
- `includePositions over ${limit} nodes \u2014 persist the layout through the export lane and reference it from dataRef (\xA716.14)`
12600
+ `includePositions over ${limit} nodes \u2014 persist the layout through the export lane and reference it from dataRef`
12601
12601
  );
12602
12602
  }
12603
12603
  const pos = eng.getPositions();
@@ -12697,7 +12697,7 @@ function createGraphInstance(opts) {
12697
12697
  severity: "error",
12698
12698
  count: verdict.problems.length,
12699
12699
  sampleIds: [],
12700
- message: `setViewState rejected (${verdict.code}): ${verdict.problems.slice(0, 3).join("; ")} \u2014 nothing was applied (\xA716.14)`
12700
+ message: `setViewState rejected (${verdict.code}): ${verdict.problems.slice(0, 3).join("; ")} \u2014 nothing was applied`
12701
12701
  }
12702
12702
  ];
12703
12703
  pendingDiagnosticsRefresh = true;
@@ -12920,7 +12920,7 @@ function createGraphInstance(opts) {
12920
12920
  if (eng2 === null || eng2.captureScreenshot === void 0) {
12921
12921
  throw new OrbitOperationError(
12922
12922
  { code: "aborted", cause: "no screenshot capability" },
12923
- 'exportImage("png") requires an engine with screenshot capture (\xA716.14)'
12923
+ 'exportImage("png") requires an engine with screenshot capture'
12924
12924
  );
12925
12925
  }
12926
12926
  const blob = await eng2.captureScreenshot();
@@ -12961,7 +12961,7 @@ function createGraphInstance(opts) {
12961
12961
  if (elementCount > limit && opts2?.fallback !== "raster-hybrid") {
12962
12962
  throw new OrbitOperationError(
12963
12963
  { code: "export-too-large", elementCount, limit },
12964
- `SVG export of ${elementCount} elements exceeds ${limit} \u2014 filter/isolate first, or pass { fallback: 'raster-hybrid' } (\xA716.14)`
12964
+ `SVG export of ${elementCount} elements exceeds ${limit} \u2014 filter/isolate first, or pass { fallback: 'raster-hybrid' }`
12965
12965
  );
12966
12966
  }
12967
12967
  let minX = Infinity;
@@ -13092,7 +13092,7 @@ function createGraphInstance(opts) {
13092
13092
  if (rowCount > limit) {
13093
13093
  throw new OrbitOperationError(
13094
13094
  { code: "export-materialization-too-large", rowCount, limit },
13095
- `exportData would materialize ${rowCount} rows (limit ${limit}) \u2014 use exportDataStream (\xA716.14)`
13095
+ `exportData would materialize ${rowCount} rows (limit ${limit}) \u2014 use exportDataStream`
13096
13096
  );
13097
13097
  }
13098
13098
  if (scope === "accepted") return { nodes: pin.accepted.nodes, edges: pin.accepted.edges };
@@ -13135,7 +13135,7 @@ function createGraphInstance(opts) {
13135
13135
  if (bound > limit) {
13136
13136
  throw new OrbitOperationError(
13137
13137
  { code: "export-materialization-too-large", rowCount: bound, limit },
13138
- `exportLayout would materialize ${bound} rows (limit ${limit}) \u2014 use exportLayoutStream (\xA716.14)`
13138
+ `exportLayout would materialize ${bound} rows (limit ${limit}) \u2014 use exportLayoutStream`
13139
13139
  );
13140
13140
  }
13141
13141
  const out = /* @__PURE__ */ new Map();
@@ -13214,9 +13214,8 @@ function createGraphInstance(opts) {
13214
13214
  visibleNodeCount: st.visible.nodes,
13215
13215
  visibleEdgeCount: st.visible.edges,
13216
13216
  estimatedCpuBytes: estimateCpuBytes(),
13217
- // The acceptance queue is synchronous (depth is 0 outside a job, and a
13218
- // reader inside a job observes 1); async ingestion depth arrives with
13219
- // the worker lane (PR-E).
13217
+ // The acceptance queue is synchronous: depth is 0 outside a job, and a
13218
+ // reader inside a job observes 1.
13220
13219
  queueDepth: acceptanceQueue.active ? 1 : 0,
13221
13220
  modelRevision: st.revisions.model,
13222
13221
  scopeRevision: st.revisions.scope,
@@ -13440,7 +13439,7 @@ var OverviewController = class {
13440
13439
  getScene;
13441
13440
  getVisible;
13442
13441
  size;
13443
- /** Transform of the LAST rasterization; null until rasterize() succeeds. */
13442
+ /** Transform of the LAST rasterization; null until rasterize succeeds. */
13444
13443
  frame = null;
13445
13444
  // --- throttle state (latched by shouldRefresh when it answers true) ---
13446
13445
  lastRefreshMs = null;
@@ -13455,9 +13454,9 @@ var OverviewController = class {
13455
13454
  * when it returns true, so each `true` accounts for exactly one refresh:
13456
13455
  *
13457
13456
  * - hot (`simulationRunning`): time-gated only (≤ 2 Hz) — the epoch is
13458
- * ignored because positions change continuously without epoch advances;
13457
+ * ignored because positions change continuously without epoch advances;
13459
13458
  * - idle: refresh only when the epoch ADVANCED since the last refresh,
13460
- * time-gated at ≤ 1 Hz;
13459
+ * time-gated at ≤ 1 Hz;
13461
13460
  * - idle + unchanged epoch: always false — zero work, forever.
13462
13461
  */
13463
13462
  shouldRefresh(nowMs2, simulationRunning, epoch) {
@@ -13475,7 +13474,7 @@ var OverviewController = class {
13475
13474
  /**
13476
13475
  * Rasterizes the current scene into a fresh `size²` RGBA dot field: 1 px
13477
13476
  * white dots whose alpha ACCUMULATES on overlap (heatmap-ish density),
13478
- * dimmed for mask-hidden points; NaN pairs (§7.3 tombstones) are skipped.
13477
+ * dimmed for mask-hidden points; NaN pairs are skipped.
13479
13478
  * World bounds map into the thumbnail with a 5 % edge padding at a UNIFORM
13480
13479
  * scale (aspect preserved, centered on the short axis) and a downward pixel
13481
13480
  * y (see module header). Returns null when there is no scene or no point.