@operato/twin-kernel 0.7.58 → 0.7.59

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.
@@ -630,6 +630,26 @@ export class ObservedReducer {
630
630
  * 덮었다**(rack-1 의 100개가 사라지고 합계가 60이 됐다). 로트가 나뉘어 놓이는 것은 일상이다.
631
631
  */
632
632
  const subLotId = `${qe.epcClass}@${loc}`;
633
+ /*
634
+ * ── ★ **이 갈래가 문을 지나지 않았다** (2026-08-24 실측) ──────────────
635
+ * 개체 관측은 `stale()` 을 지나는데 **수량 관측은 지나지 않았다.** 둘이 걸려 있었다.
636
+ *
637
+ * ① **순서 판정이 없었다** — 늦게 온 옛 관측이 최신 수량을 덮는다. 실 연동에서 순서는 뒤집힌다
638
+ * (재시도·큐·배치). 비직렬 자재가 주된 경로인 원본(식품 제조)에서는 이것이 재고의 대부분이다.
639
+ *
640
+ * ② **트윈의 시계가 밀리지 않았다** — `stale()` 이 관측 시각을 기억하는 유일한 자리이고
641
+ * (`observedAtMs`), `nowMs` 가 그 값을 「지금」으로 쓴다. 그래서 포천 미러는 재고 관측이
642
+ * 오늘 시각으로 계속 들어오는데도 `nowTime` 이 **2026-04-15 에 멈춰 있었다** — 시계를 밀던
643
+ * 유일한 스트림(공정·로트)이 4월에 멈춘 것이다. 그 결과 주의 신호의 지속시간이 언제나 0 이고,
644
+ * 시각으로 재는 모든 판단이 조용히 틀렸다.
645
+ *
646
+ * 에너지 경로가 같은 문을 우회해 같은 사고가 났고(2026-08-18) 그때 `noteObservedAt` 을 냈다.
647
+ * **세 번째다.** 축을 늘릴 때 이 문을 지나는지 보는 것이 규율이다.
648
+ *
649
+ * 키에 서브로트를 넣는다 — 같은 로트의 다른 자리가 서로를 막지 않아야 한다(§`subLotId`).
650
+ */
651
+ if (envelope && this.stale(`item:${subLotId}`, envelope))
652
+ continue;
633
653
  this.items.set(subLotId, this.mergeItem(qe.epcClass, { location: loc, disposition: ev.disposition, ilmd: ev.ilmd }, qe, mine, subLotId));
634
654
  }
635
655
  }
@@ -1812,6 +1812,7 @@ var ObservedReducer = class {
1812
1812
  if (!qe?.epcClass) continue;
1813
1813
  const mine = all.filter((x) => x.epcClass === qe.epcClass);
1814
1814
  const subLotId = `${qe.epcClass}@${loc}`;
1815
+ if (envelope && this.stale(`item:${subLotId}`, envelope)) continue;
1815
1816
  this.items.set(subLotId, this.mergeItem(qe.epcClass, { location: loc, disposition: ev.disposition, ilmd: ev.ilmd }, qe, mine, subLotId));
1816
1817
  }
1817
1818
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@operato/twin-kernel",
3
- "version": "0.7.58",
3
+ "version": "0.7.59",
4
4
  "type": "module",
5
5
  "description": "Twin Domain Kernel — framework-agnostic, zero-dep (domain + sim + 3-channel contract). WMS/YMS/MES, EPCIS 2.0 · ISA-95.",
6
6
  "publishConfig": {