rig-create 1.0.2 → 1.1.0

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 (629) hide show
  1. package/README.md +21 -5
  2. package/docs/AGENT-REFERENCE.md +62 -0
  3. package/docs/CHECKS.md +45 -9
  4. package/docs/INTERVIEW.md +19 -7
  5. package/docs/PROJECT.md +10 -0
  6. package/package.json +4 -1
  7. package/scripts/npm-json.ts +74 -0
  8. package/scripts/verify-example-seals.ts +148 -0
  9. package/src/agent-guide.ts +7 -4
  10. package/src/check.ts +7 -4
  11. package/src/choice-writers.ts +3 -14
  12. package/src/cli.ts +1 -0
  13. package/src/feedback.ts +3 -10
  14. package/src/fix-ledger.ts +1 -1
  15. package/src/job-acts.ts +4 -0
  16. package/src/job-host-state.ts +154 -0
  17. package/src/job-host.ts +37 -14
  18. package/src/job-outbox.ts +5 -3
  19. package/src/job-publication.ts +17 -13
  20. package/src/job-runtime.ts +17 -4
  21. package/src/next.ts +110 -24
  22. package/src/parts-review.ts +4 -11
  23. package/src/reopen.ts +72 -9
  24. package/src/review-act.ts +49 -14
  25. package/src/review-package.ts +3 -1
  26. package/src/rig-version.ts +219 -8
  27. package/src/scene-writers.ts +5 -3
  28. package/src/scene.ts +14 -4
  29. package/src/signable.ts +25 -3
  30. package/src/signoff-checkpoint-act.ts +2 -16
  31. package/src/signoff.ts +3 -15
  32. package/src/waypoints.ts +20 -9
  33. package/templates/agent-guide.md +2 -24
  34. package/templates/collection.json +10 -2
  35. package/templates/example-chain/.gitignore +6 -0
  36. package/templates/example-chain/.npmignore +1 -0
  37. package/templates/example-chain/AGENT-REFERENCE.md +62 -0
  38. package/templates/example-chain/AGENTS.md +4 -26
  39. package/templates/example-chain/README.md +1 -1
  40. package/templates/example-chain/chain.json +385 -319
  41. package/templates/example-chain/checkpoints/0a-interview-options/.gitignore +6 -0
  42. package/templates/example-chain/checkpoints/0a-interview-options/.npmignore +1 -0
  43. package/templates/example-chain/checkpoints/0a-interview-options/AGENT-REFERENCE.md +62 -0
  44. package/templates/example-chain/checkpoints/0a-interview-options/AGENTS.md +4 -26
  45. package/templates/example-chain/checkpoints/0a-interview-options/project.json +22 -5
  46. package/templates/example-chain/checkpoints/0a-interview-options.json +7 -3
  47. package/templates/example-chain/checkpoints/0b-plan-pending/.gitignore +6 -0
  48. package/templates/example-chain/checkpoints/0b-plan-pending/.npmignore +1 -0
  49. package/templates/example-chain/checkpoints/0b-plan-pending/AGENT-REFERENCE.md +62 -0
  50. package/templates/example-chain/checkpoints/0b-plan-pending/AGENTS.md +4 -26
  51. package/templates/example-chain/checkpoints/0b-plan-pending/project.json +22 -5
  52. package/templates/example-chain/checkpoints/0b-plan-pending.json +7 -3
  53. package/templates/example-chain/checkpoints/1-parts-verdict/.gitignore +6 -0
  54. package/templates/example-chain/checkpoints/1-parts-verdict/.npmignore +1 -0
  55. package/templates/example-chain/checkpoints/1-parts-verdict/AGENT-REFERENCE.md +62 -0
  56. package/templates/example-chain/checkpoints/1-parts-verdict/AGENTS.md +4 -26
  57. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/config.json +88 -0
  58. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/painting_in_rig.png +0 -0
  59. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/background.png +0 -0
  60. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/eye_l.png +0 -0
  61. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/eye_r.png +0 -0
  62. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/face.png +0 -0
  63. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/lantern.png +0 -0
  64. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts/torso.png +0 -0
  65. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/parts.json +188 -0
  66. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/input/recomposite_rig.png +0 -0
  67. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/interview-requirements.json +8 -0
  68. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/check/build/run.json +40 -0
  69. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/check/build/skeleton.atlas +28 -0
  70. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/check/build/skeleton.json +674 -0
  71. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/check/build/skeleton.model.json +1072 -0
  72. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/check/build/skeleton.png +0 -0
  73. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/background.png +0 -0
  74. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/eye_l.png +0 -0
  75. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/eye_r.png +0 -0
  76. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/face.png +0 -0
  77. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/lantern.png +0 -0
  78. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/images/torso.png +0 -0
  79. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/mesh_report.json +15 -0
  80. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/motion.json +137 -0
  81. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/rig.json +536 -0
  82. package/templates/example-chain/checkpoints/1-parts-verdict/derived/drafts/chain/out/run.json +52 -0
  83. package/templates/example-chain/checkpoints/1-parts-verdict/project.json +24 -7
  84. package/templates/example-chain/checkpoints/1-parts-verdict.json +9 -5
  85. package/templates/example-chain/checkpoints/2-rigging-answers/.gitignore +6 -0
  86. package/templates/example-chain/checkpoints/2-rigging-answers/.npmignore +1 -0
  87. package/templates/example-chain/checkpoints/2-rigging-answers/AGENT-REFERENCE.md +62 -0
  88. package/templates/example-chain/checkpoints/2-rigging-answers/AGENTS.md +4 -26
  89. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/config.json +88 -0
  90. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/painting_in_rig.png +0 -0
  91. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/background.png +0 -0
  92. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/eye_l.png +0 -0
  93. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/eye_r.png +0 -0
  94. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/face.png +0 -0
  95. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/lantern.png +0 -0
  96. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts/torso.png +0 -0
  97. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/parts.json +188 -0
  98. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/input/recomposite_rig.png +0 -0
  99. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/interview-requirements.json +8 -0
  100. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/check/build/run.json +40 -0
  101. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/check/build/skeleton.atlas +28 -0
  102. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/check/build/skeleton.json +674 -0
  103. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/check/build/skeleton.model.json +1072 -0
  104. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/check/build/skeleton.png +0 -0
  105. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/background.png +0 -0
  106. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/eye_l.png +0 -0
  107. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/eye_r.png +0 -0
  108. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/face.png +0 -0
  109. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/lantern.png +0 -0
  110. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/images/torso.png +0 -0
  111. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/mesh_report.json +15 -0
  112. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/motion.json +137 -0
  113. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/rig.json +536 -0
  114. package/templates/example-chain/checkpoints/2-rigging-answers/derived/drafts/chain/out/run.json +52 -0
  115. package/templates/example-chain/checkpoints/2-rigging-answers/project.json +24 -7
  116. package/templates/example-chain/checkpoints/2-rigging-answers.json +21 -5
  117. package/templates/example-chain/checkpoints/3-rig-review/.gitignore +6 -0
  118. package/templates/example-chain/checkpoints/3-rig-review/.npmignore +1 -0
  119. package/templates/example-chain/checkpoints/3-rig-review/AGENT-REFERENCE.md +62 -0
  120. package/templates/example-chain/checkpoints/3-rig-review/AGENTS.md +4 -26
  121. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/config.json +88 -0
  122. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/painting_in_rig.png +0 -0
  123. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/background.png +0 -0
  124. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/eye_l.png +0 -0
  125. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/eye_r.png +0 -0
  126. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/face.png +0 -0
  127. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/lantern.png +0 -0
  128. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts/torso.png +0 -0
  129. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/parts.json +188 -0
  130. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/input/recomposite_rig.png +0 -0
  131. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/interview-requirements.json +8 -0
  132. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/check/build/run.json +40 -0
  133. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/check/build/skeleton.atlas +28 -0
  134. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/check/build/skeleton.json +674 -0
  135. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/check/build/skeleton.model.json +1072 -0
  136. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/check/build/skeleton.png +0 -0
  137. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/background.png +0 -0
  138. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/eye_l.png +0 -0
  139. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/eye_r.png +0 -0
  140. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/face.png +0 -0
  141. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/lantern.png +0 -0
  142. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/images/torso.png +0 -0
  143. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/mesh_report.json +15 -0
  144. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/motion.json +137 -0
  145. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/rig.json +536 -0
  146. package/templates/example-chain/checkpoints/3-rig-review/derived/drafts/chain/out/run.json +52 -0
  147. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/config.json +88 -0
  148. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/interview-requirements.json +8 -0
  149. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/check/build/run.json +40 -0
  150. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/check/build/skeleton.atlas +28 -0
  151. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/check/build/skeleton.json +674 -0
  152. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/check/build/skeleton.model.json +1072 -0
  153. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/check/build/skeleton.png +0 -0
  154. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/background.png +0 -0
  155. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/eye_l.png +0 -0
  156. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/eye_r.png +0 -0
  157. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/face.png +0 -0
  158. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/lantern.png +0 -0
  159. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts/torso.png +0 -0
  160. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/parts.json +188 -0
  161. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/background.png +0 -0
  162. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/eye_l.png +0 -0
  163. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/eye_r.png +0 -0
  164. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/face.png +0 -0
  165. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/lantern.png +0 -0
  166. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/images/torso.png +0 -0
  167. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/mesh_report.json +15 -0
  168. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/motion.json +137 -0
  169. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/rig.json +536 -0
  170. package/templates/example-chain/checkpoints/3-rig-review/derived/review/v1/out/rig/run.json +52 -0
  171. package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/motion.json +1 -1
  172. package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/turn.json +108 -0
  173. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/check/build/run.json +40 -0
  174. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/check/build/skeleton.atlas +28 -0
  175. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/check/build/skeleton.json +674 -0
  176. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/check/build/skeleton.model.json +1072 -0
  177. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/check/build/skeleton.png +0 -0
  178. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/painting_in_rig.png +0 -0
  179. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/background.png +0 -0
  180. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/eye_l.png +0 -0
  181. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/eye_r.png +0 -0
  182. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/face.png +0 -0
  183. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/lantern.png +0 -0
  184. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts/torso.png +0 -0
  185. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/parts.json +188 -0
  186. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/background.png +0 -0
  187. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/eye_l.png +0 -0
  188. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/eye_r.png +0 -0
  189. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/face.png +0 -0
  190. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/lantern.png +0 -0
  191. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/images/torso.png +0 -0
  192. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/mesh_report.json +15 -0
  193. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/motion.json +137 -0
  194. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/rig.json +536 -0
  195. package/templates/example-chain/checkpoints/3-rig-review/outputs/v1/out/rig/run.json +52 -0
  196. package/templates/example-chain/checkpoints/3-rig-review/project.json +77 -28
  197. package/templates/example-chain/checkpoints/3-rig-review.json +19 -11
  198. package/templates/example-chain/checkpoints/4-direction-post/.gitignore +6 -0
  199. package/templates/example-chain/checkpoints/4-direction-post/.npmignore +1 -0
  200. package/templates/example-chain/checkpoints/4-direction-post/AGENT-REFERENCE.md +62 -0
  201. package/templates/example-chain/checkpoints/4-direction-post/AGENTS.md +4 -26
  202. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/config.json +88 -0
  203. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/painting_in_rig.png +0 -0
  204. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/background.png +0 -0
  205. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/eye_l.png +0 -0
  206. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/eye_r.png +0 -0
  207. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/face.png +0 -0
  208. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/lantern.png +0 -0
  209. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts/torso.png +0 -0
  210. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/parts.json +188 -0
  211. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/input/recomposite_rig.png +0 -0
  212. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/interview-requirements.json +8 -0
  213. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/check/build/run.json +40 -0
  214. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/check/build/skeleton.atlas +28 -0
  215. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/check/build/skeleton.json +674 -0
  216. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/check/build/skeleton.model.json +1072 -0
  217. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/check/build/skeleton.png +0 -0
  218. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/background.png +0 -0
  219. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/eye_l.png +0 -0
  220. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/eye_r.png +0 -0
  221. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/face.png +0 -0
  222. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/lantern.png +0 -0
  223. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/images/torso.png +0 -0
  224. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/mesh_report.json +15 -0
  225. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/motion.json +137 -0
  226. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/rig.json +536 -0
  227. package/templates/example-chain/checkpoints/4-direction-post/derived/drafts/chain/out/run.json +52 -0
  228. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/config.json +88 -0
  229. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/interview-requirements.json +8 -0
  230. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/check/build/run.json +40 -0
  231. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/check/build/skeleton.atlas +28 -0
  232. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/check/build/skeleton.json +674 -0
  233. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/check/build/skeleton.model.json +1072 -0
  234. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/check/build/skeleton.png +0 -0
  235. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/background.png +0 -0
  236. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/eye_l.png +0 -0
  237. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/eye_r.png +0 -0
  238. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/face.png +0 -0
  239. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/lantern.png +0 -0
  240. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts/torso.png +0 -0
  241. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/parts.json +188 -0
  242. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/background.png +0 -0
  243. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/eye_l.png +0 -0
  244. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/eye_r.png +0 -0
  245. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/face.png +0 -0
  246. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/lantern.png +0 -0
  247. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/images/torso.png +0 -0
  248. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/mesh_report.json +15 -0
  249. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/motion.json +137 -0
  250. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/rig.json +536 -0
  251. package/templates/example-chain/checkpoints/4-direction-post/derived/review/v1/out/rig/run.json +52 -0
  252. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/camera_depth.json +2 -2
  253. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/motion.json +1 -1
  254. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/post_composition.json +2 -2
  255. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/post_timing.json +2 -2
  256. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/turn.json +108 -0
  257. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/check/build/run.json +40 -0
  258. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/check/build/skeleton.atlas +28 -0
  259. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/check/build/skeleton.json +674 -0
  260. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/check/build/skeleton.model.json +1072 -0
  261. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/check/build/skeleton.png +0 -0
  262. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/painting_in_rig.png +0 -0
  263. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/background.png +0 -0
  264. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/eye_l.png +0 -0
  265. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/eye_r.png +0 -0
  266. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/face.png +0 -0
  267. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/lantern.png +0 -0
  268. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts/torso.png +0 -0
  269. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/parts.json +188 -0
  270. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/background.png +0 -0
  271. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/eye_l.png +0 -0
  272. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/eye_r.png +0 -0
  273. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/face.png +0 -0
  274. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/lantern.png +0 -0
  275. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/images/torso.png +0 -0
  276. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/mesh_report.json +15 -0
  277. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/motion.json +137 -0
  278. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/rig.json +536 -0
  279. package/templates/example-chain/checkpoints/4-direction-post/outputs/v1/out/rig/run.json +52 -0
  280. package/templates/example-chain/checkpoints/4-direction-post/project.json +106 -57
  281. package/templates/example-chain/checkpoints/4-direction-post.json +22 -14
  282. package/templates/example-chain/derived/drafts/chain/config.json +88 -0
  283. package/templates/example-chain/derived/drafts/chain/input/painting_in_rig.png +0 -0
  284. package/templates/example-chain/derived/drafts/chain/input/parts/background.png +0 -0
  285. package/templates/example-chain/derived/drafts/chain/input/parts/eye_l.png +0 -0
  286. package/templates/example-chain/derived/drafts/chain/input/parts/eye_r.png +0 -0
  287. package/templates/example-chain/derived/drafts/chain/input/parts/face.png +0 -0
  288. package/templates/example-chain/derived/drafts/chain/input/parts/lantern.png +0 -0
  289. package/templates/example-chain/derived/drafts/chain/input/parts/torso.png +0 -0
  290. package/templates/example-chain/derived/drafts/chain/input/parts.json +188 -0
  291. package/templates/example-chain/derived/drafts/chain/input/recomposite_rig.png +0 -0
  292. package/templates/example-chain/derived/drafts/chain/interview-requirements.json +8 -0
  293. package/templates/example-chain/derived/drafts/chain/out/check/build/run.json +40 -0
  294. package/templates/example-chain/derived/drafts/chain/out/check/build/skeleton.atlas +28 -0
  295. package/templates/example-chain/derived/drafts/chain/out/check/build/skeleton.json +674 -0
  296. package/templates/example-chain/derived/drafts/chain/out/check/build/skeleton.model.json +1072 -0
  297. package/templates/example-chain/derived/drafts/chain/out/check/build/skeleton.png +0 -0
  298. package/templates/example-chain/derived/drafts/chain/out/images/background.png +0 -0
  299. package/templates/example-chain/derived/drafts/chain/out/images/eye_l.png +0 -0
  300. package/templates/example-chain/derived/drafts/chain/out/images/eye_r.png +0 -0
  301. package/templates/example-chain/derived/drafts/chain/out/images/face.png +0 -0
  302. package/templates/example-chain/derived/drafts/chain/out/images/lantern.png +0 -0
  303. package/templates/example-chain/derived/drafts/chain/out/images/torso.png +0 -0
  304. package/templates/example-chain/derived/drafts/chain/out/mesh_report.json +15 -0
  305. package/templates/example-chain/derived/drafts/chain/out/motion.json +137 -0
  306. package/templates/example-chain/derived/drafts/chain/out/rig.json +536 -0
  307. package/templates/example-chain/derived/drafts/chain/out/run.json +52 -0
  308. package/templates/example-chain/derived/review/v1/config.json +88 -0
  309. package/templates/example-chain/derived/review/v1/interview-requirements.json +8 -0
  310. package/templates/example-chain/derived/review/v1/out/check/build/run.json +40 -0
  311. package/templates/example-chain/derived/review/v1/out/check/build/skeleton.atlas +28 -0
  312. package/templates/example-chain/derived/review/v1/out/check/build/skeleton.json +674 -0
  313. package/templates/example-chain/derived/review/v1/out/check/build/skeleton.model.json +1072 -0
  314. package/templates/example-chain/derived/review/v1/out/check/build/skeleton.png +0 -0
  315. package/templates/example-chain/derived/review/v1/out/parts/background.png +0 -0
  316. package/templates/example-chain/derived/review/v1/out/parts/eye_l.png +0 -0
  317. package/templates/example-chain/derived/review/v1/out/parts/eye_r.png +0 -0
  318. package/templates/example-chain/derived/review/v1/out/parts/face.png +0 -0
  319. package/templates/example-chain/derived/review/v1/out/parts/lantern.png +0 -0
  320. package/templates/example-chain/derived/review/v1/out/parts/torso.png +0 -0
  321. package/templates/example-chain/derived/review/v1/out/parts.json +188 -0
  322. package/templates/example-chain/derived/review/v1/out/rig/images/background.png +0 -0
  323. package/templates/example-chain/derived/review/v1/out/rig/images/eye_l.png +0 -0
  324. package/templates/example-chain/derived/review/v1/out/rig/images/eye_r.png +0 -0
  325. package/templates/example-chain/derived/review/v1/out/rig/images/face.png +0 -0
  326. package/templates/example-chain/derived/review/v1/out/rig/images/lantern.png +0 -0
  327. package/templates/example-chain/derived/review/v1/out/rig/images/torso.png +0 -0
  328. package/templates/example-chain/derived/review/v1/out/rig/mesh_report.json +15 -0
  329. package/templates/example-chain/derived/review/v1/out/rig/motion.json +137 -0
  330. package/templates/example-chain/derived/review/v1/out/rig/rig.json +536 -0
  331. package/templates/example-chain/derived/review/v1/out/rig/run.json +52 -0
  332. package/templates/example-chain/evidence/captions.json +1 -1
  333. package/templates/example-chain/evidence/direction/v2.json +1 -1
  334. package/templates/example-chain/evidence/direction-input.json +1 -1
  335. package/templates/example-chain/evidence/interview/camera_depth.json +2 -2
  336. package/templates/example-chain/evidence/interview/motion.json +1 -1
  337. package/templates/example-chain/evidence/interview/post_composition.json +2 -2
  338. package/templates/example-chain/evidence/interview/post_timing.json +2 -2
  339. package/templates/example-chain/evidence/interview/turn.json +108 -0
  340. package/templates/example-chain/evidence/scene/s1.json +2 -2
  341. package/templates/example-chain/outputs/v1/out/check/build/run.json +40 -0
  342. package/templates/example-chain/outputs/v1/out/check/build/skeleton.atlas +28 -0
  343. package/templates/example-chain/outputs/v1/out/check/build/skeleton.json +674 -0
  344. package/templates/example-chain/outputs/v1/out/check/build/skeleton.model.json +1072 -0
  345. package/templates/example-chain/outputs/v1/out/check/build/skeleton.png +0 -0
  346. package/templates/example-chain/outputs/v1/out/painting_in_rig.png +0 -0
  347. package/templates/example-chain/outputs/v1/out/parts/background.png +0 -0
  348. package/templates/example-chain/outputs/v1/out/parts/eye_l.png +0 -0
  349. package/templates/example-chain/outputs/v1/out/parts/eye_r.png +0 -0
  350. package/templates/example-chain/outputs/v1/out/parts/face.png +0 -0
  351. package/templates/example-chain/outputs/v1/out/parts/lantern.png +0 -0
  352. package/templates/example-chain/outputs/v1/out/parts/torso.png +0 -0
  353. package/templates/example-chain/outputs/v1/out/parts.json +188 -0
  354. package/templates/example-chain/outputs/v1/out/rig/images/background.png +0 -0
  355. package/templates/example-chain/outputs/v1/out/rig/images/eye_l.png +0 -0
  356. package/templates/example-chain/outputs/v1/out/rig/images/eye_r.png +0 -0
  357. package/templates/example-chain/outputs/v1/out/rig/images/face.png +0 -0
  358. package/templates/example-chain/outputs/v1/out/rig/images/lantern.png +0 -0
  359. package/templates/example-chain/outputs/v1/out/rig/images/torso.png +0 -0
  360. package/templates/example-chain/outputs/v1/out/rig/mesh_report.json +15 -0
  361. package/templates/example-chain/outputs/v1/out/rig/motion.json +137 -0
  362. package/templates/example-chain/outputs/v1/out/rig/rig.json +536 -0
  363. package/templates/example-chain/outputs/v1/out/rig/run.json +52 -0
  364. package/templates/example-chain/project.json +127 -78
  365. package/templates/example-direction/derived/review/v1/out/check/build/run.json +2 -2
  366. package/templates/example-draft/derived/drafts/lantern/out/check/build/run.json +2 -2
  367. package/templates/example-draft/derived/drafts/lantern/out/run.json +2 -2
  368. package/templates/example-draft/derived/review/v1/out/check/build/run.json +2 -2
  369. package/templates/example-draft/derived/review/v1/out/rig/run.json +2 -2
  370. package/templates/example-draft/derived/review/v2/out/check/build/run.json +2 -2
  371. package/templates/example-draft/derived/review/v2/out/rig/run.json +2 -2
  372. package/templates/example-draft/evidence/direction/v4.json +3 -3
  373. package/templates/example-draft/evidence/direction-input-v4.json +3 -3
  374. package/templates/example-draft/evidence/parts-review.json +1 -1
  375. package/templates/example-draft/evidence/review-reads/{52673b635b9cbc92da1a9e3d4c023a249bbacf79cd21b59724f03f18f8caf09b.json → 8866887a00012b5d5944b7525a478aea70931935bff35ddfcb186ffc515ef5af.json} +2 -2
  376. package/templates/example-draft/evidence/scene/s1.json +3 -3
  377. package/templates/example-draft/evidence/scene-citations.json +1 -1
  378. package/templates/example-draft/out/check/build/run.json +2 -2
  379. package/templates/example-draft/out/run.json +2 -2
  380. package/templates/example-draft/outputs/v1/out/check/build/run.json +2 -2
  381. package/templates/example-draft/outputs/v1/out/rig/run.json +2 -2
  382. package/templates/example-draft/outputs/v2/out/check/build/run.json +2 -2
  383. package/templates/example-draft/outputs/v2/out/rig/run.json +2 -2
  384. package/templates/example-interview-choice.json +113 -68
  385. package/templates/example-interview-options/constraint.json +2 -2
  386. package/templates/example-interview-options/example-assemble.json +2 -2
  387. package/templates/example-interview-options/example-bones.json +5 -5
  388. package/templates/example-interview-options/example-camera-depth.json +3 -3
  389. package/templates/example-interview-options/example-constraints.json +5 -5
  390. package/templates/example-interview-options/example-meshes.json +5 -5
  391. package/templates/example-interview-options/example-motion.json +5 -5
  392. package/templates/example-interview-options/example-picks.json +2 -2
  393. package/templates/example-interview-options/example-post-composition.json +3 -3
  394. package/templates/example-interview-options/example-post-timing.json +3 -3
  395. package/templates/example-interview-options/example-reference.json +2 -2
  396. package/templates/example-interview-options/example-rig-type.json +2 -2
  397. package/templates/example-interview-options/example-seethrough.json +2 -2
  398. package/templates/example-interview-options/example-turn.json +108 -0
  399. package/templates/example-interview-options/fullscreen.json +2 -2
  400. package/templates/example-interview-options/other-explicit.json +2 -2
  401. package/templates/example-interview-options/other-pending.json +2 -2
  402. package/templates/example-interview-options/other-picks.json +2 -2
  403. package/templates/example-invariants/invariants.json +223 -164
  404. package/templates/example-project.json +301 -249
  405. package/templates/example-remesh/.gitignore +6 -0
  406. package/templates/example-remesh/.npmignore +1 -0
  407. package/templates/example-remesh/AGENT-REFERENCE.md +62 -0
  408. package/templates/example-remesh/AGENTS.md +4 -26
  409. package/templates/example-remesh/derived/drafts/remesh/config.json +88 -0
  410. package/templates/example-remesh/derived/drafts/remesh/input/painting_in_rig.png +0 -0
  411. package/templates/example-remesh/derived/drafts/remesh/input/parts/background.png +0 -0
  412. package/templates/example-remesh/derived/drafts/remesh/input/parts/eye_l.png +0 -0
  413. package/templates/example-remesh/derived/drafts/remesh/input/parts/eye_r.png +0 -0
  414. package/templates/example-remesh/derived/drafts/remesh/input/parts/face.png +0 -0
  415. package/templates/example-remesh/derived/drafts/remesh/input/parts/lantern.png +0 -0
  416. package/templates/example-remesh/derived/drafts/remesh/input/parts/torso.png +0 -0
  417. package/templates/example-remesh/derived/drafts/remesh/input/parts.json +188 -0
  418. package/templates/example-remesh/derived/drafts/remesh/input/recomposite_rig.png +0 -0
  419. package/templates/example-remesh/derived/drafts/remesh/interview-requirements.json +8 -0
  420. package/templates/example-remesh/derived/drafts/remesh/out/check/build/run.json +40 -0
  421. package/templates/example-remesh/derived/drafts/remesh/out/check/build/skeleton.atlas +28 -0
  422. package/templates/example-remesh/derived/drafts/remesh/out/check/build/skeleton.json +674 -0
  423. package/templates/example-remesh/derived/drafts/remesh/out/check/build/skeleton.model.json +1072 -0
  424. package/templates/example-remesh/derived/drafts/remesh/out/check/build/skeleton.png +0 -0
  425. package/templates/example-remesh/derived/drafts/remesh/out/images/background.png +0 -0
  426. package/templates/example-remesh/derived/drafts/remesh/out/images/eye_l.png +0 -0
  427. package/templates/example-remesh/derived/drafts/remesh/out/images/eye_r.png +0 -0
  428. package/templates/example-remesh/derived/drafts/remesh/out/images/face.png +0 -0
  429. package/templates/example-remesh/derived/drafts/remesh/out/images/lantern.png +0 -0
  430. package/templates/example-remesh/derived/drafts/remesh/out/images/torso.png +0 -0
  431. package/templates/example-remesh/derived/drafts/remesh/out/mesh_report.json +15 -0
  432. package/templates/example-remesh/derived/drafts/remesh/out/motion.json +137 -0
  433. package/templates/example-remesh/derived/drafts/remesh/out/rig.json +536 -0
  434. package/templates/example-remesh/derived/drafts/remesh/out/run.json +52 -0
  435. package/templates/example-remesh/derived/review/v1/config.json +88 -0
  436. package/templates/example-remesh/derived/review/v1/interview-requirements.json +8 -0
  437. package/templates/example-remesh/derived/review/v1/out/check/build/run.json +44 -0
  438. package/templates/example-remesh/derived/review/v1/out/check/build/skeleton.atlas +28 -0
  439. package/templates/example-remesh/derived/review/v1/out/check/build/skeleton.json +674 -0
  440. package/templates/example-remesh/derived/review/v1/out/check/build/skeleton.model.json +1072 -0
  441. package/templates/example-remesh/derived/review/v1/out/check/build/skeleton.png +0 -0
  442. package/templates/example-remesh/derived/review/v1/out/painting_in_rig.png +0 -0
  443. package/templates/example-remesh/derived/review/v1/out/parts/background.png +0 -0
  444. package/templates/example-remesh/derived/review/v1/out/parts/eye_l.png +0 -0
  445. package/templates/example-remesh/derived/review/v1/out/parts/eye_r.png +0 -0
  446. package/templates/example-remesh/derived/review/v1/out/parts/face.png +0 -0
  447. package/templates/example-remesh/derived/review/v1/out/parts/lantern.png +0 -0
  448. package/templates/example-remesh/derived/review/v1/out/parts/torso.png +0 -0
  449. package/templates/example-remesh/derived/review/v1/out/parts.json +188 -0
  450. package/templates/example-remesh/derived/review/v1/out/rig/images/background.png +0 -0
  451. package/templates/example-remesh/derived/review/v1/out/rig/images/eye_l.png +0 -0
  452. package/templates/example-remesh/derived/review/v1/out/rig/images/eye_r.png +0 -0
  453. package/templates/example-remesh/derived/review/v1/out/rig/images/face.png +0 -0
  454. package/templates/example-remesh/derived/review/v1/out/rig/images/lantern.png +0 -0
  455. package/templates/example-remesh/derived/review/v1/out/rig/images/torso.png +0 -0
  456. package/templates/example-remesh/derived/review/v1/out/rig/mesh_report.json +15 -0
  457. package/templates/example-remesh/derived/review/v1/out/rig/motion.json +137 -0
  458. package/templates/example-remesh/derived/review/v1/out/rig/rig.json +536 -0
  459. package/templates/example-remesh/derived/review/v1/out/rig/run.json +52 -0
  460. package/templates/example-remesh/derived/review/v2/config.json +88 -0
  461. package/templates/example-remesh/derived/review/v2/interview-requirements.json +8 -0
  462. package/templates/example-remesh/derived/review/v2/out/check/build/run.json +44 -0
  463. package/templates/example-remesh/derived/review/v2/out/check/build/skeleton.atlas +28 -0
  464. package/templates/example-remesh/derived/review/v2/out/check/build/skeleton.json +674 -0
  465. package/templates/example-remesh/derived/review/v2/out/check/build/skeleton.model.json +1072 -0
  466. package/templates/example-remesh/derived/review/v2/out/check/build/skeleton.png +0 -0
  467. package/templates/example-remesh/derived/review/v2/out/painting_in_rig.png +0 -0
  468. package/templates/example-remesh/derived/review/v2/out/parts/background.png +0 -0
  469. package/templates/example-remesh/derived/review/v2/out/parts/eye_l.png +0 -0
  470. package/templates/example-remesh/derived/review/v2/out/parts/eye_r.png +0 -0
  471. package/templates/example-remesh/derived/review/v2/out/parts/face.png +0 -0
  472. package/templates/example-remesh/derived/review/v2/out/parts/lantern.png +0 -0
  473. package/templates/example-remesh/derived/review/v2/out/parts/torso.png +0 -0
  474. package/templates/example-remesh/derived/review/v2/out/parts.json +188 -0
  475. package/templates/example-remesh/derived/review/v2/out/rig/images/background.png +0 -0
  476. package/templates/example-remesh/derived/review/v2/out/rig/images/eye_l.png +0 -0
  477. package/templates/example-remesh/derived/review/v2/out/rig/images/eye_r.png +0 -0
  478. package/templates/example-remesh/derived/review/v2/out/rig/images/face.png +0 -0
  479. package/templates/example-remesh/derived/review/v2/out/rig/images/lantern.png +0 -0
  480. package/templates/example-remesh/derived/review/v2/out/rig/images/torso.png +0 -0
  481. package/templates/example-remesh/derived/review/v2/out/rig/mesh_report.json +15 -0
  482. package/templates/example-remesh/derived/review/v2/out/rig/motion.json +137 -0
  483. package/templates/example-remesh/derived/review/v2/out/rig/rig.json +536 -0
  484. package/templates/example-remesh/derived/review/v2/out/rig/run.json +52 -0
  485. package/templates/example-remesh/derived/review/v3/config.json +88 -0
  486. package/templates/example-remesh/derived/review/v3/interview-requirements.json +8 -0
  487. package/templates/example-remesh/derived/review/v3/out/check/build/run.json +44 -0
  488. package/templates/example-remesh/derived/review/v3/out/check/build/skeleton.atlas +28 -0
  489. package/templates/example-remesh/derived/review/v3/out/check/build/skeleton.json +674 -0
  490. package/templates/example-remesh/derived/review/v3/out/check/build/skeleton.model.json +1072 -0
  491. package/templates/example-remesh/derived/review/v3/out/check/build/skeleton.png +0 -0
  492. package/templates/example-remesh/derived/review/v3/out/painting_in_rig.png +0 -0
  493. package/templates/example-remesh/derived/review/v3/out/parts/background.png +0 -0
  494. package/templates/example-remesh/derived/review/v3/out/parts/eye_l.png +0 -0
  495. package/templates/example-remesh/derived/review/v3/out/parts/eye_r.png +0 -0
  496. package/templates/example-remesh/derived/review/v3/out/parts/face.png +0 -0
  497. package/templates/example-remesh/derived/review/v3/out/parts/lantern.png +0 -0
  498. package/templates/example-remesh/derived/review/v3/out/parts/torso.png +0 -0
  499. package/templates/example-remesh/derived/review/v3/out/parts.json +188 -0
  500. package/templates/example-remesh/derived/review/v3/out/rig/images/background.png +0 -0
  501. package/templates/example-remesh/derived/review/v3/out/rig/images/eye_l.png +0 -0
  502. package/templates/example-remesh/derived/review/v3/out/rig/images/eye_r.png +0 -0
  503. package/templates/example-remesh/derived/review/v3/out/rig/images/face.png +0 -0
  504. package/templates/example-remesh/derived/review/v3/out/rig/images/lantern.png +0 -0
  505. package/templates/example-remesh/derived/review/v3/out/rig/images/torso.png +0 -0
  506. package/templates/example-remesh/derived/review/v3/out/rig/mesh_report.json +15 -0
  507. package/templates/example-remesh/derived/review/v3/out/rig/motion.json +137 -0
  508. package/templates/example-remesh/derived/review/v3/out/rig/rig.json +536 -0
  509. package/templates/example-remesh/derived/review/v3/out/rig/run.json +52 -0
  510. package/templates/example-remesh/evidence/captions.json +1 -1
  511. package/templates/example-remesh/evidence/direction/v4.json +1 -1
  512. package/templates/example-remesh/evidence/direction/v5.json +1 -1
  513. package/templates/example-remesh/evidence/direction-input-v4.json +1 -1
  514. package/templates/example-remesh/evidence/direction-input-v5.json +1 -1
  515. package/templates/example-remesh/evidence/interview/assemble.json +1 -1
  516. package/templates/example-remesh/evidence/interview/bones.json +4 -4
  517. package/templates/example-remesh/evidence/interview/camera_depth.json +2 -2
  518. package/templates/example-remesh/evidence/interview/constraints.json +4 -4
  519. package/templates/example-remesh/evidence/interview/meshes.json +4 -4
  520. package/templates/example-remesh/evidence/interview/motion.json +4 -4
  521. package/templates/example-remesh/evidence/interview/post_composition.json +2 -2
  522. package/templates/example-remesh/evidence/interview/post_timing.json +2 -2
  523. package/templates/example-remesh/evidence/interview/reference.json +1 -1
  524. package/templates/example-remesh/evidence/interview/rig_type.json +1 -1
  525. package/templates/example-remesh/evidence/interview/seethrough.json +1 -1
  526. package/templates/example-remesh/evidence/interview/turn.json +108 -0
  527. package/templates/example-remesh/evidence/parts-review.json +1 -1
  528. package/templates/example-remesh/evidence/review-reads/{afe2522be4087f7f2fa7e97746d5f8574b0aedb474245ce2dbce0455e662f041.json → 99ade3eb19d70bd5f727138b3b4876ce86f1e1c22a59b516639bf85593996c32.json} +2 -2
  529. package/templates/example-remesh/evidence/scene/s1.json +2 -2
  530. package/templates/example-remesh/evidence/v1/registration/at-source.json +2 -2
  531. package/templates/example-remesh/evidence/v1/registration/rigc-run-1.json +2 -2
  532. package/templates/example-remesh/evidence/v2/registration/at-source.json +2 -2
  533. package/templates/example-remesh/evidence/v2/registration/rigc-run-1.json +2 -2
  534. package/templates/example-remesh/evidence/v3/registration/at-source.json +2 -2
  535. package/templates/example-remesh/evidence/v3/registration/rigc-run-1.json +2 -2
  536. package/templates/example-remesh/outputs/v1/idle/frames.json +29 -0
  537. package/templates/example-remesh/outputs/v1/idle/idle@1fps/contact.png +0 -0
  538. package/templates/example-remesh/outputs/v1/idle/idle@1fps/f0000.png +0 -0
  539. package/templates/example-remesh/outputs/v1/idle/idle@1fps/f0001.png +0 -0
  540. package/templates/example-remesh/outputs/v1/idle/idle@1fps/f0002.png +0 -0
  541. package/templates/example-remesh/outputs/v1/idle/idle@1fps/f0003.png +0 -0
  542. package/templates/example-remesh/outputs/v1/idle/idle@1fps/f0004.png +0 -0
  543. package/templates/example-remesh/outputs/v1/out/check/build/run.json +44 -0
  544. package/templates/example-remesh/outputs/v1/out/check/build/skeleton.atlas +28 -0
  545. package/templates/example-remesh/outputs/v1/out/check/build/skeleton.json +674 -0
  546. package/templates/example-remesh/outputs/v1/out/check/build/skeleton.model.json +1072 -0
  547. package/templates/example-remesh/outputs/v1/out/check/build/skeleton.png +0 -0
  548. package/templates/example-remesh/outputs/v1/out/painting_in_rig.png +0 -0
  549. package/templates/example-remesh/outputs/v1/out/parts/background.png +0 -0
  550. package/templates/example-remesh/outputs/v1/out/parts/eye_l.png +0 -0
  551. package/templates/example-remesh/outputs/v1/out/parts/eye_r.png +0 -0
  552. package/templates/example-remesh/outputs/v1/out/parts/face.png +0 -0
  553. package/templates/example-remesh/outputs/v1/out/parts/lantern.png +0 -0
  554. package/templates/example-remesh/outputs/v1/out/parts/torso.png +0 -0
  555. package/templates/example-remesh/outputs/v1/out/parts.json +188 -0
  556. package/templates/example-remesh/outputs/v1/out/rig/images/background.png +0 -0
  557. package/templates/example-remesh/outputs/v1/out/rig/images/eye_l.png +0 -0
  558. package/templates/example-remesh/outputs/v1/out/rig/images/eye_r.png +0 -0
  559. package/templates/example-remesh/outputs/v1/out/rig/images/face.png +0 -0
  560. package/templates/example-remesh/outputs/v1/out/rig/images/lantern.png +0 -0
  561. package/templates/example-remesh/outputs/v1/out/rig/images/torso.png +0 -0
  562. package/templates/example-remesh/outputs/v1/out/rig/mesh_report.json +15 -0
  563. package/templates/example-remesh/outputs/v1/out/rig/motion.json +137 -0
  564. package/templates/example-remesh/outputs/v1/out/rig/rig.json +536 -0
  565. package/templates/example-remesh/outputs/v1/out/rig/run.json +52 -0
  566. package/templates/example-remesh/outputs/v2/idle/frames.json +29 -0
  567. package/templates/example-remesh/outputs/v2/idle/idle@1fps/contact.png +0 -0
  568. package/templates/example-remesh/outputs/v2/idle/idle@1fps/f0000.png +0 -0
  569. package/templates/example-remesh/outputs/v2/idle/idle@1fps/f0001.png +0 -0
  570. package/templates/example-remesh/outputs/v2/idle/idle@1fps/f0002.png +0 -0
  571. package/templates/example-remesh/outputs/v2/idle/idle@1fps/f0003.png +0 -0
  572. package/templates/example-remesh/outputs/v2/idle/idle@1fps/f0004.png +0 -0
  573. package/templates/example-remesh/outputs/v2/out/check/build/run.json +44 -0
  574. package/templates/example-remesh/outputs/v2/out/check/build/skeleton.atlas +28 -0
  575. package/templates/example-remesh/outputs/v2/out/check/build/skeleton.json +674 -0
  576. package/templates/example-remesh/outputs/v2/out/check/build/skeleton.model.json +1072 -0
  577. package/templates/example-remesh/outputs/v2/out/check/build/skeleton.png +0 -0
  578. package/templates/example-remesh/outputs/v2/out/painting_in_rig.png +0 -0
  579. package/templates/example-remesh/outputs/v2/out/parts/background.png +0 -0
  580. package/templates/example-remesh/outputs/v2/out/parts/eye_l.png +0 -0
  581. package/templates/example-remesh/outputs/v2/out/parts/eye_r.png +0 -0
  582. package/templates/example-remesh/outputs/v2/out/parts/face.png +0 -0
  583. package/templates/example-remesh/outputs/v2/out/parts/lantern.png +0 -0
  584. package/templates/example-remesh/outputs/v2/out/parts/torso.png +0 -0
  585. package/templates/example-remesh/outputs/v2/out/parts.json +188 -0
  586. package/templates/example-remesh/outputs/v2/out/rig/images/background.png +0 -0
  587. package/templates/example-remesh/outputs/v2/out/rig/images/eye_l.png +0 -0
  588. package/templates/example-remesh/outputs/v2/out/rig/images/eye_r.png +0 -0
  589. package/templates/example-remesh/outputs/v2/out/rig/images/face.png +0 -0
  590. package/templates/example-remesh/outputs/v2/out/rig/images/lantern.png +0 -0
  591. package/templates/example-remesh/outputs/v2/out/rig/images/torso.png +0 -0
  592. package/templates/example-remesh/outputs/v2/out/rig/mesh_report.json +15 -0
  593. package/templates/example-remesh/outputs/v2/out/rig/motion.json +137 -0
  594. package/templates/example-remesh/outputs/v2/out/rig/rig.json +536 -0
  595. package/templates/example-remesh/outputs/v2/out/rig/run.json +52 -0
  596. package/templates/example-remesh/outputs/v3/idle/frames.json +29 -0
  597. package/templates/example-remesh/outputs/v3/idle/idle@1fps/contact.png +0 -0
  598. package/templates/example-remesh/outputs/v3/idle/idle@1fps/f0000.png +0 -0
  599. package/templates/example-remesh/outputs/v3/idle/idle@1fps/f0001.png +0 -0
  600. package/templates/example-remesh/outputs/v3/idle/idle@1fps/f0002.png +0 -0
  601. package/templates/example-remesh/outputs/v3/idle/idle@1fps/f0003.png +0 -0
  602. package/templates/example-remesh/outputs/v3/idle/idle@1fps/f0004.png +0 -0
  603. package/templates/example-remesh/outputs/v3/out/check/build/run.json +44 -0
  604. package/templates/example-remesh/outputs/v3/out/check/build/skeleton.atlas +28 -0
  605. package/templates/example-remesh/outputs/v3/out/check/build/skeleton.json +674 -0
  606. package/templates/example-remesh/outputs/v3/out/check/build/skeleton.model.json +1072 -0
  607. package/templates/example-remesh/outputs/v3/out/check/build/skeleton.png +0 -0
  608. package/templates/example-remesh/outputs/v3/out/painting_in_rig.png +0 -0
  609. package/templates/example-remesh/outputs/v3/out/parts/background.png +0 -0
  610. package/templates/example-remesh/outputs/v3/out/parts/eye_l.png +0 -0
  611. package/templates/example-remesh/outputs/v3/out/parts/eye_r.png +0 -0
  612. package/templates/example-remesh/outputs/v3/out/parts/face.png +0 -0
  613. package/templates/example-remesh/outputs/v3/out/parts/lantern.png +0 -0
  614. package/templates/example-remesh/outputs/v3/out/parts/torso.png +0 -0
  615. package/templates/example-remesh/outputs/v3/out/parts.json +188 -0
  616. package/templates/example-remesh/outputs/v3/out/rig/images/background.png +0 -0
  617. package/templates/example-remesh/outputs/v3/out/rig/images/eye_l.png +0 -0
  618. package/templates/example-remesh/outputs/v3/out/rig/images/eye_r.png +0 -0
  619. package/templates/example-remesh/outputs/v3/out/rig/images/face.png +0 -0
  620. package/templates/example-remesh/outputs/v3/out/rig/images/lantern.png +0 -0
  621. package/templates/example-remesh/outputs/v3/out/rig/images/torso.png +0 -0
  622. package/templates/example-remesh/outputs/v3/out/rig/mesh_report.json +15 -0
  623. package/templates/example-remesh/outputs/v3/out/rig/motion.json +137 -0
  624. package/templates/example-remesh/outputs/v3/out/rig/rig.json +536 -0
  625. package/templates/example-remesh/outputs/v3/out/rig/run.json +52 -0
  626. package/templates/example-remesh/project.json +279 -230
  627. package/templates/example-reopened/project.json +341 -289
  628. package/templates/example-split/captions.json +1 -1
  629. package/templates/project.json +10 -2
package/README.md CHANGED
@@ -117,11 +117,11 @@ selects either a rig or a post version.
117
117
  `--by` sign-off/review and `interview-answer --pick` are low-level interfaces for
118
118
  people operating the CLI themselves and synthetic fixtures, not an agent route
119
119
  for human acts. Agents must not type an owner's answer or signature, or request
120
- one in chat in place of Review. Until create#493, an agent may type `reopen` only
121
- using a Review host raw export `act@4`: save its nonempty `value.words`
122
- byte-for-byte to the `--verbatim-file` and name `actId` with `--source`.
123
- Empty/missing words are a STOP; the agent never supplies words. `job fetch-act`
124
- rejects `act@4`; use the host raw export. See [the live Review flow](docs/LIVE-REVIEW.md)
120
+ one in chat in place of Review. After an accepted post is bounced, host
121
+ `job open --plan` for its single direction-review reopen, list the act with
122
+ `job acts --json`, then ingest `reopen direction-review --from-review <actId>`
123
+ and `job close`. The exported act supplies the reviewer, timestamp and unchanged
124
+ words. Other stages retain the direct human `--by`/`--verbatim-file` reopen route. See [the live Review flow](docs/LIVE-REVIEW.md)
125
125
  and [the record contract](docs/PROJECT.md#recording-a-sign-off).
126
126
 
127
127
  ## The clock
@@ -163,6 +163,22 @@ it fails, naming the constant, when a `*_SINCE` date is still in the future.
163
163
  are synthetic fixture records, not a person's approval
164
164
  ([why](templates/example-draft/README.md)).
165
165
 
166
+ ## Verify the installed examples
167
+
168
+ From a consumer project with `@rig-c/create` installed, run:
169
+
170
+ ```sh
171
+ bun node_modules/@rig-c/create/scripts/verify-example-seals.ts
172
+ ```
173
+
174
+ The shipped, dependency-free script verifies every `files[]` entry and
175
+ `project_sha256` in the six example-chain checkpoint manifests (currently
176
+ 319 checks). It names missing files and hash mismatches and exits nonzero.
177
+ It reads installed bytes only; it does not regenerate examples or run producers.
178
+ The CLI creates projects from empty templates; it does not copy worked examples.
179
+
180
+ See [release candidate verification](https://github.com/rig-c/create/blob/main/RELEASING.md#verify-the-release-candidate).
181
+
166
182
  ## Licence
167
183
 
168
184
  [MIT](LICENSE).
@@ -0,0 +1,62 @@
1
+ # Agent reference
2
+
3
+ ## Before you ask, plan or show
4
+
5
+ - **Projection.** Ask and record it per [CHECKS.md § Projection and ground](https://github.com/rig-c/create/blob/main/docs/CHECKS.md#projection-and-ground).
6
+ - **Head turn is a rig decision.** Ask `turn` at rigging-interview: fixed view
7
+ or head turn with depth. Record the chosen route and reason in the `turn`
8
+ plan step text. Default to per-part depth: parts 2.37.0's `docs/DEPTH.md`
9
+ describes it as better by eye. Run `depth-prepare`, the supplied model,
10
+ `depth-apply`, then `rig`. Retain the prepare manifest with
11
+ `rig-version --depth-manifest`; registration binds it, `depth-report.json`
12
+ and rig's `depth_sheets.json` by SHA-256.
13
+ The layer alternative requires sheets already retained in the accepted
14
+ assembled parts, bound alongside the existing `config.depth` images:
15
+ `assemble` consumes `config.depth`, so declaring it after acceptance cannot
16
+ add sheets. Do not reassemble accepted parts here. Existing sheets need no
17
+ model manifest.
18
+ - **Camera options.** Post decides fixed framing or camera-box moves. Timed
19
+ head-turn dials, plate parallax and take-wide gaze remain unavailable in direction.
20
+ - **Seamless loop on a rig with physics.** A looping take that starts at
21
+ source 0 begins with springs at rest and ends with them moving, so hair and
22
+ ribbons jump at the seam. Map the take onto a source interval that starts
23
+ after whole periods of the clip; ten were enough on the measured rig. The
24
+ number depends on the rig's damping, so compare the first and last frames
25
+ before choosing it.
26
+ - **Upscale first** a painting smaller than the rig needs (SOURCE.md, step 2 below).
27
+ - **The crux is a bar.** Before rigging, name every risk band, count background
28
+ or doubled pixels over every frame and both physics/breath extremes, and
29
+ report the maximum and its frame. Cover every band crossing another bone.
30
+ - **Appearance needs a person**, not a step bar: [CHECKS.md § Appearance bar wording](https://github.com/rig-c/create/blob/main/docs/CHECKS.md#appearance-bar-wording).
31
+ - **Nothing unnamed.** Add no unnamed motion, chain or physics. Read references
32
+ for what they show; ask about anything more.
33
+ - **Re-run first, cut last**, never a polygon in code or config: the ladder in
34
+ SOURCE.md, step 2 below.
35
+ - **A full-screen scene is a CG build.** For `rig_type` `fullscreen.*`, each
36
+ rig version declares the gates in [CHECKS.md § CG gates](https://github.com/rig-c/create/blob/main/docs/CHECKS.md#cg-gates). Refusals are the art's to fix.
37
+ - **The bust is meshed** unless the `meshes` guide excludes it with a reason
38
+ ([CHECKS.md § The bust at meshes](https://github.com/rig-c/create/blob/main/docs/CHECKS.md#the-bust-at-meshes)).
39
+ - **Overlaps.** A piece over a part with its own animation (glasses over
40
+ eyelids) holds none of that part's pixels, or the animation shows its copy.
41
+ - **Pairs.** Measure left/right symmetry against the painting before calling a
42
+ pair uneven ([CRAFT.md G8](https://github.com/rig-c/create/blob/main/docs/CRAFT.md#for-the-gates-not-the-interview)).
43
+ - **Look before the user does**, at native resolution and every crux boundary:
44
+ a whole-figure |composite − painting| map, each component by box/part and
45
+ status (in the painting / fixed / left, why). Use the true part stack; crop on
46
+ white and mid-grey to show light fringes. Check beyond reviewer-chosen boxes.
47
+
48
+ ## What to read, and why
49
+
50
+ 1. **Before the interview**: INTERVIEW.md; CRAFT.md (waypoint defaults);
51
+ parts AUTHORING §3, *`config.json`, field by field*;
52
+ [CHECKS.md](https://github.com/rig-c/create/blob/main/docs/CHECKS.md) before a sign-off.
53
+ 2. **Before `seethrough` and `assemble`**: SOURCE.md, split/cut order:
54
+ [bad-split reruns](https://github.com/rig-c/create/blob/main/docs/SOURCE.md#re-run-first),
55
+ [allowed cuts](https://github.com/rig-c/create/blob/main/docs/SOURCE.md#where-a-cut-is-allowed);
56
+ parts AUTHORING *See-through head-run source reading*, *Source before
57
+ scissors* and *Limbs: cut at their joints*.
58
+ 3. **Before rigging**: [CRAFT.md § For the gates](https://github.com/rig-c/create/blob/main/docs/CRAFT.md#for-the-gates-not-the-interview)
59
+ (G1–G9); core RIGGING and MOTION; parts AUTHORING §7, the bars `check` enforces.
60
+ 4. **Before showing the user**: [LESSONS.md § The self-check](https://github.com/rig-c/create/blob/main/docs/LESSONS.md#the-self-check),
61
+ the [per-frame seam count](https://github.com/rig-c/create/blob/main/docs/LESSONS.md#count-the-seam-bar-over-every-frame),
62
+ [what to show first](https://github.com/rig-c/create/blob/main/docs/LESSONS.md#what-to-show-the-user-first).
package/docs/CHECKS.md CHANGED
@@ -25,6 +25,7 @@ requires Bun 1.4 or later. See [Live review](LIVE-REVIEW.md).
25
25
  | Code | Finding and remedy |
26
26
  | --- | --- |
27
27
  | `JOB_PUBLISH_PENDING` | A committed `project.json` result awaits publication. Restore its bound host and sources, then run `job reconcile` before another participating write or close. |
28
+ | `JOB_ROOT_REPLACED` | `project.json`: the managed Review state belongs to a replaced project directory, or its ownership/liveness cannot be established safely. Stop the original `job open` host in its terminal, then retry `job open` or `job reconcile`. With no pending publication or startup claim, both commands preserve the old state in a dated `.replaced-…` sibling only when its recorded PID is absent and its recorded loopback port refuses connections. Missing/unsafe metadata, an occupied port or uncertain liveness refuses without retiring state; restore the retained metadata or original directory before retrying. |
28
29
  | `JOB_HOST_ATTACH_REFUSED` | Strict reuse-only attach to the bound live host was refused. The pending receipt names the host `reason` and `phase` (including `incarnation-missing` on `record` or `probe`). Reopen or restore the bound live host before reconciling. |
29
30
  | `JOB_HOST_REUSE_MISMATCH` | The private binding's host tuple or `listenerIncarnation` (`jobId`, `origin`, `listenerIncarnation`, `root`, `stateDir`, `fingerprint`, `reviewer.id`, `reviewer.role`, `readerId`, `bindingId`, `partsEnumeratorId`, `partsEnumeratorVersion`, `apiSchema`, `actSchema`, `port`) differs. The pending receipt names the `field` and both `expected` and `actual` values. Restore the original host configuration before reconciling. |
30
31
  | `JOB_PUBLICATION_STALE` | The pending version entry is missing or has a different entry hash. Restore that retained version and its files before reconciling. Later surrounding-record changes do not invalidate version publications. Exception: a record publication binds the whole project.json byte hash, so any record change while it is pending makes it stale; restore the bound record bytes before reconciling. The check preserves the receipt and names the HOLE. |
@@ -47,20 +48,20 @@ requires Bun 1.4 or later. See [Live review](LIVE-REVIEW.md).
47
48
  | Code | Finding and remedy |
48
49
  | --- | --- |
49
50
  | `REVIEW_API_SCHEMA_UNSUPPORTED` | `project.json.review_acts` received an unsupported API schema. Restore a live job using job-api@2 and fetch again. |
50
- | `REVIEW_ACT_SCHEMA_UNSUPPORTED` | `project.json.review_acts` received an unsupported act schema, explicitly including act@1. Request a new act@2 without migrating the old act. |
51
+ | `REVIEW_ACT_SCHEMA_UNSUPPORTED` | `project.json.review_acts` received an unsupported act schema, explicitly including act@1. Request a supported act from Review without migrating the old act; record reopen uses act@4. |
51
52
  | `REVIEW_PARTS_ENUMERATOR_UNSUPPORTED` | The act's Parts enumerator is missing or outside `>=2.25.0 <4.0.0`. Publish through an accepted installed Parts enumerator and review again. |
52
- | `REVIEW_ACT_INVALID` | The fetched/retained act, response identity, authority, date or rig/post or parts value is malformed. Restore the original act evidence or request a new act. |
53
- | `REVIEW_ACT_KIND_MISMATCH` | The act is for another version or a kind outside the requested review-verdict, parts-verdict, interview-picks, checkpoint or signoff writer, or a signoff act signs a stage other than the one `signoff <stage> --from-review` names. Use the matching version, stage and supported writer. |
53
+ | `REVIEW_ACT_INVALID` | The fetched/retained act, response identity, authority, date, rig/post or parts value, or record reopen value is malformed. Restore the original act evidence or request a new act. |
54
+ | `REVIEW_ACT_KIND_MISMATCH` | The act is for another version or a kind outside the requested review-verdict, parts-verdict, interview-picks, checkpoint, signoff or reopen writer, or a signoff/reopen act names a stage other than the requested writer stage. Use the matching version, stage and supported writer. |
54
55
  | `REVIEW_ACT_TARGET_MISMATCH` | `signoffs[].target.version`: a `rig-review` or `direction-review` signoff act is ingested with `signoff <stage> --from-review <actId>`, but its `source.selector` names no version of that stage's kind (`rig` for rig-review, `post` for direction-review), or `--version` names another version than the one the person approved. The signature's target is the version Review displayed, so drop `--version` or ask for the sign-off again in Review on the version to sign. Refusal preserves the project record. |
55
56
  | `REVIEW_ACT_DRAFT_MISMATCH` | `signoffs[].draft_id`: a `parts-review` signoff act is ingested with `signoff parts-review --from-review <actId>`, and its `source.selector` is a non-draft selector or names another draft than `--draft`. Drop `--draft` so the signature takes the draft from the act's `{ kind: 'draft', id }` selector, or ask for `parts-review` again in Review on the draft to sign. Refusal preserves the project record. |
56
57
  | `REVIEW_ACT_CHECKPOINT_MISMATCH` | `signoff <stage> --checkpoint <id> --from-review <actId>` fetched a checkpoint act whose `planStepId` is not `<id>`, or whose `checkpointId` differs from its `planStepId` (create publishes no checkpoint alias). Sign the checkpoint the act names, or ask Review for this one. Refusal preserves the project record. |
57
58
  | `REVIEW_ACT_CHECKPOINT_FAILED` | The fetched checkpoint act's outcome is `fail`. A failed checkpoint is feedback, never a sign-off: nothing is written. Fix the step from the act's words and ask for the checkpoint again in the live Review job. |
58
- | `REVIEW_ACT_SUBJECT_UNDECLARED` | `signoff <stage> --from-review <actId>` or `signoff <stage> --checkpoint <id> --from-review <actId>` fetched an act whose subject (`signoff` for its stage, or `checkpoint` for its checkpoint id) is not among the subjects create declared for the act's publication, as kept in the private acknowledged receipt. A package publication declares only the record's own signable stage and its enabled checkpoints (LIVE-REVIEW.md). Ask for the sign-off in Review on a publication made while the record can sign it. A receipt written before declarations were retained, or none (a clone), skips this comparison. Refusal preserves the project record. |
59
+ | `REVIEW_ACT_SUBJECT_UNDECLARED` | `signoff <stage> --from-review <actId>` or `signoff <stage> --checkpoint <id> --from-review <actId>` or `reopen <stage> --from-review <actId>` fetched an act whose subject (`signoff` for its stage, `checkpoint` for its checkpoint id, or `reopen` for its stage) is not among the subjects create declared for the act's publication, as kept in the private acknowledged receipt. A package publication declares only the record's own signable stage and its enabled checkpoints (LIVE-REVIEW.md). Ask for the sign-off in Review on a publication made while the record can sign it. A receipt written before declarations were retained, or none (a clone), skips this comparison. Refusal preserves the project record. |
59
60
  | `REVIEW_FILE_ROUTE_REMOVED` | `project.json.review_acts` cannot ingest saved act files (exit 2). Use `review <version> --from-review <actId>` through the live Review job API. |
60
61
  | `REVIEW_ACT_FETCH_REFUSED` | The live job refused or could not complete finalized-act fetch. The diagnostic retains the producer refusal code without exposing its private details. Restore the live job and its writer grant. |
61
62
  | `REVIEW_ACT_SOURCE_STALE` | A current source binding or retained version/draft-entry identity differs from the displayed act, including a plan-bound signoff act (`plan-approved`, `rigging-interview`, `post-interview`) whose `source.plan` step ids and hashes, in order, differ from the current `plan.steps`. Restore the retained bytes or publish the current plan and request a new review or sign-off. Replays also refuse without changing the recorded verdict. |
62
63
  | `REVIEW_ACT_REPLAY_CONFLICT` | A `(jobId, actId)` appears twice or its immutable value changed. Restore the original receipt and its single linked verdict. |
63
- | `REVIEW_ACT_LEDGER_INVALID` | `review_acts[]` or one receipt's identity, hash, target, linked verdict, linked signoff (the one `signoffs[]` entry whose `source` names the act, with the act's stage, `by`, `at` and words, and for rig-review or direction-review a `target.version` equal to the act's `source.selector` version) or retained parts evidence is invalid. Restore the original receipt and verdict or signoff together. |
64
+ | `REVIEW_ACT_LEDGER_INVALID` | `review_acts[]` or one receipt's identity, hash, target, linked verdict, linked signoff (the one `signoffs[]` entry whose `source` names the act, with the act's stage, `by`, `at` and words, and for rig-review or direction-review a `target.version` equal to the act's `source.selector` version), linked reopen (including its original status snapshot and exact exported reviewer, date and words), or retained parts evidence is invalid. Restore the original receipt and recorded act together. |
64
65
  | `REVIEW_ACT_VERSION_UNVERIFIED` | WARN on ingest when the acknowledged publication receipt is unavailable. The version-entry comparison was skipped, and all explicit source bindings were checked. Preserve private acknowledged receipts for future ingests. |
65
66
  | `PARTS_REVIEW_OPTION_INVALID` | `project.json.review_acts` received missing, duplicate or competing parts-review options. Use `parts-review --from-review <actId>` and submit human values through Review. |
66
67
  | `PARTS_REVIEW_EVIDENCE_CONFLICT` | The deterministic semantic evidence path contains different bytes or unsafe filesystem entries. Preserve that evidence and restore the original act before retrying. Refusal preserves the project record. |
@@ -645,7 +646,7 @@ This new record has no retroactive requirement on earlier project records.
645
646
  | `REOPEN_STAGE_UNKNOWN` | a target is unknown, `paused` or `accepted` | choose a stage in the order that can be reopened |
646
647
  | `REOPEN_NOT_PASSED` | the target is later than its own from_stage and historical signatures/versions dated by the reopen | reopen a previously reached stage |
647
648
  | `REOPEN_MALFORMED` | reopens is not a list, an entry lacks its human signature, from_stage, valid date or status snapshot, source is not text, or the writer cannot identify a plan step | restore the named record to the PROJECT.md reopen shape |
648
- | `REOPEN_OPTION_INVALID` | missing/repeated option values or invalid argument count (exit 2) | supply a stage, --by, optional source and one optional folder |
649
+ | `REOPEN_OPTION_INVALID` | missing/repeated option values, invalid argument count, or --from-review mixed with human flags (exit 2) | supply a stage and either --from-review or --by with optional source and words file, plus one optional folder |
649
650
  | `SIGNOFF_NOT_HUMAN` | a reopen is signed by agent, case-insensitively | obtain a person's signature |
650
651
 
651
652
  The existing `UNKNOWN_OPTION`, `VERBATIM_*`, `PROJECT_JSON_*` and
@@ -738,7 +739,7 @@ are unchanged. No prepared files are silently registered or repaired.
738
739
  | `DERIVED_FILE_CHANGED` | either file's bytes differ from its recorded sha256 | restore the recorded bytes, or record the new preparation |
739
740
  | `AGENT_BOUNCE_MALFORMED` | a history entry dated on or after `AGENT_BOUNCE_SINCE` has a `bounce` other than `{ cause: "agent", failed, bar, replacement }` with non-empty text | write what failed, the bar, and its replacement |
740
741
 
741
- Contract dates (`AGENT_BOUNCE_SINCE`, `ASK_COVERAGE_SINCE`, `DIFF_MAP_SINCE`, `DIFF_MAP_AGENT_SINCE`, `APPLIED_REVIEW_SINCE`, `PROJECTION_ASKS_SINCE`, `SETUP_PAINTING_SINCE`, `FIGURE_MASK_SINCE`, `FIGURE_MASK_INPUTS_SINCE`, `CHOICE_ANSWERS_SINCE`, `BUILD_IDENTITY_SINCE`, `PART_FILE_IDENTITY_SINCE`, `CONFIG_INPUTS_SINCE`, `DESCRIBED_DIRECTION_SINCE`, `SIGNOFF_TARGET_SINCE`, `SIGNOFF_PAIR_SINCE`, `SIGNOFF_ANSWERS_SINCE`, `STAGE_PROGRESS_SINCE`, `INPUT_WRITER_SINCE`, `DIRECTION_SCENE_SINCE`, `OVERRIDDEN_ANSWERS_SINCE`, `RUN_RECORD_SINCE`, `PROGRESS_HISTORY_SINCE`, `SCENE_CONTEXT_SINCE`, `PARTS_CHECK_SINCE`, `PLATE_RECEIPT_SINCE`, `REVIEW_READ_SINCE`, `PARTS_VERDICT_DRAFT_SINCE`, `PARTS_VERDICT_LATEST_SINCE`, `PARTS_VERDICT_RECEIPT_SINCE`, `FIX_LEDGER_SINCE` and `DRAFT_CONFIG_INPUTS_SINCE`) are the day the change lands, at 00:00Z, so they are never in the future; a record made earlier that day is checked against pilot projects before the change lands.
742
+ Contract dates (`HEAD_TURN_SINCE`, `AGENT_BOUNCE_SINCE`, `ASK_COVERAGE_SINCE`, `DIFF_MAP_SINCE`, `DIFF_MAP_AGENT_SINCE`, `APPLIED_REVIEW_SINCE`, `PROJECTION_ASKS_SINCE`, `SETUP_PAINTING_SINCE`, `FIGURE_MASK_SINCE`, `FIGURE_MASK_INPUTS_SINCE`, `CHOICE_ANSWERS_SINCE`, `BUILD_IDENTITY_SINCE`, `PART_FILE_IDENTITY_SINCE`, `CONFIG_INPUTS_SINCE`, `DESCRIBED_DIRECTION_SINCE`, `SIGNOFF_TARGET_SINCE`, `SIGNOFF_PAIR_SINCE`, `SIGNOFF_ANSWERS_SINCE`, `STAGE_PROGRESS_SINCE`, `INPUT_WRITER_SINCE`, `DIRECTION_SCENE_SINCE`, `OVERRIDDEN_ANSWERS_SINCE`, `RUN_RECORD_SINCE`, `PROGRESS_HISTORY_SINCE`, `SCENE_CONTEXT_SINCE`, `PARTS_CHECK_SINCE`, `PLATE_RECEIPT_SINCE`, `REVIEW_READ_SINCE`, `PARTS_VERDICT_DRAFT_SINCE`, `PARTS_VERDICT_LATEST_SINCE`, `PARTS_VERDICT_RECEIPT_SINCE`, `FIX_LEDGER_SINCE` and `DRAFT_CONFIG_INPUTS_SINCE`) are the day the change lands, at 00:00Z, so they are never in the future; a record made earlier that day is checked against pilot projects before the change lands.
742
743
 
743
744
  Exception for #117 (2026-11-06): `original_n` has no `*_SINCE` boundary because repo HQ counted zero consumer records with `pre_interview: true`, only the synthetic fixture being updated, and historical build dates cannot date a migration.
744
745
 
@@ -1353,6 +1354,15 @@ cited by the latest live post. With no live post, no scene is current. Every
1353
1354
  scene still requires historical human acceptance, its matching package identity
1354
1355
  and all schema, raw-byte seal, model, animation, frame, plate and citation checks.
1355
1356
 
1357
+ `scene write --animation <name>` selects an exact name from the bound model's
1358
+ catalog, defaulting to `idle`. Idle still copies `registration.idle` exactly.
1359
+ New non-idle scenes omit optional `animation.frames`: there is no named-animation
1360
+ registration to copy. The reader preserves the previously accepted non-idle
1361
+ `frames === registration.idle` binding as legacy metadata, verifying its bytes
1362
+ without claiming it proves frames of the selected non-idle clip. Other provided
1363
+ non-idle frame bindings were already refused and remain refused. No historical
1364
+ acceptance is narrowed, so this change introduces no SINCE date or pilot migration.
1365
+
1356
1366
  | Code | Refuses when | Remedy |
1357
1367
  | --- | --- | --- |
1358
1368
  | `SCENE_MALFORMED` | unknown keys at any level, wrong types, schema, n, paths or registration frames | restore the closed scene@1 record and run scene write |
@@ -1360,7 +1370,8 @@ and all schema, raw-byte seal, model, animation, frame, plate and citation check
1360
1370
  | `SCENE_RIG_STALE` | rig lacks the cited historical human acceptance, or the current rig is not the latest live accepted rig | accept the current rig and run scene write |
1361
1371
  | `SCENE_ACCEPTANCE_STALE` | historical acceptance/package identity differs, or a current signoff has lapsed | restore the accepted package and sign rig-review again |
1362
1372
  | `SCENE_MODEL_MISMATCH` | model path or raw-byte hash differs from the accepted package inventory | retain the accepted compiled model and run scene write |
1363
- | `SCENE_ANIMATION_MISSING` | animation is absent from the model | select a model naming the animation and run scene write |
1373
+ | `SCENE_ANIMATION_MISSING` | animation is absent from the bound model catalog | pass --animation with a name from the accepted model and run scene write (default: idle) |
1374
+ | `SCENE_ANIMATION_FRAMES_UNBOUND` | non-idle frames are present but differ from registration.idle, which the previous reader also refused | omit optional frames and run scene write --animation <name> |
1364
1375
  | `SCENE_STAGE_MISSING` | compiled model stage is null or absent | compile a model declaring a stage before scene write |
1365
1376
  | `SCENE_STAGE_MISMATCH` | frame.stage differs from model.stage | copy the exact compiled stage through scene write |
1366
1377
  | `SCENE_PLATE_CONFLICT` | background is absent, roles duplicate, or roles share a path or hash | designate one background and at most one distinct foreground |
@@ -1462,7 +1473,7 @@ the record unchanged.
1462
1473
  | Code | Finding and remedy |
1463
1474
  | --- | --- |
1464
1475
  | `JOB_RECORD_SUBJECT_INVALID` | `project.json` does not bind the explicitly requested question, option set and effective stage, including a question whose pick is already recorded and so has no pending set, or a subject id cannot be represented by the record publication contract. Publish the exact current pending subject with its original representable id. |
1465
- | `JOB_DIRECTION_VERDICT_REQUIRED` | `job open --plan` at `direction-review` finds no accepted live direction verdict on the current live post in `project.json.versions`. Open the post with `job open --rig <n>` and ingest `review <n> --from-review <actId>` before requesting direction sign-off. This is a publication precondition, not a new record-check rule. |
1476
+ | `JOB_DIRECTION_VERDICT_REQUIRED` | `job open --plan` at `direction-review` finds no accepted live direction verdict on the current live post in `project.json.versions`. Open the post with `job open --rig <n>` and ingest `review <n> --from-review <actId>` before requesting direction sign-off. An accepted-then-bounced post instead offers exactly one reopen subject, for direction-review; it does not offer direction sign-off. Ordinary record-plan pages declare no reopen subjects. This is a publication precondition, not a new record-check rule. |
1466
1477
  | `INTERVIEW_SIGNOFF_NOT_CLEAN` | An interview record-plan publication or first record-mode sign-off ingest finds a refusal or delivery hole from the full `interview --check` function on `project.json`. Resolve that check, republish with `job open --plan` and ask for the interview signature again. This is a new-route precondition; existing records and CLI `--by` signatures keep their checks. A refused ingest leaves the record byte-identical. |
1467
1478
  | `INTERVIEW_SIGNOFF_PLAN_REQUIRED` | An interview record-plan publication or first record-mode sign-off ingest has no displayed `project.json.plan.steps`. Draft non-empty plan steps through the writers and publish with `job open --plan` before asking for the interview signature. A refused operation leaves the record byte-identical. |
1468
1479
  | `REVIEW_ACT_RECORD_TARGET_INVALID` | A direction record publication or first sign-off ingest cannot resolve one current/latest live post with an accepted live direction verdict from the hash-bound `project.json` bytes (including a duplicated current version number). Review that current post and publish its corrected record through the writers. Historical accepted posts do not create ambiguity. A refused ingest leaves the record byte-identical. |
@@ -1681,3 +1692,28 @@ These CI-only codes name `.github/workflows/release.yml` or its tagged
1681
1692
  | `RELEASE_ALREADY_PUBLISHED` | `release.yml`: npm already serves the version; verify that publication rather than republishing it. |
1682
1693
  | `RELEASE_REGISTRY_UNCONFIRMED` | `release.yml`: confirmation of both names timed out; inspect npm before recovery because publication may already have succeeded. |
1683
1694
  | `ALIAS_SAME_CONTENT` | `scripts/alias_tarball.ts compare`: an alias differs beyond the `package/package.json` name line; rebuild it from the reviewed scoped tarball and resolve every named file difference before publication. |
1695
+
1696
+ ## Head turn before rigging
1697
+
1698
+ `HEAD_TURN_SINCE = 2026-11-14T00:00:00Z` dates new rig depth obligations
1699
+ by the rig version's build date. Earlier records WARN with the same code;
1700
+ fixed-view records retain their historical placement and need no depth outputs.
1701
+ New interviews put `turn` and `depth` on rigging waypoint `turn`.
1702
+
1703
+ | Code | Meaning and remedy |
1704
+ | --- | --- |
1705
+ | `RIG_DEPTH_PLAN_MISSING` | `plan.steps[turn]` is absent or ordered after the rig steps for an approved depth turn. Draft a rig-phase depth step resting on `turn` before the rig steps and approve it at rigging-interview. Answers before `HEAD_TURN_SINCE` WARN. |
1706
+ | `RIG_DEPTH_BINDING_MISSING` | A depth-driven rig lacks its retained producer manifests. Register a new rig version with rig's `depth_sheets.json`; for per-part depth include `--depth-manifest` and parts' `depth-report.json`. Before `HEAD_TURN_SINCE` this is a WARN. |
1707
+ | `RIG_DEPTH_BINDING_INVALID` | `versions[].registration.depth` has changed bytes, the wrong producer spec, or disagrees with its retained inventory/report manifest hash. Restore the exact retained producer files or register a new rig version. |
1708
+
1709
+ For a per-part depth registration, `registration.depth.source_parts` retains
1710
+ the accepted pre-apply manifest. `REVIEW_PACKAGE_PARTS_MISMATCH` permits its
1711
+ depth-only enrichment only when that manifest matches the accepted hash, the
1712
+ new package matches the registered output hash, all other JSON declarations
1713
+ are identical, and the producer depth hash chain verifies. Art-file identity
1714
+ checks remain in force; no source measurement is recomputed.
1715
+
1716
+ `interview.turn_question: "rig-create/turn-question@1"` explicitly adopts the
1717
+ new placement. Re-signing or adopting the split order on a later date alone
1718
+ does not retrofit it into historical interviews. Missing `turn` on an adopted
1719
+ interview is the existing `WAYPOINT_MISSING` refusal.
package/docs/INTERVIEW.md CHANGED
@@ -223,7 +223,7 @@ seeing a build. Read from `@rig-c/parts` 2.4.0:
223
223
  | `meshes`, `regions` | waypoint `meshes` | what deforms and what rides rigid |
224
224
  | `constraints`, `stops`, `cloth` | waypoint `constraints` | what moves on physics and how far |
225
225
  | `motion` | waypoint `motion` | what moves, how far, how fast |
226
- | `turn`, `depth` | post item `camera_depth` | historical question mapping only; direction cannot carry depth or turn, so do not offer these as options |
226
+ | `turn`, `depth` | rigging waypoint `turn` | fixed view or head turn with depth; before rig, after approved parts |
227
227
  | `key`, `generation`, `proposed_rig_scale`, `requirements`, `motion_seams`, `note` | not a waypoint | a name, a record of a run, a value the tool proposes, a path to a checks file, an observation, an annotation — none is a direction call. `requirements` is where translated guide sentences will land, not where they are asked. |
228
228
 
229
229
  The agent writes the checks file named by the config's `requirements` path.
@@ -345,12 +345,24 @@ names ([PROJECT.md § The hand-off to post-production](PROJECT.md#the-hand-off-t
345
345
  | `post_timing` | — | How long, does it loop, and where are the beats? | clip length, loop point, timing of motions against each other | *"Ten seconds, looping; the gust comes once, in the middle."* |
346
346
  | `post_composition` | — | What is around the figure — background, framing, other figures, light? | framing, background plate, what else is on screen | *"Frame from the knees up; keep the lighthouse in shot."* |
347
347
 
348
- The `camera_depth` question text in `project.json` still names a head turn and
349
- parallax: recorded projects and the hash-sealed examples carry those bytes, so they stay.
350
- Ask it as this table words it, with options that fit the current writers. Offer fixed framing, a push-in or another camera-box path. A head turn
351
- is not available yet: the direction format cannot carry depth or turn. It also
352
- has no relative plate motion for parallax, or take-wide gaze/dial cycle. Do not
353
- offer those as buildable choices or sign plan bars promising them.
348
+ Ask `turn` at rigging-interview, against the accepted parts: “Should this rig
349
+ keep the painted view, or turn its head with depth?” Offer **Fixed view**,
350
+ **Head turn**, **Other** and **Let the agent decide**. Fixed view adds no depth
351
+ step. Head turn records only `{ "mode": "depth" }`; the agent records the chosen
352
+ route and reason in the `turn` plan step text. Draft that step in phase `rig`,
353
+ resting on `turn`, before the steps that run rig. Its bar reads the retained
354
+ producer reports, and rigging-interview approval covers it. The default
355
+ per-part sequence runs `depth-prepare`, a separately supplied model (face
356
+ normals, scalar depth for the other parts), then `depth-apply`; the ordinary
357
+ `rig` writes the consumed `depth_sheets.json`. Read parts' `docs/DEPTH.md` for
358
+ the producer contract. `rig-version --depth-manifest <file>` retains the
359
+ prepare manifest with the applied report and rig sheet manifest; all are bound
360
+ by bytes and spec, without redoing producer measurements.
361
+
362
+ Post `camera_depth` asks only about fixed framing or a camera-box path such as
363
+ a push-in. Historical question text and citations keep their original bytes.
364
+ Timed head-turn dials, relative plate parallax and take-wide gaze remain
365
+ unavailable in direction; do not promise them in plan bars.
354
366
 
355
367
  ## Bars have reading commands
356
368
 
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,14 +1,17 @@
1
1
  {
2
2
  "name": "rig-create",
3
- "version": "1.0.2",
3
+ "version": "1.1.0",
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",
14
+ "docs/AGENT-REFERENCE.md",
12
15
  "docs/PROJECT.md",
13
16
  "docs/INTERVIEW.md",
14
17
  "docs/CHECKS.md",
@@ -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
+ }
@@ -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: 'depth reference; unavailable in current direction',
56
+ why: 'depth-driven head turn before rigging; timed direction is separate',
57
57
  },
58
58
  {
59
59
  package: '@rig-c/parts',
@@ -177,9 +177,11 @@ export const READ_FIRST = [
177
177
  */
178
178
  export const INTERVIEW_CHECK_LINE = 'Run `rig-create interview --check` before interview sign-off: it names every `null` answer.';
179
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.';
180
+ export const REOPEN_EXCEPTION = 'After an accepted post is bounced, reopen direction-review through Review: `job open --plan`, then `job acts --json`, ingest `reopen direction-review --from-review <actId>`, and `job close`. The exported act supplies the reviewer, date and verbatim words.';
181
181
 
182
182
  export const GUIDE_TEMPLATE = 'agent-guide.md';
183
+ /** Copied from the same installed create distribution as the rendered guide. */
184
+ export const AGENT_REFERENCE = 'AGENT-REFERENCE.md';
183
185
 
184
186
  /** CLAUDE.md is a pointer: Claude Code reads CLAUDE.md, and an `@path` line imports that file into it. */
185
187
  export const CLAUDE_MD = [
@@ -230,11 +232,12 @@ export function renderAgentGuide(): string {
230
232
 
231
233
  /**
232
234
  * Writes the guide an agent reads first in a project — AGENTS.md, and a
233
- * CLAUDE.md that imports it — and returns the paths written (relative to the
235
+ * CLAUDE.md that imports it, plus its shipped reference — and returns the paths written (relative to the
234
236
  * project) so init can add exactly those to git.
235
237
  */
236
238
  export function writeAgentGuide(dir: string): string[] {
237
239
  writeFileSync(join(dir, 'AGENTS.md'), renderAgentGuide());
238
240
  writeFileSync(join(dir, 'CLAUDE.md'), CLAUDE_MD);
239
- return ['AGENTS.md', 'CLAUDE.md'];
241
+ writeFileSync(join(dir, AGENT_REFERENCE), readFileSync(join(TEMPLATES_DIR, '..', 'docs', AGENT_REFERENCE)));
242
+ return ['AGENTS.md', 'CLAUDE.md', AGENT_REFERENCE];
240
243
  }
package/src/check.ts CHANGED
@@ -81,7 +81,7 @@ import { collectReopens, liveSignoff } from './reopen.ts';
81
81
  import { reopenLapseWarnings } from './reopen-lapses.ts';
82
82
  import { stepHash } from './step-hash.ts';
83
83
  import { collectPlanReplaced, checkReplacedSignoffs, collectCheckpointWithdrawals, checkpointRequired } from './plan-history.ts';
84
- import { deriveWaypoints, FRAMING_IDS, type DerivedSet } from './waypoints.ts';
84
+ import { deriveWaypoints, FRAMING_IDS, TURN_QUESTION_SPEC, type DerivedSet } from './waypoints.ts';
85
85
 
86
86
  export const PROJECT_SCHEMA = 'rig-create/project@0';
87
87
  export const STAGE_ORDER_LEGACY_FINDING: Finding = { code: 'STAGE_ORDER_LEGACY', path: 'interview.order', message: 'interview.order: legacy interview order; preserve old rig guides as history, not as answers asked after parts; adopt explicitly with a fresh rigging-interview sign-off' };
@@ -684,7 +684,7 @@ function checkPlan(ctx: Ctx): void {
684
684
  }
685
685
  if (planSigned) {
686
686
  for (const item of ctx.items) {
687
- if (item.kind !== 'waypoint' || !signed(ctx, approvalStageOfStep('rig', item.id, hasStageOrder(ctx.project)))) continue;
687
+ if (item.kind !== 'waypoint' || item.id === 'turn' || !signed(ctx, approvalStageOfStep('rig', item.id, hasStageOrder(ctx.project)))) continue;
688
688
  if ((item.state.state === 'user' || item.state.state === 'delegated') && !ctx.steps.some((s) => s.phase === 'rig' && s.id === item.id)) {
689
689
  ctx.refusals.push({ code: 'STEP_MISSING_FOR_WAYPOINT', path: `plan.steps[${item.id}]`, message: `waypoint '${item.id}' has a guide but the signed plan has no rig step '${item.id}'; one step per waypoint the plan passes` });
690
690
  }
@@ -950,7 +950,10 @@ function checkProjectOnce(projectDirArg: string, candidate: JsonObject | undefin
950
950
  let derived: DerivedSet | null = null;
951
951
  try {
952
952
  parts = readPartsSections(dir);
953
- derived = deriveWaypoints(parts.sections);
953
+ const interview = isObject(project.interview) ? project.interview : {};
954
+ const turnInterview = asArray(interview.waypoints).some(w => isObject(w) && w.id === 'turn')
955
+ || interview.turn_question === TURN_QUESTION_SPEC;
956
+ derived = deriveWaypoints(parts.sections, turnInterview);
954
957
  checkDerived(ctx, parts, derived);
955
958
  } catch (e) {
956
959
  if (!(e instanceof PartsUnreadable)) throw e;
@@ -981,7 +984,7 @@ function checkProjectOnce(projectDirArg: string, candidate: JsonObject | undefin
981
984
  if (!options.recordPublication) checkReviews(ctx);
982
985
  if (!options.recordPublication) checkPublicationGenerations(dir, project, refusals);
983
986
  if (!options.recordPublication) checkReviewPackages(ctx);
984
- if (!options.recordPublication) refusals.push(...rigRegistrationFindings(dir, project, warnings));
987
+ if (!options.recordPublication) refusals.push(...rigRegistrationFindings(dir, project, warnings, collection));
985
988
  if (!options.recordPublication) checkAppliedReview(ctx);
986
989
  const provenance = options.recordPublication ? [] : checkProvenance(ctx, parts);
987
990
  const feedback = options.recordPublication ? [] : checkFeedback(ctx);