@operato/twin-kernel 0.8.3 → 0.8.4
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-cjs/index.cjs +59 -0
- package/package.json +2 -2
package/dist-cjs/index.cjs
CHANGED
|
@@ -218,6 +218,32 @@ function locationStatusOf(n) {
|
|
|
218
218
|
const r = (n.occupancy ?? 0) / cap;
|
|
219
219
|
return r >= 1 ? "full" : r >= LOCATION_SATURATION_NEAR ? "near-full" : "available";
|
|
220
220
|
}
|
|
221
|
+
var DISPOSITION_DECISION = [
|
|
222
|
+
/** 원 규격으로 되돌린다 — 공정에 다시 들어가고, 산출물은 원 품목이다. */
|
|
223
|
+
"rework",
|
|
224
|
+
/**
|
|
225
|
+
* 쓸 수 있게 만들되 **원 규격은 아니다** — 공정에 다시 들어가지만 산출물이 원 품목이 아니다.
|
|
226
|
+
*
|
|
227
|
+
* `rework` 와 나눈 이유는 이름이 아니라 **효과**다. 되돌린 것과 고쳐 쓴 것은 산출물의 정체성이
|
|
228
|
+
* 다르고, 그것을 한 낱말로 묶으면 계보가 「원 품목을 만들었다」고 거짓을 말한다.
|
|
229
|
+
*/
|
|
230
|
+
"repair",
|
|
231
|
+
/** 그대로 쓴다 — 공정도 정체성도 바뀌지 않는다. */
|
|
232
|
+
"use-as-is",
|
|
233
|
+
/**
|
|
234
|
+
* **등급을 내려 다른 품목으로 판다** — 공정에 다시 들어가지 않고, 그 자리에서 품목 정의가 바뀐다.
|
|
235
|
+
*
|
|
236
|
+
* 다른 넷과 축이 다르다. 폐기도 특채도 아니고 **자재의 품목 자체가 달라진다**(GTIN 이 바뀐다).
|
|
237
|
+
* 식품·철강·섬유에서 일상이다.
|
|
238
|
+
*/
|
|
239
|
+
"regrade",
|
|
240
|
+
/** 재고에서 뺀다. */
|
|
241
|
+
"scrap",
|
|
242
|
+
/** 공급자에게 돌려보낸다 — 재고에서 빠지되 폐기와 다른 사실이다. */
|
|
243
|
+
"return-to-supplier",
|
|
244
|
+
/** 아직 정하지 않았다 — 묶어 두고 쓰지 않는다. */
|
|
245
|
+
"hold"
|
|
246
|
+
];
|
|
221
247
|
function testPassedAt(r, at) {
|
|
222
248
|
if (r.result !== "pass")
|
|
223
249
|
return false;
|
|
@@ -1783,6 +1809,39 @@ var SPECS = {
|
|
|
1783
1809
|
* `propertyMeasurements` 안쪽은 재검사하지 않는다 — 그 모양은 `PropertyMeasurement` 계약이고,
|
|
1784
1810
|
* 여기서 두 번 지키면 두 벌이 된다(설비 `motion` 과 같은 규율).
|
|
1785
1811
|
*/
|
|
1812
|
+
/*
|
|
1813
|
+
* **부적합 처분** — 재고 판정을 받은 것을 어떻게 하기로 정했나.
|
|
1814
|
+
*
|
|
1815
|
+
* ── 이 통이 늦게 생긴 이유 (2026-08-30) ──────────────────────────────────
|
|
1816
|
+
* 사건 이름(`OP_EVENT.disposition`)과 모양(`DispositionFact`)을 먼저 만들고 **여기로 오는 길을
|
|
1817
|
+
* 내지 않았다.** 그래서 처분 사실을 보내면 어느 통도 아니어서 떨어진 목록에도 남지 않고 사라졌다.
|
|
1818
|
+
* MES 전문가가 소스를 읽다 찾았다.
|
|
1819
|
+
*
|
|
1820
|
+
* 이 파일의 위 주석이 말한 부류 그대로다 — `OP_EVENT.test` 와 `OP_EVENT.observation` 이 같은 일을
|
|
1821
|
+
* 겪었고 이번이 셋째다. **계약에 자리를 만드는 것과 그 자리로 가는 길을 내는 것은 다른 일이다.**
|
|
1822
|
+
*
|
|
1823
|
+
* ── 판정과 다른 사실이다 ─────────────────────────────────────────────────
|
|
1824
|
+
* 근거가 된 판정(`specId`)을 가리킬 수 있지만 **필수가 아니다** — 판정 없이 현장 재량으로 빼는 일이
|
|
1825
|
+
* 정상이다. 그래서 정체성은 처분 대상(`subjectId`)이다.
|
|
1826
|
+
*/
|
|
1827
|
+
disposition: {
|
|
1828
|
+
eventType: OP_EVENT.disposition,
|
|
1829
|
+
identity: "subjectId",
|
|
1830
|
+
/* 무엇을 어떻게 하기로 했나 — 둘 중 하나가 없으면 그 결정은 아무 데도 붙지 못한다. */
|
|
1831
|
+
required: ["subjectId", "decision"],
|
|
1832
|
+
fields: {
|
|
1833
|
+
subjectId: "string",
|
|
1834
|
+
decision: "string",
|
|
1835
|
+
quantity: "number",
|
|
1836
|
+
uom: "string",
|
|
1837
|
+
specId: "string",
|
|
1838
|
+
decidedBy: "string",
|
|
1839
|
+
reason: "string",
|
|
1840
|
+
decidedAt: "string",
|
|
1841
|
+
recordTime: "string"
|
|
1842
|
+
},
|
|
1843
|
+
enums: { decision: DISPOSITION_DECISION }
|
|
1844
|
+
},
|
|
1786
1845
|
test: {
|
|
1787
1846
|
eventType: OP_EVENT.test,
|
|
1788
1847
|
identity: "testableObjectId",
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@operato/twin-kernel",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.4",
|
|
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": {
|
|
@@ -28,6 +28,6 @@
|
|
|
28
28
|
"test": "node --test test/*.test.ts"
|
|
29
29
|
},
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"@operato/ops-contract": "^0.
|
|
31
|
+
"@operato/ops-contract": "^0.4.0"
|
|
32
32
|
}
|
|
33
33
|
}
|