rig-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/src/scene.ts CHANGED
@@ -9,6 +9,7 @@ import { collectReopens, liveSignoff } from './reopen.ts';
9
9
  import { humanReviewVerdicts, latestAccepted, readVersions } from './review.ts';
10
10
  import { SCENE_CHOICE_MISMATCH, SCENE_CHOICE_MISSING, sceneAuthor, validateAgentSceneAuthority } from './scene-authority.ts';
11
11
  import { reviewPackageHash } from './signoff-target.ts';
12
+ import { samePublicationReviewPair } from './signoff-pair.ts';
12
13
  import type { Json, JsonObject } from './templates.ts';
13
14
 
14
15
  export { SCENE_CHOICE_MISMATCH, SCENE_CHOICE_MISSING, sceneAuthor };
@@ -197,7 +198,8 @@ function validateSceneAcceptance(project: JsonObject, rig: JsonObject): JsonObje
197
198
  const signature = collectSignoffs(project, []).find(value => value.stage === identity.stage && value.checkpoint === identity.checkpoint && value.record.at === identity.at)?.record;
198
199
  const match = /^versions\[(\d+)\]\.verdicts\[(\d+)\]$/.exec(String(acceptance.verdict));
199
200
  const verdict = match && Number(match[1]) === index ? humanReviewVerdicts(version.verdicts, 'rig-review').find(value => value.index === Number(match[2]) && value.record.verdict === 'accepted') : undefined;
200
- if (!verdict || !Number.isFinite(Date.parse(String(verdict.record.at))) || Date.parse(String(verdict.record.at)) > Date.parse(String(identity.at))) sceneFail('SCENE_RIG_STALE', 'scene.rig.acceptance.verdict', 'the cited rig must have been human-accepted before this signoff');
201
+ if (!verdict || !Number.isFinite(Date.parse(String(verdict.record.at))) || Date.parse(String(verdict.record.at)) > Date.parse(String(identity.at))
202
+ && (!signature || !samePublicationReviewPair(project, signature, version, verdict.index))) sceneFail('SCENE_RIG_STALE', 'scene.rig.acceptance.verdict', 'the cited rig needs human acceptance before signing or a same-publication, same-version human accepted pair');
201
203
  const pkg = version.review_package;
202
204
  const target = { version: version.n!, verdict: acceptance.verdict!, review_package: { path: `versions[${index}].review_package`, sha256: isObject(pkg) ? reviewPackageHash(pkg) : '' } };
203
205
  if (!signature || !equal(signature.target, target) || !equal(acceptance.review_package, target.review_package)) sceneFail('SCENE_ACCEPTANCE_STALE', 'scene.rig.acceptance.review_package', 'restore the recorded acceptance target and its matching package sha256');
@@ -0,0 +1,60 @@
1
+ /** Review act order is immaterial only within one human-reviewed publication. */
2
+ import { isDeepStrictEqual } from 'node:util';
3
+ import { asArray, isObject, type Finding } from './check.ts';
4
+ import { decodeReviewAct, isRecordDirectionSignoff, reviewActFindings, reviewActSignoff, SIGNOFF_TARGET_KINDS, signoffActVersion } from './review-act.ts';
5
+ import type { JsonObject } from './templates.ts';
6
+
7
+ export const SIGNOFF_PAIR_SINCE = '2026-11-13T00:00:00Z';
8
+
9
+ /** Trust decoded immutable acts and their unique ledger mappings, never copied identity fields. */
10
+ export function samePublicationReviewPair(project: JsonObject, signoff: JsonObject, version: JsonObject, verdictIndex: number): boolean {
11
+ if (reviewActFindings(project).length) return false;
12
+ try {
13
+ const receipts = asArray(project.review_acts).filter(isObject);
14
+ const signatures = receipts.filter(entry => entry.kind === 'signoff' && typeof entry.bytes === 'string'
15
+ && reviewActSignoff(decodeReviewAct(entry.bytes, 'signoff')).source === signoff.source);
16
+ const verdicts = receipts.filter(entry => entry.version === version.n && entry.verdict === verdictIndex);
17
+ if (signatures.length !== 1 || verdicts.length !== 1) return false;
18
+ const signed = decodeReviewAct(String(signatures[0]!.bytes), 'signoff');
19
+ // The validated compact record receipt binds the post, record hash and exact verdict;
20
+ // record-source acts deliberately have no model selector.
21
+ const signedVersion = isRecordDirectionSignoff(signed) ? Number(signatures[0]!.target_version) : signoffActVersion(signed);
22
+ const accepted = decodeReviewAct(String(verdicts[0]!.bytes));
23
+ const selector = accepted.source.selector;
24
+ const verdict = asArray(version.verdicts)[verdictIndex];
25
+ return isObject(verdict) && verdict.verdict === 'accepted'
26
+ && Object.entries(reviewActSignoff(signed)).every(([key, value]) => isDeepStrictEqual(signoff[key], value))
27
+ && signed.value.stage === signoff.stage && accepted.value.stage === signoff.stage
28
+ && signedVersion === version.n && selector !== null && 'version' in selector && selector.version === version.n
29
+ && selector.kind === SIGNOFF_TARGET_KINDS[String(signoff.stage)]
30
+ && signed.jobId === accepted.jobId && signed.publicationId === accepted.publicationId;
31
+ } catch { return false; }
32
+ }
33
+
34
+ /** A newly ingested verdict must not complete an invalid pair, including a historical signature. */
35
+ export function ingestedVerdictPairFinding(project: JsonObject, version: number, verdict: number): Finding | undefined {
36
+ const index = asArray(project.versions).findIndex(raw => isObject(raw) && raw.n === version);
37
+ for (const [i, signoff] of asArray(project.signoffs).entries()) {
38
+ if (!isObject(signoff) || !isObject(signoff.target) || signoff.target.version !== version
39
+ || signoff.target.verdict !== `versions[${index}].verdicts[${verdict}]`) continue;
40
+ const finding = signoffPairFinding(project, signoff, `signoffs[${i}]`, true);
41
+ if (finding) return finding;
42
+ }
43
+ }
44
+
45
+ /** Check gates history by the signature's date; ingest always enforces the current contract. */
46
+ export function signoffPairFinding(project: JsonObject, signoff: JsonObject, path: string, ingest = false): Finding | undefined {
47
+ if (!(String(signoff.stage) in SIGNOFF_TARGET_KINDS) || !isObject(signoff.target)) return;
48
+ const target = signoff.target;
49
+ const match = /^versions\[(\d+)\]\.verdicts\[(\d+)\]$/.exec(String(target.verdict));
50
+ const version = match ? asArray(project.versions)[Number(match[1])] : undefined;
51
+ if (!match || !isObject(version) || version.n !== target.version) return;
52
+ const verdictIndex = Number(match[2]);
53
+ const verdict = asArray(version.verdicts)[verdictIndex];
54
+ if (!isObject(verdict) || !(Date.parse(String(verdict.at)) > Date.parse(String(signoff.at)))
55
+ || samePublicationReviewPair(project, signoff, version, verdictIndex)) return;
56
+ const legacy = !ingest && Date.parse(String(signoff.at)) < Date.parse(SIGNOFF_PAIR_SINCE);
57
+ const at = `${path}.target.verdict`;
58
+ return { code: `SIGNOFF_PAIR_MISMATCH${legacy ? '_LEGACY' : ''}`, path: at,
59
+ message: `${at}: the verdict follows this signoff without a same-publication, same-version human accepted pair; accept the intended version and sign it again in Review, then ingest both acts` };
60
+ }
@@ -10,6 +10,7 @@ import { checkReviewPackages } from './review-package.ts';
10
10
  import { refuse } from './refusal.ts';
11
11
  import { SIGNOFF_TARGET_KINDS } from './review-act.ts';
12
12
  import { sorted } from './step-hash.ts';
13
+ import { signoffPairFinding } from './signoff-pair.ts';
13
14
  import type { Json, JsonObject } from './templates.ts';
14
15
 
15
16
  export const SIGNOFF_TARGET_SINCE = '2026-11-06T00:00:00Z';
@@ -75,7 +76,11 @@ export function checkSignoffTarget(dir: string, project: JsonObject, signoff: Js
75
76
  if (!isDeepStrictEqual(target, expected)) throw Error(expected.outputs ? 'outputs changed since signing' : stage === 'rig-review' ? 'review_package changed since signing' : expected.direction ? 'direction changed since signing' : 'post config changed since signing');
76
77
  } catch (error) { reason = error instanceof Error ? error.message : String(error); }
77
78
  }
78
- if (!reason) return;
79
+ if (!reason) {
80
+ const pair = signoffPairFinding(project, signoff, path);
81
+ if (pair) (pair.code.endsWith('_LEGACY') ? warnings : refusals).push(pair);
82
+ return;
83
+ }
79
84
  const legacy = Date.parse(String(signoff.at)) < Date.parse(SIGNOFF_TARGET_SINCE);
80
85
  const code = `SIGNOFF_TARGET_${missing ? 'MISSING' : 'STALE'}${legacy ? '_LEGACY' : ''}`;
81
86
  const at = `${path}.target`;
@@ -120,8 +125,6 @@ export function selectSignoffTarget(dir: string, project: JsonObject, stage: str
120
125
  if (mask) refuse(mask.code, mask.message);
121
126
  if (ctx.refusals.length || ctx.warnings.some(w => w.code === 'REVIEW_PACKAGE_MISSING')) fail('review package is missing or differs from its recorded binding');
122
127
  }
123
- const errors: Finding[] = [];
124
- checkSignoffTarget(dir, project, { stage, target, at: SIGNOFF_TARGET_SINCE }, `signoffs[${asArray(project.signoffs).length}]`, errors, []);
125
- if (errors[0]) refuse(errors[0].code, errors[0].message);
128
+ // The writer validates the actual dated signature after attaching its immutable receipt.
126
129
  return target;
127
130
  }
package/src/signoff.ts CHANGED
@@ -1,6 +1,7 @@
1
1
  import { latestPartsVerdictFinding, recordedPartsVerdict } from './parts-verdict-record.ts';
2
2
  import { selectAnswerHashes } from './signoff-answers.ts';
3
3
  import { selectSignoffTarget } from './signoff-target.ts';
4
+ import { signoffPairFinding } from './signoff-pair.ts';
4
5
  import { assertDirectionApproval } from './direction.ts';
5
6
  import { assertCorrectionApproval } from './correction-writers.ts';
6
7
  import { createHash } from 'node:crypto';
@@ -157,6 +158,8 @@ function recordSignoff(stage: string, positional: string[], opts: Record<string,
157
158
  }
158
159
  const recorded = asArray(project.signoffs).filter(isObject).find(entry => entry.source === review.human.source);
159
160
  if (recorded === undefined) refuse('REVIEW_ACT_LEDGER_INVALID', 'project.json.review_acts: the signoff this act recorded is absent; restore its signoffs[] entry');
161
+ const pair = signoffPairFinding(project, recorded, `signoffs[${asArray(project.signoffs).indexOf(recorded)}]`, true);
162
+ if (pair) refuse(pair.code, pair.message);
160
163
  return { stdout: json ? JSON.stringify(recorded, null, 2) : `signoff: replayed ${stage} by ${by} at ${String(recorded.at)}; stage unchanged`, exit: 0 };
161
164
  }
162
165
  if (review.act.schema === 'rig-review/act@4' && review.act.source.projectHash !== jobHash(original!)) refuse('REVIEW_ACT_SOURCE_STALE', 'project.json: displayed signoff record differs; publish the current plan and ask again');
@@ -302,6 +305,8 @@ function recordSignoff(stage: string, positional: string[], opts: Record<string,
302
305
  const invalid = reviewActFindings(project)[0];
303
306
  if (invalid) refuse(invalid.code, invalid.message);
304
307
  }
308
+ const pair = signoffPairFinding(project, signoff, `signoffs[${project.signoffs.length - 1}]`, true);
309
+ if (pair) refuse(pair.code, pair.message);
305
310
  const reopens = collectReopens(project, []);
306
311
  const frontier = furthestStageSignoff(collectSignoffs(project, []).filter(s => liveSignoff(reopens, s.stage, s.at)));
307
312
  const ownLag = signoff.checkpoint === null && frontier?.index === project.signoffs.length - 1;
package/src/structure.ts CHANGED
@@ -154,7 +154,7 @@ export function checkRiggingContext(dir: string, project: JsonObject, effectiveS
154
154
  const delta = structureDelta(snapshot, config);
155
155
  const path = `versions[v${String(version.n)}].provenance`;
156
156
  if (delta.length > 0 && !acceptsStructureDelta(project, historicalReview, Date.parse(String(version.at)))) {
157
- errors.push({ code: 'STRUCTURE_DECISIONS_CONFLICT', path: `${path}.config`, message: `${path}.config: mesh/chest declaration overrides the person-approved structure; answer the rigging meshes guide, or renew parts-review` });
157
+ errors.push({ code: 'STRUCTURE_DECISIONS_CONFLICT', path: `${path}.config`, message: `${path}.config: mesh/chest declaration overrides the person-approved structure; answer the rigging meshes guide and sign off rigging-interview, then rebuild the rig after that sign-off; or renew parts-review and rebuild` });
158
158
  continue;
159
159
  }
160
160
  if ((delta.length > 0 || provenance.structure_delta !== undefined) && !isDeepStrictEqual(provenance.structure_delta, delta)) {
@@ -1,20 +1,20 @@
1
1
  # Agent guide
2
2
 
3
- One painting in, one rig and its takes out. Start here.
3
+ One painting; one rig and its takes.
4
4
 
5
5
  ## Start here
6
6
 
7
- 1. Read `project.json` first. Only its decisions count. Copy chat decisions
8
- verbatim, with speaker and time.
7
+ 1. Read `project.json`. Human acts go through Review; ingest exports. Never type human answers/signatures.
9
8
  2. Run `rig-create next` to derive the next moves and whose they are.
10
9
  3. Resume per {{RESUME_LINK}}.
11
10
 
12
- Update stale pins with `rig-create packages upgrade --by <operator>`; see PROJECT.md.
11
+ {{REOPEN_EXCEPTION}}
13
12
 
14
- Declare the project's painting with `init --painting <file> --origin <words>`
15
- or `input add <path> --painting --origin <words>`. `project.json.painting` binds
16
- one input and survives restart; only it checks siblings for duplicate artwork.
17
- Older records may omit it.
13
+ Stale pins: `rig-create packages upgrade --by <operator>`.
14
+
15
+ Declare the painting: `init --painting <file> --origin <words>` or
16
+ `input add <path> --painting --origin <words>`. `project.json.painting` binds
17
+ one input, survives restart and checks sibling artwork; optional on older records.
18
18
 
19
19
  ## The order, and what you may not do
20
20
 
@@ -22,19 +22,16 @@ Older records may omit it.
22
22
  `rigging-interview` → `rigging` → `rig-review` (the rig, still frame) → `post-interview` → `post` →
23
23
  `direction-review` → `accepted`. Any stage can become `paused`.
24
24
 
25
- - Only a person's `signoffs[]` advances `stage` or passes a plan checkpoint.
26
- You may draft, propose, build and measure in any stage; production rigging
27
- waits for `rigging-interview` ({{STAGES_LINK}}).
28
- - Never derive answers from the image. Offer a pick per ask, with one reasoned
25
+ - Only human `signoffs[]` advance `stage` or pass plan checkpoints.
26
+ Draft, propose, build and measure in any stage; production rigging waits for `rigging-interview` ({{STAGES_LINK}}).
27
+ - Never infer answers from images. Offer a pick per ask: one reasoned
29
28
  recommendation, Other and auto. Retain the shown set; never preselect.
30
- - Record "auto" as delegated, with your decision on the item. It is never a
31
- blank for you to fill later.
29
+ - Record "auto" as delegated with your decision on the item; never leave it blank.
32
30
  - {{INTERVIEW_CHECK}}
33
31
 
34
32
  ## The user's four steps
35
33
 
36
- 1. **Parts and meshes**. Ask framing/source. Review a labelled draft's parts and
37
- mesh/chest structure. `parts-review` records its Review API response.
34
+ 1. **Parts and meshes**. Ask framing/source; review a labelled draft's parts and mesh/chest structure. `parts-review` records its Review API response.
38
35
  The latest receipt must approve the draft for `structure-snapshot --draft <id> --out <f>`
39
36
  and `signoff parts-review --draft <id> --structure-file <f>`; record component triage with `diff-classes --diff-report <p> --by agent` ({{DRAFTS_LINK}}).
40
37
  2. **Rigging interview**. Ask fresh bones, deformation, physics and motion
@@ -47,21 +44,25 @@ Older records may omit it.
47
44
 
48
45
  Ask: `job open --reviewer <id> --role owner --question <id>` or `--plan`;
49
46
  ingest `--from-review <actId>`, then advance.
47
+ Keep the host up across bound writes; after a stop, `job open` with reviewer/role,
48
+ then `job reconcile` before writing.
50
49
 
51
- Use `advance <stage>`, `step-status <id>`; see `rig-create --help`.
50
+ Use `advance <stage>` and `step-status <id>` (`rig-create --help`).
52
51
  `advance parts-review` needs `--parts-check <report> --parts <assembled dir>`,
53
52
  refusing {{PARTS_CHECK_LINK}}.
54
53
  In `parts`, record an `intake-report` preflight and offer its choice, both advisory:
55
54
  {{INTAKE_LINK}}.
56
55
 
57
- Drafts stay under `derived/drafts/<id>/`, never versions/handoff. Old records
58
- warn: preserve history and dates; adopt choices explicitly.
56
+ Keep drafts in `derived/drafts/<id>/`, outside versions/handoff.
57
+ Preserve history/dates; adopt choices explicitly.
59
58
 
60
59
  ## Before you ask, plan or show
61
60
 
62
61
  - **Prior words.** In adopted projects, show them verbatim as a tailored option
63
62
  with source/date; require a pick. Legacy derivation: {{DERIVED_LINK}}.
64
63
  - **Projection.** Ask and record it per {{PROJECTION_LINK}}.
64
+ - **Camera options.** Offer fixed view or camera-box moves only. Head turn,
65
+ depth and plate parallax are unavailable: direction has no depth/turn fields.
65
66
  - **Upscale first** a painting smaller than the rig needs (SOURCE.md, step 2 below).
66
67
  - **The crux is a bar.** Before rigging, name every risk band, count background
67
68
  or doubled pixels over every frame and both physics/breath extremes, and
@@ -70,9 +71,8 @@ warn: preserve history and dates; adopt choices explicitly.
70
71
  installed `--help`. A reading with no command is a STOP before sign-off.
71
72
  Loop bars: INTERVIEW.md, "Bars have reading commands".
72
73
  - **Appearance needs a person**, not a step bar: {{APPEARANCE_LINK}}.
73
- - **Nothing unnamed.** Add no motion, chain or physics the user did not name. A
74
- reference ("move like X") is read for what it shows; anything more is a
75
- question, not a default.
74
+ - **Nothing unnamed.** Add no unnamed motion, chain or physics. Read references
75
+ for what they show; ask about anything more.
76
76
  - **Re-run first, cut last**, never a polygon in code or config: the ladder in
77
77
  SOURCE.md, step 2 below.
78
78
  - **A full-screen scene is a CG build.** For `rig_type` `fullscreen.*`, each
@@ -83,12 +83,10 @@ warn: preserve history and dates; adopt choices explicitly.
83
83
  eyelids) holds none of that part's pixels, or the animation shows its copy.
84
84
  - **Pairs.** Measure left/right symmetry against the painting before calling a
85
85
  pair uneven ({{GATES_LINK}}).
86
- - **Look before the user does**, at native resolution and every boundary the
87
- crux names: a whole-figure |composite − painting| map, every component listed
88
- by box and part with a status (in the painting / fixed / left, why). Use the
89
- true stack of part images, not a render flattened on white; crop on white and
90
- on mid-grey, as white hides light fringes. Eye boxes a
91
- reviewer chose are not the check: a seam outside them got through.
86
+ - **Look before the user does**, at native resolution and every crux boundary:
87
+ a whole-figure |composite − painting| map, each component by box/part and
88
+ status (in the painting / fixed / left, why). Use the true part stack; crop on
89
+ white and mid-grey to show light fringes. Check beyond reviewer-chosen boxes.
92
90
 
93
91
  ## Where things go
94
92
 
@@ -98,11 +96,11 @@ Each folder's lifetime and git status: {{LIFETIME_LINK}}.
98
96
 
99
97
  {{READ_FIRST}}
100
98
 
101
- Read installed docs here at `package.json`'s pins to match tools, not memory.
102
- Run refusal `(see … guide …)` commands before changes.
99
+ Use installed docs at `package.json`'s pins, not memory.
100
+ Run refusal `(see … guide …)` commands first.
103
101
 
104
102
  {{PACKAGE_DOCS}}
105
103
 
106
- Project organisation: rig-c/create docs (not installed).
104
+ Project docs (not installed):
107
105
 
108
106
  {{CREATE_DOCS}}
@@ -1,20 +1,20 @@
1
1
  # Agent guide
2
2
 
3
- One painting in, one rig and its takes out. Start here.
3
+ One painting; one rig and its takes.
4
4
 
5
5
  ## Start here
6
6
 
7
- 1. Read `project.json` first. Only its decisions count. Copy chat decisions
8
- verbatim, with speaker and time.
7
+ 1. Read `project.json`. Human acts go through Review; ingest exports. Never type human answers/signatures.
9
8
  2. Run `rig-create next` to derive the next moves and whose they are.
10
- 3. Resume per [PROJECT.md § How an agent resumes a project](https://github.com/rig-c/create/blob/main/docs/PROJECT.md#how-an-agent-resumes-a-project).
9
+ 3. Resume per [Resume](https://github.com/rig-c/create/blob/main/docs/PROJECT.md#how-an-agent-resumes-a-project).
11
10
 
12
- Update stale pins with `rig-create packages upgrade --by <operator>`; see PROJECT.md.
11
+ Until create#493, agents may type `reopen` only from Review host raw export `act@4`: save nonempty `value.words` byte-for-byte to a verbatim file; `--source` names `actId`. Empty/missing words: STOP. Never supply words. `job fetch-act` rejects act@4.
13
12
 
14
- Declare the project's painting with `init --painting <file> --origin <words>`
15
- or `input add <path> --painting --origin <words>`. `project.json.painting` binds
16
- one input and survives restart; only it checks siblings for duplicate artwork.
17
- Older records may omit it.
13
+ Stale pins: `rig-create packages upgrade --by <operator>`.
14
+
15
+ Declare the painting: `init --painting <file> --origin <words>` or
16
+ `input add <path> --painting --origin <words>`. `project.json.painting` binds
17
+ one input, survives restart and checks sibling artwork; optional on older records.
18
18
 
19
19
  ## The order, and what you may not do
20
20
 
@@ -22,21 +22,18 @@ Older records may omit it.
22
22
  `rigging-interview` → `rigging` → `rig-review` (the rig, still frame) → `post-interview` → `post` →
23
23
  `direction-review` → `accepted`. Any stage can become `paused`.
24
24
 
25
- - Only a person's `signoffs[]` advances `stage` or passes a plan checkpoint.
26
- You may draft, propose, build and measure in any stage; production rigging
27
- waits for `rigging-interview` ([PROJECT.md § Stages](https://github.com/rig-c/create/blob/main/docs/PROJECT.md#stages)).
28
- - Never derive answers from the image. Offer a pick per ask, with one reasoned
25
+ - Only human `signoffs[]` advance `stage` or pass plan checkpoints.
26
+ Draft, propose, build and measure in any stage; production rigging waits for `rigging-interview` ([Stages](https://github.com/rig-c/create/blob/main/docs/PROJECT.md#stages)).
27
+ - Never infer answers from images. Offer a pick per ask: one reasoned
29
28
  recommendation, Other and auto. Retain the shown set; never preselect.
30
- - Record "auto" as delegated, with your decision on the item. It is never a
31
- blank for you to fill later.
32
- - Before asking the user to sign the interview, run `rig-create interview --check`: it names every `null` answer.
29
+ - Record "auto" as delegated with your decision on the item; never leave it blank.
30
+ - Run `rig-create interview --check` before interview sign-off: it names every `null` answer.
33
31
 
34
32
  ## The user's four steps
35
33
 
36
- 1. **Parts and meshes**. Ask framing/source. Review a labelled draft's parts and
37
- mesh/chest structure. `parts-review` records its Review API response.
34
+ 1. **Parts and meshes**. Ask framing/source; review a labelled draft's parts and mesh/chest structure. `parts-review` records its Review API response.
38
35
  The latest receipt must approve the draft for `structure-snapshot --draft <id> --out <f>`
39
- and `signoff parts-review --draft <id> --structure-file <f>`; record component triage with `diff-classes --diff-report <p> --by agent` ([PROJECT.md § Labelled draft rigs](https://github.com/rig-c/create/blob/main/docs/PROJECT.md#labelled-draft-rigs-and-structure-decisions)).
36
+ and `signoff parts-review --draft <id> --structure-file <f>`; record component triage with `diff-classes --diff-report <p> --by agent` ([Draft rigs](https://github.com/rig-c/create/blob/main/docs/PROJECT.md#labelled-draft-rigs-and-structure-decisions)).
40
37
  2. **Rigging interview**. Ask fresh bones, deformation, physics and motion
41
38
  against approved parts/structure; use interview-options/answer/decision.
42
39
  3. **Rig and animation**. Keep rig feedback.
@@ -47,21 +44,25 @@ Older records may omit it.
47
44
 
48
45
  Ask: `job open --reviewer <id> --role owner --question <id>` or `--plan`;
49
46
  ingest `--from-review <actId>`, then advance.
47
+ Keep the host up across bound writes; after a stop, `job open` with reviewer/role,
48
+ then `job reconcile` before writing.
50
49
 
51
- Use `advance <stage>`, `step-status <id>`; see `rig-create --help`.
50
+ Use `advance <stage>` and `step-status <id>` (`rig-create --help`).
52
51
  `advance parts-review` needs `--parts-check <report> --parts <assembled dir>`,
53
52
  refusing [`PARTS_CHECK_MISSING`, `PARTS_CHECK_UNREAD`, `PARTS_CHECK_INVALID`, `PARTS_CHECK_CHANGED`, `PARTS_CHECK_FAILED`, `PARTS_CHECK_STALE`](https://github.com/rig-c/create/blob/main/docs/CHECKS.md#parts-stage-check-at-the-parts--parts-review-move).
54
53
  In `parts`, record an `intake-report` preflight and offer its choice, both advisory:
55
54
  [PROJECT.md § Advisory intake reports](https://github.com/rig-c/create/blob/main/docs/PROJECT.md#advisory-intake-reports).
56
55
 
57
- Drafts stay under `derived/drafts/<id>/`, never versions/handoff. Old records
58
- warn: preserve history and dates; adopt choices explicitly.
56
+ Keep drafts in `derived/drafts/<id>/`, outside versions/handoff.
57
+ Preserve history/dates; adopt choices explicitly.
59
58
 
60
59
  ## Before you ask, plan or show
61
60
 
62
61
  - **Prior words.** In adopted projects, show them verbatim as a tailored option
63
62
  with source/date; require a pick. Legacy derivation: [INTERVIEW.md § Derived answers](https://github.com/rig-c/create/blob/main/docs/INTERVIEW.md#derived-answers).
64
63
  - **Projection.** Ask and record it per [CHECKS.md § Projection and ground](https://github.com/rig-c/create/blob/main/docs/CHECKS.md#projection-and-ground).
64
+ - **Camera options.** Offer fixed view or camera-box moves only. Head turn,
65
+ depth and plate parallax are unavailable: direction has no depth/turn fields.
65
66
  - **Upscale first** a painting smaller than the rig needs (SOURCE.md, step 2 below).
66
67
  - **The crux is a bar.** Before rigging, name every risk band, count background
67
68
  or doubled pixels over every frame and both physics/breath extremes, and
@@ -70,9 +71,8 @@ warn: preserve history and dates; adopt choices explicitly.
70
71
  installed `--help`. A reading with no command is a STOP before sign-off.
71
72
  Loop bars: INTERVIEW.md, "Bars have reading commands".
72
73
  - **Appearance needs a person**, not a step bar: [CHECKS.md § Appearance bar wording](https://github.com/rig-c/create/blob/main/docs/CHECKS.md#appearance-bar-wording).
73
- - **Nothing unnamed.** Add no motion, chain or physics the user did not name. A
74
- reference ("move like X") is read for what it shows; anything more is a
75
- question, not a default.
74
+ - **Nothing unnamed.** Add no unnamed motion, chain or physics. Read references
75
+ for what they show; ask about anything more.
76
76
  - **Re-run first, cut last**, never a polygon in code or config: the ladder in
77
77
  SOURCE.md, step 2 below.
78
78
  - **A full-screen scene is a CG build.** For `rig_type` `fullscreen.*`, each
@@ -83,12 +83,10 @@ warn: preserve history and dates; adopt choices explicitly.
83
83
  eyelids) holds none of that part's pixels, or the animation shows its copy.
84
84
  - **Pairs.** Measure left/right symmetry against the painting before calling a
85
85
  pair uneven ([CRAFT.md G8](https://github.com/rig-c/create/blob/main/docs/CRAFT.md#for-the-gates-not-the-interview)).
86
- - **Look before the user does**, at native resolution and every boundary the
87
- crux names: a whole-figure |composite − painting| map, every component listed
88
- by box and part with a status (in the painting / fixed / left, why). Use the
89
- true stack of part images, not a render flattened on white; crop on white and
90
- on mid-grey, as white hides light fringes. Eye boxes a
91
- reviewer chose are not the check: a seam outside them got through.
86
+ - **Look before the user does**, at native resolution and every crux boundary:
87
+ a whole-figure |composite − painting| map, each component by box/part and
88
+ status (in the painting / fixed / left, why). Use the true part stack; crop on
89
+ white and mid-grey to show light fringes. Check beyond reviewer-chosen boxes.
92
90
 
93
91
  ## Where things go
94
92
 
@@ -96,13 +94,13 @@ Each folder's lifetime and git status: [PROJECT.md § Data is split by lifetime]
96
94
 
97
95
  ## What to read, and why
98
96
 
99
- 1. **Before the interview**: INTERVIEW.md, and CRAFT.md for the default at each
100
- waypoint (both linked below); parts AUTHORING §3, *`config.json`, field by
101
- field*; [CHECKS.md](https://github.com/rig-c/create/blob/main/docs/CHECKS.md) before a sign-off.
102
- 2. **Before `seethrough` and `assemble`**: SOURCE.md, the order of the split and
103
- the cut: [re-running a bad split](https://github.com/rig-c/create/blob/main/docs/SOURCE.md#re-run-first),
104
- [where a cut is allowed](https://github.com/rig-c/create/blob/main/docs/SOURCE.md#where-a-cut-is-allowed);
105
- then parts AUTHORING *See-through head-run source reading*, *Source before
97
+ 1. **Before the interview**: INTERVIEW.md; CRAFT.md (waypoint defaults);
98
+ parts AUTHORING §3, *`config.json`, field by field*;
99
+ [CHECKS.md](https://github.com/rig-c/create/blob/main/docs/CHECKS.md) before a sign-off.
100
+ 2. **Before `seethrough` and `assemble`**: SOURCE.md, split/cut order:
101
+ [bad-split reruns](https://github.com/rig-c/create/blob/main/docs/SOURCE.md#re-run-first),
102
+ [allowed cuts](https://github.com/rig-c/create/blob/main/docs/SOURCE.md#where-a-cut-is-allowed);
103
+ parts AUTHORING *See-through head-run source reading*, *Source before
106
104
  scissors* and *Limbs: cut at their joints*.
107
105
  3. **Before rigging**: [CRAFT.md § For the gates](https://github.com/rig-c/create/blob/main/docs/CRAFT.md#for-the-gates-not-the-interview)
108
106
  (G1–G9); core RIGGING and MOTION; parts AUTHORING §7, the bars `check` enforces.
@@ -110,23 +108,23 @@ Each folder's lifetime and git status: [PROJECT.md § Data is split by lifetime]
110
108
  the [per-frame seam count](https://github.com/rig-c/create/blob/main/docs/LESSONS.md#count-the-seam-bar-over-every-frame),
111
109
  [what to show first](https://github.com/rig-c/create/blob/main/docs/LESSONS.md#what-to-show-the-user-first).
112
110
 
113
- Read installed docs here at `package.json`'s pins to match tools, not memory.
114
- Run refusal `(see … guide …)` commands before changes.
111
+ Use installed docs at `package.json`'s pins, not memory.
112
+ Run refusal `(see … guide …)` commands first.
115
113
 
116
114
  - [@rig-c/parts README.md](node_modules/@rig-c/parts/README.md): painting-to-rig pipeline and command order.
117
115
  - [@rig-c/parts docs/AUTHORING.md](node_modules/@rig-c/parts/docs/AUTHORING.md): config fields, interview waypoints and refusal remedies.
118
116
  - [@rig-c/parts docs/PAINTING.md](node_modules/@rig-c/parts/docs/PAINTING.md): what makes a painting riggable, and the check to run on it before See-through.
119
- - [@rig-c/parts docs/DEPTH.md](node_modules/@rig-c/parts/docs/DEPTH.md): when the plan has a head turn driven by depth.
117
+ - [@rig-c/parts docs/DEPTH.md](node_modules/@rig-c/parts/docs/DEPTH.md): depth reference; unavailable in current direction.
120
118
  - [@rig-c/parts docs/STABILITY.md](node_modules/@rig-c/parts/docs/STABILITY.md): stable commands, fields and outputs.
121
119
  - [@rig-c/parts docs/MIGRATION.md](node_modules/@rig-c/parts/docs/MIGRATION.md): only when the pinned version is bumped.
122
120
  - [@rig-c/core README.md](node_modules/@rig-c/core/README.md): rigc scope, commands and documentation.
123
121
  - [@rig-c/core docs/AUTHORING.md](node_modules/@rig-c/core/docs/AUTHORING.md): rig/motion formats, build loop and failure remedies.
124
122
  - [@rig-c/core docs/RIGGING.md](node_modules/@rig-c/core/docs/RIGGING.md): bones and pivots at the bones waypoint.
125
123
  - [@rig-c/core docs/MOTION.md](node_modules/@rig-c/core/docs/MOTION.md): key-pose motions at the motion waypoint.
126
- - [@rig-c/core docs/FACE.md](node_modules/@rig-c/core/docs/FACE.md): blink, gaze and head-turn plans.
124
+ - [@rig-c/core docs/FACE.md](node_modules/@rig-c/core/docs/FACE.md): blink and gaze in the accepted rig.
127
125
  - [@rig-c/core docs/INGEST.md](node_modules/@rig-c/core/docs/INGEST.md): only when you were handed a skeleton this project did not author.
128
126
 
129
- Project organisation: rig-c/create docs (not installed).
127
+ Project docs (not installed):
130
128
 
131
129
  - [docs/PROJECT.md](https://github.com/rig-c/create/blob/main/docs/PROJECT.md): the folder, stages and sign-offs, the plan, versions, and `project.json` field by field.
132
130
  - [docs/INTERVIEW.md](https://github.com/rig-c/create/blob/main/docs/INTERVIEW.md): how to ask, and the shape every answer, delegation and piece of feedback takes.