@operato/twin-kernel 0.4.0 → 0.4.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/contract.js CHANGED
@@ -541,8 +541,12 @@ export function readBoardLocations(def) {
541
541
  return d.locations ?? d.nodes ?? []; // vocabulary-guard: allow — 옛 키 흡수
542
542
  }
543
543
  export function readBoardEquipment(def) {
544
+ /* `movers` 는 개명 **이전의 이름**이다(movers → equipmentList → equipment). 저장된 보드에는 세 세대가
545
+ 섞여 있어(실측: 23개 중 13개가 `movers`) 하나라도 빠뜨리면 그 보드는 **설비가 0인 공장**으로 읽힌다 —
546
+ 오류 없이. 실제로 그랬다: 화면의 설비 수가 0이고, 용량 판정에 자원이 없고, 카탈로그 통합 테스트가
547
+ "완제품 0" 으로 떨어졌다. 셋 다 원인이 이 한 줄이었다. */
544
548
  const d = def; // vocabulary-guard: allow — 옛 키를 읽어야 하는 자리
545
- const list = d.equipment ?? d.equipmentList ?? []; // vocabulary-guard: allow — 옛 키 흡수
549
+ const list = d.equipment ?? d.equipmentList ?? d.movers ?? []; // vocabulary-guard: allow — 옛 키 흡수
546
550
  /* 소속 자리 키도 함께 정규화한다 — `homeNode → homeLocation` 개명 전 보드가 23개 있다. (vocabulary-guard: allow — 옛 키 정규화 설명)
547
551
  배열만 흡수하고 안쪽 키를 놓치면 설비는 나타나지만 **소속이 전부 비어** 롤업이 통째로 사라진다. */
548
552
  return list.map(e => normalizeHomeLocation(e));
@@ -25,6 +25,12 @@ export const VOCABULARY_EXCEPTIONS = [
25
25
  { token: 'moverId', why: 'journal wire field — renaming would mix two keys for one fact across history' },
26
26
  { token: 'fromNode', why: 'journal wire field (task.status payload)' },
27
27
  { token: 'toNode', why: 'journal wire field (task.status payload)' },
28
+ /* ── 보드의 옛 세대 키 — 저장된 데이터라 읽어는 줘야 한다 ────────────────
29
+ * 설비 배열의 이름은 세 세대를 거쳤다(movers → equipmentList → equipment). 저장된 보드에는
30
+ * 셋이 섞여 있고(실측 23개 중 13개가 `movers`), 하나라도 안 읽으면 그 보드는 **설비가 0인 공장**
31
+ * 으로 조용히 읽힌다 — 화면의 설비 수가 0이 되고 용량 판정에서 자원이 사라진다. 쓰는 곳은
32
+ * `readBoardEquipment` 한 곳뿐이고, 거기서 새 이름으로 정규화해 내보낸다. */
33
+ { token: 'movers', why: 'legacy board key (movers → equipmentList → equipment); read-only normalization in readBoardEquipment, 13 stored boards still use it' },
28
34
  /* ── 씬 컴포넌트 타입 — 보드에 저장된 값이고, 뜻이 어긋나지도 않는다 ──────
29
35
  * 보드 7개가 이 타입으로 컴포넌트를 담고 있어 개명하면 그 컴포넌트가 조용히 안 그려진다.
30
36
  * 그리고 씬에서 이 이름은 자원이 아니라 **움직임 표현**을 가리킨다(표준과 충돌 아님). */
@@ -419,7 +419,7 @@ function readBoardLocations(def) {
419
419
  }
420
420
  function readBoardEquipment(def) {
421
421
  const d = def;
422
- const list = d.equipment ?? d.equipmentList ?? [];
422
+ const list = d.equipment ?? d.equipmentList ?? d.movers ?? [];
423
423
  return list.map((e) => normalizeHomeLocation(e));
424
424
  }
425
425
  function normalizeHomeLocation(entry) {
@@ -4339,6 +4339,12 @@ var VOCABULARY_EXCEPTIONS = [
4339
4339
  { token: "moverId", why: "journal wire field \u2014 renaming would mix two keys for one fact across history" },
4340
4340
  { token: "fromNode", why: "journal wire field (task.status payload)" },
4341
4341
  { token: "toNode", why: "journal wire field (task.status payload)" },
4342
+ /* ── 보드의 옛 세대 키 — 저장된 데이터라 읽어는 줘야 한다 ────────────────
4343
+ * 설비 배열의 이름은 세 세대를 거쳤다(movers → equipmentList → equipment). 저장된 보드에는
4344
+ * 셋이 섞여 있고(실측 23개 중 13개가 `movers`), 하나라도 안 읽으면 그 보드는 **설비가 0인 공장**
4345
+ * 으로 조용히 읽힌다 — 화면의 설비 수가 0이 되고 용량 판정에서 자원이 사라진다. 쓰는 곳은
4346
+ * `readBoardEquipment` 한 곳뿐이고, 거기서 새 이름으로 정규화해 내보낸다. */
4347
+ { token: "movers", why: "legacy board key (movers \u2192 equipmentList \u2192 equipment); read-only normalization in readBoardEquipment, 13 stored boards still use it" },
4342
4348
  /* ── 씬 컴포넌트 타입 — 보드에 저장된 값이고, 뜻이 어긋나지도 않는다 ──────
4343
4349
  * 보드 7개가 이 타입으로 컴포넌트를 담고 있어 개명하면 그 컴포넌트가 조용히 안 그려진다.
4344
4350
  * 그리고 씬에서 이 이름은 자원이 아니라 **움직임 표현**을 가리킨다(표준과 충돌 아님). */
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@operato/twin-kernel",
3
- "version": "0.4.0",
3
+ "version": "0.4.1",
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": {