stillmade-sdk 0.1.3 → 0.1.5

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 (104) hide show
  1. package/.claude/settings.json +15 -0
  2. package/.cursor/hooks.json +11 -0
  3. package/.gitignore +2 -0
  4. package/.stillmade/sdk-baseline.json +65 -0
  5. package/AGENTS.md +29 -7
  6. package/AGENT_CONTROL.md +2 -1
  7. package/BROWSER_APPLICATIONS.md +128 -3
  8. package/GITHUB_APPLICATIONS.md +184 -1
  9. package/NATIVE_APPLICATION_ADAPTATION.md +565 -0
  10. package/NATIVE_MCP.md +3 -2
  11. package/PASTE_TO_LLM.md +29 -10
  12. package/PORTABLE.md +5 -4
  13. package/REMIX.md +16 -10
  14. package/SDK.md +511 -46
  15. package/UI_AESTHETIC.md +37 -6
  16. package/api-index.json +90 -0
  17. package/blocks/connected-app/versions/{1.2.0 → 1.5.0}/task-selection.js +5 -3
  18. package/blocks/connected-app/versions/{1.4.0 → 1.5.0}/view.js +4 -2
  19. package/blocks/native/sm.ai-decide/versions/1.0.0/package.js +149 -0
  20. package/blocks/native/sm.ai-write/versions/1.0.0/package.js +147 -0
  21. package/blocks/native/sm.connect-app/versions/1.0.0/package.js +55 -0
  22. package/blocks/native/sm.contact-fields/versions/1.0.0/package.js +197 -0
  23. package/blocks/native/sm.continue-if/versions/1.0.0/package.js +168 -0
  24. package/blocks/native/sm.generate-image/versions/2.1.0/package.js +101 -0
  25. package/blocks/native/sm.meta-creative/versions/1.0.0/package.js +206 -0
  26. package/blocks/native/sm.new-items/versions/1.0.0/package.js +191 -0
  27. package/blocks/native/sm.voiceover/versions/2.1.5/package.js +179 -0
  28. package/blocks/native/sm.voiceover/versions/2.1.6/package.js +179 -0
  29. package/blocks/native/sm.when/versions/1.0.0/package.js +129 -0
  30. package/blocks/native/sm.write-summary/versions/1.0.0/package.js +133 -0
  31. package/blocks/occasion-story/package.js +1 -1
  32. package/blocks/occasion-story/versions/1.0.2/package.js +1682 -0
  33. package/blocks/photo-reel-composer/versions/1.0.1/package.js +3026 -0
  34. package/blocks/release-visuals/package.js +1 -1
  35. package/blocks/release-visuals/versions/1.0.2/package.js +1500 -0
  36. package/blocks/short-form-finish/package.js +1 -1
  37. package/blocks/short-form-finish/versions/1.0.3/package.js +1026 -0
  38. package/examples/original-photo-editor.stillmade-block +0 -0
  39. package/examples/portable-regexp.stillmade-block +0 -0
  40. package/package.json +1 -1
  41. package/packages/block-cli/cli.js +16 -1
  42. package/packages/block-cli/format.js +2 -0
  43. package/packages/block-cli/ready-gate.js +164 -0
  44. package/packages/block-platform/block-readiness.js +3 -2
  45. package/packages/block-platform/canvas.js +1 -1
  46. package/packages/block-platform/catalog.js +6 -4
  47. package/packages/block-platform/chat-requirements.js +8 -3
  48. package/packages/block-platform/collaboration.js +5 -5
  49. package/packages/block-platform/first-revenue-project-types.js +2 -2
  50. package/packages/block-platform/flow-inspection.js +2 -2
  51. package/packages/block-platform/native-application-validation-context.js +20 -0
  52. package/packages/block-platform/plain-descriptions.js +67 -0
  53. package/packages/block-platform/product-ad-variants-project-type.js +6 -3
  54. package/packages/block-platform/project-context.js +4 -4
  55. package/packages/block-platform/project-type-composer.js +21 -12
  56. package/packages/block-platform/project-type-draft.js +2 -2
  57. package/packages/block-platform/project-type-recommendations.js +1 -1
  58. package/packages/block-platform/project-types.js +9 -4
  59. package/packages/block-platform/revenue-review-project-types.js +6 -5
  60. package/packages/block-platform/segment-runner.js +35 -11
  61. package/packages/block-platform/step-groups.js +78 -0
  62. package/packages/block-platform/steps.js +12 -8
  63. package/packages/block-platform/type-workspace.js +4 -4
  64. package/packages/block-platform/workflow-loop.js +4 -0
  65. package/packages/block-platform/workspace-input-readset.js +18 -4
  66. package/packages/block-sdk/admission.js +5 -17
  67. package/packages/block-sdk/agent-inputs.js +2 -0
  68. package/packages/block-sdk/agent-inspection.js +4 -2
  69. package/packages/block-sdk/browser-application-artifacts.js +1 -1
  70. package/packages/block-sdk/browser-application-execution.d.ts +2 -2
  71. package/packages/block-sdk/browser-application-execution.js +30 -12
  72. package/packages/block-sdk/browser-application-guest.d.ts +2 -0
  73. package/packages/block-sdk/browser-application-guest.js +16 -9
  74. package/packages/block-sdk/browser-application.d.ts +12 -4
  75. package/packages/block-sdk/browser-application.js +27 -13
  76. package/packages/block-sdk/builder-contract.js +25 -17
  77. package/packages/block-sdk/capabilities.js +38 -19
  78. package/packages/block-sdk/connected-app.js +26 -6
  79. package/packages/block-sdk/connection-adapters.js +19 -2
  80. package/packages/block-sdk/contracts-core.js +8 -0
  81. package/packages/block-sdk/contracts.js +9 -5
  82. package/packages/block-sdk/document-drafts.js +7 -1
  83. package/packages/block-sdk/document-store-binding.js +2 -1
  84. package/packages/block-sdk/file-bundle.js +4 -1
  85. package/packages/block-sdk/first-party-packages.js +18 -2
  86. package/packages/block-sdk/generation-catalog.js +3 -2
  87. package/packages/block-sdk/index.d.ts +20 -1
  88. package/packages/block-sdk/index.js +1 -0
  89. package/packages/block-sdk/native-application-package.d.ts +22 -0
  90. package/packages/block-sdk/native-application-package.js +77 -0
  91. package/packages/block-sdk/native_adapter.py +76 -0
  92. package/packages/block-sdk/package.json +1 -0
  93. package/packages/block-sdk/pipeline-runtime-host.d.ts +2 -0
  94. package/packages/block-sdk/project-flow-contract.js +2 -0
  95. package/packages/block-sdk/remix-policy.js +3 -1
  96. package/packages/block-sdk/resolver-admission.js +17 -0
  97. package/packages/block-sdk/runtime.js +4 -1
  98. package/packages/block-sdk/schema-fields.js +34 -2
  99. package/packages/block-sdk/semantic-relationships.js +14 -0
  100. package/packages/block-sdk/shared-controls.js +3 -1
  101. package/packages/block-sdk/shared-view.js +6 -1
  102. package/packages/block-sdk/source-rights.js +6 -5
  103. package/packages/block-sdk/testing.js +3 -0
  104. package/packages/design-system/theme.css +12 -3
package/SDK.md CHANGED
@@ -144,7 +144,7 @@ For an original implementation, retain complete license notices and at least two
144
144
  ```sh
145
145
  node packages/block-cli/cli.js pack ./my-block ./my-block.stillmade-block --original
146
146
  ```
147
- Select that file with **Choose package** for the same source and interface. Packaging adds retained source evidence and reruns applicable checks; it does not rewrite the implementation. Output files are never silently overwritten. Use repository evidence instead of `--original` when reusing third-party code.
147
+ Choose the folder that holds that file with **Import folder** for the same source and interface. Packaging adds retained source evidence and reruns applicable checks; it does not rewrite the implementation. Output files are never silently overwritten. Use repository evidence instead of `--original` when reusing third-party code.
148
148
 
149
149
  ### Photo-editor folder example
150
150
  The extracted SDK contains `examples/original-photo-editor/`, including its actual custom interface, pixel processing and fixtures. Select that folder directly or try [its packaged original](/block-sdk/examples/original-photo-editor.stillmade-block). This bounded example adjusts brightness/color and rotates pixels with transparency. See [the supported original-authoring contract](/docs/build/original-blocks).
@@ -152,9 +152,33 @@ The extracted SDK contains `examples/original-photo-editor/`, including its actu
152
152
  ### Use and iterate
153
153
  Add the Block to a Project Type, configure its inputs, and run it. Keep source changes in checkpoints; publish a new release version when the behavior changes. See [versioning and remixing](/docs/distribute/versioning).
154
154
 
155
+ ## Build a Block with your AI
156
+
157
+ ### For you
158
+ Give your coding agent (Claude Code, Cursor, Codex, Gemini CLI or similar) a link to this page and say what the Block should do, for example: “Build a StillMade Block that turns a script into a shot list. Follow https://stillmade.shop/docs/build/with-your-ai.md”. It sets up the SDK, builds the Block and checks it on its own; you only answer questions about what the Block should do. A chat assistant without a terminal cannot download or run anything, so use a coding agent, or connect StillMade's [MCP server](/docs/native-mcp.md). Either way, StillMade refuses to install a Block that fails its readiness check.
159
+
160
+ ### For the coding agent
161
+ Do every step yourself. Do not ask the person to download, unzip, open a folder or run a command; only ask about what the Block should do.
162
+
163
+ 1. **Get the SDK.** It is `/block-sdk/stillmade-sdk-0.1.0.zip` on the same site as this page: replace this page's path with that one (for example `https://stillmade.shop/block-sdk/stillmade-sdk-0.1.0.zip`, or `http://localhost:3000/block-sdk/stillmade-sdk-0.1.0.zip` when this page came from localhost). If `stillmade-blocks/AGENTS.md` already exists in your working folder, reuse that folder. Otherwise download and extract it into `stillmade-blocks`:
164
+ ```sh
165
+ curl -fsSL "<SDK URL>" -o stillmade-sdk.zip && unzip -q stillmade-sdk.zip -d stillmade-blocks && rm stillmade-sdk.zip
166
+ ```
167
+ On Windows PowerShell:
168
+ ```powershell
169
+ Invoke-WebRequest "<SDK URL>" -OutFile stillmade-sdk.zip; Expand-Archive stillmade-sdk.zip stillmade-blocks; Remove-Item stillmade-sdk.zip
170
+ ```
171
+ The SDK needs Node.js 22 or later and nothing else; its runtime is bundled, so never run `npm install` in it.
172
+ 2. **Read `stillmade-blocks/AGENTS.md` in full** before writing code. It is the contract StillMade checks every Block against.
173
+ 3. **Build inside `stillmade-blocks`.** Scaffold with `node packages/block-cli/cli.js create <name> javascript` (or `image`, `stateful`, `capability`), then iterate with `node packages/block-cli/cli.js validate <name>` and `test <name>`.
174
+ 4. **Run the readiness gate before you call anything ready:** `node packages/block-cli/cli.js gate .` from `stillmade-blocks`. Report the exact status it prints. If it fails, fix the listed checks and run it again. If you cannot fix them, tell the person plainly that the Block is not ready and list the failing checks. A browser application reports NEEDS STILLMADE REVIEW: tell the person to import it so StillMade can run its isolated review.
175
+ 5. **Hand it over.** Give the person the full path of the `<name>` folder. In StillMade they choose **Import folder** and select that folder.
176
+
177
+ `stillmade-blocks` contains hooks that run the gate automatically when a Claude Code or Cursor session started in that folder finishes a turn. In the session that downloaded the SDK those hooks are not active yet, so run the gate yourself as in step 4.
178
+
155
179
  ## Block builder contract
156
180
 
157
- Contract `stillmade.block-builder@1.0.0`. Humans, coding agents, imported source, GitHub repositories and generated code all adapt to the Block platform; anything that becomes a StillMade Block obeys this contract.
181
+ Contract `stillmade.block-builder@1.3.0`. Humans, coding agents, imported source, GitHub repositories and generated code all adapt to the Block platform; anything that becomes a StillMade Block obeys this contract.
158
182
 
159
183
  ### Source of truth
160
184
 
@@ -164,13 +188,27 @@ Treat the current SDK (`stillmade.block.json` manifest, `packages/block-sdk` con
164
188
 
165
189
  Before building, check what already exists (`find_existing_blocks` over MCP, or the Marketplace and your library) by the inputs, results and operations the goal needs. Use an installed or reviewed Block that already does it; remix a close one so its license, notices and creator credit stay attached; chain existing Blocks and build only the missing step. Never republish another creator's source without remix lineage: public copies are refused. Build a new Block when nothing fits or the person asks for their own version, and say which similar Blocks you considered.
166
190
 
191
+ ### One job per Step
192
+
193
+ A Step is one job: the work between two moments where a person or the outside world must see the result. Start a new Step only at one of three points; everything else is a part of the neighboring Step.
194
+
195
+ 1. **A person works with the result**: reads, edits, picks or approves it (a workspace Block such as a script, a Canvas or an Editor, or an approval). That is why Chat, Bible, Canvas and Editor are four Steps.
196
+ 2. **Finding new things turns into handling each one**: the trigger (a schedule or an app event), the app read, its filter and "only new" are the first job; what is done with each item is the next job. A trigger is a setting of the first job, never a Step of its own.
197
+ 3. **The result leaves StillMade**: it is sent, posted, published, paid or written into another app. Consecutive writes to the same app, with the glue that shapes data for them, are one job.
198
+
199
+ A part that only runs in the desktop app cannot share a Step with cloud parts. Before adding a Step, name which of the three reasons makes it separate; if none applies, make it a part of a neighbor. A Step nobody would ever open must not exist on its own. Prefer an app task's own filter (a Gmail query such as `has:attachment filename:png`) to an AI check, and use AI decide only for judgement.
200
+
201
+ Inside one job, each capability stays its own part: a capability Block performs exactly one hosted operation and a connector one app task, so every part keeps its own permission, approval and credit rules, and StillMade groups the parts of one job into one Step (`groups` in the Project Type). Never invent a combined runtime. When one Block can do the whole job with documented primitives (a JavaScript Block doing several local transforms, a workspace owning its whole document), build it as one Block.
202
+
203
+ Examples: "every new email with an image becomes a generated image" is two Steps, "Gmail · New emails with images" (When, fetch with an image filter, only new) and "Image from email" (AI write, Generate image); listing When, Fetch, Only new, AI decide, Continue only if, AI write and Generate image as seven Steps splits one job into its parts. "A new Meta lead goes to HubSpot" is three Steps: "Meta Ads · New leads", "Qualify lead" and "HubSpot · Add contact".
204
+
167
205
  ### Define the capability first
168
206
 
169
- Translate the request into an explicit capability contract before implementation: what the Block does; each input with its type, meaning and whether it is required (prefer optional settings with safe defaults over extra required questions); each output with its type and meaning; persistent state; project context it reads; permissions; UI; long-running behavior; expected failures; cancellation; determinism; and whether it needs hosted models, media, desktop tools or shared editing. Keep the public interface as small and general as possible and keep implementation details out of it.
207
+ Translate the request into an explicit capability contract before implementation: what the Block does; each input with its type, meaning and whether it is required (prefer optional settings with safe defaults over extra required questions); each output with its type and meaning; persistent state; project context it reads; permissions; UI; long-running behavior; expected failures; cancellation; determinism; and whether it needs hosted models, media, desktop tools or shared editing. Keep the public interface as small and general as possible (few required inputs, one primary output) and keep implementation details out of it; small means a small interface, never a fragment of a job. A Block that generates images, video or speech declares only its prompt and output: every Step that runs it gets the host’s generation settings (model, quality, length and resolution, voice, speed, how many), saved with the Step, changed on its page or by Chat, and shown with their cost before each run.
170
208
 
171
209
  ### Blocks compose
172
210
 
173
- A Block is not a mini-app. Its outputs become other Blocks' inputs and its inputs come from other Blocks, project context or the user. Use the typed port system: shared StillMade types (`image`, `video`, `audio`, `asset`, `script`, `shot[]`, ...), a `semantic` meaning on every port, `required` and a short `description`. Mark exactly one primary input and one primary output so Project Type Steps connect automatically, and use `kind: "task"`: a `workspace` Block owns a project document and is never connected automatically. Inputs marked `context` read the project and cannot receive a connection from another Step. Output reusable StillMade values: media references (`{kind,assetId,versionId,url}`) and structured production values with `schemaVersion: 1`, preserving provenance, versions and relationships downstream Blocks need. Never make ordinary users wire JSON, copy IDs, understand internal paths or translate one Block's output into another: `createUniversalResolver()` (the same engine as the Project Type composer) resolves inputs from compatible upstream outputs, permitted project context and, for optional non-context inputs, `StillMade.requestFromUser`.
211
+ A Block is one job: not a mini-app of many jobs and not a fragment of one. Its outputs become other Blocks' inputs and its inputs come from other Blocks, project context or the user. Use the typed port system: shared StillMade types (`image`, `video`, `audio`, `asset`, `script`, `shot[]`, ...), a `semantic` meaning on every port, `required` and a short `description`. Mark exactly one primary input and one primary output so Project Type Steps connect automatically, and use `kind: "task"`: a `workspace` Block owns a project document and is never connected automatically. Inputs marked `context` read the project and cannot receive a connection from another Step. Output reusable StillMade values: media references (`{kind,assetId,versionId,url}`) and structured production values with `schemaVersion: 1`, preserving provenance, versions and relationships downstream Blocks need. Never make ordinary users wire JSON, copy IDs, understand internal paths or translate one Block's output into another: `createUniversalResolver()` (the same engine as the Project Type composer) resolves inputs from compatible upstream outputs, permitted project context and, for optional non-context inputs, `StillMade.requestFromUser`.
174
212
 
175
213
  ### Use platform primitives
176
214
 
@@ -180,9 +218,13 @@ Prefer, in order: an SDK capability; a documented host capability (the hosted op
180
218
 
181
219
  Never make a Block look functional through hard-coded local paths, developer-machine dependencies, undocumented environment variables, admin or database access, hidden core modifications, direct database writes, fake or mocked production results, hand-prepared test assets that hide incompatibilities, credentials in code, or assumptions about one user's machine. The finished Block must work through the same interfaces available to any installed Block; `permissions.network`, `permissions.filesystem` and `permissions.secrets` must be empty arrays.
182
220
 
221
+ ### Name it briefly
222
+
223
+ Give the Block a short, plain name of 40 characters or fewer that says what it does ("Captioned Clip", not "Captioned Business Clip Generator With Review"). The name appears in step bars, Project Type cards and pickers, so put the detail in the description instead. New releases with a longer name do not pass readiness.
224
+
183
225
  ### Interface
184
226
 
185
- If the capability needs UI, use the Block UI SDK: generated `manifest.ui` controls first; a sandboxed custom view (`view.html`/`view.css`/`view.js`) only when the core interaction genuinely needs one. Expose the capability, not the implementation: meaningful controls, sensible defaults, preview, direct manipulation, progress, clear errors and visible outputs. Do not show raw JSON, internal IDs, filesystem details, provider terminology or developer settings unless the Block is itself a developer tool. Follow the host appearance (Light, Dark and White) and the mobile layout contract: one interface for every screen size that fits a 320 CSS-pixel phone without horizontal scrolling.
227
+ If the capability needs UI, use the Block UI SDK: generated `manifest.ui` controls first; a sandboxed custom view (`view.html`/`view.css`/`view.js`) only when the core interaction genuinely needs one. Expose the capability, not the implementation: meaningful controls, sensible defaults, preview, direct manipulation, progress, clear errors and visible outputs. Do not show raw JSON, internal IDs, filesystem details, provider terminology or developer settings unless the Block is itself a developer tool. When a person chooses among options they need to hear or see (voices, music, sounds, fonts, looks, colors, templates or images), let them preview each option before choosing: a sample to play or a thumbnail, from the Block's own files or the host's free samples, never a paid generation. Leave previews out only when the builder states there is nothing to preview. Choices StillMade owns, such as voices and models in the run review, already show their samples. Follow the host appearance (Light, Dark and White) and the mobile layout contract: one interface for every screen size that fits a 320 CSS-pixel phone without horizontal scrolling.
186
228
 
187
229
  ### Shared editing
188
230
 
@@ -218,11 +260,11 @@ StillMade runs the readiness check on every Block it admits: manifest and contra
218
260
 
219
261
  ### Project Types
220
262
 
221
- A Project Type is an ordered production workflow. Each Step's primary output must be a compatible input for the next Step, secondary values come from permitted project context, and every member Block obeys this contract. Install Blocks into a realistic Project Type: project chat must understand each Step, inputs must resolve intuitively, outputs and execution state must be visible, failures must be diagnosable, and the user must be able to continue through the workflow.
263
+ A Project Type is an ordered production workflow. Each Step's primary output must be a compatible input for the next Step, secondary values come from permitted project context, and every member Block obeys this contract. Install Blocks into a realistic Project Type: project chat must understand each Step, inputs must resolve intuitively, outputs and execution state must be visible, failures must be diagnosable, and the user must be able to continue through the workflow. Group the parts of one job into one Step instead of listing helper parts as Steps; most automations are two to four Steps.
222
264
 
223
265
  ### Readiness report
224
266
 
225
- Finish with a Block Readiness Report: capability, contract (inputs, outputs, permissions, dependencies), platform APIs used, tests actually performed and their results, the composition test (upstream, Block, downstream), known limitations, unsupported requirements and any platform gap with its smallest general primitive. Choose exactly one status: PRODUCTION READY (every applicable check passed), READY WITH DOCUMENTED LIMITATIONS (works reliably within stated boundaries), BLOCKED BY PLATFORM CAPABILITY (needs a missing generic primitive) or FAILED. Never label a Block production ready to satisfy a request, and never claim a check ran when it did not.
267
+ Finish with a Block Readiness Report: capability, contract (inputs, outputs, permissions, dependencies), platform APIs used, tests actually performed and their results, the composition test (upstream, Block, downstream), known limitations, unsupported requirements and any platform gap with its smallest general primitive. Report exactly one status, the one StillMade's readiness check returned (`ready` in the SDK CLI, `check_block_readiness` over MCP), never one you chose: PRODUCTION READY (every applicable check passed), READY WITH DOCUMENTED LIMITATIONS (works reliably within stated boundaries), BLOCKED BY PLATFORM CAPABILITY (needs a missing generic primitive) or FAILED. Never label a Block production ready to satisfy a request, and never claim a check ran when it did not.
226
268
 
227
269
  ### Definition of done
228
270
 
@@ -271,6 +313,19 @@ An instance of a Block inside a Project Type. Each Step has its own instance ID,
271
313
  ### Project Type
272
314
  An ordered production workflow. Its persisted `stages` array stores Steps for compatibility with existing projects. Users can add, remove, duplicate, configure, disable, or reorder Steps. The protected starting chat belongs to the host and cannot be replaced or remixed.
273
315
 
316
+ ### One job per Step
317
+ A Step is one job: the work between two moments where a person or the outside world must see the result. Start a new Step only at one of three points; everything else is a part of the neighboring Step.
318
+
319
+ 1. **A person works with the result**: reads, edits, picks or approves it (a workspace Block such as a script, a Canvas or an Editor, or an approval). That is why Chat, Bible, Canvas and Editor are four Steps.
320
+ 2. **Finding new things turns into handling each one**: the trigger (a schedule or an app event), the app read, its filter and "only new" are the first job; what is done with each item is the next job. A trigger is a setting of the first job, never a Step of its own.
321
+ 3. **The result leaves StillMade**: it is sent, posted, published, paid or written into another app. Consecutive writes to the same app, with the glue that shapes data for them, are one job.
322
+
323
+ A part that only runs in the desktop app cannot share a Step with cloud parts. Before adding a Step, name which of the three reasons makes it separate; if none applies, make it a part of a neighbor. A Step nobody would ever open must not exist on its own. Prefer an app task's own filter (a Gmail query such as `has:attachment filename:png`) to an AI check, and use AI decide only for judgement.
324
+
325
+ Inside one job, each capability stays its own part: a capability Block performs exactly one hosted operation and a connector one app task, so every part keeps its own permission, approval and credit rules, and StillMade groups the parts of one job into one Step (`groups` in the Project Type). Never invent a combined runtime. When one Block can do the whole job with documented primitives (a JavaScript Block doing several local transforms, a workspace owning its whole document), build it as one Block.
326
+
327
+ Examples: "every new email with an image becomes a generated image" is two Steps, "Gmail · New emails with images" (When, fetch with an image filter, only new) and "Image from email" (AI write, Generate image); listing When, Fetch, Only new, AI decide, Continue only if, AI write and Generate image as seven Steps splits one job into its parts. "A new Meta lead goes to HubSpot" is three Steps: "Meta Ads · New leads", "Qualify lead" and "HubSpot · Add contact".
328
+
274
329
  ### Typed connections
275
330
  An image-producing Block can connect to an image-consuming Block. Primary ports make insertion predictable; semantic roles distinguish a source image from a character reference. Secondary inputs can bind to project context.
276
331
 
@@ -1001,7 +1056,20 @@ Its capability declaration is:
1001
1056
  ```
1002
1057
 
1003
1058
  Declare exactly one prompt input (`text`, `script`, or `brief`) and exactly one
1004
- output (`text`, `script`, or `json`). Structured prompt inputs contain
1059
+ output (`text`, `script`, `json`, or a structured `object`).
1060
+
1061
+ An optional second `text` input can carry the user's own instructions, such as
1062
+ decision rules or what to write: name it in `"prompt": {"$input": "data",
1063
+ "$instructions": "rules"}`. StillMade sends `Instructions:` then `Input:`.
1064
+
1065
+ For a structured answer, declare one `object` output with a flat `schema` of up
1066
+ to 20 `string`, `number`, `integer` or `boolean` fields, for example
1067
+ `{"yes":"boolean","score":"integer","label":"string","reason":"string"}`.
1068
+ StillMade asks the model for exactly one JSON object with those fields, accepts
1069
+ the common `"85"` and `"true"` string forms, drops undeclared fields and fails the
1070
+ run when a field is missing. Fixtures for an object output use
1071
+ `{"kind":"object"}`; the declared fields are always checked. Later Steps can use
1072
+ the fields directly, for example with "Continue only if". Structured prompt inputs contain
1005
1073
  `{"schemaVersion":1,"text":"..."}`. A generated script returns that same
1006
1074
  structured shape; a text output returns a string. Typed ports, primary markers,
1007
1075
  semantic roles, and scoped project context retain their SDK meaning. A context
@@ -5536,6 +5604,21 @@ compatible({type: 'image', role: 'source_image'},
5536
5604
  ### Primary ports
5537
5605
  Declare one primary input and output for automatic insertion. A sole port is inferred for older packages. Multiple candidates without a declared primary do not produce an arbitrary connection.
5538
5606
 
5607
+ ### How a project flags connection problems
5608
+ Every surface that shows a project's Blocks (the step rail, Flow cards, the Flow map and Canvas nodes) reads one classifier, `placementAttention` in `packages/block-platform/placement-attention.js`. It only explains states the flow inspection already proved; it never changes what may run. Order suggestions keep their own marker between the two Blocks and do not color either Block.
5609
+
5610
+ | Glow | Meaning | Causes |
5611
+ | --- | --- | --- |
5612
+ | Red | Needs a fix before it can run correctly | Last run failed; result wasn't saved; Block unavailable; Blocks disagree on a contract or depend on each other; a connection points to a missing Block or input; a chosen source stopped working (pinned version gone, saved setting in the wrong format, two Canvas sources for one input); an input requires project information but allows no project source |
5613
+ | Yellow | Can continue once the person answers, reviews or reruns | A required input has no source yet; an unlabeled connection needs review; a schedule needs the owner to enable it; an earlier Block changed, so the result is outdated |
5614
+ | None | Normal sequencing | Waiting for an earlier Block, working, paused, skipped by a condition, private, finished, or Flow details unavailable |
5615
+
5616
+ What authors control:
5617
+ - Give every port a `semantic`. A connection whose ports carry no meaning stays yellow until a person reviews it.
5618
+ - Mark settings with safe defaults `required: false`. Each required input without a source keeps the Block yellow until it is answered.
5619
+ - Allow the sources an input can really use (`user`, `chat`, `project`). A required input that needs project information but allows no project source is red.
5620
+ - Return outputs that match their declared type. A mismatched output fails the run, which turns the Block red.
5621
+
5539
5622
  ### Safe connection conversions
5540
5623
  StillMade can insert a versioned, deterministic conversion between compatible
5541
5624
  Steps. This is part of the host connection contract; it does not add a visible
@@ -5645,6 +5728,21 @@ the host's existing media inputs or declared project context. Declaration alone
5645
5728
  is not permission. The host checks the full reference identity and current
5646
5729
  account/selection before transferring bytes. Detached history views can download
5647
5730
  text-only results; media ZIPs need the Block's current authorized media context.
5731
+
5732
+ Source-project ZIPs may also contain bounded UTF-8 HTML, CSS, JavaScript,
5733
+ TypeScript, SVG and other common source text files as `{path,text}` members. The
5734
+ host treats those members as inert data, checks their paths and total size, and
5735
+ offers only the ZIP download after the normal export authorization. A single
5736
+ HTML or script file cannot be returned as `format: "file"`. Declare a useful
5737
+ semantic such as `web_source_project` so Revolver can connect the complete
5738
+ project to a compatible consumer. Binary files are not accepted as text members;
5739
+ use authorized media references where appropriate and do not omit required
5740
+ project files while claiming a complete export.
5741
+ For browser-application Blocks, `file-bundle` members must currently be
5742
+ text-only. The browser execution host rejects guest-supplied media references
5743
+ even when the manifest requests `asset.read`, because that request does not
5744
+ prove the current project selected the exact asset and version. Other Block
5745
+ runtimes retain their existing host-authorized media-bundle path.
5648
5746
  Unavailable, unselected or unsupported media aborts the ZIP instead of returning
5649
5747
  an archive with missing members. The host does not install dependencies.
5650
5748
 
@@ -5751,6 +5849,7 @@ export * from './workflow-approvals.js';
5751
5849
  export * from './package-semantics.js';
5752
5850
  export * from './define-block.js';
5753
5851
  export * from './adapter-registry.js';
5852
+ export * from './native-application-package.js';
5754
5853
  export * from './block-storage.js';
5755
5854
  export type {BlockViewDocumentTools,DocumentDraftOperation,DocumentEntry,DocumentPath} from './document-drafts.js';
5756
5855
  export type {BlockViewDocumentOptions,BlockViewDocumentConnection} from './document-store-binding.js';
@@ -5771,7 +5870,7 @@ export interface Manifest {
5771
5870
  /** Events the Block can run on by itself, once the project owner turns them on. */
5772
5871
  triggers?: import('./triggers.js').BlockTrigger[];
5773
5872
  semantics?: import('./semantic-contracts.js').SemanticDefinition[];
5774
- provenance?: { remixSource?: BlockPackage; remixPolicy?: {allowRemixing: boolean; sourceInspection?: "yes"|"no"|"license-controlled"}; remixAncestors?: {id: string; version: string; digest: string}[]; remixedFrom?: { id: string; version: string; digest: string }; [key: string]: unknown };
5873
+ provenance?: { remixSource?: BlockPackage; remixPolicy?: {allowRemixing: boolean; sourceInspection?: "yes"|"no"|"license-controlled"}; remixAncestors?: {id: string; version: string; digest: string}[]; remixedFrom?: { id: string; version: string; digest: string }; githubSource?: {repository: string; commit: string; path: string}; [key: string]: unknown };
5775
5874
  summary?: Record<string, unknown>;
5776
5875
  license?: string;
5777
5876
  category?: string;
@@ -6416,6 +6515,24 @@ export function gainFor(measuredLufs: number, peak: number, targetLufs?: number)
6416
6515
  export function wavWriter(channelCount: number, sampleRate: number, frames: number): Readonly<{buffer: ArrayBuffer; write(channels: Float32Array[], from?: number, to?: number, gain?: number): void}>;
6417
6516
  export function encodeWav(channels: Float32Array[], sampleRate: number): ArrayBuffer;
6418
6517
  export function decodeWav(buffer: ArrayBuffer): {channels: Float32Array[]; sampleRate: number};
6518
+ /** Browser application bundle profiles. They describe a bundle format, not runtime admission.
6519
+ * `desktop-browser-application/2` adds srcdoc frames (features: wasm, srcdocFrames);
6520
+ * `desktop-browser-application/3` also declares local Web Workers (features: wasm, srcdocFrames, localWorkers: true). */
6521
+ export const BROWSER_APPLICATION_EMBEDDED_PROFILE:'desktop-browser-application/2';
6522
+ export const BROWSER_APPLICATION_LOCAL_WORKER_PROFILE:'desktop-browser-application/3';
6523
+ /** Content digests of a validated browser application package: packageDigest covers the whole package, bundleDigest only its application bundle. */
6524
+ export function getBrowserApplicationSourceDigests(value:unknown,options?:{signal?:AbortSignal}):Promise<Readonly<{packageDigest:string;bundleDigest:string}>>;
6525
+ /** Static check that every input and output declares a semantic meaning, whether it is required, a description, and a field schema for json/object outputs, so the Block can take part in typed resolution. runtimeVerified is always false. */
6526
+ export function reviewResolverContract(pkg:unknown):{name:string;runtimeVerified:false;contract:'semantic-resolver/1';passed:boolean;code?:'RESOLVER_CONTRACT';issues?:string[];message:string;manual?:{inputs:Array<{name:string;type:string;semantic:string;required:boolean;sources:string[]}>;outputs:Array<{name:string;type:string;semantic:string}>}};
6527
+ /** Native (desktop-only) application packages: exactly { manifest, nativeApplication }, bound to an exact GitHub source pin.
6528
+ * Ordinary SDK execution and admission refuse them (NATIVE_APPLICATION_RUNTIME_UNAVAILABLE); installation needs host-verified
6529
+ * admission bound to the exact source and runtime plus a managed interactive runtime. See NATIVE_APPLICATION_ADAPTATION.md. */
6530
+ export const NATIVE_APPLICATION_PACKAGE_CONTRACT:'native-application-package/1';
6531
+ export const NATIVE_APPLICATION_PACKAGE_LIMITS:Readonly<{packageBytes:262144;manifestBytes:65536;adapterBytes:64000;adapterFiles:8;ports:16;operations:16;capturedFiles:8}>;
6532
+ export const NATIVE_APPLICATION_RUNTIME_REQUIREMENT:string;
6533
+ /** Validates a native application package's strict source syntax and returns its detached, frozen copy. Throws NATIVE_APPLICATION_PACKAGE errors. Not runtime admission. */
6534
+ export function defineNativeApplicationPackage<T=unknown>(value:T):T;
6535
+ export function validateNativeApplicationPackage(value:unknown):true;
6419
6536
 
6420
6537
  ```
6421
6538
 
@@ -6567,7 +6684,7 @@ A portable image reference is not decoded pixel data. The host must resolve it b
6567
6684
  5. Test actual supported media in the host workspace.
6568
6685
 
6569
6686
  ### Every SDK error code
6570
- Generated from the SDK source (194 codes). The message is one example; the actual message names the exact field or limit.
6687
+ Generated from the SDK source (197 codes). The message is one example; the actual message names the exact field or limit.
6571
6688
 
6572
6689
  | Code | Example message | Raised in |
6573
6690
  | --- | --- | --- |
@@ -6593,6 +6710,8 @@ Generated from the SDK source (194 codes). The message is one example; the actua
6593
6710
  | APPLICATION_GUEST_SIGNAL | Use an AbortSignal when supplied. | `browser-application-guest` |
6594
6711
  | APPLICATION_GUEST_STATE | Supply the host state revision. | `browser-application-guest` |
6595
6712
  | APPLICATION_INTEGRITY | Application artifact byte count differs from its reference. | `browser-application-artifacts` |
6713
+ | APPLICATION_OUTPUT_CANDIDATE | Use declared browser application outputs. | `browser-application-output-policy` |
6714
+ | APPLICATION_OUTPUT_UNMATERIALIZED | Output … includes media references that the browser application host has not independently verified. | `browser-application-output-policy` |
6596
6715
  | APPLICATION_SOURCE_LIMIT | Application source | `browser-application-artifacts` |
6597
6716
  | APPLICATION_SOURCE_REFERENCE | Use a browser application manifest. | `browser-application-artifacts` |
6598
6717
  | APPLICATION_STATE_LIMIT | Application state artifact | `browser-application-artifacts` |
@@ -6602,6 +6721,7 @@ Generated from the SDK source (194 codes). The message is one example; the actua
6602
6721
  | AUDIO_SCORE_HOST | Choose a supported Audio Score operation | `audio-score-host` |
6603
6722
  | BEHAVIOR | Output differs from expected fixture. Expected …; received … | `testing` |
6604
6723
  | BROWSER_APPLICATION_UNAVAILABLE | No trusted desktop browser application executor is installed. A bundle or mounted interface is not execution. | `browser-application-execution` |
6724
+ | BROWSER_BUILD_DEPENDENCY | Expected one exact registry tarball identity. | `repository-build-dependencies` |
6605
6725
  | BUSY | JavaScript runners are busy. Try again shortly. | `sandbox-node` |
6606
6726
  | BYOK_PAYMENT_HOST | Choose a supported payment capability | `byok-payment-host` |
6607
6727
  | CANCELLED | Conversion stopped. | `adapter-registry`, `browser-application-execution`, `browser-application-guest` and 7 more |
@@ -6657,6 +6777,7 @@ Generated from the SDK source (194 codes). The message is one example; the actua
6657
6777
  | DOCUMENT_SOURCE_CONFLICT | Project source changed underneath the shared draft. Review and explicitly reset the shared draft for everyone, or supply a compatible source. | `document-store` |
6658
6778
  | DOCUMENT_STORE | Use a bounded named document field | `document-store` |
6659
6779
  | FIRST_PARTY_SOURCE | Use the exact published first-party package before creating a remix. | `remix-policy`, `testing` |
6780
+ | GENERATION_SETTINGS | This Step does not generate images, video or speech. | `generation-settings` |
6660
6781
  | HOST_SERVICES | Animated assets requires its version 1 generation and dialog host | `animated-assets-host`, `asset-generation-host`, `blueprint-host-services` and 47 more |
6661
6782
  | INPUT_SOURCE | … does not allow … information. Choose a permitted source. | `input-source-policy` |
6662
6783
  | JOB_EXECUTOR | Use a trusted host executor | `package-jobs` |
@@ -6669,7 +6790,6 @@ Generated from the SDK source (194 codes). The message is one example; the actua
6669
6790
  | LICENSE_RESTRICTED | Conflicting file-level SPDX license at … | `portable-github`, `portable` |
6670
6791
  | LIMIT | Source exceeds static review complexity | `admission`, `browser-application-execution`, `capabilities` and 14 more |
6671
6792
  | LINEAGE | Declare lineage {parents:[{id,version,digest}],changes} | `portable` |
6672
- | LOCAL_WORKER_REQUIRED | Pair a reviewed local worker for this application. A browser or desktop download alone cannot execute its native source. | `runtime` |
6673
6793
  | MANIFEST | Invalid JavaScript manifest | `javascript` |
6674
6794
  | MEDIA_DESCRIPTION_HOST | Describe Media requires a supported image reference and optional hint | `media-description-host` |
6675
6795
  | MEDIA_RENDER_INPUT | Final render requires a versioned timeline, settings, and Block source. | `portable-media-contracts` |
@@ -7034,6 +7154,8 @@ Blocks, Project Types, and creators have their own page URLs. Public pages link
7034
7154
 
7035
7155
  ## Build with an AI coding tool
7036
7156
 
7157
+ The fastest route is to send your coding agent [Build a Block with your AI](/docs/build/with-your-ai) with your idea: it downloads the SDK, builds the Block and runs the readiness gate without you running anything.
7158
+
7037
7159
  ### Start with the SDK contract
7038
7160
  Use the button below to copy the complete authoring guide, then add a short description such as “Make a Block that converts an image to grayscale while preserving alpha.” The guide includes the package format, supported runtime, typed ports, permissions, fixtures, and a complete example.
7039
7161
 
@@ -7048,9 +7170,9 @@ Ask the assistant to return source files or one `.stillmade.json` package. Run t
7048
7170
 
7049
7171
  <!-- builder-contract:start (generated by npm run build:sdk; do not edit) -->
7050
7172
 
7051
- ### Block builder contract (stillmade.block-builder@1.0.0)
7173
+ ### Block builder contract (stillmade.block-builder@1.3.0)
7052
7174
 
7053
- Contract `stillmade.block-builder@1.0.0`. Humans, coding agents, imported source, GitHub repositories and generated code all adapt to the Block platform; anything that becomes a StillMade Block obeys this contract.
7175
+ Contract `stillmade.block-builder@1.3.0`. Humans, coding agents, imported source, GitHub repositories and generated code all adapt to the Block platform; anything that becomes a StillMade Block obeys this contract.
7054
7176
 
7055
7177
  ### Source of truth
7056
7178
 
@@ -7060,13 +7182,27 @@ Treat the current SDK (`stillmade.block.json` manifest, `packages/block-sdk` con
7060
7182
 
7061
7183
  Before building, check what already exists (`find_existing_blocks` over MCP, or the Marketplace and your library) by the inputs, results and operations the goal needs. Use an installed or reviewed Block that already does it; remix a close one so its license, notices and creator credit stay attached; chain existing Blocks and build only the missing step. Never republish another creator's source without remix lineage: public copies are refused. Build a new Block when nothing fits or the person asks for their own version, and say which similar Blocks you considered.
7062
7184
 
7185
+ ### One job per Step
7186
+
7187
+ A Step is one job: the work between two moments where a person or the outside world must see the result. Start a new Step only at one of three points; everything else is a part of the neighboring Step.
7188
+
7189
+ 1. **A person works with the result**: reads, edits, picks or approves it (a workspace Block such as a script, a Canvas or an Editor, or an approval). That is why Chat, Bible, Canvas and Editor are four Steps.
7190
+ 2. **Finding new things turns into handling each one**: the trigger (a schedule or an app event), the app read, its filter and "only new" are the first job; what is done with each item is the next job. A trigger is a setting of the first job, never a Step of its own.
7191
+ 3. **The result leaves StillMade**: it is sent, posted, published, paid or written into another app. Consecutive writes to the same app, with the glue that shapes data for them, are one job.
7192
+
7193
+ A part that only runs in the desktop app cannot share a Step with cloud parts. Before adding a Step, name which of the three reasons makes it separate; if none applies, make it a part of a neighbor. A Step nobody would ever open must not exist on its own. Prefer an app task's own filter (a Gmail query such as `has:attachment filename:png`) to an AI check, and use AI decide only for judgement.
7194
+
7195
+ Inside one job, each capability stays its own part: a capability Block performs exactly one hosted operation and a connector one app task, so every part keeps its own permission, approval and credit rules, and StillMade groups the parts of one job into one Step (`groups` in the Project Type). Never invent a combined runtime. When one Block can do the whole job with documented primitives (a JavaScript Block doing several local transforms, a workspace owning its whole document), build it as one Block.
7196
+
7197
+ Examples: "every new email with an image becomes a generated image" is two Steps, "Gmail · New emails with images" (When, fetch with an image filter, only new) and "Image from email" (AI write, Generate image); listing When, Fetch, Only new, AI decide, Continue only if, AI write and Generate image as seven Steps splits one job into its parts. "A new Meta lead goes to HubSpot" is three Steps: "Meta Ads · New leads", "Qualify lead" and "HubSpot · Add contact".
7198
+
7063
7199
  ### Define the capability first
7064
7200
 
7065
- Translate the request into an explicit capability contract before implementation: what the Block does; each input with its type, meaning and whether it is required (prefer optional settings with safe defaults over extra required questions); each output with its type and meaning; persistent state; project context it reads; permissions; UI; long-running behavior; expected failures; cancellation; determinism; and whether it needs hosted models, media, desktop tools or shared editing. Keep the public interface as small and general as possible and keep implementation details out of it.
7201
+ Translate the request into an explicit capability contract before implementation: what the Block does; each input with its type, meaning and whether it is required (prefer optional settings with safe defaults over extra required questions); each output with its type and meaning; persistent state; project context it reads; permissions; UI; long-running behavior; expected failures; cancellation; determinism; and whether it needs hosted models, media, desktop tools or shared editing. Keep the public interface as small and general as possible (few required inputs, one primary output) and keep implementation details out of it; small means a small interface, never a fragment of a job. A Block that generates images, video or speech declares only its prompt and output: every Step that runs it gets the host’s generation settings (model, quality, length and resolution, voice, speed, how many), saved with the Step, changed on its page or by Chat, and shown with their cost before each run.
7066
7202
 
7067
7203
  ### Blocks compose
7068
7204
 
7069
- A Block is not a mini-app. Its outputs become other Blocks' inputs and its inputs come from other Blocks, project context or the user. Use the typed port system: shared StillMade types (`image`, `video`, `audio`, `asset`, `script`, `shot[]`, ...), a `semantic` meaning on every port, `required` and a short `description`. Mark exactly one primary input and one primary output so Project Type Steps connect automatically, and use `kind: "task"`: a `workspace` Block owns a project document and is never connected automatically. Inputs marked `context` read the project and cannot receive a connection from another Step. Output reusable StillMade values: media references (`{kind,assetId,versionId,url}`) and structured production values with `schemaVersion: 1`, preserving provenance, versions and relationships downstream Blocks need. Never make ordinary users wire JSON, copy IDs, understand internal paths or translate one Block's output into another: `createUniversalResolver()` (the same engine as the Project Type composer) resolves inputs from compatible upstream outputs, permitted project context and, for optional non-context inputs, `StillMade.requestFromUser`.
7205
+ A Block is one job: not a mini-app of many jobs and not a fragment of one. Its outputs become other Blocks' inputs and its inputs come from other Blocks, project context or the user. Use the typed port system: shared StillMade types (`image`, `video`, `audio`, `asset`, `script`, `shot[]`, ...), a `semantic` meaning on every port, `required` and a short `description`. Mark exactly one primary input and one primary output so Project Type Steps connect automatically, and use `kind: "task"`: a `workspace` Block owns a project document and is never connected automatically. Inputs marked `context` read the project and cannot receive a connection from another Step. Output reusable StillMade values: media references (`{kind,assetId,versionId,url}`) and structured production values with `schemaVersion: 1`, preserving provenance, versions and relationships downstream Blocks need. Never make ordinary users wire JSON, copy IDs, understand internal paths or translate one Block's output into another: `createUniversalResolver()` (the same engine as the Project Type composer) resolves inputs from compatible upstream outputs, permitted project context and, for optional non-context inputs, `StillMade.requestFromUser`.
7070
7206
 
7071
7207
  ### Use platform primitives
7072
7208
 
@@ -7076,9 +7212,13 @@ Prefer, in order: an SDK capability; a documented host capability (the hosted op
7076
7212
 
7077
7213
  Never make a Block look functional through hard-coded local paths, developer-machine dependencies, undocumented environment variables, admin or database access, hidden core modifications, direct database writes, fake or mocked production results, hand-prepared test assets that hide incompatibilities, credentials in code, or assumptions about one user's machine. The finished Block must work through the same interfaces available to any installed Block; `permissions.network`, `permissions.filesystem` and `permissions.secrets` must be empty arrays.
7078
7214
 
7215
+ ### Name it briefly
7216
+
7217
+ Give the Block a short, plain name of 40 characters or fewer that says what it does ("Captioned Clip", not "Captioned Business Clip Generator With Review"). The name appears in step bars, Project Type cards and pickers, so put the detail in the description instead. New releases with a longer name do not pass readiness.
7218
+
7079
7219
  ### Interface
7080
7220
 
7081
- If the capability needs UI, use the Block UI SDK: generated `manifest.ui` controls first; a sandboxed custom view (`view.html`/`view.css`/`view.js`) only when the core interaction genuinely needs one. Expose the capability, not the implementation: meaningful controls, sensible defaults, preview, direct manipulation, progress, clear errors and visible outputs. Do not show raw JSON, internal IDs, filesystem details, provider terminology or developer settings unless the Block is itself a developer tool. Follow the host appearance (Light, Dark and White) and the mobile layout contract: one interface for every screen size that fits a 320 CSS-pixel phone without horizontal scrolling.
7221
+ If the capability needs UI, use the Block UI SDK: generated `manifest.ui` controls first; a sandboxed custom view (`view.html`/`view.css`/`view.js`) only when the core interaction genuinely needs one. Expose the capability, not the implementation: meaningful controls, sensible defaults, preview, direct manipulation, progress, clear errors and visible outputs. Do not show raw JSON, internal IDs, filesystem details, provider terminology or developer settings unless the Block is itself a developer tool. When a person chooses among options they need to hear or see (voices, music, sounds, fonts, looks, colors, templates or images), let them preview each option before choosing: a sample to play or a thumbnail, from the Block's own files or the host's free samples, never a paid generation. Leave previews out only when the builder states there is nothing to preview. Choices StillMade owns, such as voices and models in the run review, already show their samples. Follow the host appearance (Light, Dark and White) and the mobile layout contract: one interface for every screen size that fits a 320 CSS-pixel phone without horizontal scrolling.
7082
7222
 
7083
7223
  ### Shared editing
7084
7224
 
@@ -7114,11 +7254,11 @@ StillMade runs the readiness check on every Block it admits: manifest and contra
7114
7254
 
7115
7255
  ### Project Types
7116
7256
 
7117
- A Project Type is an ordered production workflow. Each Step's primary output must be a compatible input for the next Step, secondary values come from permitted project context, and every member Block obeys this contract. Install Blocks into a realistic Project Type: project chat must understand each Step, inputs must resolve intuitively, outputs and execution state must be visible, failures must be diagnosable, and the user must be able to continue through the workflow.
7257
+ A Project Type is an ordered production workflow. Each Step's primary output must be a compatible input for the next Step, secondary values come from permitted project context, and every member Block obeys this contract. Install Blocks into a realistic Project Type: project chat must understand each Step, inputs must resolve intuitively, outputs and execution state must be visible, failures must be diagnosable, and the user must be able to continue through the workflow. Group the parts of one job into one Step instead of listing helper parts as Steps; most automations are two to four Steps.
7118
7258
 
7119
7259
  ### Readiness report
7120
7260
 
7121
- Finish with a Block Readiness Report: capability, contract (inputs, outputs, permissions, dependencies), platform APIs used, tests actually performed and their results, the composition test (upstream, Block, downstream), known limitations, unsupported requirements and any platform gap with its smallest general primitive. Choose exactly one status: PRODUCTION READY (every applicable check passed), READY WITH DOCUMENTED LIMITATIONS (works reliably within stated boundaries), BLOCKED BY PLATFORM CAPABILITY (needs a missing generic primitive) or FAILED. Never label a Block production ready to satisfy a request, and never claim a check ran when it did not.
7261
+ Finish with a Block Readiness Report: capability, contract (inputs, outputs, permissions, dependencies), platform APIs used, tests actually performed and their results, the composition test (upstream, Block, downstream), known limitations, unsupported requirements and any platform gap with its smallest general primitive. Report exactly one status, the one StillMade's readiness check returned (`ready` in the SDK CLI, `check_block_readiness` over MCP), never one you chose: PRODUCTION READY (every applicable check passed), READY WITH DOCUMENTED LIMITATIONS (works reliably within stated boundaries), BLOCKED BY PLATFORM CAPABILITY (needs a missing generic primitive) or FAILED. Never label a Block production ready to satisfy a request, and never claim a check ran when it did not.
7122
7262
 
7123
7263
  ### Definition of done
7124
7264
 
@@ -7394,9 +7534,10 @@ of the SDK URL the user supplied, not a guessed production hostname or localhost
7394
7534
  - Search `/api/public-listings/discover?kind=block&search=<encoded-query>` for
7395
7535
  Blocks, or use `kind=type` for Project Types. Follow `nextCursor` with `after`
7396
7536
  when more results are relevant; a single page is not the complete catalog.
7397
- - Use returned listing identities and versions to inspect
7398
- `/api/public-listings/<kind>/<id>/<version>/source.json` where source inspection
7399
- is permitted. Read the real manifest and any declared dependency packages.
7537
+ - Use returned listing identities and versions to read
7538
+ `/api/public-listings/<kind>/<id>/<version>/metadata.json`: its name, description
7539
+ and typed inputs and outputs. A Block's code is private to its creator, so build
7540
+ on what it takes and makes, never on its source.
7400
7541
  - In an offline SDK checkout, `packages/block-platform/catalog.js` provides bundled
7401
7542
  first-party examples. It is a snapshot, not the complete live Marketplace.
7402
7543
 
@@ -9452,8 +9593,98 @@ The in-app full-application inspection pins source and retains an inventory of
9452
9593
  code, binary assets, dependency manifests, lockfiles, symlinks and submodules.
9453
9594
  It returns `not-built`, including unfinished feature and runtime checks. A complete
9454
9595
  file inventory is neither a complete dependency checkout nor a successful build.
9455
- Inspection uses public unauthenticated GitHub APIs; it does not authorize private
9596
+ Inspection first uses public unauthenticated GitHub APIs; it does not authorize private
9456
9597
  repository access, install dependencies, execute scripts or charge model credits.
9598
+ An exact commit's complete, verified public tree and Git-blob-checked source
9599
+ bytes may be reused from a 15-minute, 24 MiB process-local cache across the
9600
+ inspection, build and source-recheck phases. Branch/HEAD resolution, partial
9601
+ trees, failed reads and unverified bytes are not cached. Source review reports
9602
+ `pinned-cache` when it uses that evidence instead of claiming a fresh API read.
9603
+ The cache avoids repeated anonymous requests for one pin; a cold repository
9604
+ still depends on GitHub availability and its rate limit, and another server
9605
+ process has its own cache. It is not a substitute for an authenticated or
9606
+ archive-backed source acquisition route at larger scale.
9607
+ When the public REST API is rate-limited, the application import can instead
9608
+ resolve the public branch or tag through bounded Git protocol v2 HTTP and inspect a
9609
+ GitHub codeload archive at the resulting commit. The host checks the archive's
9610
+ commit marker, tar structure and paths, computes Git blob identities from
9611
+ actual bytes, rejects sensitive or oversized selected files, and labels this
9612
+ evidence `pinned-github-archive`. A named ref uses two bounded Git HTTP requests
9613
+ before the archive request; an exact commit needs only the archive request.
9614
+ This fallback is capped at 12 MB compressed and 40 MB expanded, requires no
9615
+ Git executable on the server, and refuses repositories with
9616
+ submodules because the archive omits their Git identities. Larger archives
9617
+ must use the Git tree route or a future bounded acquisition worker. Archive
9618
+ inspection is source evidence only; it does not approve execution or install.
9619
+ The REST and fallback phases use the same caller-owned HTTP transport when one
9620
+ is provided. Reported request use includes both phases. Reported byte use
9621
+ includes REST and archive bodies; the two Git-ref responses have separate
9622
+ 64 KiB limits and are not included in that aggregate byte figure.
9623
+ For a complete Git tree containing submodules, inspection reads the pinned
9624
+ `.gitmodules` blob, accepts only canonical or relative GitHub repositories,
9625
+ and follows each exact Gitlink commit (including nested modules) within one
9626
+ 48-request, 32 MB metadata and 24-placement bound. It reports each dependency
9627
+ commit separately. This verifies dependency identities and file inventories;
9628
+ the isolated builder must still acquire and hash the actual dependency bytes
9629
+ before running their code. Missing mappings, outside hosts, incomplete trees
9630
+ and exhausted bounds fail with a specific source-graph reason.
9631
+ The larger isolated-build acquisition profile can verify a complete archive
9632
+ against that Git tree, including ordinary files and symlink identities. GitHub
9633
+ codeload can omit files under `export-ignore` or transform exported text; those
9634
+ paths must be restored from exact-commit raw transport and independently
9635
+ rehashed to their pinned Git blobs. The raw route is limited to 64 files and
9636
+ 8 MB, denies sensitive paths, uses no credentials or redirects, and cannot
9637
+ grant execution. All archive and recovered bytes are checked before a trusted
9638
+ staging callback receives any file. This profile has not yet been connected
9639
+ to a complete native build or installation workflow.
9640
+ The inspection `readable` flag controls what the LLM can request as source
9641
+ text. It is not a build-file filter. A separately checked `stageable` flag
9642
+ allows oversized but bounded files and inert symlink-target blobs into the
9643
+ private build-source quarantine; sensitive paths remain excluded. Symlink
9644
+ targets are stored as bytes, not followed or created as active filesystem
9645
+ links. A later materializer must validate every link target before use.
9646
+ The isolated-worker source-closure orchestrator groups identical pinned
9647
+ repositories across submodule placements, rechecks each exact commit, and
9648
+ hands verified bytes to a trusted quarantined staging callback under one
9649
+ request, network-byte, file, staged-byte and deadline budget. Its receipt is
9650
+ `execution:not-run` and `installable:false`; a partial stage has no activation
9651
+ authority. The connected private staging writer uses content-addressed inert
9652
+ blobs and rereads each file before sealing it. A complete closure produces a
9653
+ read-only manifest bound to a host-retained digest; reopening the quarantine
9654
+ audits every blob against its Git identity. Partial stages cannot be sealed.
9655
+ The inert tree planner checks file/directory namespace collisions and resolves
9656
+ symlink targets only within the exact staged closure, without expanding source
9657
+ paths on the host filesystem. A bounded transfer format then packs each
9658
+ audited Git blob once and binds its canonical namespace, modes, link targets,
9659
+ source digest and sealed-manifest digest into a SHA-256 bundle. The Linux
9660
+ materializer independently verifies the bundle and Git hashes, creates files
9661
+ through private directory descriptors, creates links only after file writes,
9662
+ and audits the final tree. A synthetic tree with an executable and links ran
9663
+ in the isolated VM; a changed bundle was rejected before staging. Natron's
9664
+ allowed exact closure also materialized there: 6,445 files and 654 directories.
9665
+ This development path is not yet a trusted install or execution admission:
9666
+ the stage owner can still change its read-only modes, and build recipes,
9667
+ dependencies, GUI sessions and result contracts need separate host control.
9668
+ For an npm browser candidate, inspection also reads the pinned `package.json` and
9669
+ `package-lock.json` through the same bounded source verifier. It checks that root
9670
+ dependency declarations agree and distinguishes integrity-pinned npm tarballs,
9671
+ exact-commit GitHub dependencies and unresolved sources. This is a build plan,
9672
+ not dependency acquisition or build admission. The pinned miniPaint case has
9673
+ 517 npm tarballs and one exact-commit GitHub dependency; an isolated builder
9674
+ must acquire and verify both kinds before executing its Webpack build.
9675
+ Before rebuilding, the importer checks whether the pinned repository already
9676
+ contains an HTML entry referencing a checked-in local browser bundle. It selects
9677
+ the referenced scripts/styles and bounded local media resources, then verifies
9678
+ every selected byte against the Git tree. This can preserve a real original UI
9679
+ without executing a package script. It is still only a candidate: dynamic
9680
+ resource requests, operations, state and output must pass isolated review.
9681
+ miniPaint's checked-in bundle passed a separate local browser probe with a real
9682
+ brush stroke, changed PNG bytes and exact document restore in a second page.
9683
+ That probe is not an installed Block or a host-enforced multiplayer result.
9684
+ The local acquisition module also re-read miniPaint's exact pinned lockfile and
9685
+ verified all 518 dependencies (about 18.2 MB) against registry SHA-512 or Git
9686
+ blob identities. Those bytes were discarded after the probe. A managed stage,
9687
+ isolated framework rebuild and reviewed execution admission are still missing.
9457
9688
 
9458
9689
  Use the exported `defineRepositoryApplication` contract to record the requested
9459
9690
  scope, interface, versioned route and source-backed feature ledger. Use
@@ -9463,6 +9694,80 @@ verification. The assessor always reports `executionPerformed:false` and
9463
9694
  `independentlyVerified:false`. A model cannot certify its own integration by
9464
9695
  filling in that object.
9465
9696
 
9697
+ For a generated browser application, put the exact GitHub repository URL,
9698
+ 40-character commit and application folder in
9699
+ `manifest.provenance.githubSource`. The SDK checks its shape and the source
9700
+ reviewer independently matches it to the pinned Git tree and every bundled
9701
+ original asset. This field travels with the versioned package; it is source
9702
+ identity, not permission, a license decision or evidence that the adapter ran.
9703
+ Older uninstalled candidates without the embedded pin can still undergo
9704
+ source review, but must not be promoted to production solely from that legacy
9705
+ shape.
9706
+
9707
+ For a framework application built from pinned source, the unreviewed candidate
9708
+ also carries `manifest.provenance.browserBuild`: the verified source-closure
9709
+ digest, build-script digest, output directory and digest of every original
9710
+ compiled file. A model may author the lifecycle adapter, but cannot supply the
9711
+ build result or certify it. A trusted host must independently rederive the
9712
+ Git source closure, verify the exact isolated build and reconstruct the full
9713
+ application bundle before running the ordinary interface, state and output
9714
+ review. The current SDK handoff and internal verifier implement these checks;
9715
+ the production build supervisor and review issuer are not yet connected to the
9716
+ GitHub button. A build or source receipt alone does not make a Block installable.
9717
+ An internal npm job now composes the sealed source bundle, Linux materializer,
9718
+ integrity-pinned registry and exact-commit GitHub package stages, and the
9719
+ network-denied build runner. It checks each identity again between stages and
9720
+ returns compiled bytes with no installation authority. The Linux npm profile
9721
+ now caps selected packages at 768, verified expanded package bytes at 256 MiB,
9722
+ and package files at 18,000. It caps compiled files at 16 MiB total, each
9723
+ file at 8 MiB, and the encoded build report at 24 MiB, with a root `dist`,
9724
+ `build` or `out` entry. It
9725
+ omits a lockfile package only when that package is explicitly optional and
9726
+ incompatible with the worker's OS, CPU or libc; the root launcher rechecks
9727
+ that selection against the pinned lock before execution. It has not run
9728
+ miniPaint's build, and still needs the durable supervisor lease and cleanup
9729
+ needed for a production
9730
+ button. The stage-order tests are offline; no real framework repository has
9731
+ passed this composed job. The worker also exposes a trusted rebuild callback
9732
+ for the compiled-candidate source verifier; the caller must run it under the
9733
+ same host-owned supervisor rather than accepting a browser-supplied report.
9734
+
9735
+ A successful framework build does not prove that all runtime assets are local.
9736
+ For example, CanvasCode compiled from its pinned source but loaded Monaco from
9737
+ a CDN; the isolated network-denied browser showed its preview while the editor
9738
+ remained unavailable. Manually bundling the already pinned Monaco dependency
9739
+ restored the editor and real ZIP export in an offline development VM. The
9740
+ internal compiled-authoring path can now ask a model for complete replacements
9741
+ or unique exact-text edits of inspected source files, each bound to its
9742
+ original Git SHA-256. The host derives full replacement bytes for an edit. A root-owned
9743
+ stage checks and seals replacement bytes separately from the immutable Git
9744
+ source; the network-denied build applies them in scratch space. Patch identity
9745
+ must match in the compiled candidate and an independent rebuild. Package
9746
+ manifests and lockfiles cannot be patched in this profile. The root-owned patch
9747
+ stage, service connection, automatic runtime-failure repair and full behavior
9748
+ review remain unverified. A model-suggested CDN exception is not equivalent to
9749
+ localizing and verifying those assets.
9750
+ CanvasCode also requires a `srcDoc` preview frame and local Monaco language
9751
+ workers. The original browser-application profile declares only single-thread
9752
+ WASM; its CSP and target guard deny frames and workers. A successful ordinary
9753
+ Chromium smoke therefore cannot establish host-runtime compatibility.
9754
+
9755
+ The new browser-application v2 source profile now supports a declared, bounded
9756
+ direct `srcdoc` frame. The compiled authorer can request that feature, and
9757
+ independent source verification reconstructs the exact profile from the pinned
9758
+ build. A local Chromium probe confirmed that the v2 CSP runs an inline preview
9759
+ script, reports the expected direct child frame, and keeps the top-only trusted
9760
+ bootstrap out of the child. The existing v1 CSP and frame guard remain closed.
9761
+ This is development-browser evidence, not a provisioned StillMade worker run.
9762
+ CanvasCode also needs local Monaco language workers. Browser application v3
9763
+ now declares exact bundled dedicated worker scripts, and the trusted target
9764
+ policy admits them only when paused under the original page and context. A
9765
+ local Chrome probe ran a worker through that policy and the hashed asset
9766
+ server, while CSP denied a second loopback origin. The original v1 and v2
9767
+ profiles still deny workers. This is not a provisioned StillMade worker test,
9768
+ CanvasCode's own worker behavior has not passed runtime review, and its full
9769
+ application import remains uninstalled.
9770
+
9466
9771
  ### Choose an actual runtime
9467
9772
 
9468
9773
  | Source | Current boundary |
@@ -9480,6 +9785,18 @@ adapter. The exact reviewed Method Draw source has a private desktop install,
9480
9785
  editing and SVG export path. Other applications require separate source,
9481
9786
  runtime and result review; package validation alone is insufficient.
9482
9787
 
9788
+ The separate Natron ARM64 development build (repository evidence `artifacts/repository-acceptance/natron-native-gui-dev-build-2026-09-29.json`)
9789
+ shows that a Qt5/PySide2 native GUI can compile and open in a local VM after
9790
+ architecture and Python-home adaptation. Its source tree is not yet the
9791
+ complete sealed Git closure, and its OCIO configs and OpenFX plugins are
9792
+ missing. This is runtime feasibility evidence, not approval to install a
9793
+ GitHub-authored Block or a replacement for the full application.
9794
+ The later exact-source-to-GUI check (repository evidence `artifacts/repository-acceptance/natron-exact-tree-to-gui-2026-09-29.json`)
9795
+ replaced that archive input with the verified allowed Git closure and compiled
9796
+ a separate copy carrying only the recorded ARM64 patch. The GUI opened; the
9797
+ same binary also saved and reopened a native `.ntp` project. The missing
9798
+ plugins, color config and host-enforced Block contracts remain.
9799
+
9483
9800
  ### Keep the original appearance
9484
9801
 
9485
9802
  For an eligible restricted view, place this option in `src/view.json`:
@@ -9512,6 +9829,13 @@ contract and the complete runtime message limits. Large or referenced media
9512
9829
  still needs the host's authenticated asset resolution and materialization path;
9513
9830
  a guest-local data/blob URL is not a durable shared asset.
9514
9831
 
9832
+ For browser applications with several export actions, declare which output
9833
+ ports each action produces. An SVG export can map to `svg` and a PNG export to
9834
+ `png`; mark each shared-manifest port `required:false` when another action
9835
+ does not return it. The host checks the exact action-to-port mapping before
9836
+ publishing output or storing media. A generated adapter's declaration alone
9837
+ does not prove either export works.
9838
+
9515
9839
  Map existing app behavior to SDK input, shared-document and output interfaces.
9516
9840
  Do not recreate the application's logic in the shared host or add a special
9517
9841
  Block-ID branch. Persist editable state through declared host services and keep
@@ -9603,6 +9927,32 @@ automatic permission. Arbitrary development servers, native Node modules,
9603
9927
  service workers, threaded WASM and full-stack backends need distinct profiles
9604
9928
  and verified host capabilities. Existing SDK restrictions are not removed.
9605
9929
 
9930
+ The separately identified `desktop-browser-application/2` bundle may declare
9931
+ `features: {wasm:false, srcdocFrames:true}`. A trusted stage and runtime use this
9932
+ exact declaration to enable at most eight simultaneous direct `about:srcdoc`
9933
+ frames (32 over the page lifetime), with inline script needed for a preview
9934
+ document. Other frame URLs, nested frames, popups and local web workers remain
9935
+ denied. The trusted controller bootstrap runs only in the top document. This
9936
+ profile does not authorize ambient network requests or installation; exact
9937
+ source review, isolated execution and output review still apply. An authoring
9938
+ model can request it, but it cannot enable it by changing a prompt or manifest.
9939
+
9940
+ `desktop-browser-application/3` adds `localWorkers:true` (and an explicit
9941
+ `srcdocFrames` boolean). It permits only dedicated workers whose script URL
9942
+ exactly names a bundled JavaScript asset on the application asset server. The
9943
+ target policy binds each worker to the exact parent page and browser context,
9944
+ requires a paused attachment, installs recursive target monitoring before
9945
+ resume, limits active and lifetime workers, and fails the session on an unknown
9946
+ target or unconfirmed detach. The host-controlled CSP permits same-origin
9947
+ workers and same-origin connections; the asset server serves only verified
9948
+ bundled files. The isolated job's private network namespace remains required.
9949
+ Chrome does not expose `Fetch.enable` on worker CDP sessions, so worker egress
9950
+ is enforced by the host CSP, exact local asset server and private network
9951
+ boundary, not by a worker-session Fetch interceptor. Blob, remote, shared and
9952
+ service workers remain denied. A local Chromium probe exercises the target
9953
+ policy and asset server, including a denied second loopback origin. A
9954
+ provisioned StillMade worker run and application-level review remain required.
9955
+
9606
9956
  Inspect compiled dependencies as well as asset extensions. For example, a
9607
9957
  checked-in editor bundle may contain base64 WebAssembly or dynamically create
9608
9958
  workers without shipping any `.wasm` file. The current asset/declaration check
@@ -9610,7 +9960,8 @@ does not prove those paths are absent. Admission must record which paths are
9610
9960
  needed, and the selected runtime must enforce its CSP, target and resource
9611
9961
  policy when code executes. A dead or explicitly unavailable feature is different
9612
9962
  from a verified fallback. The current development Linux worker rejects declared
9613
- WASM and blocks worker creation; it does not establish general WASM support.
9963
+ WASM; the new worker profile has not been provisioned or admitted for an
9964
+ installed Block.
9614
9965
 
9615
9966
  ### Adapter lifecycle and completion
9616
9967
 
@@ -9620,6 +9971,47 @@ original application APIs and controls. Keep autosave separate from explicit
9620
9971
  completion; mounting a UI or retaining the original input is not evidence of
9621
9972
  the requested transformation.
9622
9973
 
9974
+ For compiled applications, inspect where the original UI owns its live state.
9975
+ If that state is private to a bundled module, a bounded source edit may expose
9976
+ a data-only bridge for the Block-owned adapter. The edit must target an exact
9977
+ inspected pinned file and be rebuilt under the sealed source identity. The
9978
+ adapter should seed inputs and restore checkpoints through the original state
9979
+ path, then export the state changed by real UI actions. A global store bridge
9980
+ is not itself host storage or permission authority. Include binary project
9981
+ files or fail explicitly; silently dropping them makes saved state and export
9982
+ incomplete. Declare structured output meaning and schema so Revolver can
9983
+ distinguish a website-source project from arbitrary JSON. Browser-downloaded
9984
+ ZIP bytes are not a connected artifact until a trusted host materializer owns
9985
+ and validates them; a JSON/base64 field must not be presented as a ZIP.
9986
+
9987
+ The candidate reviewer can perturb a primary `plain_text` input, or insert a
9988
+ valid HTML comment into a primary `html_document` input, in a fresh isolated
9989
+ session. It compares only declared text or schema-bearing structured output
9990
+ ports for the same export operation. A fixed JSON project now fails this check
9991
+ even when its original UI and save/reopen path appear to work. An arbitrary
9992
+ custom text format does not receive a guessed mutation. This diagnostic checks
9993
+ that output responds to changed input; it does not establish that the result
9994
+ has the correct application-specific meaning.
9995
+
9996
+ When a Block receives an upstream value and also stores user edits, checkpoint
9997
+ both the editable document and the upstream value that seeded it. Reopen edits
9998
+ only when the mounted upstream value still matches; otherwise apply the new
9999
+ upstream value and rerun the original application's render path. A model must
10000
+ not treat the application's `localStorage` as the host's project or placement
10001
+ state. If rendering is debounced or asynchronous, `mount` must wait for the
10002
+ new result (or a real error) before acknowledging success, and `execute` must
10003
+ read the completed original result rather than an old preview. Runtime review
10004
+ should vary the input after a saved edit to catch stale-result replay.
10005
+
10006
+ Exercise original export buttons under the exact runtime CSP as well as the
10007
+ declared adapter operations. Displaying SVG is weaker evidence than exporting
10008
+ PNG: embedded XHTML `foreignObject` labels can taint the canvas when that SVG
10009
+ is rasterized. An adapter may repair the original action with a bounded,
10010
+ reviewed conversion, but must compare the visible result and downloaded bytes.
10011
+ An operation that succeeds while the corresponding original control fails does
10012
+ not establish a preserved application interface. Clipboard actions require a
10013
+ separate approved capability and behavioral review.
10014
+
9623
10015
  `prepareBrowserApplicationMount` binds a mount request to the exact package,
9624
10016
  bundle, input and state revision. A mount acknowledgement carries no outputs and
9625
10017
  cannot pass execution validation.
@@ -9632,21 +10024,70 @@ current permission/state checks. `validateBrowserApplicationExecutionResult`
9632
10024
  and the saved-record validator check those bindings; their result explicitly
9633
10025
  keeps `independentlyVerified:false`. Arbitrary callers can fabricate JSON, so
9634
10026
  these pure helpers do not authenticate evidence or authorize adoption.
10027
+ An application package must declare at least one typed output, and each
10028
+ completed operation must actually return at least one declared output even if
10029
+ the port is optional. A nonempty value can still be semantically wrong; review
10030
+ must compare representative saved and exported results with the original app.
9635
10031
 
9636
10032
  `runBrowserApplication` requires an explicitly supplied trusted executor. It
9637
10033
  never falls back to evaluating source in the host or treating a mounted page as
9638
10034
  success. Cancellation and timeout signal the executor; actual process/resource
9639
10035
  termination is the executor's responsibility and needs independent verification.
9640
10036
 
10037
+ ### Media output candidates
10038
+
10039
+ An adapter exporting an `image` port returns actual PNG bytes as
10040
+ `{encoding:"base64",mimeType:"image/png",data:"..."}`. It must never return an
10041
+ `assetId`, `versionId`, URL or receipt of its own. The worker checks the shape
10042
+ and keeps the result an **untrusted candidate**. The host-side
10043
+ `materializeBrowserApplicationOutputs` boundary decodes and checks the image,
10044
+ writes it through trusted storage, reads back the exact bytes, checks the current
10045
+ execution revision again, and only then creates the typed image reference that
10046
+ Revolver can carry. Other media types still require materializers. The local
10047
+ worker, browser-control pipe and guest output envelope now each accept a
10048
+ bounded 4 MiB PNG after base64 encoding inside an 8 MiB frame; the session
10049
+ traffic cap is 32 MiB. Inputs and saved state retain their smaller limits.
10050
+ Large candidate transport was checked offline across those layers, while
10051
+ miniPaint's real PNG was separately decoded and materialized. A durable S3
10052
+ output adapter exists but is not wired into installed production execution.
10053
+ Installed image executions now reserve an 8 MiB aggregate maximum in the
10054
+ server-owned ledger before dispatch, under the account-wide lock. The
10055
+ reservation is compared with the account's storage-plan allotment and remains
10056
+ charged if dispatch becomes uncertain. A reservation proven never dispatched
10057
+ can be closed without consuming capacity. A completed run records verified
10058
+ stored bytes. This ledger measures application outputs separately from other
10059
+ project media; output deletion and plan-wide reconciliation still need the
10060
+ production lifecycle before enabling installed image exports.
10061
+ The desktop session now accepts a host-only `store.materializeOutputs` callback
10062
+ between isolated execution and completion. It rejects guest-minted image asset
10063
+ IDs before that callback, supplies the exact request and current authority
10064
+ binding, rechecks access afterward, and accepts only a valid typed result.
10065
+ The manager forwards this callback from trusted main-process composition; a
10066
+ real PNG was tested through decode, write, readback and receipt validation,
10067
+ including revocation after storage read. The installed HTTP host does not yet
10068
+ supply a media store, so this is a supported host boundary, not a production
10069
+ image export claim. Candidate review also lacks that store today.
10070
+
9641
10071
  ### Guest registration
9642
10072
 
9643
- `installBrowserApplicationGuest({target,operations,messageBytes})` is the
10073
+ `installBrowserApplicationGuest({target,operations,messageBytes,outputBytes})` is the
9644
10074
  framework-neutral lifecycle dispatcher for a trusted bootstrap. It installs only
9645
10075
  `target.stillmadeApplication.register(adapter)` and returns a separate controller
9646
- to that bootstrap. It does not install a runtime or grant host access.
10076
+ to that bootstrap. The host may select a larger output-only envelope up to
10077
+ 8 MiB; the ordinary message limit still applies to inputs and saved state.
10078
+ It does not install a runtime or grant host access.
9647
10079
 
9648
10080
  The Block-owned adapter registers exactly these four methods once:
9649
10081
 
10082
+ For a new application with several export choices, each bundle operation maps
10083
+ to the output ports it actually produces, for example
10084
+ `{id:"png.export",kind:"export",outputs:["png"]}`. Ports absent from some
10085
+ operations must declare `required:false` in the shared manifest. The host
10086
+ requires every mapped operation to return exactly its listed ports before
10087
+ materializing media or committing a completion. Older bundles with only
10088
+ `{id,kind}` retain their original contract; the new mapping is additive and
10089
+ does not change published package bytes.
10090
+
9650
10091
  | Method | Adapter result |
9651
10092
  | --- | --- |
9652
10093
  | `mount({inputs,state,signal})` | Restore the original UI and return exactly `{mounted:true}`. |
@@ -9690,6 +10131,14 @@ Method Draw is being used to study the first complete static editor route.
9690
10131
  Its remote fonts, global localStorage and SVG import behavior require explicit
9691
10132
  adaptation; an original-page baseline is not a completed Block integration.
9692
10133
 
10134
+ The worker now has a separate **candidate-review** stage identity for an
10135
+ unlisted, digest-verified browser package. Its driver and unit entry are selected
10136
+ by trusted code, while the installed supervisor and runner retain the exact
10137
+ reviewed-source registry. This is the source boundary needed to test generated
10138
+ adapters without editing a per-repository allowlist. A root-owned review
10139
+ supervisor, complete behavior gate, and admission-to-install handoff are still
10140
+ missing; staging a candidate does not run or install it.
10141
+
9693
10142
  ### Reproduce the reviewed package outside the repository
9694
10143
 
9695
10144
  The downloadable SDK zip includes `packages/block-sdk/browser-application.js`
@@ -10387,7 +10836,9 @@ copyright holders, repository commits or permission. Unresolved rights produce a
10387
10836
  blocked result. Never silently license someone else's source.
10388
10837
 
10389
10838
  Remixing is enabled by default. An explicit `remixPolicy` must permit remixing
10390
- and must not set `sourceInspection: "no"`. Omit optional settings when defaults
10839
+ and must not set `sourceInspection: "no"`. A Block's code is private to its creator: no one else views or downloads it,
10840
+ and others change it only by describing changes to StillMade's AI builder.
10841
+ Omit optional settings when defaults
10391
10842
  are sufficient. The host creates the new identity, preserves the parent digest,
10392
10843
  source and notices, and presents the ordinary builder. Creators need no extra
10393
10844
  StillMade instructions. Project Edit retains compatible inputs and saved state;
@@ -10409,8 +10860,9 @@ remixable merely by adding metadata: they need an independent SDK implementation
10409
10860
  ### In StillMade
10410
10861
 
10411
10862
  Choose **Remix Block** on an exact public Block version, or **Remix this version**
10412
- in Marketplace. Sign in, review its source, license and declared permissions,
10413
- then confirm **Remix Block**. StillMade saves an account draft and opens Create.
10863
+ in Marketplace. Sign in, review its license and declared permissions, then
10864
+ confirm **Remix Block**. The code is never shown or downloadable; describe the
10865
+ change you want and StillMade's AI builder makes it. StillMade saves an account draft and opens Create.
10414
10866
  Nothing is installed, published, executed or charged by creating the draft.
10415
10867
  AI refinement edits the implementation, controls and fixtures while the host
10416
10868
  retains and restores immutable source evidence and ancestry. Evidence is not
@@ -10418,7 +10870,10 @@ charged against the editable-source prompt limit; the package size limit still
10418
10870
  applies. The resulting local Block receives the same admission checks as a
10419
10871
  portable artifact.
10420
10872
  The Versions tab shows ancestry and retained notices. Publishing the edited
10421
- Block requires the normal validation, visibility choice and rights confirmation.
10873
+ Block requires the normal validation and rights confirmation. A remix of someone
10874
+ else's Block is released as a Block owned by the original creator, who keeps its
10875
+ code and earns from it; the remixer is credited and can use it right away. A
10876
+ remix is always available by link, never private.
10422
10877
  Public Block pages link to paginated newest and top remixes of that exact version.
10423
10878
  Top uses qualified production account counts for a 30-day window, hidden below
10424
10879
  ten accounts and rounded down to tens. Both views fall back to newest when
@@ -10537,13 +10992,13 @@ host-coupled workspaces retain their existing restrictions.
10537
10992
  - No payments, ancestor revenue allocation or provider dispatch during remix.
10538
10993
 
10539
10994
 
10540
- ### Public source inspection
10995
+ ### Code stays private
10541
10996
 
10542
- Source inspection settings on existing releases remain subject to their original
10543
- access controls. For new Block admission, `sourceInspection: "no"` is rejected.
10544
- Use `yes`, a supported `license-controlled` setting, or omit the field. Account
10545
- and team visibility still determine who may retrieve a private package; remix
10546
- support does not make private source public.
10997
+ A Block's code is private to its creator. Nobody else can view or download it:
10998
+ public pages, Marketplace and remixes never show it, and the source download
10999
+ works only for its creator and StillMade admins. An older `sourceInspection: "no"`
11000
+ still keeps that Block's releases private and its remix action off. Account and team visibility still determine who may use a
11001
+ private package.
10547
11002
 
10548
11003
  A source-access choice cannot replace legal evidence or revoke upstream rights.
10549
11004
  Existing immutable releases keep their established pins and access. Newly finished
@@ -10552,7 +11007,7 @@ versions must pass the required remix, license and normal admission checks.
10552
11007
 
10553
11008
  ## Portable packages and repository adaptation
10554
11009
 
10555
- Every finished Block must support automatic remixing through the standard SDK contract. Include complete editable runtime source/configuration, typed inputs/outputs, UI controls, fixtures, and a supported permissive manifest.license with its complete real copyright/license notice in manifest.provenance.notice (or verified portable evidence). Do not disable remixing or source inspection. No custom remix endpoint or host callback is needed. Preserve inherited source, notices and lineage. Never invent ownership, copyright holders or permission, or apply a new license to unresolved third-party source; return unsupported with a clear licensing reason instead. The shared SDK admission validator enforces this requirement.
11010
+ Every finished Block must support automatic remixing through the standard SDK contract. Include complete editable runtime source/configuration, typed inputs/outputs, UI controls, fixtures, and a supported permissive manifest.license with its complete real copyright/license notice in manifest.provenance.notice (or verified portable evidence). Do not disable remixing. The code stays private to its creator; others remix only through StillMade’s AI builder. No custom remix endpoint or host callback is needed. Preserve inherited source, notices and lineage. Never invent ownership, copyright holders or permission, or apply a new license to unresolved third-party source; return unsupported with a clear licensing reason instead. The shared SDK admission validator enforces this requirement.
10556
11011
  ### Understand StillMade and its Block ecosystem
10557
11012
 
10558
11013
  StillMade AI is an AI-assisted platform where people make things by using and
@@ -10770,9 +11225,10 @@ of the SDK URL the user supplied, not a guessed production hostname or localhost
10770
11225
  - Search `/api/public-listings/discover?kind=block&search=<encoded-query>` for
10771
11226
  Blocks, or use `kind=type` for Project Types. Follow `nextCursor` with `after`
10772
11227
  when more results are relevant; a single page is not the complete catalog.
10773
- - Use returned listing identities and versions to inspect
10774
- `/api/public-listings/<kind>/<id>/<version>/source.json` where source inspection
10775
- is permitted. Read the real manifest and any declared dependency packages.
11228
+ - Use returned listing identities and versions to read
11229
+ `/api/public-listings/<kind>/<id>/<version>/metadata.json`: its name, description
11230
+ and typed inputs and outputs. A Block's code is private to its creator, so build
11231
+ on what it takes and makes, never on its source.
10776
11232
  - In an offline SDK checkout, `packages/block-platform/catalog.js` provides bundled
10777
11233
  first-party examples. It is a snapshot, not the complete live Marketplace.
10778
11234
 
@@ -11268,7 +11724,7 @@ Capability Blocks (`image.generate`, `video.generate`, `audio.music`, `audio.sfx
11268
11724
  | `seedance-2.0-fast` | Seedance 2.0 Fast | 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | 480p, 720p | auto, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | yes | yes | yes |
11269
11725
  | `seedance-2.0-mini` | Seedance 2.0 Mini | 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | 480p, 720p | auto, 21:9, 16:9, 4:3, 1:1, 3:4, 9:16 | yes | yes | yes |
11270
11726
  | `kling-v3-turbo` | Kling 3.0 Turbo | 5, 10 | model default | 16:9, 9:16, 1:1 | yes | no | no |
11271
- | `wan-2.6-flash` | Wan 2.6 Flash | 3, 4, 5 | model default | 16:9, 9:16, 1:1 | yes | no | no |
11727
+ | `wan-2.6-flash` | Wan 2.6 Flash | 3, 4, 5 | model default | 16:9, 9:16, 1:1 | required | no | no |
11272
11728
  | `veo-3.1-lite` | Veo 3.1 Lite | 4, 6, 8 | 720p, 1080p | 16:9, 9:16 | yes | yes | yes |
11273
11729
  | `vidu-q3-turbo` | Vidu Q3 Turbo | 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16 | model default | model default | yes | yes | yes |
11274
11730
  | `wan-2.7` | Wan 2.7 | 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15 | 720p, 1080p | model default | required | yes | no |
@@ -11410,6 +11866,8 @@ The latest version of each Block bundled with the SDK, generated from the packag
11410
11866
 
11411
11867
  | Block | Name | Kind | Inputs | Outputs |
11412
11868
  | --- | --- | --- | --- | --- |
11869
+ | `sm.ai-decide` 1.0.0 | AI decide | task | `data` text (external_data) · primary; `rules` text (decision_rules) | `decision` object (ai_decision) · primary |
11870
+ | `sm.ai-write` 1.0.0 | AI write | task | `data` text (external_data) · primary; `instructions` text (writing_instructions) | `text` text (written_message) · primary |
11413
11871
  | `sm.animated-scene` 2.3.8 | Animated Scene | workspace | `animation` scene-document (animated_scene_document) · project context only · primary; `shotPlan` shot-plan (production_shot_plan) · project context only; `updatedAnimation` scene-document (animated_scene_document); `commit` boolean (apply_changes); `generatedImage` image (image); `targetShotId` text (target_shot); `targetLayerId` text (target_layer); `attachGeneratedImage` boolean (attach_image); `action` text (animated_scene_action); `versions` metadata[] (revision_history) · project context only; `presence` metadata[] (collaborator_presence); `assets` asset[] (project_media) · project context only | `animation` scene-document (animated_scene_document) · primary; `edit` workspace-edit (workspace_edit); `qualityAction` approval (portable_media_action); `renderAction` approval (portable_media_action); `qualityReport` metadata (quality_report); `editorTimeline` timeline (editor_handoff); `revision` metadata (revision_event) |
11414
11872
  | `sm.animated-scene-assistant` 1.0.0 | Plan Animated Scene | task | `animation` scene-document · project context only; `request` text · primary | `edit` workspace-edit · primary |
11415
11873
  | `sm.blueprint` 2.1.9 | Blueprint | workspace | `blueprint` bible (production_blueprint) · project context only · primary; `updatedBlueprint` bible (production_blueprint); `commit` boolean (apply_changes); `assistantEdit` workspace-edit (workspace_edit); `versions` metadata[] (revision_history) · project context only; `presence` metadata[] (collaborator_presence); `assets` asset[] (project_media) · project context only | `blueprint` bible (production_blueprint) · primary; `edit` workspace-edit (workspace_edit); `shotPlan` shot-plan (shot_plan_handoff); `revision` metadata (revision_event) |
@@ -11419,6 +11877,9 @@ The latest version of each Block bundled with the SDK, generated from the packag
11419
11877
  | `sm.character` 2.0.1 | Character reference | workspace | `input` text (character_description) · primary; `name` text (character_name); `role` text (character_role); `appearance` text (character_appearance); `personality` text (character_personality) | `output` character (character_reference) · primary |
11420
11878
  | `sm.chat` 2.0.3 | Production chat | workspace | `brief` brief (production_brief) · primary | `script` script (narration_script) · primary |
11421
11879
  | `sm.compare` 2.0.2 | Compare assets | workspace | `imageA` image (comparison_image_a) · primary; `imageB` image (comparison_image_b); `selection` text (comparison_selected_image); `position` integer (comparison_split_position) | `output` image (selected_comparison_image) · primary |
11880
+ | `sm.connect-app` 1.0.0 | Connect an app | task | `app` text (connected_app) · primary | `result` object (external_data) · primary |
11881
+ | `sm.contact-fields` 1.0.0 | Contact fields | task | `record` object (external_data) · primary | `email` text (contact_email) · primary; `first_name` text (contact_first_name); `last_name` text (contact_last_name); `full_name` text (contact_full_name); `phone` text (contact_phone); `company` text (contact_company); `city` text (contact_city); `other_answers` text (contact_other_answers) |
11882
+ | `sm.continue-if` 1.0.0 | Continue only if | task | `decision` object (ai_decision) · primary; `item` object (external_data); `minimum_score` integer (minimum_score) | `item` object (external_data) · primary |
11422
11883
  | `sm.describe-media` 2.0.1 | Describe media | task | `image` image (source_image) · primary | `description` text (visual_description) · primary |
11423
11884
  | `sm.edit-assistant` 2.0.2 | Edit Assistant | task | `timeline` timeline (timeline) · project context only · primary; `selection` timeline-range (timeline_range); `request` text (edit_request) | `edit` timeline-edit (timeline_edit_proposal) · primary |
11424
11885
  | `sm.editor` 2.2.12 | Editor | workspace | `editor` timeline (editor_timeline) · project context only · primary; `assets` asset[] (legacy.asset-list.assets) · project context only; `updatedEditor` timeline (legacy.timeline.updatededitor); `commit` boolean (legacy.boolean.commit); `action` text (legacy.text.action); `renderFps` integer (legacy.integer.renderfps); `renderResolution` integer (legacy.integer.renderresolution); `renderQuality` text (legacy.text.renderquality) | `editor` timeline (editor_timeline) · primary; `edit` workspace-edit (legacy.workspace-edit.edit); `mediaAction` approval (portable_media_action) |
@@ -11426,13 +11887,15 @@ The latest version of each Block bundled with the SDK, generated from the packag
11426
11887
  | `sm.export-timeline` 2.0.0 | Export timeline | editor-extension | `timeline` timeline · project context only · primary; `assets` asset[] · project context only; `blueprint` bible · project context only; `shotPlan` shot-plan · project context only; `metadata` metadata · project context only; `title` text; `format` text | `download` file-bundle · primary |
11427
11888
  | `sm.export-video` 2.0.0 | Export video | task | `input` timeline (timeline) · primary; `renderFps` text (render_fps); `renderResolution` text (render_resolution); `renderQuality` text (render_quality); `projectTimeline` timeline (timeline) · project context only | `mediaAction` approval (portable_media_action); `output` video (rendered_video) |
11428
11889
  | `sm.final-edit` 2.0.2 | AI Final Edit | task | `timeline` timeline (timeline) · project context only · primary; `direction` text (edit_direction) | `edit` timeline-edit (timeline_edit_proposal) · primary |
11429
- | `sm.generate-image` 2.0.0 | Generate image | task | `input` text · primary | `output` image · primary |
11890
+ | `sm.generate-image` 2.1.0 | Generate image | task | `input` text · primary; `photos` image[] (reference_image) | `output` image · primary |
11430
11891
  | `sm.generate-video` 2.0.1 | Generate video | task | `prompt` brief (video_generation_brief) · primary | `video` video (generated_video) · primary |
11431
11892
  | `sm.grade` 2.0.2 | Color grade | editor-extension | `timeline` timeline (editor_timeline) · project context only · primary; `clipIds` text[] (timeline_clip_ids); `look` text (color_grade_look); `adjustments` json (color_grade_adjustments) | `edit` timeline-edit (timeline_edit) · primary |
11432
11893
  | `sm.image-editor` 2.0.1 | Image editor | workspace | `input` image (source_image) · primary; `brightness` number (brightness_adjustment); `contrast` number (contrast_adjustment) | `output` image (processed_image) · primary |
11433
11894
  | `sm.import-media` 2.0.2 | Import media | task | `files` asset[] (legacy.asset-list.files) · primary; `include` text (legacy.text.include); `duplicates` text (legacy.text.duplicates) | `assets` asset[] (legacy.asset-list.assets) · primary |
11434
11895
  | `sm.location` 2.0.1 | Location reference | workspace | `input` text (location_description) · primary; `name` text (location_name); `visualDetails` text (location_visual_details); `timeOfDay` text (location_time); `atmosphere` text (location_atmosphere) | `output` location (location_reference) · primary |
11896
+ | `sm.meta-creative` 1.0.0 | Meta ad creative | task | `upload` object (external_data) · primary; `message` text (ad_primary_text); `website_url` text (ad_destination_url); `page_id` text (facebook_page_id); `call_to_action` text (ad_call_to_action) | `creative` object (meta_ad_creative) · primary |
11435
11897
  | `sm.motion-graphics` 2.0.0 | Motion graphics | editor-extension | `timeline` timeline (timeline) · primary; `projectTimeline` timeline (timeline) · project context only; `plan` json (motion_graphics_plan) | `timeline` timeline (timeline) · primary; `edit` workspace-edit (editor_workspace_edit) |
11898
+ | `sm.new-items` 1.0.0 | Only new items | task | `items` object (external_data) · primary; `id_field` text (item_id_field) | `item` object (external_data) · primary; `waiting` integer (pending_item_count) |
11436
11899
  | `sm.panel-strip` 2.3.7 | Image Panels | workspace | `panels` panel-document (image_panel_document) · project context only · primary; `transcript` transcript (timed_transcript) · project context only; `script` script (narration_script) · project context only; `blueprint` bible (production_blueprint) · project context only; `updatedPanels` panel-document (image_panel_document); `commit` boolean (apply_changes); `generatedImage` image (image); `targetPanelId` text (panel_id); `attachGeneratedImage` boolean (boolean); `action` text (host_action); `stockQuery` text (stock_query); `generatedImages` image[] (image_list) | `panels` panel-document (image_panel_document) · primary; `edit` workspace-edit (workspace_edit); `stockAction` approval (portable_media_action); `qualityAction` approval (portable_media_action); `renderAction` approval (portable_media_action); `stockAsset` asset (licensed_asset); `stockImage` image (licensed_stock_image); `qualityReport` metadata (quality_report); `generationPlan` metadata (generation_plan); `generateAction` approval (portable_media_action); `generatedImage` image (generated_image); `batchGenerateAction` approval (portable_media_action); `generatedImages` image[] (generated_image_list) |
11437
11900
  | `sm.pipeline` 2.2.5 | Canvas | workspace | `canvas` pipeline (canvas_document) · project context only · primary; `assets` asset[] (project_assets) · project context only; `versions` metadata[] (asset_versions) · project context only; `updatedCanvas` pipeline (canvas_document); `commit` boolean (canvas_commit_intent); `generatedImage` image (generated_image_version); `addGeneratedImage` boolean (attach_generated_image); `generatedImageTitle` text (generated_image_title); `generatedVideo` video (generated_video_version); `addGeneratedVideo` boolean (attach_generated_video); `generatedVideoTitle` text (generated_video_title); `generatedAudio` audio (generated_audio_version); `addGeneratedAudio` boolean (attach_generated_audio); `generatedAudioTitle` text (generated_audio_title); `connectionProposal` json (context_connection_proposal); `applyContextConnections` boolean (context_connection_intent) | `canvas` pipeline (canvas_document) · primary; `edit` workspace-edit (canvas_edit_proposal) |
11438
11901
  | `sm.quality-audit` 1.0.2 | Quality review plan | task | `assets` asset[] (saved_asset_versions) · project context only · primary | `plan` metadata (visual_quality_review_plan) · primary |
@@ -11448,14 +11911,16 @@ The latest version of each Block bundled with the SDK, generated from the packag
11448
11911
  | `sm.transcribe` 2.0.1 | Transcription | task | `audio` audio (source_audio) · primary; `language` text (transcription_language) | `transcript` transcript (transcript_text) · primary |
11449
11912
  | `sm.transition` 2.0.2 | Transition | editor-extension | `timeline` timeline (editor_timeline) · project context only · primary; `clipIds` text[] (timeline_clip_ids); `transition` text (timeline_transition_type); `duration` number (timeline_transition_duration); `soundOn` boolean (timeline_transition_sound_enabled); `soundId` text (timeline_transition_sound_id) | `edit` timeline-edit (timeline_edit) · primary |
11450
11913
  | `sm.video-assets` 2.1.4 | Video Assets | workspace | `assets` asset[] (media_collection) · project context only · primary; `versions` metadata[] (media_version_history) · project context only; `incoming` asset[] (media_collection); `kind` text (media_filter); `selectedIds` text (media_selection); `selectedVersions` text (media_version_selection) | `output` asset[] (production_media) · primary |
11451
- | `sm.voiceover` 2.1.4 | Voiceover | workspace | `input` script (narration_script) · primary; `take` audio (narration_audio); `library` asset[] (project_media) · project context only; `timing` transcript (timed_transcript) · project context only | `output` audio (narration_audio) · primary |
11914
+ | `sm.voiceover` 2.1.6 | Voiceover | workspace | `input` script (narration_script) · primary; `take` audio (narration_audio); `library` asset[] (project_media) · project context only; `timing` transcript (timed_transcript) · project context only | `output` audio (narration_audio) · primary |
11915
+ | `sm.when` 1.0.0 | When | task | `event` object (workflow_event) | `trigger` object (automation_trigger) · primary |
11452
11916
  | `sm.whiteboard-assistant` 1.0.0 | Build Whiteboard | task | `board` board-document · project context only; `request` text · primary | `edit` workspace-edit · primary |
11917
+ | `sm.write-summary` 1.0.0 | Write summary | task | `data` text (external_data) · primary | `summary` text (summary_report) · primary |
11453
11918
  | `sm.youtube` 2.0.0 | YouTube publication | task | `video` video (finished_video) · primary; `title` text; `description` text; `tags` text; `visibility` text; `publishAt` text; `madeForKids` boolean; `aiGenerated` boolean | `uploadAction` approval (portable_media_action); `publication` json (youtube_publication) |
11454
- | `stillmade.occasion-story` 1.0.1 | Occasion Story | task | `assets` asset[] (legacy.asset-list.assets) · primary; `occasion` text (stillmade.occasion_story.occasion); `title` text (stillmade.occasion_story.title); `ending` text (stillmade.occasion_story.ending); `notes` text (stillmade.occasion_story.notes); `selections` text (stillmade.occasion_story.selections); `music` audio[] (stillmade.occasion_story.music); `musicVolume` number (stillmade.occasion_story.musicvolume); `muteVideoAudio` boolean (stillmade.occasion_story.mutevideoaudio); `aspect` text (stillmade.occasion_story.aspect); `disclosure` text (stillmade.occasion_story.disclosure); `rightsConfirmed` boolean (stillmade.occasion_story.rightsconfirmed) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.occasion_story.review) |
11455
- | `stillmade.photo-reel-composer` 1.0.0 | Photo Reel Composer | task | `assets` asset[] (legacy.asset-list.assets) · primary; `purpose` text (stillmade.photo_reel.purpose); `title` text (stillmade.photo_reel.title); `captions` text (stillmade.photo_reel.captions); `cta` text (stillmade.photo_reel.cta); `contact` text (stillmade.photo_reel.contact); `demoDisclosure` text (stillmade.photo_reel.demodisclosure); `duration` number (stillmade.photo_reel.duration); `aspect` text (stillmade.photo_reel.aspect); `logo` asset[] (stillmade.photo_reel.logo); `music` asset[] (stillmade.photo_reel.music); `rightsConfirmed` boolean (stillmade.photo_reel.rightsconfirmed) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.photo_reel.review); `provenance` json (stillmade.photo_reel.provenance) |
11919
+ | `stillmade.occasion-story` 1.0.2 | Occasion Story | task | `assets` asset[] (legacy.asset-list.assets) · primary; `occasion` text (stillmade.occasion_story.occasion); `title` text (stillmade.occasion_story.title); `ending` text (stillmade.occasion_story.ending); `notes` text (stillmade.occasion_story.notes); `selections` text (stillmade.occasion_story.selections); `music` audio[] (stillmade.occasion_story.music); `musicVolume` number (stillmade.occasion_story.musicvolume); `muteVideoAudio` boolean (stillmade.occasion_story.mutevideoaudio); `aspect` text (stillmade.occasion_story.aspect); `disclosure` text (stillmade.occasion_story.disclosure) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.occasion_story.review) |
11920
+ | `stillmade.photo-reel-composer` 1.0.1 | Photo Reel Composer | task | `assets` asset[] (legacy.asset-list.assets) · primary; `purpose` text (stillmade.photo_reel.purpose); `title` text (stillmade.photo_reel.title); `captions` text (stillmade.photo_reel.captions); `cta` text (stillmade.photo_reel.cta); `contact` text (stillmade.photo_reel.contact); `demoDisclosure` text (stillmade.photo_reel.demodisclosure); `duration` number (stillmade.photo_reel.duration); `aspect` text (stillmade.photo_reel.aspect); `logo` asset[] (stillmade.photo_reel.logo); `music` asset[] (stillmade.photo_reel.music) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.photo_reel.review); `provenance` json (stillmade.photo_reel.provenance) |
11456
11921
  | `stillmade.product-ad-variants` 1.0.0 | Product Ad Variants | task | `timeline` timeline (legacy.timeline.updatededitor) · primary; `hookA` text (stillmade.product_ad_variants.hooka); `hookB` text (stillmade.product_ad_variants.hookb); `hookC` text (stillmade.product_ad_variants.hookc); `openingA` number (stillmade.product_ad_variants.openinga); `openingB` number (stillmade.product_ad_variants.openingb); `openingC` number (stillmade.product_ad_variants.openingc); `openingDuration` number (stillmade.product_ad_variants.openingduration); `copyApproved` boolean (stillmade.product_ad_variants.copyapproved) | `variantA` timeline (legacy.timeline.updatededitor) · primary; `variantB` timeline (legacy.timeline.updatededitor); `variantC` timeline (legacy.timeline.updatededitor); `review` json (stillmade.product_ad_variants.review) |
11457
- | `stillmade.release-visuals` 1.0.1 | Release Visuals | task | `assets` asset[] (legacy.asset-list.assets) · primary; `purpose` text (stillmade.release_visuals.purpose); `title` text (stillmade.release_visuals.title); `artist` text (stillmade.release_visuals.artist); `cta` text (stillmade.release_visuals.cta); `duration` number (stillmade.release_visuals.duration); `songVolume` number (stillmade.release_visuals.songvolume); `offset` number (stillmade.release_visuals.offset); `lyrics` text (stillmade.release_visuals.lyrics); `aspect` text (stillmade.release_visuals.aspect); `disclosure` text (stillmade.release_visuals.disclosure); `rightsConfirmed` boolean (stillmade.release_visuals.rightsconfirmed) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.release_visuals.review) |
11458
- | `stillmade.short-form-finish` 1.0.2 | Short-form Finish | task | `assets` video[] (legacy.asset-list.assets) · primary; `music` audio[] (legacy.asset-list.assets); `audioMode` text (stillmade.short_form.audiomode); `speechVolume` number (stillmade.short_form.speechvolume); `purpose` text (stillmade.short_form.purpose); `cuts` text (stillmade.short_form.cuts); `subtitles` text (stillmade.short_form.subtitles); `title` text (stillmade.short_form.title); `byline` text (stillmade.short_form.byline); `cta` text (stillmade.short_form.cta); `disclosure` text (stillmade.short_form.disclosure); `captionStyle` text (stillmade.short_form.captionstyle); `aspect` text (stillmade.short_form.aspect); `fit` text (stillmade.short_form.fit); `cropX` number (stillmade.short_form.cropx); `rightsConfirmed` boolean (stillmade.short_form.rightsconfirmed) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.short_form.review) |
11922
+ | `stillmade.release-visuals` 1.0.2 | Release Visuals | task | `assets` asset[] (legacy.asset-list.assets) · primary; `purpose` text (stillmade.release_visuals.purpose); `title` text (stillmade.release_visuals.title); `artist` text (stillmade.release_visuals.artist); `cta` text (stillmade.release_visuals.cta); `duration` number (stillmade.release_visuals.duration); `songVolume` number (stillmade.release_visuals.songvolume); `offset` number (stillmade.release_visuals.offset); `lyrics` text (stillmade.release_visuals.lyrics); `aspect` text (stillmade.release_visuals.aspect); `disclosure` text (stillmade.release_visuals.disclosure) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.release_visuals.review) |
11923
+ | `stillmade.short-form-finish` 1.0.3 | Short-form Finish | task | `assets` video[] (legacy.asset-list.assets) · primary; `music` audio[] (legacy.asset-list.assets); `audioMode` text (stillmade.short_form.audiomode); `speechVolume` number (stillmade.short_form.speechvolume); `purpose` text (stillmade.short_form.purpose); `cuts` text (stillmade.short_form.cuts); `subtitles` text (stillmade.short_form.subtitles); `title` text (stillmade.short_form.title); `byline` text (stillmade.short_form.byline); `cta` text (stillmade.short_form.cta); `disclosure` text (stillmade.short_form.disclosure); `captionStyle` text (stillmade.short_form.captionstyle); `aspect` text (stillmade.short_form.aspect); `fit` text (stillmade.short_form.fit); `cropX` number (stillmade.short_form.cropx) | `timeline` timeline (legacy.timeline.updatededitor) · primary; `review` json (stillmade.short_form.review) |
11459
11924
 
11460
11925
  ## Custom view rules
11461
11926