stillmade-sdk 0.1.42 → 0.1.44

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 (262) hide show
  1. package/.stillmade/sdk-baseline.json +6 -8
  2. package/AGENTS.md +15 -10
  3. package/FRAME_VIEWS.md +113 -0
  4. package/INTERFACE_DESIGN.md +62 -22
  5. package/MOBILE_UI.md +4 -2
  6. package/MODULES.md +152 -6
  7. package/PASTE_TO_LLM.md +35 -25
  8. package/README.md +3 -2
  9. package/SDK.md +994 -550
  10. package/UI_AESTHETIC.md +22 -2
  11. package/blocks/generate/package.js +1 -0
  12. package/blocks/generate/versions/1.0.0/package.js +463 -0
  13. package/docs/build/audio-to-editor.md +36 -0
  14. package/docs/build/block-builder-contract.md +150 -0
  15. package/docs/build/comfyui.md +227 -0
  16. package/docs/build/concepts.md +40 -0
  17. package/docs/build/context.md +159 -0
  18. package/docs/build/cookbook.md +57 -0
  19. package/docs/build/custom-interface.md +617 -0
  20. package/docs/build/data-types.md +83 -0
  21. package/docs/build/frame-views.md +259 -0
  22. package/docs/build/generate-media.md +59 -0
  23. package/docs/build/github-applications.md +314 -0
  24. package/docs/build/hosted-images.md +214 -0
  25. package/docs/build/hosted-music.md +39 -0
  26. package/docs/build/hosted-speech.md +157 -0
  27. package/docs/build/hosted-text.md +246 -0
  28. package/docs/build/image-description.md +49 -0
  29. package/docs/build/interface-design.md +343 -0
  30. package/docs/build/javascript.md +63 -0
  31. package/docs/build/local-preview.md +61 -0
  32. package/docs/build/media-analysis.md +27 -0
  33. package/docs/build/media.md +400 -0
  34. package/docs/build/mobile-ui.md +106 -0
  35. package/docs/build/modules.md +487 -0
  36. package/docs/build/original-blocks.md +70 -0
  37. package/docs/build/outside-apis.md +128 -0
  38. package/docs/build/production-context-templates.md +12 -0
  39. package/docs/build/project-storage.md +94 -0
  40. package/docs/build/quickstart.md +48 -0
  41. package/docs/build/recipes.md +103 -0
  42. package/docs/build/script-handoff.md +45 -0
  43. package/docs/build/script-writer.md +34 -0
  44. package/docs/build/state.md +223 -0
  45. package/docs/build/testing.md +112 -0
  46. package/docs/build/timeline-edits.md +116 -0
  47. package/docs/build/timeline-proposals.md +76 -0
  48. package/docs/build/transcription.md +59 -0
  49. package/docs/build/triggers.md +59 -0
  50. package/docs/build/tutorial.md +52 -0
  51. package/docs/build/typescript.md +34 -0
  52. package/docs/build/video-generation.md +61 -0
  53. package/docs/build/web-reading.md +37 -0
  54. package/docs/build/with-your-ai.md +27 -0
  55. package/docs/changelog.md +9 -0
  56. package/docs/creators.md +21 -0
  57. package/docs/distribute/discovery.md +43 -0
  58. package/docs/distribute/imports.md +58 -0
  59. package/docs/distribute/publishing.md +29 -0
  60. package/docs/distribute/sdk-versions.md +36 -0
  61. package/docs/distribute/selling.md +14 -0
  62. package/docs/distribute/teams.md +60 -0
  63. package/docs/distribute/versioning.md +28 -0
  64. package/docs/examples.md +23 -0
  65. package/docs/gallery.md +26 -0
  66. package/docs/index.md +50 -0
  67. package/docs/native-mcp.md +307 -0
  68. package/docs/project-types/automation.md +43 -0
  69. package/docs/project-types/batches.md +50 -0
  70. package/docs/project-types/build.md +42 -0
  71. package/docs/project-types/completion.md +15 -0
  72. package/docs/project-types/conditions.md +21 -0
  73. package/docs/project-types/hosted-review.md +115 -0
  74. package/docs/project-types/onboarding.md +75 -0
  75. package/docs/project-types/running.md +309 -0
  76. package/docs/project-types/testing.md +72 -0
  77. package/docs/reference/application-artifacts.md +87 -0
  78. package/docs/reference/authoring-guide.md +134 -0
  79. package/docs/reference/browser-applications.md +267 -0
  80. package/docs/reference/capabilities.md +45 -0
  81. package/docs/reference/cli.md +71 -0
  82. package/docs/reference/connection-api.md +59 -0
  83. package/docs/reference/cooperative-jobs.md +13 -0
  84. package/docs/reference/desktop-capabilities.md +172 -0
  85. package/docs/reference/desktop-execution.md +77 -0
  86. package/docs/reference/errors.md +233 -0
  87. package/docs/reference/execution.md +800 -0
  88. package/docs/reference/first-party-blocks.md +40 -0
  89. package/docs/reference/generation-models.md +59 -0
  90. package/docs/reference/limits.md +306 -0
  91. package/docs/reference/manifest-kinds-controls.md +36 -0
  92. package/docs/reference/manifest.md +181 -0
  93. package/docs/reference/operations.md +36 -0
  94. package/docs/reference/package-jobs.md +35 -0
  95. package/docs/reference/parity.md +55 -0
  96. package/docs/reference/permissions.md +86 -0
  97. package/docs/reference/ports.md +26 -0
  98. package/docs/reference/types.md +268 -0
  99. package/docs/reference/universal-resolver.md +303 -0
  100. package/docs/reference/view-bridge.md +60 -0
  101. package/docs/reference/view-rules.md +15 -0
  102. package/docs/reference/workspace-sync.md +25 -0
  103. package/docs/sdk.md +34 -0
  104. package/docs/tools/block-remix.md +211 -0
  105. package/docs/tools/llm.md +2213 -0
  106. package/docs/tools/repository-adaptation.md +613 -0
  107. package/examples/check-clip.stillmade.json +4 -1
  108. package/examples/generate-video.stillmade.json +6 -2
  109. package/examples/research-topic.stillmade.json +5 -1
  110. package/examples/text-workflow.stillmade.json +3 -32
  111. package/examples/timeline-polish.stillmade.json +11 -3
  112. package/examples/transcribe-audio.stillmade.json +11 -3
  113. package/package.json +1 -1
  114. package/packages/block-cli/cli.js +13 -6
  115. package/packages/block-cli/dev-host/assets/host.js +76 -38
  116. package/packages/block-cli/dev-host/assets/index.css +1 -1
  117. package/packages/block-cli/format.js +1 -1
  118. package/packages/block-cli/templates.js +31 -13
  119. package/packages/block-cli/type-packages.js +119 -0
  120. package/packages/block-platform/block-readiness.js +5 -0
  121. package/packages/block-platform/canvas.js +2 -1
  122. package/packages/block-platform/catalog.js +27 -48
  123. package/packages/block-platform/native-host-inventory.js +0 -226
  124. package/packages/block-platform/plain-descriptions.js +1 -25
  125. package/packages/block-platform/project-type-starters.js +13 -53
  126. package/packages/block-platform/script-handoff.js +2 -4
  127. package/packages/block-platform/type-workspace.js +2 -0
  128. package/packages/block-sdk/appearance.js +3 -1
  129. package/packages/block-sdk/block-tier.js +1 -1
  130. package/packages/block-sdk/builder-contract.js +10 -8
  131. package/packages/block-sdk/capabilities.js +1 -1
  132. package/packages/block-sdk/contracts.js +6 -2
  133. package/packages/block-sdk/first-party-identities.js +1 -84
  134. package/packages/block-sdk/first-party-packages.js +3 -85
  135. package/packages/block-sdk/generation-catalog.js +15 -3
  136. package/packages/block-sdk/index.d.ts +2 -1
  137. package/packages/block-sdk/media-analysis-example.js +1 -1
  138. package/packages/block-sdk/mock-host.js +7 -1
  139. package/packages/block-sdk/module-host-calls.js +35 -10
  140. package/packages/block-sdk/module-hosted.js +15 -2
  141. package/packages/block-sdk/module-media-access.js +71 -0
  142. package/packages/block-sdk/module-node.js +1 -1
  143. package/packages/block-sdk/portable-media-actions.js +1 -1
  144. package/packages/block-sdk/runtime.js +1 -1
  145. package/packages/block-sdk/timeline-proposal-example.js +1 -1
  146. package/packages/block-sdk/transcription-example.js +1 -1
  147. package/packages/block-sdk/video-generation-example.js +1 -1
  148. package/packages/block-sdk/view-bridge.js +4 -1
  149. package/packages/block-sdk/view-design.js +17 -14
  150. package/packages/block-sdk/web-example.js +1 -1
  151. package/packages/design-system/block-kit.css +48 -12
  152. package/packages/design-system/block-kit.html +3 -2
  153. package/blocks/mcp-motion-planner/versions/1.1.0/package.js +0 -97
  154. package/blocks/motion-designer/versions/1.0.1/package.js +0 -173318
  155. package/blocks/motion-designer/versions/1.0.2/package.js +0 -173318
  156. package/blocks/motion-frame-review/versions/1.1.1/package.js +0 -465
  157. package/blocks/motion-frame-review/versions/1.1.2/package.snapshot.js +0 -572
  158. package/blocks/narration/package.js +0 -1
  159. package/blocks/narration/versions/1.0.0/package.js +0 -221
  160. package/blocks/narration/versions/1.0.1/package.js +0 -221
  161. package/blocks/native/sm.animated-scene/versions/2.0.0/package.js +0 -475
  162. package/blocks/native/sm.animated-scene/versions/2.1.0/package.js +0 -498
  163. package/blocks/native/sm.animated-scene/versions/2.2.0/package.js +0 -524
  164. package/blocks/native/sm.animated-scene/versions/2.3.0/package.js +0 -618
  165. package/blocks/native/sm.animated-scene/versions/2.3.1/package.js +0 -618
  166. package/blocks/native/sm.animated-scene/versions/2.3.2/package.js +0 -723
  167. package/blocks/native/sm.animated-scene/versions/2.3.3/package.js +0 -723
  168. package/blocks/native/sm.animated-scene/versions/2.3.4/package.js +0 -676
  169. package/blocks/native/sm.animated-scene/versions/2.3.5/package.js +0 -693
  170. package/blocks/native/sm.animated-scene/versions/2.3.6/package.js +0 -700
  171. package/blocks/native/sm.animated-scene/versions/2.3.7/package.js +0 -747
  172. package/blocks/native/sm.animated-scene/versions/2.3.8/package.js +0 -769
  173. package/blocks/native/sm.animated-scene/versions/2.3.9/package.js +0 -769
  174. package/blocks/native/sm.animated-scene-assistant/versions/1.0.0/package.js +0 -183
  175. package/blocks/native/sm.blueprint/versions/2.0.0/package.js +0 -358
  176. package/blocks/native/sm.blueprint/versions/2.1.0/package.js +0 -358
  177. package/blocks/native/sm.blueprint/versions/2.1.1/package.js +0 -358
  178. package/blocks/native/sm.blueprint/versions/2.1.2/package.js +0 -358
  179. package/blocks/native/sm.blueprint/versions/2.1.3/package.js +0 -381
  180. package/blocks/native/sm.blueprint/versions/2.1.4/package.js +0 -381
  181. package/blocks/native/sm.blueprint/versions/2.1.5/package.js +0 -339
  182. package/blocks/native/sm.blueprint/versions/2.1.6/package.js +0 -356
  183. package/blocks/native/sm.blueprint/versions/2.1.7/package.js +0 -363
  184. package/blocks/native/sm.blueprint/versions/2.1.8/package.js +0 -410
  185. package/blocks/native/sm.blueprint/versions/2.1.9/package.js +0 -422
  186. package/blocks/native/sm.blueprint-assistant/versions/1.0.0/package.js +0 -172
  187. package/blocks/native/sm.chat/versions/2.0.0/package.js +0 -144
  188. package/blocks/native/sm.chat/versions/2.0.1/package.js +0 -97
  189. package/blocks/native/sm.chat/versions/2.0.2/package.js +0 -100
  190. package/blocks/native/sm.chat/versions/2.0.3/package.js +0 -100
  191. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +0 -168
  192. package/blocks/native/sm.describe-media/versions/2.0.0/package.js +0 -153
  193. package/blocks/native/sm.describe-media/versions/2.0.1/package.js +0 -156
  194. package/blocks/native/sm.describe-media/versions/2.1.0/package.js +0 -140
  195. package/blocks/native/sm.image-editor/versions/2.0.0/package.js +0 -183
  196. package/blocks/native/sm.image-editor/versions/2.0.1/package.js +0 -190
  197. package/blocks/native/sm.new-items/versions/1.0.0/package.js +0 -191
  198. package/blocks/native/sm.pick-photos/versions/1.0.0/package.js +0 -334
  199. package/blocks/native/sm.quality-audit/versions/1.0.0/package.js +0 -192
  200. package/blocks/native/sm.quality-audit/versions/1.0.1/package.js +0 -192
  201. package/blocks/native/sm.quality-audit/versions/1.0.2/package.js +0 -195
  202. package/blocks/native/sm.research/versions/2.0.0/package.js +0 -175
  203. package/blocks/native/sm.research/versions/2.0.1/package.js +0 -184
  204. package/blocks/native/sm.research/versions/2.0.2/package.js +0 -187
  205. package/blocks/native/sm.script/versions/2.0.0/package.js +0 -144
  206. package/blocks/native/sm.script/versions/2.1.0/package.js +0 -144
  207. package/blocks/native/sm.script/versions/2.1.1/package.js +0 -144
  208. package/blocks/native/sm.script/versions/2.1.2/package.js +0 -105
  209. package/blocks/native/sm.script/versions/2.1.3/package.js +0 -152
  210. package/blocks/native/sm.script/versions/2.1.4/package.js +0 -156
  211. package/blocks/native/sm.script/versions/2.1.5/package.js +0 -156
  212. package/blocks/native/sm.shot-plan/versions/2.0.0/package.js +0 -301
  213. package/blocks/native/sm.shot-plan/versions/2.1.0/package.js +0 -528
  214. package/blocks/native/sm.shot-plan/versions/2.1.1/package.js +0 -528
  215. package/blocks/native/sm.shot-plan/versions/2.1.2/package.js +0 -528
  216. package/blocks/native/sm.shot-plan/versions/2.1.3/package.js +0 -536
  217. package/blocks/native/sm.shot-plan/versions/2.2.0/package.js +0 -800
  218. package/blocks/native/sm.shot-plan/versions/2.2.1/package.js +0 -920
  219. package/blocks/native/sm.shot-plan-assistant/versions/1.0.0/package.js +0 -173
  220. package/blocks/native/sm.stock-search/versions/2.0.0/package.js +0 -174
  221. package/blocks/native/sm.thumbnail/versions/2.0.0/package.js +0 -137
  222. package/blocks/native/sm.thumbnail/versions/2.0.1/package.js +0 -140
  223. package/blocks/native/sm.transcribe/versions/2.0.0/package.js +0 -163
  224. package/blocks/native/sm.transcribe/versions/2.0.1/package.js +0 -168
  225. package/blocks/native/sm.whiteboard-assistant/versions/1.0.0/package.js +0 -175
  226. package/blocks/native/sm.youtube/versions/2.0.0/package.js +0 -217
  227. package/blocks/occasion-story/package.js +0 -1
  228. package/blocks/occasion-story/versions/1.0.0/package.js +0 -1658
  229. package/blocks/occasion-story/versions/1.0.1/package.js +0 -1699
  230. package/blocks/occasion-story/versions/1.0.2/package.js +0 -1682
  231. package/blocks/photo-reel-composer/versions/1.0.0/package.js +0 -3043
  232. package/blocks/photo-reel-composer/versions/1.0.1/package.js +0 -3026
  233. package/blocks/photo-reel-composer/versions/1.0.2/package.js +0 -4149
  234. package/blocks/product-ad-variants/versions/1.0.0/package.js +0 -2911
  235. package/blocks/product-launch-director/versions/1.0.0/package.js +0 -103
  236. package/blocks/release-visuals/package.js +0 -1
  237. package/blocks/release-visuals/versions/1.0.0/package.js +0 -1492
  238. package/blocks/release-visuals/versions/1.0.1/package.js +0 -1517
  239. package/blocks/release-visuals/versions/1.0.2/package.js +0 -1500
  240. package/blocks/screen-recorder/package.js +0 -1
  241. package/blocks/screen-recorder/versions/1.0.0/package.js +0 -223
  242. package/blocks/screen-recorder/versions/1.0.1/package.js +0 -223
  243. package/blocks/short-form-finish/package.js +0 -1
  244. package/blocks/short-form-finish/versions/1.0.0/package.js +0 -1043
  245. package/blocks/short-form-finish/versions/1.0.1/package.js +0 -1043
  246. package/blocks/short-form-finish/versions/1.0.2/package.js +0 -1043
  247. package/blocks/short-form-finish/versions/1.0.3/package.js +0 -1026
  248. package/examples/saas-product-launch-reviewed-source.stillmade.json +0 -383
  249. package/examples/saas-product-launch.stillmade.json +0 -304
  250. package/packages/block-platform/dealer-inventory-video-project-type.js +0 -38
  251. package/packages/block-platform/first-revenue-project-types.js +0 -46
  252. package/packages/block-platform/fixture-starters.js +0 -13
  253. package/packages/block-platform/launch-project-source.js +0 -10
  254. package/packages/block-platform/launch-project.js +0 -30
  255. package/packages/block-platform/motion-project-types.js +0 -55
  256. package/packages/block-platform/motion-starters.js +0 -14
  257. package/packages/block-platform/product-ad-variants-project-type.js +0 -30
  258. package/packages/block-platform/product-launch-updated.js +0 -90
  259. package/packages/block-platform/revenue-review-project-types.js +0 -36
  260. package/packages/block-platform/revenue-review-starters.js +0 -13
  261. package/packages/block-platform/script-writer.js +0 -29
  262. package/packages/block-platform/website-source-block.js +0 -14
@@ -0,0 +1,115 @@
1
+ # Review hosted Project Types
2
+
3
+ A Project Type can include reviewed `text.generate`, `audio.speech`, and
4
+ `image.generate` Blocks alongside local recipe/JavaScript Blocks and StillMade
5
+ workspaces. Import checks two separate things: whether every embedded package is
6
+ safe and reviewed, and which parts of the connected workflow have actually run.
7
+ Passing independent Block fixtures does not prove their connected production flow.
8
+
9
+ ### Prepare portable source
10
+
11
+ The source contains ordinary pinned packages and connections. It never contains
12
+ account receipts, chosen payment methods, API keys or provider approval. For
13
+ example, run this from the extracted SDK directory to create a script-to-speech
14
+ Project Type using the included complete Block examples:
15
+
16
+ ```js
17
+ import {writeFile} from 'node:fs/promises';
18
+ import {textGenerate} from './packages/block-sdk/capability-example.js';
19
+ import {audioSpeech} from './packages/block-sdk/speech-example.js';
20
+
21
+ const type = {
22
+ schemaVersion: 1,
23
+ id: 'creator.script-and-speech',
24
+ version: '1.0.0',
25
+ name: 'Script and speech',
26
+ description: 'Draft a short narration script and turn it into reviewed speech.',
27
+ license: 'MIT',
28
+ stages: [
29
+ {id: 'draft', blockId: textGenerate.manifest.id, version: '1.0.0', label: 'Draft narration'},
30
+ {id: 'voice', blockId: audioSpeech.manifest.id, version: '1.0.0', label: 'Narrate script'}
31
+ ],
32
+ packages: [textGenerate, audioSpeech],
33
+ connections: [
34
+ {from: {stage: 'draft', port: 'script'}, to: {stage: 'voice', port: 'script'}}
35
+ ]
36
+ };
37
+ await writeFile('script-and-speech.stillmade.json', JSON.stringify(type, null, 2), {flag: 'wx'});
38
+ ```
39
+
40
+ This writes source only. It has not generated narration or speech. The offline
41
+ validator checks its structure, versions and typed connections. Local fixture
42
+ checks still execute in isolation; hosted fixture expectations require an account
43
+ review in StillMade. Source packaging does not install a package or authorize a
44
+ provider call.
45
+
46
+ ### Review in StillMade
47
+
48
+ Open **Import package** and select the JSON or ZIP. Review each hosted Block with
49
+ the model, payment method, voice or image quality selected in the host controls.
50
+ An exact saved import review can be shown and accepted without new generation.
51
+ Running a new review still requires its displayed quote and explicit confirmation
52
+ for the fixtures and separate sample. Review actual text, audio or images before
53
+ accepting the evidence. Source, account or selection changes invalidate reuse.
54
+
55
+ Every embedded hosted package needs a matching review, including packages used
56
+ only by disabled Steps or currently unused packages. Repeated placements of an
57
+ unchanged package share one package review. They do not share a production run:
58
+ each placement's actual connected input still requires its own execution approval.
59
+
60
+ After package reviews, StillMade runs the local checks and the portions of the
61
+ sample flow that can execute locally. An enabled hosted Step is marked unexecuted;
62
+ its dependent Steps wait for its real output. They never receive the hosted
63
+ Block's independent fixture sample as a substitute. Missing independent context,
64
+ invalid connections and failing local code still prevent import. A genuinely
65
+ disabled Step or a valid conditional bypass keeps its ordinary workflow behavior.
66
+
67
+ The report distinguishes `passed` (package admission) from `workflowComplete`
68
+ (all enabled connected Steps completed). **Confirm Import** installs the reviewed
69
+ source, and the report continues to show any required workflow rehearsal. A new
70
+ release or another account's installation rechecks the receipts and current
71
+ source. ComfyUI-containing Project Types use their separate connection-bound
72
+ review map, described below.
73
+ Unattended hosted automation and a single complete hosted-workflow execution proof
74
+ remain separate work; an import report must not claim either one.
75
+
76
+ ### Host review envelope
77
+
78
+ The authenticated host passes `typeCapabilityReviews` alongside `content` to
79
+ `POST /api/blocks/imports/review` and `/api/blocks/imports`, and alongside the
80
+ normal release/install fields to `/api/blocks/releases` and `/api/blocks/install`.
81
+ It is a plain object with exactly the distinct embedded hosted package digests:
82
+
83
+ ```js
84
+ const typeCapabilityReviews = {
85
+ [exactPackageDigest]: {
86
+ receiptId: verifiedReview.receiptId,
87
+ selection: verifiedReview.selection
88
+ }
89
+ };
90
+ ```
91
+
92
+ Use the SDK `digest(package)` on the entire exact package. The map has at most
93
+ 100 entries and is at most 64 KiB as JSON. Each entry contains only `receiptId`
94
+ and the existing exact host `selection`. Unknown/missing digests, another
95
+ account's receipts, changed source, expired receipts or invalid retained media
96
+ are rejected. The server rechecks before writing the import, release or install;
97
+ these checks never generate output or charge again. They do not extend a review's
98
+ one-hour standalone import expiry. Project-only expired evidence cannot be used.
99
+
100
+ The server returns the sanitized map in the account review report, outside the
101
+ portable source. A host may use `verifyHostedProjectTypePackages` from
102
+ `packages/block-platform/hosted-type-reviews.js` with its trusted authenticated
103
+ receipt verifier to obtain the opaque `verifiedHostedPackages` option for
104
+ `testProjectType` and `previewProjectType`. Guest JSON cannot construct this
105
+ in-memory proof. The helper itself does not authenticate receipts; ordinary Block
106
+ authors should use StillMade's review UI.
107
+
108
+ ### Retained samples and setup
109
+
110
+ Saved imports, releases and hosted installations retain their reviewed sample
111
+ media through account-bound server reports. Installed review metadata stores
112
+ no extra source copy and grants no release access. Removing team access still stops new private source downloads.
113
+ Retaining a historical sample does not extend its import-approval expiry. Legacy
114
+ installations without a saved report are not retroactively assigned a receipt.
115
+ The current storage and encrypted BYOK vault are reused.
@@ -0,0 +1,75 @@
1
+ # Project defaults and onboarding
2
+
3
+ ### Typed shared inputs
4
+
5
+ The optional `projectInputs` array declares up to 32 shared input contracts using
6
+ `key`, `type`, `semantic`, `required` and `description`, plus the usual optional
7
+ schema, accepted meanings, source policy, default, sensitivity, freshness,
8
+ cardinality, batching and numeric limits. Keys are unique lowercase identifiers
9
+ up to 64 characters. For example:
10
+
11
+ ```json
12
+ {"projectInputs":[{"key":"brand_tone","type":"text","semantic":"brand_tone","required":true,"description":"How the brand should sound","sources":["default","user"],"default":"Clear and friendly"}]}
13
+ ```
14
+
15
+ Defaults must validate against their contracts and permit the `default` source.
16
+ Credential-sensitive defaults are rejected. New projects initialize these values
17
+ in typed context with Project Type provenance; matching Block inputs must allow
18
+ `project` sources. Existing values are never overwritten by initialization.
19
+ Other equally ranked ready project values take precedence over these fallback
20
+ records unless a source preference explicitly selects the default. The composer
21
+ and connected preview use the defaults too; explicit sample values,
22
+ settings and connections remain authoritative. Freshness limits produce expiring
23
+ context values. These contracts grant no permissions or execution authority.
24
+
25
+ Native controls can inspect or replace the declarations. The visual setup editor
26
+ can add shared information from project-capable Block requirements, preserving
27
+ their types, meanings and schemas, then edit descriptions, required flags and
28
+ defaults. Advanced contract editing handles custom declarations and complex
29
+ values. Edits stay local until Apply shared inputs; validation is shared with
30
+ native edits. Missing values do not create an upfront questionnaire. The next
31
+ local recipe/JavaScript Block can request a uniquely matching shared input through
32
+ the existing reviewed-answer flow. The declaration controls user/Chat sources;
33
+ both its contract and the consuming Block's contract must accept the answer.
34
+ Saved answers carry workflow provenance and source revisions, and permitted
35
+ Blocks can reuse them. Ambiguous declarations are not chosen automatically.
36
+ The existing saved-answer editor can update reviewed shared answers and newly
37
+ initialized defaults against an unchanged declaration and a current permitted
38
+ consumer. Edits require the current revision, remove default fallback priority,
39
+ and mark dependent results stale. Credential-sensitive and dependency-derived
40
+ records are not exposed in this editor. Older unsigned defaults are preserved
41
+ without being silently enrolled in editing. Richer value pickers and hosted-Block
42
+ collection remain unfinished.
43
+ Existing releases are not rewritten.
44
+
45
+ Connected previews accept shared sample answers at `context.sharedInputs`, keyed
46
+ by the declared shared-input key. The preview form uses the existing typed-answer
47
+ dialogs; complex values can use the sample context JSON. Samples must satisfy
48
+ their declarations and permit user answers; credential-sensitive samples are
49
+ rejected. They replace matching template defaults only in the preview registry,
50
+ and matching consumers must still allow project sources. Explicit Step inputs
51
+ and connected results retain precedence. Sample answers are never saved into the
52
+ Project Type or a real project. Existing sample digests and server rehearsal
53
+ replay include the whole context, so shared samples follow the same verification
54
+ path. This does not simulate trusted connections or allow missing hosted results.
55
+
56
+ A Project Type can declare project defaults and up to eight setup questions. These are optional additions to the schema-1 Project Type contract; they do not replace protected Chat, configure provider credentials or start production work.
57
+
58
+ ```json
59
+ {
60
+ "defaults": {"aspectRatio": "9:16", "brief": "Create a short product launch video."},
61
+ "onboarding": [
62
+ {"id": "product", "label": "What is the product?", "type": "text", "required": true},
63
+ {"id": "audience", "label": "Who is it for?", "type": "textarea"},
64
+ {"id": "tone", "label": "Tone", "type": "select", "options": ["Clear and direct", "Playful"], "default": "Clear and direct"}
65
+ ]
66
+ }
67
+ ```
68
+
69
+ Merge these fields into an existing valid Project Type with `schemaVersion`, `id`, `version`, `name`, `description` and its enabled `stages`. This fragment is not a standalone package.
70
+
71
+ `defaults.aspectRatio` accepts `16:9`, `9:16` or `1:1`; `defaults.brief` is at most 4,000 characters. Question IDs are unique lowercase identifiers up to 40 characters. Labels are at most 120 characters. Text and textarea answers are at most 1,000 characters. A select question declares 2–12 unique options of at most 120 characters; its default must match an option. `required` is optional and boolean.
72
+
73
+ The Project Type Builder exposes these fields under **Project defaults & starting questions**. Using the Project Type opens one project setup dialog. The host records the chosen project name and format, and retains the brief plus labeled answers in the existing project's production context (`bible.extraInfo`). Script Writer receives this brief. Answers are project data, not edits to a marketplace release or its version identity; they are not published or sent to acquisition analytics. Read Blueprint/project context only through the permissions already documented by the SDK.
74
+
75
+ The empty Project Type starter is an editable draft. Add an enabled Block before validation, runtime execution, or publication; empty drafts are never installable releases.
@@ -0,0 +1,309 @@
1
+ # Run connected steps
2
+
3
+ ### Inspect a specific run
4
+
5
+ In a project's Flow view, select a live run to see its captured input connections,
6
+ or select a historical attempt to inspect its saved evidence. Current connections
7
+ remain a separate planned view. Missing captured input records are shown as
8
+ unavailable; the host does not reconstruct them from today's source choices.
9
+
10
+ **Ask chat about this run** captures the selected receipt, including batch item,
11
+ attempt and loop pass when recorded. The native controller resolves that receipt
12
+ again through authorized saved-project inspection. Unsaved or evicted receipts
13
+ are unavailable to that saved-project read; another attempt is never substituted.
14
+ Legacy run-only targets are accepted only when exactly one receipt matches.
15
+
16
+ Host integrations use `projectFlowRunReceiptIdentity(record)` from
17
+ `packages/block-platform/flow-inspection.js` for the bounded
18
+ `receipt:<placementId>:<identity>` conversation scope. This is a locator, not an
19
+ access grant. Resolve it within the authorized project's placement history and
20
+ require exactly one match. Inspect/read operations neither run a Block nor change
21
+ its source. Existing retained-history limits still apply.
22
+
23
+ ### Failure and recovery evidence
24
+
25
+ Flow distinguishes `EXECUTION_FAILED` from `RESULT_DELIVERY_FAILED` (a result
26
+ returned, but delivery to the project was interrupted) and `RESULT_SAVE_FAILED` (a result
27
+ returned, but project saving was not confirmed). The latter states show **Needs
28
+ recovery** rather than implying that generation produced nothing. Recovery must
29
+ use the supported request/result controls before a new paid run is considered.
30
+
31
+ The original failed-attempt record remains in history. If a matching provider
32
+ result or exact run/input/item receipt is later retained, its history entry gains
33
+ `recovered: true` and the current failure warning clears. This does not mean a
34
+ retained result was selected. Diagnostics contain bounded codes and duration;
35
+ raw provider messages, prompts and media addresses are excluded.
36
+
37
+ ### Run connected Steps
38
+
39
+ Inside a Project Type, **Run connected steps** runs the selected recipe or isolated
40
+ JavaScript Step and the following supported connected Steps in workflow order.
41
+ The host captures the exact Project Type, package versions, current settings,
42
+ conditions and connections. Every input comes from current project data, supplied
43
+ values, declared context, or an actual upstream output. Production runs never
44
+ prefill missing values from package test fixtures.
45
+
46
+ A connected run stops before a manual workspace, a Block requiring separate
47
+ runtime approval, or an unconnected Step. The UI shows the ordered sequence and
48
+ stopping point; it does not ask users to wire a graph. ComfyUI, hosted workspaces
49
+ and generation are not silently dispatched as part of this local sequence. They
50
+ retain their own execution and confirmation paths.
51
+
52
+ The shared host helper is `packages/block-platform/segment-runner.js`:
53
+
54
+ ```js
55
+ const plan = await planSegment(projectType, canvas, startingStepId);
56
+ const result = await runSegment(plan, {
57
+ source: selectedSource, // stable source/version identity, when applicable
58
+ inputs: { [startingStepId]: currentInputs },
59
+ externalInputs: currentInputsFromOutsideTheSegment,
60
+ resolveContext: (step, source) => scopedContextFor(step, source),
61
+ execute: (pkg, input, { signal, check }) => runInTrustedHost(pkg, input, { signal, check }),
62
+ check: () => verifyCurrentSourceSettingsPermissions(),
63
+ onStep: record => retainCompletedResult(record),
64
+ signal,
65
+ });
66
+ ```
67
+
68
+ Custom durable hosts can opt into stateful sandboxed segments with
69
+ `planSegment(type, canvas, startingStepId, {background: true})`. Then call
70
+ `runSegment(plan, {background: true, states, ...options})`, where `states` supplies
71
+ `{version, value}` for **every** stateful Step ID. Background plans pin code,
72
+ settings and connections independently of current memory. The runner never
73
+ mutates the supplied memory. Keep the starting memory snapshot with the job;
74
+ resuming `previousResults` verifies it and refuses changed inputs or memory.
75
+ Persist returned states only in the same transaction as the completed workflow
76
+ results. A failed later Step can retain earlier provisional results, but those
77
+ results must not advance shared memory prematurely. This mode does not authorize
78
+ hosted APIs or ComfyUI. StillMade's scheduled multi-Block service uses this mode with shared Canvas
79
+ editing enabled. It pins the job's starting states, retains provisional
80
+ checkpoints after failures, and commits all memory changes with the completed
81
+ workflow. Selecting a retained result does not apply its memory a second time.
82
+
83
+ This helper is a host orchestration API, not a capability exposed to guest code.
84
+ The host owns permissions, quarantine checks, media decoding/storage and durable
85
+ adoption. `externalInputs` is keyed by target Step ID then port name, and may only
86
+ fill declared connections from outside the segment. Internal connections always
87
+ use outputs produced earlier in the current run. Context access follows each
88
+ Block's own declarations. A false condition uses the existing typed bypass rule.
89
+ Missing inputs, incompatible roles or stale package/settings pins stop execution.
90
+ Pinned safe connection conversions run in the host before each receiving Block.
91
+ They recheck actual media kinds and authorized current context; a failed
92
+ conversion retains completed upstream results and stops before the receiving
93
+ Step. They do not add a provider call or silently select replacement media.
94
+
95
+ For an explicit batch selection, a trusted host can set `overridePrimary: true`
96
+ with its already-authorized media `source`. This replaces only the first Step's
97
+ primary input; it must match that input's type and role. Do not put this
98
+ receiver-typed source into `externalInputs` as though it were a raw upstream shot
99
+ or scene. Ordinary connected runs leave the option `false`. The host records
100
+ `primaryInputOverride` when a connection was bypassed, and must preserve that
101
+ choice when validating retained results. This option grants no asset access:
102
+ the host still validates ownership, selection, permissions and source freshness.
103
+
104
+ The immutable plan has `workflowDigest`, `planDigest`, `startStepId`, ordered
105
+ `steps`, `nextStageId`, and `stopReason`. `result.steps` contains one record per
106
+ completed placement: `stepId`, `packageDigest`, `inputDigest`, `outputs`, `skipped`,
107
+ `at`, and optional host `mediaReceipts`. Identical Blocks at two positions retain
108
+ separate records. On failure, `error.partialResult` retains completed records;
109
+ later Steps are not reported as completed. A host can supply `previousResults`
110
+ only as an ordered prefix whose source, input and package digests still match.
111
+ Cancellation or failure cannot turn a stale partial result into a new success.
112
+
113
+ ## Project handoffs and Flow inspection
114
+
115
+ Saved shared tasks use `PROJECT_FLOW_OPERATIONS.inspectTasks` (`inspect_project_tasks`, `projects:read`) and `controlTask` (`control_project_task`, separately granted `projects:control` plus `projects:read`). These do not require navigation or a live tab. Inspection returns bounded current task pages or one exact `taskId`. Control accepts pause/takeover/cancel/resume with exact requesterId, taskRevision, instructionRevision, controlEpoch and a unique requestId; current project and connection authority are checked in the transaction. Identical replay returns its original receipt plus current task state without reapplying. Resume queues the existing revalidation process and never approves dispatch, spending or edits; takeover preserves requester/payer. Accepted provider work may still finish after pause/cancel. Native task controls share the coordinator through their existing UI, so their registry `nativeAction` is null. Native and external controls both require the complete observed fence; older native payloads fail with `PROJECT_AI_REFRESH_REQUIRED` instead of changing newer task intent. See [saved task control details](/docs/native-mcp.md#saved-project-task-controls).
116
+
117
+ `recover_project_capability_request` retrieves one actor-owned project request under `projects:read` + `runs:read` and the existing current edit-access requirement. It verifies retained source/media and an unchanged request ledger before returning bounded, redacted stored outputs with `applied:false` and `selectionChanged:false`. It does not poll a provider, execute, settle, save or select a result. Truncated output envelopes are excerpts. Applying a retained result remains a separate reviewed native recovery action.
118
+
119
+ The in-app Project Type Builder accepts pinned built-in stages and embedded recipe
120
+ packages in an optional `packages` array. Each stage uses `{id,blockId,version,label}`;
121
+ connections use `{from:{stage,port},to:{stage,port}}`. Duplicate dependencies,
122
+ missing versions, incompatible ports, duplicate input producers, cycles, and root
123
+ chat overrides are rejected. Embedded recipe fixture tests must pass before launch
124
+ or release.
125
+
126
+ Executable custom types combine embedded SDK processing Blocks with the existing
127
+ production workspaces: Voiceover, Script Writer, Shots, Blueprint, Canvas,
128
+ Image Panels, White Board Motion, animated assets, Editor and Export. The
129
+ workspace adapter selects the existing production screen for each placement.
130
+ Legacy component adapters remain available to saved types; they do not become
131
+ separate workspace listings. Custom JavaScript, recipes and reviewed ComfyUI
132
+ packages open in their own Step workspace. Run them explicitly; navigation never
133
+ triggers paid generation or automatic reruns.
134
+
135
+ Connections use declared SDK ports or an implemented host port adapter. Canvas
136
+ and Editor workspaces share persistent project documents; listing a port does
137
+ not invent an executable conversion. The builder validates supported handoffs
138
+ and explains when a host port or conversion is not implemented. Script Writer's
139
+ script-to-Voiceover handoff uses the existing narration document. Starting Chat
140
+ remains protected before the configurable flow.
141
+
142
+ ### Project Flow inspection contract
143
+
144
+ The SDK exports `ProjectFlowTarget`, `projectFlowTarget()` and
145
+ `projectFlowSnapshot()` from `@stillmade/block-sdk`. Targets use stable project,
146
+ placement, input/output, run, attempt and repeated-item IDs; display names and
147
+ screen positions are not target identity. A target may name the `planned`,
148
+ `active_run` or `historical_run` perspective. The snapshot validator checks its
149
+ contract version, definition identity, unique placement IDs, receiving edges,
150
+ completeness flag and documented size bounds. External `inspect_project_flow`
151
+ reads also return a host-computed `snapshotCursor`; use that exact cursor when
152
+ reviewing or applying a saved-project source or result-pin change.
153
+ `redactProjectFlowMediaAddresses()` recursively removes media address fields
154
+ from preview projections before they cross into chat or another client surface.
155
+ When present, a placement's optional `condition` summary contains its input key
156
+ and safe label, bounded field path, supported operator, and the last applied
157
+ outcome (`unknown`, `ran`, or `skipped`). It deliberately omits the comparison
158
+ value. A current skipped conditional output and its receiving input use the
159
+ `skipped` state with no materialized value; this is distinct from a missing
160
+ result. Historical skipped attempts retain a `skipped` history status.
161
+ Saved activity and history may include a bounded `execution` summary: execution
162
+ kind, whether output was captured or omitted by a conditional skip, and a capped
163
+ media-receipt count. It contains no provider run IDs or playable URLs and does
164
+ not establish provider activity for an attempt without a saved Block receipt.
165
+
166
+ `PROJECT_FLOW_OPERATIONS` maps the shared operation IDs to the native action
167
+ and external tool names. `updateAffected` maps to the existing native
168
+ `update_affected_steps` action; it runs eligible live-workspace Steps, with a
169
+ whole-update budget and separate exact generation review for hosted execution, and has
170
+ no saved-project external tool. `useCompletedResults` maps to the native
171
+ `use_completed_results` action; it adopts retained connected-workflow outputs
172
+ in the live workspace after the host revalidates their receipts, without
173
+ dispatching generation, and has no saved-project external tool. These SDK helpers validate a data shape and map
174
+ operation names; they do not grant access to a project, authorize a mutation,
175
+ or dispatch a Block. Hosts resolve every ID and filter
176
+ labels, previews, candidates and history against current permissions. The
177
+ current saved-project operations are `inspect_project_flow`,
178
+ `list_project_flow_placements`, `list_project_flow_ports`,
179
+ `list_project_flow_history`, `list_project_flow_run_inputs`,
180
+ `read_project_flow_text`, `recover_project_media`,
181
+ `diagnose_project_flow`, `preview_project_flow_source`,
182
+ `change_project_flow_source`, `preview_project_flow_pin`,
183
+ `pin_project_flow_result` and `clear_project_flow_pin`; write operations require
184
+ the current `projects:write` grant and exact preview revisions. They never run
185
+ a Block. Reruns, retries and costly review remain separate authorized actions.
186
+
187
+ Native `list_placements`, `list_ports` and `list_history` use the same bounded
188
+ projection as those three saved-project page tools. Each requires the exact
189
+ `revision` from its own preceding inspection: native surface revisions and
190
+ saved-project revisions are different and cannot be interchanged. A placement
191
+ page accepts at most 8 rows; ports and retained history accept at most 16.
192
+ Later pages of `inspect_project_flow` also require `expectedRevision`.
193
+ Membership and project ownership are checked again after saved reads.
194
+
195
+ For example, after `inspect_project_flow({projectId})` returns `revision`, read
196
+ `list_project_flow_history({projectId, placementId, revision, offset:0, limit:8})`
197
+ and continue with the returned `nextOffset`. Each entry includes a `receiptId`
198
+ and `targetKey` identifying the exact attempt/item, plus recorded input evidence.
199
+ Use `targetKey` for chat receipt targeting; several entries may share `runId`.
200
+ `historyComplete:false` distinguishes incomplete retained history from the end
201
+ of a page. `retainedHistoryComplete:false` still applies at the last page; this
202
+ operation cannot recover evicted records or missing historical input evidence.
203
+ `inputsTruncated:true` means only a bounded subset of captured input identities
204
+ was included. The receipt exposes `inputsCount`, `inputsRevision`,
205
+ `inputsNextOffset` and `inputsRetainedComplete`. Use native `list_run_inputs` or
206
+ external `list_project_flow_run_inputs` with `{placementId, receiptId,
207
+ revision: inputsRevision, offset, limit}` (plus `projectId` externally) to read
208
+ at most 16 named captured-input identities per page. This captured-input
209
+ revision is different from the surface/Flow revision. Every page rechecks the
210
+ exact retained receipt and current read permission; changes beyond the initial
211
+ 64-input projection also invalidate its revision. A source's present selection
212
+ never replaces the recorded identity. Follow `nextOffset` until null; a final
213
+ page with `retainedComplete:false` still indicates missing original evidence.
214
+ The run capture stores at most 128 named inputs. A capture at that limit may
215
+ have omitted identities and is conservatively marked incomplete. Preview
216
+ attempts also have a 64-input cap and a byte limit. An older preview may have
217
+ retained fewer identities than the original run; paging cannot recover those
218
+ lost entries. Nested collection member identities
219
+ remain bounded within each input; this operation pages named inputs, not raw
220
+ values, full text, or the members of captured collections. The historical
221
+ inspector's Previous/Next inputs controls keep its map on that exact input page. None of these reads starts work, applies results, or proves media
222
+ playback. The native summary exposes `historyTotal` and `historyNextOffset` so
223
+ three displayed receipts are never reported as the whole retained history.
224
+
225
+ Retained unselected results have a separate read-only inventory. The Result tab
226
+ shows eight candidates at a time. Use native `list_retained_results` or external
227
+ `list_project_flow_retained_results` with `{placementId, revision:
228
+ unusedResultsRevision, offset, limit}` (plus `projectId` externally); list pages
229
+ contain at most eight candidates. Only records still retained for the current
230
+ Block package are included: unused single results, unselected connected results,
231
+ and batch records explicitly marked unused after a source change. The ordinary
232
+ batch picker is separate. `historyComplete:false` means evicted history is not
233
+ recoverable through this inventory, even at its final page.
234
+
235
+ Each candidate has an exact `candidateId`, `outputDigest`, run/item/attempt
236
+ metadata, and captured-input/output counts and cursors. Native
237
+ `inspect_retained_result` and external `inspect_project_flow_retained_result`
238
+ accept `{placementId, revision: unusedResultsRevision, candidateId, section,
239
+ offset, limit}`. Sections `inputs` and `outputs` page at most 16 identities or
240
+ previews. Sections `text` and `collection` also require `outputKey` and the exact
241
+ preview `path`; text requires its returned `identity` and permits at most 4,000
242
+ characters, collections at most 16 members. Reuse the exact candidate and list
243
+ revision on every page. Changes anywhere in retained records, package or preview
244
+ restrictions invalidate that revision. Inspect fresh state after a conflict.
245
+ Current project read access is rechecked after saved reads; native/UI caches
246
+ reset when the authorized reader changes. External/native results redact media
247
+ addresses. Sensitivity and prior preview restrictions still apply; a restricted
248
+ candidate cannot become inspectable through a later page. Captured inputs remain
249
+ bounded metadata and may be incomplete; nested structured previews disclose
250
+ omitted fields rather than claiming a complete document. These reads never
251
+ select a candidate, restore media, dispatch work, or substitute current output
252
+ for a retained value.
253
+
254
+ Mapped native Canvas outputs use the installed exact-version host port adapter. Flow can show a saved image, video or text value as `ready` with `observation.kind: "native-canvas-output"` and `runReceiptAvailable:false`. The Inspector labels that value **Available**; it does not invent a completed run, receipt or result pin. The exact selected asset/version is preserved in Result and Using. Missing values, mismatched host identities and navigation-only workspace ports remain unavailable. `ProjectFlowNativeObservation` describes this read-only origin; normal output/source paging retains its identity. Native production-workspace connections also use the exact installed host manifest and declared port handles; a newer catalog release cannot redefine an older pin. Original standalone nodes without placement/version metadata retain their historical 1.0.0 contract. Unknown, mismatched and non-host pins cannot impersonate a production workspace.
255
+
256
+ Whole-project Script retains its original narration source. Transcript uses the selected Voiceover take’s recorded transcript and word timings, independently of the editable narration draft. Older takes without stored transcript text derive it from their own timed words. A new Transcript-only run protects the original Voiceover document; changing an unrelated narration draft does not invalidate it. Original legacy receipts that also include Script remain valid with their stricter source checks. An older proposal cannot replace original reads with current documents, and a legacy result lacking derived proof must be rerun before guarded adoption. Other derived fields and arbitrary dynamic reads require separate attribution. Scoped narration and supported shot/scene collections capture their original Blueprint, Shot Plan, Animation, Panels and Board contributors, including empty originals whose later additions could change the result. They do not substitute the whole-project Script. Native asset inventories, generation records, scoped version histories and character/location/style collections can now retain their original contributor and membership proof when canonical reconstruction exactly matches the consumed value. A bounded v2 Canvas projection excludes only the exact host-dispatched producing placements while retaining their IDs/types, so saving their own output does not invalidate native collection membership. Current saved executable asset/generation members can retain their original selected-output, state and native-source evidence when exact canonical reconstruction matches the consumed collection. A producing placement’s own consumed previous output is captured separately when provable. Ambiguous, legacy, archived, private or unsupported collection members, local-only media, whole-project version metadata and noncanonical source documents remain unproven. v1 source reads stay compatible; new v2 captures require explicit server support. Media-dependent narration and arbitrary dynamic reads still require separate attribution.
257
+
258
+ Stateful host runs retain the exact starting-memory identity and resulting-state digest alongside original input/output evidence. Original native reads carry through subsequent memory transitions, connected batches, loops and checkpoint recovery. Declared initial/reset memory is distinct from legacy saved memory even when its bytes match; old receipts cannot gain proof from current documents or by removing a warning. Missing or changed state proof blocks protected workspace adoption. This is host-maintained provenance, not cryptographic attestation against rewriting an entire saved receipt. Older retained plans/checkpoints may require their existing recovery/reset path when the new memory evidence changes the plan identity.
259
+
260
+ Task-authored final Canvas adoption can bind the original native read union to the same transaction as the current task and Canvas execution checks. The host's `taskSourceReadSet` is retained in the exact save/recovery receipt, with explicit `assistantSourceReadSetVersions` capability negotiation. A lost response is recovered by reading the original commit; it does not resubmit an old proposal over newer work. Stale completed results may still be retained for review. Manual selection in saved Canvas projects now uses an acknowledged source save with the original native read union and `sourceCanvasPrecondition`, negotiated with `sourceCanvasPreconditionVersion:1`. Source roots and current execution content are checked under the same ordered transaction locks; layout-only changes are preserved. Exact request recovery distinguishes applied, not-applied and unresolved saves, including no-op selection, without replaying old work over newer selections. Servers without the capability refuse selection. Local drafts and unused-result retention remain separate. Legacy results do not gain missing original-source proof. Remaining native/background producers require separate coverage.
261
+
262
+ The saved-project inspector and compact handoff can open the exact source Block workspace through existing draft-save navigation guards. Account, project, read access, placement and matching package source are checked after drafts finish saving. The existing Editor opening suppresses automatic narration import/export for this navigation request. Previews without workspace navigation say **Inspect source Block**. Compact handoffs show required inputs needing attention even when the primary value is ready; **Using** targets the first such input.
263
+
264
+ Large Flow connection lists page 40 placements and offer **Find a Block** with direct keyboard access. Exact input links remain available after search. The map keeps its own bounded pages and selected neighborhood. Unchanged bounded scalar activity reports reuse the shared projection; new captured evidence, source changes and revoked access invalidate the relevant view.
265
+
266
+
267
+ External controllers can review one complete retained local connected run with `preview_project_flow_completed_results`, then select it using `use_project_flow_completed_results`. Apply requires the exact returned Flow, Canvas and candidate digests, a new request ID and the current task fence. Every selected row must have its original sealed v2 source receipt. The server validates the existing plan and original source roots, rechecks project/connection/task authority, and saves through shared Canvas operations. An acknowledged retry returns its original receipt without selecting the result again, even if the current selection has changed.
268
+
269
+ This external path supports complete recipe/JavaScript connected runs with current inputs, asset-descriptor batches with non-media outputs, and shared complete local loop receipts. All-assets, scene and selected-shots batches require the original complete inventory receipt captured and acknowledged before dispatch; it binds the original scope, ordered targets, exact plan and eight contributing workspace roots. Preview and apply check those original roots again, including workspaces that were empty when the batch started. JavaScript memory transitions require exact initial, reset or retained starting identity and resulting state with original sealed proof. Preview exposes digest-only `stateChanges`; apply saves the original outputs and memory without executing them again. Legacy/unproven or changed memory is unavailable. Hosted execution, decoded/generated media, incomplete runs and failure-recovery results still use their existing workspace review. Broad batches without original inventory proof remain unavailable; current inventory cannot be substituted for missing historical evidence. Inventory membership and each consumed item’s output or memory lineage are separate requirements. A local preview does not establish shared source proof. Preview and apply never dispatch a Block, load media, request model analysis or spend credits. A source/authority conflict keeps the retained result available for review; it does not silently rerun the workflow.
270
+
271
+ Completed local loops can retain their exact whole receipt in shared Canvas history without selecting outputs or advancing memory. A failed shared save preserves the original device checkpoint. Shared `retainedLoopRuns` summaries expose bounded run identities, pass counts and current selection for review; they do not claim revalidation. Retention is limited to four envelopes, 512 KiB per envelope and 1 MiB total per starting placement; exceeding a bound keeps device recovery and reports the limit rather than evicting old history. External selection validates the original whole loop and every consecutive pass against current sources, memory, task and authority, then uses the existing adoption path without dispatch. In the native workspace, another editor can explicitly choose a shared run without its original device checkpoint. Review validates the original complete receipt; Use rechecks its shared identity and the reviewed Canvas execution state before acknowledged selection. A newer selection or changed source requires fresh review.
272
+
273
+ Shared loop pass inspection uses the existing `list_project_flow_retained_results` and `inspect_project_flow_retained_result` operations. Initial discovery exposes bounded historical identities; explicit inspection verifies the original whole envelope before returning captured input identities and paged output/text/collection previews. It validates original evidence without requiring today's inputs to match, and does not select or execute the pass. Changed original history or revoked read access invalidates the response. Native Result review uses the same verified reader through **Inspect saved pass**.
274
+
275
+ Existing-media and host-action selections carry explicit selection metadata. Flow separates them from worker execution receipts and attempt history; a media selection identity is not a run ID. Saved selection still checks current authority and the reviewed Canvas/source state.
276
+
277
+ External connections must explicitly opt into `projects:write` alongside `projects:read` for reviewed Flow input, pin, result/memory changes and saved-media restoration. Defaults and existing connections do not gain permissions. Shared Flow reads recheck current connection authority after asynchronous work; all four Flow mutations recheck it in their write transaction, including replay. Media restoration rechecks through its existing before-write guard. Revocation, expiry, project/scope changes and suspension invalidate stale authority.
278
+
279
+ ### Completed background results
280
+
281
+ In a saved Block workspace, open **Background results** beneath the result area to review already completed jobs. Editors can explicitly select a result whose original input, output and memory proof remains valid for the current project; viewers can inspect it. Selection rechecks the exact job, project, Block version, sources and shared Canvas and does not execute the Block or advance saved memory. Legacy jobs, pending validation journals and results with missing original source proof remain preview-only. Current source documents never replace missing original evidence. Connected fallback/bypass and unsupported derived sources may therefore remain unavailable for selection.
282
+
283
+ Use the **+** between project placements to add a Block. **Edit workflow** in
284
+ that dialog opens the ordered builder for adding, removing, disabling,
285
+ duplicating, replacing, reordering and configuring placements. Changes remain a
286
+ draft until **Save workflow**. A changed source requires a new Block version;
287
+ the same ID/version cannot silently acquire different code.
288
+
289
+ Removed, disabled, replaced or changed placements retain their SDK package
290
+ (or built-in host contract), settings, prior results and connections in
291
+ **Workflow history**. The old placement
292
+ is inactive; it is not run by autosave or future-media automation. Re-enabling
293
+ the same placement and source can recover its results for review, marked stale
294
+ until rerun. Changing a producer or its inputs also marks affected downstream
295
+ results stale. Each history entry offers **Download Block + SDK**. SDK packages
296
+ come from that retained instance; built-in downloads follow the current-client
297
+ source behavior described above.
298
+ Scoped SDK `versions` context includes retained media as inactive previous
299
+ versions; archived results do not become current assets or new generations.
300
+
301
+ The full definition and selected stage travel with project/session saves. A newer
302
+ installed type cannot replace an existing project's pinned definition.
303
+ Use `node packages/block-cli/cli.js create-type my-type.json`, then `test`, `preview`,
304
+ and `pack` on that JSON file. `preview` rehearses connected sandbox Blocks using
305
+ fixture inputs and actual upstream outputs. It marks hosted workspaces as requiring
306
+ a real project and never calls paid providers. `examples/text-workflow.stillmade.json` is a complete example.
307
+ The broader editor command/workspace SDK is not yet exposed to external recipes.
308
+ Do not invent `ctx.editor`, `ctx.sql`, `ctx.shell`, `ctx.fs` or `ctx.capabilities`
309
+ methods; none exists in 0.1. Keep unsupported requirements explicit.
@@ -0,0 +1,72 @@
1
+ # Rehearse connected workflows
2
+
3
+ ```sh
4
+ node packages/block-cli/cli.js preview my-type.json
5
+ node packages/block-cli/cli.js preview my-type.json sample-inputs.json
6
+ ```
7
+
8
+ `sample-inputs.json` is keyed by Step ID, then input name:
9
+
10
+ ```json
11
+ { "first": { "text": " My sample " } }
12
+ ```
13
+
14
+ `previewProjectType(type, options)` from `packages/block-platform/type-preview.js`
15
+ rehearses the pinned workflow without changing it. Options accept `inputs`, scoped
16
+ `context`, an abort `signal`, `onResult`, and a sandbox `run` implementation for
17
+ browser workers. The CLI uses the same isolated Node runtime as Block tests.
18
+ Unconnected inputs start with the Block's first fixture, then Step config and
19
+ custom sample values; connected values always come from actual upstream output.
20
+ Conditions use the production bypass rules. Inputs and outputs are validated at
21
+ each boundary. Offline checks share a 15-second deadline and 4 MB combined
22
+ sample budget. Interactive browser previews permit 64 MB of recorded data;
23
+ waiting for hosted consent and execution does not consume the local deadline.
24
+
25
+ The report contains a digest and per-Step results. `passed` means no executed
26
+ Step failed; **only `complete: true` means all enabled Steps completed**. Hosted
27
+ workspaces, missing context and dependent blocked Steps produce an incomplete
28
+ report. The same connected rehearsal also runs within type fixture validation and server
29
+ import admission; an executed combination that fails is rejected. Incomplete host
30
+ coverage is marked explicitly. This does not replace static admission checks,
31
+ individual fixtures, or actual host/media testing in a project. In the builder choose **Preview connected workflow**
32
+ to inspect per-Step inputs, outputs and failures.
33
+
34
+
35
+ ### Interactive hosted rehearsal
36
+
37
+ In the Project Type Builder, choose **Preview connected workflow**. For included
38
+ hosted Blocks, complete or reuse each account-bound package review first. The
39
+ preview then asks for a model, payment choice, and cost confirmation for each
40
+ actual hosted invocation. A package review never substitutes its sample output
41
+ for an upstream result. Cancel at any point to stop downstream execution.
42
+
43
+ Use **Custom sample inputs** for values keyed by Step ID. Use **Sample project
44
+ context** for a JSON object containing the context fields requested by Blocks:
45
+
46
+ ```json
47
+ {"metadata":{"schemaVersion":1,"hasDialogue":true}}
48
+ ```
49
+
50
+ Each Block receives only its declared context inputs and permissions. Context
51
+ samples are copied; testing cannot write through to a production project.
52
+ Conditions read the resolved inputs and apply the same pass-through rules used
53
+ in production. Changing either sample clears the displayed prior result.
54
+
55
+ Before passing hosted output downstream, StillMade re-fetches the authenticated
56
+ run and checks the package, input, model selection, quote, output and media
57
+ receipts. Generated image references can feed recipe image inputs: the browser
58
+ decodes the verified media without resizing it. The recipe limit remains one
59
+ megapixel. Arbitrary URLs in sample JSON do not authorize image decoding. Local
60
+ JavaScript Blocks retain reference-based image contracts.
61
+
62
+ The browser host opts into `interactive: true`, supplies `verifyHostedResult`,
63
+ and may supply `resolveInput` for authorized media conversion. These are trusted
64
+ host callbacks, never functions supplied by imported packages. Omitting the
65
+ verifier prevents hosted execution. Keep interactive mode off in automated
66
+ admission and CLI checks; enabling it does not provide provider credentials,
67
+ payment authorization, or a server-certified workflow receipt.
68
+
69
+ A successful sample rehearsal proves that those enabled Steps ran with those
70
+ inputs. It does not prove every possible project, workspace interaction, or
71
+ conditional branch. Manual StillMade workspaces still need their working preview
72
+ or a real project. Changing accounts cancels the active hosted preview.