gooseworks 0.4.4 → 0.4.5-dev.15.facf60fb

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 (120) hide show
  1. package/README.md +42 -11
  2. package/dist/agents/staging.d.ts +38 -0
  3. package/dist/agents/staging.d.ts.map +1 -0
  4. package/dist/agents/staging.js +309 -0
  5. package/dist/agents/staging.js.map +1 -0
  6. package/dist/auth/credentials.d.ts +1 -0
  7. package/dist/auth/credentials.d.ts.map +1 -1
  8. package/dist/auth/credentials.js +26 -8
  9. package/dist/auth/credentials.js.map +1 -1
  10. package/dist/auth/device-flow.d.ts +79 -0
  11. package/dist/auth/device-flow.d.ts.map +1 -0
  12. package/dist/auth/device-flow.js +411 -0
  13. package/dist/auth/device-flow.js.map +1 -0
  14. package/dist/auth/login-mode.d.ts +25 -0
  15. package/dist/auth/login-mode.d.ts.map +1 -0
  16. package/dist/auth/login-mode.js +87 -0
  17. package/dist/auth/login-mode.js.map +1 -0
  18. package/dist/auth/oauth-server.d.ts +2 -2
  19. package/dist/auth/oauth-server.d.ts.map +1 -1
  20. package/dist/auth/oauth-server.js +28 -5
  21. package/dist/auth/oauth-server.js.map +1 -1
  22. package/dist/auth/paste-login.d.ts +27 -0
  23. package/dist/auth/paste-login.d.ts.map +1 -0
  24. package/dist/auth/paste-login.js +203 -0
  25. package/dist/auth/paste-login.js.map +1 -0
  26. package/dist/commands/doctor.d.ts.map +1 -1
  27. package/dist/commands/doctor.js +17 -8
  28. package/dist/commands/doctor.js.map +1 -1
  29. package/dist/commands/formats.js +2 -2
  30. package/dist/commands/formats.js.map +1 -1
  31. package/dist/commands/graphics/publish-flow.js +1 -1
  32. package/dist/commands/graphics/publish-flow.js.map +1 -1
  33. package/dist/commands/install.d.ts.map +1 -1
  34. package/dist/commands/install.js +101 -34
  35. package/dist/commands/install.js.map +1 -1
  36. package/dist/commands/launch.d.ts +3 -0
  37. package/dist/commands/launch.d.ts.map +1 -0
  38. package/dist/commands/launch.js +35 -0
  39. package/dist/commands/launch.js.map +1 -0
  40. package/dist/commands/login.d.ts +21 -1
  41. package/dist/commands/login.d.ts.map +1 -1
  42. package/dist/commands/login.js +106 -29
  43. package/dist/commands/login.js.map +1 -1
  44. package/dist/commands/logout.d.ts.map +1 -1
  45. package/dist/commands/logout.js +7 -1
  46. package/dist/commands/logout.js.map +1 -1
  47. package/dist/commands/skills.d.ts +16 -0
  48. package/dist/commands/skills.d.ts.map +1 -1
  49. package/dist/commands/skills.js +52 -1
  50. package/dist/commands/skills.js.map +1 -1
  51. package/dist/commands/styles.js +2 -2
  52. package/dist/commands/styles.js.map +1 -1
  53. package/dist/commands/tool.d.ts +17 -0
  54. package/dist/commands/tool.d.ts.map +1 -0
  55. package/dist/commands/tool.js +239 -0
  56. package/dist/commands/tool.js.map +1 -0
  57. package/dist/commands/update.d.ts.map +1 -1
  58. package/dist/commands/update.js +20 -0
  59. package/dist/commands/update.js.map +1 -1
  60. package/dist/commands/video-local.d.ts.map +1 -1
  61. package/dist/commands/video-local.js +2 -2
  62. package/dist/commands/video-local.js.map +1 -1
  63. package/dist/config.d.ts.map +1 -1
  64. package/dist/config.js +14 -3
  65. package/dist/config.js.map +1 -1
  66. package/dist/environment.d.ts +9 -0
  67. package/dist/environment.d.ts.map +1 -0
  68. package/dist/environment.js +105 -0
  69. package/dist/environment.js.map +1 -0
  70. package/dist/index.js +12 -45
  71. package/dist/index.js.map +1 -1
  72. package/dist/lib/graphics-cache.d.ts.map +1 -1
  73. package/dist/lib/graphics-cache.js +2 -2
  74. package/dist/lib/graphics-cache.js.map +1 -1
  75. package/dist/lib/mcp-client.d.ts +53 -0
  76. package/dist/lib/mcp-client.d.ts.map +1 -0
  77. package/dist/lib/mcp-client.js +196 -0
  78. package/dist/lib/mcp-client.js.map +1 -0
  79. package/dist/program.d.ts +2 -0
  80. package/dist/program.d.ts.map +1 -0
  81. package/dist/program.js +56 -0
  82. package/dist/program.js.map +1 -0
  83. package/dist/skills/custom-video-skill.d.ts +1 -1
  84. package/dist/skills/custom-video-skill.d.ts.map +1 -1
  85. package/dist/skills/custom-video-skill.js +1 -1
  86. package/dist/skills/custom-video-skill.js.map +1 -1
  87. package/dist/skills/installer.d.ts.map +1 -1
  88. package/dist/skills/installer.js +42 -24
  89. package/dist/skills/installer.js.map +1 -1
  90. package/dist/skills/master-skill.d.ts +12 -9
  91. package/dist/skills/master-skill.d.ts.map +1 -1
  92. package/dist/skills/master-skill.js +857 -372
  93. package/dist/skills/master-skill.js.map +1 -1
  94. package/dist/skills/releases.d.ts +1 -1
  95. package/dist/skills/releases.d.ts.map +1 -1
  96. package/dist/skills/releases.js +8 -5
  97. package/dist/skills/releases.js.map +1 -1
  98. package/dist/skills/routes.js +8 -8
  99. package/dist/skills/routes.js.map +1 -1
  100. package/dist/skills/staging-content.d.ts +3 -0
  101. package/dist/skills/staging-content.d.ts.map +1 -0
  102. package/dist/skills/staging-content.js +12 -0
  103. package/dist/skills/staging-content.js.map +1 -0
  104. package/dist/utils/http.d.ts +7 -1
  105. package/dist/utils/http.d.ts.map +1 -1
  106. package/dist/utils/http.js +5 -1
  107. package/dist/utils/http.js.map +1 -1
  108. package/package.json +12 -4
  109. package/skills/goose-ads/SKILL.md +386 -224
  110. package/skills/goose-product-photos/SKILL.md +107 -58
  111. package/skills/goose-video/SKILL.md +300 -36
  112. package/skills/goose-video-local/SKILL.md +239 -31
  113. package/skills/gooseworks/SKILL.md +133 -26
  114. package/skills/make-custom-video/SKILL.md +256 -11
  115. package/skills/manifest.json +7 -7
  116. package/skills/routes.json +8 -8
  117. package/dist/skills/fetcher.d.ts +0 -18
  118. package/dist/skills/fetcher.d.ts.map +0 -1
  119. package/dist/skills/fetcher.js +0 -118
  120. package/dist/skills/fetcher.js.map +0 -1
@@ -3,11 +3,11 @@ name: goose-video
3
3
  slug: goose-video
4
4
  description: >
5
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.
6
+ picker or the returned text choices. An agent that can run shell commands on the customer's
7
+ computer makes the video with goose-video-local; otherwise the GooseWorks coworker makes it.
8
+ Review one complete template plan and total credits before production. Custom videos retain two authenticated review gates in this chat.
9
9
  category: ads
10
- version: 3.0.0
10
+ version: 3.1.0
11
11
  author: GooseWorks
12
12
  tags: [gooseworks, ads, video, local-render, coworker, chat]
13
13
  ---
@@ -66,21 +66,269 @@ and approval before spending. Hosted installed snapshots use the existing Skills
66
66
  Skill content and a host's cached MCP tool schemas are separate: refreshing one does not refresh
67
67
  the other. Check the actual advertised tools before using new fields.
68
68
 
69
+ ## No GooseWorks tools in this session? Call them through the CLI
70
+
71
+ The GooseWorks tools named here (for example `account_whoami`, `brand_onboarding`,
72
+ `brand_read`) normally come from the GooseWorks connector. If they are not registered in this
73
+ session but you have a shell with the `gooseworks` CLI signed in (a cloud sandbox such as
74
+ ChatGPT agent, Meta AI or Grok), call the same tool from the shell:
75
+
76
+ ```bash
77
+ npx gooseworks tool <name> '<arguments as a JSON object>'
78
+ ```
79
+
80
+ - Run `npx gooseworks tool --list` once first. It prints the server's rules for using the tools
81
+ and every tool name; `npx gooseworks tool <name> --schema` shows one tool's arguments.
82
+ - The result prints as JSON. When a tool answers with a one-line summary, the fields you act on
83
+ (such as `next_step` and ids) follow under "Data:". It exits 1 when the tool reports an error.
84
+ - Nothing renders as a widget here, so tell the user the result in plain words.
85
+ - The same rules apply as over the connector: state the credit total and get the user's yes
86
+ before paid work.
87
+ - If it says you are not logged in, run `npx gooseworks login --device --no-wait`, show the
88
+ user the link and code it prints, and run `npx gooseworks login --device` once they approve.
89
+
90
+ When the tools are registered in this session, call them directly instead.
91
+
69
92
  ## Purpose
70
93
 
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.
94
+ Resolve the brand, show supported formats and create one saved project. This is agent
95
+ execution, not a recipe server-order API.
96
+
97
+ **Who makes the video (one rule).** If you can run shell commands on the customer's own
98
+ computer, you make it there with `goose-video-local`: check the toolchain first and, if it
99
+ can't be fixed, hand it off. If you can't, hand it to the GooseWorks coworker with
100
+ `goose_run_task { brand_id, project_id, message: the customer's words }`; the one approval,
101
+ Stop and fixes stay in this chat. Inside the GooseWorks coworker's own sandbox you are the
102
+ coworker: make it yourself and never hand off. A hosted code sandbox is not the customer's
103
+ computer. Decide this yourself, never from the host's name; the server needs no flag for it.
74
104
 
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
105
+ **Cards and execution are separate.** A terminal may render without drawing a picker; a chat
106
+ app may draw a picker while the coworker renders. Follow `card.display_hint` for how to show
107
+ things; who makes the video is the rule above. Template-remix review stays in this
78
108
  chat. Custom videos use separate authenticated script and ingredient approvals in this same chat.
79
109
  Studio is an optional review surface.
80
110
 
81
- ## Custom videos: route before formats
111
+ ## Prepare the video workflow and brand before creative work
82
112
 
83
- 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 choice or import the reference as a finished video.
113
+ **Installed entry files are bootstrap instructions.** For new work started from an installed
114
+ file or an old chat, fetch `catalog_fetch { type: "skill", slug: "goose-video" }` on the selected
115
+ connection and read its returned content and dependencies before continuing. Use the already
116
+ fetched body when this entry came from that connection in this run; do not recursively fetch
117
+ the same entry. A CLI freshness warning does not block using the current connected package.
118
+ Keep the fetched package and hashes in a new run folder; do not replace edited installed files.
119
+ If current instructions cannot be loaded, resolve the connection before format suggestions,
120
+ script writing or production. Do not continue from an old installed workflow or session notes.
121
+
122
+ **Follow the connector's full-guide requirement when available.** Fetch
123
+ `catalog_fetch { type: "skill", slug: "gooseworks-guide" }` when the connector requires it.
124
+ The only older-server exception is below; it never removes brand preparation or approvals.
125
+
126
+ | Returned guide/workflow state on the selected connection | Required action |
127
+ | --- | --- |
128
+ | 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. |
129
+ | 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. |
130
+
131
+ A missing custom entry or required custom tool/schema remains unavailable: never substitute
132
+ a template or an import to bypass it. Never hide other fetch errors or continue from cached
133
+ instructions merely because the guide was not found.
134
+
135
+ **For an existing project or batch, read `video_project_read` first.** Determine its actual
136
+ route and saved review state before fetching a recipe or doing local work. Resume an approved
137
+ run with its recorded packages, brand inputs, script and ingredients; do not silently replace
138
+ them with today's release or brand rules. Follow returned preparation requirements and use
139
+ the existing affected review/approval flow for an intentional change. Reads, free drafts,
140
+ imports and existing-job retrieval do not grant permission for new paid production.
141
+
142
+ **For every new plan, resolve the brand and call**
143
+ `brand_read { brand_id, sections: ["summary", "kit", "products", "learnings"] }` **before**
144
+ suggesting formats, mining video angles, writing any script, creating a production plan or
145
+ handing the work to another agent. Use `brand_get_context` with those same four sections only
146
+ when advertised. Reuse a complete read from this run on the same connection and brand.
147
+ Onboarding completion, a summary-only response and earlier session notes do not supply the
148
+ kit, selected product facts or saved rules. If the full read is unavailable, resolve it before
149
+ creative work. Use known kit facts while research is incomplete; do not restart research
150
+ solely because its status is pending. Never invent a product fact or accept a campaign to
151
+ bypass preparation. Then search the Brand Brain (next section) before suggesting formats,
152
+ choosing an angle or asking the user for a brand fact.
153
+
154
+ Carry that context through custom/template/idea routing and delegation. Before writing, make
155
+ the workflow's brand-rules file from those sources: pronunciations, required spoken copy,
156
+ prohibited claims, real logo, font, palette and the selected product's supported facts.
157
+ Entries prefixed `Video preference:` and visual/pacing instructions are creative direction,
158
+ not spoken lines. Use the kit's audience, offer and voice as defaults without an interview.
159
+ The rules file mirrors context; it is not proof of a read or permission to spend. Keep the
160
+ route's existing script, ingredient and budget approvals, including its allowed previews.
161
+
162
+ **Use the server's brand bundle when the selected API returns it.** Project create/read may
163
+ return top-level
164
+ `brand_context`: `{ version: 1, brand_id, digest, loaded_at, sections, brand, kit, products,
165
+ learnings }`. Its sections cover summary, kit, products and learnings.
166
+
167
+ | Returned brand/project response on the selected connection | Required action |
168
+ | --- | --- |
169
+ | 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. |
170
+ | 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. |
171
+
172
+ An incomplete/malformed bundle or missing brand section is a preparation failure, never the
173
+ older-API exception. Once this connection returns an authoritative bundle, use its binding
174
+ contract. `script_drafts.video_brand_context` is server-owned: do not author, replace or forge
175
+ it, and do not invent a read receipt or hash local brand facts into one. Keep the full bundle
176
+ out of client review payloads. If managed generation returns HTTP 409
177
+ `video_brand_context_required`, reload the project and bind the plan to its returned bundle
178
+ through the normal review flow before retrying. That refusal never permits the older-API
179
+ fallback, skipping sections or retrying paid calls blindly. Unchanged approved legacy resumes
180
+ retain their package, context and approvals; an upgrade alone needs no extra approval.
181
+
182
+ **To apply a deliberate brand correction to a new or revised plan**, make a fresh, unfiltered
183
+ `brand_read` of those four sections. When it returns the authoritative bundle, use its
184
+ returned `brand_context.digest` in the complete revised `script_drafts` through the existing
185
+ `video_project_upsert` `patch.script` save; the server verifies the current brand and replaces
186
+ its snapshot with the saved plan. On an older API with no bundle contract, apply the actual
187
+ four-section correction and save the revised draft through its existing flow without inventing
188
+ digest fields. If a connection that already returned a bundle cannot supply the fresh bundle,
189
+ resolve that failure before rebinding. Review and approve the affected script, ingredients and
190
+ budget through the normal flow. Never refresh an ongoing approved run automatically; its
191
+ recorded package and brand inputs stay pinned until an intentional change.
192
+
193
+ ## Search the Brand Brain, then propose — before any creative choice or question
194
+
195
+ The Brand Kit is a summary. The brand's saved knowledge (its Brain) holds what the Kit does not:
196
+ rules from past feedback, approved and rejected creatives, customer evidence, approved claims,
197
+ reports and documents. **After `brand_read`, and before you choose an angle, claim, hook,
198
+ product emphasis, format or source ad — and before you ask the user for any brand fact — call
199
+ `knowledge_search { brand_id, query }`** when it is registered. It is free and read-only: no
200
+ approval, no announcement to the customer and no questionnaire.
201
+
202
+ 1. **Search for this task, not the whole Brain.** Run one short query (under 500 characters) in
203
+ the user's own words plus the product (for example "ads for <product>: what worked, what to
204
+ avoid") and one with
205
+ `source_types: ["evidence", "claim", "learning", "creative", "document"]` for proof and past
206
+ creative results. Add a query only for a specific open question. Reuse results from this run.
207
+ 2. **Keep these states distinct** and record which one each query returned:
208
+
209
+ | Result | Means | Do |
210
+ | --- | --- | --- |
211
+ | `status: "ok"` with matches | Saved knowledge exists | Use it; keep each fact's citation in your working brief |
212
+ | `status: "empty"` | Nothing saved matches this query | Say "no saved evidence for <topic>", never "the brand has no proof" |
213
+ | `refresh_required` | The results shown are current; some changed sources were left out | Use them; search again shortly for anything missing |
214
+ | `building` | The index is not ready | Retry once shortly, then continue with the gap stated |
215
+ | 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 |
216
+ | An empty Kit field | Only that field is blank | Not a search result: still search before asking |
217
+
218
+ 3. **Let the findings change the plan.** A `dont`/`must` learning or a rejected creative rules
219
+ options out; an approved or well-rated past creative is a proven angle to lead with; a report
220
+ shows what worked. Claim-grade proof is a result with `approved_ad_claim: true` or the kit's
221
+ `approvedClaims` within their stated applicability; the kit's `proofPoints` are what the
222
+ backend allows an ad to state, used as written. Other Kit text, documents and performance
223
+ numbers are context, never public claims. Never invent an offer, price or result. Judge
224
+ relevance and skip results about another product or business.
225
+ 4. **Propose; don't interview.** Lead with one recommended direction (angle, product, source or
226
+ format) and a one-line reason naming what you found, with up to two alternatives. When several
227
+ directions fit (two audiences, products or campaigns), pick the one the evidence favours, such
228
+ as an active campaign or approved past creatives, and name the other as an alternative instead
229
+ of asking. Ask only for a decision the brand read and the search cannot settle, or for spend
230
+ approval. Never ask the user for a fact the Brain already answered.
231
+ Keep directions already chosen (the user's words, a project's creative brief, handed-off
232
+ defaults, approved plans): search only to fill empty fields and to apply saved rules. When a
233
+ returned card or picker presents the choice, your recommendation is its one acknowledgement
234
+ line and the saved plan's defaults, not a separate list.
235
+ 5. **Carry an evidence brief** into the routed skill, writer or plan: findings with citations,
236
+ the state of each query, what it ruled out and the open gaps. Tell the customer the findings
237
+ in plain words; the citations stay in the brief.
238
+
239
+ On an approved resume, keep the saved brief and evidence; search again only for a new decision.
240
+
241
+ ## Custom videos: check formats first
242
+
243
+ 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.
244
+
245
+ ## Run the format's route check before proposing it
246
+
247
+ A catalog row says what a format is best for and ranks it for the brand. It does not say whether
248
+ the format can make the setup the customer asked for (how many people, mic only, no product).
249
+ Some renderers declare a route selector that decides that; today that is the street interview
250
+ (`render-street-interview`). Before you propose, script or create a street-interview project,
251
+ template or custom, check the request against its routes:
252
+
253
+ | Street route | On screen | Needs | Makes |
254
+ | --- | --- | --- | --- |
255
+ | Guessing (`product-guess`) | Interviewer and up to four people | A physical product to hand over, photographed on its own | A finished video |
256
+ | 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 |
257
+ | 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 |
258
+
259
+ Neither interview route takes a photo of a person: people are described in text, so never
260
+ propose putting a founder's or creator's face in one. Keep the customer's named setup: never
261
+ change the interaction, mode or number of people just to make a check pass.
262
+
263
+ **Never offer guessing to software or a service.** The guessing route needs a physical product
264
+ to hand over. When what the brand sells is software, an app or a service (nothing a person can
265
+ hold), never offer or script guessing, not even with a laptop, phone or other device showing the
266
+ app as the prop: the device is a prop, so `offering_type` stays `digital` or `service` and the
267
+ selector says unsupported. A brand that sells a physical product, including a device or
268
+ hardware that comes with an app, can still use guessing with that product. Offer the table's
269
+ real alternatives instead: a one-person conversation (a script and prompt preview only, no
270
+ finished video yet), the street testimonial if the catalog lists it and does not rule it out,
271
+ or custom. Asking again never unlocks a route the table or the selector rules out.
272
+
273
+ When they asked for a street interview, the catalog may mark (newer servers do) the
274
+ street-interview rows `fit.ok: false` for such a brand: they can't make a finished video for it.
275
+ That verdict is about the finished video, so still offer the one-person conversation, saying
276
+ plainly that it is a script and prompt preview only. If the brand read shows the brand sells the
277
+ device itself but the catalog rules guessing out, tell the customer the catalog flagged it and
278
+ confirm what they sell before offering guessing with that device.
279
+
280
+ - **Without a shell on the customer's computer**, decide from this table. Do not fetch the renderer: its
281
+ package is far too large for a chat.
282
+ - **With a shell** (the customer's computer or the coworker sandbox), also run its free
283
+ selector, which makes no paid call. If the fetch or the run fails, decide from the table.
284
+ 1. Fetch the renderer to a file, not into the conversation: its inline package is over a
285
+ million characters. Either save the JSON from `gooseworks fetch render-street-interview > <file.json>`,
286
+ then write each `scripts` entry as
287
+ `/tmp/gooseworks-scripts/render-street-interview/scripts/<name>` and each `files` entry at
288
+ `/tmp/gooseworks-scripts/render-street-interview/<path>`. Or call
289
+ `catalog_fetch { type: "skill", slug: "render-street-interview", delivery: "archive" }`,
290
+ extract the ZIP, check each file against its `manifest.json` hashes and copy the contents of its
291
+ `agent-config/skills/render-street-interview/` folder into
292
+ `/tmp/gooseworks-scripts/render-street-interview/`. Either way the selector reads
293
+ `references/street-reference-library.json` from that folder.
294
+ 2. Write a brief JSON. `mode` and `interaction_type` go in pairs: `product-guess` with
295
+ `product-guess`, or `conversation` with `mic-only`, `product-sample` or `concept-challenge`.
296
+ `offering_type` is exactly `physical`, `service` or `digital` (software, SaaS and apps are
297
+ `digital`). `participants` is a whole number: people interviewed on screen, not counting
298
+ the interviewer. Leave it out when the customer named no count; the selector then uses the
299
+ route's usual cast. When the customer named no interaction, run each mode that could fit.
300
+ 3. Run `python3 /tmp/gooseworks-scripts/render-street-interview/scripts/prepare_script_context.py --brief <brief.json> --out <context.json>`.
301
+ Read `status` and `brief_gaps` in the output file, not the exit code: it exits 2 for every
302
+ status except `ready-for-writing`. A Python traceback is not a verdict: the brief or the
303
+ saved files are wrong (for example the reference library in the wrong folder). Fix them and
304
+ run it again.
305
+ 4. A run with any `brief_gaps` has not checked the route. Fix every gap and run it again.
306
+
307
+ **An unsupported setup is a stop.** `unsupported-route`, or a request the table rules out,
308
+ means this setup can't be made. Tell the customer plainly, in one line, for example: "A
309
+ three-person mic-only street interview isn't something we can make yet: that version takes one
310
+ person, and the three-person version needs a physical product to hand over." Then offer the
311
+ closest supported options in plain words, each with how it differs. With a shell, these are the
312
+ selector's `alternatives`. Without one, take them from the table:
313
+
314
+ - when only the number of people was the problem, the same setup within its limit: guessing
315
+ (a physical product only) with up to four people, a finished video; or a conversation with
316
+ one person, a script preview only;
317
+ - for something people can't hold (software, a service), a one-person conversation instead
318
+ of guessing;
319
+ - one person talking to camera with no interviewer, if the catalog lists that format;
320
+ - a custom video, untested, that keeps the street format's limits.
321
+
322
+ Never use route names or the script's wording. Do not create the project or write a script for
323
+ it. Go custom only if the customer picks it; a custom video keeps the street format's hard
324
+ constraints, which make-custom-video lists.
325
+
326
+ **A supported setup.** With empty `brief_gaps`, any other status means the route exists.
327
+ `needs-reference` means no observed reference ad matched yet: it does not block proposing the
328
+ format; carry it into the handoff so the script step resolves or reports it before script
329
+ approval. Carry the route too: which one, how many people, finished video or preview only, and
330
+ no person photos. A preview-only route makes a script and prompt preview, not a finished video:
331
+ say so before the customer chooses it.
84
332
 
85
333
  ## Route first: is this a new video?
86
334
 
@@ -90,9 +338,10 @@ Hand off to **`goose-video-local`** now, and stop following this skill, for:
90
338
  - the app's copy-for-Claude command (it names `goose-video-local`);
91
339
  - "remix this video ad template" for a specific app template.
92
340
 
93
- Use `goose-video-local` if it is installed; otherwise load it with
341
+ Load the current `goose-video-local` entry with
94
342
  `catalog_fetch { type: "skill", slug: "goose-video-local" }` on the GooseWorks MCP (older clients:
95
- `fetch_skill("goose-video-local")`). It reads the project first and says what to do with it.
343
+ `fetch_skill("goose-video-local")`), unless already fetched on this connection in this run.
344
+ It reads the project first and retains an approved run's recorded recipe packages.
96
345
 
97
346
  When they ask **what** to make ("give me video ad ideas", "what angles should I use?", "what's
98
347
  working for my competitors?"), fetch **`ad-angle-miner`** (`catalog_fetch { type: "skill", slug: "ad-angle-miner" }`,
@@ -147,8 +396,9 @@ review set; do not add a separate approval round.
147
396
  ## Save durable brand answers, then verify them
148
397
 
149
398
  Read the selected brand with `brand_read { brand_id, sections: ["summary", "kit", "products", "learnings", "onboarding"] }`
150
- (fallback: `brand_get_context` with the same sections). Keep founder answers, user corrections,
151
- research and your own hypotheses distinct. Reuse matching saved answers; ask only about gaps.
399
+ (older clients: `brand_get_context` with the same sections, only when that tool is advertised).
400
+ Keep founder answers, user corrections, research and your own hypotheses distinct. Reuse
401
+ matching saved answers; ask only about gaps.
152
402
 
153
403
  When the user asks to remember a rule, answers a brand interview, or explicitly corrects a
154
404
  standing fact, save that answer in the same turn. The capture request authorizes those answers;
@@ -272,16 +522,15 @@ bypass setup. Keep the original request.
272
522
  ### 2. Keep the goal and propose defaults
273
523
 
274
524
  Never ask what the ad is for before showing formats. Keep the customer's exact direction.
275
- Otherwise propose defaults from the verified kit's products, audience, offer and voice. Show
276
- those defaults in the saved plan so any can be changed. Never invent proof or product facts.
525
+ Otherwise propose defaults from the verified kit's products, audience, offer and voice and the
526
+ Brain search's evidence brief (proven angles, saved rules, approved claims). Show those defaults
527
+ in the saved plan so any can be changed. Never invent proof or product facts.
277
528
  Idea requests still follow ad-angle-miner with the video output.
278
529
 
279
530
  ### 3. Show the picker or its text fallback
280
531
 
281
- Call `video_catalog_list { kind: "formats", brand_id }`. On the customer's computer, when you
282
- can actually execute shell commands, include `client: { shell: true }`; in a chat host omit
283
- that claim. Inside a coworker sandbox follow its reported capabilities, never claim to be the
284
- customer's computer. Respect requested limit and next_cursor for more item pages; the card may
532
+ Call `video_catalog_list { kind: "formats", brand_id }`. Every caller gets every format.
533
+ Respect requested limit and next_cursor for more item pages; the card may
285
534
  contain a full picker independently of the item page.
286
535
 
287
536
  - **card.display_hint:"widget"**: the picker replaces a format table. Write at most one short
@@ -289,8 +538,18 @@ contain a full picker independently of the item page.
289
538
  - **Otherwise**: print card.text_summary as returned. Without a card, show returned rows with
290
539
  names, faithful descriptions, needs and demo links, respecting the requested page size.
291
540
  Write "no demo yet" when absent. Never put links only in a question control.
292
- - A format whose card contradicts what they asked for is never Suggested. Never offer
293
- available_here:false as an executable choice. Relay not_available_here in one short line.
541
+ - A format whose card contradicts what they asked for is never Suggested. A `needs_browser`
542
+ format is made only on the customer's computer (the coworker has no browser): if you have no
543
+ shell there and the customer picks one, say it needs GooseWorks running on their computer and
544
+ offer another.
545
+ - A row with `fit.ok: false` is ruled out for this brand. Never propose it unless the customer,
546
+ after hearing why, still asks for it. For a street interview, insisting never unlocks a route
547
+ the route check rules out; when they asked for one, the one-person conversation preview is the
548
+ one exception (see the route check). When they ask about a ruled-out row, tell them why in
549
+ plain words (its `fit.reason`), never the field name.
550
+ - `suggested` ranks a row for the brand; it never means the row makes the setup they named.
551
+ Never tell the customer a row is "exactly" what they asked for beyond what its card says. A
552
+ street interview still needs the route check above first.
294
553
  - Missing required assets are missing; unknown suitability is “needs review.” Inspect the
295
554
  selected format's candidates before spending. Never promise an unverified asset is ready.
296
555
  - Template formats use **one plan, one approval with the total in credits**, not approval for
@@ -298,11 +557,11 @@ contain a full picker independently of the item page.
298
557
 
299
558
  ### 4. Check this machine can render it
300
559
 
301
- - **Chat host without a shell:** skip local checks and delegate an available format in Step 5.
302
- Never tell a chat host it needs Claude Code to start. Browser-only formats remain unavailable
303
- here; give computer setup guidance only if asked how to make one.
560
+ - **No shell on the customer's computer:** skip local checks and hand the project off in Step 5.
561
+ Never tell the customer they need Claude Code to start. Give computer setup guidance only if
562
+ asked how to make a `needs_browser` format.
304
563
  - **Local shell:** run `gooseworks doctor --no-browser` for common setup (auth/MCP, Node 18+,
305
- ffmpeg with libx264 + libass, ffprobe). Then fetch the selected template and its capabilities,
564
+ ffmpeg with libx264 (libass only for an ASS caption route), ffprobe). Then fetch the selected template and its capabilities,
306
565
  and install documented dependencies in its fetched folder. Do not guess a renderer from a
307
566
  format name. For each Node renderer using default Playwright Chromium, run
308
567
  `gooseworks doctor --renderer-script "/absolute/path/to/the/fetched/scripts/record.js"` with
@@ -310,31 +569,36 @@ contain a full picker independently of the item page.
310
569
  Use the actual script path. Custom browser launch settings need their equivalent exact-runtime
311
570
  check. Non-browser capabilities need only their documented runtime checks.
312
571
  Never create paid ingredients before the selected renderer passes. Repair and recheck under
313
- existing setup permissions. If it cannot be fixed, re-list with client:{shell:false} and
314
- delegate only a format available to the coworker; never silently change the selected format.
572
+ existing setup permissions. If it cannot be fixed, hand the project off in Step 5 (a
573
+ `needs_browser` format can't be: offer another); never silently change the selected format.
315
574
  - **Coworker sandbox:** you are the renderer. Follow goose-video-local's sandbox checks; never
316
575
  hand off recursively or claim browser capability that the sandbox lacks.
317
576
 
318
577
  ### 5. Create the project and hand it off, in this session
319
578
 
320
579
  1. `video_project_upsert { brand_id, name, format: <template_id> }` with no brief (a brief creates
321
- a concept batch). Include client:{shell:true} only for real local execution. Default
580
+ a concept batch). A street interview is created only after its route check found a supported
581
+ setup. Default
322
582
  creation_intent:"format" keeps the style with this brand's content; source_remix requires an
323
583
  explicit choice to use source content.
324
584
  If they already chose a campaign/concept, include its verified campaign_id and optional
325
585
  campaign_concept_id. Read the IDs from that brand's saved campaign; the concept must belong
326
586
  to it. Omit unknown IDs and never infer a link or create a campaign solely to file a video.
327
- 2. **Verified local shell or coworker sandbox:** load
587
+ 2. **You make it** (a shell on the customer's computer, or the coworker sandbox): load
328
588
  `catalog_fetch { type: "skill", slug: "goose-video-local" }` and follow it on the same project_id.
329
- Carry the customer's words, verified defaults, campaign and selected angle into its brief.
330
- 3. **Chat host:** `goose_run_task { brand_id, project_id, message }` with the request, selected
331
- format and defaults. Keep task_id. Continue questions/edits with the same task and project.
589
+ Carry the customer's words, verified defaults, campaign, selected angle and a street
590
+ interview's route check result into its brief.
591
+ 3. **No shell there:** `goose_run_task { brand_id, project_id, message }` with the request, selected
592
+ format, defaults and a street interview's route check result. Keep task_id. Continue questions/edits with the same task and project.
332
593
  A saved free draft is not a started worker or a complete plan. Follow actual saved state.
333
594
  4. When follow.card_follows is true, the card follows progress: do not re-read it in a loop.
334
595
  Read again on a customer reply, card action or requested update. A failure or missing saved
335
596
  plan needs the returned recovery action; never claim completion or approve an empty plan.
336
597
  Approval requires the current complete plan and total. Insufficient balance: offer a shorter
337
598
  video or top-up. “Not now” keeps the saved plan.
599
+ 5. On the customer's yes, record it with `video_project_upsert { brand_id, project_id, patch:
600
+ { approve: { user_quote, total_credits } } }`. Its reply says what comes next: the coworker
601
+ gets the approval when it is making the video; otherwise you render it.
338
602
 
339
603
  Do not hand the customer a command to paste somewhere else.
340
604
 
@@ -363,7 +627,7 @@ and its usable delivery link.
363
627
  | Symptom | Cause | Fix |
364
628
  | --- | --- | --- |
365
629
  | Picker plus table | Ignored display_hint | Widget: one line; otherwise text_summary |
366
- | Terminal loses formats | Confused cards with execution | Declare real shell capability and check renderer |
630
+ | Agent with a shell hands off | Decided from the host, not the rule | Make it here; hand off only without a shell or a fixable toolchain |
367
631
  | Chat told it cannot start | Only local execution considered | Create once and delegate to coworker |
368
632
  | Worker ends without a plan | Assumed completion means ready | Follow actual failure/recovery state |
369
633
  | Two projects for one video | Recreated instead of resuming | Continue same project and task |