cueframe 0.9.4 → 0.11.3

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 (51) hide show
  1. package/README.md +39 -30
  2. package/dist/analyze-C3MSCON6.js +2 -0
  3. package/dist/chunk-OAJBHFAJ.js +18 -0
  4. package/dist/cueframe.js +55 -54
  5. package/dist/skills/add-music-bed/SKILL.md +5 -23
  6. package/dist/skills/brand-reel/SKILL.md +5 -28
  7. package/dist/skills/clip-a-talking-head/SKILL.md +2 -20
  8. package/dist/skills/composing-video/SKILL.md +36 -424
  9. package/dist/skills/composing-video/references/acceptance-template.md +21 -0
  10. package/dist/skills/composing-video/references/audio-design.md +125 -0
  11. package/dist/skills/composing-video/references/card-and-motion-runtime.md +49 -0
  12. package/dist/skills/composing-video/references/craft-principles.md +25 -0
  13. package/dist/skills/composing-video/references/film-planning.md +37 -0
  14. package/dist/skills/composing-video/references/format-decisions.md +17 -0
  15. package/dist/skills/composing-video/references/format-playbooks.md +96 -0
  16. package/dist/skills/composing-video/references/motion-design.md +25 -0
  17. package/dist/skills/composing-video/references/project-policy.md +18 -0
  18. package/dist/skills/composing-video/references/sfx-pack.md +69 -0
  19. package/dist/skills/composing-video/references/sound-and-timing.md +15 -0
  20. package/dist/skills/composing-video/references/tool-map.md +43 -0
  21. package/dist/skills/cueframe-brand-demo/SKILL.md +2 -8
  22. package/dist/skills/cueframe-cli/SKILL.md +73 -59
  23. package/dist/skills/cueframe-component-authoring/SKILL.md +20 -169
  24. package/dist/skills/cueframe-component-authoring/references/authoring-paths.md +72 -0
  25. package/dist/skills/cueframe-component-authoring/references/forking-and-layout.md +35 -0
  26. package/dist/skills/cueframe-component-authoring/references/native-component-workflows.md +98 -0
  27. package/dist/skills/cueframe-component-authoring/references/native-source-contract.md +54 -0
  28. package/dist/skills/cueframe-component-authoring/references/parented-device-card.json +13 -0
  29. package/dist/skills/cueframe-component-authoring/references/parented-motion.md +25 -0
  30. package/dist/skills/cueframe-component-authoring/references/retired-projects.md +26 -0
  31. package/dist/skills/cueframe-compose-loop/SKILL.md +14 -112
  32. package/dist/skills/cueframe-compose-loop/references/convergence-loop.md +128 -0
  33. package/dist/skills/cueframe-compose-loop/references/preview-workflow.md +7 -3
  34. package/dist/skills/cueframe-connect/SKILL.md +4 -9
  35. package/dist/skills/cueframe-connect/references/tools.md +146 -0
  36. package/dist/skills/cueframe-product-video/SKILL.md +9 -14
  37. package/dist/skills/cueframe-reference-video/SKILL.md +30 -0
  38. package/dist/skills/cueframe-reference-video/references/measurement-and-comparison.md +45 -0
  39. package/dist/skills/cueframe-reference-video/scripts/motion-grid.sh +116 -0
  40. package/dist/skills/cueframe-scene-shot/SKILL.md +2 -8
  41. package/dist/skills/cueframe-storyboard/SKILL.md +1 -7
  42. package/dist/skills/every-format-from-one-edit/SKILL.md +3 -19
  43. package/dist/skills/extracting-brand-kits/SKILL.md +1 -7
  44. package/dist/skills/launch-video/SKILL.md +6 -26
  45. package/dist/skills/make-a-social-reel/SKILL.md +7 -26
  46. package/dist/skills/rebrand-a-video/SKILL.md +2 -19
  47. package/dist/skills/video-craft-standards/SKILL.md +20 -103
  48. package/dist/skills/video-craft-standards/references/format-standards.md +118 -0
  49. package/package.json +12 -11
  50. package/dist/analyze-XP2BESVX.js +0 -2
  51. package/dist/chunk-RSOHINDT.js +0 -18
@@ -0,0 +1,98 @@
1
+ # Native component workflows
2
+
3
+ Choose the path exposed by the current host. Request schemas and the Component Contract own exact fields; these examples explain source and placement identity.
4
+
5
+ ## Path A — MCP agent (no filesystem; source lives server-side)
6
+
7
+ Use the live tool schema for request envelopes; hosted write fields are normally under `body`. When `get_composition` advertises `clipIds` and `response`, use selected clip IDs with `response:"full"` to retrieve the complete sources you need without pulling every large HTML body. Treat a projection as a partial read, never a replacement composition. Compact apply receipts retain the saved revision and warnings; reread relevant state before a dependent edit. Desktop surfaces may expose different fields.
8
+
9
+ 1. **Discover and read a built-in:** call `list_catalog` with
10
+ `projection: "component-library", origin: "builtin", libraryKind: "definition"`.
11
+ Select the intended card and preserve its complete scoped source reference. Call
12
+ `get_component_source` with that reference's `componentId`, `sourceVersionId`,
13
+ `builtinCollection` (its scope collection).
14
+ ID-only builtin reads are unsupported. An unavailable exact pin is a refusal; never
15
+ retry another scope or an unpinned head.
16
+ 2. **Author/own it:** edit the complete native `sourceSnapshot`; use your chosen owned ID
17
+ consistently in its `componentId` and the request. Send it as `body.source` to
18
+ `create_component`, with required metadata. Preserve its definition, capability
19
+ declarations, manifest and source format. For an existing component, keep its ID and
20
+ use `update_component` with the complete source. Do not send an old pin as the identity
21
+ of changed source: saving produces a new immutable source version.
22
+ 3. **Iterate (author→preview→fix):** `preview_component({ componentId, params })` queues a durable
23
+ preview and returns a `jobId`; call `wait_job(kind:"preview")`. The typed terminal result is a
24
+ verified artifact produced by the same bundle contract used by final render. A failed
25
+ `component_does_not_compile` job carries the compiler error — read it, fix via `update_component`
26
+ (same id, in place), and preview again.
27
+ **Adopt the source in the requested scope:** publication leaves existing placements pinned
28
+ to their previous versions; `placementsPinnedToPrevious` reports those uses. Source publication
29
+ plus placement adoption is not an atomic source-write operation. Read the current composition
30
+ and `describe_composition_ops`, then use the admitted `component.repin-v3` operation with complete
31
+ before/after execution references and the observed exact composition revision. Its historical
32
+ name also covers supported version-4 execution references. Preserve unrelated placements and
33
+ parameters. An unavailable placement capability is a refusal, not permission to bypass source
34
+ admission or substitute an unpinned head. Reinspect the adopted source in the saved timeline.
35
+ Set preview duration deliberately: `durationInFrames` is not a trim window and can retime
36
+ duration-dependent motion. Preserve production timing; inspect the live tool's request shape.
37
+ 4. **Check integration:** add it as a `{kind:'component', componentId, props:{},
38
+ execution:{version:4,componentId,sourceVersionId,params,seed,assets}, placement:{version:3,kind:'clip'}}` clip
39
+ (`apply_composition`), then inspect saved-composition stills or a scoped `preview_clip` for
40
+ placement and motion. Use `create_render` → `wait_job kind:"render"` when delivering a
41
+ finished MP4, not per tweak.
42
+
43
+ ## Path B — CLI / coding agent (customer-owned source under git)
44
+
45
+ Source lives in `cueframe/components/<id>/` (the `cueframe.json` workspace); edit the native
46
+ template locally, push to render.
47
+
48
+ ```bash
49
+ npx -y cueframe@0.11 init --json # scaffold cueframe.json + cueframe/components/
50
+ npx -y cueframe@0.11 new component my-badge --category ui-blocks --json # scaffold a component in the workspace
51
+ # New scaffolds contain template.html and definition.json (native source, version 4).
52
+ # …edit cueframe/components/<id>/template.html and definition.json in your editor…
53
+ npx -y cueframe@0.11 push my-badge --json # send the native source; the server admits it
54
+ # or: npx -y cueframe@0.11 sync --json # push every component in the workspace
55
+ # reference the component id in your composition, then render:
56
+ npx -y cueframe@0.11 render <projectId> -o ./out.mp4 --json
57
+ ```
58
+
59
+ The CLI writes `template.html` and `definition.json` (input schema, defaults, timing and
60
+ capabilities). `cueframe.json` → `components.<id>` holds the version-4 `manifest` and the catalog
61
+ `name` and `category`, which `push` requires; it refuses a component missing either.
62
+ `push`/`sync` send these as one native `source`, checked against the contract's source schema;
63
+ the server's admission (template lint, determinism, declarations) refuses with a named rule.
64
+ For a builtin fork, copy **all three parts** from the selected `sourceSnapshot`: template,
65
+ definition and manifest. A workspace component that still has a version-3 `index.tsx` is
66
+ refused as `component_source_retired` before any API call; author it again as a native template. To preview before
67
+ a full render, push it and use the appropriate component preview loop.
68
+
69
+ ## Path C — Director editing a local desktop project (project-embedded source)
70
+
71
+ When `get_context` reports the project lane as local, motion does not need an account or an org
72
+ component. Components here are native (source version 4) too:
73
+ - **New component:** open a draft with `open_component_preview`, passing `template`,
74
+ `component_manifest` (`{version:4, runtime:'hyperframes', hfContract:1, kind:'scene', assets,
75
+ graphics, alphaPolicy}`) and `component_definition`.
76
+ - **Existing component:** pass `component_id` instead, to start from the clip's pinned version or
77
+ the library version.
78
+
79
+ The draft is admitted in full: template lint, determinism and the variable declaration.
80
+ `data-composition-variables` must equal the definition's projection (its scalar inputSchema
81
+ properties, then the manifest's slots).
82
+
83
+ Edit the draft with `update_component_preview` (exact-text `{oldText, newText, replaceAll?}`
84
+ edits). Check exact frames with `render_component_preview_frame`, and inspect playback for motion.
85
+ `commit_component_preview` publishes the checked source to the library and pins the clip, and
86
+ returns the project's new ETag. `read_component` and `edit_component` read and edit the library
87
+ directly. Close the preview when finished.
88
+
89
+ Media slots are image or video, declared in `component_manifest.assets` and bound to project
90
+ media ids in `component_assets`. The template passes them to `MediaTileScene` as
91
+ `streams: { hero: { asset: assets.hero } }`. Declare `alphaPolicy` explicitly:
92
+ `requires-transparency` for overlays, `allows-opaque` for full-frame plates.
93
+
94
+ Every frame must be a pure function of `render.frame`, params and `render.seed`. Timers, `Date`,
95
+ network, imports, other globals and CSS animation are refused at admission. The timeline and final
96
+ export render the exact committed version. Use `create_component` only for a reusable org-catalog
97
+ component on a reachable cloud lane.
98
+
@@ -0,0 +1,54 @@
1
+ # Native version-4 source contract
2
+
3
+ Read this when authoring or changing a custom native component. Scene-shot JSON is a different contract served by `cueframe://scene-shot` or desktop `get_scene_contract`; it does not describe a custom component source. Live schemas and named admission errors govern supported fields.
4
+
5
+ Create and update components with a complete `source` object: `{version:4, componentId, template, manifest, definition}`. TSX (version 3) sources are retired: writing one is refused as `component_source_retired`. The definition declares input schema, defaults, timing, brand/media bindings and placement capabilities. The manifest is `{version:4, runtime:'hyperframes', hfContract:1, kind:'scene', assets, graphics, alphaPolicy}`: `assets` declares the media slots (only `image` and `video` slots), `graphics.api` is `webgl2` (or `webgl`), and `alphaPolicy` is `requires-transparency` or `allows-opaque`.
6
+
7
+ The `template` is one sub-composition. Every source is admitted before it is stored or rendered, and a refusal names the broken rule:
8
+ - `<template>` holds one root `<div id="root" data-composition-id="<componentId>" data-width="1920" data-height="1080" data-no-timeline data-composition-variables='…'>` containing one empty `<div data-cf-scene></div>` (and any static DOM of your own beside it), and one classic inline `<script>`.
9
+ - The script finds its root with `document.getElementById('root')`. The runtime scopes that lookup to each placed instance; a global `[data-composition-id]` selector is refused, because a component placed twice would find no root.
10
+ - `data-composition-variables` is the definition's projection: each scalar `inputSchema` property in schema order, then each manifest slot. `number`/`integer` → `{"id","type":"number","label","default","min","max"}` (min/max from minimum/maximum, omitted when absent); a property with `enum` → `{"type":"enum","default":"<as string>","options":[{"value","label"}]}`; `boolean` → `"boolean"`; a string whose `pattern` admits exactly `#RRGGBB` → `"color"`; any other string → `"string"`; an image slot → `{"id","type":"image","label":"<id>","default":""}`; a video slot → the same with `"type":"string"`. `label` is the property's `title`, else its id; `default` is `definition.defaults[id]`, else the schema default. Any difference is refused as `component_api_mismatch`.
11
+ - The script ends with exactly one `__cfScene.mount({ root: document.getElementById('root'), component: Name, variables: __hyperframes.getVariables() })`. `Name({ params, assets, render, durationInFrames })` returns `h(MediaTileScene, { streams, tiles, camera, fog, background })`, taken from `const { h, MediaTileScene, three } = __cfScene`: a description, not React. `render` is `{ frame, fps, width, height, seed }`. `params` holds only the keys the placement's `execution.params` sets, so read every param with its default as a fallback.
12
+ - Pass a declared slot as `streams: { hero: { asset: assets.hero } }` and place it with `tiles: [{ stream: 'hero', x, y, width, height }]` (pixels; x/y are the tile centre's offset from the frame centre, y down). Tiles also take `z`, `rotation`, `rotationX`, `rotationY` (degrees), `opacity`, `crop` and `renderOrder`; the camera takes `x`, `y`, `z`, `zoom` and `perspective`. Video streams take `trimBeforeFrames`, `trimAfterFrames`, `playbackRate` and `loop`. Audio belongs on composition audio tracks.
13
+ - The template lays out at its declared `data-width` × `data-height`, and the host scales that whole box to the rendered size: DOM beside the scene keeps its place and proportion at every size. The scene draws at the rendered size (`render.width` × `render.height`). A component without media passes `streams: {}` and no tiles; its scene presents its `background`.
14
+ - Every frame is a pure function of `render.frame`, `params` and `render.seed`. The script reads only its own declarations, `__cfScene`, `__hyperframes`, `document` and JavaScript built-ins such as `Math` and `JSON`. Timers, `Date`, `requestAnimationFrame`, `fetch`, `eval`, imports, `window` and other globals are refused (`component_v4_nondeterministic`, `component_import_denied`). The template has no `<img>`, `<video>`, `<link>` or `<iframe>`, no external or `data:` URL, and no CSS `transition`, `animation` or `@keyframes`. The template linter runs in sub-composition mode, and its errors refuse the source (`component_v4_lint_failed`).
15
+
16
+ Example: one image swinging flat over the clip. Its definition and manifest:
17
+
18
+ ```json
19
+ {
20
+ "definition": {
21
+ "inputSchema": { "type": "object", "additionalProperties": false, "properties": {
22
+ "background": { "type": "string", "pattern": "^#[0-9a-fA-F]{6}$", "default": "#101014" },
23
+ "tilt": { "type": "number", "minimum": 0, "maximum": 60, "default": 35 }
24
+ } },
25
+ "defaults": {}, "brandBindings": [], "timing": { "defaultDuration": { "frames": 90, "fps": 30 } }, "capabilities": [{ "kind": "clip" }]
26
+ },
27
+ "manifest": { "version": 4, "runtime": "hyperframes", "hfContract": 1, "kind": "scene",
28
+ "assets": { "hero": { "kind": "image", "required": true } },
29
+ "graphics": { "api": "webgl2", "required": true, "accelerationPreference": "hardware-preferred" }, "alphaPolicy": "allows-opaque" }
30
+ }
31
+ ```
32
+
33
+ Its template, with `componentId` `swing-hero`:
34
+
35
+ ```html
36
+ <template><div id="root" data-composition-id="swing-hero" data-width="1920" data-height="1080" data-no-timeline data-composition-variables='[{"id":"background","type":"color","label":"background","default":"#101014"},{"id":"tilt","type":"number","label":"tilt","default":35,"min":0,"max":60},{"id":"hero","type":"image","label":"hero","default":""}]'><div data-cf-scene></div></div><script>
37
+ const { h, MediaTileScene } = __cfScene;
38
+ function SwingHero({ params, assets, render, durationInFrames }) {
39
+ const t = Math.min(1, render.frame / Math.max(1, durationInFrames - 1));
40
+ const ease = 1 - Math.pow(1 - t, 3);
41
+ const tilt = Number.isFinite(params.tilt) ? params.tilt : 35;
42
+ return h(MediaTileScene, {
43
+ streams: { hero: { asset: assets.hero } },
44
+ tiles: [{ stream: 'hero', x: 0, y: 0, width: 1280, height: 720, rotationY: tilt * (1 - ease) }],
45
+ camera: { x: 0, y: 0, z: 0, zoom: 1, perspective: 1200 },
46
+ background: params.background ?? '#101014',
47
+ });
48
+ }
49
+ __cfScene.mount({ root: document.getElementById('root'), component: SwingHero, variables: __hyperframes.getVariables() });
50
+ </script></template>
51
+ ```
52
+
53
+ Place a component as a `{kind:'component', componentId, props:{}, execution:{version:4, componentId, sourceVersionId, params, seed, assets:{hero:'<mediaId>'}}, placement:{version:3, kind:'clip'}}` clip. Bind each slot to a project media id in `execution.assets`; a slot never travels in `params`.
54
+
@@ -0,0 +1,13 @@
1
+ {
2
+ "kind": "card",
3
+ "html": "<style>\n.cf-mounted-demo{position:relative;width:100%;height:100%;overflow:hidden;background:#e9edf5;font-family:Arial,sans-serif;color:#162033;--settle:clamp(0,calc(var(--cf-t)/var(--cf-settleSec)),1);--pose:calc(1 - (1 - var(--settle))*(1 - var(--settle))*(1 - var(--settle)));--approach:clamp(0,calc((var(--cf-t) - var(--cf-contactSec) + var(--cf-approachSec))/var(--cf-approachSec)),1);--response:clamp(0,calc((var(--cf-t) - var(--cf-contactSec))/var(--cf-responseSec)),1)}\n.cf-mounted-demo .stage{position:absolute;left:50%;top:50%;width:380px;height:720px;transform:translate(-50%,-50%);perspective:1400px}\n.cf-mounted-demo .phone{position:absolute;inset:0;border:10px solid #172032;border-radius:52px;background:#172032;box-sizing:border-box;box-shadow:18px 30px 45px #15263a30;transform:translateY(calc((1 - var(--pose))*120px)) rotateY(calc((1 - var(--pose))*var(--cf-tiltDeg)*1deg)) rotateZ(calc((1 - var(--pose))*-5deg))}\n.cf-mounted-demo .screen{position:absolute;inset:0;border-radius:40px;overflow:hidden;background:#fbfcff}\n.cf-mounted-demo .top{position:absolute;left:28px;right:28px;top:38px;font-size:24px;font-weight:700}\n.cf-mounted-demo .card{position:absolute;left:28px;right:28px;top:110px;height:182px;border-radius:18px;background:var(--cf-accent);color:white;box-shadow:0 9px 18px #16203328}\n.cf-mounted-demo .card:before{content:\"NORTH\";position:absolute;left:22px;top:24px;font-size:21px;font-weight:700;letter-spacing:3px}\n.cf-mounted-demo .holder:after{content:var(--cf-holder)}\n.cf-mounted-demo .holder{position:absolute;left:22px;bottom:24px;font-size:18px;letter-spacing:2px}\n.cf-mounted-demo .label{position:absolute;top:330px;left:28px;font-size:20px}\n.cf-mounted-demo .control{position:absolute;left:100px;top:400px;width:160px;height:70px;border:2px solid #b5bfd1;border-radius:18px;box-sizing:border-box;background:#eef2f9;display:grid;place-items:center;font-size:22px;font-weight:700}\n.cf-mounted-demo .frozen{position:absolute;inset:0;border-radius:16px;background:var(--cf-accent);color:white;display:grid;place-items:center;opacity:var(--response)}\n.cf-mounted-demo .pointer{position:absolute;left:180px;top:435px;width:36px;height:48px;background:#162033;clip-path:polygon(0 0,100% 65%,58% 68%,43% 100%);filter:drop-shadow(1px 3px 2px #15263a99);transform:translate(calc((1 - var(--approach))*95px),calc((1 - var(--approach))*80px));transform-origin:0 0}\n.cf-mounted-demo .status{position:absolute;left:28px;right:28px;top:530px;font-size:20px;line-height:1.4;opacity:var(--response)}\n</style><div class=\"cf-mounted-demo\"><div class=\"stage\"><div class=\"phone\"><div class=\"screen\"><div class=\"top\">Your card</div><div class=\"card\"><div class=\"holder\"></div></div><div class=\"label\">Card controls</div><div class=\"control\">Freeze<div class=\"frozen\">Frozen</div></div><div class=\"pointer\"></div><div class=\"status\">Payments are paused.<br>Your card is still here.</div></div></div></div></div>",
4
+ "tokens": {
5
+ "accent": "#4265d5",
6
+ "holder": "\"MAYA\"",
7
+ "settleSec": "1.0",
8
+ "tiltDeg": "28",
9
+ "contactSec": "2.0",
10
+ "approachSec": "0.65",
11
+ "responseSec": "0.2"
12
+ }
13
+ }
@@ -0,0 +1,25 @@
1
+ # Parented motion with an editable event clock
2
+
3
+ Use this example to keep mounted UI on one projected plane and make a cursor action retimeable. It is original CueFrame sample artwork under this repository's Apache-2.0 license, with no external assets. It is not a Cardly reproduction or a real app capture. For physical lighting, depth intersections or a moving 3D camera, use the scene-shot contract instead.
4
+
5
+ [Complete card source](parented-device-card.json) is a `kind:"card"` source object. Put it on an overlay clip at full-frame 1920×1080, 30 fps, duration 4 seconds; use the live `clip.add` schema for the surrounding operation. It includes an opaque full-duration background, so it is a complete scene plate. When using it over other content, remove that background intentionally rather than hoping it is transparent.
6
+
7
+ The `.phone` applies the pose once. Its `.screen` clips the card, text, control and pointer as mounted children. Their coordinates stay in phone space. No child independently counter-rotates to approximate the parent's pose. The pointer's top-left tip arrives at the control center `(180,435)` in screen coordinates.
8
+
9
+ The host supplies `--cf-t` in clip-local seconds. Tokens `settleSec`, `contactSec`, `approachSec` and `responseSec` determine arrival, pointer contact and response; the status and control use the same response phase. The sample keeps its readable state after settling and after contact. Changing `contactSec` shifts the approach and response together. Positive travel/response durations are required by its CSS divisions; keep contact after the approach and allow a readable hold before the clip ends.
10
+
11
+ `holder` is a CSS string token, so its value includes quote characters. Preserve it when editing the pose or timing. `accent` and `tiltDeg` control visible style and geometry. They are ordinary card tokens; built-in clock keys are not authored tokens.
12
+
13
+ For the initial proof, inspect the pose in travel, the settled plane, the frame before contact, the contact frame, the response and the last frame. Also inspect a motion preview across arrival and contact. After changing `contactSec`, check that the cursor and response move together, the holder remains, and the full scene still covers its duration. These are tests of this recipe's mechanism; use the reference's actual landmarks for a real film.
14
+
15
+ This CSS uses a fixed design-space phone inside a full-size card. Recompose for a different aspect/size instead of assuming this sample is responsive. Static layout fidelity, sampled motion and actual playback are distinct evidence. The validation record belongs with the produced preview artifact, not inside this reusable skill.
16
+
17
+ ## Fit and reuse the same object
18
+
19
+ For a reference-led device, compare the outer silhouette, screen corners and inset, then the mounted card and its typography. A correct bounding width can still hide the wrong perspective. Parenting keeps transforms together, but a child rendered on a different apparent plane can still contradict the device. Inspect a moving pose as well as the settled one before reusing the object across scenes.
20
+
21
+ Use a small set of editable properties for likely corrections: screen inset, card size, text scale, internal gap, pose and event times. A CSS font-size is not a measurement of visible cap height or text width. Calibrate those relationships from the rendered glyphs and preserve intentional copy adaptations. Do not turn every measured pixel into a global design token.
22
+
23
+ Publish a reusable native source once, then pass its exact version and relevant parameters to coauthors. Editing its source creates a new version; placed clips remain pinned to the old version. Explicitly adopt the fitted version in the intended placements through the available admitted composition operation, and inspect those uses. Source publication and placement adoption are separate operations; an isolated preview alone does not prove the timeline changed.
24
+
25
+ When several authors work on one project, existing clip guards cover the whole clip and its structural dependencies, not independent CSS fields. A shared source adoption or dependent timing revision needs current composition state. If another author or the user changed the target, reread and reconcile the intended edit; preserve their copy, timing and unrelated placements rather than replacing a stale document with a fresh token.
@@ -0,0 +1,26 @@
1
+ # Retired project sources
2
+
3
+ ## Upgrading an old project
4
+
5
+ `get_composition` returns `needsUpgrade` only when clips from before the native cutover remain:
6
+ `[{clipId, kind, componentId?, sourceVersionId?, primitiveId?, successorComponentId?,
7
+ successorSourceVersionId?}]`. Saves and renders refuse those clips. A retired component is
8
+ refused with `component_source_retired`, and a retired
9
+ primitive with `render_unknown_primitive`. Upgrade only the listed clips. Keep every other clip,
10
+ timing, track and brand-kit binding as it is.
11
+
12
+ - **Any entry with a `successorSourceVersionId`:** call `repin_component` with its clip ids. It
13
+ moves them to the native successor and keeps their saved inputs.
14
+ - **`v3-component` with no successor** (a custom pre-cutover component): read its source, params,
15
+ timing and placement, and author a native replacement with `create_component` as a version-4
16
+ template following the server instructions' Component Contract.
17
+ - **`unpinned-component`:** the clip carries a `retired` record (what was stored before the cutover), with its
18
+ props preserved. Re-author it from those props the same way.
19
+ - **`retired-primitive`:** rebuild what `primitiveId` drew from the clip's params, as a card or
20
+ a native component.
21
+
22
+ For each replacement, use `apply_composition` to replace only that clip at the same start,
23
+ duration, track and placement, pinned to the new exact `sourceVersionId`. Map the old params
24
+ onto the new inputs; do not invent new content. Verify each clip with `preview_frame` at a time
25
+ inside its window and confirm `needsUpgrade` is gone. Only then render (`create_render`).
26
+
@@ -1,128 +1,30 @@
1
1
  ---
2
2
  name: cueframe-compose-loop
3
- description: Use when an AI agent should DRIVE CueFrame to a high-quality clip itself — author a composition, look at rendered frames, score it with CueFrame's judge, fix the weakest thing, and repeat until it's good — e.g. "turn this source into a polished 9:16 clip", "compose and self-correct until it scores well". This is the agent-driven convergence loop over the CueFrame primitives in the `cueframe-cli` skill.
3
+ description: "Use when previewing, reviewing or revising a CueFrame composition, including a scoped correction, reference comparison or final-delivery check. Also use when an agent should drive CueFrame to a high-quality clip itself: author, look at rendered frames, score with the judge, fix the weakest thing and repeat, over the primitives in the `cueframe-cli` skill. Triggers on \"turn this source into a polished 9:16 clip\" or \"compose and self-correct until it scores well\"."
4
4
  ---
5
5
 
6
- # CueFrame — Compose convergence loop
6
+ # CueFrame preview and revision
7
7
 
8
- ## Scope and capability policy
8
+ Use the [project and capability policy](../composing-video/references/project-policy.md). This skill owns evidence, revision scope and delivery; craft and format skills describe what to look for.
9
9
 
10
- User intent and acceptance criteria override this recipe's aesthetic defaults. Silent, typography-only, uncaptioned and slow work are valid; no universal narration, footage, CTA, beat count or score target. Contracts, factual fidelity, media bindings and current source revisions remain mandatory.
10
+ Read the current saved composition and relevant source before changing it. Reuse the approved brief or supplied reference. A local correction does not restart planning. For exact builtin preset/recipe insertion, use [builtin insertion](references/builtin-insertion.md).
11
11
 
12
- Read available tools and current project; preserve the chosen local/hosted lane. Supported local work needs no hosted registration. Do not silently install, authenticate, switch projects or upload local content. Before metered hosted work, check `get_account`, entitlements, balance and quotes. Desktop setup: https://docs.cueframe.ai.
12
+ ## Inspect the behavior that matters
13
13
 
14
- For scoped revisions, preserve unrelated timing, media, audio and shared brand-kit state. Edit affected content; inspect relevant frames, continuous motion and affected audio. No restarted intake, new approval pause, paid judge or final export by default. Judge only when useful; scores never override acceptance failures. Stop/report after two no-improvement passes. See [preview workflow](../cueframe-compose-loop/references/preview-workflow.md).
14
+ Read [preview workflow](references/preview-workflow.md) to choose the supported hosted or local surface. Match evidence to the question: stills for typography/geometry, motion for paths and handoffs, audio inspection for the mix. Requested timestamps, artifact URLs and successful jobs are not proof that their content was observed.
15
15
 
16
- You are the director. CueFrame gives you hands (author), eyes (capture), and a
17
- judge (verify); you supply the taste and the iteration. The engine does NOT
18
- auto-compose for you here — you drive the loop and decide when it's done. Drive
19
- the primitives with the `cueframe-cli` skill; this tells you *how to converge*.
16
+ Locate a finding in the film: when it happens, what is visible or audible, what the brief/reference requires, and which relationship needs to change. For reconstruction, compare matching source/output landmarks and the interval between them. If a requested revision deliberately changed timing, compare corresponding events rather than pretending they still share timestamps.
20
17
 
21
- Before choosing a preview or export, read [preview-workflow.md](references/preview-workflow.md).
22
- It owns hosted/local routing, bounded motion evidence, and the distinction between a small edit
23
- and final delivery. For a minor revision, keep the approved brief and inspect the changed behavior
24
- plus relevant regressions; do not restart the full planning/judging loop below.
18
+ Fix the highest-impact cause you can explain. A layout failure may need a grid change, a position adjustment, a different parent transform or a new shot choice. Do not force every correction into one technique. Use targeted atomic operations against the observed revision and retain concurrent edits. Every committing batch needs the required `if_match` from the current read. After a conflict, reread the changed state and rebuild the intended change; never resend old operations with the error's `currentEtag`.
25
19
 
26
- ## The loop
20
+ ## Recheck the affected scene
27
21
 
28
- ```
29
- get_context → author → scoped preview (look) → judge if useful
30
- ↑ │
31
- └──────── fix the WORST criterion ──────┘ → stop → render
32
- ```
22
+ A timing change can affect more than the edited clip: backing plates, screen masks, linked controls, captions, sound and neighboring handoffs. Inspect the changed window with its entrance/exit context. If the ending must be preserved, verify the complete final scene through its last frame, not just an unchanged logo object. Check saved values as well as actual output.
33
23
 
34
- Hosted preview and scoring are durable, stateless jobs. Keep their job IDs and
35
- wait for each terminal result; there is no hosted render box to open, warm, or close.
36
- Use the local live-preview tools when working in a desktop project that exposes them.
24
+ `score_composition` can supply broader editorial, spatial, brand and caption critique when useful and within budget. Its fixed caption criterion can penalize intentionally uncaptioned work; do not add captions solely to improve a score. These instructions do not change judge behavior. A failed brief requirement remains a failure regardless of a numerical score.
37
25
 
38
- ## 0. Context — relevant project and source first
26
+ Continue while evidence suggests a useful correction within the task's time/cost scope. If progress stalls, change the diagnosed cause or report the remaining gap; repeated scores alone are not progress. A scoped edit can finish with verified previews. For a finished-video request, export the saved revision and inspect the resulting artifact. Report the output, what was actually reviewed, and unresolved limitations.
39
27
 
40
- `GET /v1/media/:id/context` (`cueframe_api_getMediaContext`) returns what you need
41
- to author well for a source:
28
+ ## Detailed guidance
42
29
 
43
- - **faces** — the subject roster per source window: `faceId` (face-0 = largest/
44
- primary speaker), normalized `bbox`, `speakingShare` (0–1). Use these to aim
45
- reframe/crop intents at the right subject. `faces.status: "not_detected"` means
46
- no detection has run yet — author without face-targeted reframe, or trigger a
47
- pass first; never invent face ids.
48
- - **transcript** — utterances with per-word `start`/`end` (seconds). Use for
49
- caption timing and for placing overlays on the right beat.
50
-
51
- For a maintained builtin package, follow [exact builtin insertion](references/builtin-insertion.md)
52
- before authoring custom source.
53
-
54
- ## 1. Author
55
-
56
- Build/modify the working composition with the op vocabulary —
57
- the curated `apply_composition({ projectId, body: { ops: [...] } })`. Read
58
- `describe_composition_ops` for supported operations and `get_composition` for
59
- current revision and brand witnesses before editing. Op keys
60
- are `.strict()`: a typo'd key is rejected, not silently dropped, so read the
61
- error and fix the key. Reference faces from get_context in your reframe segments;
62
- time captions/overlays from the transcript word timings.
63
-
64
- ## 2. Preview — look at it
65
-
66
- Use the curated `preview_frame` MCP tool, or
67
- `POST /v1/projects/:id/preview-frame-jobs`, with the composition target and the
68
- timestamps you need to inspect. The operation returns `{ jobId }` immediately.
69
- Call `wait_job({ kind: "preview_frame", id: jobId })`, then view the image artifact
70
- URLs in the successful result. Look at the beats you're unsure about: a cut, an
71
- overlay entrance, or the hook. The stills are real render evidence, not continuous-motion proof.
72
- Use `preview_clip` for the affected composition window to judge cuts, entrances, camera movement,
73
- and audio timing; use `preview_component` or `preview_card` for isolated authoring checks.
74
-
75
- ## 3. Score it
76
-
77
- When broader review is useful and within budget, use `score_composition`, or `POST /v1/projects/:id/score-composition`, with the
78
- composition target plus optional `editorialIntent` and `brandContext`. It returns
79
- `{ jobId }`; call `wait_job({ kind: "verify", id: jobId })`. CueFrame's judge samples
80
- the meaningful beats, renders them, and returns:
81
-
82
- ```
83
- { perCriterion: { editorial, spatial, brand, caption } each { score 0–10, critique },
84
- composite, // weighted overall
85
- critique, // worst-first, leads with the criterion to fix
86
- beats }
87
- ```
88
-
89
- The four criteria:
90
-
91
- | criterion | what it grades |
92
- |---|---|
93
- | **editorial** | does the framing/cut serve the stated intent (the hook, the point)? |
94
- | **spatial** | subject framing — centered/tight enough, not lost in dead space, not occluded by captions |
95
- | **brand** | on-brand color/typography/voice; cohesive look |
96
- | **caption** | caption legibility, timing, placement (or `no_captions` when absent) |
97
-
98
- The hosted caption criterion can penalize intentionally uncaptioned work; do not add captions solely for a score. These instructions do not change judge behavior.
99
-
100
- You get **scores and the critique, never the rubric** — the taste is CueFrame's.
101
- Pass `editorialIntent` (your brief/hook) so editorial is graded against what you
102
- meant.
103
-
104
- ## 4. Fix the worst — then re-score
105
-
106
- Read `critique` — it names the lowest criterion first and says why. Fix **that one
107
- thing** (re-author the relevant ops), then score again. One criterion per pass:
108
- chasing all four at once thrashes. Example: editorial 4 "two subjects off-center
109
- vs centered intent" → tighten the reframe onto face-0 → re-score. A layout critique
110
- ("cramped", "unbalanced", "text crowds the art") on a laid-out card or component is a
111
- change to its CSS grid tracks or flex basis. Re-author those; never nudge pixels (see
112
- `cueframe-component-authoring`).
113
-
114
- ## 5. Stop — then render
115
-
116
- For a whole-film review, check the brief's actual acceptance criteria; no fixed score threshold applies. Two no-improvement passes are a reason to stop spending and report what
117
- remains, not to declare a rejected result approved. Render with `create_render` only when a
118
- finished video is requested or the work reaches final delivery. A scoped revision can end with
119
- verified preview evidence and an explicit note that no new final export was made.
120
-
121
- ## Notes
122
-
123
- - **Whose tokens:** you run this loop on your own model/tokens; CueFrame bills the
124
- infra (capture/render) + the judge. That's the point — you keep the orchestration.
125
- - **Don't re-derive the judge or beat sampling** — verify owns both. Your job is
126
- author → read scores → fix worst → repeat.
127
- - **Budget the loop:** 3–5 scoring passes is plenty for most clips. If composite
128
- won't climb, the limiter is usually the source or the intent, not more passes.
30
+ [The convergence loop](references/convergence-loop.md) has the step-by-step author, preview, score, fix and stop procedure for an agent driving a clip to quality.
@@ -0,0 +1,128 @@
1
+ # The convergence loop
2
+
3
+ Defaults, examples and detail for this topic. The [skill](../SKILL.md) and the [project and capability policy](../../composing-video/references/project-policy.md) take precedence where they differ, and the current tool schemas are authoritative.
4
+
5
+ ## Scope and capability policy
6
+
7
+ User intent and acceptance criteria override this recipe's aesthetic defaults. Silent, typography-only, uncaptioned and slow work are valid; no universal narration, footage, CTA, beat count or score target. Contracts, factual fidelity, media bindings and current source revisions remain mandatory.
8
+
9
+ Read available tools and current project; preserve the chosen local/hosted lane. Supported local work needs no hosted registration. Do not silently install, authenticate, switch projects or upload local content. Before metered hosted work, check `get_account`, entitlements, balance and quotes. Desktop setup: https://docs.cueframe.ai.
10
+
11
+ For scoped revisions, preserve unrelated timing, media, audio and shared brand-kit state. Edit affected content; inspect relevant frames, continuous motion and affected audio. No restarted intake, new approval pause, paid judge or final export by default. Judge only when useful; scores never override acceptance failures. Stop/report after two no-improvement passes. See [preview workflow](../../cueframe-compose-loop/references/preview-workflow.md).
12
+
13
+ You are the director. CueFrame gives you hands (author), eyes (capture), and a
14
+ judge (verify); you supply the taste and the iteration. The engine does NOT
15
+ auto-compose for you here — you drive the loop and decide when it's done. Drive
16
+ the primitives with the `cueframe-cli` skill; this tells you *how to converge*.
17
+
18
+ Before choosing a preview or export, read [preview-workflow.md](preview-workflow.md).
19
+ It owns hosted/local routing, bounded motion evidence, and the distinction between a small edit
20
+ and final delivery. For a minor revision, keep the approved brief and inspect the changed behavior
21
+ plus relevant regressions; do not restart the full planning/judging loop below.
22
+
23
+ ## The loop
24
+
25
+ ```
26
+ get_media_context → author → scoped preview (look) → judge if useful
27
+ ↑ │
28
+ └──────── fix the WORST criterion ──────┘ → stop → render
29
+ ```
30
+
31
+ Hosted preview and scoring are durable, stateless jobs. Keep their job IDs and
32
+ wait for each terminal result; there is no hosted render box to open, warm, or close.
33
+ Use the local live-preview tools when working in a desktop project that exposes them.
34
+
35
+ ## 0. Context — relevant project and source first
36
+
37
+ `GET /v1/media/:id/context` (`get_media_context`) returns what you need
38
+ to author well for a source:
39
+
40
+ - **faces** — the subject roster per source window: `faceId` (face-0 = largest/
41
+ primary speaker), normalized `bbox`, `speakingShare` (0–1). Use these to aim
42
+ reframe/crop intents at the right subject. `faces.status: "not_detected"` means
43
+ no detection has run yet — author without face-targeted reframe, or trigger a
44
+ pass first; never invent face ids.
45
+ - **transcript** — utterances with per-word `start`/`end` (seconds). Use for
46
+ caption timing and for placing overlays on the right beat.
47
+
48
+ For a maintained builtin package, follow [exact builtin insertion](builtin-insertion.md)
49
+ before authoring custom source.
50
+
51
+ ## 1. Author
52
+
53
+ Build/modify the working composition with the op vocabulary —
54
+ the curated `apply_composition({ projectId, body: { ops: [...] } })`. Read
55
+ `describe_composition_ops` for supported operations and `get_composition` for
56
+ current revision and brand witnesses before editing. Pass that revision as `if_match`
57
+ on every committing call. A 409 means someone saved after your read: call `get_composition`
58
+ again, rebuild your ops against what it returns, and send them with its revision. Never resend
59
+ the same ops with the 409's `currentEtag`; that overwrites a save you have not read. Op keys
60
+ are `.strict()`: a typo'd key is rejected, not silently dropped, so read the
61
+ error and fix the key. Reference faces from get_media_context in your reframe segments;
62
+ time captions/overlays from the transcript word timings.
63
+
64
+ ## 2. Preview — look at it
65
+
66
+ Use the curated `preview_frame` MCP tool, or
67
+ `POST /v1/projects/:id/preview-frame-jobs`, with the composition target and the
68
+ timestamps you need to inspect. The operation returns `{ jobId }` immediately.
69
+ Call `wait_job({ kind: "preview_frame", id: jobId })`, then view the image artifact
70
+ URLs in the successful result. Look at the beats you're unsure about: a cut, an
71
+ overlay entrance, or the hook. The stills are real render evidence, not continuous-motion proof.
72
+ Use `preview_clip` for the affected composition window to judge cuts, entrances, camera movement,
73
+ and audio timing; use `preview_component` or `preview_card` for isolated authoring checks.
74
+
75
+ ## 3. Score it
76
+
77
+ When broader review is useful and within budget, use `score_composition`, or `POST /v1/projects/:id/score-composition`, with the
78
+ composition target plus optional `editorialIntent` and `brandContext`. It returns
79
+ `{ jobId }`; call `wait_job({ kind: "verify", id: jobId })`. CueFrame's judge samples
80
+ the meaningful beats, renders them, and returns:
81
+
82
+ ```
83
+ { perCriterion: { editorial, spatial, brand, caption } each { score 0–10, critique },
84
+ composite, // weighted overall
85
+ critique, // worst-first, leads with the criterion to fix
86
+ beats }
87
+ ```
88
+
89
+ The four criteria:
90
+
91
+ | criterion | what it grades |
92
+ |---|---|
93
+ | **editorial** | does the framing/cut serve the stated intent (the hook, the point)? |
94
+ | **spatial** | subject framing — centered/tight enough, not lost in dead space, not occluded by captions |
95
+ | **brand** | on-brand color/typography/voice; cohesive look |
96
+ | **caption** | caption legibility, timing, placement (or `no_captions` when absent) |
97
+
98
+ The hosted caption criterion can penalize intentionally uncaptioned work; do not add captions solely for a score. These instructions do not change judge behavior.
99
+
100
+ You get **scores and the critique, never the rubric** — the taste is CueFrame's.
101
+ Pass `editorialIntent` (your brief/hook) so editorial is graded against what you
102
+ meant.
103
+
104
+ ## 4. Fix the worst — then re-score
105
+
106
+ Read `critique` — it names the lowest criterion first and says why. Fix **that one
107
+ thing** (re-author the relevant ops), then score again. One criterion per pass:
108
+ chasing all four at once thrashes. Example: editorial 4 "two subjects off-center
109
+ vs centered intent" → tighten the reframe onto face-0 → re-score. A layout critique
110
+ ("cramped", "unbalanced", "text crowds the art") on a laid-out card or component is a
111
+ change to its CSS grid tracks or flex basis. Re-author those; never nudge pixels (see
112
+ `cueframe-component-authoring`).
113
+
114
+ ## 5. Stop — then render
115
+
116
+ For a whole-film review, check the brief's actual acceptance criteria; no fixed score threshold applies. Two no-improvement passes are a reason to stop spending and report what
117
+ remains, not to declare a rejected result approved. Render with `create_render` only when a
118
+ finished video is requested or the work reaches final delivery. A scoped revision can end with
119
+ verified preview evidence and an explicit note that no new final export was made.
120
+
121
+ ## Notes
122
+
123
+ - **Whose tokens:** you run this loop on your own model/tokens; CueFrame bills the
124
+ infra (capture/render) + the judge. That's the point — you keep the orchestration.
125
+ - **Don't re-derive the judge or beat sampling** — verify owns both. Your job is
126
+ author → read scores → fix worst → repeat.
127
+ - **Budget the loop:** 3–5 scoring passes is plenty for most clips. If composite
128
+ won't climb, the limiter is usually the source or the intent, not more passes.
@@ -16,21 +16,25 @@ Read the current tool contracts and project context. Do not infer a hosted sessi
16
16
 
17
17
  Hosted calls use `projectId` and the request shape declared by the live tool. `preview_component` returns a job ID: wait with `kind:"preview"`. `preview_frame` uses `kind:"preview_frame"`. `preview_clip` returns a render job: wait with `kind:"render"`, even though it is a preview. Reuse the returned job ID; do not submit duplicate jobs while waiting. Hosted evidence jobs do not require opening or warming a compose session.
18
18
 
19
- The local component preview compiles replacement source revisions; it is not a promise of browser HMR or zero compilation work. `commit_component_preview` commits the inspected revision with a fresh project ETag. An isolated preview does not itself edit the saved timeline. Close the preview when finished if that tool is available.
19
+ The local component preview compiles replacement source revisions; it is not a promise of browser HMR or zero compilation work. `commit_component_preview` commits the inspected revision and returns the project's new ETag. An isolated preview does not itself edit the saved timeline. Close the preview when finished if that tool is available.
20
20
 
21
21
  ## Bound the work without changing the animation
22
22
 
23
23
  - Use a component's existing params for supported changes; update its source in place only when necessary. Do not create a new component ID for each tweak.
24
24
  - `durationInFrames` sets the component's render duration; it is **not a generic trim window**. Shortening it can retime animations normalized over duration. Preserve production timing. Use a documented component-specific offset only if it preserves that timing, or use the saved composition's `preview_clip` window. `startFrame` is not a universal preview API parameter.
25
25
  - Preserve FPS when judging motion. Choose resolution for the question: a low-resolution motion preview may establish timing but not typography, glass edges, or final-resolution shader quality. Use appropriate stills for those details.
26
- - Batch related still timestamps. Build contact sheets from returned images for inspection; a grid is a presentation of sampled frames, not proof of continuous motion. Watch the critical window as well. Listen when the change affects sound.
26
+ - Batch related still timestamps within the tool's delivery bounds. Check which image blocks actually arrived and their timestamp/identity; metadata for more frames does not establish their delivery. Request missing frames through the supported selector or another bounded preview. Repeating an unchanged completed job is not evidence of additional frames. A contact sheet shows sampled frames, not continuous playback. Inspect the critical motion window and listen when the change affects sound.
27
27
  - Scope output and compute are different: a short composition preview can still trigger preparation or an alpha bake on a cache miss. Inspect progress/receipts before diagnosing cost. Do not promise instant previews, cross-job cache hits, or that every requested still requires a full bake.
28
28
 
29
29
  ## Evidence and stopping
30
30
 
31
31
  Keep component source revision/hash, params, asset bindings, dimensions, FPS, requested frames/window, and returned artifact/job identity together. For hosted composition parity, inspect `previewed.source`, composition ID, and ETag where provided. Source can change without changing the composition ETag. Unchanged pixels outside an edit's visible frame range do not by themselves prove a stale cache.
32
32
 
33
- Compare affected frames and motion with the reference at matching timestamps. Keep isolated-component proof distinct from saved-composition proof and final-export proof. For a minor edit, stop once the requested behavior and relevant regressions are checked; report the preview and explicitly say if no new final export was made.
33
+ Compare affected frames and motion with the reference at matching timestamps, or corresponding named events when a requested revision intentionally retimed them. For structural changes, inspect connected layers and the intervals on both sides of each affected boundary; preserve a complete ending, including its background and audio tail. Keep isolated-component proof distinct from saved-composition proof and final-export proof. For a minor edit, stop once the requested behavior and relevant regressions are checked; report the preview and explicitly say if no new final export was made.
34
+
35
+ For precise reference matching, `compare_frames` can place a certified source frame beside an existing saved preview and return an unaligned overlay. Use full-resolution images for glyph bounds and spacing; request a common-coordinate crop for details. Read actual frame/source identities, color/display transforms and delivery status from the result. Derived comparison images are diagnostic evidence, not authored reconstruction layers. Reuse the candidate preview; comparing a different view does not require rendering it again.
36
+
37
+ After a correction, capture the affected saved version and compare it with the same reference moment. Inspect the adjacent movement separately: doubled edges in an overlay can identify a displaced object, but they cannot explain its acceleration or establish that sound is synchronized. A former comparison remains evidence of the former source; it does not update when a component or composition changes.
34
38
 
35
39
  Use `score_composition` for broader editorial/brand review when useful and within budget. Do not require repeated whole-film judging to verify a known local correction. A judge score does not override a failed acceptance criterion or the user's visual feedback.
36
40
 
@@ -5,13 +5,7 @@ description: Use when CueFrame is not connected yet, the user asks how to connec
5
5
 
6
6
  # Connect CueFrame
7
7
 
8
- ## Scope and capability policy
9
-
10
- User intent and acceptance criteria override this recipe's aesthetic defaults. Silent, typography-only, uncaptioned and slow work are valid; no universal narration, footage, CTA, beat count or score target. Contracts, factual fidelity, media bindings and current source revisions remain mandatory.
11
-
12
- Read available tools and current project; preserve the chosen local/hosted lane. Supported local work needs no hosted registration. Do not silently install, authenticate, switch projects or upload local content. Before metered hosted work, check `get_account`, entitlements, balance and quotes. Desktop setup: https://docs.cueframe.ai.
13
-
14
- For scoped revisions, preserve unrelated timing, media, audio and shared brand-kit state. Edit affected content; inspect relevant frames, continuous motion and affected audio. No restarted intake, new approval pause, paid judge or final export by default. Judge only when useful; scores never override acceptance failures. Stop/report after two no-improvement passes. See [preview workflow](../cueframe-compose-loop/references/preview-workflow.md).
8
+ Use the [project and capability policy](../composing-video/references/project-policy.md) for scope, current state and metered work.
15
9
 
16
10
  First inspect available CueFrame tools and their current project context. If the requested work is supported by an existing connection, use it without installing again. Preserve the user's chosen local or hosted lane. Local-only desktop work needs no hosted registration; desktop connection instructions are at https://docs.cueframe.ai. This public plugin connects to the hosted product at `https://api.cueframe.ai/v1/mcp`.
17
11
 
@@ -23,7 +17,7 @@ When a required capability is missing, explain the limitation and the supported
23
17
  - **Claude.ai / Claude Desktop:** Settings → Connectors → add a custom connector with
24
18
  `https://api.cueframe.ai/v1/mcp`.
25
19
  - **Other agents (Cursor, Codex, VS Code, Windsurf, Zed, Antigravity CLI, Copilot CLI, …):**
26
- use `npx -y cueframe@0.9 install --help` to select the intended client; preserve existing configuration and avoid duplicate installs.
20
+ use `npx -y cueframe@0.11 install --help` to select the intended client; preserve existing configuration and avoid duplicate installs.
27
21
  - **ChatGPT:** the CLI cannot wire it because there is no local config to write; add
28
22
  `https://api.cueframe.ai/v1/mcp` as a custom connector instead.
29
23
  - **No account (pay per call):** connect
@@ -42,7 +36,8 @@ way. Use available read-only discovery for the selected lane:
42
36
  (`new_composition`, `apply_composition`, `validate_composition`, `create_render`) alongside
43
37
  discovery reads (`list_catalog`, `list_media`, `get_account`). There are also resources
44
38
  (`cueframe://scene-shot` for 3D product shots) and workflow prompts — a flat tool list is not
45
- the whole surface.
39
+ the whole surface. Every tool, whether it reads or writes, and the surfaces that serve it
40
+ are in the generated [tool reference](references/tools.md).
46
41
  2. **For hosted work, smoke-call `get_account` before spending.** It takes no arguments, costs nothing, and answers the questions
47
42
  worth knowing before you spend: which org the key is bound to, the plan, per-feature
48
43
  entitlements and — the one that matters — `balance`, not `included`. CueFrame is credit-funded,