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,148 @@
1
+ /** Verify installed example seals, or pack a temporary copy without nested ignore losses. */
2
+ import { createHash } from 'node:crypto';
3
+ import { cpSync, existsSync, mkdirSync, mkdtempSync, readFileSync, readdirSync, rmSync, unlinkSync, writeFileSync } from 'node:fs';
4
+ import { tmpdir } from 'node:os';
5
+ import { dirname, isAbsolute, join, relative, resolve, sep } from 'node:path';
6
+ import { spawnSync } from 'node:child_process';
7
+ import { readNpmJson } from './npm-json.ts';
8
+
9
+ const packageRoot = resolve(import.meta.dir, '..');
10
+ const hash = (path: string): string => createHash('sha256').update(readFileSync(path)).digest('hex');
11
+
12
+ function within(root: string, path: string): string {
13
+ const target = resolve(root, path);
14
+ const rel = relative(root, target);
15
+ if (!rel || rel === '..' || rel.startsWith(`..${sep}`) || isAbsolute(rel)) throw Error(`invalid example path: ${path}`);
16
+ return target;
17
+ }
18
+
19
+ function files(root: string): string[] {
20
+ return readdirSync(root, { withFileTypes: true }).flatMap(entry => {
21
+ const path = join(root, entry.name);
22
+ if (entry.isDirectory()) return files(path);
23
+ if (!entry.isFile()) throw Error(`expected a regular example file: ${path}`);
24
+ return [path];
25
+ }).sort();
26
+ }
27
+
28
+ export function verifyExampleSeals(root: string): { ok: number; failures: string[]; sealedFiles: string[] } {
29
+ const chainRoot = join(root, 'templates/example-chain');
30
+ const index = JSON.parse(readFileSync(join(chainRoot, 'chain.json'), 'utf8')) as { checkpoints: { name: string }[] };
31
+ if (!Array.isArray(index.checkpoints) || index.checkpoints.length === 0) throw Error('example-chain/chain.json: no checkpoints to verify');
32
+ let ok = 0;
33
+ const failures: string[] = [];
34
+ const sealedFiles: string[] = [];
35
+ for (const { name } of index.checkpoints) {
36
+ const declaration = within(join(chainRoot, 'checkpoints'), `${name}.json`);
37
+ if (!existsSync(declaration)) { failures.push(`missing checkpoint declaration: ${relative(root, declaration)}`); continue; }
38
+ const seal = JSON.parse(readFileSync(declaration, 'utf8')) as {
39
+ schema: string; name: string; files: { path: string; sha256: string }[]; project_sha256: string;
40
+ };
41
+ if (seal.schema !== 'rig-create/example-checkpoint@1' || seal.name !== name || !Array.isArray(seal.files) || seal.files.length === 0) {
42
+ throw Error(`${relative(root, declaration)}: invalid checkpoint seal`);
43
+ }
44
+ const checkpoint = within(join(chainRoot, 'checkpoints'), name);
45
+ for (const entry of [...seal.files, { path: 'project.json', sha256: seal.project_sha256 }]) {
46
+ const path = within(checkpoint, entry.path);
47
+ const label = relative(root, path);
48
+ sealedFiles.push(path);
49
+ if (!existsSync(path)) failures.push(`missing sealed file: ${label}`);
50
+ else if (!/^[a-f0-9]{64}$/.test(entry.sha256) || hash(path) !== entry.sha256) failures.push(`sha256 mismatch: ${label}`);
51
+ else ok++;
52
+ }
53
+ }
54
+ return { ok, failures, sealedFiles };
55
+ }
56
+
57
+ function report(root: string, log: (line: string) => void): ReturnType<typeof verifyExampleSeals> {
58
+ const result = verifyExampleSeals(root);
59
+ for (const failure of result.failures) log(failure);
60
+ log(`checkpoint seals: ${result.ok} ok / ${result.failures.length} fail (files[] plus project_sha256)`);
61
+ if (result.failures.length) throw Error('example seals failed; repack the unmodified source with scripts/verify-example-seals.ts --pack <output-dir>');
62
+ return result;
63
+ }
64
+
65
+ function run(command: string, args: string[], cwd?: string): string {
66
+ const result = spawnSync(command, args, { cwd, encoding: 'utf8', timeout: 60_000, killSignal: 'SIGKILL', maxBuffer: 16 * 1024 * 1024 });
67
+ if (result.error || result.status !== 0) throw Error(`${command} ${args.join(' ')} failed: ${result.error?.message ?? result.status}\n${result.stderr}`);
68
+ return result.stdout;
69
+ }
70
+
71
+ /** Only the disposable copy gets .npmignore; every original example byte is retained. */
72
+ function stage(root: string, destination: string): void {
73
+ const manifest = JSON.parse(readFileSync(join(root, 'package.json'), 'utf8')) as { files: string[] };
74
+ mkdirSync(destination);
75
+ cpSync(join(root, 'package.json'), join(destination, 'package.json'));
76
+ for (const path of manifest.files) {
77
+ const target = within(destination, path);
78
+ mkdirSync(dirname(target), { recursive: true });
79
+ cpSync(within(root, path), target, { recursive: true });
80
+ }
81
+ for (const path of files(join(destination, 'templates')).filter(path => path.endsWith(`${sep}.gitignore`))) {
82
+ const npmignore = join(dirname(path), '.npmignore');
83
+ if (existsSync(npmignore)) throw Error(`pack staging would overwrite ${npmignore}`);
84
+ writeFileSync(npmignore, '!**\n');
85
+ }
86
+ }
87
+
88
+ export function verifyTarball(tarball: string, sourceRoot?: string): void {
89
+ const scratch = mkdtempSync(join(tmpdir(), 'create-example-seals-'));
90
+ try {
91
+ run('tar', ['-xzf', resolve(tarball), '-C', scratch]);
92
+ const root = join(scratch, 'package');
93
+ const verified = report(root, console.error);
94
+ if (sourceRoot) {
95
+ const source = join(sourceRoot, 'templates');
96
+ const originals = files(source);
97
+ for (const path of originals) {
98
+ const target = join(root, 'templates', relative(source, path));
99
+ if (!existsSync(target) || hash(target) !== hash(path)) throw Error(`packed template missing or changed: templates/${relative(source, path)}`);
100
+ }
101
+ console.error(`template byte parity: ${originals.length} files match source`);
102
+ }
103
+ // Negative control operates only on the extracted tree, after the positive gate.
104
+ const deleted = verified.sealedFiles.find(path => path.endsWith(`${sep}.gitignore`))!;
105
+ unlinkSync(deleted);
106
+ const planted = verifyExampleSeals(root);
107
+ const expected = `missing sealed file: ${relative(root, deleted)}`;
108
+ if (planted.failures.length !== 1 || planted.failures[0] !== expected || planted.ok !== verified.ok - 1) {
109
+ throw Error(`planted deletion was not detected: ${expected}`);
110
+ }
111
+ console.error(`planted deletion detected: ${expected} (${planted.ok} ok / 1 fail)`);
112
+ } finally { rmSync(scratch, { recursive: true, force: true }); }
113
+ }
114
+
115
+ export function packExamples(output: string, stageOutput?: string): string {
116
+ const scratch = mkdtempSync(join(tmpdir(), 'create-example-pack-'));
117
+ try {
118
+ const destination = resolve(output);
119
+ mkdirSync(destination, { recursive: true });
120
+ const staged = stageOutput === undefined ? join(scratch, 'source') : resolve(stageOutput);
121
+ stage(packageRoot, staged);
122
+ const name = (JSON.parse(readFileSync(join(staged, 'package.json'), 'utf8')) as { name: string }).name;
123
+ const args = ['pack', '.', '--json', '--pack-destination', destination];
124
+ const packed = readNpmJson(run('npm', args, staged), `npm ${args.join(' ')}`, 'pack', name);
125
+ const tarball = join(destination, packed.filename);
126
+ console.error(`npm pack: ${packed.entryCount} files / ${packed.size} bytes compressed / ${packed.unpackedSize} bytes unpacked`);
127
+ verifyTarball(tarball, packageRoot);
128
+ return tarball;
129
+ } finally { rmSync(scratch, { recursive: true, force: true }); }
130
+ }
131
+
132
+ if (import.meta.main) {
133
+ try {
134
+ const [mode, path, ...extra] = process.argv.slice(2);
135
+ if (mode === undefined) report(packageRoot, console.log);
136
+ else if (path && extra.length === 0 && mode === '--pack') console.log(packExamples(path));
137
+ else if (path && extra.length === 0 && mode === '--tarball') verifyTarball(path);
138
+ else if (path && extra.length === 0 && mode === '--stage') {
139
+ const scratch = mkdtempSync(join(tmpdir(), 'create-example-stage-gate-'));
140
+ try { packExamples(scratch, path); console.log(resolve(path)); }
141
+ finally { rmSync(scratch, { recursive: true, force: true }); }
142
+ }
143
+ else throw Error('usage: bun scripts/verify-example-seals.ts [--pack <output-dir> | --tarball <file.tgz> | --stage <fresh-dir>]');
144
+ } catch (error) {
145
+ console.error(error instanceof Error ? error.message : String(error));
146
+ process.exitCode = 1;
147
+ }
148
+ }
@@ -53,7 +53,7 @@ export const PACKAGE_DOCS: readonly PackageDoc[] = [
53
53
  {
54
54
  package: '@rig-c/parts',
55
55
  path: 'docs/DEPTH.md',
56
- why: 'when the plan has a head turn driven by depth',
56
+ why: 'depth reference; unavailable in current direction',
57
57
  },
58
58
  {
59
59
  package: '@rig-c/parts',
@@ -88,7 +88,7 @@ export const PACKAGE_DOCS: readonly PackageDoc[] = [
88
88
  {
89
89
  package: '@rig-c/core',
90
90
  path: 'docs/FACE.md',
91
- why: 'blink, gaze and head-turn plans',
91
+ why: 'blink and gaze in the accepted rig',
92
92
  },
93
93
  {
94
94
  package: '@rig-c/core',
@@ -155,13 +155,13 @@ function createLink(label: string, path: string, anchor?: string): string {
155
155
  * linked, because the package links below are exactly PACKAGE_DOCS.
156
156
  */
157
157
  export const READ_FIRST = [
158
- '1. **Before the interview**: INTERVIEW.md, and CRAFT.md for the default at each',
159
- ' waypoint (both linked below); parts AUTHORING §3, *`config.json`, field by',
160
- ` field*; ${createLink('CHECKS.md', 'docs/CHECKS.md')} before a sign-off.`,
161
- '2. **Before `seethrough` and `assemble`**: SOURCE.md, the order of the split and',
162
- ` the cut: ${createLink('re-running a bad split', 'docs/SOURCE.md', 're-run-first')},`,
163
- ` ${createLink('where a cut is allowed', 'docs/SOURCE.md', 'where-a-cut-is-allowed')};`,
164
- ' then parts AUTHORING *See-through head-run source reading*, *Source before',
158
+ '1. **Before the interview**: INTERVIEW.md; CRAFT.md (waypoint defaults);',
159
+ ' parts AUTHORING §3, *`config.json`, field by field*;',
160
+ ` ${createLink('CHECKS.md', 'docs/CHECKS.md')} before a sign-off.`,
161
+ '2. **Before `seethrough` and `assemble`**: SOURCE.md, split/cut order:',
162
+ ` ${createLink('bad-split reruns', 'docs/SOURCE.md', 're-run-first')},`,
163
+ ` ${createLink('allowed cuts', 'docs/SOURCE.md', 'where-a-cut-is-allowed')};`,
164
+ ' parts AUTHORING *See-through head-run source reading*, *Source before',
165
165
  ' scissors* and *Limbs: cut at their joints*.',
166
166
  `3. **Before rigging**: ${createLink('CRAFT.md § For the gates', 'docs/CRAFT.md', 'for-the-gates-not-the-interview')}`,
167
167
  ' (G1–G9); core RIGGING and MOTION; parts AUTHORING §7, the bars `check` enforces.',
@@ -175,7 +175,9 @@ export const READ_FIRST = [
175
175
  * rig-c/create#3 it is `rig-create interview --check`, which refuses every
176
176
  * `null` answer by name, so the line names the command, not the doc reference.
177
177
  */
178
- export const INTERVIEW_CHECK_LINE = 'Before asking the user to sign the interview, run `rig-create interview --check`: it names every `null` answer.';
178
+ export const INTERVIEW_CHECK_LINE = 'Run `rig-create interview --check` before interview sign-off: it names every `null` answer.';
179
+
180
+ export const REOPEN_EXCEPTION = 'Until create#493, agents may type `reopen` only from Review host raw export `act@4`: save nonempty `value.words` byte-for-byte to a verbatim file; `--source` names `actId`. Empty/missing words: STOP. Never supply words. `job fetch-act` rejects act@4.';
179
181
 
180
182
  export const GUIDE_TEMPLATE = 'agent-guide.md';
181
183
 
@@ -198,12 +200,13 @@ function linkLine(label: string, href: string, why: string): string {
198
200
  /** The text of AGENTS.md, from the template and the tables above. */
199
201
  export function renderAgentGuide(): string {
200
202
  const fills: Record<string, string> = {
201
- RESUME_LINK: `[PROJECT.md § How an agent resumes a project](${createDocUrl(RESUME_LINK.path, RESUME_LINK.anchor)})`,
203
+ RESUME_LINK: `[Resume](${createDocUrl(RESUME_LINK.path, RESUME_LINK.anchor)})`,
202
204
  INTERVIEW_CHECK: INTERVIEW_CHECK_LINE,
205
+ REOPEN_EXCEPTION,
203
206
  DERIVED_LINK: `[INTERVIEW.md § Derived answers](${createDocUrl(DERIVED_LINK.path, DERIVED_LINK.anchor)})`,
204
207
  GATES_LINK: `[CRAFT.md G8](${createDocUrl(GATES_LINK.path, GATES_LINK.anchor)})`,
205
- DRAFTS_LINK: `[PROJECT.md § Labelled draft rigs](${createDocUrl(DRAFTS_LINK.path, DRAFTS_LINK.anchor)})`,
206
- STAGES_LINK: `[PROJECT.md § Stages](${createDocUrl(STAGES_LINK.path, STAGES_LINK.anchor)})`,
208
+ DRAFTS_LINK: `[Draft rigs](${createDocUrl(DRAFTS_LINK.path, DRAFTS_LINK.anchor)})`,
209
+ STAGES_LINK: `[Stages](${createDocUrl(STAGES_LINK.path, STAGES_LINK.anchor)})`,
207
210
  LIFETIME_LINK: `[PROJECT.md § Data is split by lifetime](${createDocUrl(LIFETIME_LINK.path, LIFETIME_LINK.anchor)})`,
208
211
  INTAKE_LINK: `[PROJECT.md § Advisory intake reports](${createDocUrl(INTAKE_LINK.path, INTAKE_LINK.anchor)})`,
209
212
  CG_GATES_LINK: `[CHECKS.md § CG gates](${createDocUrl(CG_GATES_LINK.path, CG_GATES_LINK.anchor)})`,
@@ -24,7 +24,13 @@ interview-answer <question> [<dir>] --set <path> --sha256 <shown sha> --by <huma
24
24
  [--note-file <file>] [--source <location>] [--why-file <file> for a member override]
25
25
  interview-decision <question> [<dir>] --by <agent> --reasoning-file <file>
26
26
  --fragment <ask>=<JSON file>...
27
- Retain the shown set first. Each ask is picked explicitly; no recommended option is preselected.`;
27
+ Retain the shown set first. Each ask is picked explicitly; no recommended option is preselected.
28
+ To ask an answered question again, retain and register a new set id/path with
29
+ interview-options <question> --file <path>, then job open --question <question>
30
+ and ingest interview-answer <question> --from-review <actId>; history is kept.
31
+ --adopt: split-order projects adopt all choices; legacy-order projects may adopt
32
+ post choices at post-interview only. For full adoption, first adopt the split
33
+ stage order with a fresh parts/rigging interview (docs/INTERVIEW.md).`;
28
34
  function usage(why: string): never { refuse('INTERVIEW_OPTIONS_USAGE', `interview: ${why}; ${CHOICE_HELP}`, USAGE_EXIT); }
29
35
  interface Args { positional: string[]; one: Record<string,string>; many: Record<string,Map<string,string>>; adopt: boolean; }
30
36
  function parse(args: string[], allowed: string[], repeat: string[] = []): Args {
@@ -97,7 +103,7 @@ export function interviewOptionsCommand(args: string[], now: number): string { r
97
103
  const dir = resolve(opts.positional[0] ?? process.cwd()); const {file,project} = readProject(dir); const next = structuredClone(project);
98
104
  const interview = isObject(next.interview) ? next.interview : null;
99
105
  if (interview && interview.order === undefined && isObject(interview.post)) {
100
- if (project.stage !== 'post-interview') refuse('INTERVIEW_CHOICE_INVALID', 'interview.post: advance to post-interview before adopting post choices');
106
+ if (project.stage !== 'post-interview') refuse('INTERVIEW_CHOICE_INVALID', 'interview.post: for post-only choices, advance to post-interview before interview-options --adopt; for full adoption, first adopt the split stage order with a fresh parts/rigging interview (docs/INTERVIEW.md)');
101
107
  if (interview.post.choices_adopted_at !== undefined) {
102
108
  if (!Number.isFinite(Date.parse(String(interview.post.choices_adopted_at)))) refuse('INTERVIEW_CHOICE_INVALID', 'interview.post: restore the original valid choices_adopted_at');
103
109
  return 'interview: post choices already adopted; original date preserved';
package/src/choices.ts CHANGED
@@ -177,7 +177,7 @@ export function optionContext(project: JsonObject, stage: string, at: number, di
177
177
  if (!signoff || !rig || !isObject(provenance.config)) fail('INTERVIEW_OPTIONS_STALE', 'accept a rig with retained config before drafting post options');
178
178
  const approval = latestPartsApproval(project, date(rig.at));
179
179
  const draft = objects(project.drafts).find(d => d.id === approval?.draft_id);
180
- if (!draft || !isObject(draft.parts)) fail('INTERVIEW_OPTIONS_STALE', 'retain the accepted rig parts identity before drafting post options');
180
+ if (!draft || !isObject(draft.parts)) fail('INTERVIEW_OPTIONS_STALE', `versions[v${String(rig.n)}]: no retained approved draft parts are available at rig.at ${String(rig.at)}; restore the parts-review approval and draft live at that build date, or register a new rig version after parts-review before drafting post options`);
181
181
  return { kind: 'rig', rig_version: rig.n as Json, signoff_at: signoff.record.at as Json, config: provenance.config, parts: draft.parts };
182
182
  }
183
183
 
package/src/cli.ts CHANGED
@@ -113,12 +113,20 @@ ${INPUT_CLI} rig-create init <dir> [--no-install] create a project
113
113
  rig-create --help show this help
114
114
  rig-create --version show the version
115
115
 
116
+ job open / job reconcile / bound writers:
117
+ --rig <n> selects a registered rig OR post version; the flag name is shared
118
+ Keep the Review host up across bound writes (including advance and republish).
119
+ If it stopped, job open again with --reviewer <id> --role owner|delegate,
120
+ then job reconcile; a pending publication blocks later bound writes.
121
+
116
122
  init:
117
123
  <dir> an empty or missing folder; a non-empty one is refused
118
124
  --no-install do not run bun install (offline, tests); run it yourself afterwards
119
125
  --painting <file> --origin <words>
120
126
  copy the painting into inputs/, register it and declare project.painting; refused (INIT_ARTWORK_EXISTS) when a
121
- project directly under --projects-root (default: the parent folder) binds the same sha256
127
+ project directly under --projects-root (default: the parent folder) binds the same sha256.
128
+ Continue there as a new version; restart keeps its correction ledger.
129
+ A new project is for different artwork or a different rig kind only.
122
130
  --same-artwork-reason <file>
123
131
  record why this artwork needs a second project (a different rig kind)
124
132
 
@@ -18,6 +18,8 @@ direction write <N> [<dir>] --file <retained JSON> --rig <R> [--answers <version
18
18
  direction patch <N> [<dir>] --patch-file <retained direction-patch/1> [--answers <version>:<verdict>]
19
19
  direction check <N> [<dir>] [--json]
20
20
  Documents are immutable evidence/direction/v<N>.json. No rendering or producer builds.
21
+ --file and --patch-file are retained, non-ignored project-relative paths.
22
+ A bounced predecessor needs --answers <version>:<verdict> on write/patch.
21
23
  Capture a made correction with correction record --direction-patch-file before patch ingestion;
22
24
  resolve it against the result post. Review exports patches, never invokes this writer.`;
23
25
  function usage(why:string):never {refuse('DIRECTION_USAGE',`direction: ${why}; ${DIRECTION_HELP}`,USAGE_EXIT);}
@@ -32,7 +34,7 @@ function prospective(dir:string,before:JsonObject,next:JsonObject,now:number):vo
32
34
  /** A narrow seam for fault-injected transaction tests; CLI never supplies a hook. */
33
35
  export interface DirectionWriteHooks { beforeCommit?:()=>void; }
34
36
  export function directionCommand(args:string[],now:number,hooks:DirectionWriteHooks={}):{stdout:string;exit:number} {
35
- try{return command(args,now,hooks);}catch(e){if(e instanceof DirectionError)refuse(e.code,e.message,e.code==='DIRECTION_USAGE'?USAGE_EXIT:1);throw e;}
37
+ try{return command(args,now,hooks);}catch(e){if(e instanceof DirectionError)refuse(e.code,e.code==='FEEDBACK_UNANSWERED'?`${e.message}; retry direction write/patch with --answers <version>:<verdict> naming the bounced verdict`:e.message,e.code==='DIRECTION_USAGE'?USAGE_EXIT:1);throw e;}
36
38
  }
37
39
  function command(args:string[],now:number,hooks:DirectionWriteHooks):{stdout:string;exit:number} {
38
40
  const action=args[0];const positional:string[]=[];const opts:Record<string,string>={};const answerValues:string[]=[];let json=false;
package/src/direction.ts CHANGED
@@ -35,7 +35,8 @@ export function directionFinding(e: DirectionError): Finding { return { code: e.
35
35
  export function directionBytes(dir: string, path: string): Buffer { return retainedBytes(dir, path, false); }
36
36
  function retainedBytes(dir: string, path: string, boundOutput: boolean): Buffer {
37
37
  try {
38
- if (isAbsolute(path) || path.includes('\\') || path.split('/').some(p => !p || p === '.' || p === '..') || !boundOutput && structurePathIsIgnored(dir, path) && !/^derived\/review\/v[1-9][0-9]*\/out\/check\/build\/skeleton\.model\.json$/.test(path)) throw Error('literal retained POSIX path required');
38
+ if (isAbsolute(path) || path.includes('\\') || path.split('/').some(p => !p || p === '.' || p === '..')) throw Error('literal project-relative POSIX path required');
39
+ if (!boundOutput && structurePathIsIgnored(dir, path) && !/^derived\/review\/v[1-9][0-9]*\/out\/check\/build\/skeleton\.model\.json$/.test(path)) throw Error('path is ignored; retain the source in a non-ignored project folder such as evidence/direction-src/ and pass that project-relative path');
39
40
  let current = realpathSync(dir);
40
41
  for (const [i, segment] of path.split('/').entries()) {
41
42
  current = join(current, segment); const stat = lstatSync(current);
package/src/feedback.ts CHANGED
@@ -27,6 +27,7 @@ import { acquireBoundJobWrite, jobRuntimeExecArgv } from './job-writer.ts';
27
27
  import { jobHash } from './job-outbox.ts';
28
28
  import { assertReviewActSource, decodeReviewAct, reviewActFindings, reviewActPublicationWarning, reviewActStill, reviewActTransport, reviewActVerbatim, reviewActVersionHash, type FetchedReviewAct } from './review-act.ts';
29
29
  import { newRefusals } from './refusal-baseline.ts';
30
+ import { ingestedVerdictPairFinding } from './signoff-pair.ts';
30
31
  import { dirname, join, resolve } from 'node:path';
31
32
 
32
33
  import { asArray, asString, collectItems, isObject, itemFor, loadCollection, type Ctx, type Item } from './check.ts';
@@ -541,7 +542,7 @@ function writeVerdict(projectDirArg: string, input: ReviewInput, now: number, fe
541
542
  bytes: fetched.bytes, sha256: jobHash(fetched.bytes), version: input.version, verdict: verdicts.length - 1,
542
543
  version_hash: reviewActVersionHash(original, fetched.act), added_evidence: addedEvidence };
543
544
  project.review_acts = [...asArray(project.review_acts), receipt];
544
- const invalid = reviewActFindings(project)[0] ?? newRefusals(dir, original, project, { now })[0];
545
+ const invalid = reviewActFindings(project)[0] ?? ingestedVerdictPairFinding(project, input.version, verdicts.length - 1) ?? newRefusals(dir, original, project, { now })[0];
545
546
  if (invalid) refuse(invalid.code, invalid.message);
546
547
  assertReviewActSource(dir, original, fetched.act);
547
548
  if (!readFileSync(file).equals(originalBytes)) refuse('REVIEW_ACT_SOURCE_STALE', 'project.json: record changed during verdict validation; retry against the current live job');
@@ -556,7 +557,7 @@ function writeVerdict(projectDirArg: string, input: ReviewInput, now: number, fe
556
557
  } finally { closeSync(fd); rmSync(temporary, { force: true }); }
557
558
  return result;
558
559
  }
559
- const invalid = newRefusals(dir, original, project, { now })[0];
560
+ const invalid = ingestedVerdictPairFinding(project, input.version, verdicts.length - 1) ?? newRefusals(dir, original, project, { now })[0];
560
561
  if (invalid) refuse(invalid.code, invalid.message);
561
562
  writeFileSync(file, `${JSON.stringify(project, null, 2)}\n`);
562
563
  return { project_dir: dir, verdict_path: verdictPath, verdict, items: out, stage: asString(project.stage) };
@@ -589,6 +590,8 @@ export function recordReviewAct(root: string, requestedVersion: number, actId: s
589
590
  ? existing.bytes === response.bytes
590
591
  : isDeepStrictEqual(JSON.parse(String(existing.bytes)), act);
591
592
  if (!sameAct) refuse('REVIEW_ACT_REPLAY_CONFLICT', 'project.json.review_acts: immutable act changed; restore the original receipt');
593
+ const pair = ingestedVerdictPairFinding(project, requestedVersion, Number(existing.verdict));
594
+ if (pair) refuse(pair.code, pair.message);
592
595
  if (existing.version_hash !== reviewActVersionHash(project, act, Number(existing.verdict))) refuse('REVIEW_ACT_SOURCE_STALE', 'project.json.review_acts: reviewed version changed; request a new review act');
593
596
  const version = asArray(project.versions).find(v => isObject(v) && v.n === requestedVersion) as JsonObject;
594
597
  return { project_dir: root, verdict_path: `versions[v${requestedVersion}].verdicts[${existing.verdict}]`,
package/src/init.ts CHANGED
@@ -65,7 +65,7 @@ export function sameArtworkFor(dir: string, name: string, sha256: string, now: n
65
65
  return inputs.some(input => input !== null && typeof input === 'object' && (input as JsonObject).sha256 === sha256);
66
66
  });
67
67
  if (matches.length > 0 && options.sameArtworkReason === undefined) {
68
- refuse('INIT_ARTWORK_EXISTS', `inputs[${options.index ?? 0}]: ${name} (sha256 ${sha256}) is already an input of ${matches.join(', ')} under ${root}; one artwork is one project, so record a redo, a new source or a new tool as a version there, or give --same-artwork-reason <file> for a different rig kind`);
68
+ refuse('INIT_ARTWORK_EXISTS', `inputs[${options.index ?? 0}]: ${name} (sha256 ${sha256}) is already an input of ${matches.join(', ')} under ${root}; continue in that existing project as a new version; restart there inherits its correction ledger. A new project is only for different artwork or a different rig kind (--same-artwork-reason <file> for the latter); do not copy the artwork to bypass this refusal`);
69
69
  }
70
70
  if (options.sameArtworkReason !== undefined) {
71
71
  if (matches.length === 0) refuse('INIT_ARTWORK_USAGE', `--same-artwork-reason: no project under ${root} binds ${name}; drop the reason`, USAGE_EXIT);
package/src/job-acts.ts CHANGED
@@ -1,7 +1,12 @@
1
1
  /** Writer routing for finalized acts. No event transport or automatic ingestion. */
2
2
  import type { ActV3 } from '@rig-c/review/job-host';
3
- import { asArray, isObject } from './check.ts';
3
+ import { asArray, isObject, type Finding } from './check.ts';
4
+ import { existsSync, readFileSync } from './check-reads.ts';
5
+ import { join } from 'node:path';
6
+ import { recordedPartsVerdict } from './parts-verdict-record.ts';
4
7
  import { stageOfStep } from './stages.ts';
8
+ import { checkStructure } from './structure.ts';
9
+ import { createHash } from 'node:crypto';
5
10
  import type { JsonObject } from './templates.ts';
6
11
 
7
12
  export interface PendingJobAct {
@@ -11,6 +16,7 @@ export interface PendingJobAct {
11
16
  at: string;
12
17
  args: string[] | null;
13
18
  command: string | null;
19
+ preconditions?: { command: string | null; act: string }[];
14
20
  unavailable?: { code: 'JOB_ACTS_WRITER_UNAVAILABLE'; message: string };
15
21
  }
16
22
 
@@ -18,6 +24,23 @@ function shellWord(value: string): string {
18
24
  return /^[A-Za-z0-9_./:-]+$/.test(value) ? value : `'${value.replaceAll("'", "'\\''")}'`;
19
25
  }
20
26
 
27
+ /** A retained snapshot is reusable only for this exact draft and config.
28
+ * Never overwrite unrelated or invalid bytes: choose the next retained name.
29
+ */
30
+ export function partsStructureSnapshot(root: string, project: JsonObject, draft: string): { path: string; valid: boolean } {
31
+ const stem = `evidence/structure-${encodeURIComponent(draft)}`;
32
+ for (let suffix = 0; ; suffix++) {
33
+ const path = `${stem}${suffix === 0 ? '' : `-${suffix}`}.json`;
34
+ if (!existsSync(join(root, path))) return { path, valid: false };
35
+ try {
36
+ const bytes = readFileSync(join(root, path));
37
+ const errors: Finding[] = [];
38
+ const signoff = { draft_id: draft, structure: { path, sha256: createHash('sha256').update(bytes).digest('hex') } };
39
+ if (checkStructure(root, project, signoff, path, errors) !== null && errors.length === 0) return { path, valid: true };
40
+ } catch { /* Preserve the existing bytes and select another output path. */ }
41
+ }
42
+ }
43
+
21
44
  export function pendingJobActs(project: JsonObject, acts: readonly ActV3[], root: string): PendingJobAct[] {
22
45
  const ingested = new Set(asArray(project.review_acts).filter(isObject).map(row => JSON.stringify([row.jobId, row.actId])));
23
46
  const signoffs = asArray(project.signoffs).filter(isObject);
@@ -28,6 +51,7 @@ export function pendingJobActs(project: JsonObject, acts: readonly ActV3[], root
28
51
  seen.add(key);
29
52
  let subject: string = act.kind;
30
53
  let args: string[] | null = null;
54
+ const preconditions: { command: string | null; act: string }[] = [];
31
55
  switch (act.kind) {
32
56
  case 'review-verdict': {
33
57
  const selector = act.source.selector;
@@ -51,10 +75,26 @@ export function pendingJobActs(project: JsonObject, acts: readonly ActV3[], root
51
75
  subject = `question ${act.value.questionId}`;
52
76
  args = ['interview-answer', act.value.questionId, root];
53
77
  break;
54
- case 'signoff':
78
+ case 'signoff': {
55
79
  subject = `stage ${act.value.stage}`;
56
80
  args = ['signoff', act.value.stage, root];
81
+ if (act.value.stage === 'parts-review') {
82
+ const selector = act.source.selector;
83
+ // Select only the draft shown by Review, never the latest draft by guess.
84
+ if (selector?.kind !== 'draft') { args = null; break; }
85
+ const draft = selector.id;
86
+ const structure = partsStructureSnapshot(root, project, draft);
87
+ let approved = false;
88
+ try { recordedPartsVerdict(root, project, draft); approved = true; } catch { /* Ordered prerequisite below. */ }
89
+ if (!approved) preconditions.push({ command: null, act: `ingest the approved parts-verdict for draft ${draft} before structure-snapshot; use its job acts writer command` });
90
+ if (!structure.valid) preconditions.push({
91
+ command: ['rig-create', 'structure-snapshot', root, '--draft', draft, '--out', structure.path].map(shellWord).join(' '),
92
+ act: 'after ingesting the approved parts-verdict, retain the structure snapshot before signoff',
93
+ });
94
+ args.push('--draft', draft, '--structure-file', structure.path);
95
+ }
57
96
  break;
97
+ }
58
98
  case 'checkpoint': {
59
99
  const step = asArray(isObject(project.plan) ? project.plan.steps : undefined).filter(isObject).find(step => step.id === act.value.planStepId);
60
100
  subject = `checkpoint ${act.value.planStepId}`;
@@ -68,6 +108,7 @@ export function pendingJobActs(project: JsonObject, acts: readonly ActV3[], root
68
108
  }
69
109
  if (args) args.push('--from-review', act.actId);
70
110
  return [{ actId: act.actId, kind: act.kind, subject, at: act.at, args,
111
+ ...(preconditions.length ? { preconditions } : {}),
71
112
  command: args ? ['rig-create', ...args].map(shellWord).join(' ') : null,
72
113
  ...(args ? {} : { unavailable: { code: 'JOB_ACTS_WRITER_UNAVAILABLE' as const,
73
114
  message: `project.json: act ${act.actId} (${subject}) has no current writer target; restore its plan step or use a supported Review subject before ingestion` } }) }];
@@ -76,5 +117,5 @@ export function pendingJobActs(project: JsonObject, acts: readonly ActV3[], root
76
117
 
77
118
  export function jobActsText(result: { acts: readonly PendingJobAct[] }): string {
78
119
  if (!result.acts.length) return 'job: no finalized acts awaiting ingestion';
79
- return result.acts.map(act => `${act.actId} ${act.kind} ${act.subject} at ${act.at}\n ${act.command ?? `${act.unavailable!.code}: ${act.unavailable!.message}`}`).join('\n');
120
+ return result.acts.map(act => `${act.actId} ${act.kind} ${act.subject} at ${act.at}\n${(act.preconditions ?? []).map(step => ` first: ${step.command ?? step.act}\n`).join('')} ${act.command ?? `${act.unavailable!.code}: ${act.unavailable!.message}`}`).join('\n');
80
121
  }
package/src/job-host.ts CHANGED
@@ -424,7 +424,7 @@ export function requestedRecordResult(root: string, question?: string, plan = fa
424
424
  if (question !== undefined) {
425
425
  const items = collectItems(project, { collection: loadCollection(root, project) }).filter(item => item.id === question);
426
426
  const binding = items.length === 1 ? items[0]!.record.pending_options : undefined;
427
- if (!isObject(binding) || typeof binding.path !== 'string') refuse('JOB_RECORD_SUBJECT_INVALID', 'project.json: requested question has no unique pending option set; register it with interview-options first');
427
+ if (!isObject(binding) || typeof binding.path !== 'string') refuse('JOB_RECORD_SUBJECT_INVALID', `project.json: requested question has no unique pending option set; register it with rig-create interview-options ${question} '${root.replaceAll("'", "'\\''")}' --file '<option-set.json>' first (draft a new option set to re-ask an answered question)`);
428
428
  const set = JSON.parse(publicationFile(root, binding.path).toString('utf8')) as JsonObject;
429
429
  if (typeof set.id !== 'string') refuse('JOB_RECORD_SUBJECT_INVALID', 'project.json: pending option set has no id; restore its original identity');
430
430
  result = { kind: 'option-set', questionId: question, setId: set.id };