@things-factory/figure-service 10.1.210 → 10.1.213

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.
Files changed (47) hide show
  1. package/README.md +1 -1
  2. package/dist-server/service/figure/event-subscriber.js +2 -2
  3. package/dist-server/service/figure/event-subscriber.js.map +1 -1
  4. package/dist-server/service/figure/figure-format.js +1 -1
  5. package/dist-server/service/figure/figure-format.js.map +1 -1
  6. package/dist-server/service/figure/figure-mutation.d.ts +5 -5
  7. package/dist-server/service/figure/figure-mutation.js +6 -6
  8. package/dist-server/service/figure/figure-mutation.js.map +1 -1
  9. package/dist-server/service/figure/figure-query.d.ts +3 -3
  10. package/dist-server/service/figure/figure-query.js +4 -4
  11. package/dist-server/service/figure/figure-query.js.map +1 -1
  12. package/dist-server/service/figure/figure-rename.d.ts +4 -4
  13. package/dist-server/service/figure/figure-rename.js +2 -2
  14. package/dist-server/service/figure/figure-rename.js.map +1 -1
  15. package/dist-server/service/figure/figure-tools.js +9 -9
  16. package/dist-server/service/figure/figure-tools.js.map +1 -1
  17. package/dist-server/service/figure/figure-type.d.ts +2 -2
  18. package/dist-server/service/figure/figure-type.js +2 -2
  19. package/dist-server/service/figure/figure-type.js.map +1 -1
  20. package/dist-server/service/figure/figure.d.ts +2 -2
  21. package/dist-server/service/figure/figure.js +1 -1
  22. package/dist-server/service/figure/figure.js.map +1 -1
  23. package/dist-server/tsconfig.tsbuildinfo +1 -1
  24. package/package.json +6 -6
  25. package/recipes/belt-surface/guide.ko.md +1 -1
  26. package/recipes/roller-row/facts.md +1 -1
  27. package/recipes/roller-row/guide.ko.md +1 -1
  28. package/recipes/sliding-door/facts.md +1 -1
  29. package/recipes/sliding-door/guide.ko.md +1 -1
  30. package/server/service/figure/catalog-db.test.ts +1 -1
  31. package/server/service/figure/event-subscriber.ts +2 -2
  32. package/server/service/figure/figure-blueprint-query.test.ts +3 -3
  33. package/server/service/figure/figure-format.test.ts +7 -7
  34. package/server/service/figure/figure-format.ts +1 -1
  35. package/server/service/figure/figure-llm-smoke.test.ts +1 -1
  36. package/server/service/figure/figure-mutation.ts +6 -6
  37. package/server/service/figure/figure-propose-steps.test.ts +2 -2
  38. package/server/service/figure/figure-query.ts +4 -4
  39. package/server/service/figure/figure-rename-db.test.ts +2 -2
  40. package/server/service/figure/figure-rename.test.ts +3 -3
  41. package/server/service/figure/figure-rename.ts +6 -6
  42. package/server/service/figure/figure-subject.test.ts +1 -1
  43. package/server/service/figure/figure-tools.test.ts +19 -19
  44. package/server/service/figure/figure-tools.ts +9 -9
  45. package/server/service/figure/figure-type.ts +2 -2
  46. package/server/service/figure/figure.ts +2 -2
  47. package/translations/ko.json +31 -31
package/README.md CHANGED
@@ -3,7 +3,7 @@
3
3
  저작된 3D 컴포넌트 한 종류(**Figure**)를 저장·검증·조회한다. 컴포넌트 저작도구의
4
4
  서버 몫이고, 화면 몫은 `@things-factory/figure-ui` 다.
5
5
 
6
- ## 무엇을 담나 — 도형 자산이다
6
+ ## 무엇을 담나 — 피규어 자산이다
7
7
 
8
8
  형식은 `@hatiolab/figure-model` 이 정한다(`figure-asset-1`). **씬 컴포넌트 트리를 담지 않는다.**
9
9
  컴파일한 것도 저장하지 않는다 — 원본에서 파생되므로 소비하는 쪽이 커널로 컴파일한다.
@@ -9,14 +9,14 @@ const figure_history_js_1 = require("./figure-history.js");
9
9
  /**
10
10
  * 판본을 남긴다 — **발행된 저장에만.**
11
11
  *
12
- * `@operato/typeorm-history` 는 원래 모든 저장을 베낀다. 그런데 도형은 저작 중에 수십 번 저장되고,
12
+ * `@operato/typeorm-history` 는 원래 모든 저장을 베낀다. 그런데 피규어는 저작 중에 수십 번 저장되고,
13
13
  * 그 전부를 남기면 판본 목록이 「내가 오늘 몇 번 눌렀나」가 된다. 사람이 판이라고 부르는 것은
14
14
  * **발행한 것**이므로 그때만 베낀다. board 가 같은 규칙으로 돈다(`board-service` 의 같은 이름 파일).
15
15
  *
16
16
  * 발행판의 정본(`__releaseSource`)은 크기 범위를 적은 발행판 사본이다 — Figure 행에는 작성자가 좁힌 끝만 남는다.
17
17
  *
18
18
  * 발행 메모는 Figure 의 칸이 아니다. `releaseFigure` 가 저장할 엔티티에 `__releaseComment` 로 얹어
19
- * 두면 여기서 판본의 `comment` 로 옮긴다 — 메모는 그 판의 것이지 도형의 것이 아니다. 정본 형식
19
+ * 두면 여기서 판본의 `comment` 로 옮긴다 — 메모는 그 판의 것이지 피규어의 것이 아니다. 정본 형식
20
20
  * (`__releaseFormat`), 잰 커널의 판(`__releaseKernel`, ADR-0109 C1), 직전 판에 견준 변경(`__releaseChanges`), 발행 때 잰 값(`__releaseMetrics`)과
21
21
  * 윗모습(`__releaseTopView`)도 같은 길로 옮긴다(ADR-0104).
22
22
  */
@@ -1 +1 @@
1
- {"version":3,"file":"event-subscriber.js","sourceRoot":"","sources":["../../../server/service/figure/event-subscriber.ts"],"names":[],"mappings":";;;;AAAA,qCAAyC;AAEzC,8DAAkE;AAElE,2CAAoC;AACpC,2DAAmD;AAEnD;;;;;;;;;;;;;GAaG;AACH,4FAA4F;AAC5F,SAAS,iBAAiB,CAAC,OAAsB,EAAE,MAAc;IAC/D,MAAM,CAAC,GAAG,MAAa,CAAA;IACvB,+GAA+G;IAC/G,IAAI,CAAC,CAAC,eAAe;QAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,eAAe,CACxD;IAAC,OAAe,CAAC,OAAO,GAAG,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAA;IACtD,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,eAAe,IAAI,IAAI,CAAA;IAC/C,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,eAAe,IAAI,IAAI,CAAA;IACjD,sEAAsE;IACtE,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;IACxF,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;IACxF,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;IACxF,OAAO,OAAO,CAAA;AAChB,CAAC;AAGM,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,yCAA8C;IAC/F,IAAW,MAAM;QACf,OAAO,kBAAM,CAAA;IACf,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,iCAAa,CAAA;IACtB,CAAC;IAEM,mBAAmB,CAAC,OAAsB,EAAE,MAAc;QAC/D,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC;IAEM,mBAAmB,CAAC,OAAsB,EAAE,MAAc;QAC/D,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAU;QACjC,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,UAAU,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAU;QACjC,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,UAAU,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;CACF,CAAA;AA5BY,sEAA6B;wCAA7B,6BAA6B;IADzC,IAAA,yBAAe,GAAE;GACL,6BAA6B,CA4BzC","sourcesContent":["import { EventSubscriber } from 'typeorm'\n\nimport { HistoryEntitySubscriber } from '@operato/typeorm-history'\n\nimport { Figure } from './figure.js'\nimport { FigureHistory } from './figure-history.js'\n\n/**\n * 판본을 남긴다 — **발행된 저장에만.**\n *\n * `@operato/typeorm-history` 는 원래 모든 저장을 베낀다. 그런데 도형은 저작 중에 수십 번 저장되고,\n * 그 전부를 남기면 판본 목록이 「내가 오늘 몇 번 눌렀나」가 된다. 사람이 판이라고 부르는 것은\n * **발행한 것**이므로 그때만 베낀다. board 가 같은 규칙으로 돈다(`board-service` 의 같은 이름 파일).\n *\n * 발행판의 정본(`__releaseSource`)은 크기 범위를 적은 발행판 사본이다 — Figure 행에는 작성자가 좁힌 끝만 남는다.\n *\n * 발행 메모는 Figure 의 칸이 아니다. `releaseFigure` 가 저장할 엔티티에 `__releaseComment` 로 얹어\n * 두면 여기서 판본의 `comment` 로 옮긴다 — 메모는 그 판의 것이지 도형의 것이 아니다. 정본 형식\n * (`__releaseFormat`), 잰 커널의 판(`__releaseKernel`, ADR-0109 C1), 직전 판에 견준 변경(`__releaseChanges`), 발행 때 잰 값(`__releaseMetrics`)과\n * 윗모습(`__releaseTopView`)도 같은 길로 옮긴다(ADR-0104).\n */\n/** What `releaseFigure` laid on the entity for this release, moved onto the history row. */\nfunction releaseRecordOnto(history: FigureHistory, entity: Figure): FigureHistory {\n const e = entity as any\n /* What a board reads of this release: its own copy, with the size range written down (ADR-0087 decision 6). */\n if (e.__releaseSource) history.source = e.__releaseSource\n ;(history as any).comment = e.__releaseComment ?? null\n history.assetFormat = e.__releaseFormat ?? null\n history.kernelVersion = e.__releaseKernel ?? null\n /* [] stays \"[]\" (nothing changed); null stays null (not compared). */\n history.changes = e.__releaseChanges == null ? null : JSON.stringify(e.__releaseChanges)\n history.metrics = e.__releaseMetrics == null ? null : JSON.stringify(e.__releaseMetrics)\n history.topView = e.__releaseTopView == null ? null : JSON.stringify(e.__releaseTopView)\n return history\n}\n\n@EventSubscriber()\nexport class FigureHistoryEntitySubscriber extends HistoryEntitySubscriber<Figure, FigureHistory> {\n public get entity() {\n return Figure\n }\n\n public get historyEntity() {\n return FigureHistory\n }\n\n public beforeInsertHistory(history: FigureHistory, entity: Figure): FigureHistory {\n return releaseRecordOnto(history, entity)\n }\n\n public beforeUpdateHistory(history: FigureHistory, entity: Figure): FigureHistory {\n return releaseRecordOnto(history, entity)\n }\n\n public async afterInsert(event: any): Promise<void> {\n if (event.entity?.state == 'released') {\n await super.afterInsert(event)\n }\n }\n\n public async afterUpdate(event: any): Promise<void> {\n if (event.entity?.state == 'released') {\n await super.afterUpdate(event)\n }\n }\n}\n"]}
1
+ {"version":3,"file":"event-subscriber.js","sourceRoot":"","sources":["../../../server/service/figure/event-subscriber.ts"],"names":[],"mappings":";;;;AAAA,qCAAyC;AAEzC,8DAAkE;AAElE,2CAAoC;AACpC,2DAAmD;AAEnD;;;;;;;;;;;;;GAaG;AACH,4FAA4F;AAC5F,SAAS,iBAAiB,CAAC,OAAsB,EAAE,MAAc;IAC/D,MAAM,CAAC,GAAG,MAAa,CAAA;IACvB,+GAA+G;IAC/G,IAAI,CAAC,CAAC,eAAe;QAAE,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,eAAe,CACxD;IAAC,OAAe,CAAC,OAAO,GAAG,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAA;IACtD,OAAO,CAAC,WAAW,GAAG,CAAC,CAAC,eAAe,IAAI,IAAI,CAAA;IAC/C,OAAO,CAAC,aAAa,GAAG,CAAC,CAAC,eAAe,IAAI,IAAI,CAAA;IACjD,sEAAsE;IACtE,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;IACxF,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;IACxF,OAAO,CAAC,OAAO,GAAG,CAAC,CAAC,gBAAgB,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,gBAAgB,CAAC,CAAA;IACxF,OAAO,OAAO,CAAA;AAChB,CAAC;AAGM,IAAM,6BAA6B,GAAnC,MAAM,6BAA8B,SAAQ,yCAA8C;IAC/F,IAAW,MAAM;QACf,OAAO,kBAAM,CAAA;IACf,CAAC;IAED,IAAW,aAAa;QACtB,OAAO,iCAAa,CAAA;IACtB,CAAC;IAEM,mBAAmB,CAAC,OAAsB,EAAE,MAAc;QAC/D,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC;IAEM,mBAAmB,CAAC,OAAsB,EAAE,MAAc;QAC/D,OAAO,iBAAiB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAA;IAC3C,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAU;QACjC,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,UAAU,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAU;QACjC,IAAI,KAAK,CAAC,MAAM,EAAE,KAAK,IAAI,UAAU,EAAE,CAAC;YACtC,MAAM,KAAK,CAAC,WAAW,CAAC,KAAK,CAAC,CAAA;QAChC,CAAC;IACH,CAAC;CACF,CAAA;AA5BY,sEAA6B;wCAA7B,6BAA6B;IADzC,IAAA,yBAAe,GAAE;GACL,6BAA6B,CA4BzC","sourcesContent":["import { EventSubscriber } from 'typeorm'\n\nimport { HistoryEntitySubscriber } from '@operato/typeorm-history'\n\nimport { Figure } from './figure.js'\nimport { FigureHistory } from './figure-history.js'\n\n/**\n * 판본을 남긴다 — **발행된 저장에만.**\n *\n * `@operato/typeorm-history` 는 원래 모든 저장을 베낀다. 그런데 피규어는 저작 중에 수십 번 저장되고,\n * 그 전부를 남기면 판본 목록이 「내가 오늘 몇 번 눌렀나」가 된다. 사람이 판이라고 부르는 것은\n * **발행한 것**이므로 그때만 베낀다. board 가 같은 규칙으로 돈다(`board-service` 의 같은 이름 파일).\n *\n * 발행판의 정본(`__releaseSource`)은 크기 범위를 적은 발행판 사본이다 — Figure 행에는 작성자가 좁힌 끝만 남는다.\n *\n * 발행 메모는 Figure 의 칸이 아니다. `releaseFigure` 가 저장할 엔티티에 `__releaseComment` 로 얹어\n * 두면 여기서 판본의 `comment` 로 옮긴다 — 메모는 그 판의 것이지 피규어의 것이 아니다. 정본 형식\n * (`__releaseFormat`), 잰 커널의 판(`__releaseKernel`, ADR-0109 C1), 직전 판에 견준 변경(`__releaseChanges`), 발행 때 잰 값(`__releaseMetrics`)과\n * 윗모습(`__releaseTopView`)도 같은 길로 옮긴다(ADR-0104).\n */\n/** What `releaseFigure` laid on the entity for this release, moved onto the history row. */\nfunction releaseRecordOnto(history: FigureHistory, entity: Figure): FigureHistory {\n const e = entity as any\n /* What a board reads of this release: its own copy, with the size range written down (ADR-0087 decision 6). */\n if (e.__releaseSource) history.source = e.__releaseSource\n ;(history as any).comment = e.__releaseComment ?? null\n history.assetFormat = e.__releaseFormat ?? null\n history.kernelVersion = e.__releaseKernel ?? null\n /* [] stays \"[]\" (nothing changed); null stays null (not compared). */\n history.changes = e.__releaseChanges == null ? null : JSON.stringify(e.__releaseChanges)\n history.metrics = e.__releaseMetrics == null ? null : JSON.stringify(e.__releaseMetrics)\n history.topView = e.__releaseTopView == null ? null : JSON.stringify(e.__releaseTopView)\n return history\n}\n\n@EventSubscriber()\nexport class FigureHistoryEntitySubscriber extends HistoryEntitySubscriber<Figure, FigureHistory> {\n public get entity() {\n return Figure\n }\n\n public get historyEntity() {\n return FigureHistory\n }\n\n public beforeInsertHistory(history: FigureHistory, entity: Figure): FigureHistory {\n return releaseRecordOnto(history, entity)\n }\n\n public beforeUpdateHistory(history: FigureHistory, entity: Figure): FigureHistory {\n return releaseRecordOnto(history, entity)\n }\n\n public async afterInsert(event: any): Promise<void> {\n if (event.entity?.state == 'released') {\n await super.afterInsert(event)\n }\n }\n\n public async afterUpdate(event: any): Promise<void> {\n if (event.entity?.state == 'released') {\n await super.afterUpdate(event)\n }\n }\n}\n"]}
@@ -65,7 +65,7 @@ function assertFormat(sourceJson) {
65
65
  }
66
66
  if (parsed?.version !== exports.FIGURE_ASSET_VERSION)
67
67
  throw new FigureSourceError([
68
- { code: 'source-format-unknown', message: `정본의 판을 알 수 없다 — 도형 자산은 version '${exports.FIGURE_ASSET_VERSION}' 을 적는다`, at: 'version' }
68
+ { code: 'source-format-unknown', message: `정본의 판을 알 수 없다 — 피규어 자산은 version '${exports.FIGURE_ASSET_VERSION}' 을 적는다`, at: 'version' }
69
69
  ]);
70
70
  }
71
71
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"figure-format.js","sourceRoot":"","sources":["../../../server/service/figure/figure-format.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The doors a stored source goes through: saving (`parseSource`), publishing (`inspectSource`, and the release's own\n * copy in `releaseRecordOf`), bringing a release back as a draft (`draftSourceOfRelease`) and handing it to a board\n * (`consumablePayloadOf`). The format is `figure-asset-1`, and the asset says so in its `version`; a source\n * that does not is refused by name, because a source the server cannot identify is one it must not save.\n */\nimport { FIGURE_KERNEL_VERSION, compileFigureAsset, inspectFigureAsset, isPlaceholderType, parseFigureAsset, serializeFigureAsset, figureContractChanges, figureCostOf, figurePlaneGapOf, figureReleaseMetricsOf, figureScoreOf, figureTopViewOf, forgetRecordedInstanceSize, recordFigureInstanceSize } from '@hatiolab/figure-model'\nimport type { FigureAsset, FigureContractChange, FigureContractError, FigureReleaseMetrics, FigureTopView, FigureViolation } from '@hatiolab/figure-model'\n\nimport type { FigureFinding } from './figure-type.js'\n\n/** The version the format stamps on its own source. */\nexport const FIGURE_ASSET_VERSION = 'figure-asset-1'\n\n/** A source that passed the save door: what is stored, and the numbers the catalogue shows, computed here. */\nexport interface ParsedSource {\n /** The source to store, as the kernel serializes it. */\n source: string\n /** Computed from the source, never taken from the client -- a client's numbers could lie to the catalogue. */\n derived: { score: number; triangles: number; groups: number }\n /** Findings that do not block the save; the caller returns them with the answer. */\n violations: FigureFinding[]\n}\n\n/** The source breaks the format. It is not stored. */\nexport class FigureSourceError extends Error {\n readonly findings: FigureFinding[]\n\n constructor(findings: FigureFinding[]) {\n super(`정본이 형식을 어겼다 — ${findings.length}건: ${findings.map(f => f.code).join(', ')}`)\n this.name = 'FigureSourceError'\n this.findings = findings\n }\n}\n\n/** One thing the release gate found. `blocking` true means the figure cannot be published. */\nexport interface GateFinding {\n code: string\n message: string\n /** **Why it matters.** A measurement alone leaves the reader at \"so what?\". */\n why?: string\n /** **What to change.** By part name and value. */\n how?: string\n /** Where it points: the parts, or the path in the source. */\n at?: string\n blocking: boolean\n}\n\nexport interface Inspection {\n findings: GateFinding[]\n /** Whether anything blocks. The screen locks the button with this. */\n blocked: boolean\n}\n\n/** What an app's release check is shown: the figure's asset, its row's type and category, and the reader's words. */\nexport interface FigureReleaseCheckInput {\n asset: FigureAsset\n type?: string\n category?: string | null\n t?: Translate\n}\n\n/**\n * A check an app adds to releasing (LV figure-server design G10): findings in the gate's own shape, blocking or said.\n * The LV figure-server refuses an origin off the middle of the floor, a receiving side's check (ADR-0104 decision 4),\n * and says its carrier and budget advice.\n */\nexport type FigureReleaseCheck = (input: FigureReleaseCheckInput) => GateFinding[]\n\nconst releaseChecks: FigureReleaseCheck[] = []\n\n/** Adds a check to every release verdict (`inspectFigure`, `releaseFigure`). Returns the way to take it off again. */\nexport function registerFigureReleaseCheck(check: FigureReleaseCheck): () => void {\n releaseChecks.push(check)\n return () => {\n const at = releaseChecks.indexOf(check)\n if (at >= 0) releaseChecks.splice(at, 1)\n }\n}\n\n/** The app's checks on an asset the kernel passed. A check that throws blocks, by name: a check is never skipped. */\nfunction appFindings(input: FigureReleaseCheckInput): GateFinding[] {\n const found: GateFinding[] = []\n for (const check of releaseChecks) {\n try {\n found.push(...check(input))\n } catch (e) {\n found.push({ code: 'release-check-failed', message: `a release check failed: ${(e as Error)?.message ?? String(e)}`, blocking: true })\n }\n }\n return found\n}\n\n/**\n * That the source is JSON and names the format.\n *\n * @throws {FigureSourceError} when the text is not JSON, or does not carry `version: 'figure-asset-1'`.\n */\nfunction assertFormat(sourceJson: string): void {\n let parsed: unknown\n try {\n parsed = JSON.parse(sourceJson)\n } catch (e) {\n throw new FigureSourceError([\n { code: 'source-not-json', message: `정본이 JSON 이 아니다: ${(e as Error).message}`, at: 'source' }\n ])\n }\n if ((parsed as { version?: unknown } | null)?.version !== FIGURE_ASSET_VERSION)\n throw new FigureSourceError([\n { code: 'source-format-unknown', message: `정본의 판을 알 수 없다 — 도형 자산은 version '${FIGURE_ASSET_VERSION}' 을 적는다`, at: 'version' }\n ])\n}\n\n/**\n * Validates a source and computes what the catalogue shows: the cost from `figureCostOf`, and the score from `figureScoreOf`\n * -- the headroom against placing `LIMITS.screenInstances` of it on one screen (chief architect, 2026-09-24), the\n * same number the modeller's maturity tab shows. An asset that draws nothing has no score, not a full one.\n *\n * @throws {FigureSourceError} when the source breaks the format.\n */\nexport function parseSource(sourceJson: string): ParsedSource {\n assertFormat(sourceJson)\n let asset\n try {\n asset = parseFigureAsset(sourceJson)\n compileFigureAsset(asset)\n } catch (e) {\n const error = e as FigureContractError & { path?: string }\n throw new FigureSourceError([\n { code: error.code ?? 'asset-invalid', message: error.message ?? String(e), at: error.path }\n ])\n }\n const cost = figureCostOf(asset)\n const score = figureScoreOf(asset)\n return {\n source: serializeFigureAsset(asset),\n derived: { score: (score?.score ?? null) as unknown as number, triangles: cost.triangles, groups: cost.groups },\n violations: []\n }\n}\n\n/**\n * Whether this source may be published, and why not.\n *\n * The judgement is `inspectFigureAsset`: every part inside the volume the asset declares, over the whole\n * state range, and the face it says it is mounted on lying in that plane. A verdict reached by sampling is\n * reported as a finding of its own rather than hidden — an author releasing a figure the gate could only\n * sample should be told so, because nothing proved it holds between the states that were checked.\n */\n/** The request's translator. Always called with params — `t(key, undefined)` loses the locale. */\nexport type Translate = (key: string, options?: Record<string, unknown>) => string\n\n/**\n * A finding in the words of the release panel.\n *\n * The gate says what it measured as a code and values (`part`, `axis`, `mm`, `degrees`) and an English `detail`\n * for logs. The sentence an author reads is made here, where the request's language is known (ADR-0054) — not in\n * figure-model, which knows no locale, and not on the screen, which would then have a second account of the same\n * refusal. The English line is the fallback when a key is missing, so a missing translation reads as English\n * rather than as the key printed raw.\n *\n * The words are the modeller's (ADR-0097 §9 Q2 A): 「차지하는 공간」 for the volume a figure takes up, 「부품에 맞추기」 for\n * setting it from the parts, and 「장착면」 for the face it stands on (`figure.text.mounting-face-explained`). A fact, then the way out.\n */\nfunction figureWording(violation: FigureViolation, say: Say): Pick<GateFinding, 'message' | 'why' | 'how'> {\n const part = violation.part ?? ''\n const axis = (violation.axis ?? '').toUpperCase()\n const mm = violation.mm ?? 0\n const degrees = violation.degrees ?? 0\n const key = (field: string) => `figure.gate.${violation.code.toLowerCase().replace(/_/g, '-')}.${field}`\n\n switch (violation.code) {\n case 'PARTS_OFF_PLACEMENT_FACE':\n return {\n message: say(key('message'), { part, mm }, `The mounting face of '${part}' is ${mm} mm off the plane the figure stands on.`),\n why: say(key('why'), {}, 'The figure is declared to stand on that face. If the face does not reach the plane, the figure floats on the board by that much, and whatever is placed on it floats too.'),\n how: say(key('how'), { part, mm }, `Move '${part}' ${mm} mm on Y so the face meets the plane, or choose a different mounting face.`)\n }\n case 'PLACEMENT_FACE_TILTED':\n return {\n message: say(key('message'), { part, degrees }, `The mounting face of '${part}' is tilted ${degrees}° from the plane the figure stands on.`),\n why: say(key('why'), {}, 'A tilted face cannot lie on the plane, so how the figure stands is not settled.'),\n how: say(key('how'), { part }, `Choose a mounting face parallel to the plane, or turn '${part}' upright.`)\n }\n case 'PARTS_SPLIT_ON_RESIZE': {\n /*\n What comes off is every piece but the largest — the figure as the author sees it is the big piece, and the\n small ones are what they will see hanging in the air (2026-09-24).\n */\n const resize = violation.resize!\n const pieces = [...resize.pieces].sort((a, b) => b.length - a.length)\n const parts = pieces.slice(1).flat().map(one => `'${one}'`).join(', ')\n const axes = resize.axes.map(one => one.toUpperCase()).join('·')\n const factor = resize.factor\n return {\n message: say(key('message'), { parts, axes, factor }, `At ${factor}x on ${axes}, ${parts} come away from the rest of the figure.`),\n why: say(key('why'), {}, 'A figure placed at another size shows those parts hanging in the air — to a person, it looks broken.'),\n how: say(key('how'), { parts }, `Fasten ${parts} to a face of the part they rest on, or press \"fix here\" under position in the responsive tab, so they stay put when the figure is resized.`)\n }\n }\n case 'SIZING_NOT_UNIFORM': {\n /* The figure declares it grows by one ratio; these parts keep a size or place of their own (ruling 2026-09-24). */\n const resize = violation.resize!\n const parts = (violation.parts ?? []).map(one => `'${one}'`).join(', ')\n const axes = resize.axes.map(one => one.toUpperCase()).join('·')\n const factor = resize.factor\n return {\n message: say(key('message'), { parts, axes, factor }, `The figure grows by one ratio, but at ${factor}x on ${axes} ${parts} do not grow with it.`),\n why: say(key('why'), {}, 'A figure that grows by one ratio keeps its proportions at any size. A part with a size or place of its own comes apart from the rest.'),\n how: say(key('how'), { parts }, `Let ${parts} follow the figure's size (\"in proportion\" under position in the responsive tab), or remove their own fixed numbers.`)\n }\n }\n }\n}\n\ntype Say = (key: string, params: Record<string, string | number>, english: string) => string\n\n/*\n The sentence is shown as text, never as HTML, so the values go in as they are. i18next escapes interpolated\n values by default, and the screen then showed `'lamp-in'` as `&#39;lamp-in&#39;`.\n*/\nfunction sayerOf(t?: Translate): Say {\n return (key, params, english) =>\n t ? t(key, { ...params, defaultValue: english, interpolation: { escapeValue: false } }) : english\n}\n\nexport function inspectSource(\n sourceJson?: string | null,\n releasedJson?: string | null,\n t?: Translate,\n /** The row's `type` -- the only place the name lives, since the asset carries none. */\n rowType?: string,\n /** The row's category, for an app's release checks (G10). */\n rowCategory?: string | null\n): Inspection {\n if (!sourceJson) {\n return { blocked: true, findings: [{ code: 'no-source', message: '저장된 정본이 없다. 저장하면 발행할 수 있다', blocking: true }] }\n }\n try {\n assertFormat(sourceJson)\n } catch (e) {\n const findings = (e as FigureSourceError).findings ?? [{ code: 'source-unreadable', message: String(e) }]\n return { blocked: true, findings: findings.map(f => ({ ...f, blocking: true })) }\n }\n\n let inspection\n let asset: FigureAsset | undefined\n try {\n asset = parseFigureAsset(sourceJson)\n inspection = inspectFigureAsset(asset)\n } catch (e) {\n const error = e as FigureContractError & { path?: string }\n return {\n blocked: true,\n findings: [{ code: error.code ?? 'asset-invalid', message: error.message ?? String(e), at: error.path, blocking: true }]\n }\n }\n\n const say = sayerOf(t)\n const findings: GateFinding[] = inspection.violations.map(violation => ({\n code: violation.code.toLowerCase().replace(/_/g, '-'),\n ...figureWording(violation, say),\n at: violation.part,\n blocking: true\n }))\n /*\n A machine-made name is refused at release. The asset has no `type`, so the name is read off the row; a new figure\n was once published as `FIGURE_<uuid>` (:3300, 2026-09-24). Publishing freezes the name (ADR-0063 decision 4) and\n boards call a figure by it.\n */\n if (rowType && isPlaceholderType(rowType)) {\n findings.push({\n code: 'type-is-placeholder',\n message: say('figure.gate.type-is-placeholder.message', { type: rowType }, `'${rowType}' is a temporary type given when the figure was first saved.`),\n why: say('figure.gate.type-is-placeholder.why', {}, 'Boards call a figure by its type, and it cannot change once the figure is published.'),\n how: say('figure.gate.type-is-placeholder.how', {}, 'Set the type in the type field, then publish.'),\n blocking: true\n })\n }\n findings.push(...planeGapFindings(asset!, say))\n if (releasedJson) findings.push(...figureContractFindings(asset!, releasedJson, say))\n findings.push(...appFindings({ asset: asset!, type: rowType, category: rowCategory, t }))\n return { blocked: findings.some(finding => finding.blocking), findings }\n}\n\n/*\n Said, never refused: a figure off the plane it is mounted on stands off it on every board -- a conveyor in the air, a\n hoist hung below a floor figure (the walk of 2026-10-18 found each passing release with no word). A gap can be meant,\n and so can a part through the plane, so it does not block. A figure that names its mounting face is checked on that\n face by the gate already; this is for the one that names none.\n*/\ntype Gap = { part: string; mm: number }\nconst PLANE_ENGLISH = {\n floor: {\n clear: (g: Gap) => `'${g.part}' is ${g.mm} mm above the floor.`,\n through: (g: Gap) => `'${g.part}' goes ${g.mm} mm below the floor.`,\n beyond: 'Every part is below the floor.',\n why: 'A board stands this figure on the floor, so it stands so on every board.',\n beyondHow: 'If it hangs from the ceiling, set where it stands to the ceiling.'\n },\n ceiling: {\n clear: (g: Gap) => `'${g.part}' is ${g.mm} mm below the ceiling.`,\n through: (g: Gap) => `'${g.part}' goes ${g.mm} mm above the ceiling.`,\n beyond: 'Every part is above the ceiling.',\n why: 'A board hangs this figure from the ceiling, so it hangs so on every board.',\n beyondHow: 'If it stands on the floor, set where it stands to the floor.'\n },\n wall: {\n clear: (g: Gap) => `'${g.part}' is ${g.mm} mm out from the wall.`,\n through: (g: Gap) => `'${g.part}' goes ${g.mm} mm into the wall.`,\n beyond: 'Every part is behind the wall.',\n why: 'A board puts this figure on the wall, so it sits so on every board.',\n beyondHow: 'Bring the parts out in front of the wall, or choose again where it stands.'\n }\n} as const\nfunction planeGapFindings(asset: FigureAsset, say: Say): GateFinding[] {\n if (asset.mountingFace) return []\n const gap = figurePlaneGapOf(asset)\n if (!gap || gap.touches) return []\n const english = PLANE_ENGLISH[gap.placement]\n const key = `figure.gate.off-mounting-plane.${gap.placement}`\n const kind = gap.beyond ? 'beyond' : gap.mm > 0 ? 'clear' : 'through'\n const said = { part: gap.part, mm: Math.round(Math.abs(gap.mm)) }\n return [\n {\n code: 'off-mounting-plane',\n message: say(`${key}.${kind}.message`, said, kind === 'beyond' ? english.beyond : english[kind](said)),\n why: say(`${key}.why`, {}, english.why),\n how:\n kind === 'beyond'\n ? say(`${key}.beyond.how`, {}, english.beyondHow)\n : say('figure.gate.off-mounting-plane.how', {}, 'Keep it if it is meant. Otherwise fasten that part to the mounting plane, or move it until it meets the plane.'),\n at: gap.part,\n blocking: false\n }\n ]\n}\n\n/**\n * The last release against this one — what the drawings that already hold this type lean on (ADR-0063 decision 3).\n *\n * figure-model names the changes and whether each blocks (`figureContractChanges`); the sentence is made here. When\n * the last release no longer parses, the gate says so rather than passing in silence: a release that was not checked\n * against the last one is a different fact from one that was checked and found safe.\n */\nfunction figureContractFindings(asset: FigureAsset, releasedJson: string, say: Say): GateFinding[] {\n let before: FigureAsset\n try {\n before = parseFigureAsset(releasedJson)\n } catch (e) {\n return [\n {\n code: 'released-unreadable',\n message: say('figure.gate.released-not-compared.message', { reason: (e as Error).message }, `The last release could not be read, so this release was not compared with it: ${(e as Error).message}`),\n why: say('figure.gate.released-not-compared.why', {}, 'Whether this release breaks the instances already placed has not been checked.'),\n blocking: false\n }\n ]\n }\n return figureContractChanges(before, asset).map(change => ({\n code: change.code,\n ...figureContractWording(change, say),\n at: change.subject,\n blocking: change.blocking\n }))\n}\n\n/** One contract change in the words of the release panel. The English line is the fallback for a missing key. */\nfunction figureContractWording(change: FigureContractChange, say: Say): Pick<GateFinding, 'message' | 'why' | 'how'> {\n const v = change.values\n const key = (field: string) => `figure.gate.contract.${change.code}.${field}`\n const gone = {\n how: say('figure.gate.contract.gone.how', {}, 'Put it back as it was, or publish this as a new figure type so the placed ones keep the old one.')\n }\n switch (change.code) {\n case 'placement-changed':\n return {\n message: say(key('message'), v, `Placement changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'Placement sets the height of every placed instance. They all move with it.'),\n ...gone\n }\n case 'size-inputs-gone':\n return {\n message: say(key('message'), v, 'The figure no longer takes its size from the place it is given.'),\n why: say(key('why'), {}, 'Placed instances were sized on the board. After this release they all draw at the authored size.'),\n ...gone\n }\n case 'size-inputs-added':\n return {\n message: say(key('message'), v, 'The figure now takes its size from the place it is given.'),\n why: say(key('why'), {}, 'Placed instances now follow their own size on the board.')\n }\n case 'size-range-narrowed':\n return {\n message: say(key('message'), { ...v, input: change.subject ?? '' }, `The size range of ${change.subject} narrowed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'An instance placed at a size outside the new range will not draw. Which sizes are placed is not recorded.')\n }\n case 'authored-size-changed':\n return {\n message: say(key('message'), v, `The authored size changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'Placed instances keep their own size. An instance with no depth of its own takes its depth from this.')\n }\n case 'state-input-gone':\n return {\n message: say(key('message'), v, `The control '${v.id}' is gone.`),\n why: say(key('why'), {}, 'Placed instances and connectors give values under this name. After this release those values do nothing, and nothing on screen says why.'),\n ...gone\n }\n case 'state-unit-changed':\n return {\n message: say(key('message'), v, `The unit of the control '${v.id}' changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'Stored values keep their number. With another unit the same number means something else.'),\n ...gone\n }\n case 'state-range-narrowed':\n return {\n message: say(key('message'), v, `The range of the control '${v.id}' narrowed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'A value outside the new range may already be stored on a placed instance.')\n }\n case 'state-input-added':\n return {\n message: say(key('message'), v, `The control '${v.id}' is new.`),\n why: say(key('why'), {}, 'Placed instances that give no value stand at its default.')\n }\n case 'clip-gone':\n return {\n message: say(key('message'), v, `The clip '${v.clip}' is gone.`),\n why: say(key('why'), {}, 'Placed instances play clips by name. After this release that one plays nothing.'),\n ...gone\n }\n case 'clip-added':\n return {\n message: say(key('message'), v, `The clip '${v.clip}' is new.`),\n why: say(key('why'), {}, 'It stays still until an instance plays it.')\n }\n case 'binding-gone':\n return {\n message: say(key('message'), v, `The place '${v.binding}' is gone.`),\n why: say(key('why'), {}, 'What sits in it on a placed instance loses its place.'),\n ...gone\n }\n case 'binding-role-changed':\n return {\n message: say(key('message'), v, `The place '${v.binding}' changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'What sits in it was placed for the old role.'),\n ...gone\n }\n case 'binding-capacity-reduced':\n return {\n message: say(key('message'), v, `The place '${v.binding}' holds ${v.after} instead of ${v.before}.`),\n why: say(key('why'), {}, 'What sits in the places that went has nowhere to go.'),\n ...gone\n }\n case 'binding-accepts-narrowed':\n return {\n message: say(key('message'), v, `The place '${v.binding}' no longer accepts ${v.types}.`),\n why: say(key('why'), {}, 'What already sits there stays. The next one of that type is refused.')\n }\n case 'binding-added':\n return {\n message: say(key('message'), v, `The place '${v.binding}' is new.`),\n why: say(key('why'), {}, 'Placed instances do not know it yet and stand as they are.')\n }\n /* Slots a slot layout unfolds into, and the anchors they stand on (ADR-0051 §4.1, the old ADR-0118 decision 6). */\n case 'slot-moved':\n return {\n message: say(key('message'), v, `The slot '${v.binding}' is somewhere else on its anchor.`),\n why: say(key('why'), {}, 'What sits in it moves with it. Data that names the slot by its address now means the new place.')\n }\n case 'slot-anchor-gone':\n return {\n message: say(key('message'), v, `The anchor '${v.anchor}' that slots stand on is gone.`),\n why: say(key('why'), {}, 'A placement that lays its own slots on this anchor holds nothing after this release.'),\n ...gone\n }\n case 'slot-anchor-moved':\n return {\n message: say(key('message'), v, `The anchor '${v.anchor}' moved from the ${v.before} face to the ${v.after} face.`),\n why: say(key('why'), {}, 'Every slot on it, and what sits there, stands on the new face after this release.')\n }\n case 'capability-gone':\n return {\n message: say(key('message'), v, `The capability '${v.name}' is gone.`),\n why: say(key('why'), {}, 'Scenes attach behaviour by this name. Placed instances lose what it did.'),\n ...gone\n }\n case 'capability-added':\n return {\n message: say(key('message'), v, `The capability '${v.name}' is new.`),\n why: say(key('why'), {}, 'It adds what the figure can do. Placed instances stand as they are.')\n }\n /* Said, never refused (ADR-0104): a consumer that pins a release reads these before it moves to this one. */\n case 'size-changed':\n return {\n message: say(key('message'), v, `The figure's size changed from ${v.before || 'none'} to ${v.after || 'none'}.`),\n why: say(key('why'), {}, 'A board gives the figure a box of this size. One that moves to this release sees its box change.')\n }\n case 'motion-range-changed':\n return {\n message: say(key('message'), v, `The room the figure sweeps as it moves changed from ${v.before || 'none'} to ${v.after || 'none'}.`),\n why: say(key('why'), {}, 'It is what the figure reaches when it moves. One that moves to this release sees it reach differently.')\n }\n case 'contact-face-changed':\n return {\n message: say(key('message'), v, 'The face the figure is mounted by changed.'),\n why: say(key('why'), {}, 'A consumer that moves to this release sees it stand on the new face.')\n }\n case 'public-input-gone':\n return {\n message: say(key('message'), { ...v, input: change.subject ?? '' }, `'${change.subject}' is no longer set on a board.`),\n why: say(key('why'), {}, 'Values placed instances give it do nothing after this release.')\n }\n case 'public-input-range-narrowed':\n return {\n message: say(key('message'), { ...v, input: change.subject ?? '' }, `The range of '${change.subject}' narrowed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'An instance may have set a value outside the new range. Which values are placed is not recorded.')\n }\n case 'public-input-added':\n return {\n message: say(key('message'), { ...v, input: change.subject ?? '' }, `'${change.subject}' can now be set on a board.`),\n why: say(key('why'), {}, 'Placed instances that give no value stand at its default.')\n }\n /* A value another product reads by its key (ADR-0123): only a key that goes refuses; what a change means is its owner's. */\n case 'extension-gone':\n return {\n message: say(key('message'), v, `The extension '${v.key}' is gone.`),\n why: say(key('why'), {}, 'Another product reads this value by its key. After this release it finds none.'),\n ...gone\n }\n case 'extension-changed':\n return {\n message: say(key('message'), v, `The value of the extension '${v.key}' changed.`),\n why: say(key('why'), {}, 'The product that owns this key reads the new value and judges the change.')\n }\n case 'extension-added':\n return {\n message: say(key('message'), v, `The extension '${v.key}' is new.`),\n why: say(key('why'), {}, 'The product that owns this key reads this value.')\n }\n /* What a consumer's data mapping and a board's motion selection lean on (ADR-0051 §2.2, §3.2). */\n case 'data-field-gone':\n return {\n message: say(key('message'), v, `The data field '${v.id}' is gone.`),\n why: say(key('why'), {}, 'Boards map their data onto this id. After this release that data moves nothing.'),\n ...gone\n }\n case 'data-field-kind-changed':\n return {\n message: say(key('message'), v, `The data field '${v.id}' changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'Mapped data was written for the old kind or unit. After this release the same data is refused or means something else.'),\n ...gone\n }\n case 'data-field-narrowed':\n return {\n message: say(key('message'), v, `The data field '${v.id}' takes less: ${v.before} → ${v.after}.`),\n why: say(key('why'), {}, 'Data with a value it no longer takes is refused whole, and the figure keeps what it showed.'),\n ...gone\n }\n case 'data-field-added':\n return {\n message: say(key('message'), v, `The data field '${v.id}' is new.`),\n why: say(key('why'), {}, 'Until a board maps data onto it, it stands at its default.')\n }\n case 'data-field-label-changed':\n return {\n message: say(key('message'), v, `The data field '${v.id}' is now called '${v.after}'.`),\n why: say(key('why'), {}, 'Mappings name the id, so they keep working.')\n }\n case 'data-field-default-changed':\n return {\n message: say(key('message'), v, `The default of the data field '${v.id}' changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'A placed figure with no data or saved value for it stands differently after this release.')\n }\n case 'data-bindings-changed':\n return {\n message: say(key('message'), v, 'What the data moves (its bindings) changed.'),\n why: say(key('why'), {}, 'The same data gives another pose, colour or clip after this release.')\n }\n case 'motion-group-gone':\n return {\n message: say(key('message'), v, `The motion group '${v.group}' is gone.`),\n why: say(key('why'), {}, 'Boards and data choose its clip by this id. After this release that choice does nothing.'),\n ...gone\n }\n case 'motion-group-clip-removed':\n return {\n message: say(key('message'), v, `The motion group '${v.group}' no longer holds '${v.clip}'.`),\n why: say(key('why'), {}, 'A board or data that chooses this clip in the group is refused after this release.'),\n ...gone\n }\n case 'motion-clip-group-changed':\n return {\n message: say(key('message'), v, `The clip '${v.clip}' played on its own and is now in the motion group '${v.group}'.`),\n why: say(key('why'), {}, \"Boards played it by its own speed. After this release it plays only when the group's choice is this clip.\"),\n ...gone\n }\n case 'motion-group-added':\n return {\n message: say(key('message'), v, `The motion group '${v.group}' is new.`),\n why: say(key('why'), {}, 'Placed instances play its default clip until a board or data chooses another.')\n }\n case 'motion-group-clip-added':\n return {\n message: say(key('message'), v, `The motion group '${v.group}' now holds '${v.clip}'.`),\n why: say(key('why'), {}, 'It plays when a board or data chooses it.')\n }\n case 'motion-group-default-changed':\n return {\n message: say(key('message'), v, `The motion group '${v.group}' now starts with '${v.after}', not '${v.before}'.`),\n why: say(key('why'), {}, 'Placed instances with no choice of their own play the new default after this release.')\n }\n case 'motion-group-transition-changed':\n return {\n message: say(key('message'), v, `A change of clip in '${v.group}' now blends over ${v.after} s, not ${v.before} s.`),\n why: say(key('why'), {}, 'Only how a change of clip looks changes; which clip plays does not.')\n }\n /* The joints a controller drives (ADR-0107 decision 7): what writing a state input moves, compared release to release. */\n case 'state-input-joints-changed': {\n const after = v.after || say('figure.gate.contract.joints-none', {}, 'nothing')\n return {\n message: say(key('message'), { ...v, after }, `The control '${v.id}' moved ${v.before}. It now moves ${after}.`),\n why: say(key('why'), {}, 'A controller writes this value to drive those joints. After this release the same value moves other joints, or by other amounts.'),\n ...gone\n }\n }\n case 'joint-axis-changed':\n return {\n message: say(key('message'), v, `The axis of the joint '${v.joint}' changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, \"A controller's stored values turn or slide the joint about this axis. After this release the same value moves it another way.\"),\n ...gone\n }\n case 'joint-motion-unit-changed':\n return {\n message: say(key('message'), v, `The joint '${v.joint}' now moves in ${v.after}, not ${v.before}.`),\n why: say(key('why'), {}, \"A controller's stored values were written for the old unit. After this release the same value means another motion.\"),\n ...gone\n }\n case 'joint-child-changed':\n return {\n message: say(key('message'), v, `The joint '${v.joint}' now moves '${v.after}' instead of '${v.before}'.`),\n why: say(key('why'), {}, \"A controller's values keep their meaning. On screen the joint now moves the new part.\")\n }\n case 'joint-list-unread':\n return {\n message: say(key('message'), v, `The last release's joint list could not be read, so its joints were not compared: ${v.reason}`),\n why: say(key('why'), {}, \"Whether this release changes what a controller's values move has not been checked. The last release was made by a kernel that did not measure joints.\")\n }\n }\n}\n\n/**\n * What a release records about itself (ADR-0104 decision 5): the format its asset is written in, what it measured\n * (its cost at its largest, whether resizing is stretching), its plan from above, and what changed against the previous release -- the kernel's own comparison, kept as it was then so a consumer that pins releases\n * reads it rather than computing it again. `[]` for a first release; `null` when the previous release could not be\n * read, which is a different fact from \"nothing changed\".\n */\nexport function releaseRecordOf(\n sourceJson: string,\n releasedJson?: string | null\n): { source: string; format: string; kernel: string; changes: FigureContractChange[] | null; metrics: FigureReleaseMetrics; topView: FigureTopView } {\n const asset = parseFigureAsset(sourceJson)\n /*\n The release's own copy carries its size range as it is now: the author's ends, and the rest as far as the parts\n allow (ADR-0087 decision 6). A board reads the ends from it and does not measure; the figure's row keeps only what\n the author narrowed.\n */\n const measured = {\n source: serializeFigureAsset(recordFigureInstanceSize(asset)),\n format: asset.version,\n kernel: FIGURE_KERNEL_VERSION,\n metrics: figureReleaseMetricsOf(asset),\n topView: figureTopViewOf(asset, null)\n }\n if (!releasedJson) return { ...measured, changes: [] }\n let before: FigureAsset\n try {\n before = parseFigureAsset(releasedJson)\n } catch {\n return { ...measured, changes: null }\n }\n return { ...measured, changes: figureContractChanges(before, asset) }\n}\n\n/**\n * A release's source made a draft's again (a revert): the size ends its release wrote down, as far as the parts allow,\n * are opened, and the author's own are kept (ADR-0087 decision 6). An author's end that equals the computed one is\n * opened with them.\n */\nexport function draftSourceOfRelease(releasedJson: string): string {\n assertFormat(releasedJson)\n return serializeFigureAsset(forgetRecordedInstanceSize(parseFigureAsset(releasedJson)))\n}\n\n/**\n * What a consumer is handed for a released figure: the asset itself, because what draws it -- `registerFigure` in\n * things-scene -- takes the asset and compiles it with the kernel.\n */\nexport function consumablePayloadOf(sourceJson: string): { asset: FigureAsset } {\n assertFormat(sourceJson)\n const asset = parseFigureAsset(sourceJson)\n compileFigureAsset(asset)\n return { asset }\n}\n"]}
1
+ {"version":3,"file":"figure-format.js","sourceRoot":"","sources":["../../../server/service/figure/figure-format.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The doors a stored source goes through: saving (`parseSource`), publishing (`inspectSource`, and the release's own\n * copy in `releaseRecordOf`), bringing a release back as a draft (`draftSourceOfRelease`) and handing it to a board\n * (`consumablePayloadOf`). The format is `figure-asset-1`, and the asset says so in its `version`; a source\n * that does not is refused by name, because a source the server cannot identify is one it must not save.\n */\nimport { FIGURE_KERNEL_VERSION, compileFigureAsset, inspectFigureAsset, isPlaceholderType, parseFigureAsset, serializeFigureAsset, figureContractChanges, figureCostOf, figurePlaneGapOf, figureReleaseMetricsOf, figureScoreOf, figureTopViewOf, forgetRecordedInstanceSize, recordFigureInstanceSize } from '@hatiolab/figure-model'\nimport type { FigureAsset, FigureContractChange, FigureContractError, FigureReleaseMetrics, FigureTopView, FigureViolation } from '@hatiolab/figure-model'\n\nimport type { FigureFinding } from './figure-type.js'\n\n/** The version the format stamps on its own source. */\nexport const FIGURE_ASSET_VERSION = 'figure-asset-1'\n\n/** A source that passed the save door: what is stored, and the numbers the catalogue shows, computed here. */\nexport interface ParsedSource {\n /** The source to store, as the kernel serializes it. */\n source: string\n /** Computed from the source, never taken from the client -- a client's numbers could lie to the catalogue. */\n derived: { score: number; triangles: number; groups: number }\n /** Findings that do not block the save; the caller returns them with the answer. */\n violations: FigureFinding[]\n}\n\n/** The source breaks the format. It is not stored. */\nexport class FigureSourceError extends Error {\n readonly findings: FigureFinding[]\n\n constructor(findings: FigureFinding[]) {\n super(`정본이 형식을 어겼다 — ${findings.length}건: ${findings.map(f => f.code).join(', ')}`)\n this.name = 'FigureSourceError'\n this.findings = findings\n }\n}\n\n/** One thing the release gate found. `blocking` true means the figure cannot be published. */\nexport interface GateFinding {\n code: string\n message: string\n /** **Why it matters.** A measurement alone leaves the reader at \"so what?\". */\n why?: string\n /** **What to change.** By part name and value. */\n how?: string\n /** Where it points: the parts, or the path in the source. */\n at?: string\n blocking: boolean\n}\n\nexport interface Inspection {\n findings: GateFinding[]\n /** Whether anything blocks. The screen locks the button with this. */\n blocked: boolean\n}\n\n/** What an app's release check is shown: the figure's asset, its row's type and category, and the reader's words. */\nexport interface FigureReleaseCheckInput {\n asset: FigureAsset\n type?: string\n category?: string | null\n t?: Translate\n}\n\n/**\n * A check an app adds to releasing (LV figure-server design G10): findings in the gate's own shape, blocking or said.\n * The LV figure-server refuses an origin off the middle of the floor, a receiving side's check (ADR-0104 decision 4),\n * and says its carrier and budget advice.\n */\nexport type FigureReleaseCheck = (input: FigureReleaseCheckInput) => GateFinding[]\n\nconst releaseChecks: FigureReleaseCheck[] = []\n\n/** Adds a check to every release verdict (`inspectFigure`, `releaseFigure`). Returns the way to take it off again. */\nexport function registerFigureReleaseCheck(check: FigureReleaseCheck): () => void {\n releaseChecks.push(check)\n return () => {\n const at = releaseChecks.indexOf(check)\n if (at >= 0) releaseChecks.splice(at, 1)\n }\n}\n\n/** The app's checks on an asset the kernel passed. A check that throws blocks, by name: a check is never skipped. */\nfunction appFindings(input: FigureReleaseCheckInput): GateFinding[] {\n const found: GateFinding[] = []\n for (const check of releaseChecks) {\n try {\n found.push(...check(input))\n } catch (e) {\n found.push({ code: 'release-check-failed', message: `a release check failed: ${(e as Error)?.message ?? String(e)}`, blocking: true })\n }\n }\n return found\n}\n\n/**\n * That the source is JSON and names the format.\n *\n * @throws {FigureSourceError} when the text is not JSON, or does not carry `version: 'figure-asset-1'`.\n */\nfunction assertFormat(sourceJson: string): void {\n let parsed: unknown\n try {\n parsed = JSON.parse(sourceJson)\n } catch (e) {\n throw new FigureSourceError([\n { code: 'source-not-json', message: `정본이 JSON 이 아니다: ${(e as Error).message}`, at: 'source' }\n ])\n }\n if ((parsed as { version?: unknown } | null)?.version !== FIGURE_ASSET_VERSION)\n throw new FigureSourceError([\n { code: 'source-format-unknown', message: `정본의 판을 알 수 없다 — 피규어 자산은 version '${FIGURE_ASSET_VERSION}' 을 적는다`, at: 'version' }\n ])\n}\n\n/**\n * Validates a source and computes what the catalogue shows: the cost from `figureCostOf`, and the score from `figureScoreOf`\n * -- the headroom against placing `LIMITS.screenInstances` of it on one screen (chief architect, 2026-09-24), the\n * same number the modeller's maturity tab shows. An asset that draws nothing has no score, not a full one.\n *\n * @throws {FigureSourceError} when the source breaks the format.\n */\nexport function parseSource(sourceJson: string): ParsedSource {\n assertFormat(sourceJson)\n let asset\n try {\n asset = parseFigureAsset(sourceJson)\n compileFigureAsset(asset)\n } catch (e) {\n const error = e as FigureContractError & { path?: string }\n throw new FigureSourceError([\n { code: error.code ?? 'asset-invalid', message: error.message ?? String(e), at: error.path }\n ])\n }\n const cost = figureCostOf(asset)\n const score = figureScoreOf(asset)\n return {\n source: serializeFigureAsset(asset),\n derived: { score: (score?.score ?? null) as unknown as number, triangles: cost.triangles, groups: cost.groups },\n violations: []\n }\n}\n\n/**\n * Whether this source may be published, and why not.\n *\n * The judgement is `inspectFigureAsset`: every part inside the volume the asset declares, over the whole\n * state range, and the face it says it is mounted on lying in that plane. A verdict reached by sampling is\n * reported as a finding of its own rather than hidden — an author releasing a figure the gate could only\n * sample should be told so, because nothing proved it holds between the states that were checked.\n */\n/** The request's translator. Always called with params — `t(key, undefined)` loses the locale. */\nexport type Translate = (key: string, options?: Record<string, unknown>) => string\n\n/**\n * A finding in the words of the release panel.\n *\n * The gate says what it measured as a code and values (`part`, `axis`, `mm`, `degrees`) and an English `detail`\n * for logs. The sentence an author reads is made here, where the request's language is known (ADR-0054) — not in\n * figure-model, which knows no locale, and not on the screen, which would then have a second account of the same\n * refusal. The English line is the fallback when a key is missing, so a missing translation reads as English\n * rather than as the key printed raw.\n *\n * The words are the modeller's (ADR-0097 §9 Q2 A): 「차지하는 공간」 for the volume a figure takes up, 「부품에 맞추기」 for\n * setting it from the parts, and 「장착면」 for the face it stands on (`figure.text.mounting-face-explained`). A fact, then the way out.\n */\nfunction figureWording(violation: FigureViolation, say: Say): Pick<GateFinding, 'message' | 'why' | 'how'> {\n const part = violation.part ?? ''\n const axis = (violation.axis ?? '').toUpperCase()\n const mm = violation.mm ?? 0\n const degrees = violation.degrees ?? 0\n const key = (field: string) => `figure.gate.${violation.code.toLowerCase().replace(/_/g, '-')}.${field}`\n\n switch (violation.code) {\n case 'PARTS_OFF_PLACEMENT_FACE':\n return {\n message: say(key('message'), { part, mm }, `The mounting face of '${part}' is ${mm} mm off the plane the figure stands on.`),\n why: say(key('why'), {}, 'The figure is declared to stand on that face. If the face does not reach the plane, the figure floats on the board by that much, and whatever is placed on it floats too.'),\n how: say(key('how'), { part, mm }, `Move '${part}' ${mm} mm on Y so the face meets the plane, or choose a different mounting face.`)\n }\n case 'PLACEMENT_FACE_TILTED':\n return {\n message: say(key('message'), { part, degrees }, `The mounting face of '${part}' is tilted ${degrees}° from the plane the figure stands on.`),\n why: say(key('why'), {}, 'A tilted face cannot lie on the plane, so how the figure stands is not settled.'),\n how: say(key('how'), { part }, `Choose a mounting face parallel to the plane, or turn '${part}' upright.`)\n }\n case 'PARTS_SPLIT_ON_RESIZE': {\n /*\n What comes off is every piece but the largest — the figure as the author sees it is the big piece, and the\n small ones are what they will see hanging in the air (2026-09-24).\n */\n const resize = violation.resize!\n const pieces = [...resize.pieces].sort((a, b) => b.length - a.length)\n const parts = pieces.slice(1).flat().map(one => `'${one}'`).join(', ')\n const axes = resize.axes.map(one => one.toUpperCase()).join('·')\n const factor = resize.factor\n return {\n message: say(key('message'), { parts, axes, factor }, `At ${factor}x on ${axes}, ${parts} come away from the rest of the figure.`),\n why: say(key('why'), {}, 'A figure placed at another size shows those parts hanging in the air — to a person, it looks broken.'),\n how: say(key('how'), { parts }, `Fasten ${parts} to a face of the part they rest on, or press \"fix here\" under position in the responsive tab, so they stay put when the figure is resized.`)\n }\n }\n case 'SIZING_NOT_UNIFORM': {\n /* The figure declares it grows by one ratio; these parts keep a size or place of their own (ruling 2026-09-24). */\n const resize = violation.resize!\n const parts = (violation.parts ?? []).map(one => `'${one}'`).join(', ')\n const axes = resize.axes.map(one => one.toUpperCase()).join('·')\n const factor = resize.factor\n return {\n message: say(key('message'), { parts, axes, factor }, `The figure grows by one ratio, but at ${factor}x on ${axes} ${parts} do not grow with it.`),\n why: say(key('why'), {}, 'A figure that grows by one ratio keeps its proportions at any size. A part with a size or place of its own comes apart from the rest.'),\n how: say(key('how'), { parts }, `Let ${parts} follow the figure's size (\"in proportion\" under position in the responsive tab), or remove their own fixed numbers.`)\n }\n }\n }\n}\n\ntype Say = (key: string, params: Record<string, string | number>, english: string) => string\n\n/*\n The sentence is shown as text, never as HTML, so the values go in as they are. i18next escapes interpolated\n values by default, and the screen then showed `'lamp-in'` as `&#39;lamp-in&#39;`.\n*/\nfunction sayerOf(t?: Translate): Say {\n return (key, params, english) =>\n t ? t(key, { ...params, defaultValue: english, interpolation: { escapeValue: false } }) : english\n}\n\nexport function inspectSource(\n sourceJson?: string | null,\n releasedJson?: string | null,\n t?: Translate,\n /** The row's `type` -- the only place the name lives, since the asset carries none. */\n rowType?: string,\n /** The row's category, for an app's release checks (G10). */\n rowCategory?: string | null\n): Inspection {\n if (!sourceJson) {\n return { blocked: true, findings: [{ code: 'no-source', message: '저장된 정본이 없다. 저장하면 발행할 수 있다', blocking: true }] }\n }\n try {\n assertFormat(sourceJson)\n } catch (e) {\n const findings = (e as FigureSourceError).findings ?? [{ code: 'source-unreadable', message: String(e) }]\n return { blocked: true, findings: findings.map(f => ({ ...f, blocking: true })) }\n }\n\n let inspection\n let asset: FigureAsset | undefined\n try {\n asset = parseFigureAsset(sourceJson)\n inspection = inspectFigureAsset(asset)\n } catch (e) {\n const error = e as FigureContractError & { path?: string }\n return {\n blocked: true,\n findings: [{ code: error.code ?? 'asset-invalid', message: error.message ?? String(e), at: error.path, blocking: true }]\n }\n }\n\n const say = sayerOf(t)\n const findings: GateFinding[] = inspection.violations.map(violation => ({\n code: violation.code.toLowerCase().replace(/_/g, '-'),\n ...figureWording(violation, say),\n at: violation.part,\n blocking: true\n }))\n /*\n A machine-made name is refused at release. The asset has no `type`, so the name is read off the row; a new figure\n was once published as `FIGURE_<uuid>` (:3300, 2026-09-24). Publishing freezes the name (ADR-0063 decision 4) and\n boards call a figure by it.\n */\n if (rowType && isPlaceholderType(rowType)) {\n findings.push({\n code: 'type-is-placeholder',\n message: say('figure.gate.type-is-placeholder.message', { type: rowType }, `'${rowType}' is a temporary type given when the figure was first saved.`),\n why: say('figure.gate.type-is-placeholder.why', {}, 'Boards call a figure by its type, and it cannot change once the figure is published.'),\n how: say('figure.gate.type-is-placeholder.how', {}, 'Set the type in the type field, then publish.'),\n blocking: true\n })\n }\n findings.push(...planeGapFindings(asset!, say))\n if (releasedJson) findings.push(...figureContractFindings(asset!, releasedJson, say))\n findings.push(...appFindings({ asset: asset!, type: rowType, category: rowCategory, t }))\n return { blocked: findings.some(finding => finding.blocking), findings }\n}\n\n/*\n Said, never refused: a figure off the plane it is mounted on stands off it on every board -- a conveyor in the air, a\n hoist hung below a floor figure (the walk of 2026-10-18 found each passing release with no word). A gap can be meant,\n and so can a part through the plane, so it does not block. A figure that names its mounting face is checked on that\n face by the gate already; this is for the one that names none.\n*/\ntype Gap = { part: string; mm: number }\nconst PLANE_ENGLISH = {\n floor: {\n clear: (g: Gap) => `'${g.part}' is ${g.mm} mm above the floor.`,\n through: (g: Gap) => `'${g.part}' goes ${g.mm} mm below the floor.`,\n beyond: 'Every part is below the floor.',\n why: 'A board stands this figure on the floor, so it stands so on every board.',\n beyondHow: 'If it hangs from the ceiling, set where it stands to the ceiling.'\n },\n ceiling: {\n clear: (g: Gap) => `'${g.part}' is ${g.mm} mm below the ceiling.`,\n through: (g: Gap) => `'${g.part}' goes ${g.mm} mm above the ceiling.`,\n beyond: 'Every part is above the ceiling.',\n why: 'A board hangs this figure from the ceiling, so it hangs so on every board.',\n beyondHow: 'If it stands on the floor, set where it stands to the floor.'\n },\n wall: {\n clear: (g: Gap) => `'${g.part}' is ${g.mm} mm out from the wall.`,\n through: (g: Gap) => `'${g.part}' goes ${g.mm} mm into the wall.`,\n beyond: 'Every part is behind the wall.',\n why: 'A board puts this figure on the wall, so it sits so on every board.',\n beyondHow: 'Bring the parts out in front of the wall, or choose again where it stands.'\n }\n} as const\nfunction planeGapFindings(asset: FigureAsset, say: Say): GateFinding[] {\n if (asset.mountingFace) return []\n const gap = figurePlaneGapOf(asset)\n if (!gap || gap.touches) return []\n const english = PLANE_ENGLISH[gap.placement]\n const key = `figure.gate.off-mounting-plane.${gap.placement}`\n const kind = gap.beyond ? 'beyond' : gap.mm > 0 ? 'clear' : 'through'\n const said = { part: gap.part, mm: Math.round(Math.abs(gap.mm)) }\n return [\n {\n code: 'off-mounting-plane',\n message: say(`${key}.${kind}.message`, said, kind === 'beyond' ? english.beyond : english[kind](said)),\n why: say(`${key}.why`, {}, english.why),\n how:\n kind === 'beyond'\n ? say(`${key}.beyond.how`, {}, english.beyondHow)\n : say('figure.gate.off-mounting-plane.how', {}, 'Keep it if it is meant. Otherwise fasten that part to the mounting plane, or move it until it meets the plane.'),\n at: gap.part,\n blocking: false\n }\n ]\n}\n\n/**\n * The last release against this one — what the drawings that already hold this type lean on (ADR-0063 decision 3).\n *\n * figure-model names the changes and whether each blocks (`figureContractChanges`); the sentence is made here. When\n * the last release no longer parses, the gate says so rather than passing in silence: a release that was not checked\n * against the last one is a different fact from one that was checked and found safe.\n */\nfunction figureContractFindings(asset: FigureAsset, releasedJson: string, say: Say): GateFinding[] {\n let before: FigureAsset\n try {\n before = parseFigureAsset(releasedJson)\n } catch (e) {\n return [\n {\n code: 'released-unreadable',\n message: say('figure.gate.released-not-compared.message', { reason: (e as Error).message }, `The last release could not be read, so this release was not compared with it: ${(e as Error).message}`),\n why: say('figure.gate.released-not-compared.why', {}, 'Whether this release breaks the instances already placed has not been checked.'),\n blocking: false\n }\n ]\n }\n return figureContractChanges(before, asset).map(change => ({\n code: change.code,\n ...figureContractWording(change, say),\n at: change.subject,\n blocking: change.blocking\n }))\n}\n\n/** One contract change in the words of the release panel. The English line is the fallback for a missing key. */\nfunction figureContractWording(change: FigureContractChange, say: Say): Pick<GateFinding, 'message' | 'why' | 'how'> {\n const v = change.values\n const key = (field: string) => `figure.gate.contract.${change.code}.${field}`\n const gone = {\n how: say('figure.gate.contract.gone.how', {}, 'Put it back as it was, or publish this as a new figure type so the placed ones keep the old one.')\n }\n switch (change.code) {\n case 'placement-changed':\n return {\n message: say(key('message'), v, `Placement changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'Placement sets the height of every placed instance. They all move with it.'),\n ...gone\n }\n case 'size-inputs-gone':\n return {\n message: say(key('message'), v, 'The figure no longer takes its size from the place it is given.'),\n why: say(key('why'), {}, 'Placed instances were sized on the board. After this release they all draw at the authored size.'),\n ...gone\n }\n case 'size-inputs-added':\n return {\n message: say(key('message'), v, 'The figure now takes its size from the place it is given.'),\n why: say(key('why'), {}, 'Placed instances now follow their own size on the board.')\n }\n case 'size-range-narrowed':\n return {\n message: say(key('message'), { ...v, input: change.subject ?? '' }, `The size range of ${change.subject} narrowed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'An instance placed at a size outside the new range will not draw. Which sizes are placed is not recorded.')\n }\n case 'authored-size-changed':\n return {\n message: say(key('message'), v, `The authored size changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'Placed instances keep their own size. An instance with no depth of its own takes its depth from this.')\n }\n case 'state-input-gone':\n return {\n message: say(key('message'), v, `The control '${v.id}' is gone.`),\n why: say(key('why'), {}, 'Placed instances and connectors give values under this name. After this release those values do nothing, and nothing on screen says why.'),\n ...gone\n }\n case 'state-unit-changed':\n return {\n message: say(key('message'), v, `The unit of the control '${v.id}' changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'Stored values keep their number. With another unit the same number means something else.'),\n ...gone\n }\n case 'state-range-narrowed':\n return {\n message: say(key('message'), v, `The range of the control '${v.id}' narrowed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'A value outside the new range may already be stored on a placed instance.')\n }\n case 'state-input-added':\n return {\n message: say(key('message'), v, `The control '${v.id}' is new.`),\n why: say(key('why'), {}, 'Placed instances that give no value stand at its default.')\n }\n case 'clip-gone':\n return {\n message: say(key('message'), v, `The clip '${v.clip}' is gone.`),\n why: say(key('why'), {}, 'Placed instances play clips by name. After this release that one plays nothing.'),\n ...gone\n }\n case 'clip-added':\n return {\n message: say(key('message'), v, `The clip '${v.clip}' is new.`),\n why: say(key('why'), {}, 'It stays still until an instance plays it.')\n }\n case 'binding-gone':\n return {\n message: say(key('message'), v, `The place '${v.binding}' is gone.`),\n why: say(key('why'), {}, 'What sits in it on a placed instance loses its place.'),\n ...gone\n }\n case 'binding-role-changed':\n return {\n message: say(key('message'), v, `The place '${v.binding}' changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'What sits in it was placed for the old role.'),\n ...gone\n }\n case 'binding-capacity-reduced':\n return {\n message: say(key('message'), v, `The place '${v.binding}' holds ${v.after} instead of ${v.before}.`),\n why: say(key('why'), {}, 'What sits in the places that went has nowhere to go.'),\n ...gone\n }\n case 'binding-accepts-narrowed':\n return {\n message: say(key('message'), v, `The place '${v.binding}' no longer accepts ${v.types}.`),\n why: say(key('why'), {}, 'What already sits there stays. The next one of that type is refused.')\n }\n case 'binding-added':\n return {\n message: say(key('message'), v, `The place '${v.binding}' is new.`),\n why: say(key('why'), {}, 'Placed instances do not know it yet and stand as they are.')\n }\n /* Slots a slot layout unfolds into, and the anchors they stand on (ADR-0051 §4.1, the old ADR-0118 decision 6). */\n case 'slot-moved':\n return {\n message: say(key('message'), v, `The slot '${v.binding}' is somewhere else on its anchor.`),\n why: say(key('why'), {}, 'What sits in it moves with it. Data that names the slot by its address now means the new place.')\n }\n case 'slot-anchor-gone':\n return {\n message: say(key('message'), v, `The anchor '${v.anchor}' that slots stand on is gone.`),\n why: say(key('why'), {}, 'A placement that lays its own slots on this anchor holds nothing after this release.'),\n ...gone\n }\n case 'slot-anchor-moved':\n return {\n message: say(key('message'), v, `The anchor '${v.anchor}' moved from the ${v.before} face to the ${v.after} face.`),\n why: say(key('why'), {}, 'Every slot on it, and what sits there, stands on the new face after this release.')\n }\n case 'capability-gone':\n return {\n message: say(key('message'), v, `The capability '${v.name}' is gone.`),\n why: say(key('why'), {}, 'Scenes attach behaviour by this name. Placed instances lose what it did.'),\n ...gone\n }\n case 'capability-added':\n return {\n message: say(key('message'), v, `The capability '${v.name}' is new.`),\n why: say(key('why'), {}, 'It adds what the figure can do. Placed instances stand as they are.')\n }\n /* Said, never refused (ADR-0104): a consumer that pins a release reads these before it moves to this one. */\n case 'size-changed':\n return {\n message: say(key('message'), v, `The figure's size changed from ${v.before || 'none'} to ${v.after || 'none'}.`),\n why: say(key('why'), {}, 'A board gives the figure a box of this size. One that moves to this release sees its box change.')\n }\n case 'motion-range-changed':\n return {\n message: say(key('message'), v, `The room the figure sweeps as it moves changed from ${v.before || 'none'} to ${v.after || 'none'}.`),\n why: say(key('why'), {}, 'It is what the figure reaches when it moves. One that moves to this release sees it reach differently.')\n }\n case 'contact-face-changed':\n return {\n message: say(key('message'), v, 'The face the figure is mounted by changed.'),\n why: say(key('why'), {}, 'A consumer that moves to this release sees it stand on the new face.')\n }\n case 'public-input-gone':\n return {\n message: say(key('message'), { ...v, input: change.subject ?? '' }, `'${change.subject}' is no longer set on a board.`),\n why: say(key('why'), {}, 'Values placed instances give it do nothing after this release.')\n }\n case 'public-input-range-narrowed':\n return {\n message: say(key('message'), { ...v, input: change.subject ?? '' }, `The range of '${change.subject}' narrowed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'An instance may have set a value outside the new range. Which values are placed is not recorded.')\n }\n case 'public-input-added':\n return {\n message: say(key('message'), { ...v, input: change.subject ?? '' }, `'${change.subject}' can now be set on a board.`),\n why: say(key('why'), {}, 'Placed instances that give no value stand at its default.')\n }\n /* A value another product reads by its key (ADR-0123): only a key that goes refuses; what a change means is its owner's. */\n case 'extension-gone':\n return {\n message: say(key('message'), v, `The extension '${v.key}' is gone.`),\n why: say(key('why'), {}, 'Another product reads this value by its key. After this release it finds none.'),\n ...gone\n }\n case 'extension-changed':\n return {\n message: say(key('message'), v, `The value of the extension '${v.key}' changed.`),\n why: say(key('why'), {}, 'The product that owns this key reads the new value and judges the change.')\n }\n case 'extension-added':\n return {\n message: say(key('message'), v, `The extension '${v.key}' is new.`),\n why: say(key('why'), {}, 'The product that owns this key reads this value.')\n }\n /* What a consumer's data mapping and a board's motion selection lean on (ADR-0051 §2.2, §3.2). */\n case 'data-field-gone':\n return {\n message: say(key('message'), v, `The data field '${v.id}' is gone.`),\n why: say(key('why'), {}, 'Boards map their data onto this id. After this release that data moves nothing.'),\n ...gone\n }\n case 'data-field-kind-changed':\n return {\n message: say(key('message'), v, `The data field '${v.id}' changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'Mapped data was written for the old kind or unit. After this release the same data is refused or means something else.'),\n ...gone\n }\n case 'data-field-narrowed':\n return {\n message: say(key('message'), v, `The data field '${v.id}' takes less: ${v.before} → ${v.after}.`),\n why: say(key('why'), {}, 'Data with a value it no longer takes is refused whole, and the figure keeps what it showed.'),\n ...gone\n }\n case 'data-field-added':\n return {\n message: say(key('message'), v, `The data field '${v.id}' is new.`),\n why: say(key('why'), {}, 'Until a board maps data onto it, it stands at its default.')\n }\n case 'data-field-label-changed':\n return {\n message: say(key('message'), v, `The data field '${v.id}' is now called '${v.after}'.`),\n why: say(key('why'), {}, 'Mappings name the id, so they keep working.')\n }\n case 'data-field-default-changed':\n return {\n message: say(key('message'), v, `The default of the data field '${v.id}' changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, 'A placed figure with no data or saved value for it stands differently after this release.')\n }\n case 'data-bindings-changed':\n return {\n message: say(key('message'), v, 'What the data moves (its bindings) changed.'),\n why: say(key('why'), {}, 'The same data gives another pose, colour or clip after this release.')\n }\n case 'motion-group-gone':\n return {\n message: say(key('message'), v, `The motion group '${v.group}' is gone.`),\n why: say(key('why'), {}, 'Boards and data choose its clip by this id. After this release that choice does nothing.'),\n ...gone\n }\n case 'motion-group-clip-removed':\n return {\n message: say(key('message'), v, `The motion group '${v.group}' no longer holds '${v.clip}'.`),\n why: say(key('why'), {}, 'A board or data that chooses this clip in the group is refused after this release.'),\n ...gone\n }\n case 'motion-clip-group-changed':\n return {\n message: say(key('message'), v, `The clip '${v.clip}' played on its own and is now in the motion group '${v.group}'.`),\n why: say(key('why'), {}, \"Boards played it by its own speed. After this release it plays only when the group's choice is this clip.\"),\n ...gone\n }\n case 'motion-group-added':\n return {\n message: say(key('message'), v, `The motion group '${v.group}' is new.`),\n why: say(key('why'), {}, 'Placed instances play its default clip until a board or data chooses another.')\n }\n case 'motion-group-clip-added':\n return {\n message: say(key('message'), v, `The motion group '${v.group}' now holds '${v.clip}'.`),\n why: say(key('why'), {}, 'It plays when a board or data chooses it.')\n }\n case 'motion-group-default-changed':\n return {\n message: say(key('message'), v, `The motion group '${v.group}' now starts with '${v.after}', not '${v.before}'.`),\n why: say(key('why'), {}, 'Placed instances with no choice of their own play the new default after this release.')\n }\n case 'motion-group-transition-changed':\n return {\n message: say(key('message'), v, `A change of clip in '${v.group}' now blends over ${v.after} s, not ${v.before} s.`),\n why: say(key('why'), {}, 'Only how a change of clip looks changes; which clip plays does not.')\n }\n /* The joints a controller drives (ADR-0107 decision 7): what writing a state input moves, compared release to release. */\n case 'state-input-joints-changed': {\n const after = v.after || say('figure.gate.contract.joints-none', {}, 'nothing')\n return {\n message: say(key('message'), { ...v, after }, `The control '${v.id}' moved ${v.before}. It now moves ${after}.`),\n why: say(key('why'), {}, 'A controller writes this value to drive those joints. After this release the same value moves other joints, or by other amounts.'),\n ...gone\n }\n }\n case 'joint-axis-changed':\n return {\n message: say(key('message'), v, `The axis of the joint '${v.joint}' changed from ${v.before} to ${v.after}.`),\n why: say(key('why'), {}, \"A controller's stored values turn or slide the joint about this axis. After this release the same value moves it another way.\"),\n ...gone\n }\n case 'joint-motion-unit-changed':\n return {\n message: say(key('message'), v, `The joint '${v.joint}' now moves in ${v.after}, not ${v.before}.`),\n why: say(key('why'), {}, \"A controller's stored values were written for the old unit. After this release the same value means another motion.\"),\n ...gone\n }\n case 'joint-child-changed':\n return {\n message: say(key('message'), v, `The joint '${v.joint}' now moves '${v.after}' instead of '${v.before}'.`),\n why: say(key('why'), {}, \"A controller's values keep their meaning. On screen the joint now moves the new part.\")\n }\n case 'joint-list-unread':\n return {\n message: say(key('message'), v, `The last release's joint list could not be read, so its joints were not compared: ${v.reason}`),\n why: say(key('why'), {}, \"Whether this release changes what a controller's values move has not been checked. The last release was made by a kernel that did not measure joints.\")\n }\n }\n}\n\n/**\n * What a release records about itself (ADR-0104 decision 5): the format its asset is written in, what it measured\n * (its cost at its largest, whether resizing is stretching), its plan from above, and what changed against the previous release -- the kernel's own comparison, kept as it was then so a consumer that pins releases\n * reads it rather than computing it again. `[]` for a first release; `null` when the previous release could not be\n * read, which is a different fact from \"nothing changed\".\n */\nexport function releaseRecordOf(\n sourceJson: string,\n releasedJson?: string | null\n): { source: string; format: string; kernel: string; changes: FigureContractChange[] | null; metrics: FigureReleaseMetrics; topView: FigureTopView } {\n const asset = parseFigureAsset(sourceJson)\n /*\n The release's own copy carries its size range as it is now: the author's ends, and the rest as far as the parts\n allow (ADR-0087 decision 6). A board reads the ends from it and does not measure; the figure's row keeps only what\n the author narrowed.\n */\n const measured = {\n source: serializeFigureAsset(recordFigureInstanceSize(asset)),\n format: asset.version,\n kernel: FIGURE_KERNEL_VERSION,\n metrics: figureReleaseMetricsOf(asset),\n topView: figureTopViewOf(asset, null)\n }\n if (!releasedJson) return { ...measured, changes: [] }\n let before: FigureAsset\n try {\n before = parseFigureAsset(releasedJson)\n } catch {\n return { ...measured, changes: null }\n }\n return { ...measured, changes: figureContractChanges(before, asset) }\n}\n\n/**\n * A release's source made a draft's again (a revert): the size ends its release wrote down, as far as the parts allow,\n * are opened, and the author's own are kept (ADR-0087 decision 6). An author's end that equals the computed one is\n * opened with them.\n */\nexport function draftSourceOfRelease(releasedJson: string): string {\n assertFormat(releasedJson)\n return serializeFigureAsset(forgetRecordedInstanceSize(parseFigureAsset(releasedJson)))\n}\n\n/**\n * What a consumer is handed for a released figure: the asset itself, because what draws it -- `registerFigure` in\n * things-scene -- takes the asset and compiles it with the kernel.\n */\nexport function consumablePayloadOf(sourceJson: string): { asset: FigureAsset } {\n assertFormat(sourceJson)\n const asset = parseFigureAsset(sourceJson)\n compileFigureAsset(asset)\n return { asset }\n}\n"]}
@@ -28,7 +28,7 @@ export declare class FigureMutation {
28
28
  *
29
29
  * ## 무엇이 일어나나
30
30
  *
31
- * `state` 가 `released` 가 되고, 판 번호가 하나 오르고, 그 순간의 도형이 판본으로 남는다
31
+ * `state` 가 `released` 가 되고, 판 번호가 하나 오르고, 그 순간의 피규어가 판본으로 남는다
32
32
  * (`FigureHistory` — 스냅샷은 구독자가 뜬다). 저작 중 저장은 이 셋 중 아무것도 하지 않는다.
33
33
  *
34
34
  * ## 왜 이미 발행된 것을 거절하나
@@ -38,12 +38,12 @@ export declare class FigureMutation {
38
38
  *
39
39
  * ## 번호는 판본에서 센다
40
40
  *
41
- * 도형의 현재 번호가 아니라 **판본의 최대 번호 + 1** 이다. 되돌리기로 옛 판이 현재가 되어도
41
+ * 피규어의 현재 번호가 아니라 **판본의 최대 번호 + 1** 이다. 되돌리기로 옛 판이 현재가 되어도
42
42
  * 다음 발행이 이미 쓴 번호를 다시 쓰지 않는다.
43
43
  *
44
44
  * ## 게이트를 통과해야 한다
45
45
  *
46
- * 크기를 바꿨을 때 조각이 갈라지는 도형은 발행되지 않는다(`figure-gate.ts`). 소비처는 형상을
46
+ * 크기를 바꿨을 때 조각이 갈라지는 피규어는 발행되지 않는다(`figure-gate.ts`). 소비처는 형상을
47
47
  * 늘려 쓰므로 — 그것이 이 형식의 값이다 — 늘려도 견디는지가 약속의 일부다. 화면은 같은 판정을
48
48
  * `inspectFigure` 로 미리 물어 이유를 보여 준다.
49
49
  */
@@ -63,7 +63,7 @@ export declare class FigureMutation {
63
63
  *
64
64
  * ## 비용은 다시 잰다
65
65
  *
66
- * 판본이 든 점수·삼각형은 **그때의 형식**으로 잰 값이다. 지금 이 도형이 그 내용이 되었으므로
66
+ * 판본이 든 점수·삼각형은 **그때의 형식**으로 잰 값이다. 지금 이 피규어가 그 내용이 되었으므로
67
67
  * 오늘 기준으로 다시 계산한다. 옛 값은 판본에 그대로 남아 있다.
68
68
  */
69
69
  revertFigureVersion(id: string, version: number, requestId: string, expectedSource: string, context: ResolverContext): Promise<FigureRevertResult>;
@@ -86,7 +86,7 @@ export declare class FigureMutation {
86
86
  /**
87
87
  * 저작 보조에게 제안을 시킨다(ADR-0094).
88
88
  *
89
- * **저장하지 않는다.** 모델러 명령 목록과 그것이 만드는 도형을 돌려줄 뿐이고, 정본이 되는 것은 저작자가 모델러에
89
+ * **저장하지 않는다.** 모델러 명령 목록과 그것이 만드는 피규어를 돌려줄 뿐이고, 정본이 되는 것은 저작자가 모델러에
90
90
  * 적용하고 저장한 뒤다. 커널이 거절한 명령이나 게이트가 잡은 것은 여기까지 오지 않는다 — 제안기가 사유를 모델에
91
91
  * 돌려주고 다시 시킨다. 끝내 못 만들면 **사유와 함께 던진다.** 반쯤 만든 것을 돌려주지 않는다.
92
92
  */
@@ -208,7 +208,7 @@ let FigureMutation = class FigureMutation {
208
208
  **타입은 발행 전에만 바뀐다** — ADR-0063 결정 4.
209
209
 
210
210
  발행된 뒤에는 이미 배치된 도면이 이 이름을 가리키고, 바꾸면 그 도면이 아무 오류 없이
211
- 빈 자리가 된다. 발행된 적 없는 도형은 가리키는 도면이 있을 수 없다 — 도면은 최신
211
+ 빈 자리가 된다. 발행된 적 없는 피규어는 가리키는 도면이 있을 수 없다 — 도면은 최신
212
212
  발행판을 그리므로 그려질 자리가 없다.
213
213
 
214
214
  행과 정본 둘 다 고친다. 정본 안에도 `type` 이 있어서 한쪽만 고치면 저장된 JSON 과
@@ -277,7 +277,7 @@ let FigureMutation = class FigureMutation {
277
277
  *
278
278
  * ## 무엇이 일어나나
279
279
  *
280
- * `state` 가 `released` 가 되고, 판 번호가 하나 오르고, 그 순간의 도형이 판본으로 남는다
280
+ * `state` 가 `released` 가 되고, 판 번호가 하나 오르고, 그 순간의 피규어가 판본으로 남는다
281
281
  * (`FigureHistory` — 스냅샷은 구독자가 뜬다). 저작 중 저장은 이 셋 중 아무것도 하지 않는다.
282
282
  *
283
283
  * ## 왜 이미 발행된 것을 거절하나
@@ -287,12 +287,12 @@ let FigureMutation = class FigureMutation {
287
287
  *
288
288
  * ## 번호는 판본에서 센다
289
289
  *
290
- * 도형의 현재 번호가 아니라 **판본의 최대 번호 + 1** 이다. 되돌리기로 옛 판이 현재가 되어도
290
+ * 피규어의 현재 번호가 아니라 **판본의 최대 번호 + 1** 이다. 되돌리기로 옛 판이 현재가 되어도
291
291
  * 다음 발행이 이미 쓴 번호를 다시 쓰지 않는다.
292
292
  *
293
293
  * ## 게이트를 통과해야 한다
294
294
  *
295
- * 크기를 바꿨을 때 조각이 갈라지는 도형은 발행되지 않는다(`figure-gate.ts`). 소비처는 형상을
295
+ * 크기를 바꿨을 때 조각이 갈라지는 피규어는 발행되지 않는다(`figure-gate.ts`). 소비처는 형상을
296
296
  * 늘려 쓰므로 — 그것이 이 형식의 값이다 — 늘려도 견디는지가 약속의 일부다. 화면은 같은 판정을
297
297
  * `inspectFigure` 로 미리 물어 이유를 보여 준다.
298
298
  */
@@ -375,7 +375,7 @@ let FigureMutation = class FigureMutation {
375
375
  *
376
376
  * ## 비용은 다시 잰다
377
377
  *
378
- * 판본이 든 점수·삼각형은 **그때의 형식**으로 잰 값이다. 지금 이 도형이 그 내용이 되었으므로
378
+ * 판본이 든 점수·삼각형은 **그때의 형식**으로 잰 값이다. 지금 이 피규어가 그 내용이 되었으므로
379
379
  * 오늘 기준으로 다시 계산한다. 옛 값은 판본에 그대로 남아 있다.
380
380
  */
381
381
  async revertFigureVersion(id, version, requestId, expectedSource, context) {
@@ -452,7 +452,7 @@ let FigureMutation = class FigureMutation {
452
452
  /**
453
453
  * 저작 보조에게 제안을 시킨다(ADR-0094).
454
454
  *
455
- * **저장하지 않는다.** 모델러 명령 목록과 그것이 만드는 도형을 돌려줄 뿐이고, 정본이 되는 것은 저작자가 모델러에
455
+ * **저장하지 않는다.** 모델러 명령 목록과 그것이 만드는 피규어를 돌려줄 뿐이고, 정본이 되는 것은 저작자가 모델러에
456
456
  * 적용하고 저장한 뒤다. 커널이 거절한 명령이나 게이트가 잡은 것은 여기까지 오지 않는다 — 제안기가 사유를 모델에
457
457
  * 돌려주고 다시 시킨다. 끝내 못 만들면 **사유와 함께 던진다.** 반쯤 만든 것을 돌려주지 않는다.
458
458
  */