rig-create 1.0.1 → 1.0.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.
Files changed (598) hide show
  1. package/README.md +47 -23
  2. package/docs/CHECKS.md +9 -8
  3. package/docs/INTERVIEW.md +11 -4
  4. package/docs/LIVE-REVIEW.md +525 -0
  5. package/docs/PROJECT.md +10 -0
  6. package/package.json +5 -2
  7. package/scripts/npm-json.ts +74 -0
  8. package/scripts/verify-example-seals.ts +148 -0
  9. package/src/agent-guide.ts +16 -13
  10. package/src/choice-writers.ts +8 -2
  11. package/src/choices.ts +1 -1
  12. package/src/cli.ts +9 -1
  13. package/src/direction-writers.ts +3 -1
  14. package/src/direction.ts +2 -1
  15. package/src/feedback.ts +5 -2
  16. package/src/init.ts +1 -1
  17. package/src/job-acts.ts +44 -3
  18. package/src/job-host.ts +1 -1
  19. package/src/next.ts +197 -59
  20. package/src/record-input.ts +1 -1
  21. package/src/reopen.ts +1 -1
  22. package/src/review-package.ts +2 -1
  23. package/src/scene-writers.ts +2 -1
  24. package/src/scene.ts +3 -1
  25. package/src/signoff-pair.ts +60 -0
  26. package/src/signoff-target.ts +7 -4
  27. package/src/signoff.ts +5 -0
  28. package/src/structure.ts +1 -1
  29. package/templates/agent-guide.md +29 -31
  30. package/templates/example-chain/.gitignore +6 -0
  31. package/templates/example-chain/.npmignore +1 -0
  32. package/templates/example-chain/AGENTS.md +41 -43
  33. package/templates/example-chain/chain.json +55 -55
  34. package/templates/example-chain/checkpoints/0a-interview-options/.gitignore +6 -0
  35. package/templates/example-chain/checkpoints/0a-interview-options/.npmignore +1 -0
  36. package/templates/example-chain/checkpoints/0a-interview-options/AGENTS.md +41 -43
  37. package/templates/example-chain/checkpoints/0a-interview-options.json +1 -1
  38. package/templates/example-chain/checkpoints/0b-plan-pending/.gitignore +6 -0
  39. package/templates/example-chain/checkpoints/0b-plan-pending/.npmignore +1 -0
  40. package/templates/example-chain/checkpoints/0b-plan-pending/AGENTS.md +41 -43
  41. package/templates/example-chain/checkpoints/0b-plan-pending.json +1 -1
  42. package/templates/example-chain/checkpoints/1-parts-verdict/.gitignore +6 -0
  43. package/templates/example-chain/checkpoints/1-parts-verdict/.npmignore +1 -0
  44. package/templates/example-chain/checkpoints/1-parts-verdict/AGENTS.md +41 -43
  45. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/config.json +88 -0
  46. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/painting_in_rig.png +0 -0
  47. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/background.png +0 -0
  48. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/eye_l.png +0 -0
  49. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/eye_r.png +0 -0
  50. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/face.png +0 -0
  51. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/lantern.png +0 -0
  52. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/torso.png +0 -0
  53. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts.json +188 -0
  54. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/recomposite_rig.png +0 -0
  55. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/interview-requirements.json +8 -0
  56. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/check/build/run.json +40 -0
  57. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/check/build/skeleton.atlas +28 -0
  58. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/check/build/skeleton.json +674 -0
  59. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/check/build/skeleton.model.json +1072 -0
  60. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/check/build/skeleton.png +0 -0
  61. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/background.png +0 -0
  62. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/eye_l.png +0 -0
  63. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/eye_r.png +0 -0
  64. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/face.png +0 -0
  65. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/lantern.png +0 -0
  66. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/torso.png +0 -0
  67. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/mesh_report.json +15 -0
  68. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/motion.json +137 -0
  69. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/rig.json +536 -0
  70. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/run.json +52 -0
  71. package/templates/example-chain/checkpoints/1-parts-verdict/project.json +2 -2
  72. package/templates/example-chain/checkpoints/1-parts-verdict.json +5 -5
  73. package/templates/example-chain/checkpoints/2-rigging-answers/.gitignore +6 -0
  74. package/templates/example-chain/checkpoints/2-rigging-answers/.npmignore +1 -0
  75. package/templates/example-chain/checkpoints/2-rigging-answers/AGENTS.md +41 -43
  76. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/config.json +88 -0
  77. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/painting_in_rig.png +0 -0
  78. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/background.png +0 -0
  79. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/eye_l.png +0 -0
  80. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/eye_r.png +0 -0
  81. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/face.png +0 -0
  82. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/lantern.png +0 -0
  83. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/torso.png +0 -0
  84. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts.json +188 -0
  85. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/recomposite_rig.png +0 -0
  86. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/interview-requirements.json +8 -0
  87. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/check/build/run.json +40 -0
  88. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/check/build/skeleton.atlas +28 -0
  89. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/check/build/skeleton.json +674 -0
  90. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/check/build/skeleton.model.json +1072 -0
  91. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/check/build/skeleton.png +0 -0
  92. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/background.png +0 -0
  93. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/eye_l.png +0 -0
  94. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/eye_r.png +0 -0
  95. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/face.png +0 -0
  96. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/lantern.png +0 -0
  97. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/torso.png +0 -0
  98. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/mesh_report.json +15 -0
  99. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/motion.json +137 -0
  100. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/rig.json +536 -0
  101. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/run.json +52 -0
  102. package/templates/example-chain/checkpoints/2-rigging-answers/project.json +2 -2
  103. package/templates/example-chain/checkpoints/2-rigging-answers.json +5 -5
  104. package/templates/example-chain/checkpoints/3-rig-review/.gitignore +6 -0
  105. package/templates/example-chain/checkpoints/3-rig-review/.npmignore +1 -0
  106. package/templates/example-chain/checkpoints/3-rig-review/AGENTS.md +41 -43
  107. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/config.json +88 -0
  108. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/painting_in_rig.png +0 -0
  109. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/background.png +0 -0
  110. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/eye_l.png +0 -0
  111. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/eye_r.png +0 -0
  112. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/face.png +0 -0
  113. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/lantern.png +0 -0
  114. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/torso.png +0 -0
  115. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts.json +188 -0
  116. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/recomposite_rig.png +0 -0
  117. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/interview-requirements.json +8 -0
  118. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/check/build/run.json +40 -0
  119. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/check/build/skeleton.atlas +28 -0
  120. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/check/build/skeleton.json +674 -0
  121. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/check/build/skeleton.model.json +1072 -0
  122. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/check/build/skeleton.png +0 -0
  123. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/background.png +0 -0
  124. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/eye_l.png +0 -0
  125. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/eye_r.png +0 -0
  126. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/face.png +0 -0
  127. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/lantern.png +0 -0
  128. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/torso.png +0 -0
  129. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/mesh_report.json +15 -0
  130. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/motion.json +137 -0
  131. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/rig.json +536 -0
  132. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/run.json +52 -0
  133. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/config.json +88 -0
  134. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/interview-requirements.json +8 -0
  135. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/check/build/run.json +40 -0
  136. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/check/build/skeleton.atlas +28 -0
  137. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/check/build/skeleton.json +674 -0
  138. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/check/build/skeleton.model.json +1072 -0
  139. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/check/build/skeleton.png +0 -0
  140. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/background.png +0 -0
  141. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/eye_l.png +0 -0
  142. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/eye_r.png +0 -0
  143. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/face.png +0 -0
  144. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/lantern.png +0 -0
  145. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/torso.png +0 -0
  146. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts.json +188 -0
  147. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/background.png +0 -0
  148. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/eye_l.png +0 -0
  149. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/eye_r.png +0 -0
  150. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/face.png +0 -0
  151. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/lantern.png +0 -0
  152. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/torso.png +0 -0
  153. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/mesh_report.json +15 -0
  154. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/motion.json +137 -0
  155. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/rig.json +536 -0
  156. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/run.json +52 -0
  157. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/check/build/run.json +40 -0
  158. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/check/build/skeleton.atlas +28 -0
  159. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/check/build/skeleton.json +674 -0
  160. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/check/build/skeleton.model.json +1072 -0
  161. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/check/build/skeleton.png +0 -0
  162. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/painting_in_rig.png +0 -0
  163. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/background.png +0 -0
  164. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/eye_l.png +0 -0
  165. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/eye_r.png +0 -0
  166. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/face.png +0 -0
  167. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/lantern.png +0 -0
  168. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/torso.png +0 -0
  169. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts.json +188 -0
  170. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/background.png +0 -0
  171. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/eye_l.png +0 -0
  172. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/eye_r.png +0 -0
  173. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/face.png +0 -0
  174. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/lantern.png +0 -0
  175. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/torso.png +0 -0
  176. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/mesh_report.json +15 -0
  177. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/motion.json +137 -0
  178. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/rig.json +536 -0
  179. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/run.json +52 -0
  180. package/templates/example-chain/checkpoints/3-rig-review/project.json +4 -4
  181. package/templates/example-chain/checkpoints/3-rig-review.json +9 -9
  182. package/templates/example-chain/checkpoints/4-direction-post/.gitignore +6 -0
  183. package/templates/example-chain/checkpoints/4-direction-post/.npmignore +1 -0
  184. package/templates/example-chain/checkpoints/4-direction-post/AGENTS.md +41 -43
  185. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/config.json +88 -0
  186. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/painting_in_rig.png +0 -0
  187. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/background.png +0 -0
  188. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/eye_l.png +0 -0
  189. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/eye_r.png +0 -0
  190. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/face.png +0 -0
  191. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/lantern.png +0 -0
  192. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/torso.png +0 -0
  193. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts.json +188 -0
  194. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/recomposite_rig.png +0 -0
  195. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/interview-requirements.json +8 -0
  196. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/check/build/run.json +40 -0
  197. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/check/build/skeleton.atlas +28 -0
  198. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/check/build/skeleton.json +674 -0
  199. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/check/build/skeleton.model.json +1072 -0
  200. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/check/build/skeleton.png +0 -0
  201. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/background.png +0 -0
  202. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/eye_l.png +0 -0
  203. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/eye_r.png +0 -0
  204. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/face.png +0 -0
  205. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/lantern.png +0 -0
  206. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/torso.png +0 -0
  207. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/mesh_report.json +15 -0
  208. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/motion.json +137 -0
  209. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/rig.json +536 -0
  210. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/run.json +52 -0
  211. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/config.json +88 -0
  212. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/interview-requirements.json +8 -0
  213. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/check/build/run.json +40 -0
  214. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/check/build/skeleton.atlas +28 -0
  215. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/check/build/skeleton.json +674 -0
  216. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/check/build/skeleton.model.json +1072 -0
  217. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/check/build/skeleton.png +0 -0
  218. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/background.png +0 -0
  219. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/eye_l.png +0 -0
  220. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/eye_r.png +0 -0
  221. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/face.png +0 -0
  222. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/lantern.png +0 -0
  223. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/torso.png +0 -0
  224. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts.json +188 -0
  225. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/background.png +0 -0
  226. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/eye_l.png +0 -0
  227. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/eye_r.png +0 -0
  228. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/face.png +0 -0
  229. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/lantern.png +0 -0
  230. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/torso.png +0 -0
  231. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/mesh_report.json +15 -0
  232. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/motion.json +137 -0
  233. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/rig.json +536 -0
  234. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/run.json +52 -0
  235. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/check/build/run.json +40 -0
  236. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/check/build/skeleton.atlas +28 -0
  237. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/check/build/skeleton.json +674 -0
  238. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/check/build/skeleton.model.json +1072 -0
  239. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/check/build/skeleton.png +0 -0
  240. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/painting_in_rig.png +0 -0
  241. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/background.png +0 -0
  242. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/eye_l.png +0 -0
  243. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/eye_r.png +0 -0
  244. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/face.png +0 -0
  245. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/lantern.png +0 -0
  246. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/torso.png +0 -0
  247. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts.json +188 -0
  248. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/background.png +0 -0
  249. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/eye_l.png +0 -0
  250. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/eye_r.png +0 -0
  251. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/face.png +0 -0
  252. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/lantern.png +0 -0
  253. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/torso.png +0 -0
  254. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/mesh_report.json +15 -0
  255. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/motion.json +137 -0
  256. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/rig.json +536 -0
  257. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/run.json +52 -0
  258. package/templates/example-chain/checkpoints/4-direction-post/project.json +5 -5
  259. package/templates/example-chain/checkpoints/4-direction-post.json +9 -9
  260. package/templates/example-chain/derived/drafts/chain/config.json +88 -0
  261. package/templates/example-chain/derived/drafts/chain/input/painting_in_rig.png +0 -0
  262. package/templates/example-chain/derived/drafts/chain/input/parts/background.png +0 -0
  263. package/templates/example-chain/derived/drafts/chain/input/parts/eye_l.png +0 -0
  264. package/templates/example-chain/derived/drafts/chain/input/parts/eye_r.png +0 -0
  265. package/templates/example-chain/derived/drafts/chain/input/parts/face.png +0 -0
  266. package/templates/example-chain/derived/drafts/chain/input/parts/lantern.png +0 -0
  267. package/templates/example-chain/derived/drafts/chain/input/parts/torso.png +0 -0
  268. package/templates/example-chain/derived/drafts/chain/input/parts.json +188 -0
  269. package/templates/example-chain/derived/drafts/chain/input/recomposite_rig.png +0 -0
  270. package/templates/example-chain/derived/drafts/chain/interview-requirements.json +8 -0
  271. package/templates/example-chain/derived/drafts/chain/out/check/build/run.json +40 -0
  272. package/templates/example-chain/derived/drafts/chain/out/check/build/skeleton.atlas +28 -0
  273. package/templates/example-chain/derived/drafts/chain/out/check/build/skeleton.json +674 -0
  274. package/templates/example-chain/derived/drafts/chain/out/check/build/skeleton.model.json +1072 -0
  275. package/templates/example-chain/derived/drafts/chain/out/check/build/skeleton.png +0 -0
  276. package/templates/example-chain/derived/drafts/chain/out/images/background.png +0 -0
  277. package/templates/example-chain/derived/drafts/chain/out/images/eye_l.png +0 -0
  278. package/templates/example-chain/derived/drafts/chain/out/images/eye_r.png +0 -0
  279. package/templates/example-chain/derived/drafts/chain/out/images/face.png +0 -0
  280. package/templates/example-chain/derived/drafts/chain/out/images/lantern.png +0 -0
  281. package/templates/example-chain/derived/drafts/chain/out/images/torso.png +0 -0
  282. package/templates/example-chain/derived/drafts/chain/out/mesh_report.json +15 -0
  283. package/templates/example-chain/derived/drafts/chain/out/motion.json +137 -0
  284. package/templates/example-chain/derived/drafts/chain/out/rig.json +536 -0
  285. package/templates/example-chain/derived/drafts/chain/out/run.json +52 -0
  286. package/templates/example-chain/derived/review/v1/config.json +88 -0
  287. package/templates/example-chain/derived/review/v1/interview-requirements.json +8 -0
  288. package/templates/example-chain/derived/review/v1/out/check/build/run.json +40 -0
  289. package/templates/example-chain/derived/review/v1/out/check/build/skeleton.atlas +28 -0
  290. package/templates/example-chain/derived/review/v1/out/check/build/skeleton.json +674 -0
  291. package/templates/example-chain/derived/review/v1/out/check/build/skeleton.model.json +1072 -0
  292. package/templates/example-chain/derived/review/v1/out/check/build/skeleton.png +0 -0
  293. package/templates/example-chain/derived/review/v1/out/parts/background.png +0 -0
  294. package/templates/example-chain/derived/review/v1/out/parts/eye_l.png +0 -0
  295. package/templates/example-chain/derived/review/v1/out/parts/eye_r.png +0 -0
  296. package/templates/example-chain/derived/review/v1/out/parts/face.png +0 -0
  297. package/templates/example-chain/derived/review/v1/out/parts/lantern.png +0 -0
  298. package/templates/example-chain/derived/review/v1/out/parts/torso.png +0 -0
  299. package/templates/example-chain/derived/review/v1/out/parts.json +188 -0
  300. package/templates/example-chain/derived/review/v1/out/rig/images/background.png +0 -0
  301. package/templates/example-chain/derived/review/v1/out/rig/images/eye_l.png +0 -0
  302. package/templates/example-chain/derived/review/v1/out/rig/images/eye_r.png +0 -0
  303. package/templates/example-chain/derived/review/v1/out/rig/images/face.png +0 -0
  304. package/templates/example-chain/derived/review/v1/out/rig/images/lantern.png +0 -0
  305. package/templates/example-chain/derived/review/v1/out/rig/images/torso.png +0 -0
  306. package/templates/example-chain/derived/review/v1/out/rig/mesh_report.json +15 -0
  307. package/templates/example-chain/derived/review/v1/out/rig/motion.json +137 -0
  308. package/templates/example-chain/derived/review/v1/out/rig/rig.json +536 -0
  309. package/templates/example-chain/derived/review/v1/out/rig/run.json +52 -0
  310. package/templates/example-chain/evidence/captions.json +1 -1
  311. package/templates/example-chain/evidence/direction/v2.json +1 -1
  312. package/templates/example-chain/evidence/direction-input.json +1 -1
  313. package/templates/example-chain/evidence/scene/s1.json +1 -1
  314. package/templates/example-chain/outputs/v1/out/check/build/run.json +40 -0
  315. package/templates/example-chain/outputs/v1/out/check/build/skeleton.atlas +28 -0
  316. package/templates/example-chain/outputs/v1/out/check/build/skeleton.json +674 -0
  317. package/templates/example-chain/outputs/v1/out/check/build/skeleton.model.json +1072 -0
  318. package/templates/example-chain/outputs/v1/out/check/build/skeleton.png +0 -0
  319. package/templates/example-chain/outputs/v1/out/painting_in_rig.png +0 -0
  320. package/templates/example-chain/outputs/v1/out/parts/background.png +0 -0
  321. package/templates/example-chain/outputs/v1/out/parts/eye_l.png +0 -0
  322. package/templates/example-chain/outputs/v1/out/parts/eye_r.png +0 -0
  323. package/templates/example-chain/outputs/v1/out/parts/face.png +0 -0
  324. package/templates/example-chain/outputs/v1/out/parts/lantern.png +0 -0
  325. package/templates/example-chain/outputs/v1/out/parts/torso.png +0 -0
  326. package/templates/example-chain/outputs/v1/out/parts.json +188 -0
  327. package/templates/example-chain/outputs/v1/out/rig/images/background.png +0 -0
  328. package/templates/example-chain/outputs/v1/out/rig/images/eye_l.png +0 -0
  329. package/templates/example-chain/outputs/v1/out/rig/images/eye_r.png +0 -0
  330. package/templates/example-chain/outputs/v1/out/rig/images/face.png +0 -0
  331. package/templates/example-chain/outputs/v1/out/rig/images/lantern.png +0 -0
  332. package/templates/example-chain/outputs/v1/out/rig/images/torso.png +0 -0
  333. package/templates/example-chain/outputs/v1/out/rig/mesh_report.json +15 -0
  334. package/templates/example-chain/outputs/v1/out/rig/motion.json +137 -0
  335. package/templates/example-chain/outputs/v1/out/rig/rig.json +536 -0
  336. package/templates/example-chain/outputs/v1/out/rig/run.json +52 -0
  337. package/templates/example-chain/project.json +10 -10
  338. package/templates/example-direction/derived/review/v1/out/check/build/run.json +2 -2
  339. package/templates/example-draft/derived/drafts/lantern/out/check/build/run.json +2 -2
  340. package/templates/example-draft/derived/drafts/lantern/out/run.json +2 -2
  341. package/templates/example-draft/derived/review/v1/out/check/build/run.json +2 -2
  342. package/templates/example-draft/derived/review/v1/out/rig/run.json +2 -2
  343. package/templates/example-draft/derived/review/v2/out/check/build/run.json +2 -2
  344. package/templates/example-draft/derived/review/v2/out/rig/run.json +2 -2
  345. package/templates/example-draft/evidence/direction/v4.json +3 -3
  346. package/templates/example-draft/evidence/direction-input-v4.json +3 -3
  347. package/templates/example-draft/evidence/parts-review.json +1 -1
  348. package/templates/example-draft/evidence/review-reads/{4ed0507381809746443021554e012032be5b5f8417da0f2e525e9b6df16e9f05.json → 52673b635b9cbc92da1a9e3d4c023a249bbacf79cd21b59724f03f18f8caf09b.json} +2 -2
  349. package/templates/example-draft/evidence/scene/s1.json +3 -3
  350. package/templates/example-draft/evidence/scene-citations.json +1 -1
  351. package/templates/example-draft/out/check/build/run.json +2 -2
  352. package/templates/example-draft/out/run.json +2 -2
  353. package/templates/example-draft/outputs/v1/out/check/build/run.json +2 -2
  354. package/templates/example-draft/outputs/v1/out/rig/run.json +2 -2
  355. package/templates/example-draft/outputs/v2/out/check/build/run.json +2 -2
  356. package/templates/example-draft/outputs/v2/out/rig/run.json +2 -2
  357. package/templates/example-interview-choice.json +68 -68
  358. package/templates/example-interview-options/constraint.json +2 -2
  359. package/templates/example-interview-options/example-assemble.json +2 -2
  360. package/templates/example-interview-options/example-bones.json +5 -5
  361. package/templates/example-interview-options/example-camera-depth.json +3 -3
  362. package/templates/example-interview-options/example-constraints.json +5 -5
  363. package/templates/example-interview-options/example-meshes.json +5 -5
  364. package/templates/example-interview-options/example-motion.json +5 -5
  365. package/templates/example-interview-options/example-picks.json +2 -2
  366. package/templates/example-interview-options/example-post-composition.json +3 -3
  367. package/templates/example-interview-options/example-post-timing.json +3 -3
  368. package/templates/example-interview-options/example-reference.json +2 -2
  369. package/templates/example-interview-options/example-rig-type.json +2 -2
  370. package/templates/example-interview-options/example-seethrough.json +2 -2
  371. package/templates/example-interview-options/fullscreen.json +2 -2
  372. package/templates/example-interview-options/other-explicit.json +2 -2
  373. package/templates/example-interview-options/other-pending.json +2 -2
  374. package/templates/example-interview-options/other-picks.json +2 -2
  375. package/templates/example-invariants/invariants.json +164 -164
  376. package/templates/example-project.json +249 -249
  377. package/templates/example-remesh/.gitignore +6 -0
  378. package/templates/example-remesh/.npmignore +1 -0
  379. package/templates/example-remesh/AGENTS.md +41 -43
  380. package/templates/example-remesh/derived/drafts/remesh/config.json +88 -0
  381. package/templates/example-remesh/derived/drafts/remesh/input/painting_in_rig.png +0 -0
  382. package/templates/example-remesh/derived/drafts/remesh/input/parts/background.png +0 -0
  383. package/templates/example-remesh/derived/drafts/remesh/input/parts/eye_l.png +0 -0
  384. package/templates/example-remesh/derived/drafts/remesh/input/parts/eye_r.png +0 -0
  385. package/templates/example-remesh/derived/drafts/remesh/input/parts/face.png +0 -0
  386. package/templates/example-remesh/derived/drafts/remesh/input/parts/lantern.png +0 -0
  387. package/templates/example-remesh/derived/drafts/remesh/input/parts/torso.png +0 -0
  388. package/templates/example-remesh/derived/drafts/remesh/input/parts.json +188 -0
  389. package/templates/example-remesh/derived/drafts/remesh/input/recomposite_rig.png +0 -0
  390. package/templates/example-remesh/derived/drafts/remesh/interview-requirements.json +8 -0
  391. package/templates/example-remesh/derived/drafts/remesh/out/check/build/run.json +40 -0
  392. package/templates/example-remesh/derived/drafts/remesh/out/check/build/skeleton.atlas +28 -0
  393. package/templates/example-remesh/derived/drafts/remesh/out/check/build/skeleton.json +674 -0
  394. package/templates/example-remesh/derived/drafts/remesh/out/check/build/skeleton.model.json +1072 -0
  395. package/templates/example-remesh/derived/drafts/remesh/out/check/build/skeleton.png +0 -0
  396. package/templates/example-remesh/derived/drafts/remesh/out/images/background.png +0 -0
  397. package/templates/example-remesh/derived/drafts/remesh/out/images/eye_l.png +0 -0
  398. package/templates/example-remesh/derived/drafts/remesh/out/images/eye_r.png +0 -0
  399. package/templates/example-remesh/derived/drafts/remesh/out/images/face.png +0 -0
  400. package/templates/example-remesh/derived/drafts/remesh/out/images/lantern.png +0 -0
  401. package/templates/example-remesh/derived/drafts/remesh/out/images/torso.png +0 -0
  402. package/templates/example-remesh/derived/drafts/remesh/out/mesh_report.json +15 -0
  403. package/templates/example-remesh/derived/drafts/remesh/out/motion.json +137 -0
  404. package/templates/example-remesh/derived/drafts/remesh/out/rig.json +536 -0
  405. package/templates/example-remesh/derived/drafts/remesh/out/run.json +52 -0
  406. package/templates/example-remesh/derived/review/v1/config.json +88 -0
  407. package/templates/example-remesh/derived/review/v1/interview-requirements.json +8 -0
  408. package/templates/example-remesh/derived/review/v1/out/check/build/run.json +44 -0
  409. package/templates/example-remesh/derived/review/v1/out/check/build/skeleton.atlas +28 -0
  410. package/templates/example-remesh/derived/review/v1/out/check/build/skeleton.json +674 -0
  411. package/templates/example-remesh/derived/review/v1/out/check/build/skeleton.model.json +1072 -0
  412. package/templates/example-remesh/derived/review/v1/out/check/build/skeleton.png +0 -0
  413. package/templates/example-remesh/derived/review/v1/out/painting_in_rig.png +0 -0
  414. package/templates/example-remesh/derived/review/v1/out/parts/background.png +0 -0
  415. package/templates/example-remesh/derived/review/v1/out/parts/eye_l.png +0 -0
  416. package/templates/example-remesh/derived/review/v1/out/parts/eye_r.png +0 -0
  417. package/templates/example-remesh/derived/review/v1/out/parts/face.png +0 -0
  418. package/templates/example-remesh/derived/review/v1/out/parts/lantern.png +0 -0
  419. package/templates/example-remesh/derived/review/v1/out/parts/torso.png +0 -0
  420. package/templates/example-remesh/derived/review/v1/out/parts.json +188 -0
  421. package/templates/example-remesh/derived/review/v1/out/rig/images/background.png +0 -0
  422. package/templates/example-remesh/derived/review/v1/out/rig/images/eye_l.png +0 -0
  423. package/templates/example-remesh/derived/review/v1/out/rig/images/eye_r.png +0 -0
  424. package/templates/example-remesh/derived/review/v1/out/rig/images/face.png +0 -0
  425. package/templates/example-remesh/derived/review/v1/out/rig/images/lantern.png +0 -0
  426. package/templates/example-remesh/derived/review/v1/out/rig/images/torso.png +0 -0
  427. package/templates/example-remesh/derived/review/v1/out/rig/mesh_report.json +15 -0
  428. package/templates/example-remesh/derived/review/v1/out/rig/motion.json +137 -0
  429. package/templates/example-remesh/derived/review/v1/out/rig/rig.json +536 -0
  430. package/templates/example-remesh/derived/review/v1/out/rig/run.json +52 -0
  431. package/templates/example-remesh/derived/review/v2/config.json +88 -0
  432. package/templates/example-remesh/derived/review/v2/interview-requirements.json +8 -0
  433. package/templates/example-remesh/derived/review/v2/out/check/build/run.json +44 -0
  434. package/templates/example-remesh/derived/review/v2/out/check/build/skeleton.atlas +28 -0
  435. package/templates/example-remesh/derived/review/v2/out/check/build/skeleton.json +674 -0
  436. package/templates/example-remesh/derived/review/v2/out/check/build/skeleton.model.json +1072 -0
  437. package/templates/example-remesh/derived/review/v2/out/check/build/skeleton.png +0 -0
  438. package/templates/example-remesh/derived/review/v2/out/painting_in_rig.png +0 -0
  439. package/templates/example-remesh/derived/review/v2/out/parts/background.png +0 -0
  440. package/templates/example-remesh/derived/review/v2/out/parts/eye_l.png +0 -0
  441. package/templates/example-remesh/derived/review/v2/out/parts/eye_r.png +0 -0
  442. package/templates/example-remesh/derived/review/v2/out/parts/face.png +0 -0
  443. package/templates/example-remesh/derived/review/v2/out/parts/lantern.png +0 -0
  444. package/templates/example-remesh/derived/review/v2/out/parts/torso.png +0 -0
  445. package/templates/example-remesh/derived/review/v2/out/parts.json +188 -0
  446. package/templates/example-remesh/derived/review/v2/out/rig/images/background.png +0 -0
  447. package/templates/example-remesh/derived/review/v2/out/rig/images/eye_l.png +0 -0
  448. package/templates/example-remesh/derived/review/v2/out/rig/images/eye_r.png +0 -0
  449. package/templates/example-remesh/derived/review/v2/out/rig/images/face.png +0 -0
  450. package/templates/example-remesh/derived/review/v2/out/rig/images/lantern.png +0 -0
  451. package/templates/example-remesh/derived/review/v2/out/rig/images/torso.png +0 -0
  452. package/templates/example-remesh/derived/review/v2/out/rig/mesh_report.json +15 -0
  453. package/templates/example-remesh/derived/review/v2/out/rig/motion.json +137 -0
  454. package/templates/example-remesh/derived/review/v2/out/rig/rig.json +536 -0
  455. package/templates/example-remesh/derived/review/v2/out/rig/run.json +52 -0
  456. package/templates/example-remesh/derived/review/v3/config.json +88 -0
  457. package/templates/example-remesh/derived/review/v3/interview-requirements.json +8 -0
  458. package/templates/example-remesh/derived/review/v3/out/check/build/run.json +44 -0
  459. package/templates/example-remesh/derived/review/v3/out/check/build/skeleton.atlas +28 -0
  460. package/templates/example-remesh/derived/review/v3/out/check/build/skeleton.json +674 -0
  461. package/templates/example-remesh/derived/review/v3/out/check/build/skeleton.model.json +1072 -0
  462. package/templates/example-remesh/derived/review/v3/out/check/build/skeleton.png +0 -0
  463. package/templates/example-remesh/derived/review/v3/out/painting_in_rig.png +0 -0
  464. package/templates/example-remesh/derived/review/v3/out/parts/background.png +0 -0
  465. package/templates/example-remesh/derived/review/v3/out/parts/eye_l.png +0 -0
  466. package/templates/example-remesh/derived/review/v3/out/parts/eye_r.png +0 -0
  467. package/templates/example-remesh/derived/review/v3/out/parts/face.png +0 -0
  468. package/templates/example-remesh/derived/review/v3/out/parts/lantern.png +0 -0
  469. package/templates/example-remesh/derived/review/v3/out/parts/torso.png +0 -0
  470. package/templates/example-remesh/derived/review/v3/out/parts.json +188 -0
  471. package/templates/example-remesh/derived/review/v3/out/rig/images/background.png +0 -0
  472. package/templates/example-remesh/derived/review/v3/out/rig/images/eye_l.png +0 -0
  473. package/templates/example-remesh/derived/review/v3/out/rig/images/eye_r.png +0 -0
  474. package/templates/example-remesh/derived/review/v3/out/rig/images/face.png +0 -0
  475. package/templates/example-remesh/derived/review/v3/out/rig/images/lantern.png +0 -0
  476. package/templates/example-remesh/derived/review/v3/out/rig/images/torso.png +0 -0
  477. package/templates/example-remesh/derived/review/v3/out/rig/mesh_report.json +15 -0
  478. package/templates/example-remesh/derived/review/v3/out/rig/motion.json +137 -0
  479. package/templates/example-remesh/derived/review/v3/out/rig/rig.json +536 -0
  480. package/templates/example-remesh/derived/review/v3/out/rig/run.json +52 -0
  481. package/templates/example-remesh/evidence/captions.json +1 -1
  482. package/templates/example-remesh/evidence/direction/v4.json +1 -1
  483. package/templates/example-remesh/evidence/direction/v5.json +1 -1
  484. package/templates/example-remesh/evidence/direction-input-v4.json +1 -1
  485. package/templates/example-remesh/evidence/direction-input-v5.json +1 -1
  486. package/templates/example-remesh/evidence/interview/assemble.json +1 -1
  487. package/templates/example-remesh/evidence/interview/bones.json +4 -4
  488. package/templates/example-remesh/evidence/interview/camera_depth.json +2 -2
  489. package/templates/example-remesh/evidence/interview/constraints.json +4 -4
  490. package/templates/example-remesh/evidence/interview/meshes.json +4 -4
  491. package/templates/example-remesh/evidence/interview/motion.json +4 -4
  492. package/templates/example-remesh/evidence/interview/post_composition.json +2 -2
  493. package/templates/example-remesh/evidence/interview/post_timing.json +2 -2
  494. package/templates/example-remesh/evidence/interview/reference.json +1 -1
  495. package/templates/example-remesh/evidence/interview/rig_type.json +1 -1
  496. package/templates/example-remesh/evidence/interview/seethrough.json +1 -1
  497. package/templates/example-remesh/evidence/parts-review.json +1 -1
  498. package/templates/example-remesh/evidence/review-reads/{6a17db694db96f1b6049a61a017e0c8e66757b982b8851e0187e561cfcf9af68.json → afe2522be4087f7f2fa7e97746d5f8574b0aedb474245ce2dbce0455e662f041.json} +2 -2
  499. package/templates/example-remesh/evidence/scene/s1.json +2 -2
  500. package/templates/example-remesh/evidence/v1/registration/at-source.json +2 -2
  501. package/templates/example-remesh/evidence/v1/registration/rigc-run-1.json +2 -2
  502. package/templates/example-remesh/evidence/v2/registration/at-source.json +2 -2
  503. package/templates/example-remesh/evidence/v2/registration/rigc-run-1.json +2 -2
  504. package/templates/example-remesh/evidence/v3/registration/at-source.json +2 -2
  505. package/templates/example-remesh/evidence/v3/registration/rigc-run-1.json +2 -2
  506. package/templates/example-remesh/outputs/v1/idle/frames.json +29 -0
  507. package/templates/example-remesh/outputs/v1/idle/idle@1fps/contact.png +0 -0
  508. package/templates/example-remesh/outputs/v1/idle/idle@1fps/f0000.png +0 -0
  509. package/templates/example-remesh/outputs/v1/idle/idle@1fps/f0001.png +0 -0
  510. package/templates/example-remesh/outputs/v1/idle/idle@1fps/f0002.png +0 -0
  511. package/templates/example-remesh/outputs/v1/idle/idle@1fps/f0003.png +0 -0
  512. package/templates/example-remesh/outputs/v1/idle/idle@1fps/f0004.png +0 -0
  513. package/templates/example-remesh/outputs/v1/out/check/build/run.json +44 -0
  514. package/templates/example-remesh/outputs/v1/out/check/build/skeleton.atlas +28 -0
  515. package/templates/example-remesh/outputs/v1/out/check/build/skeleton.json +674 -0
  516. package/templates/example-remesh/outputs/v1/out/check/build/skeleton.model.json +1072 -0
  517. package/templates/example-remesh/outputs/v1/out/check/build/skeleton.png +0 -0
  518. package/templates/example-remesh/outputs/v1/out/painting_in_rig.png +0 -0
  519. package/templates/example-remesh/outputs/v1/out/parts/background.png +0 -0
  520. package/templates/example-remesh/outputs/v1/out/parts/eye_l.png +0 -0
  521. package/templates/example-remesh/outputs/v1/out/parts/eye_r.png +0 -0
  522. package/templates/example-remesh/outputs/v1/out/parts/face.png +0 -0
  523. package/templates/example-remesh/outputs/v1/out/parts/lantern.png +0 -0
  524. package/templates/example-remesh/outputs/v1/out/parts/torso.png +0 -0
  525. package/templates/example-remesh/outputs/v1/out/parts.json +188 -0
  526. package/templates/example-remesh/outputs/v1/out/rig/images/background.png +0 -0
  527. package/templates/example-remesh/outputs/v1/out/rig/images/eye_l.png +0 -0
  528. package/templates/example-remesh/outputs/v1/out/rig/images/eye_r.png +0 -0
  529. package/templates/example-remesh/outputs/v1/out/rig/images/face.png +0 -0
  530. package/templates/example-remesh/outputs/v1/out/rig/images/lantern.png +0 -0
  531. package/templates/example-remesh/outputs/v1/out/rig/images/torso.png +0 -0
  532. package/templates/example-remesh/outputs/v1/out/rig/mesh_report.json +15 -0
  533. package/templates/example-remesh/outputs/v1/out/rig/motion.json +137 -0
  534. package/templates/example-remesh/outputs/v1/out/rig/rig.json +536 -0
  535. package/templates/example-remesh/outputs/v1/out/rig/run.json +52 -0
  536. package/templates/example-remesh/outputs/v2/idle/frames.json +29 -0
  537. package/templates/example-remesh/outputs/v2/idle/idle@1fps/contact.png +0 -0
  538. package/templates/example-remesh/outputs/v2/idle/idle@1fps/f0000.png +0 -0
  539. package/templates/example-remesh/outputs/v2/idle/idle@1fps/f0001.png +0 -0
  540. package/templates/example-remesh/outputs/v2/idle/idle@1fps/f0002.png +0 -0
  541. package/templates/example-remesh/outputs/v2/idle/idle@1fps/f0003.png +0 -0
  542. package/templates/example-remesh/outputs/v2/idle/idle@1fps/f0004.png +0 -0
  543. package/templates/example-remesh/outputs/v2/out/check/build/run.json +44 -0
  544. package/templates/example-remesh/outputs/v2/out/check/build/skeleton.atlas +28 -0
  545. package/templates/example-remesh/outputs/v2/out/check/build/skeleton.json +674 -0
  546. package/templates/example-remesh/outputs/v2/out/check/build/skeleton.model.json +1072 -0
  547. package/templates/example-remesh/outputs/v2/out/check/build/skeleton.png +0 -0
  548. package/templates/example-remesh/outputs/v2/out/painting_in_rig.png +0 -0
  549. package/templates/example-remesh/outputs/v2/out/parts/background.png +0 -0
  550. package/templates/example-remesh/outputs/v2/out/parts/eye_l.png +0 -0
  551. package/templates/example-remesh/outputs/v2/out/parts/eye_r.png +0 -0
  552. package/templates/example-remesh/outputs/v2/out/parts/face.png +0 -0
  553. package/templates/example-remesh/outputs/v2/out/parts/lantern.png +0 -0
  554. package/templates/example-remesh/outputs/v2/out/parts/torso.png +0 -0
  555. package/templates/example-remesh/outputs/v2/out/parts.json +188 -0
  556. package/templates/example-remesh/outputs/v2/out/rig/images/background.png +0 -0
  557. package/templates/example-remesh/outputs/v2/out/rig/images/eye_l.png +0 -0
  558. package/templates/example-remesh/outputs/v2/out/rig/images/eye_r.png +0 -0
  559. package/templates/example-remesh/outputs/v2/out/rig/images/face.png +0 -0
  560. package/templates/example-remesh/outputs/v2/out/rig/images/lantern.png +0 -0
  561. package/templates/example-remesh/outputs/v2/out/rig/images/torso.png +0 -0
  562. package/templates/example-remesh/outputs/v2/out/rig/mesh_report.json +15 -0
  563. package/templates/example-remesh/outputs/v2/out/rig/motion.json +137 -0
  564. package/templates/example-remesh/outputs/v2/out/rig/rig.json +536 -0
  565. package/templates/example-remesh/outputs/v2/out/rig/run.json +52 -0
  566. package/templates/example-remesh/outputs/v3/idle/frames.json +29 -0
  567. package/templates/example-remesh/outputs/v3/idle/idle@1fps/contact.png +0 -0
  568. package/templates/example-remesh/outputs/v3/idle/idle@1fps/f0000.png +0 -0
  569. package/templates/example-remesh/outputs/v3/idle/idle@1fps/f0001.png +0 -0
  570. package/templates/example-remesh/outputs/v3/idle/idle@1fps/f0002.png +0 -0
  571. package/templates/example-remesh/outputs/v3/idle/idle@1fps/f0003.png +0 -0
  572. package/templates/example-remesh/outputs/v3/idle/idle@1fps/f0004.png +0 -0
  573. package/templates/example-remesh/outputs/v3/out/check/build/run.json +44 -0
  574. package/templates/example-remesh/outputs/v3/out/check/build/skeleton.atlas +28 -0
  575. package/templates/example-remesh/outputs/v3/out/check/build/skeleton.json +674 -0
  576. package/templates/example-remesh/outputs/v3/out/check/build/skeleton.model.json +1072 -0
  577. package/templates/example-remesh/outputs/v3/out/check/build/skeleton.png +0 -0
  578. package/templates/example-remesh/outputs/v3/out/painting_in_rig.png +0 -0
  579. package/templates/example-remesh/outputs/v3/out/parts/background.png +0 -0
  580. package/templates/example-remesh/outputs/v3/out/parts/eye_l.png +0 -0
  581. package/templates/example-remesh/outputs/v3/out/parts/eye_r.png +0 -0
  582. package/templates/example-remesh/outputs/v3/out/parts/face.png +0 -0
  583. package/templates/example-remesh/outputs/v3/out/parts/lantern.png +0 -0
  584. package/templates/example-remesh/outputs/v3/out/parts/torso.png +0 -0
  585. package/templates/example-remesh/outputs/v3/out/parts.json +188 -0
  586. package/templates/example-remesh/outputs/v3/out/rig/images/background.png +0 -0
  587. package/templates/example-remesh/outputs/v3/out/rig/images/eye_l.png +0 -0
  588. package/templates/example-remesh/outputs/v3/out/rig/images/eye_r.png +0 -0
  589. package/templates/example-remesh/outputs/v3/out/rig/images/face.png +0 -0
  590. package/templates/example-remesh/outputs/v3/out/rig/images/lantern.png +0 -0
  591. package/templates/example-remesh/outputs/v3/out/rig/images/torso.png +0 -0
  592. package/templates/example-remesh/outputs/v3/out/rig/mesh_report.json +15 -0
  593. package/templates/example-remesh/outputs/v3/out/rig/motion.json +137 -0
  594. package/templates/example-remesh/outputs/v3/out/rig/rig.json +536 -0
  595. package/templates/example-remesh/outputs/v3/out/rig/run.json +52 -0
  596. package/templates/example-remesh/project.json +225 -225
  597. package/templates/example-reopened/project.json +289 -289
  598. package/templates/example-split/captions.json +1 -1
@@ -0,0 +1,525 @@
1
+ # Writer-owned live review
2
+
3
+ Open the standing owner window from a foreground terminal. Keep that command
4
+ running while writers commit results. The reviewer identity is the trusted
5
+ bootstrap identity used by Review.
6
+
7
+ ```sh
8
+ rig-create job open <project> --reviewer <id> --role owner [--draft <id> | --rig <n> | --plan | --question <id>]
9
+ rig-create job reconcile <project>
10
+ rig-create job close <project>
11
+ ```
12
+
13
+ The open command prints the private owner-window URL. Keep it private.
14
+ `--rig <n>` selects an already registered rig or post and its retained review package,
15
+ including on a new job with an empty publication head. It accepts `1` or `v1`.
16
+ The version, complete retained package inventory and compiled model are checked
17
+ before starting the host or installing its binding, including pre-interview rigs.
18
+ Invalid selections refuse with `JOB_PUBLICATION_INVALID`; missing or changed
19
+ package files use the existing package-check refusal codes. Choose one of `--draft` and `--rig`; combining them
20
+ refuses with `JOB_BINDING_INVALID`. For a post, it retains the recorded parent rig and asks only
21
+ `review-verdict direction-review`. The legacy direction panel cannot render a post
22
+ publication with pending sign-off or checkpoint asks. Reopening an older post head
23
+ that declares those subjects replaces it with a verdict-only publication.
24
+ Reopening the same result over unchanged record
25
+ bytes reuses its publication and asks each declared subject once.
26
+
27
+ Judge direction on the post page with `job open --rig <post>`,
28
+ then ingest `review <post> --from-review <actId>`. Before the current live post has an accepted live verdict,
29
+ the record request refuses `JOB_DIRECTION_VERDICT_REQUIRED` without writing.
30
+ After verdict ingest, `job open --plan` asks `signoff direction-review` on the
31
+ record page. Ingest `signoff direction-review --from-review <actId>`, then
32
+ `advance accepted`. This route is supported by release-pinned
33
+ [Review 4.0.2](https://github.com/rig-c/review/tree/v4.0.2), including the
34
+ record direction-review sign-off from
35
+ [Review #795](https://github.com/rig-c/review/pull/795).
36
+
37
+ The act has no version selector. Its record hash binds the exact displayed
38
+ `project.json` bytes. Before the first write, create checks those bytes and
39
+ selects the current/latest live post and its accepted live direction verdict.
40
+ Earlier accepted post versions do not make the current target ambiguous.
41
+ Missing, duplicate or unaccepted current targets refuse
42
+ `REVIEW_ACT_RECORD_TARGET_INVALID`. Create's compact receipt retains
43
+ `record_sha256`, equal to the act's record hash, plus the resolved
44
+ `target_version` and `verdict` reference. Ledger validation and replay compare
45
+ that target with the recorded signoff and verify the act's hash binding even
46
+ after later records or reopens. The full record is not copied into its receipt;
47
+ Review's wire shape is unchanged. Immutable-byte replay precedes current-record
48
+ checks; a changed act or compact receipt refuses without writing.
49
+
50
+ The default in `parts` and `parts-review` publishes the latest recorded draft.
51
+ `--draft` names a recorded draft in any stage. Opening asks every subject that publication declares (see
52
+ [Asks](#asks)). It prints `job: draft <id> published`, or `already published`
53
+ when the job's head publication is already that draft (or an acknowledged `rig`
54
+ or `post` version) over the current record,
55
+ then `job: asked …` and `job: already asked …` with each subject. A `--draft` id
56
+ the record does not hold refuses `JOB_DRAFT_UNKNOWN` before writing `review_job`. A refused publish or ask
57
+ is printed while the foreground host keeps serving. The
58
+ versioned `review_job` stores only `jobId` and `origin`. The host installs its
59
+ fetch grant in the owner-only sibling `.rig-create-review-binding.json` and
60
+ ensures it and the durable `.rig-create-review/` outbox are ignored before
61
+ writing either. New projects declare both root patterns in init's `.gitignore`.
62
+ Existing Git projects receive only missing patterns in `.git/info/exclude`,
63
+ preserving their tracked `.gitignore` bytes. A folder without Git receives a
64
+ minimal `.gitignore` append. Effective ignores are checked before writing.
65
+ A tracked private path refuses startup. Agents invoke writers and never construct this file.
66
+ Explicit close revokes the grant and removes the matching binding (see
67
+ [Job retirement](JOB-RETIREMENT.md)). Listener shutdown alone preserves the
68
+ active job. A new incarnation receives a new grant.
69
+
70
+ Re-opening with an existing binding keeps its job. A running host is reused.
71
+ A stopped host restarts on the same job, state directory and port, and the
72
+ draft is published again only when the head publication no longer matches the
73
+ current record bytes. A binding whose root is another directory was copied
74
+ with the project (a clone or a move). `job open` never reads that binding's
75
+ host state or connects to its port: it opens this root's own job in its own
76
+ state directory, replaces the copied binding and rewrites `review_job`. Before
77
+ that, `job close` with the copied binding refuses `JOB_HOST_REUSE_MISMATCH` on
78
+ `root` before any attach, and a copied outbox entry refuses
79
+ `JOB_OUTBOX_INVALID`.
80
+
81
+ The outbox, intents and discard log live in the project-root
82
+ `.rig-create-review/`, independently of the binding and TMPDIR. Its directories
83
+ are owner-only 0700 and files 0600, with symlinks refused. Private Review host
84
+ state stays outside the project under the system temporary directory, as its
85
+ host contract requires. Losing that host state leaves the durable publication
86
+ HOLE visible.
87
+
88
+ ## Phase 1 results
89
+
90
+ | Writer | Published result | Review subject |
91
+ | --- | --- | --- |
92
+ | `draft-rig` | The labelled draft, C4 input inventory and retained output | `draft` selector and `parts-verdict`, plus sign subjects |
93
+ | `rig-version` | The recorded rig and retained review package | `rig` selector and `review-verdict` for `rig-review`, plus sign subjects |
94
+ | `direction write` and `direction patch` | The recorded post, direction document and retained rig package | `post` selector and only `review-verdict` for `direction-review` |
95
+ | `advance rig-review` | The current live rig at the entered review stage | `rig` selector, `review-verdict`, and the stage's `signoff` subject |
96
+ | `advance direction-review` | The current live post at the entered review stage | `post` selector and only `review-verdict direction-review` |
97
+
98
+ The sign subjects are the `signoff` and `checkpoint` subjects of
99
+ [Live sign-off routes](#live-sign-off-routes).
100
+
101
+ Writers produce `review-live-v<N>.json` over the existing model and original
102
+ direction bytes, using project-relative paths. Its title is `rig v<N>` or
103
+ `post v<N> (rig v<R>)`, so Review's previous/current publication notice names
104
+ the exact versions. A post needs the rig's complete retained review package.
105
+ Package-less option, plan, scene and stage-only writes await Review's separate
106
+ package-less-result contract. Act ingestion belongs to create#182.
107
+
108
+ The reader takes plan step hashes from create's `stepHash`, binds the retained
109
+ package against its recorded file hashes, and calls the installed public Parts
110
+ enumerator on the recorded `review_package.from` producer root. Its manifest
111
+ must match the packaged manifest hash, and every packaged PNG must match too.
112
+ Registration copies every image returned by Parts' public enumerator into its
113
+ retained producer output and records it in `review_package.files`. Historical
114
+ packages retain their existing file declarations, including their earlier
115
+ sibling omissions. Their recorded producer root remains the read path.
116
+ A package without `from` uses its own `out` directory. Its `images` preserves every returned row, role, duplicate path and
117
+ position. The enumerator version is read from the installed package metadata.
118
+ Review re-enumerates and validates the supplied identity under API@2/act@2.
119
+
120
+ ## Commit and recovery
121
+
122
+ Participating bound writers hold a shared write lock as well as their existing
123
+ writer lock until publication acknowledgment. Before replacing the project,
124
+ the writer fsyncs a private outbox intent containing the published `versions[]`
125
+ entry hash and result selector. The hash uses that entry's two-space JSON
126
+ serialization with a final newline. After commit, the matching entry is pending until Review
127
+ acknowledges it. The pending identity and generation
128
+ remain stable across retries, including acknowledgment loss. A publish failure
129
+ leaves the committed result and reports `JOB_PUBLISH_PENDING` beside the write.
130
+ `interview --check` includes every pending entry in `holes[]` and exits 1.
131
+ Unbound projects retain their existing report shape and writer behavior.
132
+
133
+ On a bound job, `advance rig-review` and `advance direction-review` follow the
134
+ same commit-then-durable-outbox order for the current live `rig` or `post`
135
+ version: holding the shared job write lock, the writer validates the post-advance
136
+ candidate and live version before writing, records the outbox intent for the
137
+ post-advance record bytes, atomically replaces `project.json`, and publishes the
138
+ version with its `review-verdict` and, for a rig, stage `signoff` subjects. If publication
139
+ fails after `project.json` is committed, the stage advance stays committed in
140
+ `project.json`, `JOB_PUBLISH_PENDING` remains in the durable outbox and is
141
+ reported in `interview --check` `holes[]`, and `rig-create job reconcile`
142
+ publishes and clears it. If the atomic record write itself fails before
143
+ `project.json` is replaced, the uncommitted advance intent is removed and
144
+ `project.json` stays byte-identical, so there is never a silent half-advance
145
+ where the stage is advanced without either an acknowledged publication or a
146
+ durable pending outbox entry. Advances into any other stage and advances when no
147
+ job is bound do not publish or touch the outbox.
148
+
149
+ Run `job reconcile` after restoring the host or declared package. It holds the
150
+ same lock, verifies the retained version and files, publishes against the
151
+ current whole-record hash and removes the acknowledged entry. Later signoffs,
152
+ inputs and other independent writes remain in that current record.
153
+ Reconciliation never rewrites `project.json`. A changed or missing committed
154
+ version refuses with `JOB_PUBLICATION_STALE`. Another participating writer and explicit close
155
+ wait until pending work is reconciled. After process loss, `check` and reconcile
156
+ recover a dead writer's shared lock. An intent with a matching version entry is
157
+ a pending HOLE, including after other writers change the surrounding record.
158
+ An intent whose version is absent is dropped with its ID and version hash
159
+ in the private `discarded-intents.jsonl` log. Active writer intents stay held.
160
+ A different version hash remains a named HOLE and is preserved. A refused
161
+ write cancels its absent-version intent. Each current-record snapshot has its
162
+ own idempotent request key, with a stable key/generation for retries of that
163
+ snapshot. Receipt recovery and
164
+ acknowledgment never edit project bytes.
165
+
166
+ ## Host attachment and delivery
167
+
168
+ Before attaching, the writer compares root, state directory, fingerprint,
169
+ reviewer, callback IDs, schemas and installed enumerator version with the
170
+ frozen private binding. A mismatch produces a pending receipt containing the
171
+ differing field and both values. The writer loads Review's public
172
+ `startJobHost` facade and publishes through its in-process `ports.handleJobApi`
173
+ with bootstrap agent authority held only in memory.
174
+
175
+ `job open` stores the bound listener's `listenerIncarnation` in the private
176
+ binding when Review returns an attested `attachment`. A `null` attachment from
177
+ ordinary reuse means "not strictly attached": it is not an error and nothing
178
+ is reinstalled. Every later attach is Review's strict reuse-only POST, with
179
+ `reuseOnly.expected.{jobId, origin, listenerIncarnation, binding}` taken from
180
+ the locked binding, so Review never starts a replacement listener for a
181
+ reconcile. A refused attach keeps Review's `reason` and `phase` in a
182
+ `JOB_HOST_ATTACH_REFUSED` pending receipt, including `incarnation-missing` for
183
+ a host that predates the token. A field-level mismatch keeps its `field`,
184
+ `expected` and `actual` values in `JOB_HOST_REUSE_MISMATCH`. A reuse-only
185
+ attach never writes the binding.
186
+
187
+ Cross-process subscription delivery uses a **30-second server wait cycle**.
188
+ Scheduling, transport and rendering add elapsed time. Review 2.8.0 defines
189
+ `jobWaitLimitMs = 30_000` in `src/job-api.ts` and reads durable events
190
+ after the timer in `src/job-session.ts`. The window's previous/new label
191
+ notice is implemented in `web/job-session.ts`.
192
+
193
+ Review 2.8.0 carries answered scene-context choices and historical reader
194
+ diagnostics in `publication.interview` (`rig-review/job-interview@1`), and
195
+ refuses invalid or stale editable `pending_options` sets with
196
+ `JOB_RECORD_INCOMPLETE` before this reader runs.
197
+
198
+ ## Finalized verdict ingestion
199
+
200
+ ```sh
201
+ rig-create review <version> <project> --from-review <actId> --json
202
+ ```
203
+
204
+ The synchronous writer uses its private #184 binding to fetch the finalized act
205
+ from the exact loopback job API. Its subprocess receives no Review state path or
206
+ host callbacks. It opens no host and carries no producer storage file. The grant
207
+ travels in Authorization, and the private process transport uses stdin/stdout.
208
+ Human-value and feedback flags are exclusive with `--from-review`.
209
+
210
+ The shared reader checks `rig-review/job-api@2` for semantic API responses,
211
+ `rig-review/act@2` for historical acts and `rig-review/act@3` for rig stills, and the
212
+ act's Parts enumerator version against `>=2.25.0 <4.0.0`. API@1 and act@1 are
213
+ refused without migration. Rig/post `review-verdict` and draft `parts-verdict` use their respective writers.
214
+ Interview picks use `interview-answer --from-review`. A passed `checkpoint` act is recorded by
215
+ `signoff <stage> --checkpoint <id> --from-review <actId>`: the act's `planStepId` must be `<id>`, an
216
+ enabled checkpoint `--checkpoint` accepts in that stage, and its displayed plan must be the current
217
+ one. The sign-off takes `by`, `at` and the words from the act and names it in `source`; a `fail`
218
+ outcome is refused (`REVIEW_ACT_CHECKPOINT_FAILED`) and writes nothing. A `signoff` act is recorded by
219
+ `signoff <stage> --from-review <actId>` (PROJECT.md § Recording a sign-off). Which publications
220
+ carry these two subjects is below, in Live sign-off routes. Image-review has no create version writer mapping. Described
221
+ correction and mesh-edit retain Review's reserved status.
222
+
223
+ `approved`, `changes-requested` and `pending` map to the existing verdict
224
+ vocabulary `accepted`, `bounced` and `provisional`. Host-attested owner maps to
225
+ `by: user`, and delegate maps to `by: delegate`. The complete reviewer identity,
226
+ authority, original words, time and source remain in the immutable act receipt.
227
+ Verdict ingestion records its verdict and bound still. Signoff and stage advance require their own
228
+ separate writer invocations.
229
+
230
+ ### Source checks and replay
231
+
232
+ The #184 job/write lock spans fetch, validation and commit. Every first ingest
233
+ and replay checks the explicit selector, retained model, direction, package,
234
+ plan step identities, Parts manifest and declared image hashes against current
235
+ files. Create never reconstructs Review's composite `sourceHash` or producer
236
+ measurements. `source.projectHash` remains exact publication provenance inside
237
+ the retained act. Later unrelated signoffs can change project.json without
238
+ invalidating a displayed version.
239
+
240
+ A successful publish now retains an owner-only acknowledged receipt beside the
241
+ outbox in `.rig-create-review/acknowledged-publications/`. It records the job,
242
+ publication ID, generation, request ID, selector and #184 `publicationVersionHash`
243
+ before the outbox entry is removed. `JobAct.publicationId` links first ingest to
244
+ that receipt. A changed version entry refuses `REVIEW_ACT_SOURCE_STALE`. When
245
+ private receipts are absent, including after a clone, ingest emits
246
+ `REVIEW_ACT_VERSION_UNVERIFIED` and still checks every explicit source binding.
247
+ The JSON command result carries `warnings[]`, and the text result prints the
248
+ named warning. This warning describes the skipped first-ingest version-entry
249
+ comparison. It grants no exemption from the explicit source checks.
250
+
251
+ The versioned record's `review_acts[]` stores `rig-create/review-act@1` receipts
252
+ keyed by `(jobId, actId)`. Review verdicts retain the exact raw export bytes as
253
+ `bytes`, their SHA-256, the version and verdict index, the pre-append
254
+ version-entry hash and the exact still entries added by ingestion. Historical
255
+ semantic-API receipts keep their original encoding. No act has a self-hash.
256
+
257
+ For rig act@3, `review --from-review <actId>` fetches raw act bytes and the
258
+ PNG through the live job API with the consumer grant.
259
+ The writer verifies the PNG hash, retains both files under `evidence/v<N>/`,
260
+ and records the displayed still first in `evidence[]`. Numeric frames name
261
+ the animation in `what`. Create never renders or reconstructs these pixels.
262
+ A missing or mismatched PNG refuses `REVIEW_ACT_STILL_INVALID` before writing.
263
+ The result and receipt are validated with the checker, fsynced and atomically
264
+ replaced together. Refusal preserves project.json bytes. `check` validates the
265
+ receipt hash, immutable act and linked verdict, including words and authority.
266
+ Historical receipts are checked against retained evidence, independently of
267
+ whether their sources are still current.
268
+
269
+ An unchanged replay reports the existing verdict without rewriting the record.
270
+ Replay discounts verdicts and exact still entries appended by ingestion after
271
+ its recorded verdict index when comparing the pre-append version-entry hash. Other original version fields and
272
+ prior verdicts remain covered. Source changes refuse `REVIEW_ACT_SOURCE_STALE`
273
+ with the recorded verdict untouched. This implements create#182's C4 ruling
274
+ against the installed dedupe-first order in Review 2.8.0 `src/job-contract.ts`. C4's source-check requirement is recorded in create#182's
275
+ “C4 act-side checks” ruling and review#501. [Create ruling](https://github.com/rig-c/create/issues/182), [Review C4](https://github.com/rig-c/review/issues/501).
276
+
277
+ ### Isolation evidence and legacy inputs
278
+
279
+ The path test starts the host with relocated state, excludes its actual state
280
+ path from the writer binding, and guards filesystem calls in the writer and
281
+ fetch subprocess against that state path. It exercises the producer-bound
282
+ chain checkpoint's rig verdict over the loopback API. Separate-UID filesystem
283
+ unreadability is not measurable in this local test environment. The guarded
284
+ path test establishes the accepted consumer access boundary.
285
+
286
+ `--picks-file`, `--verbatim-file`, parts `--evidence`, and reshaped feedback JSON
287
+ remain available for legacy/history workflows. The current semantic verdict
288
+ path uses `--from-review` and preserves the fetched act directly.
289
+
290
+ ## Live sign-off routes
291
+
292
+ Every draft or rig package publication also declares the `signoff` and `checkpoint` subjects
293
+ that its record can sign, in the stage the check reads that record in (its
294
+ effective stage). The rules are in `src/signable.ts`:
295
+
296
+ - A `checkpoint` subject is declared for each plan step whose checkpoint
297
+ `signoff <stage> --checkpoint <id>` accepts in that stage. The step runs in
298
+ the stage and its checkpoint is enabled. `signoff` uses the same function.
299
+ - A `signoff` subject is declared for the stage itself while it closes on a
300
+ sign-off and has no live stage-level signature. `rig-review` is declared only
301
+ on a `rig` publication, because the act's selector is the signature's target.
302
+ Post publications carry only the direction verdict; direction sign-off uses
303
+ the separate source-linked record page described above. A plan-bound stage
304
+ (`plan-approved`, `rigging-interview`, `post-interview`) also needs displayed
305
+ plan steps.
306
+
307
+ Review 2.8.0 asks only for a declared subject and refuses any other with
308
+ `JOB_ASK_INVALID` (`bindJobAsk`, `src/job-act.ts`). Both the ask and the act
309
+ also require `project.json` to still hold the published bytes
310
+ (`assertJobSourceCurrent`, `src/job-source.ts`). So either the owner submits
311
+ both the verdict and `signoff` acts for parts or rig review in the Review UI before any writer mutates
312
+ `project.json`, or after a CLI writer (`parts-review --from-review`,
313
+ `diff-classes`, or `review <n> --from-review`) updates `project.json`, the
314
+ agent runs `rig-create job open` to republish the current selector (`draft`,
315
+ or `rig`) over the updated `project.json` bytes and re-ask the stage's
316
+ declared subjects before the owner signs off in the UI.
317
+
318
+ `job reconcile` keeps the declared subjects in the acknowledged receipt.
319
+ `signoff … --from-review` compares the act's subject with that list and
320
+ refuses one the publication did not declare (`REVIEW_ACT_SUBJECT_UNDECLARED`).
321
+ create asks only declared subjects, but an act can also answer an ask sent by
322
+ another holder of the agent authority, so the check stays. A receipt without
323
+ the list, or no receipt at all (a clone), leaves only Review's ask binding.
324
+
325
+ ### Asks
326
+
327
+ Every publication create acknowledges is followed, in the same process, by an
328
+ ask for each subject it declares. That covers `draft-rig`, `rig-version`,
329
+ `direction write|patch`, `advance rig-review|direction-review`, `job reconcile`
330
+ and `job open`. The process already
331
+ holds Review's agent authority in memory for the publish, so the ask needs no
332
+ other transport. The authority never enters argv, the environment or a project
333
+ file, and agents never handle it. A subject already asked on that publication,
334
+ pending or answered, is not asked again (create reads the job's own `pending`
335
+ events), so a retry or re-open shows no second control. A new publication
336
+ supersedes the previous one's pending asks, as Review defines.
337
+
338
+ An ask Review refuses never makes the acknowledged publication pending again.
339
+ `job open` and `job reconcile` name it `JOB_ASK_REFUSED`, with each subject and
340
+ Review's code. A writer's own publish step reports only publication failures,
341
+ so after a writer run whose page lacks a control, run `job open` to ask
342
+ again.
343
+
344
+ | Sign-off | Carried by | When |
345
+ | --- | --- | --- |
346
+ | `parts` checkpoints | draft | `draft-rig` commits while the record is in `parts` and the checkpoint is enabled |
347
+ | `rigging` checkpoints | rig version | `rig-version` commits in `rigging` |
348
+ | `post` checkpoints | record plan | `job open --plan` in `post` when the checkpoint is enabled and at-checkpoint |
349
+ | `parts-review` | draft | `draft-rig` commits in `parts-review`, or the agent runs `job open` to refresh the draft after `parts-review --from-review` / `diff-classes` |
350
+ | `rig-review` | rig version | `advance rig-review` commits the move into `rig-review`, `rig-version` commits in `rig-review`, or the agent runs `job open` to refresh the live `rig` head after `review <n> --from-review` |
351
+ | `direction-review` | record plan, using release-pinned Review 4.0.2 | `job open --plan` after the current post's accepted live verdict is ingested; ingest the real signature, then `advance accepted` |
352
+ | `plan-approved`, `rigging-interview`, `post-interview` | record plan | `job open --plan` in the approval stage |
353
+ | `interview` | record plan, using release-pinned Review 4.0.2 with the interview carrier ([Review #803](https://github.com/rig-c/review/pull/803), issue #800) | `job open --plan` after `interview --check` passes and the displayed plan has steps; ingest `signoff interview --from-review <actId>`, then `advance plan-approved` |
354
+
355
+ Interview picks use `job open --question <id>`. After ingesting every pick,
356
+ run `interview --check`, then `job open --plan` for the interview signature.
357
+ This record route is supported by release-pinned
358
+ [Review 4.0.2](https://github.com/rig-c/review/tree/v4.0.2), including the
359
+ [Review #803](https://github.com/rig-c/review/pull/803) carrier (issue #800).
360
+ The record subject is `plan`, with non-empty
361
+ displayed steps, even though the signature approves the interview answers
362
+ and does not approve or fill the plan's checkpoints. After advancing,
363
+ `next` offers the separate `plan-approved` signature.
364
+
365
+ Publication and first ingest use the same full `checkProject` function as
366
+ `interview --check`. An unclean record refuses `INTERVIEW_SIGNOFF_NOT_CLEAN`;
367
+ an empty displayed plan refuses `INTERVIEW_SIGNOFF_PLAN_REQUIRED`.
368
+ First ingest also checks the act's record hash, displayed plan identities
369
+ and current interview stage. Refusals leave `project.json` byte-identical.
370
+ Immutable replay returns the recorded signature before current-stage checks.
371
+ The CLI `--by` route and earlier package-mode acts retain their behavior.
372
+
373
+ ## Parts drafts and independent verdicts
374
+
375
+ ```sh
376
+ rig-create draft-rig <id> <project> --config <config> --from <output> --parts <parts>
377
+ rig-create parts-review <project> --from-review <actId> --json
378
+ ```
379
+
380
+ Bound draft registration holds the #184 shared lock through intent, atomic
381
+ record commit and publication acknowledgment. Its durable identity is the exact
382
+ `drafts[id]` entry, hashed by `publicationVersionHash` with the existing
383
+ serialization. A rebuild receives a new draft ID. Failed publication retains
384
+ its original intent and retries through `job reconcile`. Unbound registration
385
+ continues to record the existing draft inventory.
386
+
387
+ The writer publishes `review-draft-<id>.json` with a labelled draft title, an
388
+ entry-hash revision, the recorded compiled model when available, declared image
389
+ references, and read-only rig/motion/mesh-report artifacts. Standalone output
390
+ without a compiled model uses Review's optional-model manifest form. The host
391
+ reader supplies the draft selector and `parts-verdict` subject, part IDs and the
392
+ exact C4 Parts enumeration over the recorded draft input. Config, config inputs
393
+ and retained outputs are sealed as publication files. Producer bytes are read
394
+ and hash-bound. Publication performs no build or producer measurement.
395
+
396
+ `parts-review` uses the shared API@2/act@2 reader and writer-owned fetch grant.
397
+ It records all three verdict values and each part/mesh outcome and note exactly.
398
+ The human words, host-attested reviewer, authority, time and original source
399
+ remain inside the complete act. The JSON result reports the role mapping and
400
+ its explicit evidence path. It appends a `kind: parts-verdict` receipt in
401
+ `review_acts[]`, with draft ID, the pinned draft-entry hash and evidence identity.
402
+ The evidence file under `evidence/review-acts/` is the same immutable act encoding
403
+ and SHA-256 as the ledger bytes.
404
+
405
+ The semantic evidence branch reads act@2 directly. The legacy
406
+ `rig-review-parts-verdict/1` and `/2` approval, source, draft-match, structure and
407
+ difference gates continue through their existing branches. A semantic approval
408
+ must cover the selected draft's manifest and part membership. Its published
409
+ config, config inputs and mesh/output identities remain bound to that draft,
410
+ with all C4 image hashes checked. These retain the parts/draft and mesh-output
411
+ binding obligations of create#236 and #245. The semantic form carries its actual
412
+ C4 inventory and draft receipt, without synthesizing a legacy `source.files`
413
+ report or interpreting mesh geometry.
414
+
415
+ Use the returned evidence explicitly in the separate writers.
416
+
417
+ ```sh
418
+ rig-create structure-snapshot <project> --draft <id> --verdict <returned-path> --out evidence/structure.json
419
+ rig-create signoff parts-review <project> --draft <id> --evidence <returned-path> --structure-file evidence/structure.json --diff-report <report> --by <human> --verbatim-file <words>
420
+ ```
421
+
422
+ The existing difference component options still apply to the report. A pending
423
+ or changes-requested act can be retained, while the separate approval writer
424
+ refuses it with `PARTS_VERDICT_NOT_APPROVED`. Recording evidence leaves signoff
425
+ and stage progression to those explicit writes.
426
+
427
+ At check, structure-snapshot and signoff, retained parts approval checks its draft
428
+ bindings independently of later plan changes, including checkpoint decisions.
429
+ The full plan comparison still applies at ingest and replay. Draft publications
430
+ declare no direction document, so their acts have `source.direction: null`.
431
+
432
+ Every ingest and replay checks the draft selection, Parts manifest/images,
433
+ config and config inputs, retained outputs, package revision and any declared
434
+ model/plan/direction identities before deduplication. Package revision is the
435
+ create-owned draft-entry hash. A changed config, part or draft entry refuses
436
+ `REVIEW_ACT_SOURCE_STALE`. `sourceHash` remains producer provenance, and
437
+ `projectHash` stays publication provenance across unrelated record writes.
438
+ First ingest also joins `publicationId` to the private acknowledged receipt.
439
+ An absent receipt emits `REVIEW_ACT_VERSION_UNVERIFIED` while the explicit
440
+ bindings remain enforced and the current draft-entry hash is pinned.
441
+
442
+ Evidence is exclusively created, fsynced with its directory, and then linked by
443
+ an atomic project commit. If a process dies between staging and record commit,
444
+ an identical retry reuses the staged file and commits once. Different bytes at
445
+ the deterministic `(jobId, actId)` path refuse
446
+ `PARTS_REVIEW_EVIDENCE_CONFLICT`. A failed invocation removes only evidence it
447
+ created and has not committed. Existing evidence is preserved.
448
+
449
+ ## Sealed checkpoint attachments
450
+
451
+ The agent attaches a producer's ordered presentation through the writer.
452
+
453
+ ```sh
454
+ rig-create checkpoint-table --file evidence/classification.json --rows pairFrames --out evidence/checkpoint-table.json
455
+ rig-create checkpoint-evidence --file evidence/checkpoint-packets.json
456
+ ```
457
+
458
+ `checkpoint-table` converts every object in the selected top-level array into
459
+ one row, preserving input order and all columns. Columns follow the first row's
460
+ key order. Every later row must have the same keys. Nested objects and arrays
461
+ become JSON text cells. Scalars retain their values. The command validates the
462
+ complete signed table grammar and size before writing, preserves the producer
463
+ source, and refuses to overwrite different output bytes.
464
+
465
+ `checkpoint-evidence` takes a JSON array of `rig-review-checkpoint-evidence/1`
466
+ packets. Each packet declares `checkpointId`, `planStepId`, ordered
467
+ `tiles[{id,label,path,sha256}]`, `table{path,sha256,label?}`, `routesText` and
468
+ `recommendationText`. Paths are literal project-relative asset paths. The table's
469
+ raw UTF-8 JSON has exactly `schema`, `columns` and `rows`, with schema
470
+ `rig-review-checkpoint-table/1`. Labels, all ordered rows, routes and recommendation
471
+ text remain verbatim. The declaration contains the table seal and optional label.
472
+
473
+ The writer stores the canonical ordered packets in `plan.checkpoint_evidence`.
474
+ Each checkpoint ID equals its existing plan step ID. It validates the candidate
475
+ with the ordinary check, verifies raw asset seals and table grammar, and commits
476
+ atomically under the attachment lock and any bound job write freeze. Refused writes
477
+ preserve `project.json` bytes. An identical retry writes nothing. The writer adds
478
+ presentation evidence without changing plan approval fields or stage authority.
479
+
480
+ `checkpoint-evidence --clear` removes the optional `plan.checkpoint_evidence`
481
+ field entirely, allowing its plan steps to be edited or removed through the plan
482
+ writer. Choose one of `--file` and `--clear`. Clear uses the same locks, candidate
483
+ check and atomic commit. Its JSON result is `null`. Repeating clear on an absent
484
+ field writes nothing.
485
+
486
+ The trusted record-plan and package readers include `checkpointEvidence` only
487
+ for checkpoint subjects they actually declare. Every supplied asset enters the
488
+ trusted closure with its exact path and raw SHA-256. Record option sets omit this
489
+ extension. Historical absence emits no evidence field. Review's signed extension
490
+ owns full PNG decoding, source/instance hashing, retained delivery and EN/KO owner
491
+ presentation. Runtime publication requires that extension in the served Review.
492
+
493
+ For Create's parts-bound package publications, Review metadata currently requires
494
+ a PNG original painting. An SVG source reaches the PNG-only Parts view loader
495
+ and refuses with `JOB_SOURCE_MISMATCH` from `PARTS_PAINTING_PNG` before projecting
496
+ checkpoint evidence. The PNG-positive and SVG-refusal regression cases cover
497
+ this boundary. [Review #636](https://github.com/rig-c/review/issues/636)
498
+
499
+ The adjacent owner routes use pass for (i), accepting the openings, and fail with
500
+ the person's verbatim words for (ii) or (iii). The browser sends
501
+ `{checkpointId,outcome,words}` and Review supplies `planStepId`. The separate
502
+ `signoff <stage> --checkpoint <id> --from-review <actId>` writer consumes passed
503
+ package `act@2` or record `act@4` checkpoints. Failed acts refuse sign-off. A
504
+ changed checkpoint packet makes first ingest stale. The immutable passed receipt
505
+ keeps its existing replay behavior. The recommendation remains labelled producer
506
+ text and grants no approval authority.
507
+
508
+
509
+ ### Withdrawn checkpoint subjects
510
+
511
+ After `plan checkpoint-withdraw`, the next normal publication omits the matching
512
+ withdrawn checkpoint subject and its checkpoint presentation. Other checkpoint
513
+ and signoff subjects retain their existing selection rules. The withdrawal
514
+ writer does not refresh an existing publication or alter packet records/assets.
515
+
516
+
517
+ ### Execution-bar policy journal
518
+
519
+ `plan bar-amend <id> --by <operator> --reason-file <file> --quote-file <file>
520
+ --bar-file <file>` records an explicitly authorized operator policy with its
521
+ exact quoted words. It creates no Review act or signature, changes no original
522
+ step approval hash and adds no Review panel, subject or gate. This narrow policy
523
+ operation does not replace the Review path for any other human decision.
524
+ The bound journal and effective-bar rules are in PROJECT.md, "Operator amendment
525
+ of an execution bar". Existing publications are not refreshed by this writer.
package/docs/PROJECT.md CHANGED
@@ -2515,6 +2515,16 @@ the project's next moves and whose they are from `project.json`:
2515
2515
  - `producer`: a command of a pinned package (`rig-parts`, `rigc`).
2516
2516
  - `human`: a person's act collected through the review tool (`review_act`),
2517
2517
  with `command: null` and never a `--by user` writer.
2518
+ - **Host and ingest human acts.** For a recorded Review subject, the human
2519
+ move is surrounded by `job open` with its question, plan, draft or rig
2520
+ selector, `job acts --json`, the writer with `--from-review '<actId>'`, and
2521
+ `job close`. `job open` hosts and blocks until `job close`; keep it running
2522
+ in a separate terminal. Fill the reviewer and exported act placeholders,
2523
+ and follow the matching `job acts` preconditions before ingestion, including
2524
+ its structure snapshot guidance for parts-review sign-off. Moves marked
2525
+ `unanswered_by_record` retain their missing-field guidance.
2526
+ - **Scene writing does not plan work.** `scene write` adds no plan step.
2527
+ Author the post plan steps through `plan add` before post-interview sign-off.
2518
2528
  - **Refusals come first.** When `check` reports refusals (or publication holes),
2519
2529
  `next` lists each in `refusals[]` with its `CHECKS.md` remedy (`fix`) before
2520
2530
  any forward move. A project with a blocking refusal has `moves: []` and
package/package.json CHANGED
@@ -1,17 +1,20 @@
1
1
  {
2
2
  "name": "rig-create",
3
- "version": "1.0.1",
3
+ "version": "1.0.4",
4
4
  "type": "module",
5
5
  "description": "Create a rig project: its folder, decision record, repository and pinned rig-c packages",
6
6
  "license": "MIT",
7
7
  "files": [
8
8
  "src/",
9
+ "scripts/verify-example-seals.ts",
10
+ "scripts/npm-json.ts",
9
11
  "templates/",
10
12
  "README.md",
11
13
  "LICENSE",
12
14
  "docs/PROJECT.md",
13
15
  "docs/INTERVIEW.md",
14
16
  "docs/CHECKS.md",
17
+ "docs/LIVE-REVIEW.md",
15
18
  "docs/COLLECTIONS.md",
16
19
  "docs/CRAFT.md",
17
20
  "docs/SOURCE.md",
@@ -28,7 +31,7 @@
28
31
  "dependencies": {
29
32
  "@rig-c/core": "3.7.0",
30
33
  "@rig-c/parts": "2.37.0",
31
- "@rig-c/review": "4.0.0"
34
+ "@rig-c/review": "4.0.2"
32
35
  },
33
36
  "devDependencies": {
34
37
  "@types/bun": "^1.3.0",
@@ -0,0 +1,74 @@
1
+ /** npm 11 and 12 have different pack and view JSON envelopes. */
2
+ import { readFileSync } from 'node:fs';
3
+
4
+ export interface NpmPack {
5
+ filename: string;
6
+ entryCount: number;
7
+ size: number;
8
+ unpackedSize: number;
9
+ }
10
+
11
+ function object(value: unknown): value is Record<string, unknown> {
12
+ return typeof value === 'object' && value !== null && !Array.isArray(value);
13
+ }
14
+
15
+ function shape(value: unknown): string {
16
+ if (Array.isArray(value)) return `array(length=${value.length}) ${JSON.stringify(value).slice(0, 200)}`;
17
+ if (object(value)) return `object(keys=${JSON.stringify(Object.keys(value))})`;
18
+ return `${value === null ? 'null' : typeof value} ${JSON.stringify(value)}`;
19
+ }
20
+
21
+ export function readNpmJson(text: string, command: string, kind: 'pack', expected: string): NpmPack;
22
+ export function readNpmJson(text: string, command: string, kind: 'version', expected: string): string;
23
+ export function readNpmJson(text: string, command: string, kind: 'e404'): string;
24
+ export function readNpmJson(text: string, command: string, kind: 'pack' | 'version' | 'e404', expected?: string): NpmPack | string {
25
+ const fail = (field: string, want: string, actual: unknown): never => {
26
+ throw Error(`${command}: ${field}: expected ${want}; actual ${shape(actual)}`);
27
+ };
28
+ const envelope = kind === 'pack' ? `one-element array or object keyed only by ${JSON.stringify(expected)}`
29
+ : kind === 'version' ? 'version string or one-element array of that string' : 'object with error.code "E404"';
30
+ let value: unknown;
31
+ try { value = JSON.parse(text); }
32
+ catch { throw Error(`${command}: stdout: expected valid JSON (${envelope}); actual invalid JSON ${JSON.stringify(text.slice(0, 200))}`); }
33
+
34
+ if (kind === 'pack') {
35
+ let entry: unknown;
36
+ if (Array.isArray(value) && value.length === 1) entry = value[0];
37
+ else if (object(value) && Object.keys(value).length === 1 && Object.hasOwn(value, expected!)) entry = value[expected!];
38
+ else return fail('stdout', envelope, value);
39
+ if (!object(entry)) return fail('pack entry', 'object', entry);
40
+ if (entry.name !== expected) return fail('name', JSON.stringify(expected), entry.name);
41
+ if (typeof entry.filename !== 'string' || !/^[a-zA-Z0-9][a-zA-Z0-9._-]*\.tgz$/.test(entry.filename)) {
42
+ return fail('filename', 'a .tgz basename without directory components', entry.filename);
43
+ }
44
+ for (const field of ['entryCount', 'size', 'unpackedSize'] as const) {
45
+ if (typeof entry[field] !== 'number' || !Number.isSafeInteger(entry[field]) || entry[field] < 0) {
46
+ return fail(field, 'a nonnegative safe integer', entry[field]);
47
+ }
48
+ }
49
+ return { filename: entry.filename, entryCount: entry.entryCount as number, size: entry.size as number, unpackedSize: entry.unpackedSize as number };
50
+ }
51
+ if (kind === 'version') {
52
+ const version = Array.isArray(value) && value.length === 1 ? value[0] : value;
53
+ if (typeof version !== 'string' || version !== expected) return fail('version', `${envelope} equal to ${JSON.stringify(expected)}`, value);
54
+ return version;
55
+ }
56
+ if (!object(value) || !object(value.error) || value.error.code !== 'E404') return fail('error.code', '"E404" in an error object', object(value) && object(value.error) ? value.error.code : value);
57
+ return 'E404';
58
+ }
59
+
60
+ if (import.meta.main) {
61
+ try {
62
+ const [kind, file, spec, version, ...extra] = process.argv.slice(2);
63
+ if (!file || !spec || extra.length || (kind !== 'version' && kind !== 'e404') || (kind === 'version' ? !version : version !== undefined)) {
64
+ throw Error('usage: bun scripts/npm-json.ts version <json-file> <package@version> <version> | e404 <json-file> <package@version>');
65
+ }
66
+ const text = readFileSync(file, 'utf8');
67
+ const command = `npm view ${spec} version --json`;
68
+ if (kind === 'version') readNpmJson(text, command, kind, version!);
69
+ else readNpmJson(text, command, kind);
70
+ } catch (error) {
71
+ console.error(error instanceof Error ? error.message : String(error));
72
+ process.exitCode = 1;
73
+ }
74
+ }