@rig-c/create 0.0.0-stage → 1.0.1

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 (555) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +169 -2
  3. package/docs/CHECKS.md +1682 -0
  4. package/docs/COLLECTIONS.md +337 -0
  5. package/docs/CRAFT.md +277 -0
  6. package/docs/INTERVIEW.md +886 -0
  7. package/docs/LESSONS.md +172 -0
  8. package/docs/PROJECT.md +2657 -0
  9. package/docs/SOURCE.md +225 -0
  10. package/package.json +44 -4
  11. package/src/agent-bounce.ts +27 -0
  12. package/src/agent-guide.ts +237 -0
  13. package/src/amend.ts +193 -0
  14. package/src/applied-review.ts +104 -0
  15. package/src/ask-coverage.ts +69 -0
  16. package/src/assemble-answers.ts +53 -0
  17. package/src/cg-gates.ts +211 -0
  18. package/src/check-reads.ts +106 -0
  19. package/src/check.ts +1059 -0
  20. package/src/checkpoint-evidence-writer.ts +125 -0
  21. package/src/checkpoint-evidence.ts +152 -0
  22. package/src/choice-writers.ts +271 -0
  23. package/src/choices.ts +378 -0
  24. package/src/cli.ts +371 -0
  25. package/src/collection-answer.ts +136 -0
  26. package/src/collection-binding-reader.ts +496 -0
  27. package/src/collection-binding.ts +478 -0
  28. package/src/collection.ts +348 -0
  29. package/src/config-inputs.ts +155 -0
  30. package/src/config-lost.ts +135 -0
  31. package/src/correction-writers.ts +207 -0
  32. package/src/corrections.ts +685 -0
  33. package/src/diff-classes.ts +219 -0
  34. package/src/diff-map.ts +248 -0
  35. package/src/direction-citation.ts +13 -0
  36. package/src/direction-writers.ts +119 -0
  37. package/src/direction.ts +266 -0
  38. package/src/drafts.ts +363 -0
  39. package/src/feedback.ts +744 -0
  40. package/src/figure-mask.ts +143 -0
  41. package/src/fix-ledger.ts +355 -0
  42. package/src/init.ts +265 -0
  43. package/src/inputs.ts +160 -0
  44. package/src/intake.ts +158 -0
  45. package/src/interview.ts +53 -0
  46. package/src/invariants.ts +132 -0
  47. package/src/job-acts.ts +80 -0
  48. package/src/job-advance.ts +65 -0
  49. package/src/job-close.ts +226 -0
  50. package/src/job-host.ts +529 -0
  51. package/src/job-outbox.ts +383 -0
  52. package/src/job-publication.ts +701 -0
  53. package/src/job-runtime.ts +99 -0
  54. package/src/job-writer.ts +123 -0
  55. package/src/meshes-bust.ts +63 -0
  56. package/src/next.ts +1506 -0
  57. package/src/overrides.ts +42 -0
  58. package/src/package-upgrades.ts +32 -0
  59. package/src/packages-upgrade-check.ts +6 -0
  60. package/src/packages-upgrade.ts +168 -0
  61. package/src/parts-act.ts +96 -0
  62. package/src/parts-check.ts +242 -0
  63. package/src/parts-review.ts +196 -0
  64. package/src/parts-sections.ts +98 -0
  65. package/src/parts-verdict-record.ts +265 -0
  66. package/src/parts-verdict.ts +33 -0
  67. package/src/pause.ts +118 -0
  68. package/src/pins-check.ts +619 -0
  69. package/src/pins.ts +17 -0
  70. package/src/plan-bar-amendments.ts +54 -0
  71. package/src/plan-history.ts +147 -0
  72. package/src/plan-writers.ts +202 -0
  73. package/src/plate-receipt.ts +110 -0
  74. package/src/pre-interview.ts +302 -0
  75. package/src/prepared-inputs.ts +113 -0
  76. package/src/progress-writers.ts +181 -0
  77. package/src/provenance.ts +301 -0
  78. package/src/record-direction-target.ts +26 -0
  79. package/src/record-input.ts +18 -0
  80. package/src/refusal-baseline.ts +55 -0
  81. package/src/refusal.ts +30 -0
  82. package/src/reopen-lapses.ts +80 -0
  83. package/src/reopen.ts +144 -0
  84. package/src/republish.ts +93 -0
  85. package/src/restart.ts +141 -0
  86. package/src/review-act-runtime.ts +16 -0
  87. package/src/review-act.ts +592 -0
  88. package/src/review-package.ts +524 -0
  89. package/src/review-read.ts +238 -0
  90. package/src/review.ts +432 -0
  91. package/src/rig-version-date.ts +22 -0
  92. package/src/rig-version.ts +1047 -0
  93. package/src/run-record.ts +232 -0
  94. package/src/scene-authority.ts +410 -0
  95. package/src/scene-writers.ts +144 -0
  96. package/src/scene.ts +284 -0
  97. package/src/setup-painting.ts +46 -0
  98. package/src/signable.ts +65 -0
  99. package/src/signoff-answers.ts +76 -0
  100. package/src/signoff-checkpoint-act.ts +95 -0
  101. package/src/signoff-target.ts +127 -0
  102. package/src/signoff.ts +331 -0
  103. package/src/split-captions.ts +154 -0
  104. package/src/stage-progress.ts +379 -0
  105. package/src/stages.ts +148 -0
  106. package/src/step-hash.ts +19 -0
  107. package/src/structure-snapshot.ts +109 -0
  108. package/src/structure.ts +166 -0
  109. package/src/templates.ts +16 -0
  110. package/src/waypoints.ts +163 -0
  111. package/templates/agent-guide.md +108 -0
  112. package/templates/collection-agent-guide.md +72 -0
  113. package/templates/collection.json +252 -0
  114. package/templates/example-chain/AGENTS.md +134 -0
  115. package/templates/example-chain/CLAUDE.md +3 -0
  116. package/templates/example-chain/README.md +13 -0
  117. package/templates/example-chain/chain.json +2869 -0
  118. package/templates/example-chain/checkpoints/0a-interview-options/AGENTS.md +134 -0
  119. package/templates/example-chain/checkpoints/0a-interview-options/CLAUDE.md +3 -0
  120. package/templates/example-chain/checkpoints/0a-interview-options/evidence/.gitkeep +0 -0
  121. package/templates/example-chain/checkpoints/0a-interview-options/evidence/approval.txt +1 -0
  122. package/templates/example-chain/checkpoints/0a-interview-options/evidence/interview/rig_type.json +59 -0
  123. package/templates/example-chain/checkpoints/0a-interview-options/evidence/split-config.json +1 -0
  124. package/templates/example-chain/checkpoints/0a-interview-options/inputs/painting.png +0 -0
  125. package/templates/example-chain/checkpoints/0a-interview-options/inputs/references/.gitkeep +0 -0
  126. package/templates/example-chain/checkpoints/0a-interview-options/package.json +9 -0
  127. package/templates/example-chain/checkpoints/0a-interview-options/project.json +295 -0
  128. package/templates/example-chain/checkpoints/0a-interview-options.json +127 -0
  129. package/templates/example-chain/checkpoints/0b-plan-pending/AGENTS.md +134 -0
  130. package/templates/example-chain/checkpoints/0b-plan-pending/CLAUDE.md +3 -0
  131. package/templates/example-chain/checkpoints/0b-plan-pending/evidence/.gitkeep +0 -0
  132. package/templates/example-chain/checkpoints/0b-plan-pending/evidence/approval.txt +1 -0
  133. package/templates/example-chain/checkpoints/0b-plan-pending/evidence/interview/assemble.json +309 -0
  134. package/templates/example-chain/checkpoints/0b-plan-pending/evidence/interview/reference.json +59 -0
  135. package/templates/example-chain/checkpoints/0b-plan-pending/evidence/interview/rig_type.json +59 -0
  136. package/templates/example-chain/checkpoints/0b-plan-pending/evidence/interview/seethrough.json +186 -0
  137. package/templates/example-chain/checkpoints/0b-plan-pending/evidence/split-config.json +1 -0
  138. package/templates/example-chain/checkpoints/0b-plan-pending/inputs/painting.png +0 -0
  139. package/templates/example-chain/checkpoints/0b-plan-pending/inputs/references/.gitkeep +0 -0
  140. package/templates/example-chain/checkpoints/0b-plan-pending/package.json +9 -0
  141. package/templates/example-chain/checkpoints/0b-plan-pending/project.json +685 -0
  142. package/templates/example-chain/checkpoints/0b-plan-pending.json +81 -0
  143. package/templates/example-chain/checkpoints/1-parts-verdict/AGENTS.md +134 -0
  144. package/templates/example-chain/checkpoints/1-parts-verdict/CLAUDE.md +3 -0
  145. package/templates/example-chain/checkpoints/1-parts-verdict/evidence/.gitkeep +0 -0
  146. package/templates/example-chain/checkpoints/1-parts-verdict/evidence/approval.txt +1 -0
  147. package/templates/example-chain/checkpoints/1-parts-verdict/evidence/interview/assemble.json +309 -0
  148. package/templates/example-chain/checkpoints/1-parts-verdict/evidence/interview/reference.json +59 -0
  149. package/templates/example-chain/checkpoints/1-parts-verdict/evidence/interview/rig_type.json +59 -0
  150. package/templates/example-chain/checkpoints/1-parts-verdict/evidence/interview/seethrough.json +186 -0
  151. package/templates/example-chain/checkpoints/1-parts-verdict/evidence/parts-check.json +127 -0
  152. package/templates/example-chain/checkpoints/1-parts-verdict/evidence/split-config.json +1 -0
  153. package/templates/example-chain/checkpoints/1-parts-verdict/inputs/painting.png +0 -0
  154. package/templates/example-chain/checkpoints/1-parts-verdict/inputs/references/.gitkeep +0 -0
  155. package/templates/example-chain/checkpoints/1-parts-verdict/package.json +9 -0
  156. package/templates/example-chain/checkpoints/1-parts-verdict/project.json +955 -0
  157. package/templates/example-chain/checkpoints/1-parts-verdict.json +204 -0
  158. package/templates/example-chain/checkpoints/2-rigging-answers/AGENTS.md +134 -0
  159. package/templates/example-chain/checkpoints/2-rigging-answers/CLAUDE.md +3 -0
  160. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/.gitkeep +0 -0
  161. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/approval.txt +1 -0
  162. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/diff-components.json +34 -0
  163. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/interview/assemble.json +309 -0
  164. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/interview/bones.json +190 -0
  165. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/interview/reference.json +59 -0
  166. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/interview/rig_type.json +59 -0
  167. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/interview/seethrough.json +186 -0
  168. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/parts-check.json +127 -0
  169. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/parts-review.json +88 -0
  170. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/review-reads/a12dea02d32508acc99386f894af76a14f1c85f45f804db2aa6b4dea5297973f.json +59 -0
  171. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/split-config.json +1 -0
  172. package/templates/example-chain/checkpoints/2-rigging-answers/evidence/structure.json +30 -0
  173. package/templates/example-chain/checkpoints/2-rigging-answers/inputs/painting.png +0 -0
  174. package/templates/example-chain/checkpoints/2-rigging-answers/inputs/references/.gitkeep +0 -0
  175. package/templates/example-chain/checkpoints/2-rigging-answers/package.json +9 -0
  176. package/templates/example-chain/checkpoints/2-rigging-answers/project.json +1198 -0
  177. package/templates/example-chain/checkpoints/2-rigging-answers.json +254 -0
  178. package/templates/example-chain/checkpoints/3-rig-review/AGENTS.md +134 -0
  179. package/templates/example-chain/checkpoints/3-rig-review/CLAUDE.md +3 -0
  180. package/templates/example-chain/checkpoints/3-rig-review/evidence/.gitkeep +0 -0
  181. package/templates/example-chain/checkpoints/3-rig-review/evidence/approval.txt +1 -0
  182. package/templates/example-chain/checkpoints/3-rig-review/evidence/diff-components.json +34 -0
  183. package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/assemble.json +309 -0
  184. package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/bones.json +190 -0
  185. package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/constraints.json +272 -0
  186. package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/meshes.json +190 -0
  187. package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/motion.json +272 -0
  188. package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/reference.json +59 -0
  189. package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/rig_type.json +59 -0
  190. package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/seethrough.json +186 -0
  191. package/templates/example-chain/checkpoints/3-rig-review/evidence/parts-check.json +127 -0
  192. package/templates/example-chain/checkpoints/3-rig-review/evidence/parts-review.json +88 -0
  193. package/templates/example-chain/checkpoints/3-rig-review/evidence/review-reads/a12dea02d32508acc99386f894af76a14f1c85f45f804db2aa6b4dea5297973f.json +59 -0
  194. package/templates/example-chain/checkpoints/3-rig-review/evidence/setup.png +0 -0
  195. package/templates/example-chain/checkpoints/3-rig-review/evidence/split-config.json +1 -0
  196. package/templates/example-chain/checkpoints/3-rig-review/evidence/structure.json +30 -0
  197. package/templates/example-chain/checkpoints/3-rig-review/evidence/v1/config.json +88 -0
  198. package/templates/example-chain/checkpoints/3-rig-review/evidence/v1/interview-requirements.json +8 -0
  199. package/templates/example-chain/checkpoints/3-rig-review/inputs/painting.png +0 -0
  200. package/templates/example-chain/checkpoints/3-rig-review/inputs/references/.gitkeep +0 -0
  201. package/templates/example-chain/checkpoints/3-rig-review/package.json +9 -0
  202. package/templates/example-chain/checkpoints/3-rig-review/project.json +1909 -0
  203. package/templates/example-chain/checkpoints/3-rig-review.json +424 -0
  204. package/templates/example-chain/checkpoints/4-direction-post/AGENTS.md +134 -0
  205. package/templates/example-chain/checkpoints/4-direction-post/CLAUDE.md +3 -0
  206. package/templates/example-chain/checkpoints/4-direction-post/evidence/.gitkeep +0 -0
  207. package/templates/example-chain/checkpoints/4-direction-post/evidence/approval.txt +1 -0
  208. package/templates/example-chain/checkpoints/4-direction-post/evidence/diff-components.json +34 -0
  209. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/assemble.json +309 -0
  210. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/bones.json +190 -0
  211. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/camera_depth.json +102 -0
  212. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/constraints.json +272 -0
  213. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/meshes.json +190 -0
  214. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/motion.json +272 -0
  215. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/post_composition.json +122 -0
  216. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/post_timing.json +102 -0
  217. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/reference.json +59 -0
  218. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/rig_type.json +59 -0
  219. package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/seethrough.json +186 -0
  220. package/templates/example-chain/checkpoints/4-direction-post/evidence/parts-check.json +127 -0
  221. package/templates/example-chain/checkpoints/4-direction-post/evidence/parts-review.json +88 -0
  222. package/templates/example-chain/checkpoints/4-direction-post/evidence/review-reads/a12dea02d32508acc99386f894af76a14f1c85f45f804db2aa6b4dea5297973f.json +59 -0
  223. package/templates/example-chain/checkpoints/4-direction-post/evidence/setup.png +0 -0
  224. package/templates/example-chain/checkpoints/4-direction-post/evidence/split-config.json +1 -0
  225. package/templates/example-chain/checkpoints/4-direction-post/evidence/structure.json +30 -0
  226. package/templates/example-chain/checkpoints/4-direction-post/evidence/v1/config.json +88 -0
  227. package/templates/example-chain/checkpoints/4-direction-post/evidence/v1/interview-requirements.json +8 -0
  228. package/templates/example-chain/checkpoints/4-direction-post/inputs/painting.png +0 -0
  229. package/templates/example-chain/checkpoints/4-direction-post/inputs/references/.gitkeep +0 -0
  230. package/templates/example-chain/checkpoints/4-direction-post/package.json +9 -0
  231. package/templates/example-chain/checkpoints/4-direction-post/project.json +2302 -0
  232. package/templates/example-chain/checkpoints/4-direction-post.json +456 -0
  233. package/templates/example-chain/evidence/.gitkeep +0 -0
  234. package/templates/example-chain/evidence/approval.txt +1 -0
  235. package/templates/example-chain/evidence/captions.json +101 -0
  236. package/templates/example-chain/evidence/diff-components.json +34 -0
  237. package/templates/example-chain/evidence/direction/v2.json +74 -0
  238. package/templates/example-chain/evidence/direction-input.json +74 -0
  239. package/templates/example-chain/evidence/interview/assemble.json +309 -0
  240. package/templates/example-chain/evidence/interview/bones.json +190 -0
  241. package/templates/example-chain/evidence/interview/camera_depth.json +102 -0
  242. package/templates/example-chain/evidence/interview/constraints.json +272 -0
  243. package/templates/example-chain/evidence/interview/meshes.json +190 -0
  244. package/templates/example-chain/evidence/interview/motion.json +272 -0
  245. package/templates/example-chain/evidence/interview/post_composition.json +122 -0
  246. package/templates/example-chain/evidence/interview/post_timing.json +102 -0
  247. package/templates/example-chain/evidence/interview/reference.json +59 -0
  248. package/templates/example-chain/evidence/interview/rig_type.json +59 -0
  249. package/templates/example-chain/evidence/interview/seethrough.json +186 -0
  250. package/templates/example-chain/evidence/parts-check.json +127 -0
  251. package/templates/example-chain/evidence/parts-review.json +88 -0
  252. package/templates/example-chain/evidence/review-reads/a12dea02d32508acc99386f894af76a14f1c85f45f804db2aa6b4dea5297973f.json +59 -0
  253. package/templates/example-chain/evidence/scene/s1.json +65 -0
  254. package/templates/example-chain/evidence/scene-citations.json +9 -0
  255. package/templates/example-chain/evidence/setup.png +0 -0
  256. package/templates/example-chain/evidence/split-config.json +1 -0
  257. package/templates/example-chain/evidence/structure.json +30 -0
  258. package/templates/example-chain/evidence/v1/config.json +88 -0
  259. package/templates/example-chain/evidence/v1/interview-requirements.json +8 -0
  260. package/templates/example-chain/inputs/background.png +0 -0
  261. package/templates/example-chain/inputs/painting.png +0 -0
  262. package/templates/example-chain/inputs/references/.gitkeep +0 -0
  263. package/templates/example-chain/package.json +9 -0
  264. package/templates/example-chain/project.json +2593 -0
  265. package/templates/example-diff/diff-components.json +71 -0
  266. package/templates/example-diff/recomposite_rig.png +0 -0
  267. package/templates/example-direction/approval.txt +1 -0
  268. package/templates/example-direction/derived/review/v1/out/check/build/rectangle.png +0 -0
  269. package/templates/example-direction/derived/review/v1/out/check/build/run.json +40 -0
  270. package/templates/example-direction/derived/review/v1/out/check/build/skeleton.atlas +8 -0
  271. package/templates/example-direction/derived/review/v1/out/check/build/skeleton.json +73 -0
  272. package/templates/example-direction/derived/review/v1/out/check/build/skeleton.model.json +195 -0
  273. package/templates/example-direction/evidence/direction/v2.json +69 -0
  274. package/templates/example-direction/evidence/direction/v3.json +59 -0
  275. package/templates/example-direction/evidence/images/rectangle.png +0 -0
  276. package/templates/example-direction/evidence/input.json +69 -0
  277. package/templates/example-direction/evidence/motion.json +33 -0
  278. package/templates/example-direction/evidence/patch.json +23 -0
  279. package/templates/example-direction/evidence/rig-config.json +55 -0
  280. package/templates/example-direction/evidence/still.png +0 -0
  281. package/templates/example-direction/project.json +372 -0
  282. package/templates/example-direction/reasoning.txt +1 -0
  283. package/templates/example-direction/words.txt +1 -0
  284. package/templates/example-draft/README.md +28 -0
  285. package/templates/example-draft/config.json +71 -0
  286. package/templates/example-draft/derived/drafts/lantern/config.json +71 -0
  287. package/templates/example-draft/derived/drafts/lantern/input/painting_in_rig.png +0 -0
  288. package/templates/example-draft/derived/drafts/lantern/input/parts/background.png +0 -0
  289. package/templates/example-draft/derived/drafts/lantern/input/parts/eye_l.png +0 -0
  290. package/templates/example-draft/derived/drafts/lantern/input/parts/eye_r.png +0 -0
  291. package/templates/example-draft/derived/drafts/lantern/input/parts/face.png +0 -0
  292. package/templates/example-draft/derived/drafts/lantern/input/parts/lantern.png +0 -0
  293. package/templates/example-draft/derived/drafts/lantern/input/parts/torso.png +0 -0
  294. package/templates/example-draft/derived/drafts/lantern/input/parts.json +188 -0
  295. package/templates/example-draft/derived/drafts/lantern/input/recomposite_rig.png +0 -0
  296. package/templates/example-draft/derived/drafts/lantern/interview-requirements.json +8 -0
  297. package/templates/example-draft/derived/drafts/lantern/out/check/build/run.json +40 -0
  298. package/templates/example-draft/derived/drafts/lantern/out/check/build/skeleton.atlas +28 -0
  299. package/templates/example-draft/derived/drafts/lantern/out/check/build/skeleton.json +193 -0
  300. package/templates/example-draft/derived/drafts/lantern/out/check/build/skeleton.model.json +483 -0
  301. package/templates/example-draft/derived/drafts/lantern/out/check/build/skeleton.png +0 -0
  302. package/templates/example-draft/derived/drafts/lantern/out/images/background.png +0 -0
  303. package/templates/example-draft/derived/drafts/lantern/out/images/eye_l.png +0 -0
  304. package/templates/example-draft/derived/drafts/lantern/out/images/eye_r.png +0 -0
  305. package/templates/example-draft/derived/drafts/lantern/out/images/face.png +0 -0
  306. package/templates/example-draft/derived/drafts/lantern/out/images/lantern.png +0 -0
  307. package/templates/example-draft/derived/drafts/lantern/out/images/torso.png +0 -0
  308. package/templates/example-draft/derived/drafts/lantern/out/mesh_report.json +1 -0
  309. package/templates/example-draft/derived/drafts/lantern/out/motion.json +137 -0
  310. package/templates/example-draft/derived/drafts/lantern/out/rig.json +102 -0
  311. package/templates/example-draft/derived/drafts/lantern/out/run.json +52 -0
  312. package/templates/example-draft/derived/parts/rig/painting_in_rig.png +0 -0
  313. package/templates/example-draft/derived/parts/rig/parts/background.png +0 -0
  314. package/templates/example-draft/derived/parts/rig/parts/eye_l.png +0 -0
  315. package/templates/example-draft/derived/parts/rig/parts/eye_r.png +0 -0
  316. package/templates/example-draft/derived/parts/rig/parts/face.png +0 -0
  317. package/templates/example-draft/derived/parts/rig/parts/lantern.png +0 -0
  318. package/templates/example-draft/derived/parts/rig/parts/torso.png +0 -0
  319. package/templates/example-draft/derived/parts/rig/parts.json +188 -0
  320. package/templates/example-draft/derived/parts/rig/recomposite_rig.png +0 -0
  321. package/templates/example-draft/derived/review/v1/config.json +71 -0
  322. package/templates/example-draft/derived/review/v1/interview-requirements.json +8 -0
  323. package/templates/example-draft/derived/review/v1/out/check/build/run.json +40 -0
  324. package/templates/example-draft/derived/review/v1/out/check/build/skeleton.atlas +28 -0
  325. package/templates/example-draft/derived/review/v1/out/check/build/skeleton.json +193 -0
  326. package/templates/example-draft/derived/review/v1/out/check/build/skeleton.model.json +483 -0
  327. package/templates/example-draft/derived/review/v1/out/check/build/skeleton.png +0 -0
  328. package/templates/example-draft/derived/review/v1/out/parts/background.png +0 -0
  329. package/templates/example-draft/derived/review/v1/out/parts/eye_l.png +0 -0
  330. package/templates/example-draft/derived/review/v1/out/parts/eye_r.png +0 -0
  331. package/templates/example-draft/derived/review/v1/out/parts/face.png +0 -0
  332. package/templates/example-draft/derived/review/v1/out/parts/lantern.png +0 -0
  333. package/templates/example-draft/derived/review/v1/out/parts/torso.png +0 -0
  334. package/templates/example-draft/derived/review/v1/out/parts.json +188 -0
  335. package/templates/example-draft/derived/review/v1/out/rig/images/background.png +0 -0
  336. package/templates/example-draft/derived/review/v1/out/rig/images/eye_l.png +0 -0
  337. package/templates/example-draft/derived/review/v1/out/rig/images/eye_r.png +0 -0
  338. package/templates/example-draft/derived/review/v1/out/rig/images/face.png +0 -0
  339. package/templates/example-draft/derived/review/v1/out/rig/images/lantern.png +0 -0
  340. package/templates/example-draft/derived/review/v1/out/rig/images/torso.png +0 -0
  341. package/templates/example-draft/derived/review/v1/out/rig/mesh_report.json +1 -0
  342. package/templates/example-draft/derived/review/v1/out/rig/motion.json +137 -0
  343. package/templates/example-draft/derived/review/v1/out/rig/rig.json +102 -0
  344. package/templates/example-draft/derived/review/v1/out/rig/run.json +52 -0
  345. package/templates/example-draft/derived/review/v2/config.json +71 -0
  346. package/templates/example-draft/derived/review/v2/interview-requirements.json +8 -0
  347. package/templates/example-draft/derived/review/v2/out/check/build/run.json +40 -0
  348. package/templates/example-draft/derived/review/v2/out/check/build/skeleton.atlas +28 -0
  349. package/templates/example-draft/derived/review/v2/out/check/build/skeleton.json +193 -0
  350. package/templates/example-draft/derived/review/v2/out/check/build/skeleton.model.json +483 -0
  351. package/templates/example-draft/derived/review/v2/out/check/build/skeleton.png +0 -0
  352. package/templates/example-draft/derived/review/v2/out/parts/background.png +0 -0
  353. package/templates/example-draft/derived/review/v2/out/parts/eye_l.png +0 -0
  354. package/templates/example-draft/derived/review/v2/out/parts/eye_r.png +0 -0
  355. package/templates/example-draft/derived/review/v2/out/parts/face.png +0 -0
  356. package/templates/example-draft/derived/review/v2/out/parts/lantern.png +0 -0
  357. package/templates/example-draft/derived/review/v2/out/parts/torso.png +0 -0
  358. package/templates/example-draft/derived/review/v2/out/parts.json +188 -0
  359. package/templates/example-draft/derived/review/v2/out/rig/images/background.png +0 -0
  360. package/templates/example-draft/derived/review/v2/out/rig/images/eye_l.png +0 -0
  361. package/templates/example-draft/derived/review/v2/out/rig/images/eye_r.png +0 -0
  362. package/templates/example-draft/derived/review/v2/out/rig/images/face.png +0 -0
  363. package/templates/example-draft/derived/review/v2/out/rig/images/lantern.png +0 -0
  364. package/templates/example-draft/derived/review/v2/out/rig/images/torso.png +0 -0
  365. package/templates/example-draft/derived/review/v2/out/rig/mesh_report.json +1 -0
  366. package/templates/example-draft/derived/review/v2/out/rig/motion.json +137 -0
  367. package/templates/example-draft/derived/review/v2/out/rig/rig.json +102 -0
  368. package/templates/example-draft/derived/review/v2/out/rig/run.json +52 -0
  369. package/templates/example-draft/evidence/diff-components.json +71 -0
  370. package/templates/example-draft/evidence/direction/v4.json +64 -0
  371. package/templates/example-draft/evidence/direction-input-v4.json +64 -0
  372. package/templates/example-draft/evidence/fix-ledger/lantern.json +17 -0
  373. package/templates/example-draft/evidence/parts-check.json +127 -0
  374. package/templates/example-draft/evidence/parts-review.json +88 -0
  375. package/templates/example-draft/evidence/review-reads/4ed0507381809746443021554e012032be5b5f8417da0f2e525e9b6df16e9f05.json +59 -0
  376. package/templates/example-draft/evidence/scene/s1.json +65 -0
  377. package/templates/example-draft/evidence/scene-background.png +0 -0
  378. package/templates/example-draft/evidence/scene-citations.json +9 -0
  379. package/templates/example-draft/evidence/structure-decisions.json +9 -0
  380. package/templates/example-draft/evidence/v1/interview-config.json +71 -0
  381. package/templates/example-draft/evidence/v1/interview-requirements.json +8 -0
  382. package/templates/example-draft/evidence/v1/review-config.json +71 -0
  383. package/templates/example-draft/evidence/v2/interview-config.json +71 -0
  384. package/templates/example-draft/evidence/v2/interview-requirements.json +8 -0
  385. package/templates/example-draft/evidence/v2/review-config.json +71 -0
  386. package/templates/example-draft/input/painting_in_rig.png +0 -0
  387. package/templates/example-draft/input/parts/background.png +0 -0
  388. package/templates/example-draft/input/parts/eye_l.png +0 -0
  389. package/templates/example-draft/input/parts/eye_r.png +0 -0
  390. package/templates/example-draft/input/parts/face.png +0 -0
  391. package/templates/example-draft/input/parts/lantern.png +0 -0
  392. package/templates/example-draft/input/parts/torso.png +0 -0
  393. package/templates/example-draft/input/parts.json +188 -0
  394. package/templates/example-draft/input/recomposite_rig.png +0 -0
  395. package/templates/example-draft/inputs/painting.png +0 -0
  396. package/templates/example-draft/interview-requirements.json +8 -0
  397. package/templates/example-draft/out/check/build/run.json +40 -0
  398. package/templates/example-draft/out/check/build/skeleton.atlas +28 -0
  399. package/templates/example-draft/out/check/build/skeleton.json +193 -0
  400. package/templates/example-draft/out/check/build/skeleton.model.json +483 -0
  401. package/templates/example-draft/out/check/build/skeleton.png +0 -0
  402. package/templates/example-draft/out/images/background.png +0 -0
  403. package/templates/example-draft/out/images/eye_l.png +0 -0
  404. package/templates/example-draft/out/images/eye_r.png +0 -0
  405. package/templates/example-draft/out/images/face.png +0 -0
  406. package/templates/example-draft/out/images/lantern.png +0 -0
  407. package/templates/example-draft/out/images/torso.png +0 -0
  408. package/templates/example-draft/out/mesh_report.json +1 -0
  409. package/templates/example-draft/out/motion.json +137 -0
  410. package/templates/example-draft/out/rig.json +102 -0
  411. package/templates/example-draft/out/run.json +52 -0
  412. package/templates/example-draft/outputs/v1/out/check/build/run.json +40 -0
  413. package/templates/example-draft/outputs/v1/out/check/build/skeleton.atlas +28 -0
  414. package/templates/example-draft/outputs/v1/out/check/build/skeleton.json +193 -0
  415. package/templates/example-draft/outputs/v1/out/check/build/skeleton.model.json +483 -0
  416. package/templates/example-draft/outputs/v1/out/check/build/skeleton.png +0 -0
  417. package/templates/example-draft/outputs/v1/out/painting_in_rig.png +0 -0
  418. package/templates/example-draft/outputs/v1/out/parts/background.png +0 -0
  419. package/templates/example-draft/outputs/v1/out/parts/eye_l.png +0 -0
  420. package/templates/example-draft/outputs/v1/out/parts/eye_r.png +0 -0
  421. package/templates/example-draft/outputs/v1/out/parts/face.png +0 -0
  422. package/templates/example-draft/outputs/v1/out/parts/lantern.png +0 -0
  423. package/templates/example-draft/outputs/v1/out/parts/torso.png +0 -0
  424. package/templates/example-draft/outputs/v1/out/parts.json +188 -0
  425. package/templates/example-draft/outputs/v1/out/rig/images/background.png +0 -0
  426. package/templates/example-draft/outputs/v1/out/rig/images/eye_l.png +0 -0
  427. package/templates/example-draft/outputs/v1/out/rig/images/eye_r.png +0 -0
  428. package/templates/example-draft/outputs/v1/out/rig/images/face.png +0 -0
  429. package/templates/example-draft/outputs/v1/out/rig/images/lantern.png +0 -0
  430. package/templates/example-draft/outputs/v1/out/rig/images/torso.png +0 -0
  431. package/templates/example-draft/outputs/v1/out/rig/mesh_report.json +1 -0
  432. package/templates/example-draft/outputs/v1/out/rig/motion.json +137 -0
  433. package/templates/example-draft/outputs/v1/out/rig/rig.json +102 -0
  434. package/templates/example-draft/outputs/v1/out/rig/run.json +52 -0
  435. package/templates/example-draft/outputs/v2/out/check/build/run.json +40 -0
  436. package/templates/example-draft/outputs/v2/out/check/build/skeleton.atlas +28 -0
  437. package/templates/example-draft/outputs/v2/out/check/build/skeleton.json +193 -0
  438. package/templates/example-draft/outputs/v2/out/check/build/skeleton.model.json +483 -0
  439. package/templates/example-draft/outputs/v2/out/check/build/skeleton.png +0 -0
  440. package/templates/example-draft/outputs/v2/out/painting_in_rig.png +0 -0
  441. package/templates/example-draft/outputs/v2/out/parts/background.png +0 -0
  442. package/templates/example-draft/outputs/v2/out/parts/eye_l.png +0 -0
  443. package/templates/example-draft/outputs/v2/out/parts/eye_r.png +0 -0
  444. package/templates/example-draft/outputs/v2/out/parts/face.png +0 -0
  445. package/templates/example-draft/outputs/v2/out/parts/lantern.png +0 -0
  446. package/templates/example-draft/outputs/v2/out/parts/torso.png +0 -0
  447. package/templates/example-draft/outputs/v2/out/parts.json +188 -0
  448. package/templates/example-draft/outputs/v2/out/rig/images/background.png +0 -0
  449. package/templates/example-draft/outputs/v2/out/rig/images/eye_l.png +0 -0
  450. package/templates/example-draft/outputs/v2/out/rig/images/eye_r.png +0 -0
  451. package/templates/example-draft/outputs/v2/out/rig/images/face.png +0 -0
  452. package/templates/example-draft/outputs/v2/out/rig/images/lantern.png +0 -0
  453. package/templates/example-draft/outputs/v2/out/rig/images/torso.png +0 -0
  454. package/templates/example-draft/outputs/v2/out/rig/mesh_report.json +1 -0
  455. package/templates/example-draft/outputs/v2/out/rig/motion.json +137 -0
  456. package/templates/example-draft/outputs/v2/out/rig/rig.json +102 -0
  457. package/templates/example-draft/outputs/v2/out/rig/run.json +52 -0
  458. package/templates/example-interview-choice.json +1068 -0
  459. package/templates/example-interview-options/constraint.json +376 -0
  460. package/templates/example-interview-options/example-assemble.json +376 -0
  461. package/templates/example-interview-options/example-bones.json +190 -0
  462. package/templates/example-interview-options/example-camera-depth.json +99 -0
  463. package/templates/example-interview-options/example-constraints.json +272 -0
  464. package/templates/example-interview-options/example-meshes.json +190 -0
  465. package/templates/example-interview-options/example-motion.json +272 -0
  466. package/templates/example-interview-options/example-picks.json +15 -0
  467. package/templates/example-interview-options/example-post-composition.json +110 -0
  468. package/templates/example-interview-options/example-post-timing.json +105 -0
  469. package/templates/example-interview-options/example-reference.json +63 -0
  470. package/templates/example-interview-options/example-rig-type.json +63 -0
  471. package/templates/example-interview-options/example-seethrough.json +190 -0
  472. package/templates/example-interview-options/fullscreen.json +63 -0
  473. package/templates/example-interview-options/other-explicit.json +63 -0
  474. package/templates/example-interview-options/other-pending.json +63 -0
  475. package/templates/example-interview-options/other-picks.json +16 -0
  476. package/templates/example-interview.md +213 -0
  477. package/templates/example-invariants/invariants.json +1339 -0
  478. package/templates/example-prepared/prepared.svg +1 -0
  479. package/templates/example-prepared/source.svg +1 -0
  480. package/templates/example-project.json +4259 -0
  481. package/templates/example-remesh/AGENTS.md +134 -0
  482. package/templates/example-remesh/CLAUDE.md +3 -0
  483. package/templates/example-remesh/evidence/.gitkeep +0 -0
  484. package/templates/example-remesh/evidence/approval.txt +1 -0
  485. package/templates/example-remesh/evidence/captions.json +101 -0
  486. package/templates/example-remesh/evidence/diff-components.json +34 -0
  487. package/templates/example-remesh/evidence/direction/v4.json +74 -0
  488. package/templates/example-remesh/evidence/direction/v5.json +74 -0
  489. package/templates/example-remesh/evidence/direction-input-v4.json +74 -0
  490. package/templates/example-remesh/evidence/direction-input-v5.json +74 -0
  491. package/templates/example-remesh/evidence/interview/assemble.json +309 -0
  492. package/templates/example-remesh/evidence/interview/bones.json +190 -0
  493. package/templates/example-remesh/evidence/interview/camera_depth.json +103 -0
  494. package/templates/example-remesh/evidence/interview/constraints.json +272 -0
  495. package/templates/example-remesh/evidence/interview/meshes.json +190 -0
  496. package/templates/example-remesh/evidence/interview/motion.json +272 -0
  497. package/templates/example-remesh/evidence/interview/post_composition.json +123 -0
  498. package/templates/example-remesh/evidence/interview/post_timing.json +103 -0
  499. package/templates/example-remesh/evidence/interview/reference.json +59 -0
  500. package/templates/example-remesh/evidence/interview/rig_type.json +59 -0
  501. package/templates/example-remesh/evidence/interview/seethrough.json +186 -0
  502. package/templates/example-remesh/evidence/parts-check.json +127 -0
  503. package/templates/example-remesh/evidence/parts-review.json +88 -0
  504. package/templates/example-remesh/evidence/reopen.txt +1 -0
  505. package/templates/example-remesh/evidence/review-reads/6a17db694db96f1b6049a61a017e0c8e66757b982b8851e0187e561cfcf9af68.json +59 -0
  506. package/templates/example-remesh/evidence/scene/s1.json +69 -0
  507. package/templates/example-remesh/evidence/scene-citations.json +9 -0
  508. package/templates/example-remesh/evidence/setup.png +0 -0
  509. package/templates/example-remesh/evidence/split-config.json +1 -0
  510. package/templates/example-remesh/evidence/structure.json +30 -0
  511. package/templates/example-remesh/evidence/v1/registration/at-source.json +44 -0
  512. package/templates/example-remesh/evidence/v1/registration/citations.json +68 -0
  513. package/templates/example-remesh/evidence/v1/registration/compile-report.json +368 -0
  514. package/templates/example-remesh/evidence/v1/registration/config-source.json +88 -0
  515. package/templates/example-remesh/evidence/v1/registration/config.json +88 -0
  516. package/templates/example-remesh/evidence/v1/registration/interview-requirements.json +8 -0
  517. package/templates/example-remesh/evidence/v1/registration/package-lock.json +11 -0
  518. package/templates/example-remesh/evidence/v1/registration/path-adapter.json +1 -0
  519. package/templates/example-remesh/evidence/v1/registration/rigc-run-1.json +44 -0
  520. package/templates/example-remesh/evidence/v2/registration/at-source.json +44 -0
  521. package/templates/example-remesh/evidence/v2/registration/citations.json +68 -0
  522. package/templates/example-remesh/evidence/v2/registration/compile-report.json +368 -0
  523. package/templates/example-remesh/evidence/v2/registration/config-source.json +88 -0
  524. package/templates/example-remesh/evidence/v2/registration/config.json +88 -0
  525. package/templates/example-remesh/evidence/v2/registration/interview-requirements.json +8 -0
  526. package/templates/example-remesh/evidence/v2/registration/package-lock.json +11 -0
  527. package/templates/example-remesh/evidence/v2/registration/path-adapter.json +1 -0
  528. package/templates/example-remesh/evidence/v2/registration/rigc-run-1.json +44 -0
  529. package/templates/example-remesh/evidence/v3/registration/at-source.json +44 -0
  530. package/templates/example-remesh/evidence/v3/registration/citations.json +68 -0
  531. package/templates/example-remesh/evidence/v3/registration/compile-report.json +368 -0
  532. package/templates/example-remesh/evidence/v3/registration/config-source.json +88 -0
  533. package/templates/example-remesh/evidence/v3/registration/config.json +88 -0
  534. package/templates/example-remesh/evidence/v3/registration/interview-requirements.json +8 -0
  535. package/templates/example-remesh/evidence/v3/registration/package-lock.json +11 -0
  536. package/templates/example-remesh/evidence/v3/registration/path-adapter.json +1 -0
  537. package/templates/example-remesh/evidence/v3/registration/rigc-run-1.json +44 -0
  538. package/templates/example-remesh/inputs/background.png +0 -0
  539. package/templates/example-remesh/inputs/painting.png +0 -0
  540. package/templates/example-remesh/inputs/references/.gitkeep +0 -0
  541. package/templates/example-remesh/package.json +9 -0
  542. package/templates/example-remesh/project.json +3916 -0
  543. package/templates/example-reopened/project.json +4568 -0
  544. package/templates/example-review/config.json +1 -0
  545. package/templates/example-review/out/check/build/skeleton.model.json +1 -0
  546. package/templates/example-review/out/parts/piece.svg +1 -0
  547. package/templates/example-review/out/parts.json +1 -0
  548. package/templates/example-review/out/rig/mesh_report.json +1 -0
  549. package/templates/example-review/out/rig/motion.json +1 -0
  550. package/templates/example-review/out/rig/rig.json +1 -0
  551. package/templates/example-split/captions.json +357 -0
  552. package/templates/example-split/config.json +215 -0
  553. package/templates/legacy-example-project.json +1071 -0
  554. package/templates/project.json +199 -0
  555. package/templates/shared/conventions.json +23 -0
@@ -0,0 +1,337 @@
1
+ # Collections
2
+
3
+ Several rigs that belong together — characters cut from one group painting,
4
+ wearing one outfit set, sharing a pose, composed into one lineup — are a
5
+ **collection**. Shared direction is given once and inherited; a member answers
6
+ only what differs; one reference member goes first and sets the direction for
7
+ the rest; composition belongs to the collection; and a collection version pins
8
+ the exact member builds it was made from. The empty skeleton is
9
+ [../templates/collection.json](../templates/collection.json) with
10
+ [../templates/shared/conventions.json](../templates/shared/conventions.json);
11
+ the schema is `rig-create/collection@0`, v0 like a project's
12
+ ([PROJECT.md](PROJECT.md)).
13
+
14
+ ## Layout
15
+
16
+ ```
17
+ <collection>/
18
+ collection.json shared interview, member order, cross bars, composition, pins
19
+ AGENTS.md the collection's agent guide; CLAUDE.md imports it
20
+ package.json the rig-c packages, pinned once for every member
21
+ shared/
22
+ conventions.json conventions every member follows
23
+ members/<name>/ an ordinary project (the layout in PROJECT.md), without package.json or .git
24
+ inputs/ the group painting, shared references
25
+ references/
26
+ evidence/v<N>/ what a collection verdict rested on
27
+ derived/ regenerable (ignored by git)
28
+ outputs/v<N>/ lineup, outfit-switch takes (ignored by git)
29
+ scratch/ (ignored by git)
30
+ ```
31
+
32
+ ### Making one
33
+
34
+ ```
35
+ rig-create init --collection <dir> [--no-install]
36
+ rig-create init --member <collection dir> <name>
37
+ ```
38
+
39
+ `init --collection` writes the layout above: `collection.json` and
40
+ `shared/conventions.json` from the templates, both named after the folder, a
41
+ `.gitignore` for the untracked folders, the `package.json` pins, the install
42
+ (unless skipped), the agent guide, and a first commit of exactly those files.
43
+ **The collection is one git repository.** A collection version pins member
44
+ builds, so the collection's history has to hold the member records it pins; a
45
+ member with a repository of its own would be an opaque gitlink to it.
46
+
47
+ `init --member` takes the collection folder and a **name**, not a path: it
48
+ derives `members/<name>/`, so a member cannot be made outside `members/`, and a
49
+ folder that is not a collection is refused (`INIT_NOT_A_COLLECTION`) before
50
+ anything is written. It writes an ordinary project there (`project.json`,
51
+ `.gitignore`, `inputs/references/`, `evidence/`, the ignored folders, the
52
+ agent guide, its doc links pointing at the collection's install), registers it
53
+ in `collection.json` `members[]` (`{ name, project, input: null, note: null }`),
54
+ and commits exactly those files and `collection.json` in the collection's
55
+ repository. It has **no `package.json` and no repository of its own**: the
56
+ collection pins the packages once, so every member is built with the same
57
+ versions and a cross bar measures one toolchain; `interview --check` in a
58
+ member reads the collection's install.
59
+
60
+ Every framing answer, waypoint guide and post item guide the collection gave
61
+ starts in the member as an `inherited` reference (below), written with
62
+ `"by": "rig-create"`. Where the collection's answer is `null` or `"per-member"`,
63
+ the member's starts `null`: the member's own question, asked in its interview.
64
+ Refused by name: a duplicate (`INIT_MEMBER_EXISTS`, in `members[]` or as a
65
+ folder), a name that is not one folder name (`INIT_MEMBER_NAME_INVALID`), a
66
+ collection with no `name` (`INIT_COLLECTION_UNNAMED`), and a `collection.json`
67
+ with uncommitted changes (`INIT_COLLECTION_DIRTY`), so the member's commit never
68
+ carries someone else's edit. Outside a git work tree the files are written and
69
+ nothing is committed.
70
+
71
+ ### Members live inside the collection
72
+
73
+ `members/<name>/project.json`, not top-level projects referenced by name. A
74
+ member's input is cut from the collection's painting and its interview inherits
75
+ the collection's answers, so it has exactly one parent; a top-level project that
76
+ two collections referenced would inherit two answers to the same question. A
77
+ character wanted somewhere else is a new project, which may point at this one.
78
+ The folder path is the membership record, so `project.json` needs no
79
+ back-pointer and keeps its shape.
80
+
81
+ ## What the collection owns
82
+
83
+ | Field | Holds |
84
+ | --- | --- |
85
+ | `interview.questions[]` | Questions with `scope: "collection"`, answered here only (`id`, `scope`, `text`, `source`, `answer`, `history[]`): `members`, `reference_member`, `style`, `outfits`, `composition`. Same answer shape as [INTERVIEW.md](INTERVIEW.md#answer-shape). |
86
+ | `interview.framing[]`, `interview.waypoints[]`, `interview.post` | The INTERVIEW.md guides, given **once** for every member. An answer whose `value` is `"per-member"` leaves that guide to each member. |
87
+ | `plan.order[]` | One entry per phase (`phase`, `members[]`, `runs`: `alone` or `parallel`, `rests_on[]`, `ends_with`). Phase 1: the **reference member** goes alone through its own `interview` → `rig-review`. Phase 2: the rest, in parallel once their interviews are signed — a member's own interview still runs one at a time, because an interview needs the user's full attention and parallel interviews produce contradicting answers. |
88
+ | `plan.cross_bars[]` | Bars measured across members, e.g. *the shared pose plays exactly on every member in every outfit*. Each names the answers it rests on (`rests_on`), which members and variants it covers, and the `receipt` that measured it. |
89
+ | `plan.steps[]` | Composition steps — post-production at collection level — same shape as a project's post steps ([PROJECT.md § The plan](PROJECT.md#the-plan)). |
90
+ | `members[]` | `name`, `project` (path to its `project.json`), `input` (where its painting comes from: its own file, or a crop of the shared one), `note`. |
91
+ | `shared` | Path to `shared/conventions.json`: the variant (outfit) set, shared motion, shared pose, bone naming — what every member follows. It points at files by path rather than copying them. |
92
+ | `composition` | `lineup`, `layers[]` (who overlaps whom), `outputs_wanted[]`. **Composition belongs to the collection, never to a member**: a member's project does not hold a lineup or a group take, so a lineup cannot drift between two members' records. |
93
+ | `inputs[]`, `derived[]`, `archive`, `notes[]` | As in a project. |
94
+ | `versions[]` | Collection versions, each with `pins` (below), `composition_inputs`, `outputs`, `evidence`, `verdicts`, `changed`, `answers_feedback`. |
95
+ | `signoffs[]`, `stage`, `stage_values` | As in a project, with the collection's stages (below). |
96
+
97
+ ### Deferring a collection question
98
+
99
+ Only `interview.questions[]` entries with `scope: "collection"` may be
100
+ explicitly deferred. Record the person's or delegate's decision with
101
+ `rig-create collection answer composition <dir> --by <who> --defer-until post-interview --reason-file <file>`.
102
+ File paths are relative to the collection folder, or absolute. The reason
103
+ file supplies nonblank text unchanged. The writer records
104
+ `{ "deferred": { "by": "…", "at": "…", "reason": "…", "until_stage": "post-interview" } }`
105
+ as the question's `answer`, with `at` set from the clock. `until_stage` must
106
+ be an ordered collection lifecycle stage strictly later than the effective
107
+ current stage. `paused` is excluded as a deadline. A paused collection uses
108
+ its effective stage, as the collection check already does.
109
+
110
+ Before the deadline the check emits `COLLECTION_ANSWER_DEFERRED`, preserving
111
+ its exit status. At the deadline it refuses `INTERVIEW_INCOMPLETE`, and past
112
+ it `COLLECTION_ITEM_SILENT`. Resolve the deferral with
113
+ `rig-create collection answer composition <dir> --by <who> --value-file <file>`.
114
+ That file contains an ordinary answer object in the
115
+ [interview answer shape](INTERVIEW.md#answer-shape), including `verbatim`
116
+ and `value` for a user answer. The writer sets its `by` and `at`. Both forms
117
+ validate the candidate with the collection record check before writing;
118
+ unrelated pre-existing refusals may remain. Refused writes leave the bytes
119
+ unchanged. The previous non-null answer moves into the question's `history[]`
120
+ when that array exists, including when an ordinary answer replaces a
121
+ deferral. Without a history array it is simply replaced. All bytes outside
122
+ the answer and history values remain unchanged.
123
+
124
+ A deferral supplies no inherited value. New members start with a null answer
125
+ where a shared answer is deferred, and an existing inherited reference to a
126
+ deferred answer resolves as silence. Member-local deferrals and deferrals on
127
+ framing, waypoint or post guides refuse `ANSWER_MALFORMED`. Their existing
128
+ stage gates remain the way post items wait for their interview.
129
+
130
+ ### `shared/conventions.json`
131
+
132
+ | Field | Holds |
133
+ | --- | --- |
134
+ | `schema` | `rig-create/conventions@0` |
135
+ | `collection` | the collection's `name` |
136
+ | `variants` | `values[]` (outfit or other variant names), `source` (the answer they come from), `what_changes`, `what_stays` |
137
+ | `shared_motion` | `source` (which member's or file's motion every member plays), `note` |
138
+ | `shared_pose` | `what` (the pose every member shares), `receipts[]` (the measurements that showed it plays on each) |
139
+ | `bone_naming` | `declared` (the naming rule), `observed` (what the builds actually use, if it differs) |
140
+ | `notes[]` | free text |
141
+
142
+ ## Inherited, overridden, own
143
+
144
+ A member answers the same questions as any project, and every one of its
145
+ answers carries a `basis`:
146
+
147
+ | `basis` | Meaning | Shape |
148
+ | --- | --- | --- |
149
+ | `inherited` | The collection's answer applies unchanged. The value is **not copied**: it is read from the collection, so a later change to the collection answer reaches the member. | `{ "basis": "inherited", "from": { "collection": "<name>", "question": "<id>" }, "by": "interviewer", "at": "…" }` |
150
+ | `overridden` | The collection answered, and this member differs. A user answer (or a delegation) plus what it overrides and the user's reason. | the user-answer or delegated shape, plus `"basis": "overridden"`, `"overrides": { "collection", "question", "collection_answer_at" }`, `"why_verbatim"` |
151
+ | `own` | The collection did not answer it, or answered `"per-member"`. An ordinary answer. | the user-answer, delegated or not-applicable shape, plus `"basis": "own"` |
152
+
153
+ An inherited answer is a reference, not a copy:
154
+
155
+ ```json
156
+ { "basis": "inherited", "from": { "collection": "harbour", "question": "motion" },
157
+ "by": "interviewer", "at": "2026-11-12T10:00:00Z" }
158
+ ```
159
+
160
+ An override keeps what it overrides and why, so a later reader sees why one
161
+ member differs:
162
+
163
+ ```json
164
+ { "basis": "overridden",
165
+ "overrides": { "collection": "harbour", "question": "constraints", "collection_answer_at": "2026-11-11T15:00:00Z" },
166
+ "delegated": false, "by": "user", "at": "2026-11-12T10:04:00Z",
167
+ "verbatim": "Put physics on her skirt.",
168
+ "why_verbatim": "Hers is long; the others are short.",
169
+ "value": [{ "part": "bottomwear", "effect": "physics" }] }
170
+ ```
171
+
172
+ An inherited answer is resolved before use: if the collection's answer is
173
+ delegated, the member inherits the delegation and the agent's decision with it,
174
+ and a bounce on it is attributed to the collection's answer as delegated. An
175
+ override is the record of why one member differs; it is never written to make a
176
+ member match what the agent already built.
177
+
178
+ ### Recording a member override
179
+
180
+ `interview-answer` replaces an inherited answer locally. If `classify()`
181
+ resolves the shared answer as silent (withdrawn to `null`, or a user answer
182
+ of `"per-member"`), it records `basis: "own"` with no `overrides` and no
183
+ required `--why-file`. A shared delegation remains shared, as classified,
184
+ even when its agent decision says `"per-member"`. These cases are exercised
185
+ through the writer and member check in `tests/choices.test.ts`.
186
+
187
+ When a shared answer still applies, the writer records `basis: "overridden"`.
188
+ Supply `--why-file <file>` with either the ordinary
189
+ pick flags or `--from-review <actId>` to ingest the finalized job act. The
190
+ file must contain nonblank UTF-8. Its exact text, including spaces and
191
+ newlines, becomes `why_verbatim`; a note, an option label or agent reasoning
192
+ is not a substitute. A fresh replacement of an overridden answer requires a
193
+ fresh reason file too. Missing, blank or unreadable reasons refuse before
194
+ writing, leaving `project.json` byte-identical.
195
+
196
+ The writer fills `overrides` from the inherited collection reference and the
197
+ resolved answer's `at`. When replacing an override it preserves that original
198
+ reference. A legacy overridden answer without `overrides` recovers its
199
+ reference from the most recent inherited record in the item's `history[]`,
200
+ using the same collection-answer lookup as a fresh override. It retains
201
+ earlier local answers in history and never changes the parent collection.
202
+ These writer paths are covered by `tests/choices.test.ts`.
203
+
204
+ The member check validates overrides in current answers and `history[]`:
205
+ `overrides.collection` names the parent collection, `overrides.question`
206
+ names a question it answered, and `collection_answer_at` exactly matches a
207
+ current or historical answer's `at`. A later collection answer does not
208
+ invalidate a reference whose source remains in history. Every override needs
209
+ nonblank `why_verbatim`. These checks also run before an override write.
210
+ `OVERRIDDEN_ANSWERS_SINCE = 2026-11-06T00:00:00Z` dates the contract by the
211
+ member answer's own `at`: earlier invalid records WARN; records on or after
212
+ that date, or without a readable date, refuse. The checks and date boundary
213
+ are covered by `tests/overrides.test.ts`; codes are in [CHECKS.md](CHECKS.md#refusals).
214
+
215
+ ## Collection stages
216
+
217
+ `interview` → `plan-approved` → `reference` → `members` → `post-interview` →
218
+ `post` → `direction-review` → `accepted`, plus `paused`. Same rule as a
219
+ project: a stage moves only on a human `signoffs[]` entry. User step 1 (base
220
+ motion) runs in each member; the collection's own steps 2 and 3 are its
221
+ composition.
222
+
223
+ | Stage | User step | What happens | Ends with |
224
+ | --- | --- | --- | --- |
225
+ | `interview` | 1 | The collection questions and the shared guides are answered. | The user signs `{ "stage": "interview" }`. |
226
+ | `plan-approved` | 1 | Order and cross bars are drafted and signed. | `{ "stage": "plan-approved" }`. |
227
+ | `reference` | 1 | The reference member runs its own stages through `rig-review`. | The user signs `{ "stage": "reference" }`: *this is the direction for the rest*. Separate from the member's own acceptance, because accepting one rig is not agreeing it sets everyone's direction. |
228
+ | `members` | 1 | The other members run through `rig-review`, in parallel once their interviews are signed. | Every member's rig accepted; every cross bar met. |
229
+ | `post-interview` | 2 | Composition guides — lineup, overlaps, camera, timing — and the composition steps. | `{ "stage": "post-interview" }`. |
230
+ | `post` | 2 | Lineup, layers, collection outputs, each frozen as a collection version with its pins. | The composition steps' bars are met. |
231
+ | `direction-review` | 2 → 3 | The user reviews one collection version. Feedback on one member's rig goes back to that member's waypoints (`on_items[].member` names it). | The user accepts it. |
232
+ | `accepted` | — | Done. | — |
233
+ | `paused` | — | Stopped by a human sign-off. | — |
234
+
235
+ ## Pins: a member change never silently changes a collection output
236
+
237
+ A collection version pins its members like a lockfile. Each pin names the
238
+ member's version **and** the content hashes of every rig it used (model, atlas,
239
+ config, per variant):
240
+
241
+ ```json
242
+ "pins": [
243
+ { "member": "keeper", "version": 2, "rigs": [
244
+ { "variant": "default", "files": [
245
+ { "role": "model", "path": "outputs/v2/skeleton.json", "sha256": "…" },
246
+ { "role": "atlas", "path": "outputs/v2/atlas.atlas", "sha256": "…" },
247
+ { "role": "atlas", "path": "outputs/v2/atlas.png", "sha256": "…" },
248
+ { "role": "config", "path": "derived/v2/config.json", "sha256": "…" } ] },
249
+ { "variant": "winter", "files": [ … ] } ] }
250
+ ]
251
+ ```
252
+
253
+ A rig is a list of files, not one hash per role: an atlas is its `.atlas` text
254
+ and one or more page images, and one `atlas_sha256` cannot pin them. Paths are
255
+ relative to the member's folder.
256
+
257
+ The hashes bind the build named by a pin. An explicitly selected member
258
+ version remains locked when newer member builds are recorded. A default pin
259
+ keeps the latest-build check described below. A collection output whose
260
+ recorded sources do not hash to its pins is stale and is not shown.
261
+
262
+ Where a member has no `versions[]` yet (work that predates this structure), the
263
+ pin carries `"version": null` and the hashes alone, and says so in `note`.
264
+
265
+ ### Recording a collection version
266
+
267
+ ```
268
+ rig-create collection pin [<dir>] [--changed <sentence>] [--member <name>=<version>]...
269
+ ```
270
+
271
+ Run when a collection output is made: put it in `outputs/v<N>/` (`N` the next
272
+ collection version), then pin. It appends `versions[]` entry `N` to
273
+ `collection.json` with `pins`, the sha256 and size of every file under
274
+ `outputs/v<N>/`, `changed`, and empty `composition_inputs`, `evidence`,
275
+ `verdicts` and `answers_feedback` to fill. It writes, it does not commit.
276
+
277
+ Repeat `--member <name>=<version>` to select an existing rig version by its
278
+ positive integer `n`, for example `--member first=1 --member second=2`.
279
+ A name may appear only once and must be in `members[]`; malformed selectors,
280
+ unknown members and absent or non-rig versions refuse with
281
+ `PIN_SELECTION_INVALID`, before any write. Unspecified members use their
282
+ **latest rig version** (`kind: "rig"` or no kind, highest `n`). Only explicitly
283
+ selected pins carry `"selection": "explicit"`. The writer-generated
284
+ `tests/fixtures/collection-pin.json` locks one earlier build and leaves one
285
+ member at latest; `bun scripts/generate-collection-pin-fixture.ts <fresh dir> --check` reproduces it. `tests/collection-pin-select.test.ts` covers selection,
286
+ byte-identical refusals and every pinned hash across variants.
287
+
288
+ The rig files are read from the selected/default version: each `outputs[]` entry that is
289
+ a model (`.json`, `.skel`) or an atlas (`.atlas`, page images), or that names
290
+ its own `role`; and `provenance.config`, for every variant. An output names its
291
+ variant with `variant` (default `default`); a take or a contact sheet is not a
292
+ rig file and is not pinned. Every file present on disk is hashed there.
293
+ Refused by member name, all at once and nothing written: a member with no
294
+ project record (`MEMBER_PROJECT_MISSING`), no rig version or no rig file
295
+ (`PIN_NO_BUILD`), and a file on disk that no longer hashes to the version that
296
+ lists it (`PIN_SOURCE_DRIFT`) — it was rebuilt in place; record a new member
297
+ version first, so the pin names a build that exists.
298
+
299
+ ### The pin check
300
+
301
+ ```
302
+ rig-create collection --check [<dir>] [--json]
303
+ rig-create interview --check <collection dir | collection.json>
304
+ ```
305
+
306
+ Both run the same check. The pins checked are those of the **latest collection
307
+ version that has outputs** — the one a person would be shown; a version pinned
308
+ before its output exists is not checked yet. Every member in `members[]` is
309
+ compared with its pin according to its selection mode:
310
+
311
+ | Pin mode | Version compared | A newer member version alone |
312
+ | --- | --- | --- |
313
+ | Default, no `selection` | Latest rig version, which must match the recorded pin version | `PIN_STALE`; make and pin a new collection output |
314
+ | Explicit lockfile, `"selection": "explicit"` | The recorded rig version `n` | No change; the lock remains valid |
315
+ | Legacy, `"version": null`, no `selection` | Hashes alone while the member has no rig versions | `PIN_STALE` when a rig version appears |
316
+
317
+ Existing default and legacy behavior is retained (`tests/collections.test.ts`).
318
+ Explicit locks refuse when the recorded version disappears, its file list or
319
+ variant changes, or its recorded/present-on-disk hashes differ from the pin
320
+ (`tests/collection-pin-select.test.ts`). Each difference names the member:
321
+
322
+ - `PIN_STALE members[<name>]`: a default pin's latest rig version is not the
323
+ pinned one, or an explicit pin's recorded rig version is absent; a pinned file's sha256 (on disk where present, else as recorded)
324
+ differs from the pin; a pinned file is no longer listed; a rig file of the
325
+ version is not pinned. For a `"version": null` pin, a member that now has
326
+ versions, or a pinned file on disk that no longer hashes to it.
327
+ - `PIN_MISSING members[<name>]`: a member the pinned version does not pin.
328
+ - `PIN_UNKNOWN_MEMBER members[<name>]`: a pin for a name not in `members[]`.
329
+
330
+ The check also reads the collection record: schema, stage (from the collection
331
+ stages above), sign-offs (human, known stage, every `signoff` stage passed is
332
+ signed, `paused` signed), the collection's own questions, framing answers and
333
+ waypoint guides (`INTERVIEW_INCOMPLETE` at `interview`, `COLLECTION_ITEM_SILENT`
334
+ after it; post item guides the same from `post-interview`), and that every
335
+ `members[]` entry has its `project.json`. It does not check `plan.order`, the
336
+ cross bars or composition, and it does not run each member's interview check:
337
+ run `interview --check` in the member. Codes: [CHECKS.md § Collections](CHECKS.md#collections).
package/docs/CRAFT.md ADDED
@@ -0,0 +1,277 @@
1
+ # Craft notes
2
+
3
+ Lessons learned from rigs that were sent back in review, written down so the next
4
+ interview starts from them instead of repeating them. Each note is filed under the
5
+ waypoint where it is asked (see [INTERVIEW.md](INTERVIEW.md) for the waypoints and
6
+ the answer shape) and carries the default the interviewer proposes there.
7
+
8
+ **A note is a proposal, never a decision.** The interviewer reads the default out
9
+ ("Usually … — shall we?") and records the user's answer verbatim as the guide for
10
+ that waypoint. A "yes" is what makes the default the user's; a different answer
11
+ replaces it. A note is never ground for the agent to decide alone, and a default
12
+ nobody was asked about decides nothing.
13
+
14
+ **Direction and execution are kept apart.** A note here is a design call: a
15
+ reasonable user could answer it either way. A seam, a hole or a smeared plate is
16
+ not a design call — nobody would answer "yes" to it — so it is never asked at the
17
+ interview. Those defects are listed at the end, [for the gates](#for-the-gates-not-the-interview),
18
+ with the bar that would catch each. The checks an agent runs on every version
19
+ before anyone looks, and the review lessons behind them, are in
20
+ [LESSONS.md](LESSONS.md).
21
+
22
+ Each note has the same shape: the lesson, why it matters, the waypoint, and the
23
+ proposed default.
24
+
25
+ ## Framing
26
+
27
+ ### F1. Two kinds of rig
28
+
29
+ - **Lesson**: an illustration brought to life and a character made to perform are
30
+ different rigs. Walking, running and other travelling motion belong only to the
31
+ second.
32
+ - **Why**: treating a still illustration as a performer invites motion the
33
+ painting cannot carry — feet, a ground line and a back it never drew — and the
34
+ result reads as a puppet instead of a living picture.
35
+ - **Waypoint**: `rig_type`
36
+ - **Proposed default**: "This reads as an illustration to bring to life — usually
37
+ idle breath, expression, and hair and cloth on physics, with no walking or
38
+ running. Shall we?"
39
+
40
+ ### F2. What the painting leaves out stays out
41
+
42
+ - **Lesson**: what the painting does not show is not a defect to repair, and no
43
+ part is invented to fill it.
44
+ - **Why**: a part invented outside the frame — legs below the crop, a hidden
45
+ back — has no painted source, so it never matches the style and draws the eye
46
+ to exactly what the composition chose to hide.
47
+ - **Waypoint**: `rig_type`
48
+ - **Proposed default**: "Usually what lies outside the painting — legs below the
49
+ frame, a hidden back — stays out, and the rig works with what is drawn. Shall
50
+ we?"
51
+
52
+ ## `seethrough`
53
+
54
+ No interview note yet. How to run the split, check it and re-run it is
55
+ execution, not a design call, so it is not asked: it is in [SOURCE.md](SOURCE.md),
56
+ read before `seethrough` and `assemble`, with the cutting rules for `assemble`.
57
+
58
+ ## `assemble`
59
+
60
+ ### A1. Cut the bust, not the waist
61
+
62
+ - **Lesson**: give the chest its own part, so it can carry volume and motion,
63
+ rather than cutting the torso across the waist.
64
+ - **Why**: a waist cut is the seam the eye watches most during a breath, and it
65
+ opens; a separate bust part moves on its own without any seam across the body.
66
+ - **Waypoint**: `assemble`
67
+ - **Proposed default**: "Usually the bust is its own part and the torso is not
68
+ cut at the waist. Shall we?"
69
+
70
+ ### A2. Limbs that bend are cut at the joint and rounded
71
+
72
+ - **Lesson**: an arm or leg that has to bend is cut at the elbow or knee, with the
73
+ seam rounded in an image editor, and bends only within a small range; a larger
74
+ bend is a replacement drawing.
75
+ - **Why**: a limb cut anywhere else, or bent further than its overlap covers,
76
+ shows a straight cut edge or a gap at the joint.
77
+ - **Waypoint**: `assemble`
78
+ - **Proposed default**: "Usually an arm or leg that bends is cut at the elbow or
79
+ knee with a rounded seam and bends only a little; anything bigger gets its own
80
+ drawing. Shall we?"
81
+
82
+ ### A3. Soften a cut through skin, not a designed edge
83
+
84
+ - **Lesson**: a cut through continuous skin gets a soft alpha edge; a cut along
85
+ an edge the design already draws stays hard.
86
+ - **Why**: a hard edge across bare skin shows as a line when the parts move apart
87
+ by a pixel, while softening an edge the artist drew on purpose — a cuff, an
88
+ armour plate — blurs the design.
89
+ - **Waypoint**: `assemble`
90
+ - **Proposed default**: "Usually a cut across bare skin gets a soft edge, and a
91
+ cut on a drawn edge such as a cuff or an armour plate stays sharp. Shall we?"
92
+
93
+ ### A4. The user marks where the arm ends and the sleeve begins
94
+
95
+ - **Lesson**: where an arm and its sleeve share one layer, the boundary between
96
+ them is a design call shown to the user before rigging, and only the sleeve side
97
+ moves on physics.
98
+ - **Why**: a boundary guessed by the agent puts skin on the cloth chain or cloth
99
+ on the rigid arm, and either one is only noticed in motion.
100
+ - **Waypoint**: `assemble`
101
+ - **Proposed default**: "Usually we show you where the arm ends and the sleeve
102
+ begins before rigging, and only the sleeve sways. Shall we?"
103
+
104
+ ### A5. Variants of one character live in one rig
105
+
106
+ - **Lesson**: outfits or other variants of one character are swappable sets in one
107
+ rig, not one rig per variant.
108
+ - **Why**: one rig per variant multiplies every later fix and lets the variants
109
+ drift apart in bones and motion. In a collection this is answered once, at the
110
+ collection level, and inherited by its members.
111
+ - **Waypoint**: `assemble`
112
+ - **Proposed default**: "Usually each character is one rig with its outfits as
113
+ swappable sets. Shall we?"
114
+
115
+ ## `bones`
116
+
117
+ ### B1. Hands are not cloth
118
+
119
+ - **Lesson**: hands and arms ride their own bones, driven by keys, never the tip
120
+ of a cloth chain.
121
+ - **Why**: a hand weighted to the soft end of a sleeve's physics chain flaps like
122
+ a paper doll whenever the sleeve moves.
123
+ - **Waypoint**: `bones`
124
+ - **Proposed default**: "Usually arms and hands get their own bones and stay
125
+ rigid, with the sleeve swaying around them. Shall we?"
126
+
127
+ ## `meshes`
128
+
129
+ ### M1. The torso bends as one piece
130
+
131
+ - **Lesson**: the torso bends as one weighted mesh, not as cut pieces moved
132
+ rigidly.
133
+ - **Why**: rigid pieces moved against each other open at the seam, and the
134
+ background shows through the body in motion even when every still frame looks
135
+ closed.
136
+ - **Waypoint**: `meshes`
137
+ - **Proposed default**: "Usually the torso is one piece that bends with the
138
+ breath. Shall we?"
139
+
140
+ ### M2. The bust is meshed unless there is a reason
141
+
142
+ - **Lesson**: the bust is meshed with its own regions by default, so the chest
143
+ can carry volume and motion. It is left out only for a stated reason.
144
+ - **Why**: a chest bent as part of a plain torso mesh moves like the waist, flat;
145
+ and an exclusion nobody gave a reason for cannot be reviewed later.
146
+ - **Waypoint**: `meshes`
147
+ - **Asked instead of a default**: the default is not proposed; the exclusion is
148
+ asked: "Is there a reason to leave the bust out, such as a rigid breastplate?"
149
+ No reason keeps the default. A reason is recorded with the exclusion in the
150
+ `x_deform` value ([INTERVIEW.md](INTERVIEW.md)), and the agent passes it to
151
+ parts as the opt-out (rig-c/parts#986).
152
+ - **Body, not cloth**: bust motion is body motion. The rule that fitted cloth
153
+ gets no physics is about cloth: a fitted top is not a reason to leave the bust
154
+ out, nor to drop its jiggle (C2).
155
+
156
+ ## `constraints`
157
+
158
+ ### C1. Hair and loose cloth on physics, soft enough to trail
159
+
160
+ - **Lesson**: hair and loose cloth move on physics, soft enough to trail the body.
161
+ The rig supplies the response; the consumer supplies the wind.
162
+ - **Why**: hair keyed by hand repeats visibly, and a chain stiff enough to hold
163
+ its pose reads as one solid piece — the rig looks stiff even though physics is
164
+ on.
165
+ - **Waypoint**: `constraints`
166
+ - **Proposed default**: "Usually hair and loose cloth are on physics, soft enough
167
+ to trail the body, and the rig does not bake in a wind of its own. Shall we?"
168
+
169
+ ### C2. Chest volume comes from jiggle
170
+
171
+ - **Lesson**: a chest reads as having volume when its own part jiggles a beat
172
+ behind the breath.
173
+ - **Why**: a chest that moves exactly with the torso reads as painted on, flat.
174
+ - **Waypoint**: `constraints`
175
+ - **Proposed default**: "Usually the bust jiggles a little, a beat behind the
176
+ breath. Shall we?"
177
+
178
+ ### C3. A hem over nothing stays down
179
+
180
+ - **Lesson**: a long hem with nothing painted under it moves only so far that the
181
+ empty space beneath never shows.
182
+ - **Why**: a hem that swings freely lifts off empty canvas where feet or ground
183
+ should be, and the figure looks like it floats.
184
+ - **Waypoint**: `constraints`
185
+ - **Proposed default**: "Usually a long hem with no feet painted under it moves
186
+ only slightly. Shall we?"
187
+
188
+ ## `motion`
189
+
190
+ ### Mo1. A small breath; the body must not squash
191
+
192
+ - **Lesson**: breath is a small rise of the chest with the hips held where they
193
+ are.
194
+ - **Why**: a breath large enough to stretch the torso, or one that moves the hips
195
+ with it, reads as the body squashing rather than breathing.
196
+ - **Waypoint**: `motion`
197
+ - **Proposed default**: "Usually breath is a small chest rise, once per loop, with
198
+ the hips held still. Shall we?"
199
+
200
+ ## Post-production
201
+
202
+ These are asked after the rig is accepted, never at a rig waypoint: depth and
203
+ camera work are direction applied to a finished rig, not part of rigging.
204
+
205
+ ### P1. Depth is judged by eye
206
+
207
+ - **Lesson**: depth is judged by whether a turn reads as solid beside the
208
+ reference, not by how closely a depth map matches.
209
+ - **Why**: a depth map can match well and still turn badly, and a rougher one can
210
+ turn convincingly; only the turn on screen is what the viewer sees.
211
+ - **Waypoint**: `camera_depth`
212
+ - **Proposed default**: "Usually we judge the 2.5D turn by eye, side by side with
213
+ the reference. Shall we?"
214
+
215
+ ### P2. Show depth on a gaze path, not a sweep
216
+
217
+ - **Lesson**: depth is shown on an irregular gaze path with pauses, or together
218
+ with a motion such as an arm turn; a steady back-and-forth sweep is for finding
219
+ defects, not for showing depth.
220
+ - **Why**: the eye does not read a mechanical sweep as a solid head turning; it
221
+ reads a look that wanders and settles.
222
+ - **Waypoint**: `camera_depth`
223
+ - **Proposed default**: "Usually the turn is shown as a gaze wandering with
224
+ pauses. Shall we?"
225
+
226
+ ### P3. A head-turn needs an upright head
227
+
228
+ - **Lesson**: a head already tilted in the painting breaks under a turn; that is a
229
+ limit of the input, not of the tool.
230
+ - **Why**: turning a tilted head moves its features along the wrong axis, and the
231
+ skull reads as broken.
232
+ - **Waypoint**: `camera_depth`
233
+ - **Proposed default**: "This head is already tilted — usually a head-turn is left
234
+ out for such a painting. Shall we?"
235
+
236
+ ### P4. The face turns by depth, within a small range
237
+
238
+ - **Lesson**: a face turns by depth and change of view, within about ±15° left to
239
+ right and ±12° up and down, and is never rotated flat on the screen.
240
+ - **Why**: beyond that range the painted features have nothing behind them, and a
241
+ flat spin reads as the picture rotating, not the head.
242
+ - **Waypoint**: `camera_depth`
243
+ - **Proposed default**: "Usually the face turns within about ±15° left-right and
244
+ ±12° up-down. Shall we?"
245
+
246
+ ### P5. Depth that is there but invisible reads as flat
247
+
248
+ - **Lesson**: parallax has to be visible at viewing size.
249
+ - **Why**: depth present in the data but spanning only a few pixels across the
250
+ whole figure reads as flat, however correct it is.
251
+ - **Waypoint**: `camera_depth`
252
+ - **Proposed default**: "Usually the arms visibly lead the body when the view
253
+ turns. Shall we?"
254
+
255
+ ## For the gates, not the interview
256
+
257
+ These defects were sent back in review, but nobody would answer "yes" to them, so
258
+ they are never proposed to the user; the user only sees their absence. Each is a
259
+ gate candidate for [rig-c/parts](https://github.com/rig-c/parts), with the bar
260
+ that would catch it. The fix belongs in the rig or its source; a repaint or a
261
+ change of motion is not offered to the user as the way out of a defect.
262
+
263
+ | # | Defect | Bar that would catch it | Nearest parts check today |
264
+ | --- | --- | --- | --- |
265
+ | G1 | Background showing through the torso in motion ("waist tears"); missed when only a few sampled frames were read | 0 background pixels inside the figure band, counted over **every** frame of the loop, not a sample | partial: `SEAM_OVER_MOTION` is a bar for proven body-root pairs and only a warning for internal-joint and explicit seam pairs; `figure_openings` warns, never refuses |
266
+ | G2 | A seam line and a colour break across a part boundary, and a square notch at a mesh corner (an image stretched into padded UVs, plus a grid corner) | across every part boundary, the colour step is no larger than the painting's own step at the same place; the outline's turn angle is continuous across the boundary | none named |
267
+ | G3 | Kinked folds and a visible seam at rest that the painting does not have, caused by draw order | the setup pose matches the painting within a declared limit, over every part | yes when a limit is declared: `SETUP_MATCHES_PAINTING` (PASS/FAIL, SKIP without a limit); `SETUP_POSE_VS_SOURCE` reports the measurement |
268
+ | G4 | Pinholes inside the figure at rest | 0 transparent openings inside the figure silhouette in the setup pose | not as a bar: `figure_openings` warns; `RECOMPOSITE_HOLES` reports, never fails |
269
+ | G5 | Background plate residue where the figure was removed: a dark silhouette ghost, pale blurred blocks where a structure behind should continue, a smudged emblem, a colour smear | in a band around the figure mask, 0 figure-coloured pixels on the plate, and the fill continues the structure behind it | none — plates are composed outside the current checks |
270
+ | G6 | Plates or character source edited in code (segmentation, patch synthesis, scripted inpainting) instead of in an image editor. One exception: a receipted generative plate pass from a package command is a source, not a repair. It covers only the step-4 background figure-removal plate and the foreground matte, made by the parts plate command with a `rig-parts-plate-receipt/1` receipt and a mask taken from a source, never a hand polygon | every edited image carries an editor receipt, and every step-4 plate pass carries its plate receipt; 0 edits without one | none |
271
+ | G7 | A part carved out of a layer with a hand-drawn polygon instead of taken from the layer split or another real source; such cuts tear at the edge | every part's pixels trace to a layer of the split or to an editor receipt; 0 parts without a source | none |
272
+ | G8 | A paired part split unevenly — one side of a left/right bust, eye, hair end or hem panel missing, much smaller, or cut at a different place — and shown to the user that way | before the split proposal is shown, every pair has both members, comparable area and mirrored edge placement, measured on the parts and compared with the same measure on the painting, so an asymmetry the painting itself has is not flagged | none named |
273
+ | G9 | Specks and holes in the part images straight out of the layer split: loose dots apart from a part, transparent pinholes inside it | on each raw split layer before `assemble`, on a sentinel colour: 0 specks (an 8-connected island of alpha above 8 under 64 px that the painting has no matching content for — outside the silhouette, or not the painting's colour there) and 0 holes (transparent pixels inside the layer's own silhouette), both counts reported per layer; caught at the split, earlier than G4 at rest ([LESSONS.md](LESSONS.md#specks-and-holes-in-the-split-layers)) | none at the split: `assemble` reads only after the merge (`uncovered holes`, and speck counts in its limb-subset `LINT` lines) |
274
+
275
+ The source gives no numeric threshold for G2, G3, G5 and G8 beyond what is written
276
+ above (G9's 64 px is a pilot measurement, 2026-11-03); where a limit is needed it
277
+ is declared per rig, not assumed.