@rig-c/create 1.0.0 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (117) hide show
  1. package/README.md +32 -18
  2. package/docs/CHECKS.md +26 -8
  3. package/docs/INTERVIEW.md +11 -4
  4. package/docs/LIVE-REVIEW.md +525 -0
  5. package/package.json +3 -2
  6. package/src/agent-guide.ts +16 -13
  7. package/src/choice-writers.ts +8 -2
  8. package/src/choices.ts +1 -1
  9. package/src/cli.ts +9 -1
  10. package/src/direction-writers.ts +3 -1
  11. package/src/direction.ts +2 -1
  12. package/src/feedback.ts +5 -2
  13. package/src/init.ts +1 -1
  14. package/src/job-acts.ts +44 -3
  15. package/src/job-host.ts +1 -1
  16. package/src/next.ts +113 -53
  17. package/src/record-input.ts +1 -1
  18. package/src/reopen.ts +1 -1
  19. package/src/review-package.ts +2 -1
  20. package/src/scene-writers.ts +2 -1
  21. package/src/scene.ts +3 -1
  22. package/src/signoff-pair.ts +60 -0
  23. package/src/signoff-target.ts +7 -4
  24. package/src/signoff.ts +5 -0
  25. package/src/structure.ts +1 -1
  26. package/templates/agent-guide.md +29 -31
  27. package/templates/example-chain/AGENTS.md +41 -43
  28. package/templates/example-chain/chain.json +55 -55
  29. package/templates/example-chain/checkpoints/0a-interview-options/AGENTS.md +41 -43
  30. package/templates/example-chain/checkpoints/0a-interview-options.json +1 -1
  31. package/templates/example-chain/checkpoints/0b-plan-pending/AGENTS.md +41 -43
  32. package/templates/example-chain/checkpoints/0b-plan-pending.json +1 -1
  33. package/templates/example-chain/checkpoints/1-parts-verdict/AGENTS.md +41 -43
  34. package/templates/example-chain/checkpoints/1-parts-verdict/project.json +2 -2
  35. package/templates/example-chain/checkpoints/1-parts-verdict.json +5 -5
  36. package/templates/example-chain/checkpoints/2-rigging-answers/AGENTS.md +41 -43
  37. package/templates/example-chain/checkpoints/2-rigging-answers/project.json +2 -2
  38. package/templates/example-chain/checkpoints/2-rigging-answers.json +5 -5
  39. package/templates/example-chain/checkpoints/3-rig-review/AGENTS.md +41 -43
  40. package/templates/example-chain/checkpoints/3-rig-review/project.json +4 -4
  41. package/templates/example-chain/checkpoints/3-rig-review.json +9 -9
  42. package/templates/example-chain/checkpoints/4-direction-post/AGENTS.md +41 -43
  43. package/templates/example-chain/checkpoints/4-direction-post/project.json +5 -5
  44. package/templates/example-chain/checkpoints/4-direction-post.json +9 -9
  45. package/templates/example-chain/evidence/captions.json +1 -1
  46. package/templates/example-chain/evidence/direction/v2.json +1 -1
  47. package/templates/example-chain/evidence/direction-input.json +1 -1
  48. package/templates/example-chain/evidence/scene/s1.json +1 -1
  49. package/templates/example-chain/project.json +10 -10
  50. package/templates/example-direction/derived/review/v1/out/check/build/run.json +2 -2
  51. package/templates/example-draft/derived/drafts/lantern/out/check/build/run.json +2 -2
  52. package/templates/example-draft/derived/drafts/lantern/out/run.json +2 -2
  53. package/templates/example-draft/derived/review/v1/out/check/build/run.json +2 -2
  54. package/templates/example-draft/derived/review/v1/out/rig/run.json +2 -2
  55. package/templates/example-draft/derived/review/v2/out/check/build/run.json +2 -2
  56. package/templates/example-draft/derived/review/v2/out/rig/run.json +2 -2
  57. package/templates/example-draft/evidence/direction/v4.json +3 -3
  58. package/templates/example-draft/evidence/direction-input-v4.json +3 -3
  59. package/templates/example-draft/evidence/parts-review.json +1 -1
  60. package/templates/example-draft/evidence/review-reads/{4ed0507381809746443021554e012032be5b5f8417da0f2e525e9b6df16e9f05.json → 52673b635b9cbc92da1a9e3d4c023a249bbacf79cd21b59724f03f18f8caf09b.json} +2 -2
  61. package/templates/example-draft/evidence/scene/s1.json +3 -3
  62. package/templates/example-draft/evidence/scene-citations.json +1 -1
  63. package/templates/example-draft/out/check/build/run.json +2 -2
  64. package/templates/example-draft/out/run.json +2 -2
  65. package/templates/example-draft/outputs/v1/out/check/build/run.json +2 -2
  66. package/templates/example-draft/outputs/v1/out/rig/run.json +2 -2
  67. package/templates/example-draft/outputs/v2/out/check/build/run.json +2 -2
  68. package/templates/example-draft/outputs/v2/out/rig/run.json +2 -2
  69. package/templates/example-interview-choice.json +68 -68
  70. package/templates/example-interview-options/constraint.json +2 -2
  71. package/templates/example-interview-options/example-assemble.json +2 -2
  72. package/templates/example-interview-options/example-bones.json +5 -5
  73. package/templates/example-interview-options/example-camera-depth.json +3 -3
  74. package/templates/example-interview-options/example-constraints.json +5 -5
  75. package/templates/example-interview-options/example-meshes.json +5 -5
  76. package/templates/example-interview-options/example-motion.json +5 -5
  77. package/templates/example-interview-options/example-picks.json +2 -2
  78. package/templates/example-interview-options/example-post-composition.json +3 -3
  79. package/templates/example-interview-options/example-post-timing.json +3 -3
  80. package/templates/example-interview-options/example-reference.json +2 -2
  81. package/templates/example-interview-options/example-rig-type.json +2 -2
  82. package/templates/example-interview-options/example-seethrough.json +2 -2
  83. package/templates/example-interview-options/fullscreen.json +2 -2
  84. package/templates/example-interview-options/other-explicit.json +2 -2
  85. package/templates/example-interview-options/other-pending.json +2 -2
  86. package/templates/example-interview-options/other-picks.json +2 -2
  87. package/templates/example-invariants/invariants.json +164 -164
  88. package/templates/example-project.json +249 -249
  89. package/templates/example-remesh/AGENTS.md +41 -43
  90. package/templates/example-remesh/evidence/captions.json +1 -1
  91. package/templates/example-remesh/evidence/direction/v4.json +1 -1
  92. package/templates/example-remesh/evidence/direction/v5.json +1 -1
  93. package/templates/example-remesh/evidence/direction-input-v4.json +1 -1
  94. package/templates/example-remesh/evidence/direction-input-v5.json +1 -1
  95. package/templates/example-remesh/evidence/interview/assemble.json +1 -1
  96. package/templates/example-remesh/evidence/interview/bones.json +4 -4
  97. package/templates/example-remesh/evidence/interview/camera_depth.json +2 -2
  98. package/templates/example-remesh/evidence/interview/constraints.json +4 -4
  99. package/templates/example-remesh/evidence/interview/meshes.json +4 -4
  100. package/templates/example-remesh/evidence/interview/motion.json +4 -4
  101. package/templates/example-remesh/evidence/interview/post_composition.json +2 -2
  102. package/templates/example-remesh/evidence/interview/post_timing.json +2 -2
  103. package/templates/example-remesh/evidence/interview/reference.json +1 -1
  104. package/templates/example-remesh/evidence/interview/rig_type.json +1 -1
  105. package/templates/example-remesh/evidence/interview/seethrough.json +1 -1
  106. package/templates/example-remesh/evidence/parts-review.json +1 -1
  107. package/templates/example-remesh/evidence/review-reads/{6a17db694db96f1b6049a61a017e0c8e66757b982b8851e0187e561cfcf9af68.json → afe2522be4087f7f2fa7e97746d5f8574b0aedb474245ce2dbce0455e662f041.json} +2 -2
  108. package/templates/example-remesh/evidence/scene/s1.json +2 -2
  109. package/templates/example-remesh/evidence/v1/registration/at-source.json +2 -2
  110. package/templates/example-remesh/evidence/v1/registration/rigc-run-1.json +2 -2
  111. package/templates/example-remesh/evidence/v2/registration/at-source.json +2 -2
  112. package/templates/example-remesh/evidence/v2/registration/rigc-run-1.json +2 -2
  113. package/templates/example-remesh/evidence/v3/registration/at-source.json +2 -2
  114. package/templates/example-remesh/evidence/v3/registration/rigc-run-1.json +2 -2
  115. package/templates/example-remesh/project.json +225 -225
  116. package/templates/example-reopened/project.json +289 -289
  117. package/templates/example-split/captions.json +1 -1
package/README.md CHANGED
@@ -25,12 +25,14 @@ Requires [Bun](https://bun.sh) 1.4.0 or newer and Git. Run the published CLI
25
25
  without a global install:
26
26
 
27
27
  ```sh
28
- bunx --package @rig-c/create rig-create --help
29
- bunx --package @rig-c/create rig-create init p1
30
- bunx --package @rig-c/create rig-create interview --check p1 --json
31
- bunx --package @rig-c/create rig-create next p1 --json
28
+ bunx rig-create --help
29
+ bunx rig-create init p1
30
+ bunx rig-create interview --check p1 --json
31
+ bunx rig-create next p1 --json
32
32
  ```
33
33
 
34
+ To pin the canonical scoped name, use `bunx --package @rig-c/create rig-create …`.
35
+
34
36
  Or install it globally:
35
37
 
36
38
  ```sh
@@ -92,23 +94,35 @@ Release preparation and the owner-operated publication steps are in
92
94
 
93
95
  ## Recording approvals
94
96
 
97
+ Agents route human picks, corrections, verdicts and signatures through Review.
98
+ Open the relevant question, draft, rig/post version or plan, let the person act
99
+ in the tool, then use `job acts` and ingest its printed writer command:
100
+
95
101
  ```sh
96
- rig-create signoff plan-approved --by user --verbatim-file approval.txt <project dir>
97
- rig-create parts-review <project dir> --draft <id> --from-review-cli --by user -- <rig-review parts arguments>
102
+ rig-create job open <project dir> --reviewer <id> --role owner --plan
103
+ rig-create job acts <project dir>
104
+ rig-create signoff plan-approved --from-review <actId> <project dir>
105
+ rig-create parts-review <project dir> --from-review <actId>
98
106
  rig-create structure-snapshot <project dir> --draft <id> --out evidence/structure-decisions.json
99
- rig-create diff-classes <project dir> --diff-report <report> --triage-file <triage> --by agent
100
- rig-create signoff parts-review --by user --draft <id> --structure-file evidence/structure-decisions.json --verbatim-file approval.txt <project dir>
101
- rig-create signoff rigging --checkpoint constraints --by user --verbatim-file approval.txt <project dir>
102
- rig-create signoff post-interview --by user --steps camera,timing --verbatim-file - <project dir>
103
- rig-create review 2 --verdict accepted --by user --review rig-review --source note --verbatim-file feedback.txt --at 2026-11-04T12:00:00Z --answers-feedback 1:0 <project dir>
107
+ rig-create signoff parts-review --from-review <actId> --draft <id> --structure-file evidence/structure-decisions.json <project dir>
108
+ rig-create review <version> --from-review <actId> <project dir>
104
109
  ```
105
110
 
106
- `signoff` records without moving the stage. It uses the clock, signs all steps
107
- of the stage's phase unless `--steps` narrows them, fills null checkpoints from
108
- the draft and preserves existing answers and delegations. Input is UTF-8 and
109
- keeps every byte, including spaces and final newlines. Omitting
110
- `--verbatim-file` reads stdin. Review also supports the existing `--verbatim`
111
- option. See [the record contract](docs/PROJECT.md#recording-a-sign-off).
111
+ The commands illustrate separate acts; publish the matching subject before each
112
+ human act. Keep the Review host up across bound writes. If it stops, `job open`
113
+ again with reviewer/role, then `job reconcile` before more writes. `--rig <n>`
114
+ selects either a rig or a post version.
115
+
116
+ `signoff` records without moving the stage; `advance` uses its authority. Direct
117
+ `--by` sign-off/review and `interview-answer --pick` are low-level interfaces for
118
+ people operating the CLI themselves and synthetic fixtures, not an agent route
119
+ for human acts. Agents must not type an owner's answer or signature, or request
120
+ one in chat in place of Review. Until create#493, an agent may type `reopen` only
121
+ using a Review host raw export `act@4`: save its nonempty `value.words`
122
+ byte-for-byte to the `--verbatim-file` and name `actId` with `--source`.
123
+ Empty/missing words are a STOP; the agent never supplies words. `job fetch-act`
124
+ rejects `act@4`; use the host raw export. See [the live Review flow](docs/LIVE-REVIEW.md)
125
+ and [the record contract](docs/PROJECT.md#recording-a-sign-off).
112
126
 
113
127
  ## The clock
114
128
 
@@ -156,7 +170,7 @@ it fails, naming the constant, when a `*_SINCE` date is still in the future.
156
170
  New projects ask a separate multiple-choice question for each applicable ask,
157
171
  with a reasoned agent recommendation, Other and explicit delegation. The shown
158
172
  option file is retained by raw sha256. Record it with `interview-options`, then
159
- use `interview-answer --pick` or fetch Review's finalized act with `--from-review <actId>`;
173
+ open the question in Review and ingest its finalized act with `interview-answer --from-review <actId>`;
160
174
  `interview-decision` records only the explicitly delegated asks. See
161
175
  [the choice contract](docs/INTERVIEW.md#per-ask-choices-interview2) and the
162
176
  [generated consumer fixture](templates/example-interview-choice.json).
package/docs/CHECKS.md CHANGED
@@ -27,7 +27,7 @@ requires Bun 1.4 or later. See [Live review](LIVE-REVIEW.md).
27
27
  | `JOB_PUBLISH_PENDING` | A committed `project.json` result awaits publication. Restore its bound host and sources, then run `job reconcile` before another participating write or close. |
28
28
  | `JOB_HOST_ATTACH_REFUSED` | Strict reuse-only attach to the bound live host was refused. The pending receipt names the host `reason` and `phase` (including `incarnation-missing` on `record` or `probe`). Reopen or restore the bound live host before reconciling. |
29
29
  | `JOB_HOST_REUSE_MISMATCH` | The private binding's host tuple or `listenerIncarnation` (`jobId`, `origin`, `listenerIncarnation`, `root`, `stateDir`, `fingerprint`, `reviewer.id`, `reviewer.role`, `readerId`, `bindingId`, `partsEnumeratorId`, `partsEnumeratorVersion`, `apiSchema`, `actSchema`, `port`) differs. The pending receipt names the `field` and both `expected` and `actual` values. Restore the original host configuration before reconciling. |
30
- | `JOB_PUBLICATION_STALE` | The pending version entry is missing or has a different entry hash. Restore that retained version and its files before reconciling. Later surrounding-record changes do not invalidate it. The check preserves the receipt and names the HOLE. |
30
+ | `JOB_PUBLICATION_STALE` | The pending version entry is missing or has a different entry hash. Restore that retained version and its files before reconciling. Later surrounding-record changes do not invalidate version publications. Exception: a record publication binds the whole project.json byte hash, so any record change while it is pending makes it stale; restore the bound record bytes before reconciling. The check preserves the receipt and names the HOLE. |
31
31
  | `JOB_PUBLICATION_INVALID` | A result, selector or retained file (including a declared rig/post or draft original painting `inputs[0]` and its PNG header) differs from the writer's recorded rig/post or draft. Restore its declared package, source painting and direction bytes. Missing/empty rig/post inputs keep no reference; an unreadable legacy original retains `INPUT_WRITER_MISSING` and no reference, as check does. |
32
32
  | `JOB_PUBLICATION_SCENE_MISSING` | An @2 post lacks its scene reference or the scene file is missing or unreadable; restore the direction.scene reference and retained scene bytes before publishing. |
33
33
  | `JOB_PUBLICATION_SCENE_CHANGED` | An @2 post scene differs from project.scenes, its path, document identity or recorded hash; restore the committed scene reference and bytes before publishing. |
@@ -708,7 +708,7 @@ file unchanged. The shared `VERBATIM_*` codes also apply to `review`.
708
708
  | `SIGNOFF_CHECKPOINT_INVALID` | a covered step has no boolean `checkpoint_proposed`, an undecided delegation or no boolean checkpoint answer; `--checkpoint` also refuses a missing, ambiguous, disabled or wrong-stage step |
709
709
  | `RIG_VERSION_UNACCEPTED` | `signoff rig-review` while no live rig version has an accepted rig-review verdict because a reopen or amendment made the accepted one history; the message names that verdict and the `reopens[]` or `amendments[]` entry. Register a new rig version (`rig-version <n>`), accept it (`review <n> --verdict accepted --review rig-review`), then sign. A rig made history is no `--version` target either, and a project with no acceptance at all is refused by the target selection (`SIGNOFF_TARGET_STALE`) |
710
710
  | `UNKNOWN_OPTION` | an unsupported option, including `signoff --at` (exit 2) |
711
- | `VERBATIM_UNREADABLE` | a verbatim file or stdin cannot be read |
711
+ | `VERBATIM_UNREADABLE` | a verbatim file or stdin cannot be read; relative --verbatim-file paths resolve against the current working directory, not the project folder; use an absolute path or run from the file's folder |
712
712
  | `VERBATIM_INVALID_UTF8` | the input cannot round-trip as UTF-8 through JSON (exit 2) |
713
713
  | `REVIEW_NOT_HUMAN` | the reviewer is `agent`, case-insensitively |
714
714
  | `REVIEW_OPTION_INVALID` | invalid `--at`, malformed feedback ref, both `--verbatim` and `--verbatim-file`, or competing human-value/feedback flags with `--from-review` (exit 2) |
@@ -738,7 +738,7 @@ are unchanged. No prepared files are silently registered or repaired.
738
738
  | `DERIVED_FILE_CHANGED` | either file's bytes differ from its recorded sha256 | restore the recorded bytes, or record the new preparation |
739
739
  | `AGENT_BOUNCE_MALFORMED` | a history entry dated on or after `AGENT_BOUNCE_SINCE` has a `bounce` other than `{ cause: "agent", failed, bar, replacement }` with non-empty text | write what failed, the bar, and its replacement |
740
740
 
741
- Contract dates (`AGENT_BOUNCE_SINCE`, `ASK_COVERAGE_SINCE`, `DIFF_MAP_SINCE`, `DIFF_MAP_AGENT_SINCE`, `APPLIED_REVIEW_SINCE`, `PROJECTION_ASKS_SINCE`, `SETUP_PAINTING_SINCE`, `FIGURE_MASK_SINCE`, `FIGURE_MASK_INPUTS_SINCE`, `CHOICE_ANSWERS_SINCE`, `BUILD_IDENTITY_SINCE`, `PART_FILE_IDENTITY_SINCE`, `CONFIG_INPUTS_SINCE`, `DESCRIBED_DIRECTION_SINCE`, `SIGNOFF_TARGET_SINCE`, `SIGNOFF_ANSWERS_SINCE`, `STAGE_PROGRESS_SINCE`, `INPUT_WRITER_SINCE`, `DIRECTION_SCENE_SINCE`, `OVERRIDDEN_ANSWERS_SINCE`, `RUN_RECORD_SINCE`, `PROGRESS_HISTORY_SINCE`, `SCENE_CONTEXT_SINCE`, `PARTS_CHECK_SINCE`, `PLATE_RECEIPT_SINCE`, `REVIEW_READ_SINCE`, `PARTS_VERDICT_DRAFT_SINCE`, `PARTS_VERDICT_LATEST_SINCE`, `PARTS_VERDICT_RECEIPT_SINCE`, `FIX_LEDGER_SINCE` and `DRAFT_CONFIG_INPUTS_SINCE`) are the day the change lands, at 00:00Z, so they are never in the future; a record made earlier that day is checked against pilot projects before the change lands.
741
+ Contract dates (`AGENT_BOUNCE_SINCE`, `ASK_COVERAGE_SINCE`, `DIFF_MAP_SINCE`, `DIFF_MAP_AGENT_SINCE`, `APPLIED_REVIEW_SINCE`, `PROJECTION_ASKS_SINCE`, `SETUP_PAINTING_SINCE`, `FIGURE_MASK_SINCE`, `FIGURE_MASK_INPUTS_SINCE`, `CHOICE_ANSWERS_SINCE`, `BUILD_IDENTITY_SINCE`, `PART_FILE_IDENTITY_SINCE`, `CONFIG_INPUTS_SINCE`, `DESCRIBED_DIRECTION_SINCE`, `SIGNOFF_TARGET_SINCE`, `SIGNOFF_PAIR_SINCE`, `SIGNOFF_ANSWERS_SINCE`, `STAGE_PROGRESS_SINCE`, `INPUT_WRITER_SINCE`, `DIRECTION_SCENE_SINCE`, `OVERRIDDEN_ANSWERS_SINCE`, `RUN_RECORD_SINCE`, `PROGRESS_HISTORY_SINCE`, `SCENE_CONTEXT_SINCE`, `PARTS_CHECK_SINCE`, `PLATE_RECEIPT_SINCE`, `REVIEW_READ_SINCE`, `PARTS_VERDICT_DRAFT_SINCE`, `PARTS_VERDICT_LATEST_SINCE`, `PARTS_VERDICT_RECEIPT_SINCE`, `FIX_LEDGER_SINCE` and `DRAFT_CONFIG_INPUTS_SINCE`) are the day the change lands, at 00:00Z, so they are never in the future; a record made earlier that day is checked against pilot projects before the change lands.
742
742
 
743
743
  Exception for #117 (2026-11-06): `original_n` has no `*_SINCE` boundary because repo HQ counted zero consumer records with `pre_interview: true`, only the synthetic fixture being updated, and historical build dates cannot date a migration.
744
744
 
@@ -769,7 +769,7 @@ non-array `derived`), `PROJECT_JSON_INVALID`, or `SCHEMA_UNKNOWN` (exit 1).
769
769
  | `REVIEW_PACKAGE_PARTS_MISMATCH` | package out/parts.json SHA256 differs from the accepted parts manifest SHA256 at build time. Rig acceptance and handoff refuse this for the selected version | preserve history and record a new version from the accepted parts and its own build outputs |
770
770
  | `REVIEW_PACKAGE_PART_FILE_MISMATCH` | on or after PART_FILE_IDENTITY_SINCE, a packaged part SHA256 differs from an image listed in the accepted verdict source.files, or that image is missing from the package | preserve the package and record a new version containing the reviewed part files |
771
771
  | `REVIEW_PACKAGE_PART_FILE_LEGACY` | WARN for the same differing or missing part identity before PART_FILE_IDENTITY_SINCE or with an unreadable version date | preserve historical bytes and include the reviewed part files in the next version |
772
- | `REVIEW_PACKAGE_PARTS_UNREAD` | the hash-bound verdict needed for a version's parts comparison is unreadable or differs from its recorded bytes | restore the retained verdict matching signoffs[].evidence.sha256 before checking or packaging the version; before BUILD_IDENTITY_SINCE or with an unreadable version date this is a WARN |
772
+ | `REVIEW_PACKAGE_PARTS_UNREAD` | the hash-bound verdict needed for a version's parts comparison is unreadable or differs from its recorded bytes | preserve the underlying finding: for act parsing failures compare recorder and installed Review versions, then register with a reader that parses the act or wait until support lands; for missing/changed evidence restore the verdict matching signoffs[].evidence.sha256. Before BUILD_IDENTITY_SINCE or with an unreadable version date this is a WARN |
773
773
 
774
774
  `PART_FILE_IDENTITY_SINCE = 2026-11-06T00:00:00Z` dates individual part identity by the rig version's `at`. Each non-manifest entry in the selected accepted verdict's `source.files[]` maps relative to its `parts.json` directory into the package's `out/` directory. The package writer checks those identities before publication. Check, rig acceptance, rig signoff and handoff enforce the same cutoff, scoped to the selected rig at writer and handoff boundaries. The message names the part path, reviewed hash and packaged hash or `missing`. Rig acceptance and handoff also propagate `REVIEW_PACKAGE_CHANGED` and `REVIEW_PACKAGE_PARTS_MISMATCH` for the selected version. A date-only `at` compares against each cutoff as UTC midnight, so `2026-11-06` falls on the post-cutoff side exactly like `2026-11-06T00:00:00Z`.
775
775
 
@@ -949,7 +949,7 @@ is create-owned artifact identity, not producer provenance or reproducibility.
949
949
  | `DRAFT_RIG_AS_VERSION` | draft role/identity/reserved paths are offered as a numbered version, review, package or handoff | build an independently authorised production rig |
950
950
  | `STRUCTURE_DECISIONS_MISSING` | new-order parts approval lacks its draft or explicit structure snapshot | supply --draft and --structure-file, including entries:[] when unchanged |
951
951
  | `STRUCTURE_DECISIONS_INVALID` | snapshot schema/declarations/config binding are malformed or changed | retain the exact human-approved structure file |
952
- | `STRUCTURE_DECISIONS_CONFLICT` | a snapshot or retained production config contradicts the approved mesh/chest declaration | answer the rigging meshes guide, or renew parts-review |
952
+ | `STRUCTURE_DECISIONS_CONFLICT` | a snapshot or retained production config contradicts the approved mesh/chest declaration | answer the rigging meshes guide and sign off rigging-interview, then rebuild after that sign-off; or renew parts-review and rebuild |
953
953
  | `STRUCTURE_DELTA_MISMATCH` | recorded structure_delta differs from the snapshot/config comparison | register a new rig version with its exact computed delta |
954
954
  | `STRUCTURE_DELTA_REVIEW` | WARN: counted structure entries changed under the signed rigging meshes guide | cover changed structure in the rig-review verdict and sign-off |
955
955
  | `PARTS_VERDICT_DRAFT_MISMATCH` | a parts-review sign-off's verdict `source.files[]` lists a file whose sha256 is in neither its `draft_id` draft's `parts.files[]` nor its `files[]` (the outputs a parts view that shows meshes also lists: `rig.json`, `mesh_report.json`, mesh rasters), or leaves out one of the draft's `parts.files[]`, matched as sha256 multisets and leaving out only the raster the draft's `parts.json` declares under `painting_in_rig`; an output the verdict does not list is not missing; the message lists up to three unmatched files on each side. `signoff parts-review --draft` and `structure-snapshot` refuse it; the check refuses a sign-off dated from `PARTS_VERDICT_DRAFT_SINCE = 2026-11-08T00:00:00Z` or without a readable date and WARNs an earlier one | review the named draft's parts in rig-review's parts view and sign with that verdict, or name the draft the verdict reviewed; preserve an earlier record |
@@ -1073,7 +1073,7 @@ direction*, defines the closed schema, immutable paths and read contract.
1073
1073
  | `DIRECTION_CONTRACT_INVALID` | missing adoption on authoring, malformed schema/clock/grandfather list, or invalid grandfathered identity | adopt explicitly and preserve the captured inventory |
1074
1074
  | `DIRECTION_DOCUMENT_REQUIRED` | an adopted, non-grandfathered post lacks `provenance.direction` | produce the retained direction document |
1075
1075
  | `DIRECTION_SCHEMA` | malformed JSON, missing/unknown fields, invalid types/counts/easing/box/duration or nonfinite numbers | use the closed direction@1 shape |
1076
- | `DIRECTION_FILE` | retained file is missing, ignored, nonregular, a symlink, escaping or not a literal POSIX relative path | retain the exact regular file in the project |
1076
+ | `DIRECTION_FILE` | retained file is missing, ignored, nonregular, a symlink, escaping or not a literal POSIX relative path | retain the exact regular file in a non-ignored project folder such as evidence/direction-src/ and use its project-relative POSIX path |
1077
1077
  | `DIRECTION_HASH` | document/model raw bytes differ from the declared SHA256 | restore the bound bytes or author a new version |
1078
1078
  | `DIRECTION_RIG_UNKNOWN` | rig number/model hash/path does not resolve to the accepted version's compiled review-package model, or --rig disagrees | bind the exact retained accepted model |
1079
1079
  | `DIRECTION_RIG_STALE` | document and post rig differ, current rig is superseded/unaccepted, or packaging would rebind a cited model | accept a new rig and author new direction on it |
@@ -1143,6 +1143,8 @@ direction-review signature binds an accepted verdict and its version's reviewed
1143
1143
  | `SIGNOFF_TARGET_STALE` | The version, operative human accepted verdict, package inventory, imported outputs or direction binding no longer resolves, or writer selection is ambiguous | Restore the reviewed inputs and select the accepted version with `--version` |
1144
1144
  | `SIGNOFF_TARGET_MISSING_LEGACY` | A pre-contract signature has no target | Preserve history and bind the next review signature |
1145
1145
  | `SIGNOFF_TARGET_STALE_LEGACY` | A pre-contract signature's target no longer resolves | Preserve history and bind the next review signature |
1146
+ | `SIGNOFF_PAIR_MISMATCH` | A rig-review or direction-review sign-off predates its target verdict without a human accepted pair bound by unique immutable act receipts to the same job, publication and version. Ingest always refuses; check refuses from `SIGNOFF_PAIR_SINCE = 2026-11-13T00:00:00Z`, dated by `signoffs[].at` | Accept the intended version and sign it again in Review, then ingest both acts |
1147
+ | `SIGNOFF_PAIR_MISMATCH_LEGACY` | WARN: the same inconsistent pair on a sign-off before `SIGNOFF_PAIR_SINCE` | Preserve history; accept and sign the intended version in Review for the next pair |
1146
1148
 
1147
1149
  ## Answer revision approvals
1148
1150
 
@@ -1522,7 +1524,7 @@ and known regressions under `ledger`.
1522
1524
  | `DRAFT_LEDGER_INCOMPLETE` | the report has no row for a live ledger row | run the check script over every non-retired row |
1523
1525
  | `DRAFT_LEDGER_REGRESSION` | a live row the predecessor's report passed, or one the predecessor recorded as a known regression (it stays owed), is `fail`, `unmeasurable` or absent here, and `--known-regression` does not name it | fix the build, or record the draft with `--known-regression <row id>=<reason file>` for each row |
1524
1526
  | `DRAFT_LEDGER_MALFORMED` | `fixes`, `fixes_against` or `known_regressions` without a report; `known_regressions` is not a list of `{ id, reason }` with unique ids, or names a row the predecessor neither passed nor owed; `fixes_against` is not an earlier draft with a parts-review receipt or the previous draft (`null` only for the first); `fixes` differs from the rows the report passes and that draft did not | record the draft again with `draft-rig` under a new id; the old record is kept |
1525
- | `INIT_ARTWORK_EXISTS` | `init --painting` or `input add --painting` declares a file whose sha256 is an input of a project directly under `--projects-root` (default: the new project's parent), without `--same-artwork-reason` | record the redo as a version of that project, or give the reason for a different rig kind |
1527
+ | `INIT_ARTWORK_EXISTS` | `init --painting` or `input add --painting` declares a file whose sha256 is an input of a project directly under `--projects-root` (default: the new project's parent), without `--same-artwork-reason` | continue in the existing project as a new version; restart inherits its correction ledger. A new project is only for different artwork or a different rig kind (with --same-artwork-reason); copying the artwork is not a bypass |
1526
1528
  | `INIT_ARTWORK_USAGE` | an init artwork option without `--painting <file> --origin <words>`, an unreadable painting or root, or a reason that is empty or names no matching project (exit 2) | give `--painting` and `--origin`; drop a reason no project needs |
1527
1529
  | `RESTART_USAGE` | `restart` arguments are missing, repeated or unsupported, or the reason file is empty (exit 2) | use `restart [<dir>] --by <human> --reason-file <file>` |
1528
1530
  | `RESTART_NOT_A_PROJECT` | the folder has no readable `rig-create/project@0` `project.json` | run restart on a create project folder |
@@ -1586,7 +1588,6 @@ other post generation delta refuses `PUBLICATION_GENERATION_INVALID`.
1586
1588
  | Code | Refusal | Remedy |
1587
1589
  | --- | --- | --- |
1588
1590
  | `SOURCE_PIN_ANCESTRY` | `scripts/source-ci-pins.json` names a SHA before the package's release tag, or release metadata/history is unavailable or not exact | fetch complete sibling history and tags; choose a SHA at or after the exact `package.json` release pin; play uses the dependency at the release-pinned Review tag |
1589
-
1590
1591
  | `CONSUMER_CI_COVERAGE` | `scripts/consumer-ci-tests.json` names an absent case, registry check does not pass it, or source CI skips any other case | restore exact consumerOnlyTest registration and registry execution; run every other source case |
1591
1592
 
1592
1593
  ### Record asks on the live screen
@@ -1663,3 +1664,20 @@ optional on older records; present rows are validated by the writer and check.
1663
1664
  | `PACKAGE_UPGRADE_CHECK_FAILED` | The project check could not complete; repair the record or installed packages and retry. |
1664
1665
  | `PACKAGE_UPGRADE_REFUSAL` | The named package move adds or changes the named check finding; preserve the original pins and resolve that finding before retrying. |
1665
1666
  | `PACKAGE_UPGRADE_CONFLICT` | Another package writer holds the lock, or a source changed during staging; finish the other write and retry against current bytes. |
1667
+
1668
+ ## Release workflow gates
1669
+
1670
+ These CI-only codes name `.github/workflows/release.yml` or its tagged
1671
+ `package.json`; they do not validate project records.
1672
+
1673
+ | Code | Meaning and remedy |
1674
+ | --- | --- |
1675
+ | `RELEASE_REF_NOT_TAG` | `release.yml`: use a tag push or dispatch with matching `--ref vX.Y.Z -f tag=vX.Y.Z`. |
1676
+ | `RELEASE_TAG_FORM` | `release.yml`: supply a strict `vX.Y.Z` tag without prerelease or leading zeros. |
1677
+ | `RELEASE_TAG_UNRESOLVED` | `release.yml`: restore tag/API access so the explicit tag ref resolves to a full commit SHA. |
1678
+ | `PROVENANCE_SHA_MISMATCH` | `release.yml`: the run, API or fetched tag commits differ; inspect the cut tag and recover on that exact tag ref without moving it. |
1679
+ | `RELEASE_TAG_NOT_ON_MAIN` | `release.yml`: restore fetched main/tag history or land the reviewed release commit on main before cutting a new tag. |
1680
+ | `RELEASE_TAG_VERSION_MISMATCH` | Tagged `package.json`: release the exact `@rig-c/create@X.Y.Z` matching the tag; do not move an existing cut tag. |
1681
+ | `RELEASE_ALREADY_PUBLISHED` | `release.yml`: npm already serves the version; verify that publication rather than republishing it. |
1682
+ | `RELEASE_REGISTRY_UNCONFIRMED` | `release.yml`: confirmation of both names timed out; inspect npm before recovery because publication may already have succeeded. |
1683
+ | `ALIAS_SAME_CONTENT` | `scripts/alias_tarball.ts compare`: an alias differs beyond the `package/package.json` name line; rebuild it from the reviewed scoped tarball and resolve every named file difference before publication. |
package/docs/INTERVIEW.md CHANGED
@@ -3,7 +3,7 @@
3
3
  The direction a user gives before any rig work starts, and the shape every
4
4
  answer takes in `project.json`. The interview is organised by the **waypoints**
5
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
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 framing and timing are
7
7
  **post-production**, asked separately after the rig is accepted. The plan the
8
8
  work follows is drafted from these answers ([PROJECT.md § The plan](PROJECT.md#the-plan));
9
9
  a worked example is in [../templates/example-interview.md](../templates/example-interview.md),
@@ -223,7 +223,7 @@ seeing a build. Read from `@rig-c/parts` 2.4.0:
223
223
  | `meshes`, `regions` | waypoint `meshes` | what deforms and what rides rigid |
224
224
  | `constraints`, `stops`, `cloth` | waypoint `constraints` | what moves on physics and how far |
225
225
  | `motion` | waypoint `motion` | what moves, how far, how fast |
226
- | `turn`, `depth` | post item `camera_depth` | head-turn and 2.5D depth are direction, asked after the rig is accepted |
226
+ | `turn`, `depth` | post item `camera_depth` | historical question mapping only; direction cannot carry depth or turn, so do not offer these as options |
227
227
  | `key`, `generation`, `proposed_rig_scale`, `requirements`, `motion_seams`, `note` | not a waypoint | a name, a record of a run, a value the tool proposes, a path to a checks file, an observation, an annotation — none is a direction call. `requirements` is where translated guide sentences will land, not where they are asked. |
228
228
 
229
229
  The agent writes the checks file named by the config's `requirements` path.
@@ -330,7 +330,7 @@ it means they look again.
330
330
 
331
331
  ## Post-production: asked after the rig is accepted
332
332
 
333
- 2.5D depth and camera work are far from rigging: nothing in the rig is built or
333
+ Camera framing and timing are separate from rigging: nothing in the rig is built or
334
334
  judged for them. They are not rig waypoints. Their guides are asked when
335
335
  `post-interview` opens, after the rig has passed `rig-review`, in the same
336
336
  answer shape and under the same rule: every post item the plan passes carries a
@@ -341,10 +341,17 @@ names ([PROJECT.md § The hand-off to post-production](PROJECT.md#the-hand-off-t
341
341
 
342
342
  | id | Config sections | Prompt | What the agent decides there | Guide sentence, example |
343
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."* |
344
+ | `camera_depth` | camera boxes | Is the view fixed, or does it move along a camera-box path such as a push-in? | fixed framing or a camera-box path only | *"Fixed camera, no parallax."* · *"A slow push-in."* |
345
345
  | `post_timing` | — | How long, does it loop, and where are the beats? | clip length, loop point, timing of motions against each other | *"Ten seconds, looping; the gust comes once, in the middle."* |
346
346
  | `post_composition` | — | What is around the figure — background, framing, other figures, light? | framing, background plate, what else is on screen | *"Frame from the knees up; keep the lighthouse in shot."* |
347
347
 
348
+ The `camera_depth` question text in `project.json` still names a head turn and
349
+ parallax: recorded projects and the hash-sealed examples carry those bytes, so they stay.
350
+ Ask it as this table words it, with options that fit the current writers. Offer fixed framing, a push-in or another camera-box path. A head turn
351
+ is not available yet: the direction format cannot carry depth or turn. It also
352
+ has no relative plate motion for parallax, or take-wide gaze/dial cycle. Do not
353
+ offer those as buildable choices or sign plan bars promising them.
354
+
348
355
  ## Bars have reading commands
349
356
 
350
357
  Before putting a bar to the user for sign-off, the drafter names the command