@hraness/slopcamera 3.2.8 → 3.3.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 (153) hide show
  1. package/README.md +29 -9
  2. package/apps/desktop/application/context.ts +6 -0
  3. package/apps/desktop/application/default-registry.ts +26 -0
  4. package/apps/desktop/application/operation.ts +14 -1
  5. package/apps/desktop/application/operations/index.ts +4 -0
  6. package/apps/desktop/application/operations/spatial-behavior.ts +151 -0
  7. package/apps/desktop/application/operations/spatial-direction.ts +222 -0
  8. package/apps/desktop/application/operations/spatial-rendered-audit.ts +174 -0
  9. package/apps/desktop/application/operations/spatial-review.ts +194 -0
  10. package/apps/desktop/application/operations/spatial-scene.ts +25 -1
  11. package/apps/desktop/application/registry.ts +2 -2
  12. package/apps/desktop/application/spatial-asset-admission.ts +201 -0
  13. package/apps/desktop/application/spatial-assets.ts +160 -31
  14. package/apps/desktop/application/spatial-render.ts +217 -20
  15. package/apps/desktop/application/spatial-rendered-audit.ts +273 -0
  16. package/apps/desktop/application/spatial-review.ts +361 -0
  17. package/apps/desktop/application/spatial-spz.ts +48 -3
  18. package/apps/desktop/application/spatial-world-import.ts +26 -5
  19. package/apps/desktop/application/spatial-world-metadata.ts +105 -0
  20. package/apps/desktop/cli/args.ts +514 -11
  21. package/apps/desktop/cli/capability-manifest.ts +374 -0
  22. package/apps/desktop/cli/cinema-renderer.ts +608 -0
  23. package/apps/desktop/cli/command-host-resources.ts +29 -1
  24. package/apps/desktop/cli/commands.ts +1188 -4
  25. package/apps/desktop/cli/gateway-review-provider.ts +334 -0
  26. package/apps/desktop/cli/help.ts +172 -6
  27. package/apps/desktop/cli/main.ts +3 -3
  28. package/apps/desktop/cli/portable-surface.ts +6 -1
  29. package/apps/desktop/cli/spatial-asset-service.ts +124 -0
  30. package/apps/desktop/cli/spatial-design-service.ts +237 -0
  31. package/apps/desktop/cli/spatial-generate-service.ts +370 -0
  32. package/apps/desktop/cli/spatial-scene-service.ts +271 -4
  33. package/apps/desktop/cli/workflow-code.ts +1 -1
  34. package/apps/desktop/code/semantic-builder.ts +24 -0
  35. package/apps/desktop/contracts/cinema.ts +736 -0
  36. package/apps/desktop/contracts/index.ts +1 -0
  37. package/apps/desktop/contracts/spatial-asset.ts +16 -0
  38. package/apps/desktop/contracts/spatial-world.ts +26 -3
  39. package/apps/desktop/core/cinema-plan.ts +1320 -0
  40. package/apps/desktop/core/index.ts +1 -0
  41. package/apps/desktop/core/storage.ts +75 -0
  42. package/apps/desktop/dist/cli/main.js +725 -273
  43. package/apps/desktop/html-overlay/spatial.ts +619 -57
  44. package/apps/desktop/workflows/cinematic-world.ts +127 -0
  45. package/apps/desktop/workflows/index.ts +6 -0
  46. package/dist/cli.js +25 -429
  47. package/dist/code/advanced.js +1 -269
  48. package/dist/code/index.js +16 -2239
  49. package/dist/generate.js +1 -23
  50. package/dist/host-resources.js +1 -25
  51. package/dist/index-0bbesn4m.js +35 -0
  52. package/dist/index-296qhpf2.js +3 -0
  53. package/dist/index-3cxf2c58.js +3 -0
  54. package/dist/index-77fjfg9f.js +3 -0
  55. package/dist/index-80a36bc0.js +3 -0
  56. package/dist/index-a3vvs3rf.js +3 -0
  57. package/dist/index-b3geqczn.js +5 -0
  58. package/dist/index-grk47tgs.js +3 -0
  59. package/dist/index-gs48afpt.js +7 -0
  60. package/dist/index-qry58nj2.js +10 -0
  61. package/dist/index-zhg36tf9.js +3 -0
  62. package/dist/index.js +1 -226
  63. package/dist/operations.js +1 -28
  64. package/dist/skill-install-gx7afxsd.js +2 -0
  65. package/dist/vectorize/worker.js +1 -141
  66. package/dist/workflow.js +1 -15
  67. package/docs/README.md +5 -1
  68. package/docs/studio.md +12 -0
  69. package/package.json +7 -5
  70. package/skills/slopcamera/SKILL.md +7 -1
  71. package/skills/slopcamera/references/directed-scenes.md +48 -2
  72. package/skills/slopcamera/references/gateway-media.md +15 -1
  73. package/skills/slopcamera/references/image-galleries.md +166 -0
  74. package/skills/slopcamera/references/install.md +1 -1
  75. package/skills/slopcamera/references/music-video.md +4 -0
  76. package/skills/slopcamera/references/native-studio.md +19 -0
  77. package/skills/slopcamera/references/parametric-design.md +14 -0
  78. package/skills/slopcamera/references/scene-building.md +172 -0
  79. package/skills/slopcamera/references/social-collage-banners.md +204 -0
  80. package/skills/slopcamera/references/workflows-sdk.md +3 -3
  81. package/skills/slopcamera/scripts/compose-social-collage-banner.ts +728 -0
  82. package/src/capability-manifest.ts +361 -0
  83. package/src/cli.ts +222 -4
  84. package/src/code/canonical-json.ts +9 -0
  85. package/src/generate.ts +2 -2
  86. package/src/icon.ts +1111 -0
  87. package/src/image-gallery.ts +1049 -0
  88. package/src/index.ts +11 -0
  89. package/src/mcp/boundary.ts +11 -11
  90. package/src/mcp/index.ts +3 -0
  91. package/src/mcp/server.ts +2 -1
  92. package/src/mcp/tools.ts +1649 -132
  93. package/src/mcp/types.ts +19 -0
  94. package/src/operations.ts +412 -0
  95. package/src/portable-capability-manifest.ts +67 -0
  96. package/src/scene-gallery.ts +184 -0
  97. package/src/spatial-scene/asset-admission.ts +183 -0
  98. package/src/spatial-scene/audit-rendered.ts +692 -0
  99. package/src/spatial-scene/audit.ts +617 -0
  100. package/src/spatial-scene/behavior-audit.ts +252 -0
  101. package/src/spatial-scene/behavior-bake.ts +232 -0
  102. package/src/spatial-scene/behavior-fns.ts +585 -0
  103. package/src/spatial-scene/behavior-gallery.ts +108 -0
  104. package/src/spatial-scene/behavior-stdlib.ts +323 -0
  105. package/src/spatial-scene/behavior-trace.ts +325 -0
  106. package/src/spatial-scene/behavior.ts +617 -0
  107. package/src/spatial-scene/build.ts +632 -0
  108. package/src/spatial-scene/camera-rig.ts +125 -0
  109. package/src/spatial-scene/camera-track.ts +4 -2
  110. package/src/spatial-scene/character.ts +124 -0
  111. package/src/spatial-scene/contracts.ts +75 -7
  112. package/src/spatial-scene/design-templates.ts +351 -0
  113. package/src/spatial-scene/design.ts +327 -0
  114. package/src/spatial-scene/direction-compile.ts +584 -0
  115. package/src/spatial-scene/direction.ts +122 -0
  116. package/src/spatial-scene/effects.ts +149 -0
  117. package/src/spatial-scene/evaluate.ts +109 -29
  118. package/src/spatial-scene/gallery.ts +277 -0
  119. package/src/spatial-scene/generate.ts +239 -0
  120. package/src/spatial-scene/geometry-native.ts +165 -0
  121. package/src/spatial-scene/geometry.ts +1216 -0
  122. package/src/spatial-scene/gltf.ts +600 -77
  123. package/src/spatial-scene/identity.ts +55 -2
  124. package/src/spatial-scene/index.ts +36 -0
  125. package/src/spatial-scene/inspect.ts +35 -6
  126. package/src/spatial-scene/material-lighting.ts +609 -0
  127. package/src/spatial-scene/math.ts +21 -4
  128. package/src/spatial-scene/motion-evidence.ts +88 -0
  129. package/src/spatial-scene/parametric.ts +765 -0
  130. package/src/spatial-scene/particle-preparation.ts +183 -0
  131. package/src/spatial-scene/particle.ts +195 -0
  132. package/src/spatial-scene/patch.ts +109 -15
  133. package/src/spatial-scene/performance.ts +1613 -0
  134. package/src/spatial-scene/probe.ts +137 -0
  135. package/src/spatial-scene/recipe-pack.ts +86 -0
  136. package/src/spatial-scene/render-effects.ts +240 -0
  137. package/src/spatial-scene/review.ts +639 -0
  138. package/src/spatial-scene/simulation-bake.ts +206 -0
  139. package/src/spatial-scene/simulation.ts +187 -0
  140. package/src/spatial-scene/solve.ts +366 -0
  141. package/src/spatial-scene/temporal-audit.ts +354 -0
  142. package/src/version.ts +1 -1
  143. package/dist/index-42zsesc1.js +0 -2257
  144. package/dist/index-7131pg1c.js +0 -1820
  145. package/dist/index-7308egqr.js +0 -48
  146. package/dist/index-8txs6fkn.js +0 -712
  147. package/dist/index-fava6pge.js +0 -192
  148. package/dist/index-h1k0fnjq.js +0 -2363
  149. package/dist/index-r7gdhmsp.js +0 -424
  150. package/dist/index-sh6xbav6.js +0 -1219
  151. package/dist/index-z1w83f81.js +0 -4
  152. package/dist/index-zfnddgay.js +0 -2029
  153. package/dist/skill-install-dh0ntqba.js +0 -10
@@ -2,7 +2,10 @@
2
2
 
3
3
  Use `slopcamera scene --help` to check that the installed CLI includes the directed-scene foundation. The initial renderer uses Three.js and supports explicit scene JSON, semantic edits, calibrated cameras, native media surfaces, contact sheets, and transparent video.
4
4
 
5
- Start with `slopcamera scene init scene.json --json`, then `slopcamera scene inspect scene.json --json`. Retain the original source. Use its stable entity IDs and exact `sceneSha256` in typed patches; save each edit with `--output` to a new file. Inspect `editableControls` before changing generated parts or imported materials. Do not replace named scene parts with opaque regenerated source merely to change one color or camera.
5
+ Use [scene refinement](scene-building.md#refine-an-existing-scene) for a shot-by-shot craft pass, subtle
6
+ behavior design, actual-rig contact checks, and final encoded-frame review.
7
+
8
+ To author a scene from code — builder helpers, procedural generator modules, glTF admission, or geometric audit — read [scene building](scene-building.md) first. Start interactive work with `slopcamera scene init scene.json --json`, then `slopcamera scene inspect scene.json --json`. Retain the original source. Use its stable entity IDs and exact `sceneSha256` in typed patches; save each edit with `--output` to a new file. Inspect `editableControls` before changing generated parts or imported materials. Do not replace named scene parts with opaque regenerated source merely to change one color or camera.
6
9
 
7
10
  Use `slopcamera scene plan scene.json --request request.json --json` before rendering. A frame request is:
8
11
 
@@ -22,15 +25,58 @@ For a media project, finish ordinary timeline/audio edits before V2 migration. R
22
25
 
23
26
  Use `scene project restore` to select an earlier retained scene for explicit shots in a new project revision. Use `add-asset`/`replace-asset` and `set-mesh-geometry` for authored representation changes. Preserve the entity ID and explicitly readdress GLB node/clip indices after a payload replacement; inspect available controls again afterward.
24
27
 
28
+ Generated raster assets enter the scene the same way: declare the image as an `add-asset` payload with `provenance.source: "generated"`, then apply it explicitly — `set-material` with `material.map` on an authored procedural mesh for a texture, or `add-entity` a `kind: "environment"` entity (`role` plus bounded `intensity`) for a skybox. When alternatives matter, review them through [an image gallery](image-galleries.md) first and promote only the selected candidate; a frame renders at most one visible environment entity.
29
+
25
30
  Prepare a camera program with `slopcamera scene project prepare-render <project-id> --input prepare.json --output prepared-render.json --json`. The input declares the exact basis, calibrated output profile, straight-alpha full-frame scene policy, and delivery output/sync policy/tier. Then run `slopcamera workflows plan directed-scene --input prepared-render.json --json` and `slopcamera workflows run directed-scene --input prepared-render.json --json`. Use `slopcamera workflows show directed-scene --json` for the complete prepared-input schema.
26
31
 
27
32
  Use `--profile three-webgl2-hardware-v1` on scene rendering or project preparation to require the qualified macOS Metal backend. Missing or software GPU evidence rejects; no silent fallback occurs. A profile already in the request must agree with the CLI. Omit both fields for the historical software renderer. GPU identity and retained artifact hashes serve different purposes: cross-driver regeneration need not be pixel-identical.
28
33
 
29
- Import saved SPZ and an optional approximate collider with `scene world import --input import.json --source-root <directory> --output-root artifacts/slopcamera/generated/<name> --json`. Declare exact payload hashes, stable IDs, scale, source up axis and uniform transform. Historical World Labs provenance remains supported for offline replay and requires the matching world ID, approximate collider and retained provider receipt. Import needs no provider credential; paid world-generation commands were removed from current source (they remain in the historical Atet v3.2.3 release). Keep all returned assets and the splat entity, and save the consuming scene JSON inside that import output directory so its asset paths resolve relative to the scene file. Metadata dependencies preserve provenance through source-gone replay. Do not invent scale or relabel a collider as verified physics. Use `three-spark-webgl2-hardware-v1` for non-AA SPZ v2/v3, perspective cameras and at most 500,000 splats across the rendered world. This profile renders beauty only; splat depth/ID products and interleaved transparent world surfaces are unsupported. Materials and internal objects inside a splat are not ordinary editable mesh parts.
34
+ Import saved SPZ and an optional approximate collider with `scene world import --input import.json --source-root <directory> --output-root artifacts/slopcamera/generated/<name> --json`. Declare exact payload hashes, stable IDs, scale, source up axis and uniform transform. An optional `providerMetadata` payload reference (for example a Marble `semantics_metadata` JSON export) surfaces recognized scale/ground/up-axis fields as an advisory `suggestedNormalization` in the output manifest; normalization still comes only from the explicit input fields. Historical World Labs provenance remains supported for offline replay and requires the matching world ID, approximate collider and retained provider receipt. Import needs no provider credential; paid world-generation commands were removed from current source (they remain in the historical Atet v3.2.3 release). Keep all returned assets and the splat entity, and save the consuming scene JSON inside that import output directory so its asset paths resolve relative to the scene file. Metadata dependencies preserve provenance through source-gone replay. Do not invent scale or relabel a collider as verified physics. Use `three-spark-webgl2-hardware-v1` for non-AA SPZ v2/v3, perspective cameras and at most 500,000 splats across the rendered world. This profile renders beauty only; splat depth/ID products and interleaved transparent world surfaces are unsupported. Materials and internal objects inside a splat are not ordinary editable mesh parts.
30
35
 
31
36
  Keep receipts and the original run ID after interruption. Inspect `slopcamera runs` and reconcile the exact attempt instead of blindly repeating a possibly published operation. Candidate records preserve derivation and staleness; candidate selection does not yet replace authored footage in the V2 scene compositor. Interactive scene editing and portable simulation remain deferred; native Blender jobs retain their own simulation caches. Use the separate [directing workflow](directing-video.md) to generate and review short clips before assembling an ordinary media project.
32
37
 
33
38
 
39
+ ## Direct cinematic worlds
40
+
41
+ A `slopcamera.spatial-direction` document describes beats, actions, camera coverage, and look intents semantically; its `projectDigest` must equal the scene's `sceneSha256` from `scene inspect`. Check it with `slopcamera scene direction check direction.json --scene scene.json --json`, compile proposals with `scene direction plan ... --camera <camera-id> --output plan.json`, and plan bounded variants with `scene direction gallery ... --axis performance|camera|lighting|materials|effects|sequence`. Compiled direction stays `verified: false` — it is review evidence, not applied state.
42
+
43
+ Bind declared effects through `scene effects plan` and `scene effects check` against the same scene, and bake planned simulation through `scene effects bake` when the plan calls for it. `scene temporal-audit` and `scene render-audit` report sampled evidence over explicit `--times-us` without inventing quality claims.
44
+
45
+ ## Author character behaviors
46
+
47
+ A `slopcamera.spatial-behavior` document describes deterministic character behavior programs as ALGAL organism graphs — inert manifests of typed cells (`input`/`const`/`fn`/`repeat`/`each`/`organism` only for bake-safe behaviors), declared channels, scene binding, and explicit initial state. The organism closure is a content-addressed map of manifest digests to manifests; the `entry` field selects the top-level organism.
48
+
49
+ Check a behavior against a scene with `slopcamera scene behavior check behavior.json --scene scene.json --json`. The checker validates the organism closure (digest consistency, fn references against the admitted catalog, wiring, carry bindings, interface completeness, entity and range against the scene). Bake it with `slopcamera scene behavior bake behavior.json --scene scene.json --output bake.json --json`; the bake runs through the real ALGAL runtime and produces a deterministic emitted trace with a bound receipt. Plan seeded gallery variants with `slopcamera scene behavior gallery behavior.json --scene scene.json --json`. Audit a baked trace with `slopcamera scene behavior audit bake.json --json`; the audit reports state thrash, exact periodicity, dead channels, and unreachable states as advisory findings.
50
+
51
+ Four standard-library organisms are available for composition: locomotion FSM (`behavior.fsm.v1` — state machines with after/chance/flag/clear/always guards), expression layer (`behavior.expression.v1` — blink, gaze, mood), interaction sequence (`behavior.interact.v1` — phase sequencer with emit-on-entry), and a combined organism that merges all three via pairwise `emitted.append`. Each follows the `repeat`+`carry`+`window.advance` accumulation pattern. Use the stdlib organisms as templates; compose them into a behavior document with explicit initial states and scene-bound args.
52
+
53
+ The authoring loop: (1) assemble a behavior doc from stdlib organisms with scene-bound args, (2) check it with `scene behavior check`, (3) bake it with `scene behavior bake`, (4) audit the trace with `scene behavior audit`, (5) plan gallery variants and review. Identical behavior doc + seed + scene produce byte-identical bakes. The `seed` interface input auto-binds from `behavior.seed` for gallery diversity. A channel map (`--channel-map`) binds emitted channels to clip runs, attach/release pairs, or trajectory waypoints for performance directives. Behaviors never execute source, contact providers, or access the filesystem; organisms are data.
54
+
55
+ For SDK authoring, normalize the scene with `parseSpatialScene` and bind the
56
+ behavior using `spatialSceneSha256`. These public helpers validate references and
57
+ normalize entity order so saved SDK scenes and the CLI share the same identity.
58
+ Check, bake, and gallery use that canonical identity. A behavior bound to a raw,
59
+ noncanonical scene hash remains stale: explicitly rebind it to the inspected
60
+ scene and bake again, preserving the earlier documents and receipts.
61
+
62
+ The CLI check and bake still wait for host CPU and local-I/O admission. A concurrent
63
+ render can reserve the CPU pool. A timeout with no output does not establish that
64
+ the behavior program failed; preserve the attempt's outcome and distinguish
65
+ resource waiting from a returned validation error before retrying.
66
+
67
+ When compiling mapped directives with `compileSpatialPerformance`, use the
68
+ exported `SPATIAL_PERFORMANCE_COMPILER_ID` for the plan's `compilerVersion`.
69
+ Compiler `slopcamera.spatial-performance-compiler@v3` resolves prop ownership in
70
+ time order. A later attach can take ownership after a release. At the same
71
+ timestamp, releases precede attaches, so an immediate handoff keeps the new
72
+ attachment; among simultaneous attaches, the last authored attach wins. When the
73
+ latest attachment's interval ends, an older overlapping attachment does not
74
+ resume. Retained `@v2` plans require an explicit version update and a new compile
75
+ and audit. Preserve old takes and receipts as evidence rather than relabeling
76
+ them with the new compiler identity.
77
+
78
+ The `cinematic-world` built-in workflow composes exactly these operations for one admitted scene. Its input is an inert `slopcamera.spatial-recipe-pack` — one scene digest, one direction document, bounded gallery axes, up to 4 named preview render requests, optional declared effects, and optional temporal-audit inputs — wrapped with the scene document and its repository path. Plan it with `slopcamera workflows plan cinematic-world --input input.json --json`; run it with `workflows run`. The workflow never selects or promotes a candidate: registration uses `scene project add-candidate <project-id> --input <request.json>`, and selection uses `scene project select-candidate <project-id> --input <request.json>`, both after review. A recipe pack is data — it cannot register executors, source paths beyond the declared render source, permissions, secrets, or URLs.
79
+
34
80
  ## Direct short generated clips
35
81
 
36
82
  Use [short-video directing](directing-video.md) for retained paid takes and accepted-shot assembly. Use the matching Slopcamera source build for those commands.
@@ -109,6 +109,12 @@ Never automatically retry an interrupted or failed paid generation. Slopcamera u
109
109
  zero client retries because an ambiguous request may still have been charged.
110
110
  Report the failure receipt and reconcile the exact attempt. A deliberate new paid command needs authority within the user’s budget; do not infer that an ambiguous failure was free.
111
111
 
112
+ When the request leaves alternatives open — texture maps, skyboxes,
113
+ backdrops, sprites, or competing design directions — prefer `slopcamera ai
114
+ image gallery`, which runs one tracked job per candidate and composes a
115
+ labelled contact sheet for one review pass. [Image galleries](image-galleries.md)
116
+ covers the candidate grammar, receipt, and explicit promotion steps.
117
+
112
118
  ## Finish the task
113
119
 
114
120
  Report:
@@ -123,7 +129,9 @@ Report:
123
129
 
124
130
  Use [directing video](directing-video.md) for budgeted takes, accepted predecessor frames and local recovery. URL-only models can use its explicit private Blob path; do not paste short-lived signed URLs into CLI arguments or project files. Blob charges and authority are separate from Gateway.
125
131
 
126
- The small portable `slopcamera image generate '<prompt>' --output image.webp` command defaults to `recraft/recraft-v4.1-utility` and admits PNG/JPEG/WebP output. It is distinct from the local `ai` catalog workflow. Preserve literal prompts when requested, keep its output inside the intended workspace and never automatically retry a failed paid call.
132
+ The small portable `slopcamera image generate '<prompt>' --output image.webp` command defaults to `recraft/recraft-v4.1-utility` and admits PNG/JPEG/WebP output. It is distinct from the local `ai` catalog workflow. Preserve literal prompts when requested, keep its output inside the intended workspace and never automatically retry a failed paid call. Its sibling `slopcamera image gallery '<subject>' --output-dir <directory>` shares that bounded model contract and composes several candidates into one review sheet; see [image galleries](image-galleries.md).
133
+
134
+ For product identity SVGs, `slopcamera image icon '<subject>' --purpose <mark|illustration> --output icon.svg` is the canned pipeline. `mark` produces a compact favicon/app/header mark: one to three bold masses in one ink, gated for 16–32 px recognition and low path count. `illustration` (the compatibility default) produces the related marketing illustration: simple isometric structure in one ink, gated against hairlines, dense fills, and detail lost at 64 px. Both run one style-locked Gateway raster through ink normalization, local tracing, and deterministic geometry gates. `--rounds 2` (the default) adds a purpose-specific vision critique that revises the prompt between attempts; `--rounds 1` is a single paid generation with no critique call. `--ink` overrides the ink color and `--keep-raster` retains the normalized line-art PNG beside the SVG.
127
135
 
128
136
  ## Style recipes
129
137
 
@@ -132,3 +140,9 @@ vignette and typewriter notes on paper right), do not ask Gateway to redraw the
132
140
  whole poster. Follow [rubber-stamp-field-notes.md](rubber-stamp-field-notes.md):
133
141
  generate only the stamp with a reference-capable model, then assemble with the
134
142
  local compositor.
143
+
144
+ For an editorial or social banner made from an opaque plate, transparent
145
+ characters, motif clusters, local type, annotations, and diagram clippings,
146
+ follow [social-collage-banners.md](social-collage-banners.md). Generate each
147
+ semantic role independently, inspect its pixels, and compose the selected files
148
+ with the packaged manifest-driven compositor.
@@ -0,0 +1,166 @@
1
+ # Generate and review candidate galleries
2
+
3
+ Use an image gallery when a request leaves visual alternatives open: texture
4
+ maps, skyboxes and environment plates, backdrops, sprites, or competing design
5
+ directions. One command produces several bounded candidates in parallel,
6
+ composes a labelled contact sheet, and keeps every candidate independently
7
+ addressable with its exact prompt, digest, and provenance. Review the sheet
8
+ once, then promote the chosen candidate through an explicit authored step.
9
+ Generation never edits authored source or an existing project implicitly.
10
+
11
+ ## Pick the gallery lane
12
+
13
+ Two commands share one planner and compositor:
14
+
15
+ ```sh
16
+ # Portable: bounded file output, default utility model, still paid per candidate.
17
+ slopcamera image gallery 'weathered copper panel' \
18
+ --kind texture --output-dir review/copper --json
19
+
20
+ # Durable: one tracked Gateway job per candidate, catalog model required.
21
+ slopcamera ai image gallery 'weathered copper panel' \
22
+ --model <image-model-id> --kind texture --output-dir review/copper --json
23
+ ```
24
+
25
+ The portable lane writes candidate files, `gallery.png`, and `receipt.json`
26
+ into `--output-dir`. The durable lane additionally publishes each candidate
27
+ through the generated-artifact store beneath `artifacts/slopcamera/generated/`
28
+ with a retained job record per attempt, so interrupted or ambiguous paid work
29
+ stays reconcilable. Prefer the durable lane when provenance must survive the
30
+ invocation; both lanes are paid calls per candidate with zero client retries.
31
+
32
+ ## Choose the kind
33
+
34
+ `--kind` selects the prompt contract and default aspect:
35
+
36
+ | Kind | Contract | Aspect |
37
+ | --- | --- | --- |
38
+ | `image` | Plain subject, clean composition | 1:1 |
39
+ | `texture` | Seamless tileable flat-lit surface | 1:1 |
40
+ | `skybox` | Equirectangular 360 panorama, centered horizon | 2:1 |
41
+ | `backdrop` | Scenic plate for compositing | 16:9 |
42
+ | `sprite` | One isolated subject on neutral background | 1:1 |
43
+
44
+ ## Control the candidate set
45
+
46
+ - `--count <n>` renders the same kind contract `n` times (up to 16).
47
+ - `--vary 'axis[=v1,v2][;axis2...]'` takes the cartesian product of
48
+ `style`, `palette`, `material`, `lighting`, `mood`, and `detail` values.
49
+ Omit `=values` to use the kind-aware defaults, for example
50
+ `--vary 'style;lighting=golden hour,night'`.
51
+ - `--candidates <file.json>` supplies an explicit bounded list of
52
+ `{id, prompt|variant}` entries. `prompt` replaces the kind template
53
+ verbatim; `variant` appends one direction inside it.
54
+ - `--cell <n>` sets the square cell edge in pixels (64–1024, default 512).
55
+
56
+ `--candidates` is mutually exclusive with `--vary` and `--count`.
57
+
58
+ ## See seams and applied renders, not flat pixels
59
+
60
+ `--kind texture` composites each cell as a 2×2 tiled repeat so tiling seams
61
+ are visible in the sheet itself; `--no-tile` keeps a flat cell, and `--tile`
62
+ opts other kinds in. `--tile` and `--no-tile` are mutually exclusive, and
63
+ receipt rows carry `tiled: true`.
64
+
65
+ On the durable lane, `--preview probe` renders each settled candidate inside a
66
+ fixed checked-in probe scene — a texture becomes the material map on lit
67
+ geometry plus four adjacent wall tiles that expose seams, a skybox becomes the
68
+ scene environment lighting a reflective sphere, a backdrop becomes a surface
69
+ behind a lit subject — and the cell shows the rendered still:
70
+
71
+ ```sh
72
+ slopcamera ai image gallery 'weathered copper panel' \
73
+ --model <image-model-id> --kind texture --preview probe \
74
+ --output-dir review/copper --json
75
+ ```
76
+
77
+ `--preview probe` is valid only for `texture`, `skybox`, and `backdrop`. The
78
+ receipt row keeps the generated candidate `path`/`sha256` and the rendered
79
+ `cellImage` `path`/`sha256` as separate fields — promotion always targets the
80
+ candidate, never the still. A failed render leaves the flat candidate in the
81
+ sheet with a warning.
82
+
83
+ ## Review whole-scene variants
84
+
85
+ `slopcamera ai scene gallery` renders a base scene's bounded typed variants —
86
+ environment swaps, material changes, palette or transform axes expressed as
87
+ `slopcamera.spatial-scene-patch` operations — into the same kind of labelled
88
+ contact sheet, with no paid calls:
89
+
90
+ ```sh
91
+ slopcamera ai scene gallery scene.json \
92
+ --variants gallery.variants.json --output-dir review/world --json
93
+ ```
94
+
95
+ ```json
96
+ { "kind": "slopcamera.scene-variants", "schemaVersion": 1,
97
+ "variants": [
98
+ { "id": "dusk", "label": "Dusk",
99
+ "patch": { "kind": "slopcamera.spatial-scene-patch", "schemaVersion": 1,
100
+ "operations": [{ "kind": "set-color", "entityId": "entity_sky_dome", "color": "#2a1e4f" }] } }
101
+ ] }
102
+ ```
103
+
104
+ Each variant's `expectedSceneSha256` is optional and defaults to the base
105
+ digest; a mismatched value fails before any render. Every derived scene is
106
+ published at `variants/<id>/scene.json` under the output directory with its
107
+ asset payloads staged alongside — inherited payload paths resolve beside the
108
+ authored scene, variant-authored `add-asset`/`replace-asset` payload paths
109
+ resolve beside the variants file — so the derived scene re-renders
110
+ standalone. The receipt keeps the base digest, per-variant patch and derived
111
+ scene digests, the rendered still digest, and the render receipt path per row;
112
+ a failed render stays in the sheet as a failed row. `--camera` selects a scene
113
+ camera, `--time-us` picks the frame, `--cell` sizes cells.
114
+
115
+ ## Review the sheet
116
+
117
+ Inspect `gallery.png` directly. Each cell carries a `#<index> <id>` label; a
118
+ failed candidate stays in the sheet as a dark cell marked `failed` so the
119
+ review covers the whole requested set. `receipt.json` rows map every index to
120
+ its path, SHA-256, media type, request ID, cell geometry, and — on the durable
121
+ lane — its job record path.
122
+
123
+ ## Promote a selected candidate explicitly
124
+
125
+ A gallery never applies itself. After selecting a cell, use that candidate's
126
+ own path and digest. For a scene material or environment, declare the image
127
+ as an asset and apply it through one `scene patch` carrying the current
128
+ `expectedSceneSha256`:
129
+
130
+ ```json
131
+ { "kind": "add-asset", "asset": {
132
+ "assetId": "asset_copper",
133
+ "payload": { "path": "<candidate path relative to the scene file>", "sha256": "<receipt sha256>", "bytes": <n> },
134
+ "interpretation": { "kind": "image", "width": <w>, "height": <h>, "colorSpace": "srgb", "alpha": "opaque", "mimeType": "image/png" },
135
+ "dependencies": [],
136
+ "provenance": { "source": "generated", "description": "Gallery candidate copper-weathered", "receiptSha256": "<receipt.json sha256>" } } },
137
+ { "kind": "set-material", "entityId": "entity_pedestal",
138
+ "material": { "kind": "standard", "color": "#ffffff", "opacity": 1, "roughness": 0.7, "metalness": 0.8, "map": "asset_copper" } }
139
+ ```
140
+
141
+ `material.map` applies to authored procedural geometry only, and scene image
142
+ assets admit PNG/JPEG/SVG payloads. For a selected skybox, `add-entity` a
143
+ `kind: "environment"` entity referencing the image asset with
144
+ `role: "background" | "environment" | "both"` and a bounded `intensity`; at
145
+ most one visible environment entity may appear in a frame, so gate alternates
146
+ through authored `visible` flags. Keep the scene file where its asset paths
147
+ resolve, the same rule as world imports.
148
+
149
+ Outside scenes, promote by pointing the consuming step at the exact retained
150
+ path — a video `project add`, a design slot, or an `image vectorize` input —
151
+ never by copying bytes into an authored path implicitly.
152
+
153
+ For a scene-variant gallery, promotion is adopting the variant: apply the
154
+ selected patch from the variants file through `scene patch` (the receipt row
155
+ keeps its digest), or move the derived `variants/<id>/scene.json` — with its
156
+ staged payloads — to its permanent home. The authored base scene is never
157
+ edited by the gallery.
158
+
159
+ ## Preserve failures and outputs
160
+
161
+ Gallery publication is no-replace: an existing `gallery.png` or
162
+ `receipt.json` in the output directory fails the command before any paid
163
+ dispatch. A failed candidate never retries inside the run; reconcile its
164
+ retained job record or receipt row before deciding a new paid command is
165
+ authorized. If every candidate fails, the labelled sheet and receipt are
166
+ still retained and the command reports `GENERATION_FAILED`.
@@ -14,7 +14,7 @@ command -v slopcamera
14
14
 
15
15
  A restricted shell can omit package-manager paths. Check known host installation paths before declaring a tool unavailable. If Bun is genuinely absent, follow its official [installation guide](https://bun.sh/docs/installation) within the user’s authorized setup scope. Do not switch package managers or pipe an unreviewed installer into a shell.
16
16
 
17
- Slopcamera installs from its verified release archive: `bun add --global https://github.com/hraness/slopcamera/releases/download/v3.2.6/hraness-slopcamera-3.2.6.tgz`, then `slopcamera doctor --json`. Building from source is the contributor path. Historical Atet archives do not install the renamed CLI; never substitute `slopcamera` into an old archive URL.
17
+ Slopcamera installs from its verified release archive: `bun add --global https://github.com/hraness/slopcamera/releases/download/v3.3.1/hraness-slopcamera-3.3.1.tgz`, then `slopcamera doctor --json`. Building from source is the contributor path. Historical Atet archives do not install the renamed CLI; never substitute `slopcamera` into an old archive URL.
18
18
 
19
19
  Use an existing compatible source build when available. Otherwise follow the [complete source-install guide](https://github.com/hraness/slopcamera/blob/main/docs/how-to/use-current-source.md): clone into a new directory, record its exact commit, install locked dependencies without lifecycle scripts, build the SDK and source CLI, then define the shell command against that checkout. A clone or skill installation alone does not install the executable. Do not alter an existing active checkout to satisfy this path.
20
20
 
@@ -5,6 +5,10 @@ including dancing characters, changing landscapes, and musical light accents.
5
5
  The export retains the source and creates an ordinary editable project with
6
6
  separate scene video and original music.
7
7
 
8
+ For an existing composition, use [scene refinement](scene-building.md#refine-an-existing-scene) to review
9
+ each shot, author subtle interactions, check contact, and inspect the encoded
10
+ delivery. Keep the scene's deliberate style and original media intact.
11
+
8
12
  ## Confirm the input and local capability
9
13
 
10
14
  Use the user's selected track and supplied tempo. Establish an explicit duration,
@@ -20,6 +20,25 @@ A failed or interrupted job is never automatically rerun. `studio inspect` reche
20
20
 
21
21
  See the shipped `docs/studio.md` and checked `examples/studio/` for source conventions, color/alpha rules, native caveats and the local `.studio.run()` workflow operation. Source/runtime identities are observed provenance, not a complete hash of every plugin, font, library or ambient read.
22
22
 
23
+ ### Diagnose a Blender render crash
24
+
25
+ `studio probe` discovers devices and checks runtime capabilities; it does not
26
+ render a frame or prove that Cycles shader compilation succeeds. Qualify the
27
+ selected engine and device with a bounded render before a long job.
28
+
29
+ When Blender quits unexpectedly, inspect the exact studio attempt and its retained
30
+ logs, then correlate the process and time with the operating system's crash
31
+ report. On macOS, a `MetalKernelPipeline::compile` stack and a main thread waiting
32
+ in `BlenderSession::render` identify failure during rendering. They do not establish
33
+ an out-of-memory condition, a harmless shutdown, or a particular cache defect.
34
+ A successful Chrome/Three.js render supplies no evidence about Blender's recovery.
35
+
36
+ After custody is settled, test a revised engine or device in a new, explicitly
37
+ configured job if needed. CPU or EEVEE success can narrow the failing path but
38
+ does not fix or qualify Cycles/Metal. Keep the original failure and inspect the
39
+ new frames before adopting that configuration. Do not clear shared caches, alter
40
+ another task's render, or repeatedly launch the failing job as a generic recovery.
41
+
23
42
  ## Share a native output without re-executing it
24
43
 
25
44
  `studio asset <studio-id> --output-id <id> --asset-id <id> --representation native|encoded-video [--frame <index>] --json` rechecks one successful output and returns its spatial asset, binding and receipt. It never rerenders or silently transcodes. Preserve all three together. A frame selection uses the native job’s explicit frame index; an encoded-video selection requires a previously retained unambiguous encode. Unsupported GLB materials, skins or morphs fail before rendering. Keep the original native rig and export a deliberate compatible static derivative.
@@ -0,0 +1,14 @@
1
+ # Build a revisable parametric design
2
+
3
+ Use Slopcamera v3.3.1 or newer and `slopcamera scene design` for dimensions, repeated architectural parts, furniture, pavilions and façades that must regenerate from retained rules. This is a local mesh-design workflow; Rhino, Grasshopper and native engine execution are separate tools.
4
+
5
+ 1. Discover original studies with `slopcamera scene design catalog --json`. Start with `scene design init <new-directory> --template crescent-pavilion|spiral-stair|ribbed-tower|modular-bookshelf`.
6
+ 2. Read the emitted `design.json` and inspect it with `scene design inspect`. Describe the user's intended shape in named parameters, derived scalar values, constraints and semantic geometry stages. Keep references to engineering knowledge separate from visual references. Do not infer structural validation from appearance.
7
+ 3. Save an explicit numeric values object and use `scene design set <design.json> --parameters <values.json> --output <new-design.json>` to preserve revisions. A dimensional change should update dependent members and details together.
8
+ 4. Compile with `scene design compile <design.json> --scene <base.scene.json> --output-dir <new-bundle> --json`. Pass the starter's staging scene for cameras and lights, or a previous compiled scene to preserve supported generated-part overrides. Retain design, scene, exact asset bytes and receipt together.
9
+ 5. Render `scene render <bundle/scene.json> --request <bundle/render.json> --json`. Review hero pixels, then use `camera_detail` and `camera_plan` to inspect repeated members, joints, silhouette and framing. Geometry compilation does not prove visual quality.
10
+ 6. For alternatives, use `scene design gallery` with a bounded `slopcamera.spatial-design-variants` document. It emits up to six complete models; render the candidates through the same camera before selecting one. It makes no paid calls and does not upload source.
11
+
12
+ Place generated bundles below `artifacts/slopcamera/generated/`. Existing files conflict. An interrupted bundle without its final receipt is incomplete; inspect it and choose a fresh destination. The design compiler never executes source text. For native CAD operations or Blender/Cycles production shading, retain a native-studio source and use the explicit trusted-code workflow in [native studio](native-studio.md).
13
+
14
+ Detailed contracts and checked commands: [design reference](https://github.com/hraness/slopcamera/blob/main/docs/parametric-design.md) and [design guide](https://github.com/hraness/slopcamera/blob/main/docs/how-to/parametric-design.md). The portable SDK exports the design compiler and starter catalog from `@hraness/slopcamera/code`; file publication and rendering belong to the CLI.
@@ -0,0 +1,172 @@
1
+ # Build and refine authored scenes
2
+
3
+ For an existing composition, go to [Refine an existing scene](#refine-an-existing-scene)
4
+ for staging, interaction, contact, and final delivery review.
5
+
6
+ Prefer helpers over hand-written scene JSON. The `@hraness/slopcamera/code` export ships pure builders in `spatial-scene/build` that return validated v1 scene data; feed their output into entities, transforms, and animation channels, then parse the whole scene before writing it. Helpers never read files, execute source, or touch a renderer, and every result already satisfies the contract schemas. Use [directed scenes](directed-scenes.md) for rendering, patching, and project commands.
7
+
8
+ ## Camera and animation helpers
9
+
10
+ - `perspectiveFromFov({fovDeg, width, height, near, far})` → calibrated projection. `fovDeg` is the horizontal field of view.
11
+ - `lookAtPose(position, target)` → camera pose facing local −Z at the target.
12
+ - `frameFitPose(bounds, projection, margin)` → pose framing authored or admitted bounds.
13
+ - `easeKeys({from, to, durationUs, easing})` → dense keys for `linear`, `ease-in`, `ease-out`, or `ease-in-out`; `easeChannel({channelId, targetId, property, ...})` wraps them into a ready animation channel. Baked keys stay small: about 25 per 4-second span.
14
+ - `orbitKeys({center, radius, durationUs, ...})` → paired position and look-at rotation keys for a turntable.
15
+
16
+ ## Layout and placement helpers
17
+
18
+ - `align(items, axis, edge)`, `distribute(items, axis, {gap}|{span})`, `row`, `column`, `stack` order existing entities by their transforms and optional bounds.
19
+ - `grid({rows, columns, cellSize, origin?})` → ground-plane cell positions; `scatter({seed, count, region, minSpacing?})` → deterministic seeded XZ positions.
20
+ - `groundSnap(transform, halfHeight, floorY)`, `onTopOf(moverBounds, moverTransform, targetBounds, targetTransform)`, `nextTo(...)`, `facing(transform, target)` resolve relations to concrete transforms immediately. They need bounds — primitives have them; GLB and splat bounds come from `scene asset admit` output or an explicit `--asset-bounds` map.
21
+
22
+ ## The create → audit → patch loop
23
+
24
+ 1. Build or generate the scene JSON.
25
+ 2. `slopcamera scene audit scene.json --camera camera_hero --json` samples evaluated geometry across the duration and reports per-entity frustum state, projected pixel footprint, and findings such as off-camera or never-visible entities. `--times-us` picks explicit samples; `--asset-bounds bounds.json` supplies decoded asset enclosures as a bounds map, an admission document, a `{manifest, facts}` pair, or an array of those.
26
+ 3. Fix with a typed `scene patch` carrying `expectedSceneSha256`, or regenerate. `slopcamera scene diff before.json after.json --json` shows the exact structural difference a patch produced.
27
+ 4. Re-audit, then verify pixels with `slopcamera scene render-audit scene.json --camera camera_hero --json` — it renders the real object-ID pass in the bound browser runtime at each sampled time and counts attributed pixels per entity, catching occlusion and never-rendered cases geometric audit cannot see. Splats and camera-bound view surfaces report honestly as unsupported or non-attributable rather than estimated. Neither audit tier inspects beauty output — materials, textures, text layout, and splat internals still need rendered-frame inspection.
28
+
29
+ ## Generate procedural scenes
30
+
31
+ `slopcamera scene generate --module <file.ts> --generator-id <id> --output scene.json --json` runs a trusted TypeScript module at authoring time — the same trust class as an explicitly imported workflow module, with no sandbox. See `examples/scene-generators/grid-city.ts` for the shape: the module exports `generate(ctx)` returning `{entities, editableKeys?}`; entities carry a caller `key` and never `entityId` or `origin`, which the host stamps from the generator identity. Draw randomness only from `ctx.seed`; an identical run must reproduce identical output, and the retained record pins source, parameters, seed, and output digests. Use `ctx.lib.entityId(key)` to parent entities inside one output. `--parameters` accepts a bounded JSON object; `--into scene.json` regenerates one generator's output while preserving authored entities, other generators, and declared overrides. Transitive relative `.ts`/`.js`/`.json` imports inside the module's own directory are allowed and hashed into the retained closure digest; absolute or escaping specifiers, symlinks, `require()`, and dynamic `import()` are rejected. Asset references are rejected in this version.
32
+
33
+ ## Admit a local glTF asset
34
+
35
+ `slopcamera scene asset admit model.glb --source-root <dir> --output manifest.json --json` validates a local GLB 2.0 against the closed profile, stores it content-addressed, derives model-space and scene-space bounds into a sibling facts manifest, and emits the mesh entity plus ready `add-asset`/`add-entity` patch operations. The source path must stay inside `--source-root`; unsupported GLB features reject rather than degrade. Apply the returned operations through `scene patch`, then feed the admission document itself to `scene audit --asset-bounds`.
36
+
37
+ ## Refine an existing scene
38
+
39
+ Use this pass when an existing HTML, Three.js, or native scene needs better
40
+ staging, character interaction, materials, and motion. Start with its retained
41
+ source and a playable baseline. Finish with reviewed frames from the new encoded
42
+ movie, the source that produced it, and specific remaining limitations.
43
+
44
+ ### Establish the version and shot list
45
+
46
+ Check `slopcamera --version` and the relevant command help against the executable
47
+ you will use. A source checkout, installed CLI, and installed skill can differ.
48
+ Inspect the matching package or release before concluding that a feature is
49
+ missing. Native ALGAL behavior authoring uses `scene behavior check|bake|audit`;
50
+ read [directed scenes](directed-scenes.md#author-character-behaviors) for its
51
+ contracts.
52
+
53
+ Record each shot's time range, intended action, camera, principal objects, and
54
+ visible defects. Preserve deliberate stylistic choices and identity constraints.
55
+ Capture comparable baseline and revised frames at the same scene times. When
56
+ adding a shot, update duration, cuts, captions, end fades, frame count, and review
57
+ sample lists together.
58
+
59
+ Assign independent scene or object groups to separate workers when useful. Keep
60
+ one owner for shared rigs, camera conventions, render settings, generated source,
61
+ and the final browser session. Join the changes before the aggregate review.
62
+
63
+ ### Repair what the camera reveals
64
+
65
+ Review the whole shot before adding detail. Use this order to make each pass
66
+ address the remaining visible problem:
67
+
68
+ | Area | Review and repair |
69
+ | --- | --- |
70
+ | Staging | Make the principal action readable at delivery size. Check silhouettes, feet, faces, sight lines, and foreground occlusion throughout the camera move. Extend sets far enough to cover every intended view. |
71
+ | Contact | Check soles against the floor, fingers against handles, carried objects against hands, and tools against their target surfaces. An object origin is rarely its contact point. |
72
+ | Construction | Give prominent objects plausible thickness, supports, seams, and connections. Inspect stairs, railings, glazing, roofs, furniture, and machine housings for floating or intersecting parts. |
73
+ | Materials | Distinguish metal, glass, painted surfaces, fabric, and foliage through their response to light. Keep roughness and small variations consistent with scale; uniform gloss and repeated bright windows can flatten a scene. |
74
+ | Lighting | Establish a readable key light, restrained fill, and motivated practical lights. Check contact shadows, highlight clipping, bloom, depth-of-field focus, and dark detail in the encoded result. |
75
+ | Motion | Give actions a cause, preparation, contact, follow-through, and rest. Review full motion when a pose depends on a preceding event. |
76
+
77
+ Fix a contact or camera defect before covering it with bloom, grain, motion, or
78
+ extra props. Concentrate detail where the camera can resolve it. Numerical
79
+ geometry checks can catch penetration; they cannot establish that a face is
80
+ visible, a gesture reads well, or a material looks convincing.
81
+
82
+ ### Make behavior serve an observable action
83
+
84
+ Choose a few useful reactions: a commuter notices a sign, a listener looks toward
85
+ the speaker, or two characters pass an object. Define the event sequence before
86
+ varying timing. A handoff might use notice, pause, reach, contact, shared grip,
87
+ release, and acknowledgment. Assign explicit prop ownership intervals and
88
+ document which actor controls the shared phase.
89
+
90
+ Use the native ALGAL interaction organism for phase sequencing, then bind its
91
+ emitted channels to clips, attach/release events, or trajectory waypoints through
92
+ a channel map. Retain the behavior document, scene binding, channel map, bake,
93
+ and audit. Repeat the bake with identical inputs to check determinism. Change
94
+ the seed deliberately when reviewing variants. Inspect advisory findings in the
95
+ context of the channel's meaning; repeated event payloads can be intentional.
96
+
97
+ The behavior trace establishes event timing. Its mapped performance still needs
98
+ the right rig, clip sources, transforms, and contact solution. Measure gaze toward
99
+ the actual target in the character's coordinate frame. Preserve a resting arm
100
+ when only the other arm participates. Use small delays and bounded pose changes
101
+ to separate reactions without giving every object continuous motion.
102
+
103
+ Direct within the visible asset's limits. A mathematically exact gaze can turn a
104
+ photographic face map into an unreadable profile. Review face visibility during
105
+ the gesture and use a restrained glance or nod when that better communicates the
106
+ intended acknowledgment.
107
+
108
+ When adapting a procedural rig, document any proxy skeleton and the conversion
109
+ between local and world transforms. Test the visible rig separately. An audit of
110
+ a proxy does not establish the visible character's foot placement, grip, or
111
+ whole-body physical validity.
112
+
113
+ ### Verify contact and time before the full render
114
+
115
+ Evaluate each frame from its absolute timestamp. Reset transforms and state that
116
+ can otherwise survive a seek. Keep behavior baking outside the frame callback;
117
+ sample the retained result during playback. Test a timestamp, a later timestamp,
118
+ and the original timestamp again, including ownership and pose endpoints.
119
+
120
+ For each important contact, declare the measured surfaces or anchors and a
121
+ tolerance in scene units. Sample the actual loaded rig through the interaction,
122
+ including frames immediately before and after attach, release, impact, and
123
+ planting events. Check finite transforms, grip error, floor clearance, ownership,
124
+ and prop orientation. For moving crowds or vehicles, check geometry extents and
125
+ intermediate times as well as center distances. Report sampling density and
126
+ tolerances; sampled clearance is not continuous collision proof.
127
+
128
+ Require finite measurements and actual samples for every required contact state.
129
+ Missing contact data must fail validation rather than default to zero error.
130
+ Ensure each reported contact and replay check contributes to the final pass/fail
131
+ result.
132
+
133
+ Render a short preview containing the entire difficult action. For an HTML scene,
134
+ author a bounded preview request and map its local clock to the intended source
135
+ time in the authored scene; preserve the full-scene request. For a directed scene,
136
+ use the supported explicit render range. Do not assume a project-specific capture
137
+ flag is a Slopcamera CLI option.
138
+
139
+ Review every shot at its start, middle, and end, then inspect event boundaries,
140
+ cuts, and changed camera coverage. A contact sheet reveals composition and
141
+ continuity; a motion preview reveals timing, sliding, snapping, and occlusion.
142
+ Use both when the change affects interaction. Record defects by shot, object,
143
+ time, and visible consequence so another pass can reproduce them.
144
+
145
+ ### Verify the encoded movie
146
+
147
+ Run the supported [HTML music-video](music-video.md), [directed-scene](directed-scenes.md),
148
+ or [native studio](native-studio.md) render workflow from the converged source.
149
+ Retain its source and runtime receipts. A completed frame loop does not establish
150
+ successful encoding or browser cleanup; resolve any reported lifecycle failure
151
+ before calling the render successful.
152
+
153
+ Probe the delivery for dimensions, rational frame rate, decoded frame count,
154
+ duration, color metadata, and expected audio streams. Derive expected frames from
155
+ the selected workflow's timing rules. Decode review frames from this movie,
156
+ including cuts, the final frame, and the contact phases. If an authored event
157
+ falls between frame times, record the selected frame index and its actual time.
158
+ Review color against the source frames; metadata alone does not prove the correct
159
+ RGB-to-YUV conversion. Distinguish intentional fades from missing or black frames.
160
+
161
+ Keep the previous delivery and hash both files when verifying replacement. A
162
+ different hash proves different bytes, so also compare the intended visible
163
+ changes. Deliver the new movie with a compact scene review, retained evidence,
164
+ and the limitations that remain visible. Avoid a quality or physics claim that
165
+ the review did not establish.
166
+
167
+ For a custom capture optimization, compare decoded pixels against the supported
168
+ capture path at representative lit frames, including transparent edges and
169
+ post-processing. An opening black frame is insufficient evidence. Keep the
170
+ ordinary capture path when equality is required and the comparison differs.
171
+ Never bypass browser signature checks, disable its sandbox, or signal unrelated
172
+ processes to make a render finish.