gooseworks 0.5.8 → 0.5.9-dev.56.eca9486d

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 (188) hide show
  1. package/dist/agents/claude-mcp.d.ts +7 -1
  2. package/dist/agents/claude-mcp.d.ts.map +1 -1
  3. package/dist/agents/claude-mcp.js +43 -10
  4. package/dist/agents/claude-mcp.js.map +1 -1
  5. package/dist/auth/credentials.d.ts +8 -0
  6. package/dist/auth/credentials.d.ts.map +1 -1
  7. package/dist/auth/credentials.js +35 -1
  8. package/dist/auth/credentials.js.map +1 -1
  9. package/dist/auth/device-flow.d.ts +4 -1
  10. package/dist/auth/device-flow.d.ts.map +1 -1
  11. package/dist/auth/device-flow.js +8 -3
  12. package/dist/auth/device-flow.js.map +1 -1
  13. package/dist/auth/oauth-server.d.ts +9 -1
  14. package/dist/auth/oauth-server.d.ts.map +1 -1
  15. package/dist/auth/oauth-server.js +19 -11
  16. package/dist/auth/oauth-server.js.map +1 -1
  17. package/dist/auth/revoke.d.ts +10 -0
  18. package/dist/auth/revoke.d.ts.map +1 -0
  19. package/dist/auth/revoke.js +31 -0
  20. package/dist/auth/revoke.js.map +1 -0
  21. package/dist/commands/login.d.ts +15 -1
  22. package/dist/commands/login.d.ts.map +1 -1
  23. package/dist/commands/login.js +34 -10
  24. package/dist/commands/login.js.map +1 -1
  25. package/dist/commands/logout.d.ts.map +1 -1
  26. package/dist/commands/logout.js +29 -11
  27. package/dist/commands/logout.js.map +1 -1
  28. package/dist/commands/video.d.ts +35 -0
  29. package/dist/commands/video.d.ts.map +1 -1
  30. package/dist/commands/video.js +475 -39
  31. package/dist/commands/video.js.map +1 -1
  32. package/dist/index.js +2 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/kit/core/canonical.d.ts +3 -1
  35. package/dist/kit/core/canonical.d.ts.map +1 -1
  36. package/dist/kit/core/canonical.js +1 -1
  37. package/dist/kit/core/canonical.js.map +1 -1
  38. package/dist/kit/core/check.d.ts +2 -0
  39. package/dist/kit/core/check.d.ts.map +1 -1
  40. package/dist/kit/core/check.js +12 -2
  41. package/dist/kit/core/check.js.map +1 -1
  42. package/dist/kit/core/detach.d.ts +11 -0
  43. package/dist/kit/core/detach.d.ts.map +1 -0
  44. package/dist/kit/core/detach.js +72 -0
  45. package/dist/kit/core/detach.js.map +1 -0
  46. package/dist/kit/core/diff.d.ts +5 -0
  47. package/dist/kit/core/diff.d.ts.map +1 -0
  48. package/dist/kit/core/diff.js +132 -0
  49. package/dist/kit/core/diff.js.map +1 -0
  50. package/dist/kit/core/errors.d.ts +7 -1
  51. package/dist/kit/core/errors.d.ts.map +1 -1
  52. package/dist/kit/core/errors.js +11 -1
  53. package/dist/kit/core/errors.js.map +1 -1
  54. package/dist/kit/core/eyes.d.ts +80 -0
  55. package/dist/kit/core/eyes.d.ts.map +1 -0
  56. package/dist/kit/core/eyes.js +366 -0
  57. package/dist/kit/core/eyes.js.map +1 -0
  58. package/dist/kit/core/files.js +2 -2
  59. package/dist/kit/core/files.js.map +1 -1
  60. package/dist/kit/core/lock.d.ts +4 -0
  61. package/dist/kit/core/lock.d.ts.map +1 -0
  62. package/dist/kit/core/lock.js +13 -0
  63. package/dist/kit/core/lock.js.map +1 -0
  64. package/dist/kit/core/log.d.ts +38 -2
  65. package/dist/kit/core/log.d.ts.map +1 -1
  66. package/dist/kit/core/log.js +38 -5
  67. package/dist/kit/core/log.js.map +1 -1
  68. package/dist/kit/core/outcome.d.ts +114 -0
  69. package/dist/kit/core/outcome.d.ts.map +1 -0
  70. package/dist/kit/core/outcome.js +246 -0
  71. package/dist/kit/core/outcome.js.map +1 -0
  72. package/dist/kit/core/patch.d.ts +64 -0
  73. package/dist/kit/core/patch.d.ts.map +1 -0
  74. package/dist/kit/core/patch.js +289 -0
  75. package/dist/kit/core/patch.js.map +1 -0
  76. package/dist/kit/core/paths.d.ts +17 -0
  77. package/dist/kit/core/paths.d.ts.map +1 -1
  78. package/dist/kit/core/paths.js +21 -0
  79. package/dist/kit/core/paths.js.map +1 -1
  80. package/dist/kit/core/pieces.d.ts +16 -4
  81. package/dist/kit/core/pieces.d.ts.map +1 -1
  82. package/dist/kit/core/pieces.js +84 -27
  83. package/dist/kit/core/pieces.js.map +1 -1
  84. package/dist/kit/core/progress-reporter.d.ts +21 -4
  85. package/dist/kit/core/progress-reporter.d.ts.map +1 -1
  86. package/dist/kit/core/progress-reporter.js +74 -12
  87. package/dist/kit/core/progress-reporter.js.map +1 -1
  88. package/dist/kit/core/progress.d.ts +41 -4
  89. package/dist/kit/core/progress.d.ts.map +1 -1
  90. package/dist/kit/core/progress.js +105 -18
  91. package/dist/kit/core/progress.js.map +1 -1
  92. package/dist/kit/core/refusal-log.d.ts +7 -0
  93. package/dist/kit/core/refusal-log.d.ts.map +1 -0
  94. package/dist/kit/core/refusal-log.js +54 -0
  95. package/dist/kit/core/refusal-log.js.map +1 -0
  96. package/dist/kit/core/run.d.ts +39 -5
  97. package/dist/kit/core/run.d.ts.map +1 -1
  98. package/dist/kit/core/run.js +514 -83
  99. package/dist/kit/core/run.js.map +1 -1
  100. package/dist/kit/core/save.d.ts +7 -3
  101. package/dist/kit/core/save.d.ts.map +1 -1
  102. package/dist/kit/core/save.js +57 -20
  103. package/dist/kit/core/save.js.map +1 -1
  104. package/dist/kit/core/style.d.ts +1 -0
  105. package/dist/kit/core/style.d.ts.map +1 -1
  106. package/dist/kit/core/style.js +1 -1
  107. package/dist/kit/core/style.js.map +1 -1
  108. package/dist/kit/line/client.d.ts +14 -2
  109. package/dist/kit/line/client.d.ts.map +1 -1
  110. package/dist/kit/line/client.js +40 -20
  111. package/dist/kit/line/client.js.map +1 -1
  112. package/dist/kit/line/types.d.ts +33 -1
  113. package/dist/kit/line/types.d.ts.map +1 -1
  114. package/dist/kit/maker/cues.d.ts +67 -0
  115. package/dist/kit/maker/cues.d.ts.map +1 -0
  116. package/dist/kit/maker/cues.js +204 -0
  117. package/dist/kit/maker/cues.js.map +1 -0
  118. package/dist/kit/maker/encode.d.ts +5 -0
  119. package/dist/kit/maker/encode.d.ts.map +1 -1
  120. package/dist/kit/maker/encode.js +7 -1
  121. package/dist/kit/maker/encode.js.map +1 -1
  122. package/dist/kit/maker/facts.d.ts +46 -0
  123. package/dist/kit/maker/facts.d.ts.map +1 -0
  124. package/dist/kit/maker/facts.js +159 -0
  125. package/dist/kit/maker/facts.js.map +1 -0
  126. package/dist/kit/maker/inputs.d.ts +48 -3
  127. package/dist/kit/maker/inputs.d.ts.map +1 -1
  128. package/dist/kit/maker/inputs.js +151 -22
  129. package/dist/kit/maker/inputs.js.map +1 -1
  130. package/dist/kit/maker/make.d.ts +20 -1
  131. package/dist/kit/maker/make.d.ts.map +1 -1
  132. package/dist/kit/maker/make.js +129 -21
  133. package/dist/kit/maker/make.js.map +1 -1
  134. package/dist/kit/maker/page.d.ts.map +1 -1
  135. package/dist/kit/maker/page.js +49 -1
  136. package/dist/kit/maker/page.js.map +1 -1
  137. package/dist/kit/maker/parts/html-frames/1.2.1/part.json +1083 -0
  138. package/dist/kit/maker/parts/html-frames/src/part.d.ts.map +1 -1
  139. package/dist/kit/maker/parts/html-frames/src/part.js +4 -1
  140. package/dist/kit/maker/parts/html-frames/src/part.js.map +1 -1
  141. package/dist/kit/maker/runtime.d.ts.map +1 -1
  142. package/dist/kit/maker/runtime.js +54 -7
  143. package/dist/kit/maker/runtime.js.map +1 -1
  144. package/dist/kit/maker/timing.d.ts +74 -0
  145. package/dist/kit/maker/timing.d.ts.map +1 -0
  146. package/dist/kit/maker/timing.js +152 -0
  147. package/dist/kit/maker/timing.js.map +1 -0
  148. package/dist/kit/maker/under.d.ts +126 -0
  149. package/dist/kit/maker/under.d.ts.map +1 -0
  150. package/dist/kit/maker/under.js +299 -0
  151. package/dist/kit/maker/under.js.map +1 -0
  152. package/dist/kit/parts/catalog.d.ts +3 -20
  153. package/dist/kit/parts/catalog.d.ts.map +1 -1
  154. package/dist/kit/parts/catalog.js +6 -41
  155. package/dist/kit/parts/catalog.js.map +1 -1
  156. package/dist/kit/parts/loader.d.ts +7 -2
  157. package/dist/kit/parts/loader.d.ts.map +1 -1
  158. package/dist/kit/parts/loader.js +88 -23
  159. package/dist/kit/parts/loader.js.map +1 -1
  160. package/dist/skills/master-skill.d.ts +4 -6
  161. package/dist/skills/master-skill.d.ts.map +1 -1
  162. package/dist/skills/master-skill.js +28 -28
  163. package/dist/skills/master-skill.js.map +1 -1
  164. package/dist/skills/routes.js +5 -5
  165. package/dist/skills/routes.js.map +1 -1
  166. package/dist/skills/server-entry-skills.d.ts +6 -6
  167. package/dist/skills/server-entry-skills.d.ts.map +1 -1
  168. package/dist/skills/server-entry-skills.js +89 -60
  169. package/dist/skills/server-entry-skills.js.map +1 -1
  170. package/dist/utils/browser-preflight.d.ts +3 -0
  171. package/dist/utils/browser-preflight.d.ts.map +1 -1
  172. package/dist/utils/browser-preflight.js +27 -6
  173. package/dist/utils/browser-preflight.js.map +1 -1
  174. package/dist/utils/exit.d.ts +6 -0
  175. package/dist/utils/exit.d.ts.map +1 -0
  176. package/dist/utils/exit.js +37 -0
  177. package/dist/utils/exit.js.map +1 -0
  178. package/package.json +14 -3
  179. package/skills/goose-ads/SKILL.md +8 -8
  180. package/skills/goose-product-photos/SKILL.md +8 -8
  181. package/skills/goose-video/SKILL.md +29 -595
  182. package/skills/goose-video-local/SKILL.md +3 -1572
  183. package/skills/gooseworks/SKILL.md +10 -12
  184. package/skills/make-custom-video/SKILL.md +25 -672
  185. package/skills/manifest.json +7 -7
  186. package/skills/routes.json +3 -3
  187. package/dist/kit/maker/parts/html-frames/1.1.0/part.json +0 -199
  188. package/dist/skills/production-video-skills.json +0 -5
@@ -1,608 +1,42 @@
1
1
  ---
2
2
  name: goose-video
3
- slug: goose-video
4
- description: >
5
- Start a video ad in the same chat. Resolve the brand and suggest supported formats with a
6
- picker or the returned text choices. An agent with a verified shell makes the video with
7
- goose-video-local; a chat host hands the same project to the GooseWorks coworker. Review
8
- one complete template plan and total credits before production. Custom videos retain two authenticated review gates in this chat.
9
- category: ads
10
- version: 4.1.1
11
- author: GooseWorks
12
- tags: [gooseworks, ads, video, local-render, coworker, chat]
3
+ description: "Make a video ad in this chat. Study a supplied video reference before comparing styles; follow the next_step in every answer."
4
+ version: 4.4.4
13
5
  ---
14
6
 
15
- # GooseWorks Video Ads — choose, review, make
7
+ # GooseWorks video
16
8
 
17
- ## How to talk to the customer (applies to every message you send them)
9
+ From an installed entry, first catalog_fetch type skill goose-video on this same connection and follow that body. An entry already fetched in this run needs no repeat fetch.
18
10
 
19
- The customer is a marketer or founder, not an engineer. Everything in this skill about tools,
20
- fields, files, polling, models and pipeline steps is for YOU. Never pass it on to them.
11
+ For a video already started, call video_read and follow its next_step.
21
12
 
22
- - **Say what they get and what they need to decide, never how it's made.**
23
- Bad: "Checking the media-proxy helpers for voiceover timestamps and lipsync." / "Generated with
24
- gpt-image-2 at high quality, mouth closed, passes QC."
25
- Good: "Recording the voices now." / "Here are your two hosts."
26
- - **Never mention** tool, file or field names, ids, JSON, commands, scripts, installed software,
27
- uploads, model or vendor names, timings in seconds or frames, retries, polling, internal statuses
28
- or your own quality checks. Fix what you can quietly. If they ask how something works, explain it
29
- simply.
30
- - **Update them only at milestones they care about**: choices confirmed, script and voices done,
31
- visuals done, ready to review, finished. One short line each, then stay quiet until the next
32
- milestone. No update for setup, downloads, uploads or saving.
33
- - **Money is in credits, with a number**: "the full video uses about N credits". Never "the cheap
34
- pieces" or "the expensive render".
35
- - **Problems:** say what it means for them and what they can do, in one or two sentences. No error
36
- codes or stack traces. Only raise a problem that changes something for them.
37
- - **Use their words**: script, voice, hook, scene, host, ending, logo, the product shot.
38
- - **No filler**: no "Great question!", "Certainly!", "I hope this helps!", no restating what they
39
- just said at length.
13
+ Explicit custom: skip steps 5–6. Keep their mechanics and assets; research the brand/product and study the reference for its custom plan. Check current custom support before any write.
40
14
 
41
- Example. Instead of a dozen lines about render tools, scripts, uploads and portraits, send:
42
- "Got it: warm tone, home podcast studio, Brielle as the skeptic and Mark as the believer." then
43
- "Script and voices are done (about 34 seconds)." then "Ready for you to review: the script, voices,
44
- both hosts and the ending. You can also review your recipe ingredients in the app: <link>. Say go
45
- here and I'll make the full video (about N credits)."
15
+ For other new videos start with get_started (wants video, request). A card is not a style choice or proof of viewing. Follow the reference rule before style selection or a plan.
46
16
 
47
- ## Use current instructions for new work
17
+ 1. The request. If they haven't said what the video is about, ask in one short question.
18
+ 2. The brand. Ask which brand only when brand_read lists several; with one, use it.
19
+ 3. The product. Named or none wanted: find its id with brand_read (sections: products), or use []. Otherwise the product card asks: say one line and wait. Without cards, ask which product by name; use the only one, or go on with none. Never ask again after a pick.
20
+ 4. Research. Read the brand kit, learnings and the chosen products with brand_read (sections kit and learnings, plus the products' ids), then knowledge_search for them. Note what to say and avoid.
21
+ 5. The styles. Call video_formats with the request and the products' ids ([] for none). The customer picks; never recommend one. A style they named that the answer lists as available is their pick. Otherwise, with the style card on screen, say one short line and wait; without one, print the style table from the answer as it is and ask nothing else.
22
+ 6. The plan. Call video_create with the picked style and the products; its next_step says what follows.
48
23
 
49
- Before a new task in a terminal host, run `gooseworks skills status` once. It compares the
50
- installed entry files, running CLI and published npm release. An older CLI needs a package
51
- upgrade before `gooseworks update`; update alone only uses that CLI's bundled instructions.
52
- Preserve local edits or unknown install provenance. Review/back up before explicitly replacing
53
- modified files; never quietly reinstall over them. If the release check is unavailable, report
54
- that freshness is unknown rather than claiming the local copy is latest.
24
+ ## A supplied video reference comes first
55
25
 
56
- For a new recipe run, fetch its package from the connected catalog. Retain the returned
57
- `version` / `contentHash` and every dependency's hash with the saved package. When reusing a
58
- saved fetch JSON, `gooseworks fetch <slug> --saved-package <file>` returns the current package
59
- and a hash comparison without changing that file. With MCP, if the advertised `catalog_fetch`
60
- schema accepts them, send `saved_content_hash` and `saved_dependency_hashes`; otherwise fetch
61
- normally and compare the returned hashes yourself. Missing hashes mean unknown, not current.
62
- The server cannot inspect a client's saved files; hash metadata does not certify later edits.
63
- Fetch current packages into a new run directory and report stale saved instructions. Preserve
64
- an existing approved run's recorded package; changing that harness requires a reviewed change
65
- and approval before spending. Hosted installed snapshots use the existing Skills Update action.
66
- Skill content and a host's cached MCP tool schemas are separate: refreshing one does not refresh
67
- the other. Check the actual advertised tools before using new fields.
26
+ Watch the actual video before choosing a style or writing a custom plan. Play through it, or inspect timestamped frames spanning it plus its audio/transcript. A URL, title, caption or thumbnail is not a viewing. Record the hook, scene order, pacing, narration/dialogue, framing, product interactions, text and ending, with timestamps and gaps. If access or sampling cannot answer an essential detail, ask for an accessible video or their choice to continue from the brief; never claim it was watched.
27
+ When they have not chosen custom, call video_formats after brand research. For plausible matches, catalog_fetch type template returns the style's plan_note, scenes, duration, cast, sound and assets. Compare these against the observed reference and their essential choices. A similar title or high brand ranking does not prove a match. Explain fit or mismatch before they choose. Keep an explicit style choice; do not quietly change constraints or over-adapt it. Reassess a later reference before creating or rewriting a plan.
28
+ If no available style fits, or they explicitly want custom, catalog_fetch type skill make-custom-video on this connection before a project write. Require its complete production-harness dependency and current custom schemas. Follow its separate authenticated script and ingredient approvals, cumulative budgets and verified execution capability. If anything is unavailable, say so and keep the brief; do not substitute a template, import the reference as a finished video, use retired actions or switch environments. Fetching a skill alone proves no execution capability.
68
29
 
69
- ## Purpose
30
+ ## Rules
70
31
 
71
- Resolve the brand, show supported formats and create one saved project. An agent with a verified
72
- shell follows **`goose-video-local`**. A chat host delegates that same project to the GooseWorks
73
- coworker, which renders in its sandbox. This is agent execution, not a recipe server-order API.
74
-
75
- **Cards and execution are separate capabilities.** A terminal may render without drawing a
76
- picker; a chat host may draw a picker while the coworker renders. Follow `card.display_hint`
77
- and `available_here`, never a guess from the host's name. Template-remix review stays in this
78
- chat. Custom videos use separate authenticated script and ingredient approvals in this same chat.
79
- Studio is an optional review surface.
80
-
81
- ## Prepare the video workflow and brand before creative work
82
-
83
- **Installed entry files are bootstrap instructions.** For new work started from an installed
84
- file or an old chat, fetch `catalog_fetch { type: "skill", slug: "goose-video" }` on the selected
85
- connection and read its returned content and dependencies before continuing. Use the already
86
- fetched body when this entry came from that connection in this run; do not recursively fetch
87
- the same entry. A CLI freshness warning does not block using the current connected package.
88
- Keep the fetched package and hashes in a new run folder; do not replace edited installed files.
89
- If current instructions cannot be loaded, resolve the connection before format suggestions,
90
- script writing or production. Do not continue from an old installed workflow or session notes.
91
-
92
- **Follow the connector's full-guide requirement when available.** Fetch
93
- `catalog_fetch { type: "skill", slug: "gooseworks-guide" }` when the connector requires it.
94
- The only older-server exception is below; it never removes brand preparation or approvals.
95
-
96
- | Returned guide/workflow state on the selected connection | Required action |
97
- | --- | --- |
98
- | Guide returns `not_found`, and this same connection already returned the complete current matching video entry with its required dependencies | Continue with that authoritative entry's workflow, full brand preparation and existing approvals. |
99
- | Guide has another error, no response, or incomplete content; or the matching entry/dependencies are missing, incomplete or from another connection | Stop before creative work, project writes or paid calls; resolve a compatible connection on this same environment. |
100
-
101
- A missing custom entry or required custom tool/schema remains unavailable: never substitute
102
- a template or an import to bypass it. Never hide other fetch errors or continue from cached
103
- instructions merely because the guide was not found.
104
-
105
- **For an existing project or batch, read `video_project_read` first.** Determine its actual
106
- route and saved review state before fetching a recipe or doing local work. Resume an approved
107
- run with its recorded packages, brand inputs, script and ingredients; do not silently replace
108
- them with today's release or brand rules. Follow returned preparation requirements and use
109
- the existing affected review/approval flow for an intentional change. Reads, free drafts,
110
- imports and existing-job retrieval do not grant permission for new paid production.
111
-
112
- **For every new plan, resolve the brand and call**
113
- `brand_read { brand_id, sections: ["summary", "kit", "products", "learnings"] }` **before**
114
- suggesting formats, mining video angles, writing any script, creating a production plan or
115
- handing the work to another agent. Use `brand_get_context` with those same four sections only
116
- when advertised. Reuse a complete read from this run on the same connection and brand.
117
- Onboarding completion, a summary-only response and earlier session notes do not supply the
118
- kit, selected product facts or saved rules. If the full read is unavailable, resolve it before
119
- creative work. Use known kit facts while research is incomplete; do not restart research
120
- solely because its status is pending. Never invent a product fact or accept a campaign to
121
- bypass preparation. Then search the Brand Brain (next section) before suggesting formats,
122
- choosing an angle or asking the user for a brand fact.
123
-
124
- Carry that context through custom/template/idea routing and delegation. Before writing, make
125
- the workflow's brand-rules file from those sources: pronunciations, required spoken copy,
126
- prohibited claims, real logo, font, palette and the selected product's supported facts.
127
- Entries prefixed `Video preference:` and visual/pacing instructions are creative direction,
128
- not spoken lines. Use the kit's audience, offer and voice as defaults without an interview.
129
- The rules file mirrors context; it is not proof of a read or permission to spend. Keep the
130
- route's existing script, ingredient and budget approvals, including its allowed previews.
131
-
132
- **Use the server's brand bundle when the selected API returns it.** Project create/read may
133
- return top-level
134
- `brand_context`: `{ version: 1, brand_id, digest, loaded_at, sections, brand, kit, products,
135
- learnings }`. Its sections cover summary, kit, products and learnings.
136
-
137
- | Returned brand/project response on the selected connection | Required action |
138
- | --- | --- |
139
- | A complete authoritative version-1 `brand_context` is returned | Binding is required: use its contents for the plan/rules and include `script_drafts.brand_context_digest = brand_context.digest` with each new/changed script save. |
140
- | An older API returns the actual four brand sections but no `brand_context` in either the brand read or project response | Prepare from those full sections, write the brand rules and follow the selected connection's existing approval flow and advertised fields. Do not fabricate a receipt or send nonexistent bundle/digest fields. |
141
-
142
- An incomplete/malformed bundle or missing brand section is a preparation failure, never the
143
- older-API exception. Once this connection returns an authoritative bundle, use its binding
144
- contract. `script_drafts.video_brand_context` is server-owned: do not author, replace or forge
145
- it, and do not invent a read receipt or hash local brand facts into one. Keep the full bundle
146
- out of client review payloads. If managed generation returns HTTP 409
147
- `video_brand_context_required`, reload the project and bind the plan to its returned bundle
148
- through the normal review flow before retrying. That refusal never permits the older-API
149
- fallback, skipping sections or retrying paid calls blindly. Unchanged approved legacy resumes
150
- retain their package, context and approvals; an upgrade alone needs no extra approval.
151
-
152
- **To apply a deliberate brand correction to a new or revised plan**, make a fresh, unfiltered
153
- `brand_read` of those four sections. When it returns the authoritative bundle, use its
154
- returned `brand_context.digest` in the complete revised `script_drafts` through the existing
155
- `video_project_upsert` `patch.script` save; the server verifies the current brand and replaces
156
- its snapshot with the saved plan. On an older API with no bundle contract, apply the actual
157
- four-section correction and save the revised draft through its existing flow without inventing
158
- digest fields. If a connection that already returned a bundle cannot supply the fresh bundle,
159
- resolve that failure before rebinding. Review and approve the affected script, ingredients and
160
- budget through the normal flow. Never refresh an ongoing approved run automatically; its
161
- recorded package and brand inputs stay pinned until an intentional change.
162
-
163
- ## Search the Brand Brain, then propose — before any creative choice or question
164
-
165
- The Brand Kit is a summary. The brand's saved knowledge (its Brain) holds what the Kit does not:
166
- rules from past feedback, approved and rejected creatives, customer evidence, approved claims,
167
- reports and documents. **After `brand_read`, and before you choose an angle, claim, hook,
168
- product emphasis, format or source ad — and before you ask the user for any brand fact — call
169
- `knowledge_search { brand_id, query }`** when it is registered. It is free and read-only: no
170
- approval, no announcement to the customer and no questionnaire.
171
-
172
- 1. **Search for this task, not the whole Brain.** Run one short query (under 500 characters) in
173
- the user's own words plus the product (for example "ads for <product>: what worked, what to
174
- avoid") and one with
175
- `source_types: ["evidence", "claim", "learning", "creative", "document"]` for proof and past
176
- creative results. Add a query only for a specific open question. Reuse results from this run.
177
- 2. **Keep these states distinct** and record which one each query returned:
178
-
179
- | Result | Means | Do |
180
- | --- | --- | --- |
181
- | `status: "ok"` with matches | Saved knowledge exists | Use it; keep each fact's citation in your working brief |
182
- | `status: "empty"` | Nothing saved matches this query | Say "no saved evidence for <topic>", never "the brand has no proof" |
183
- | `refresh_required` | The results shown are current; some changed sources were left out | Use them; search again shortly for anything missing |
184
- | `building` | The index is not ready | Retry once shortly, then continue with the gap stated |
185
- | An error, or the tool is not registered | Retrieval failed or is unavailable | Retry an error once, then continue from `brand_read` and treat evidence as unchecked |
186
- | An empty Kit field | Only that field is blank | Not a search result: still search before asking |
187
-
188
- 3. **Let the findings change the plan.** A `dont`/`must` learning or a rejected creative rules
189
- options out; an approved or well-rated past creative is a proven angle to lead with; a report
190
- shows what worked. Claim-grade proof is a result with `approved_ad_claim: true` or the kit's
191
- `approvedClaims` within their stated applicability; the kit's `proofPoints` are what the
192
- backend allows an ad to state, used as written. Other Kit text, documents and performance
193
- numbers are context, never public claims. Never invent an offer, price or result. Judge
194
- relevance and skip results about another product or business.
195
- 4. **Propose; don't interview.** Lead with one recommended direction (angle, product, source or
196
- format) and a one-line reason naming what you found, with up to two alternatives. When several
197
- directions fit (two audiences, products or campaigns), pick the one the evidence favours, such
198
- as an active campaign or approved past creatives, and name the other as an alternative instead
199
- of asking. Ask only for a decision the brand read and the search cannot settle, or for spend
200
- approval. Never ask the user for a fact the Brain already answered.
201
- Keep directions already chosen (the user's words, a project's creative brief, handed-off
202
- defaults, approved plans): search only to fill empty fields and to apply saved rules. When a
203
- returned card or picker presents the choice, your recommendation is its one acknowledgement
204
- line and the saved plan's defaults, not a separate list.
205
- 5. **Carry an evidence brief** into the routed skill, writer or plan: findings with citations,
206
- the state of each query, what it ruled out and the open gaps. Tell the customer the findings
207
- in plain words; the citations stay in the brief.
208
-
209
- On an approved resume, keep the saved brief and evidence; search again only for a new decision.
210
-
211
- ## Custom videos: check formats first
212
-
213
- First check the catalog: when the brief names or implies a listed format (for example a street interview, testimonial, podcast or chat video), show that format and its fit through the format flow below, including its support status. Go custom only when no format fits and the customer chooses custom after hearing why; custom keeps that format's hard constraints. For an original brief without a reference template, an Instagram reel/post URL or a direct video URL to study, fetch `catalog_fetch { type: "skill", slug: "make-custom-video" }` and follow it in this same session. It creates format:"custom", custom_mode:"generate" with the brief and optional reference_url. Growth executes in its managed sandbox; connected agents use their shell. Script and actual ingredients are reviewed and separately approved in the same chat before paid production; Studio is optional. Do not force a template that does not fit or that the customer declined, and do not import the reference as a finished video.
214
-
215
- ## Run the format's route check before proposing it
216
-
217
- A catalog row says what a format is best for and ranks it for the brand. It does not say whether
218
- the format can make the setup the customer asked for (how many people, mic only, no product).
219
- Some renderers declare a route selector that decides that; today that is the street interview
220
- (`render-street-interview`). Before you propose, script or create a street-interview project,
221
- template or custom, check the request against its routes:
222
-
223
- | Street route | On screen | Needs | Makes |
224
- | --- | --- | --- | --- |
225
- | Guessing (`product-guess`) | Interviewer and up to four people | A physical product to hand over, photographed on its own | A finished video |
226
- | Conversation (`mic-only`, `product-sample`, `concept-challenge`) | Interviewer and one person | No product photo, phone, screen or UI | A script and prompt preview only, no finished video yet |
227
- | Street testimonial (its own format) | One person talking to camera, no interviewer | The creator still its recipe prescribes | A finished video, when the catalog lists it |
228
-
229
- Neither interview route takes a photo of a person: people are described in text, so never
230
- propose putting a founder's or creator's face in one. Keep the customer's named setup: never
231
- change the interaction, mode or number of people just to make a check pass.
232
-
233
- **Never offer guessing to software or a service.** The guessing route needs a physical product
234
- to hand over. When what the brand sells is software, an app or a service (nothing a person can
235
- hold), never offer or script guessing, not even with a laptop, phone or other device showing the
236
- app as the prop: the device is a prop, so `offering_type` stays `digital` or `service` and the
237
- selector says unsupported. A brand that sells a physical product, including a device or
238
- hardware that comes with an app, can still use guessing with that product. Offer the table's
239
- real alternatives instead: a one-person conversation (a script and prompt preview only, no
240
- finished video yet), the street testimonial if the catalog lists it and does not rule it out,
241
- or custom. Asking again never unlocks a route the table or the selector rules out.
242
-
243
- When they asked for a street interview, the catalog may mark (newer servers do) the
244
- street-interview rows `fit.ok: false` for such a brand: they can't make a finished video for it.
245
- That verdict is about the finished video, so still offer the one-person conversation, saying
246
- plainly that it is a script and prompt preview only. If the brand read shows the brand sells the
247
- device itself but the catalog rules guessing out, tell the customer the catalog flagged it and
248
- confirm what they sell before offering guessing with that device.
249
-
250
- - **Without a shell** (a chat host), decide from this table. Do not fetch the renderer: its
251
- package is far too large for a chat.
252
- - **With a shell** (the customer's computer or the coworker sandbox), also run its free
253
- selector, which makes no paid call. If the fetch or the run fails, decide from the table.
254
- 1. Fetch the renderer to a file, not into the conversation: its inline package is over a
255
- million characters. Either save the JSON from `gooseworks fetch render-street-interview > <file.json>`,
256
- then write each `scripts` entry as
257
- `/tmp/gooseworks-scripts/render-street-interview/scripts/<name>` and each `files` entry at
258
- `/tmp/gooseworks-scripts/render-street-interview/<path>`. Or call
259
- `catalog_fetch { type: "skill", slug: "render-street-interview", delivery: "archive" }`,
260
- extract the ZIP, check each file against its `manifest.json` hashes and copy the contents of its
261
- `agent-config/skills/render-street-interview/` folder into
262
- `/tmp/gooseworks-scripts/render-street-interview/`. Either way the selector reads
263
- `references/street-reference-library.json` from that folder.
264
- 2. Write a brief JSON. `mode` and `interaction_type` go in pairs: `product-guess` with
265
- `product-guess`, or `conversation` with `mic-only`, `product-sample` or `concept-challenge`.
266
- `offering_type` is exactly `physical`, `service` or `digital` (software, SaaS and apps are
267
- `digital`). `participants` is a whole number: people interviewed on screen, not counting
268
- the interviewer. Leave it out when the customer named no count; the selector then uses the
269
- route's usual cast. When the customer named no interaction, run each mode that could fit.
270
- 3. Run `python3 /tmp/gooseworks-scripts/render-street-interview/scripts/prepare_script_context.py --brief <brief.json> --out <context.json>`.
271
- Read `status` and `brief_gaps` in the output file, not the exit code: it exits 2 for every
272
- status except `ready-for-writing`. A Python traceback is not a verdict: the brief or the
273
- saved files are wrong (for example the reference library in the wrong folder). Fix them and
274
- run it again.
275
- 4. A run with any `brief_gaps` has not checked the route. Fix every gap and run it again.
276
-
277
- **An unsupported setup is a stop.** `unsupported-route`, or a request the table rules out,
278
- means this setup can't be made. Tell the customer plainly, in one line, for example: "A
279
- three-person mic-only street interview isn't something we can make yet: that version takes one
280
- person, and the three-person version needs a physical product to hand over." Then offer the
281
- closest supported options in plain words, each with how it differs. With a shell, these are the
282
- selector's `alternatives`. Without one, take them from the table:
283
-
284
- - when only the number of people was the problem, the same setup within its limit: guessing
285
- (a physical product only) with up to four people, a finished video; or a conversation with
286
- one person, a script preview only;
287
- - for something people can't hold (software, a service), a one-person conversation instead
288
- of guessing;
289
- - one person talking to camera with no interviewer, if the catalog lists that format;
290
- - a custom video, untested, that keeps the street format's limits.
291
-
292
- Never use route names or the script's wording. Do not create the project or write a script for
293
- it. Go custom only if the customer picks it; a custom video keeps the street format's hard
294
- constraints, which make-custom-video lists.
295
-
296
- **A supported setup.** With empty `brief_gaps`, any other status means the route exists.
297
- `needs-reference` means no observed reference ad matched yet: it does not block proposing the
298
- format; carry it into the handoff so the script step resolves or reports it before script
299
- approval. Carry the route too: which one, how many people, finished video or preview only, and
300
- no person photos. A preview-only route makes a script and prompt preview, not a finished video:
301
- say so before the customer chooses it.
302
-
303
- ## Route first: is this a new video?
304
-
305
- Hand off to **`goose-video-local`** now, and stop following this skill, for:
306
-
307
- - an existing **project** id or a **video batch** id;
308
- - the app's copy-for-Claude command (it names `goose-video-local`);
309
- - "remix this video ad template" for a specific app template.
310
-
311
- Load the current `goose-video-local` entry with
312
- `catalog_fetch { type: "skill", slug: "goose-video-local" }` on the GooseWorks MCP (older clients:
313
- `fetch_skill("goose-video-local")`), unless already fetched on this connection in this run.
314
- It reads the project first and retains an approved run's recorded recipe packages.
315
-
316
- When they ask **what** to make ("give me video ad ideas", "what angles should I use?", "what's
317
- working for my competitors?"), fetch **`ad-angle-miner`** (`catalog_fetch { type: "skill", slug: "ad-angle-miner" }`,
318
- using its advertised tools) and run it with the **video** output. It returns ranked
319
- video ideas mapped to formats and hands the picked ones to `goose-video-local`.
320
-
321
- Everything else, including "make me a video ad for <brand>", starts at step 1 below.
322
-
323
- ## Keep the selected connection for the whole run
324
-
325
- Call `account_whoami` on the connection that owns the brand/project before the first write.
326
- Keep `environment.name` and the public `environment.api_origin` with this run. Respect the
327
- user's selected production or staging connection. If multiple connections are available and
328
- none was selected, resolve that once. Missing or unknown identity is uncertainty, not
329
- permission to switch. Never infer the environment from credits, billing links or Node mode.
330
-
331
- Reads, project creation, uploads, generation, polling and final updates all use that same
332
- connection. If a production request fails, resume or report the failure on production;
333
- never retry it on staging or recreate the project there. Before retrying a timed-out write,
334
- read back the existing project or paid request on the selected connection.
335
-
336
- Local/CLI proxy origin must match `environment.api_origin`. If it differs, use the MCP
337
- relay on the selected connection (`GW_MEDIA_VIA=mcp`) before paid calls. Do not change
338
- credentials or API origins to recover a failed write. An explicit user-requested move is
339
- a separate operation, with the existing project and paid requests reconciled first.
340
-
341
- ## Check assets for the selected format before spending
342
-
343
- For a template, read its structured `asset_readiness` from
344
- `video_catalog_list { kind: "formats", brand_id }`. `missing` names gaps;
345
- `needs_review` means suitability is unverified, including older recipes without
346
- structured requirements. `ready` describes assets only, not script or budget approval.
347
- For a custom video, derive requirements from its actual approved scenes.
348
-
349
- Inspect candidate files for the chosen product and format. A catalog photo can contain
350
- multiple objects, other products or a person; its existence or approved status does not
351
- make it a standalone image of the selected product. Check object count, framing, readable
352
- print and real image bytes. A service conversation has no automatic packshot requirement.
353
-
354
- Reuse a suitable approved image first. A free crop or cutout is a new file: keep the
355
- original, inspect the result and include it in the normal ingredient review. When no
356
- usable input exists, explain the gap before generation. Estimate any paid preparation
357
- separately before spending. Record the selected asset and inspection in the project
358
- review set; do not add a separate approval round.
359
-
360
- ## Inputs
361
-
362
- - A brand, usually named in the request. Resolve it from the accessible brands; one brand needs no question.
363
- - The customer's goal, occasion, audience, selected angle and constraints when supplied; otherwise propose defaults from the verified kit.
364
- - The selected format's required assets. Presence does not prove suitability; uncertain assets remain “needs review.”
365
-
366
- ## Save durable brand answers, then verify them
367
-
368
- Read the selected brand with `brand_read { brand_id, sections: ["summary", "kit", "products", "learnings", "onboarding"] }`
369
- (older clients: `brand_get_context` with the same sections, only when that tool is advertised).
370
- Keep founder answers, user corrections, research and your own hypotheses distinct. Reuse
371
- matching saved answers; ask only about gaps.
372
-
373
- When the user asks to remember a rule, answers a brand interview, or explicitly corrects a
374
- standing fact, save that answer in the same turn. The capture request authorizes those answers;
375
- do not ask for approval again. A direction for this one video stays in its brief. If the scope
376
- is genuinely ambiguous, ask whether it applies to future videos before saving a standing rule.
377
-
378
- Use the **live registered schema**. Where supported, call `brand_update` with
379
- `knowledge_intent: "user_correction"` and `user_statement` containing the user's exact,
380
- verbatim answer, not your paraphrase or researched text.
381
- For an inference or suggested improvement, use `knowledge_intent: "agent_proposal"`. Show the
382
- before/after change from your prior read and proposed value; retain the returned proposal IDs
383
- and say the user must accept it in the app. Link only a review surface actually returned by a
384
- tool; the compact `knowledge_updates` response does not itself contain a diff or URL.
385
- A pending proposal is not a saved fact. Never call an unavailable
386
- tool or silently relabel research or your inference as something the user said.
387
-
388
- The safe structured shape is `patch: { knowledge: { positioning?, audience?, voice?,
389
- instructions?, brandType?, tagline?, valueProps? } }`, using only fields present in the live
390
- schema. Inferred rules/taste go in an `instructions` proposal with a rationale, never in
391
- `patch.facts`. Prefix every video-only preference in that proposed text with "Video preference:"
392
- so it remains production direction after acceptance. Preserve unrelated instructions when
393
- proposing a merged replacement.
394
-
395
- | User answer | Canonical write |
396
- | --- | --- |
397
- | Primary audience, positioning or voice correction | `patch.knowledge: { audience/positioning/voice: <answer> }` (one actual key). During onboarding, `brand_onboarding { action: "review_research", review: { action: "correct", field, value } }` writes these existing corrections with provenance. |
398
- | Founder story, customer pains, objections, buying trigger or useful audience detail without a structured field | `patch.facts: [{ kind: "insight", text }]`; retain attribution such as "Founder reports: …" rather than turn a belief into a verified result. |
399
- | Required wording or pronunciation | `patch.facts: [{ kind: "must", text }]`; pronunciation is exactly `Pronounce "<term>" as "<say_as>"`. |
400
- | Forbidden claim, word or visual | `patch.facts: [{ kind: "dont", text }]`. |
401
- | Durable visual, voice or pacing preference | `patch.facts: [{ kind: "do", text }]` for a preference; `dont` for an avoidance; `template_hint` for a preferred format. Prefix video-only preferences with "Video preference:". |
402
-
403
- Facts are existing `ad_brand_learning` rows with user provenance; they are not a second profile.
404
- Update a matching rule by its returned `id` instead of adding duplicates. Preserve unrelated
405
- rules and the user's exact meaning. Only use the legacy facts shape for explicitly user-authored
406
- answers when the live schema lacks intent fields; agent suggestions still need a proposal path.
407
-
408
- **Claims and plans have separate gates.** A founder assertion or proof point is not an approved,
409
- evidence-backed claim or consent to quote a customer. Use the existing evidence/claims and
410
- operating-plan tools only if registered, following their proposal, evidence and confirmation
411
- requirements. Never encode a spend cap, approver or emergency stop as a learning. If that write
412
- path is missing, report the specific unsaved item and keep it pending for the supported review
413
- surface; do not claim it was saved or create a parallel local profile.
414
-
415
- After every write, **read back before saying saved**: use `brand_read` with `kit`, `learnings`
416
- or `onboarding` as appropriate, or `brand_onboarding { action: "status", brand_id }` after an
417
- onboarding answer. Verify the intended field/rule, its source and the absence of a conflicting
418
- duplicate. A generic success response, pending proposal, ignored key or truncated result is not
419
- proof. Report partial saves honestly. Carry the verified rules into the current task and the
420
- routed skill; claims still pass their own safety gate.
421
-
422
- ## Video taste — reuse examples and preferences
423
-
424
- When asked to capture video taste, or when the user volunteers a durable video preference,
425
- first read the saved learnings and `media_list { brand_id, scope: "brand", scope_id: brand_id,
426
- tags: ["video-taste"], limit: 100 }`. Follow `next_cursor` before deciding an example is absent.
427
- Do not force a taste interview before an unrelated task or ask again for an existing preference.
428
-
429
- Save what the user has already supplied first. Then ask only the missing useful question, for
430
- example: "What do you like about this video—its pace, voice, captions, or look?" An inaccessible
431
- link can still be saved as a link with the user's explanation; do not pretend you watched it.
432
-
433
- - **Direct clip or video file:** register with `media_upload { brand_id, scope: "brand",
434
- scope_id: brand_id, kind: "video", source: { type: "url", url }, tags: ["video-taste", "reference-only"],
435
- metadata: { purpose: "video_taste", source_url: url, provenance: "user", captured_at: <ISO timestamp>,
436
- preference: <the user's explanation> } }`. For a file use the live file/bytes upload flow and
437
- `media_confirm` after a presigned upload. Registration of a URL does not copy or inspect it.
438
- - **Instagram/post/page link:** the same registration with `kind: "document"`; it is a link
439
- bookmark, not downloadable footage or an indexed transcript. Do not fabricate a direct clip URL.
440
- - **Preferences:** save the user's reasons, likes and dislikes through the facts mapping above.
441
- Read and preserve existing facts before updating one. Do not invent `video_preferences` or
442
- new `video_lab` keys; the live kit patch accepts only its documented asset fields.
443
- - **Deduplicate:** reuse a matching returned media row, then `media_update` its title/tags/metadata
444
- if needed; preserve existing metadata and tags. Do not create another row for the same example.
445
- Read back with `media_list` and `brand_read` learnings before claiming it was saved.
446
- Check the returned row belongs to this brand: URL deduplication may return another brand's
447
- existing row. Do not relabel that row or claim success unless the current brand's scoped read
448
- actually returns it. Report an unsaved association if no supported attach path is available.
449
-
450
- Never put third-party taste examples into kit reference images: `kind: "reference"` at brand
451
- scope writes there. The tags and metadata above record purpose and provenance; **they do not
452
- grant or enforce usage rights**. Study the structure, pacing and look only. Never use the example's
453
- footage, face, product, testimonial or claims in a new ad without independently verified permission.
454
-
455
- Read video-only entries prefixed `Video preference:` from both saved learnings and
456
- `kit.instructions`, including accepted proposals. Keep them out of required or forbidden
457
- dialogue. Build a brief from the verified readback: preferred pace, voice, caption treatment, visual style,
458
- formats to favour/avoid, reference links and the user's reasons. Say what is still unknown.
459
- Pass it with the brand rules into the existing video workflow. A one-video request overrides a
460
- default for that project; it does not silently rewrite the brand's standing preference.
461
-
462
- ## Composed Atoms
463
-
464
- Use the live canonical schemas: brand_read, brand_create, video_catalog_list,
465
- video_project_upsert, video_project_read, catalog_fetch, goose_run_task and job_cancel.
466
- An old tool name in a recipe is not grounds for terminal-update advice in a chat host.
467
-
468
- ## Paid media: images, clips, voice
469
-
470
- **No FAL_KEY, ElevenLabs key or `fal_client` is ever needed.** Use
471
- `data_post_provider { provider: "fal", path: <model id, e.g. "fal-ai/nano-banana/edit">, body: <model input>, project_id }`
472
- then `job_get { job_id }`; voice/music use provider:"elevenlabs". Upload local inputs through
473
- media_upload first. **A missing key is never a blocker.** `photos_generate` is **not** a general
474
- image tool: it photographs physical catalog products only. Use goose-video-local for the
475
- runtime, paid approval, asset saving and quality checks.
476
-
477
- ## Workflow
478
-
479
- ### 1. Resolve the brand, quietly when you can
480
-
481
- Call brand_read without brand_id to list accessible brands. Resolve the customer's name from
482
- actual returned names. One brand, or exactly one match: state it and continue. Several possible
483
- brands: show names and websites and ask once. No match: show accessible brands and offer to add
484
- one only when the customer asks and supplies its website; never guess the URL.
485
-
486
- Read `brand_read { brand_id, sections: ["summary","kit","products","learnings"] }` before
487
- choosing a format. Reconcile explicit brand corrections through the durable capture rules.
488
- A direct video request does not require first-campaign acceptance. Follow any returned
489
- request-specific setup requirement; never mark research complete or accept a campaign to
490
- bypass setup. Keep the original request.
491
-
492
- ### 2. Keep the goal and propose defaults
493
-
494
- Never ask what the ad is for before showing formats. Keep the customer's exact direction.
495
- Otherwise propose defaults from the verified kit's products, audience, offer and voice and the
496
- Brain search's evidence brief (proven angles, saved rules, approved claims). Show those defaults
497
- in the saved plan so any can be changed. Never invent proof or product facts.
498
- Idea requests still follow ad-angle-miner with the video output.
499
-
500
- ### 3. Show the picker or its text fallback
501
-
502
- Call `video_catalog_list { kind: "formats", brand_id }`. On the customer's computer, when you
503
- can actually execute shell commands, include `client: { shell: true }`; in a chat host omit
504
- that claim. Inside a coworker sandbox follow its reported capabilities, never claim to be the
505
- customer's computer. Respect requested limit and next_cursor for more item pages; the card may
506
- contain a full picker independently of the item page.
507
-
508
- - **card.display_hint:"widget"**: the picker replaces a format table. Write at most one short
509
- acknowledgement, print no table or list of the formats, and wait for the selection.
510
- - **Otherwise**: print card.text_summary as returned. Without a card, show returned rows with
511
- names, faithful descriptions, needs and demo links, respecting the requested page size.
512
- Write "no demo yet" when absent. Never put links only in a question control.
513
- - A format whose card contradicts what they asked for is never Suggested. Never offer
514
- available_here:false as an executable choice. Relay not_available_here in one short line.
515
- - A row with `fit.ok: false` is ruled out for this brand. Never propose it unless the customer,
516
- after hearing why, still asks for it. For a street interview, insisting never unlocks a route
517
- the route check rules out; when they asked for one, the one-person conversation preview is the
518
- one exception (see the route check). When they ask about a ruled-out row, tell them why in
519
- plain words (its `fit.reason`), never the field name.
520
- - `suggested` ranks a row for the brand; it never means the row makes the setup they named.
521
- Never tell the customer a row is "exactly" what they asked for beyond what its card says. A
522
- street interview still needs the route check above first.
523
- - Missing required assets are missing; unknown suitability is “needs review.” Inspect the
524
- selected format's candidates before spending. Never promise an unverified asset is ready.
525
- - Template formats use **one plan, one approval with the total in credits**, not approval for
526
- each paid step. Custom videos retain separate authenticated script/ingredient/budget gates in this chat.
527
-
528
- ### 4. Check this machine can render it
529
-
530
- - **Chat host without a shell:** skip local checks and delegate an available format in Step 5.
531
- Never tell a chat host it needs Claude Code to start. Browser-only formats remain unavailable
532
- here; give computer setup guidance only if asked how to make one.
533
- - **Local shell:** run `gooseworks doctor --no-browser` for common setup (auth/MCP, Node 18+,
534
- ffmpeg with libx264 + libass, ffprobe). Then fetch the selected template and its capabilities,
535
- and install documented dependencies in its fetched folder. Do not guess a renderer from a
536
- format name. For each Node renderer using default Playwright Chromium, run
537
- `gooseworks doctor --renderer-script "/absolute/path/to/the/fetched/scripts/record.js"` with
538
- the exact environment used to render, including NODE_PATH and PLAYWRIGHT_BROWSERS_PATH.
539
- Use the actual script path. Custom browser launch settings need their equivalent exact-runtime
540
- check. Non-browser capabilities need only their documented runtime checks.
541
- Never create paid ingredients before the selected renderer passes. Repair and recheck under
542
- existing setup permissions. If it cannot be fixed, re-list with client:{shell:false} and
543
- delegate only a format available to the coworker; never silently change the selected format.
544
- - **Coworker sandbox:** you are the renderer. Follow goose-video-local's sandbox checks; never
545
- hand off recursively or claim browser capability that the sandbox lacks.
546
-
547
- ### 5. Create the project and hand it off, in this session
548
-
549
- 1. `video_project_upsert { brand_id, name, format: <template_id> }` with no brief (a brief creates
550
- a concept batch). A street interview is created only after its route check found a supported
551
- setup. Include client:{shell:true} only for real local execution. Default
552
- creation_intent:"format" keeps the style with this brand's content; source_remix requires an
553
- explicit choice to use source content.
554
- If they already chose a campaign/concept, include its verified campaign_id and optional
555
- campaign_concept_id. Read the IDs from that brand's saved campaign; the concept must belong
556
- to it. Omit unknown IDs and never infer a link or create a campaign solely to file a video.
557
- 2. **Verified local shell or coworker sandbox:** load
558
- `catalog_fetch { type: "skill", slug: "goose-video-local" }` and follow it on the same project_id.
559
- Carry the customer's words, verified defaults, campaign, selected angle and a street
560
- interview's route check result into its brief.
561
- 3. **Chat host:** `goose_run_task { brand_id, project_id, message }` with the request, selected
562
- format, defaults and a street interview's route check result. Keep task_id. Continue questions/edits with the same task and project.
563
- A saved free draft is not a started worker or a complete plan. Follow actual saved state.
564
- 4. When follow.card_follows is true, the card follows progress: do not re-read it in a loop.
565
- Read again on a customer reply, card action or requested update. A failure or missing saved
566
- plan needs the returned recovery action; never claim completion or approve an empty plan.
567
- Approval requires the current complete plan and total. Insufficient balance: offer a shorter
568
- video or top-up. “Not now” keeps the saved plan.
569
-
570
- Do not hand the customer a command to paste somewhere else.
571
-
572
- ## Decision Rules
573
-
574
- - One sentence is a complete request. Resolve the brand and show formats without a goal interview.
575
- - One brand in the org: never ask which brand. Cards decide presentation; checks decide execution.
576
- - Use canonical tools. Preserve campaign context, selected script angles and custom authenticated review gates.
577
- - Never fabricate readiness, completion, approval or a second project.
578
-
579
- ## Output
580
-
581
- One project, one current saved plan in this chat, then the finished video. With a widget write one
582
- line and do not add app_url, brand_url or duplicate video links. A text host gets text_summary
583
- and its usable delivery link.
584
-
585
- ## Quality Checks
586
-
587
- - No forced goal question, duplicate table or unsupported shell claim.
588
- - The exact renderer passed before local paid ingredients; uncertain assets stay uncertain.
589
- - Selected campaign and angle survive; a single template project has no brief.
590
- - Current complete plan and total precede approval. Custom script and ingredient gates remain independent; Studio is optional.
591
-
592
- ## Failure Modes
593
-
594
- | Symptom | Cause | Fix |
595
- | --- | --- | --- |
596
- | Picker plus table | Ignored display_hint | Widget: one line; otherwise text_summary |
597
- | Terminal loses formats | Confused cards with execution | Declare real shell capability and check renderer |
598
- | Chat told it cannot start | Only local execution considered | Create once and delegate to coworker |
599
- | Worker ends without a plan | Assumed completion means ready | Follow actual failure/recovery state |
600
- | Two projects for one video | Recreated instead of resuming | Continue same project and task |
601
-
602
- ## Use uploaded footage
603
-
604
- When the customer asks to use existing footage, check the actual advertised schemas. Use `media_search` with purpose `production`, kind `video`, the brand and current project when needed. Omit query spend for free retrieval. Read facts/scenes with `media_analyze`, then use `media_excerpt` action `inspect` to review actual bounded frames and timed transcript before selecting. A description or thumbnail URL alone is not visual review.
605
-
606
- Freeze `source_excerpt:{asset_id,analysis_revision,scene_id,start_ms,end_ms,audio_mode}`. Revision is the original-byte SHA, scene may be null for a known user trim, bounds use integer milliseconds, and audio is original or muted. Call `media_excerpt` action `attach` with that exact selection and a stable idempotency key. The returned project remains unfinished and unapproved. Open its existing Studio review; preserve user locks and requested format, and keep footage separate from image packshot indexes. An incompatible format requires an explicit choice before changing it.
607
-
608
- For custom production, fetch the current shared `video-production-harness` and follow script/ingredient gates. Download the verified original and trim its exact selected window at normal speed with the approved audio. Recheck current revision and production permission before consumption and final upload/completion. Save excerpt lineage in plan and ingredient readback. Missing optional semantics does not require another upload; known user-selected stored footage remains usable. Research and competitor references never become production footage. Selected originals require no paid generation; only newly generated/replaced ingredients consume the approved budget.
32
+ - Talk to marketers: what they get and decide, never how it's made.
33
+ - Never mention tools, ids, JSON, commands, software, vendors, models, timings, retries or your checks.
34
+ - Everything happens here: never ask the customer to install anything or use a CLI, slash command or other app, except a video's make command when a next_step gives it (its last line says who starts it; original videos follow their own). Never give any other command, sign-in step or setting, and never ask them a technical question.
35
+ - Money is a credit number exactly as an answer gives it: never dollars or your own math.
36
+ - Follow the next_step in every answer.
37
+ - Card on screen (display_hint "widget"): one short line at most, then the wait in its next_step or end your turn; never re-list it or open a question box.
38
+ - Paid work needs the customer's yes to the credit total first, on the card or in chat at the price shown; never decide it for them, and pass on a yes only once they gave it to that total.
39
+ - A yes is to the credit total the customer was shown: their press on the plan card, or their yes in chat sent with that total.
40
+ - Where the app shows no card, print the plan and its price and ask for the customer's yes here; never send them to a website to approve.
41
+ - Never invent an offer, a claim or proof.
42
+ - GooseWorks holds every provider key and bills the work: never ask for a key, token, password or ad account id, and never call a vendor yourself.