@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,886 @@
1
+ # The interview
2
+
3
+ The direction a user gives before any rig work starts, and the shape every
4
+ answer takes in `project.json`. The interview is organised by the **waypoints**
5
+ the rig work always passes through — the sections of a `@rig-c/parts` config —
6
+ and the user's decisions attach at each one. New adopted records use [per-ask choices](#per-ask-choices-interview2); the sentence format below remains historical. Camera, 2.5D depth and timing are
7
+ **post-production**, asked separately after the rig is accepted. The plan the
8
+ work follows is drafted from these answers ([PROJECT.md § The plan](PROJECT.md#the-plan));
9
+ a worked example is in [../templates/example-interview.md](../templates/example-interview.md),
10
+ with its record in [../templates/example-project.json](../templates/example-project.json).
11
+
12
+ Why this exists: an agent rigging a painting makes direction calls at every
13
+ waypoint — which parts move on physics, where the torso is cut, what stays
14
+ rigid, whether the hands move. Made alone, each of those calls is only found out
15
+ when a person watches the result and sends it back, and every bounce re-runs a
16
+ full build and review. The interview moves the calls to before the work. A user
17
+ who answers "auto" has chosen to hand that call to the agent, and the record
18
+ says so.
19
+
20
+ ## The user's three steps
21
+
22
+ The user sees parts/mesh review, the rigging questionnaire, rig/animation correction, and direction. The historical three-step grouping below applies to legacy records; new projects use the split order in PROJECT.md. Everything else in this file — waypoints, states,
23
+ provenance — is the machinery under them and is not something the user has to
24
+ learn; the interviewer asks in plain questions and never shows a waypoint id or
25
+ a form.
26
+
27
+ | User step | In this file | When |
28
+ | --- | --- | --- |
29
+ | 1. **Base motion** | Framing (`rig_type`, `reference`), then a guide at each rig waypoint: `seethrough`, `assemble`, `bones`, `meshes`, `constraints`, `motion` | stage `interview`, before any rig work; the parts judged at `parts-review` before rigging, the rig at the first review, on a still frame |
30
+ | 2. **Direction** | Post items: `camera_depth`, `post_timing`, `post_composition` | stage `post-interview`, after the rig is accepted; judged at the second review |
31
+ | 3. **Polish feedback** | Verdicts on a shown version, each tied to a waypoint or post item | at either review, as often as it takes |
32
+
33
+ ## Every item has an owner
34
+
35
+ No answer is left empty for the agent to fill later. Each question ends in
36
+ exactly one of four states:
37
+
38
+ | State | Meaning | Who writes it |
39
+ | --- | --- | --- |
40
+ | `null` | Not asked yet. The interview cannot be signed while a framing answer or the guide of a waypoint the plan passes is `null`. Post items are asked when `post-interview` opens, not before. | — |
41
+ | user answer | The user's own words, verbatim, plus a normalised `value`. "None" is a user answer (`"value": "none"`), not a delegation: *there is no reference* is a decision. | the interviewer, from the user |
42
+ | delegated | The user said "auto" (or "you decide", or pressed a control that means it). The agent decides that item and writes its decision and reasoning into `agent_decision` beside the delegation. | the interviewer records the delegation; the agent fills `agent_decision` |
43
+ | not applicable | A prompt's `required_for` does not include the answered `rig_type`, or the pipeline for this project has no such section (a pre-layered input skips `seethrough`). Derived, not judged, so the interviewer may write it. | the interviewer |
44
+
45
+ Rules that follow from the table:
46
+
47
+ - **A delegated item stays delegated.** Signing the plan that shows the agent's
48
+ decision does not turn it into a user answer. If the user wants it to be
49
+ theirs, they answer it: the new answer replaces the old, and the old one moves
50
+ to that question's `history[]`. Reason: a bounce on a delegated item is a cost
51
+ the user chose, and the record must still say so after the plan is signed.
52
+ - **The agent's decision on a delegated item is written before the plan is
53
+ signed**, so the user sees every agent choice the plan rests on at the moment
54
+ they sign. A delegated item the plan does not need yet may wait, but its
55
+ `agent_decision` is written before the step that uses it starts.
56
+ - **A bounce is attributed to the items it is about.** Each verdict lists
57
+ `on_items[]`: the answer ids it concerns and whether each was a user answer,
58
+ delegated, or never asked ([§ Polish feedback](#polish-feedback)).
59
+ - **A changed answer reopens what rests on it.** Every plan step whose
60
+ `rests_on` names that answer needs the plan signed again before it runs.
61
+
62
+ `rig-create interview --check` is the machine check of these rules — refusing
63
+ by name every waypoint with neither a guide nor a delegation, every step that
64
+ rests on no answer, every stage moved without a sign-off; this document is the
65
+ contract it checks and [CHECKS.md](CHECKS.md) lists its codes. Delegation is a
66
+ pass for that check, never a hole: the refusal fires only on silence.
67
+
68
+ ## Answer shape
69
+
70
+ New adopted projects use [per-ask choices](#per-ask-choices-interview2). The
71
+ examples in this section describe the preserved legacy sentence format.
72
+
73
+ Every record in `project.json` that a person made — an answer, a sign-off, a
74
+ verdict — carries the same three fields: `by` (who), `at` (when, ISO 8601) and
75
+ `verbatim` (the words used). One shape, so a reader never has to learn which
76
+ record calls the date what.
77
+
78
+ A user answer:
79
+
80
+ ```json
81
+ {
82
+ "delegated": false,
83
+ "by": "user",
84
+ "at": "2026-11-10T14:05:00Z",
85
+ "verbatim": "Breath and blink. The scarf lifts when the wind comes.",
86
+ "value": [
87
+ { "motion": "breath" },
88
+ { "motion": "blink" },
89
+ { "motion": "scarf_lift", "note": "only with the wind" }
90
+ ],
91
+ "source": "interview, chat"
92
+ }
93
+ ```
94
+
95
+ A delegated answer, after the agent has decided:
96
+
97
+ ```json
98
+ {
99
+ "delegated": true,
100
+ "by": "user",
101
+ "at": "2026-11-10T14:07:00Z",
102
+ "verbatim": "auto",
103
+ "source": "interview, chat",
104
+ "agent_decision": {
105
+ "value": { "passes": ["full", "head"] },
106
+ "by": "agent",
107
+ "at": "2026-11-10T15:20:00Z",
108
+ "reasoning": "Blink needs the eyelids as their own layers; at full-figure resolution the face is too small for the split to find them."
109
+ }
110
+ }
111
+ ```
112
+
113
+ Not applicable:
114
+
115
+ ```json
116
+ { "not_applicable": true, "because": "rig_type = fullscreen.minimal", "by": "interviewer", "at": "2026-11-10T14:09:00Z" }
117
+ ```
118
+
119
+ - `verbatim` is kept in the language the user used. `value` is the interviewer's
120
+ normalisation of it; when the two disagree, `verbatim` wins and `value` is
121
+ corrected.
122
+ - `source` says where the words were given (chat, a call, a note) so the
123
+ record can be traced; chat is not a record — the decision is copied here.
124
+ A **derived answer**, taken from words already on record instead of asked
125
+ again, says so here ([§ Derived answers](#derived-answers)).
126
+ - A sentence may leave part of a waypoint open ("the rest is up to you"). Then
127
+ the agent's choice for that part is written to `agent_decision` beside the
128
+ sentence, with `covers` naming what it fills, and that part reads as
129
+ delegated.
130
+ - A guide may grow after the interview: a sentence added from polish feedback
131
+ or from an `x_` prompt goes into the guide's `additions[]`, each with `by`,
132
+ `at`, `verbatim`, `value` and `source`. The original sentence is not edited,
133
+ so a provenance `quote` taken from it stays findable; an addition is quoted
134
+ the same way.
135
+ - A replaced answer moves whole into the question's `history[]`; the record
136
+ never loses what was once decided.
137
+ - Collection members add a `basis` field to every answer
138
+ ([COLLECTIONS.md § Inherited, overridden, own](COLLECTIONS.md#inherited-overridden-own)).
139
+
140
+ ### Derived answers
141
+
142
+ Before asking, the interviewer reads what is already on record — earlier
143
+ answers, an intake note in `inputs/`, a reviewer's past verdicts — and takes
144
+ from it every answer those words already give. Only what is left is asked, in
145
+ one short message. Asking a user what their own earlier sentence already
146
+ answered is a cost the record could have saved.
147
+
148
+ A derived answer is an ordinary user answer; only `source` says where it came
149
+ from:
150
+
151
+ ```json
152
+ {
153
+ "delegated": false,
154
+ "by": "user",
155
+ "at": "2026-11-08T10:12:00Z",
156
+ "verbatim": "Only the chest breathes; the hips stay where they are.",
157
+ "value": [{ "motion": "breath", "note": "chest only, hips still" }],
158
+ "source": "derived from inputs/intake.md"
159
+ }
160
+ ```
161
+
162
+ - `by`, `at` and `verbatim` are those of the words on record — who said them,
163
+ when, the exact fragment — not of the derivation. A reviewer's past verdict
164
+ keeps the reviewer as `by`.
165
+ - `source` starts with `derived from` and names the record: a file under
166
+ `inputs/`, an answer (`interview.waypoints[motion].guide`) or a verdict
167
+ (`versions[v1].verdicts[0]`). The `verbatim` fragment is found in that
168
+ record, so anyone can trace it.
169
+ - Only words are derived. An answer the record merely implies, and anything
170
+ read off the image, is still a question.
171
+ - The message that asks what is left lists each derived answer in one line, so
172
+ the user can correct it; a correction replaces it, and the derived answer
173
+ moves to `history[]`.
174
+
175
+ For unadopted records no new field is needed: `interview --check` reads a derived answer as the user
176
+ answer it is, and a provenance `quote` taken from it resolves against its
177
+ `verbatim` like any other.
178
+
179
+ ## Direction and exact words
180
+
181
+ In unadopted records, the split and direction are received in the user's own sentences —
182
+ "cut the bust, not the waist, and give it jiggle physics", "the hem moves in the
183
+ wind down to the knee" — not as a drawing or a form. The prompts below draw
184
+ those sentences out; they are not fields to fill.
185
+
186
+ - The sentence is the answer, stored `verbatim`. `value` is the agent's
187
+ normalised reading of it and never replaces it. One sentence may answer
188
+ several questions; it is stored once and referenced.
189
+ - Every part, effect, motion or extent a sentence names is a line the work is
190
+ checked against: a part said to be cut must exist as a part; an effect said to
191
+ be on a part (wind, physics, jiggle) must be on that part and on no part the
192
+ sentence excludes; an extent ("down to the knee") bounds what moves. A
193
+ sentence that says "must" is a bar, not a preference. Turning these lines into
194
+ `@rig-c/core` `invariants` starts with the pure translator in
195
+ [`src/invariants.ts`](../src/invariants.ts), documented in [INVARIANTS.md](INVARIANTS.md).
196
+ Its sourced entries and explicit gaps are reproduced in
197
+ [`example-invariants/invariants.json`](../templates/example-invariants/invariants.json).
198
+ Project/check/build wiring remains a follow-up; until then these lines are
199
+ read at review against the version's provenance.
200
+ - Anything the agent shows back — the labelled split image, a motion sketch — is
201
+ its reading of the sentences for the user to sign, not the user's input.
202
+
203
+ ## Waypoints: where the guide attaches
204
+
205
+ A waypoint is a place the agent always passes while rigging, with the user's
206
+ guide waiting at it. The waypoints are not a hand list: **they are the top-level
207
+ sections of the `@rig-c/parts` config the work writes**, grouped by the decision
208
+ made there. A new config section is a new place a decision is made, so it joins
209
+ a waypoint (or becomes one) without anyone editing a list. The template's
210
+ waypoint list is a snapshot of the sections at the package version named in
211
+ `interview.question_set`; project creation is expected to regenerate it from the
212
+ installed package.
213
+
214
+ Not every section is a waypoint. A section is one when writing it is a
215
+ **direction call** — something the user could have an opinion about before
216
+ seeing a build. Read from `@rig-c/parts` 2.4.0:
217
+
218
+ | Config section | Where it goes | Why |
219
+ | --- | --- | --- |
220
+ | `seethrough` | waypoint `seethrough` | how the painting is decomposed into layers |
221
+ | `assemble`, `limbs`, `scene`, `waist` | waypoint `assemble` | what becomes a part, where the cuts are, what the painting is, which outfit sets exist (`assemble.alternates` is a field of `assemble`, not a section of its own) |
222
+ | `bones` | waypoint `bones` | where bones sit, which parts get chains |
223
+ | `meshes`, `regions` | waypoint `meshes` | what deforms and what rides rigid |
224
+ | `constraints`, `stops`, `cloth` | waypoint `constraints` | what moves on physics and how far |
225
+ | `motion` | waypoint `motion` | what moves, how far, how fast |
226
+ | `turn`, `depth` | post item `camera_depth` | head-turn and 2.5D depth are direction, asked after the rig is accepted |
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
+
229
+ The agent writes the checks file named by the config's `requirements` path.
230
+ Declare `setup_painting.required: true` there. Measure its limits on the build
231
+ the user accepted at the split checkpoint, using parts' own `pixel_count` per
232
+ region on that build. Record them as a "no worse than the accepted split" bar
233
+ with its source, including the accepted build and the measurement. Create
234
+ chooses no limit values. Parts refuses missing limits by name with
235
+ `SETUP_PAINTING_REQUIRED_LIMIT`, and enforces the declared limits through
236
+ `SETUP_MATCHES_PAINTING`. The file also needs an authored `fps`, which has no
237
+ default. Create writes no config or requirements file during init.
238
+
239
+ A section that cannot be placed on this table when it appears is a question for
240
+ the user before it is written. The table lives as data in `src/waypoints.ts`,
241
+ and the section list is read from the installed package, so
242
+ `interview --check` refuses such a section by name ([CHECKS.md](CHECKS.md)).
243
+
244
+ **Every waypoint the plan passes carries a guide — the user's sentences or an
245
+ explicit delegation. Nothing is decided silently.** The guide is one answer in
246
+ the shape above, stored on the waypoint (`interview.waypoints[].guide`). A
247
+ waypoint the plan does not pass is answered *not applicable* with the reason,
248
+ and is not asked. "None" is a guide: *nothing moves on physics* is a decision
249
+ about `constraints`.
250
+
251
+ Each waypoint has **prompts**: the questions the interviewer asks to draw out the
252
+ sentence. `rig_type` and `reference` frame everything and are asked first,
253
+ because `rig_type` decides which waypoints are passed and which prompts apply,
254
+ and `reference` decides what every review compares against.
255
+
256
+ | # | Waypoint | What the agent decides there | Prompts | Guide sentence, example |
257
+ | --- | --- | --- | --- | --- |
258
+ | F1 | framing | which waypoints are passed; the plan's outline | `rig_type` | *"A standing character, idle; she holds a lantern."* |
259
+ | F2 | framing | what reviews compare against | `reference` | *"The idle in our trailer, but slower."* |
260
+ | W1 | `seethrough` | how the painting is decomposed into layers: resolution, the head crop, the seed | `x_layers` | *"Keep the hat with the head; the lantern she holds is its own layer."* |
261
+ | W2 | `assemble` | which layers become which parts and in what draw order, where limbs are cut, what is authored new, what is kept under occluders, which outfit sets exist | `split_granularity`, `split_emphasis` | *"Cut the bust, not the waist."* · *"Keep her face exactly as painted."* |
262
+ | W3 | `bones` | where bones sit and which parts get chains (hair, coat tails, sleeves) and how long | `x_chains` | *"Two chains in the back hair, one in each coat tail; the scabbard stays rigid on the hip."* |
263
+ | W4 | `meshes` | which parts deform as weighted meshes and which ride one bone as rigid regions; mesh density | `x_deform` | *"The waist stays one piece that bends; the face is rigid on the head."* |
264
+ | W5 | `constraints` | which parts move on physics, how strongly, with wind and gravity, and where a chain must stop | `split_effects` | *"The hem moves in the wind down to the knee; the bust jiggles; the sleeves barely move."* |
265
+ | W6 | `motion` | the tracks (what moves, how far, how fast), the loop length, blinking; for a game-logic scene, the states | `motions`, `game_states` | *"A slow breath, about three seconds; blink now and then; the head does not sway."* |
266
+
267
+ [CRAFT.md](CRAFT.md) holds the craft notes: per waypoint, the default the
268
+ interviewer may propose ("Usually X — shall we?"). The interviewer may read one
269
+ out as a proposal; the user's reply is the guide, and a default nobody was asked
270
+ about decides nothing.
271
+
272
+ ### Prompts
273
+
274
+ Each prompt keeps its `id`, its `text` and its `required_for`; for a `rig_type`
275
+ it does not apply to, it is skipped and the waypoint is still asked through its
276
+ other prompts. `source` says whether the prompt is part of the standard set
277
+ (`rig-create`) or was added for this project (`project`, see
278
+ [§ Questions outside this set](#questions-outside-this-set)).
279
+
280
+ | id | At | Prompt | Required for |
281
+ | --- | --- | --- | --- |
282
+ | `rig_type` | framing | What is this: a character rig — standing idle, complex motion, or a monster with its own moves — or a full-screen scene — minimal motion (breath, blink) or motion tied to game logic? | all |
283
+ | `reference` | framing | "Make it feel like this": a video, an existing demo, a game you have in mind? | all |
284
+ | `x_layers` | `seethrough` | What must the layer split keep together or apart, and what resolution, head crop and seed should the passes use? | all |
285
+ | `split_granularity` | `assemble` | Which parts are cut and how finely, in what draw order, with what authored new or kept under occluders, and which outfit sets? | all |
286
+ | `split_emphasis` | `assemble` | Which parts matter most — more detail, or kept exactly as painted? | all |
287
+ | `x_chains` | `bones` | Which parts get chains or stay rigid, where do the bones sit, and how long are the chains? | all |
288
+ | `x_deform` | `meshes` | What must bend smoothly as one piece, what must stay rigid, and at what mesh density? | all |
289
+ | `split_effects` | `constraints` | Which parts have special effects, how strongly and how far do they move, what gravity applies, and where must chains stop? | all |
290
+ | `motions` | `motion` | Which moves? Name each one, how far and how fast it moves, the loop length, and whether it blinks. | all except `fullscreen.game_logic` |
291
+ | `game_states` | `motion` | Which states and transitions, how far and how fast does each motion move, and how long is the loop? | `fullscreen.game_logic` |
292
+
293
+ Values the agent normalises a guide into, per prompt (the sentence stays the
294
+ answer):
295
+
296
+ - `rig_type`: `character.idle`, `character.complex`, `character.monster`,
297
+ `fullscreen.minimal`, `fullscreen.game_logic`. Any other value is refused
298
+ (`RIG_TYPE_UNKNOWN`). A `fullscreen.*` project is a CG build: its rig
299
+ versions declare the three CG gates ([CHECKS.md § CG gates](CHECKS.md#cg-gates)).
300
+ - `reference`: a list of `{ "ref", "take" }`, or `"none"`. A file the user hands
301
+ over goes to `inputs/references/` with its sha256 — it is an input, not
302
+ documentation.
303
+ - `split_granularity`: `coarse` (only the parts a listed motion moves),
304
+ `standard` (limbs and garments at joints), `fine`, or a part list.
305
+ - `split_emphasis`: a list of `{ "part", "want": "detail" | "untouched" | <text> }`,
306
+ or `"none"`.
307
+ - `x_deform`: `{ "meshes": [<part>], "rigid": [<part>], "bust": … }`, where
308
+ `bust` is `"default"` (meshed with its own regions; also what no `bust` means)
309
+ or `{ "excluded": true, "reason": "<the user's reason>" }`. A blank reason is
310
+ refused (`BUST_EXCLUSION_UNREASONED`); [CRAFT.md M2](CRAFT.md#m2-the-bust-is-meshed-unless-there-is-a-reason).
311
+ - `split_effects`: a list of `{ "part", "effect", "extent" }` — effect from
312
+ `physics`, `wind`, `jiggle`, `rigid`, `still`, or free text; extent as said
313
+ ("down to the knee").
314
+ - `motions`: a list of `{ "motion", "note" }`.
315
+ - `game_states`: `{ "states": [{ "name", "loop", "motions" }], "transitions": [{ "from", "to", "trigger" }] }`.
316
+
317
+ The full label map — every part outlined on an image with one label — is the
318
+ agent's reading of the `assemble` and `constraints` guides, shown back for the
319
+ user to sign at the `assemble` checkpoint ([PROJECT.md § Split approval](PROJECT.md#split-approval-is-a-plan-checkpoint)).
320
+ It is not asked.
321
+
322
+ When the `assemble` guide is answered, tell the user, in plain words, that they
323
+ will see the assembled parts before anything is rigged, and why: a part with
324
+ nothing under its occluder, or a seam between two parts, is cheap to fix then
325
+ and expensive after every rig build made on it
326
+ ([PROJECT.md § The parts are reviewed before rigging](PROJECT.md#the-parts-are-reviewed-before-rigging)).
327
+ Their sign-off is the verdict they save in rig-review's parts view: it is
328
+ recorded with the `parts-review` sign-off as evidence, and a part changed after
329
+ it means they look again.
330
+
331
+ ## Post-production: asked after the rig is accepted
332
+
333
+ 2.5D depth and camera work are far from rigging: nothing in the rig is built or
334
+ judged for them. They are not rig waypoints. Their guides are asked when
335
+ `post-interview` opens, after the rig has passed `rig-review`, in the same
336
+ answer shape and under the same rule: every post item the plan passes carries a
337
+ sentence or a delegation. Asking them earlier would ask about a rig that may
338
+ still change. "Accepted" means one rig version accepted at `rig-review` on its
339
+ still frame; the post work runs on that version, which `rig-create handoff`
340
+ names ([PROJECT.md § The hand-off to post-production](PROJECT.md#the-hand-off-to-post-production)).
341
+
342
+ | id | Config sections | Prompt | What the agent decides there | Guide sentence, example |
343
+ | --- | --- | --- | --- | --- |
344
+ | `camera_depth` | `turn`, `depth` | Does the view move — a 2.5D head-turn with parallax, a push-in — or is it fixed? | whether depth is built, how far layers shift, the camera path | *"Fixed camera, no parallax."* · *"A slow head-turn to the left, as if she notices someone."* |
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
+ | `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
+
348
+ ## Bars have reading commands
349
+
350
+ Before putting a bar to the user for sign-off, the drafter names the command
351
+ that produces **each** reading in it, the inputs it reads and the output that
352
+ contains the reading. Check each command and flag against the installed CLI's
353
+ `--help`. A missing command, or a command that only produces inputs for a
354
+ missing measurement, is a **STOP before sign-off**. Write the command beside
355
+ its clause in the plan's `bar` text. No new record field is needed.
356
+
357
+ For example, for a compiled synthetic eight-second `idle` candidate in
358
+ `derived/rig/`, these are two draft clauses, each with its reading command.
359
+ The candidate and its named animation must exist before the draft is signed.
360
+
361
+ - A warm idle loop has a frame series and bone geometry available for review.
362
+ Run `node_modules/.bin/rigc render --candidate derived/rig --animation idle --fps 24 --geometry --preroll 3 --out derived/warm`.
363
+ Read the recorded loop's frames and `geometry.json` in the reported set
364
+ directory. This provides the review inputs for one warm loop.
365
+ - At 4 seconds the setup's named chain tips are visible for a pose review.
366
+ Run `node_modules/.bin/rigc inspect --candidate derived/rig --animation idle --at 4 --fps 24 --show art,bones --out derived/idle-at-4.png`.
367
+ Read the image and its companion legend's bone origins and tips. A pose
368
+ review is read by eye, with its verdict written beside the image.
369
+
370
+ ### Appearance belongs to a person's review
371
+
372
+ An appearance item that needs the whole piece before it can be judged is not
373
+ an intermediate step bar: perceived jiggle size, perceived motion and "looks
374
+ right in the loop" belong in the plan as items for a later **person's review**.
375
+ Route a rig step's item to `rig-review`, and a post step's to `direction-review`.
376
+ Attach the step's measured readings as context; keep the step bar about those
377
+ readings, rather than stopping mid-step for an appearance verdict.
378
+
379
+ No agent can watch a loop: an image reader shows one frame. A call that needs
380
+ a moving image ("seen at 1x in the loop") therefore goes to a person's review
381
+ by design, never to an agent's step. Reading a frame series or measuring bone
382
+ positions does not supply that person's appearance verdict. A numeric reading
383
+ beside an appearance phrase does not turn the appearance call into a step bar.
384
+
385
+ `interview --check` warns with `STEP_APPEARANCE_REVIEW` when a step bar contains
386
+ one of the [documented phrases](CHECKS.md#appearance-bar-wording) without a
387
+ numeric reading. This wording heuristic is a WARN, never a refusal: it can
388
+ miss a paraphrase or flag a quotation, and cannot decide whether a motion
389
+ looks right. Its absence is no approval of an appearance bar.
390
+
391
+ ### Warm loops and multi-period twins
392
+
393
+ Today's `rigc render --preroll <n>` walks whole loops of a looping track before
394
+ recording one loop, carrying physics across each wrap. The help says `n` is a
395
+ whole number of 1 or more. It lists refusals for a walk past what a step list
396
+ holds, a skeleton with no animation or no physics constraint, a set of 0
397
+ frames, and `--environment` or `--parallax` beside it. `check` refuses that
398
+ frame set as a reference. It supplies one warm recorded loop, with the preroll
399
+ recorded in its metadata.
400
+
401
+ To read an environment schedule or each successive boundary, make a
402
+ **measurement twin** with one animation several source periods long, then
403
+ render it once with `--geometry` and, if needed, `--environment schedule.json`.
404
+ The schedule uses the twin's time range. This keeps physics running through
405
+ internal period boundaries without asking `inspect --at` or an environment
406
+ schedule to read beyond a source animation's duration. `inspect --at` still
407
+ uses the animation's `--fps` frame grid.
408
+
409
+ Keep the source unchanged. Record the source, twin, period, number of periods,
410
+ frame rate, poser, grid and every track difference with the evidence. A blink
411
+ keyed once is **not repeated** in later periods. The twin therefore cannot
412
+ prove those periods have the source's repeated blink. Name any other one-shot
413
+ track and its difference too. A multi-period render is measurement evidence
414
+ only for the behaviour it actually reproduces.
415
+
416
+ ### Post bars on a looping idle
417
+
418
+ Draft the loop-seam bar with these three clauses before seeking sign-off.
419
+
420
+ 1. Compare the whole-figure changed-pixel count across a boundary with physics
421
+ on against physics off **at that same boundary**. Breath can have its
422
+ fastest phase at the wrap, so its in-loop maximum excludes the very step
423
+ being judged.
424
+ 2. Name every background used for that count, for example white `#ffffff` and
425
+ sentinel magenta `#ff00ff`, with the same pixel grid, frame rate, boundary
426
+ times and counting definition for the on/off pair.
427
+ 3. Keep the physics reading for each named chain tip. Its boundary jump must
428
+ be no larger than that tip's own largest in-loop frame-to-frame step.
429
+ Compare distances in the same world units and at the same frame rate.
430
+
431
+ Today's `rigc render --help` offers neither a physics-off pose command nor a
432
+ whole-figure boundary pixel counter. `--environment` controls wind and gravity;
433
+ its help provides no physics-off setting. The whole-figure comparison therefore
434
+ has no reading command today. A bar that requires it is a **STOP before
435
+ sign-off** until a tool supplies that reading. Rendering frames is only an
436
+ input to counting them. Do not give the user an executable-looking command for
437
+ a measurement tool that does not exist.
438
+
439
+ The filled example adds only the chain-tip clause that can be read from
440
+ `render --geometry`, with its reduction stated beside the command. It omits
441
+ the unavailable whole-figure comparison. A project requiring all three clauses
442
+ must resolve the missing reading before it can sign its post bar.
443
+
444
+ ## Provenance: every config section cites its guide
445
+
446
+ Each section of the config the agent writes cites the guide sentence or the
447
+ delegation it rests on. A section with no basis is a value the agent invented,
448
+ which is what the interview exists to stop. The citation lives in `project.json`
449
+ beside the version built from that config — `versions[].provenance` — not inside
450
+ the config, because the config lives with the build in `derived/` and is not
451
+ kept:
452
+
453
+ ```json
454
+ "provenance": {
455
+ "config": { "path": "derived/v1/config.json", "sha256": "…" },
456
+ "sections": {
457
+ "assemble": [
458
+ { "entry": "plan[bust]", "guide": "assemble", "quote": "Cut the bust, not the waist." },
459
+ { "entry": "plan[*] order", "guide": "assemble", "delegated": true }
460
+ ],
461
+ "constraints": [
462
+ { "entry": "bust_physics", "guide": "constraints", "quote": "the bust jiggles" },
463
+ { "entry": "hem_*", "guide": "constraints", "quote": "The hem moves in the wind down to the knee" }
464
+ ]
465
+ }
466
+ }
467
+ ```
468
+
469
+ - `sections` is keyed by config section name; `entry` names the item in the
470
+ section (a part, bone, constraint or track, with `*` for a rule that covers
471
+ several); `guide` is the answer id it rests on (a waypoint, framing or post
472
+ item id); `quote` is the exact fragment of the stored sentence it follows;
473
+ `delegated: true` points at the delegation or `agent_decision` instead.
474
+ - An entry with no citation is a decision nobody gave. It is either cited (by
475
+ finding the sentence, or asking for one) or removed before the version is
476
+ shown. `interview --check` refuses, by section name, a section with no
477
+ citation and a citation that does not resolve — a `guide` that is no answer,
478
+ a `quote` found in none of that answer's stored sentences, a `delegated: true`
479
+ on an answer the user did not hand over
480
+ ([CHECKS.md § Provenance](CHECKS.md#provenance)).
481
+ - A bounce's `on_items` names the waypoint, and the provenance says which
482
+ sentence or delegation the bounced entry came from.
483
+
484
+ ## Polish feedback
485
+
486
+ What the user says after seeing a version is stored verbatim in that version's
487
+ `verdicts[]`, with `review` (`rig-review` or `direction-review`) and
488
+ `on_items[]`. Each item names the answer it touches (a waypoint id, a framing id
489
+ or a post item id) and `answer_was`:
490
+
491
+ - `user` — the version did not follow a sentence the user gave: an agent error,
492
+ fixed in the next version.
493
+ - `delegated` — the agent's own decision, on an item the user handed over: a
494
+ delegated cost, not an agent error. The user may now answer it themselves
495
+ (the new sentence replaces the delegation, which moves to `history[]`).
496
+ - `not-asked` — the feedback names something no guide covered. It becomes a new
497
+ sentence in that waypoint's guide (`guide.additions[]`), quoted from the
498
+ feedback with its date and marked `"source": "polish feedback, v<N>"`, before
499
+ the next version is built.
500
+ It is never fixed silently, so the same feedback is not needed twice: the next
501
+ version's provenance must be able to cite it.
502
+
503
+ The next version's `answers_feedback` lists the verdicts it answers (version
504
+ number and verdict index), and its `changed` says what changed. Feedback on the
505
+ rig given at the direction review goes back to the rig waypoints and makes a
506
+ new rig version, which needs a new first review.
507
+
508
+ ### Recording a verdict
509
+
510
+ ```
511
+ rig-create review <version> --verdict accepted|bounced|provisional --by <who>
512
+ --review rig-review|direction-review --verbatim "<words>" --source <where>
513
+ [--item <id>[:user|delegated|not-asked]]... [--quote <id>=<fragment>]
514
+ [--value <id>=<json>] [<project dir>] [--json]
515
+ ```
516
+
517
+ Appends one verdict to `versions[v<N>].verdicts[]`, dated now, with the words
518
+ stored exactly as given, and prints what it recorded. The review must be the
519
+ one that judges that kind of version (`rig-review` a rig version,
520
+ `direction-review` a post version); rig feedback given at the direction review
521
+ is recorded on the post version shown and names the rig waypoints in its items.
522
+
523
+ `answer_was` comes from the record wherever the record decides it, and a value
524
+ the record contradicts is refused by name (`FEEDBACK_ITEM_CONTRADICTS`):
525
+
526
+ | The item's current answer | `answer_was` when not named | Also allowed |
527
+ | --- | --- | --- |
528
+ | a delegation | `delegated` | — |
529
+ | a user sentence | `user` | `not-asked` — the feedback names something the sentence did not cover, which only the reader can tell |
530
+ | a user sentence that left part open (`agent_decision` beside it) | none: name it (`FEEDBACK_ITEM_AMBIGUOUS`) | `user`, `delegated`, `not-asked` |
531
+ | not applicable, or no answer | refused (`FEEDBACK_ITEM_NOT_APPLICABLE`, `FEEDBACK_ITEM_SILENT`): ask the question first | — |
532
+
533
+ A `not-asked` item is written in the same turn as a new sentence in that
534
+ answer's `additions[]`: `by` and `at` of the verdict, `verbatim` = the
535
+ `--quote` fragment (default: the whole feedback; it must be a fragment of it),
536
+ `value` = `--value` (default `null`, to be normalised before the next version)
537
+ and `source: "polish feedback, v<N>"`. The original sentence is not edited.
538
+ Because the guide changed, the steps resting on it need the plan re-signed
539
+ before they run again (`GUIDE_CHANGED_UNSIGNED`).
540
+
541
+ An item id that is no framing, waypoint or post item is refused
542
+ (`FEEDBACK_ITEM_UNKNOWN`); `review` does not create an `x_` prompt. A prompt
543
+ is a question with its own text and `required_for`, asked of the user like the
544
+ rest (§ Questions outside this set) — a verdict cannot write it — and an `x_`
545
+ prompt's answer lives in its waypoint's guide, so the item the verdict names is
546
+ that waypoint either way. Add the prompt, then name the waypoint.
547
+
548
+ `review` never moves `stage` and writes no sign-off: a verdict says what a
549
+ person thought of a version, and a stage moves only on a sign-off. An
550
+ acceptance is recorded with this command and signed with its sign-off in the
551
+ same turn ([PROJECT.md § Stages](PROJECT.md#stages)).
552
+
553
+ `interview --check` then refuses a bounced version that a later version does
554
+ not answer, an `answers_feedback` ref that points at no earlier verdict, and a
555
+ `not-asked` item whose sentence is not in the guide; and it counts every bounce
556
+ by cause, so a bounce on a delegated item reads as the user's chosen cost
557
+ ([CHECKS.md § Polish feedback](CHECKS.md#polish-feedback)).
558
+
559
+ ## Checking the interview
560
+
561
+ ```
562
+ rig-create interview --check [<project dir>] [--json]
563
+ ```
564
+
565
+ Before any rigging, and after any change to the record, the check reads
566
+ `project.json` and refuses by name everything still open: a waypoint the plan
567
+ passes with neither a guide nor a delegation, a delegated item the agent has not
568
+ decided while the plan is signed, a plan step resting on no answer, a stage
569
+ moved without its sign-off, a `@rig-c/parts` section the waypoint table does not
570
+ place. It reports every refusal, not the first; exit `0` means the record is
571
+ complete for its stage. The codes, what fires each and how to clear it are in
572
+ [CHECKS.md](CHECKS.md).
573
+
574
+ ## Questions outside this set
575
+
576
+ When a plan step needs a decision no prompt reaches, it is asked like the rest:
577
+ add a prompt with an `x_` id (`x_wind_direction`) at the waypoint it belongs to,
578
+ with `"source": "project"`, and record the user's sentence or delegation in that
579
+ waypoint's guide. A step never rests on nothing. An `x_` prompt that comes up on
580
+ a second project is a candidate for the standard set.
581
+
582
+ ## A user check names its size floor or stage
583
+
584
+ When a user asks for a check such as "specks in layers mean re-run", ask for
585
+ the smallest island area that counts (in pixels, at the named resolution), or
586
+ which stage the check applies at: raw layers, merged layers, or assembled
587
+ parts. Record the answer verbatim beside its normalized bar. A raw-layer
588
+ speck rule without a floor can reject harmless small islands before merging;
589
+ a check intended for assembled parts must say so. Do not invent the floor or
590
+ silently apply the check at another stage. This is an interview question,
591
+ not an automated check.
592
+
593
+ ## Recording an agent-found bounce
594
+
595
+ A route rejected by the agent before a review belongs in the waypoint guide's
596
+ `history[]`: `{ "at": "<date>", "bounce": { "cause": "agent", "failed":
597
+ "<what failed>", "bar": "<the bar it failed>", "replacement": "<what replaced
598
+ it>" } }`. Keep all three descriptions non-empty. This does not attribute a
599
+ human verdict or alter the user's guide; a replacement requiring a changed
600
+ user choice still goes back to that user. See
601
+ [PROJECT.md](PROJECT.md#prepared-inputs-and-agent-found-bounces) for the
602
+ prepared-input record and the per-entry compatibility date.
603
+
604
+ ## Name every skipped ask
605
+
606
+ The canonical rig asks are `WAYPOINT_ASKS` in `src/waypoints.ts`, derived from
607
+ W1–W6 above. Before finishing a waypoint, compare its guide with every applicable
608
+ ask. Say each unanswered question in plain words. If the user delegates it,
609
+ name that skipped question back as delegated, record its id in the guide's
610
+ `asks` list with `state: "delegated"`, and write the decision beside the guide.
611
+ Record answered asks with `state: "user"`. Never treat an answer to the crux as
612
+ an answer to the remainder, or silently turn silence into delegation. The user
613
+ still sees plain questions, not internal ids. `agent_decision.covers` remains
614
+ free text; per-ask coverage is a separate list (PROJECT.md § Per-ask guide coverage).
615
+
616
+ ### Projection and ground at assemble
617
+
618
+ Ask projection on every new assemble interview. Core keeps the part mask as
619
+ its boundary. Visible follows the painting rim and can take backdrop pixels.
620
+ Record the `projection` ask in the guide's `asks`, with `value.project` set to
621
+ `core` or `visible` for a user answer. A delegated choice goes in
622
+ `agent_decision.value.project`, with the existing reasoning and `covers` rules.
623
+
624
+ Only visible asks `ground`. Plain preserves the existing rim projection.
625
+ Busy limits backdrop pickup around thin parts. The author answers `plain` or
626
+ `busy`, recorded as `value.ground` for a user answer or
627
+ `agent_decision.value.ground` for a decided delegation. Keep the user's words
628
+ and time with the guide. For example, a user guide can contain
629
+ `"value": {"project": "visible", "ground": "busy"}` and
630
+ `"asks": [{"id": "projection", "state": "user"}, {"id": "ground", "state": "user"}]`
631
+ beside its other asks.
632
+
633
+ The agent writes these answers as `assemble.project` and, for visible,
634
+ `assemble.ground` in the project config. Create has no config-writing command.
635
+ Parts' `ASSEMBLE_GROUND_PLAIN` WARN reports a plain-declared border that is not
636
+ mostly one colour. A busy ground and a figure crossing the border can both
637
+ cause it, so keep the warning for the author to judge. A measured interview
638
+ proposal awaits parts#1023's public CLI reading.
639
+
640
+ Guides predating `PROJECTION_ASKS_SINCE` (2026-11-06T00:00:00Z) retain the old
641
+ contract and receive `GUIDE_ASKS_LEGACY` when a new applicable ask is absent.
642
+ Core has no ground ask or ground refusal.
643
+
644
+
645
+ ## Rigging questions follow the approved parts
646
+
647
+ In the explicit split order, the initial interview asks framing plus source
648
+ and parts preparation only (`seethrough`, `assemble`). Bones, deformation,
649
+ constraints and motion guides wait for `rigging-interview`, after the person
650
+ has accepted the parts and mesh/chest structure. Null later guides are not
651
+ missing early answers. The rigging plan is signed separately, against the
652
+ hash-bound parts approval and structure snapshot. The person's earlier mesh
653
+ and chest declarations are carried into that interview as approved context.
654
+
655
+ The context is outside the answer union. This card keeps the existing
656
+ user/delegated/not-applicable/inherited states without prescribing the later
657
+ multiple-choice option set or correction-path schema. Existing sentence answers
658
+ remain history; adoption does not re-date them or copy them as new answers.
659
+ The source and rigging approval resolver is `approvalStageOfStep`; all delegation
660
+ and plan checks read it. Source planning cannot require an unanswered later
661
+ rigging guide. Hand pass means the correction loop of rig-review, not another
662
+ signature whose meaning nobody defined.
663
+
664
+ ## Per-ask choices (interview@2)
665
+
666
+ New projects explicitly adopt `interview.order.spec: "rig-create/stage-order@2"`,
667
+ with `adopted_at` for the split order and `choices_adopted_at` for choices.
668
+ `stage-order@1` keeps the split order and sentence answers; no date opts a
669
+ project in. `interview-options --adopt [dir]` upgrades an existing @1 project,
670
+ preserving its original adoption date and all answers. Earlier current answers
671
+ warn `CHOICE_ANSWERS_LEGACY` until actually revised. `CHOICE_ANSWERS_SINCE`
672
+ labels legacy warnings only. New answers from the explicit adoption require
673
+ choices. Signoffs, verdicts, checkpoints and mechanical n/a remain unchanged.
674
+
675
+ On a legacy-order project at `post-interview`, the same `interview-options --adopt`
676
+ command adopts only post choices, recording `interview.post.choices_adopted_at`.
677
+ It preserves the stage order, earlier answers and signatures. Only `camera_depth`,
678
+ `post_timing` and `post_composition` can use this adoption; framing and waypoint
679
+ choices still require explicit split-order adoption. Repeating adoption preserves
680
+ its original date. Post picks and approval use the Review job and `--from-review`.
681
+
682
+ Every newly asked framing question, waypoint and post item uses a retained
683
+ option set. **Each applicable ask gets its own pick.** A waypoint is never a
684
+ single bundle hiding several decisions. A framing/post item is a one-ask set
685
+ whose ask id is its question id. A waypoint uses exactly its applicable
686
+ `WAYPOINT_ASKS` in table order. Motion's game-state asks depend on rig_type;
687
+ assemble includes ground if any offered projection is visible. Sets offering
688
+ both core and visible must make the ground combinations explicit. Other and
689
+ auto are always available, never preselected. Each ask has at least two value
690
+ options and exactly one recommended value option with a nonempty reason.
691
+
692
+ The agent writes a retained file, for example `evidence/interview/motion-001.json`:
693
+
694
+ ```json
695
+ {
696
+ "schema": "rig-create/interview-options@1",
697
+ "id": "motion-001",
698
+ "question": "motion",
699
+ "stage": "rigging-interview",
700
+ "drafted_by": "agent",
701
+ "drafted_at": "2026-11-11T11:01:00Z",
702
+ "context": { "kind": "parts", "accepted_parts": {}, "structure": {}, "draft_id": "example", "parts": {} },
703
+ "asks": [
704
+ { "id": "tracks", "prompt": "Which moves?", "options": [
705
+ { "id": "breath", "kind": "value", "label": "Breath", "effect": "Only the torso breathes.", "fragment": [{"motion":"breath"}], "recommended": true, "reason": "Keeps the approved rigid accessories still." },
706
+ { "id": "still", "kind": "value", "label": "Still", "effect": "No track is added.", "fragment": [], "recommended": false },
707
+ { "id": "other", "kind": "other", "label": "Other", "effect": "Describe this decision.", "recommended": false },
708
+ { "id": "auto", "kind": "auto", "label": "Let the agent decide", "effect": "The agent records its decision before approval.", "recommended": false }
709
+ ] }
710
+ ],
711
+ "assembly": { "rule": "concat" },
712
+ "constraints": [{"asks":["tracks","blink"],"allowed":[["breath","yes"],["still","no"]]}]
713
+ }
714
+ ```
715
+
716
+ The sketch omits the remaining motion asks and context bindings; it is not a
717
+ valid filled record. Use the complete writer-generated
718
+ [consumer fixture](../templates/example-interview-choice.json) and raw
719
+ [option snapshots](../templates/example-interview-options/) for executable data.
720
+ The full file is the snapshot as shown. Identity is `(raw file sha, ask id,
721
+ option id)`; ids are unique within each ask. A redraft uses a new set id and
722
+ file; never overwrite an already bound file. Hash raw UTF-8 bytes, not a
723
+ canonical reserialization. Label/effect/note/Other strings retain all newlines,
724
+ Unicode and trailing whitespace without normalizing or translating them.
725
+
726
+ Context is a projection of existing recorded identities, never a new producer
727
+ measurement:
728
+
729
+ - `inputs`: `{kind:"inputs", files:[{path,sha256}]}` binds the declared source
730
+ inputs available before parts. It never claims future parts were shown.
731
+ - `parts`: `{kind:"parts", accepted_parts:{signoff_at,evidence}, structure,
732
+ draft_id, parts:{path,files:[{path,sha256}]}}` binds the live parts-review,
733
+ retained structure snapshot and full recorded draft input inventory,
734
+ including parts.json and every image. Inventory file paths are project-relative.
735
+ - `rig`: `{kind:"rig", rig_version, signoff_at, config:{path,sha256}, parts}`
736
+ binds the accepted rig, its rig-review signoff, retained provenance config
737
+ and the parts inventory from its build-time approval. Post asks wait for it.
738
+ - `scene`: `{kind:"scene", scene:{n,path,sha256}}` replaces the rig kind for a
739
+ post set while the latest scene is current on the latest live accepted rig
740
+ ([PROJECT.md, "Scene option context"](PROJECT.md#scene-option-context)).
741
+
742
+ Draft time and selection time must both see that context live. New selection
743
+ or decision after changed files/approval/structure or a relevant reopen refuses
744
+ `INTERVIEW_OPTIONS_STALE`; redraft first. An old answer is checked against the
745
+ context live when it was given, so later approvals do not rewrite history.
746
+ Later appended source inputs do not change which immutable inputs an earlier
747
+ person saw; a fresh writer checks the current complete source identity.
748
+ Ignored draft bytes may be unavailable on a historical clone, retaining the
749
+ existing `DRAFT_RIG_UNAVAILABLE` warning. Fresh registration/selection/decision
750
+ requires the actual viewed bytes present. Retained option, structure, source
751
+ and config bytes remain mandatory. Paths stay within the project, with literal
752
+ segments, no symlink traversal, regular files and no ignored option storage.
753
+
754
+ `assembly.rule` is a closed enum:
755
+
756
+ - `single` is allowed only for a one-ask set; its contribution is the value as
757
+ is, including scalar `rig_type` and reference strings.
758
+ - `concat` concatenates array fragments in asks order.
759
+ - `merge` shallow-merges object fragments in asks order, refusing a key collision.
760
+
761
+ No semantic inference, coercion or silent adjustment occurs. Optional
762
+ `constraints` name distinct asks and allowed tuples of their value-option ids.
763
+ An Other or auto fragment on a constrained ask resolves to the **unique** value
764
+ option with a deep-equal fragment. Zero or several matches, or a tuple not in
765
+ allowed, refuses `INTERVIEW_CHOICE_CONSTRAINT`: redraft the set to offer that
766
+ option. Thus a novel Other value on a constrained ask requires a redraft.
767
+ Unresolved auto/Other constraints wait until their contributions land.
768
+
769
+ The writer extends the existing answer union with:
770
+
771
+ ```json
772
+ {
773
+ "choice": {
774
+ "spec": "rig-create/interview-choice@1",
775
+ "set": {"path":"evidence/interview/motion-001.json","sha256":"<raw sha>"},
776
+ "picks": [{"ask":"tracks","option_id":"breath","shown":{"label":"Breath","effect":"Only the torso breathes."}}],
777
+ "note": "Keep it subtle."
778
+ }
779
+ }
780
+ ```
781
+
782
+ Picks are exactly one per ask, in set order. `shown` is copied exactly from the
783
+ retained option. Other adds `other_text` and optionally `other_fragment`.
784
+ `verbatim` is deterministic: each pick contributes label LF effect (LF
785
+ other_text for Other); join picks with a blank line, then LF note if present,
786
+ even for an explicitly empty note. Existing provenance quotes can match those
787
+ exact words. Selecting a recommendation is a human answer, not delegation.
788
+ `value` is the assembly of user contributions; `asks[].state` is `user`,
789
+ `delegated`, or `other-pending`. If any Other lacks a fragment, **value is null**,
790
+ not an inferred value. Approval of that question refuses
791
+ `INTERVIEW_CHOICE_REQUIRED` until a new set offers a tailored value option
792
+ quoting the pending words with source/date and the person explicitly picks it.
793
+ The old answer moves intact to history. The CLI can accept a person's explicit
794
+ Other fragment directly.
795
+
796
+ All-auto is `delegated:true` with no user value; mixed picks are
797
+ `delegated:false` and retain their user value. Before a decision exists,
798
+ `agent_decision:{covers:"<auto ids joined with comma>"}` names the pending
799
+ remainder. The agent then writes `by`, `at`, `reasoning`, exact `covers`,
800
+ `fragments:[{ask,fragment}]` for exactly the auto asks in order, and `value`
801
+ as the assembly of those fragments. User fragments and agent fragments are
802
+ also checked together for merge collisions and constraints. Existing approval
803
+ and execution deadlines for undecided delegation remain in force.
804
+
805
+ In adopted projects prior words become a **tailored value option**, whose label
806
+ quotes the earlier answer verbatim and whose effect names its original source
807
+ and date. The human still explicitly picks. It is recommended only with an
808
+ agent reason. Never turn old words into a fabricated click or silently select
809
+ a recommendation. Unadopted projects keep the earlier derived-answer rules.
810
+
811
+ | Answer field | Writer and meaning |
812
+ | --- | --- |
813
+ | `refusal_baseline` | The answer writer records the pre-pending refusal multiset as `{code, path, count}[]` when auto or unresolved Other is selected. Entries have nonempty strings and positive integer counts. The record is retained when decided and in history. Each new pending answer gets a fresh baseline. Older pending answers without it keep the strict current-state comparison. |
814
+
815
+ ### Public writers and review ingestion
816
+
817
+ ```
818
+ rig-create interview-options <question> [dir] --file evidence/interview/<id>.json
819
+ rig-create interview-answer <question> [dir] --set <path> --sha256 <shown sha> --by <human> --pick <ask>=<option>...
820
+ rig-create interview-answer <question> [dir] --from-review <actId>
821
+ rig-create interview-decision <question> [dir] --by <agent> --reasoning-file <file> --fragment <ask>=<JSON file>...
822
+ ```
823
+
824
+ Registration reads an already retained authored file and records its binding
825
+ as `pending_options`; it never rewrites the option file. Answer flags include
826
+ repeatable `--other <ask>=<text file>` and optional
827
+ `--other-fragment <ask>=<JSON file>`, plus `--note-file` and `--source`.
828
+ The decision writer supplies exactly the auto fragments. Changing an approved
829
+ answer first requires the relevant stage to be reopened. Collection members
830
+ write local overrides; inherited source answers remain historical evidence,
831
+ never fabricated member selections.
832
+
833
+ Review exposes finalized `interview-picks` acts through the standing job API.
834
+ The writer fetches the act using its private sibling capability, binds the
835
+ question and displayed option-set ID and SHA-256 to the pending set, and retains
836
+ the semantic act bytes and SHA-256 in `review_acts`. Selections carry item and
837
+ option IDs, optional Other text and the exact note. The writer derives shown
838
+ text, assembly, coverage and verbatim from the retained options and checks
839
+ constraints. The act's timestamp and reviewer role determine the answer's
840
+ `at` and `by`. Identical replay returns the retained answer, including from
841
+ history. Conflicting bytes under the same act identity refuse.
842
+
843
+ `--from-review` is exclusive with pick, Other, fragment and note flags.
844
+ Optional set/hash/by flags must agree with the act. A stale displayed set
845
+ refuses `INTERVIEW_OPTIONS_STALE`. Malformed acts refuse `REVIEW_ACT_INVALID`.
846
+ The removed `--picks-file` flag refuses `INTERVIEW_PICKS_FILE_REMOVED` and points
847
+ to `--from-review`. Earlier file-route answers remain valid records. Synthetic
848
+ generators retain historical wire fixtures while constructing answers through
849
+ the public flag writer. Flags use the writer's clock.
850
+
851
+ Writers use the check's choice validators before writing. A partial interview
852
+ may keep unrelated existing refusals, but a writer cannot introduce a new
853
+ one. When ending the same pending auto transition, the decision writer permits each code/path up to the larger count in `refusal_baseline` and the current record, while refusing findings absent from both and refusing any excess count. A refused project write leaves its bytes identical; retained authored
854
+ files are never rewritten. Regenerate all consumer examples with
855
+ `scripts/generate-example-choices.ts <fresh scratch> [--check]`; the active full
856
+ example also reproduces through `generate-example-order.ts` and stays 0/0.
857
+
858
+ ## Optional intake choice in parts
859
+
860
+ Recording a preflight with `intake-report` offers a new optional ask,
861
+ `intake_suitability`, in **parts**, bound to the recorded report's raw sha256.
862
+ It is not asked in the source interview: it needs a full run and cannot save
863
+ the first full run. The record lives at `intake.choice`, outside required
864
+ framing/waypoints and every completeness or approval deadline. A HIT with
865
+ no resolved choice for that report raises `INTAKE_CHOICE_PENDING`; a no-risk
866
+ report raises no choice warning. Neither is an approval refusal.
867
+
868
+ Use `interview-options intake_suitability <dir> --file <retained-set>` to
869
+ retain a `rig-create/interview-options@1` set with `stage: "parts"`,
870
+ `question: "intake_suitability"`, one ask of that id and `assembly.rule:
871
+ "single"`. Its context is `{ kind: "intake", report_id: <id>, report:
872
+ <the entry's complete report binding> }`. The ordinary per-ask rules apply:
873
+ two value options (for example scalar `proceed` and `choose-another`), one
874
+ explicitly explained recommendation that is never preselected, Other and
875
+ auto. Choose with `interview-answer`; only explicit auto may be completed
876
+ with `interview-decision`. Other text and note are retained verbatim through
877
+ the existing writer, together with the exact labels/effects shown. Do not
878
+ substitute an agent summary for the person's words.
879
+
880
+ Pending auto, decided auto, Other with a fragment and Other pending stay
881
+ explicit and optional. A delegated decision is not a person's proceed pick.
882
+ Choosing another records intent; it never changes inputs automatically or
883
+ screens a corpus reproduction away. A new report needs a fresh shown set
884
+ and explicit choice; the old choice and set remain history. Choices are
885
+ local, never inherited from a collection. They may be recorded only in
886
+ parts, but later signatures do not make a pending optional choice invalid.