rig-create 0.0.0-stage → 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.md +163 -2
- package/docs/CHECKS.md +1665 -0
- package/docs/COLLECTIONS.md +337 -0
- package/docs/CRAFT.md +277 -0
- package/docs/INTERVIEW.md +886 -0
- package/docs/LESSONS.md +172 -0
- package/docs/PROJECT.md +2657 -0
- package/docs/SOURCE.md +225 -0
- package/package.json +44 -4
- package/src/agent-bounce.ts +27 -0
- package/src/agent-guide.ts +237 -0
- package/src/amend.ts +193 -0
- package/src/applied-review.ts +104 -0
- package/src/ask-coverage.ts +69 -0
- package/src/assemble-answers.ts +53 -0
- package/src/cg-gates.ts +211 -0
- package/src/check-reads.ts +106 -0
- package/src/check.ts +1059 -0
- package/src/checkpoint-evidence-writer.ts +125 -0
- package/src/checkpoint-evidence.ts +152 -0
- package/src/choice-writers.ts +271 -0
- package/src/choices.ts +378 -0
- package/src/cli.ts +371 -0
- package/src/collection-answer.ts +136 -0
- package/src/collection-binding-reader.ts +496 -0
- package/src/collection-binding.ts +478 -0
- package/src/collection.ts +348 -0
- package/src/config-inputs.ts +155 -0
- package/src/config-lost.ts +135 -0
- package/src/correction-writers.ts +207 -0
- package/src/corrections.ts +685 -0
- package/src/diff-classes.ts +219 -0
- package/src/diff-map.ts +248 -0
- package/src/direction-citation.ts +13 -0
- package/src/direction-writers.ts +119 -0
- package/src/direction.ts +266 -0
- package/src/drafts.ts +363 -0
- package/src/feedback.ts +744 -0
- package/src/figure-mask.ts +143 -0
- package/src/fix-ledger.ts +355 -0
- package/src/init.ts +265 -0
- package/src/inputs.ts +160 -0
- package/src/intake.ts +158 -0
- package/src/interview.ts +53 -0
- package/src/invariants.ts +132 -0
- package/src/job-acts.ts +80 -0
- package/src/job-advance.ts +65 -0
- package/src/job-close.ts +226 -0
- package/src/job-host.ts +529 -0
- package/src/job-outbox.ts +383 -0
- package/src/job-publication.ts +701 -0
- package/src/job-runtime.ts +99 -0
- package/src/job-writer.ts +123 -0
- package/src/meshes-bust.ts +63 -0
- package/src/next.ts +1506 -0
- package/src/overrides.ts +42 -0
- package/src/package-upgrades.ts +32 -0
- package/src/packages-upgrade-check.ts +6 -0
- package/src/packages-upgrade.ts +168 -0
- package/src/parts-act.ts +96 -0
- package/src/parts-check.ts +242 -0
- package/src/parts-review.ts +196 -0
- package/src/parts-sections.ts +98 -0
- package/src/parts-verdict-record.ts +265 -0
- package/src/parts-verdict.ts +33 -0
- package/src/pause.ts +118 -0
- package/src/pins-check.ts +619 -0
- package/src/pins.ts +17 -0
- package/src/plan-bar-amendments.ts +54 -0
- package/src/plan-history.ts +147 -0
- package/src/plan-writers.ts +202 -0
- package/src/plate-receipt.ts +110 -0
- package/src/pre-interview.ts +302 -0
- package/src/prepared-inputs.ts +113 -0
- package/src/progress-writers.ts +181 -0
- package/src/provenance.ts +301 -0
- package/src/record-direction-target.ts +26 -0
- package/src/record-input.ts +18 -0
- package/src/refusal-baseline.ts +55 -0
- package/src/refusal.ts +30 -0
- package/src/reopen-lapses.ts +80 -0
- package/src/reopen.ts +144 -0
- package/src/republish.ts +93 -0
- package/src/restart.ts +141 -0
- package/src/review-act-runtime.ts +16 -0
- package/src/review-act.ts +592 -0
- package/src/review-package.ts +524 -0
- package/src/review-read.ts +238 -0
- package/src/review.ts +432 -0
- package/src/rig-version-date.ts +22 -0
- package/src/rig-version.ts +1047 -0
- package/src/run-record.ts +232 -0
- package/src/scene-authority.ts +410 -0
- package/src/scene-writers.ts +144 -0
- package/src/scene.ts +284 -0
- package/src/setup-painting.ts +46 -0
- package/src/signable.ts +65 -0
- package/src/signoff-answers.ts +76 -0
- package/src/signoff-checkpoint-act.ts +95 -0
- package/src/signoff-target.ts +127 -0
- package/src/signoff.ts +331 -0
- package/src/split-captions.ts +154 -0
- package/src/stage-progress.ts +379 -0
- package/src/stages.ts +148 -0
- package/src/step-hash.ts +19 -0
- package/src/structure-snapshot.ts +109 -0
- package/src/structure.ts +166 -0
- package/src/templates.ts +16 -0
- package/src/waypoints.ts +163 -0
- package/templates/agent-guide.md +108 -0
- package/templates/collection-agent-guide.md +72 -0
- package/templates/collection.json +252 -0
- package/templates/example-chain/AGENTS.md +134 -0
- package/templates/example-chain/CLAUDE.md +3 -0
- package/templates/example-chain/README.md +13 -0
- package/templates/example-chain/chain.json +2869 -0
- package/templates/example-chain/checkpoints/0a-interview-options/AGENTS.md +134 -0
- package/templates/example-chain/checkpoints/0a-interview-options/CLAUDE.md +3 -0
- package/templates/example-chain/checkpoints/0a-interview-options/evidence/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/0a-interview-options/evidence/approval.txt +1 -0
- package/templates/example-chain/checkpoints/0a-interview-options/evidence/interview/rig_type.json +59 -0
- package/templates/example-chain/checkpoints/0a-interview-options/evidence/split-config.json +1 -0
- package/templates/example-chain/checkpoints/0a-interview-options/inputs/painting.png +0 -0
- package/templates/example-chain/checkpoints/0a-interview-options/inputs/references/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/0a-interview-options/package.json +9 -0
- package/templates/example-chain/checkpoints/0a-interview-options/project.json +295 -0
- package/templates/example-chain/checkpoints/0a-interview-options.json +127 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/AGENTS.md +134 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/CLAUDE.md +3 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/evidence/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/evidence/approval.txt +1 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/evidence/interview/assemble.json +309 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/evidence/interview/reference.json +59 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/evidence/interview/rig_type.json +59 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/evidence/interview/seethrough.json +186 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/evidence/split-config.json +1 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/inputs/painting.png +0 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/inputs/references/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/package.json +9 -0
- package/templates/example-chain/checkpoints/0b-plan-pending/project.json +685 -0
- package/templates/example-chain/checkpoints/0b-plan-pending.json +81 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/AGENTS.md +134 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/CLAUDE.md +3 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/evidence/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/evidence/approval.txt +1 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/evidence/interview/assemble.json +309 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/evidence/interview/reference.json +59 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/evidence/interview/rig_type.json +59 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/evidence/interview/seethrough.json +186 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/evidence/parts-check.json +127 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/evidence/split-config.json +1 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/inputs/painting.png +0 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/inputs/references/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/package.json +9 -0
- package/templates/example-chain/checkpoints/1-parts-verdict/project.json +955 -0
- package/templates/example-chain/checkpoints/1-parts-verdict.json +204 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/AGENTS.md +134 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/CLAUDE.md +3 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/approval.txt +1 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/diff-components.json +34 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/interview/assemble.json +309 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/interview/bones.json +190 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/interview/reference.json +59 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/interview/rig_type.json +59 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/interview/seethrough.json +186 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/parts-check.json +127 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/parts-review.json +88 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/review-reads/a12dea02d32508acc99386f894af76a14f1c85f45f804db2aa6b4dea5297973f.json +59 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/split-config.json +1 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/evidence/structure.json +30 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/inputs/painting.png +0 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/inputs/references/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/package.json +9 -0
- package/templates/example-chain/checkpoints/2-rigging-answers/project.json +1198 -0
- package/templates/example-chain/checkpoints/2-rigging-answers.json +254 -0
- package/templates/example-chain/checkpoints/3-rig-review/AGENTS.md +134 -0
- package/templates/example-chain/checkpoints/3-rig-review/CLAUDE.md +3 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/approval.txt +1 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/diff-components.json +34 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/assemble.json +309 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/bones.json +190 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/constraints.json +272 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/meshes.json +190 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/motion.json +272 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/reference.json +59 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/rig_type.json +59 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/interview/seethrough.json +186 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/parts-check.json +127 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/parts-review.json +88 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/review-reads/a12dea02d32508acc99386f894af76a14f1c85f45f804db2aa6b4dea5297973f.json +59 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/setup.png +0 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/split-config.json +1 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/structure.json +30 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/v1/config.json +88 -0
- package/templates/example-chain/checkpoints/3-rig-review/evidence/v1/interview-requirements.json +8 -0
- package/templates/example-chain/checkpoints/3-rig-review/inputs/painting.png +0 -0
- package/templates/example-chain/checkpoints/3-rig-review/inputs/references/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/3-rig-review/package.json +9 -0
- package/templates/example-chain/checkpoints/3-rig-review/project.json +1909 -0
- package/templates/example-chain/checkpoints/3-rig-review.json +424 -0
- package/templates/example-chain/checkpoints/4-direction-post/AGENTS.md +134 -0
- package/templates/example-chain/checkpoints/4-direction-post/CLAUDE.md +3 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/approval.txt +1 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/diff-components.json +34 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/assemble.json +309 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/bones.json +190 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/camera_depth.json +102 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/constraints.json +272 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/meshes.json +190 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/motion.json +272 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/post_composition.json +122 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/post_timing.json +102 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/reference.json +59 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/rig_type.json +59 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/interview/seethrough.json +186 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/parts-check.json +127 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/parts-review.json +88 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/review-reads/a12dea02d32508acc99386f894af76a14f1c85f45f804db2aa6b4dea5297973f.json +59 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/setup.png +0 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/split-config.json +1 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/structure.json +30 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/v1/config.json +88 -0
- package/templates/example-chain/checkpoints/4-direction-post/evidence/v1/interview-requirements.json +8 -0
- package/templates/example-chain/checkpoints/4-direction-post/inputs/painting.png +0 -0
- package/templates/example-chain/checkpoints/4-direction-post/inputs/references/.gitkeep +0 -0
- package/templates/example-chain/checkpoints/4-direction-post/package.json +9 -0
- package/templates/example-chain/checkpoints/4-direction-post/project.json +2302 -0
- package/templates/example-chain/checkpoints/4-direction-post.json +456 -0
- package/templates/example-chain/evidence/.gitkeep +0 -0
- package/templates/example-chain/evidence/approval.txt +1 -0
- package/templates/example-chain/evidence/captions.json +101 -0
- package/templates/example-chain/evidence/diff-components.json +34 -0
- package/templates/example-chain/evidence/direction/v2.json +74 -0
- package/templates/example-chain/evidence/direction-input.json +74 -0
- package/templates/example-chain/evidence/interview/assemble.json +309 -0
- package/templates/example-chain/evidence/interview/bones.json +190 -0
- package/templates/example-chain/evidence/interview/camera_depth.json +102 -0
- package/templates/example-chain/evidence/interview/constraints.json +272 -0
- package/templates/example-chain/evidence/interview/meshes.json +190 -0
- package/templates/example-chain/evidence/interview/motion.json +272 -0
- package/templates/example-chain/evidence/interview/post_composition.json +122 -0
- package/templates/example-chain/evidence/interview/post_timing.json +102 -0
- package/templates/example-chain/evidence/interview/reference.json +59 -0
- package/templates/example-chain/evidence/interview/rig_type.json +59 -0
- package/templates/example-chain/evidence/interview/seethrough.json +186 -0
- package/templates/example-chain/evidence/parts-check.json +127 -0
- package/templates/example-chain/evidence/parts-review.json +88 -0
- package/templates/example-chain/evidence/review-reads/a12dea02d32508acc99386f894af76a14f1c85f45f804db2aa6b4dea5297973f.json +59 -0
- package/templates/example-chain/evidence/scene/s1.json +65 -0
- package/templates/example-chain/evidence/scene-citations.json +9 -0
- package/templates/example-chain/evidence/setup.png +0 -0
- package/templates/example-chain/evidence/split-config.json +1 -0
- package/templates/example-chain/evidence/structure.json +30 -0
- package/templates/example-chain/evidence/v1/config.json +88 -0
- package/templates/example-chain/evidence/v1/interview-requirements.json +8 -0
- package/templates/example-chain/inputs/background.png +0 -0
- package/templates/example-chain/inputs/painting.png +0 -0
- package/templates/example-chain/inputs/references/.gitkeep +0 -0
- package/templates/example-chain/package.json +9 -0
- package/templates/example-chain/project.json +2593 -0
- package/templates/example-diff/diff-components.json +71 -0
- package/templates/example-diff/recomposite_rig.png +0 -0
- package/templates/example-direction/approval.txt +1 -0
- package/templates/example-direction/derived/review/v1/out/check/build/rectangle.png +0 -0
- package/templates/example-direction/derived/review/v1/out/check/build/run.json +40 -0
- package/templates/example-direction/derived/review/v1/out/check/build/skeleton.atlas +8 -0
- package/templates/example-direction/derived/review/v1/out/check/build/skeleton.json +73 -0
- package/templates/example-direction/derived/review/v1/out/check/build/skeleton.model.json +195 -0
- package/templates/example-direction/evidence/direction/v2.json +69 -0
- package/templates/example-direction/evidence/direction/v3.json +59 -0
- package/templates/example-direction/evidence/images/rectangle.png +0 -0
- package/templates/example-direction/evidence/input.json +69 -0
- package/templates/example-direction/evidence/motion.json +33 -0
- package/templates/example-direction/evidence/patch.json +23 -0
- package/templates/example-direction/evidence/rig-config.json +55 -0
- package/templates/example-direction/evidence/still.png +0 -0
- package/templates/example-direction/project.json +372 -0
- package/templates/example-direction/reasoning.txt +1 -0
- package/templates/example-direction/words.txt +1 -0
- package/templates/example-draft/README.md +28 -0
- package/templates/example-draft/config.json +71 -0
- package/templates/example-draft/derived/drafts/lantern/config.json +71 -0
- package/templates/example-draft/derived/drafts/lantern/input/painting_in_rig.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/input/parts/background.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/input/parts/eye_l.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/input/parts/eye_r.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/input/parts/face.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/input/parts/lantern.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/input/parts/torso.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/input/parts.json +188 -0
- package/templates/example-draft/derived/drafts/lantern/input/recomposite_rig.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/interview-requirements.json +8 -0
- package/templates/example-draft/derived/drafts/lantern/out/check/build/run.json +40 -0
- package/templates/example-draft/derived/drafts/lantern/out/check/build/skeleton.atlas +28 -0
- package/templates/example-draft/derived/drafts/lantern/out/check/build/skeleton.json +193 -0
- package/templates/example-draft/derived/drafts/lantern/out/check/build/skeleton.model.json +483 -0
- package/templates/example-draft/derived/drafts/lantern/out/check/build/skeleton.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/out/images/background.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/out/images/eye_l.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/out/images/eye_r.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/out/images/face.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/out/images/lantern.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/out/images/torso.png +0 -0
- package/templates/example-draft/derived/drafts/lantern/out/mesh_report.json +1 -0
- package/templates/example-draft/derived/drafts/lantern/out/motion.json +137 -0
- package/templates/example-draft/derived/drafts/lantern/out/rig.json +102 -0
- package/templates/example-draft/derived/drafts/lantern/out/run.json +52 -0
- package/templates/example-draft/derived/parts/rig/painting_in_rig.png +0 -0
- package/templates/example-draft/derived/parts/rig/parts/background.png +0 -0
- package/templates/example-draft/derived/parts/rig/parts/eye_l.png +0 -0
- package/templates/example-draft/derived/parts/rig/parts/eye_r.png +0 -0
- package/templates/example-draft/derived/parts/rig/parts/face.png +0 -0
- package/templates/example-draft/derived/parts/rig/parts/lantern.png +0 -0
- package/templates/example-draft/derived/parts/rig/parts/torso.png +0 -0
- package/templates/example-draft/derived/parts/rig/parts.json +188 -0
- package/templates/example-draft/derived/parts/rig/recomposite_rig.png +0 -0
- package/templates/example-draft/derived/review/v1/config.json +71 -0
- package/templates/example-draft/derived/review/v1/interview-requirements.json +8 -0
- package/templates/example-draft/derived/review/v1/out/check/build/run.json +40 -0
- package/templates/example-draft/derived/review/v1/out/check/build/skeleton.atlas +28 -0
- package/templates/example-draft/derived/review/v1/out/check/build/skeleton.json +193 -0
- package/templates/example-draft/derived/review/v1/out/check/build/skeleton.model.json +483 -0
- package/templates/example-draft/derived/review/v1/out/check/build/skeleton.png +0 -0
- package/templates/example-draft/derived/review/v1/out/parts/background.png +0 -0
- package/templates/example-draft/derived/review/v1/out/parts/eye_l.png +0 -0
- package/templates/example-draft/derived/review/v1/out/parts/eye_r.png +0 -0
- package/templates/example-draft/derived/review/v1/out/parts/face.png +0 -0
- package/templates/example-draft/derived/review/v1/out/parts/lantern.png +0 -0
- package/templates/example-draft/derived/review/v1/out/parts/torso.png +0 -0
- package/templates/example-draft/derived/review/v1/out/parts.json +188 -0
- package/templates/example-draft/derived/review/v1/out/rig/images/background.png +0 -0
- package/templates/example-draft/derived/review/v1/out/rig/images/eye_l.png +0 -0
- package/templates/example-draft/derived/review/v1/out/rig/images/eye_r.png +0 -0
- package/templates/example-draft/derived/review/v1/out/rig/images/face.png +0 -0
- package/templates/example-draft/derived/review/v1/out/rig/images/lantern.png +0 -0
- package/templates/example-draft/derived/review/v1/out/rig/images/torso.png +0 -0
- package/templates/example-draft/derived/review/v1/out/rig/mesh_report.json +1 -0
- package/templates/example-draft/derived/review/v1/out/rig/motion.json +137 -0
- package/templates/example-draft/derived/review/v1/out/rig/rig.json +102 -0
- package/templates/example-draft/derived/review/v1/out/rig/run.json +52 -0
- package/templates/example-draft/derived/review/v2/config.json +71 -0
- package/templates/example-draft/derived/review/v2/interview-requirements.json +8 -0
- package/templates/example-draft/derived/review/v2/out/check/build/run.json +40 -0
- package/templates/example-draft/derived/review/v2/out/check/build/skeleton.atlas +28 -0
- package/templates/example-draft/derived/review/v2/out/check/build/skeleton.json +193 -0
- package/templates/example-draft/derived/review/v2/out/check/build/skeleton.model.json +483 -0
- package/templates/example-draft/derived/review/v2/out/check/build/skeleton.png +0 -0
- package/templates/example-draft/derived/review/v2/out/parts/background.png +0 -0
- package/templates/example-draft/derived/review/v2/out/parts/eye_l.png +0 -0
- package/templates/example-draft/derived/review/v2/out/parts/eye_r.png +0 -0
- package/templates/example-draft/derived/review/v2/out/parts/face.png +0 -0
- package/templates/example-draft/derived/review/v2/out/parts/lantern.png +0 -0
- package/templates/example-draft/derived/review/v2/out/parts/torso.png +0 -0
- package/templates/example-draft/derived/review/v2/out/parts.json +188 -0
- package/templates/example-draft/derived/review/v2/out/rig/images/background.png +0 -0
- package/templates/example-draft/derived/review/v2/out/rig/images/eye_l.png +0 -0
- package/templates/example-draft/derived/review/v2/out/rig/images/eye_r.png +0 -0
- package/templates/example-draft/derived/review/v2/out/rig/images/face.png +0 -0
- package/templates/example-draft/derived/review/v2/out/rig/images/lantern.png +0 -0
- package/templates/example-draft/derived/review/v2/out/rig/images/torso.png +0 -0
- package/templates/example-draft/derived/review/v2/out/rig/mesh_report.json +1 -0
- package/templates/example-draft/derived/review/v2/out/rig/motion.json +137 -0
- package/templates/example-draft/derived/review/v2/out/rig/rig.json +102 -0
- package/templates/example-draft/derived/review/v2/out/rig/run.json +52 -0
- package/templates/example-draft/evidence/diff-components.json +71 -0
- package/templates/example-draft/evidence/direction/v4.json +64 -0
- package/templates/example-draft/evidence/direction-input-v4.json +64 -0
- package/templates/example-draft/evidence/fix-ledger/lantern.json +17 -0
- package/templates/example-draft/evidence/parts-check.json +127 -0
- package/templates/example-draft/evidence/parts-review.json +88 -0
- package/templates/example-draft/evidence/review-reads/4ed0507381809746443021554e012032be5b5f8417da0f2e525e9b6df16e9f05.json +59 -0
- package/templates/example-draft/evidence/scene/s1.json +65 -0
- package/templates/example-draft/evidence/scene-background.png +0 -0
- package/templates/example-draft/evidence/scene-citations.json +9 -0
- package/templates/example-draft/evidence/structure-decisions.json +9 -0
- package/templates/example-draft/evidence/v1/interview-config.json +71 -0
- package/templates/example-draft/evidence/v1/interview-requirements.json +8 -0
- package/templates/example-draft/evidence/v1/review-config.json +71 -0
- package/templates/example-draft/evidence/v2/interview-config.json +71 -0
- package/templates/example-draft/evidence/v2/interview-requirements.json +8 -0
- package/templates/example-draft/evidence/v2/review-config.json +71 -0
- package/templates/example-draft/input/painting_in_rig.png +0 -0
- package/templates/example-draft/input/parts/background.png +0 -0
- package/templates/example-draft/input/parts/eye_l.png +0 -0
- package/templates/example-draft/input/parts/eye_r.png +0 -0
- package/templates/example-draft/input/parts/face.png +0 -0
- package/templates/example-draft/input/parts/lantern.png +0 -0
- package/templates/example-draft/input/parts/torso.png +0 -0
- package/templates/example-draft/input/parts.json +188 -0
- package/templates/example-draft/input/recomposite_rig.png +0 -0
- package/templates/example-draft/inputs/painting.png +0 -0
- package/templates/example-draft/interview-requirements.json +8 -0
- package/templates/example-draft/out/check/build/run.json +40 -0
- package/templates/example-draft/out/check/build/skeleton.atlas +28 -0
- package/templates/example-draft/out/check/build/skeleton.json +193 -0
- package/templates/example-draft/out/check/build/skeleton.model.json +483 -0
- package/templates/example-draft/out/check/build/skeleton.png +0 -0
- package/templates/example-draft/out/images/background.png +0 -0
- package/templates/example-draft/out/images/eye_l.png +0 -0
- package/templates/example-draft/out/images/eye_r.png +0 -0
- package/templates/example-draft/out/images/face.png +0 -0
- package/templates/example-draft/out/images/lantern.png +0 -0
- package/templates/example-draft/out/images/torso.png +0 -0
- package/templates/example-draft/out/mesh_report.json +1 -0
- package/templates/example-draft/out/motion.json +137 -0
- package/templates/example-draft/out/rig.json +102 -0
- package/templates/example-draft/out/run.json +52 -0
- package/templates/example-draft/outputs/v1/out/check/build/run.json +40 -0
- package/templates/example-draft/outputs/v1/out/check/build/skeleton.atlas +28 -0
- package/templates/example-draft/outputs/v1/out/check/build/skeleton.json +193 -0
- package/templates/example-draft/outputs/v1/out/check/build/skeleton.model.json +483 -0
- package/templates/example-draft/outputs/v1/out/check/build/skeleton.png +0 -0
- package/templates/example-draft/outputs/v1/out/painting_in_rig.png +0 -0
- package/templates/example-draft/outputs/v1/out/parts/background.png +0 -0
- package/templates/example-draft/outputs/v1/out/parts/eye_l.png +0 -0
- package/templates/example-draft/outputs/v1/out/parts/eye_r.png +0 -0
- package/templates/example-draft/outputs/v1/out/parts/face.png +0 -0
- package/templates/example-draft/outputs/v1/out/parts/lantern.png +0 -0
- package/templates/example-draft/outputs/v1/out/parts/torso.png +0 -0
- package/templates/example-draft/outputs/v1/out/parts.json +188 -0
- package/templates/example-draft/outputs/v1/out/rig/images/background.png +0 -0
- package/templates/example-draft/outputs/v1/out/rig/images/eye_l.png +0 -0
- package/templates/example-draft/outputs/v1/out/rig/images/eye_r.png +0 -0
- package/templates/example-draft/outputs/v1/out/rig/images/face.png +0 -0
- package/templates/example-draft/outputs/v1/out/rig/images/lantern.png +0 -0
- package/templates/example-draft/outputs/v1/out/rig/images/torso.png +0 -0
- package/templates/example-draft/outputs/v1/out/rig/mesh_report.json +1 -0
- package/templates/example-draft/outputs/v1/out/rig/motion.json +137 -0
- package/templates/example-draft/outputs/v1/out/rig/rig.json +102 -0
- package/templates/example-draft/outputs/v1/out/rig/run.json +52 -0
- package/templates/example-draft/outputs/v2/out/check/build/run.json +40 -0
- package/templates/example-draft/outputs/v2/out/check/build/skeleton.atlas +28 -0
- package/templates/example-draft/outputs/v2/out/check/build/skeleton.json +193 -0
- package/templates/example-draft/outputs/v2/out/check/build/skeleton.model.json +483 -0
- package/templates/example-draft/outputs/v2/out/check/build/skeleton.png +0 -0
- package/templates/example-draft/outputs/v2/out/painting_in_rig.png +0 -0
- package/templates/example-draft/outputs/v2/out/parts/background.png +0 -0
- package/templates/example-draft/outputs/v2/out/parts/eye_l.png +0 -0
- package/templates/example-draft/outputs/v2/out/parts/eye_r.png +0 -0
- package/templates/example-draft/outputs/v2/out/parts/face.png +0 -0
- package/templates/example-draft/outputs/v2/out/parts/lantern.png +0 -0
- package/templates/example-draft/outputs/v2/out/parts/torso.png +0 -0
- package/templates/example-draft/outputs/v2/out/parts.json +188 -0
- package/templates/example-draft/outputs/v2/out/rig/images/background.png +0 -0
- package/templates/example-draft/outputs/v2/out/rig/images/eye_l.png +0 -0
- package/templates/example-draft/outputs/v2/out/rig/images/eye_r.png +0 -0
- package/templates/example-draft/outputs/v2/out/rig/images/face.png +0 -0
- package/templates/example-draft/outputs/v2/out/rig/images/lantern.png +0 -0
- package/templates/example-draft/outputs/v2/out/rig/images/torso.png +0 -0
- package/templates/example-draft/outputs/v2/out/rig/mesh_report.json +1 -0
- package/templates/example-draft/outputs/v2/out/rig/motion.json +137 -0
- package/templates/example-draft/outputs/v2/out/rig/rig.json +102 -0
- package/templates/example-draft/outputs/v2/out/rig/run.json +52 -0
- package/templates/example-interview-choice.json +1068 -0
- package/templates/example-interview-options/constraint.json +376 -0
- package/templates/example-interview-options/example-assemble.json +376 -0
- package/templates/example-interview-options/example-bones.json +190 -0
- package/templates/example-interview-options/example-camera-depth.json +99 -0
- package/templates/example-interview-options/example-constraints.json +272 -0
- package/templates/example-interview-options/example-meshes.json +190 -0
- package/templates/example-interview-options/example-motion.json +272 -0
- package/templates/example-interview-options/example-picks.json +15 -0
- package/templates/example-interview-options/example-post-composition.json +110 -0
- package/templates/example-interview-options/example-post-timing.json +105 -0
- package/templates/example-interview-options/example-reference.json +63 -0
- package/templates/example-interview-options/example-rig-type.json +63 -0
- package/templates/example-interview-options/example-seethrough.json +190 -0
- package/templates/example-interview-options/fullscreen.json +63 -0
- package/templates/example-interview-options/other-explicit.json +63 -0
- package/templates/example-interview-options/other-pending.json +63 -0
- package/templates/example-interview-options/other-picks.json +16 -0
- package/templates/example-interview.md +213 -0
- package/templates/example-invariants/invariants.json +1339 -0
- package/templates/example-prepared/prepared.svg +1 -0
- package/templates/example-prepared/source.svg +1 -0
- package/templates/example-project.json +4259 -0
- package/templates/example-remesh/AGENTS.md +134 -0
- package/templates/example-remesh/CLAUDE.md +3 -0
- package/templates/example-remesh/evidence/.gitkeep +0 -0
- package/templates/example-remesh/evidence/approval.txt +1 -0
- package/templates/example-remesh/evidence/captions.json +101 -0
- package/templates/example-remesh/evidence/diff-components.json +34 -0
- package/templates/example-remesh/evidence/direction/v4.json +74 -0
- package/templates/example-remesh/evidence/direction/v5.json +74 -0
- package/templates/example-remesh/evidence/direction-input-v4.json +74 -0
- package/templates/example-remesh/evidence/direction-input-v5.json +74 -0
- package/templates/example-remesh/evidence/interview/assemble.json +309 -0
- package/templates/example-remesh/evidence/interview/bones.json +190 -0
- package/templates/example-remesh/evidence/interview/camera_depth.json +103 -0
- package/templates/example-remesh/evidence/interview/constraints.json +272 -0
- package/templates/example-remesh/evidence/interview/meshes.json +190 -0
- package/templates/example-remesh/evidence/interview/motion.json +272 -0
- package/templates/example-remesh/evidence/interview/post_composition.json +123 -0
- package/templates/example-remesh/evidence/interview/post_timing.json +103 -0
- package/templates/example-remesh/evidence/interview/reference.json +59 -0
- package/templates/example-remesh/evidence/interview/rig_type.json +59 -0
- package/templates/example-remesh/evidence/interview/seethrough.json +186 -0
- package/templates/example-remesh/evidence/parts-check.json +127 -0
- package/templates/example-remesh/evidence/parts-review.json +88 -0
- package/templates/example-remesh/evidence/reopen.txt +1 -0
- package/templates/example-remesh/evidence/review-reads/6a17db694db96f1b6049a61a017e0c8e66757b982b8851e0187e561cfcf9af68.json +59 -0
- package/templates/example-remesh/evidence/scene/s1.json +69 -0
- package/templates/example-remesh/evidence/scene-citations.json +9 -0
- package/templates/example-remesh/evidence/setup.png +0 -0
- package/templates/example-remesh/evidence/split-config.json +1 -0
- package/templates/example-remesh/evidence/structure.json +30 -0
- package/templates/example-remesh/evidence/v1/registration/at-source.json +44 -0
- package/templates/example-remesh/evidence/v1/registration/citations.json +68 -0
- package/templates/example-remesh/evidence/v1/registration/compile-report.json +368 -0
- package/templates/example-remesh/evidence/v1/registration/config-source.json +88 -0
- package/templates/example-remesh/evidence/v1/registration/config.json +88 -0
- package/templates/example-remesh/evidence/v1/registration/interview-requirements.json +8 -0
- package/templates/example-remesh/evidence/v1/registration/package-lock.json +11 -0
- package/templates/example-remesh/evidence/v1/registration/path-adapter.json +1 -0
- package/templates/example-remesh/evidence/v1/registration/rigc-run-1.json +44 -0
- package/templates/example-remesh/evidence/v2/registration/at-source.json +44 -0
- package/templates/example-remesh/evidence/v2/registration/citations.json +68 -0
- package/templates/example-remesh/evidence/v2/registration/compile-report.json +368 -0
- package/templates/example-remesh/evidence/v2/registration/config-source.json +88 -0
- package/templates/example-remesh/evidence/v2/registration/config.json +88 -0
- package/templates/example-remesh/evidence/v2/registration/interview-requirements.json +8 -0
- package/templates/example-remesh/evidence/v2/registration/package-lock.json +11 -0
- package/templates/example-remesh/evidence/v2/registration/path-adapter.json +1 -0
- package/templates/example-remesh/evidence/v2/registration/rigc-run-1.json +44 -0
- package/templates/example-remesh/evidence/v3/registration/at-source.json +44 -0
- package/templates/example-remesh/evidence/v3/registration/citations.json +68 -0
- package/templates/example-remesh/evidence/v3/registration/compile-report.json +368 -0
- package/templates/example-remesh/evidence/v3/registration/config-source.json +88 -0
- package/templates/example-remesh/evidence/v3/registration/config.json +88 -0
- package/templates/example-remesh/evidence/v3/registration/interview-requirements.json +8 -0
- package/templates/example-remesh/evidence/v3/registration/package-lock.json +11 -0
- package/templates/example-remesh/evidence/v3/registration/path-adapter.json +1 -0
- package/templates/example-remesh/evidence/v3/registration/rigc-run-1.json +44 -0
- package/templates/example-remesh/inputs/background.png +0 -0
- package/templates/example-remesh/inputs/painting.png +0 -0
- package/templates/example-remesh/inputs/references/.gitkeep +0 -0
- package/templates/example-remesh/package.json +9 -0
- package/templates/example-remesh/project.json +3916 -0
- package/templates/example-reopened/project.json +4568 -0
- package/templates/example-review/config.json +1 -0
- package/templates/example-review/out/check/build/skeleton.model.json +1 -0
- package/templates/example-review/out/parts/piece.svg +1 -0
- package/templates/example-review/out/parts.json +1 -0
- package/templates/example-review/out/rig/mesh_report.json +1 -0
- package/templates/example-review/out/rig/motion.json +1 -0
- package/templates/example-review/out/rig/rig.json +1 -0
- package/templates/example-split/captions.json +357 -0
- package/templates/example-split/config.json +215 -0
- package/templates/legacy-example-project.json +1071 -0
- package/templates/project.json +199 -0
- 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.
|