wizz-method 2.17.2 → 2.19.0

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 (177) hide show
  1. package/THIRD-PARTY-NOTICES.md +12 -0
  2. package/package.json +5 -3
  3. package/removals.txt +10 -0
  4. package/skills-registry.yaml +72 -42
  5. package/src/bmm-skills/1-analysis/wizz-set-feature/SKILL.md +9 -9
  6. package/src/bmm-skills/4-implementation/wizz-create-story/SKILL.md +1 -1
  7. package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +1 -1
  8. package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/SKILL.md +1 -1
  9. package/src/bmm-skills/4-implementation/wizz-qa-generate-e2e-tests/checklist.md +1 -1
  10. package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +1 -1
  11. package/src/bmm-skills/4-implementation/wizz-sprint-status/SKILL.md +5 -5
  12. package/src/bmm-skills/module-help.csv +1 -1
  13. package/src/bmm-skills/module.yaml +1 -1
  14. package/src/core-skills/_shared/handoff-protocol.md +5 -3
  15. package/src/modules/lowticket/skills/wizz-lowticket-funil/SKILL.md +1 -1
  16. package/src/modules/lowticket/skills/wizz-lowticket-guia/SKILL.md +1 -1
  17. package/src/modules/lowticket/skills/wizz-lowticket-metodologia/SKILL.md +1 -1
  18. package/src/modules/lowticket/skills/wizz-lowticket-minerador/SKILL.md +1 -1
  19. package/src/modules/lowticket/skills/wizz-lowticket-pagina/SKILL.md +1 -1
  20. package/src/modules/lowticket/skills/wizz-lowticket-trafego/SKILL.md +1 -1
  21. package/src/modules/wizz/_shared/cerebro.md +7 -7
  22. package/src/modules/wizz/_shared/communication-rules.md +1 -1
  23. package/src/modules/wizz/_shared/despacho-barato.md +1 -1
  24. package/src/modules/wizz/_shared/encerramento.md +4 -3
  25. package/src/modules/wizz/_shared/model-ladder.md +10 -0
  26. package/src/modules/wizz/_shared/organizacao.md +8 -4
  27. package/src/modules/wizz/_shared/token-economy.md +1 -1
  28. package/src/modules/wizz/_shared/video-pipeline.md +13 -3
  29. package/src/modules/wizz/agents/wizz-ads/SKILL.md +4 -1
  30. package/src/modules/wizz/agents/wizz-ads/customize.toml +12 -3
  31. package/src/modules/wizz/agents/wizz-ads/knowledge/playbook.md +36 -0
  32. package/src/modules/wizz/agents/wizz-copy/SKILL.md +4 -1
  33. package/src/modules/wizz/agents/wizz-copy/customize.toml +2 -3
  34. package/src/modules/wizz/agents/wizz-copy/knowledge/playbook.md +34 -0
  35. package/src/modules/wizz/agents/wizz-designer/SKILL.md +2 -2
  36. package/src/modules/wizz/agents/wizz-designer/customize.toml +2 -3
  37. package/src/modules/wizz/agents/wizz-growth/SKILL.md +4 -1
  38. package/src/modules/wizz/agents/wizz-growth/customize.toml +33 -4
  39. package/src/modules/wizz/agents/wizz-growth/knowledge/playbook.md +39 -0
  40. package/src/modules/wizz/agents/wizz-maestro/SKILL.md +7 -9
  41. package/src/modules/wizz/agents/wizz-maestro/customize.toml +2 -3
  42. package/src/modules/wizz/agents/wizz-memoria/SKILL.md +7 -7
  43. package/src/modules/wizz/agents/wizz-memoria/customize.toml +5 -6
  44. package/src/modules/wizz/agents/wizz-qa/SKILL.md +5 -6
  45. package/src/modules/wizz/agents/wizz-qa/customize.toml +3 -4
  46. package/src/modules/wizz/agents/wizz-seo/SKILL.md +4 -1
  47. package/src/modules/wizz/agents/wizz-seo/customize.toml +2 -3
  48. package/src/modules/wizz/agents/wizz-seo/knowledge/playbook.md +31 -0
  49. package/src/modules/wizz/agents/wizz-social/SKILL.md +5 -3
  50. package/src/modules/wizz/agents/wizz-social/customize.toml +12 -3
  51. package/src/modules/wizz/overrides/wizz-agent-analyst.toml +2 -2
  52. package/src/modules/wizz/overrides/wizz-agent-architect.toml +3 -3
  53. package/src/modules/wizz/overrides/wizz-agent-dev.toml +3 -3
  54. package/src/modules/wizz/overrides/wizz-agent-pm.toml +2 -2
  55. package/src/modules/wizz/overrides/wizz-agent-tech-writer.toml +2 -2
  56. package/src/modules/wizz/overrides/wizz-agent-ux-designer.toml +2 -2
  57. package/src/modules/wizz/subagents/codex/wizz-exec-standard.toml +1 -1
  58. package/src/modules/wizz/subagents/codex/wizz-exec-strong.toml +1 -1
  59. package/src/modules/wizz/subagents/gemini/wizz-exec-standard.md +1 -1
  60. package/src/modules/wizz/subagents/gemini/wizz-exec-strong.md +1 -1
  61. package/src/modules/wizz/subagents/opencode/wizz-exec-standard.md +1 -1
  62. package/src/modules/wizz/subagents/opencode/wizz-exec-strong.md +1 -1
  63. package/src/modules/wizz/subagents/spec.yaml +6 -6
  64. package/src/modules/wizz/subagents/wizz-exec-standard.md +1 -1
  65. package/src/modules/wizz/subagents/wizz-exec-strong.md +1 -1
  66. package/src/skills-lib/_shared/complexity-signal.md +8 -9
  67. package/src/skills-lib/_shared/dispatch-rule.yaml +21 -0
  68. package/src/skills-lib/{cerebro → wizz-cerebro}/SKILL.md +1 -1
  69. package/src/skills-lib/{ctc-align → wizz-ctc-align}/SKILL.md +1 -1
  70. package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/SKILL.md +1 -1
  71. package/src/skills-lib/{find-skills → wizz-find-skills}/SKILL.md +1 -1
  72. package/src/skills-lib/wizz-hook-extractor/LICENSE +21 -0
  73. package/src/skills-lib/wizz-hook-extractor/SKILL.md +56 -0
  74. package/src/skills-lib/wizz-hook-extractor/references/examples.md +59 -0
  75. package/src/skills-lib/wizz-hook-extractor/references/formulas.md +136 -0
  76. package/src/skills-lib/wizz-hook-extractor/scripts/read-post.sh +83 -0
  77. package/src/skills-lib/wizz-huashu-design/references/sfx-library.md +1 -1
  78. package/src/skills-lib/wizz-huashu-design/scripts/add-music.sh +1 -1
  79. package/src/skills-lib/wizz-huashu-design/scripts/html2pptx.js +45 -37
  80. package/src/skills-lib/wizz-huashu-design/scripts/mix-voiceover.sh +1 -1
  81. package/src/skills-lib/wizz-huashu-design/scripts/narrate-pipeline.mjs +11 -5
  82. package/src/skills-lib/wizz-huashu-design/scripts/test_scripts.py +209 -0
  83. package/src/skills-lib/wizz-huashu-design/scripts/tts-doubao.mjs +42 -28
  84. package/src/skills-lib/wizz-ig-profile-optimizer/LICENSE +21 -0
  85. package/src/skills-lib/wizz-ig-profile-optimizer/SKILL.md +74 -0
  86. package/src/skills-lib/wizz-ig-profile-optimizer/scripts/capture-profile.sh +41 -0
  87. package/src/skills-lib/wizz-ig-profile-optimizer/scripts/limits.mjs +82 -0
  88. package/src/skills-lib/wizz-inicio-de-projeto/SKILL.md +1 -1
  89. package/src/skills-lib/wizz-launch-readiness/SKILL.md +7 -7
  90. package/src/skills-lib/wizz-launch-readiness/references/02-seguranca.md +3 -3
  91. package/src/skills-lib/wizz-launch-readiness/references/03-seo-descoberta.md +5 -5
  92. package/src/skills-lib/wizz-launch-readiness/references/04-analytics-medicao.md +1 -1
  93. package/src/skills-lib/wizz-launch-readiness/references/05-conteudo-prova-social.md +6 -6
  94. package/src/skills-lib/wizz-launch-readiness/references/06-legal-lgpd.md +1 -1
  95. package/src/skills-lib/wizz-launch-readiness/references/08-fusao-priorizacao.md +1 -1
  96. package/src/skills-lib/wizz-offer-forge/SKILL.md +3 -3
  97. package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/README.md +1 -1
  98. package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/SKILL.md +1 -1
  99. package/src/skills-lib/wizz-router/SKILL.md +3 -3
  100. package/src/skills-lib/wizz-router/references/routing-table-flat.md +11 -9
  101. package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/SKILL.md +1 -1
  102. package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/SKILL.md +1 -1
  103. package/src/skills-lib/wizz-video-effects/SKILL.md +4 -3
  104. package/src/skills-lib/wizz-video-effects/references/data-contract.md +3 -3
  105. package/src/skills-lib/wizz-video-effects/scripts/fill_breaths.py +15 -1
  106. package/src/skills-lib/wizz-video-effects/scripts/test_fill_breaths.py +20 -0
  107. package/src/skills-lib/wizz-video-styles/SKILL.md +11 -5
  108. package/src/skills-lib/wizz-video-styles/data/recipes.json +65 -2
  109. package/src/skills-lib/wizz-video-styles/data/references.json +386 -1
  110. package/src/skills-lib/wizz-video-styles/data/styles.json +109 -0
  111. package/src/skills-lib/wizz-video-styles/references/generated-prompts.md +70 -0
  112. package/src/skills-lib/wizz-video-styles/references/measured-patterns.md +2 -0
  113. package/src/skills-lib/wizz-video-styles/references/style-picker.md +8 -4
  114. package/src/skills-lib/wizz-video-styles/references/styles/tipografia-cinetica.md +68 -0
  115. package/src/skills-lib/wizz-video-styles/references/styles/ui-morph.md +68 -0
  116. package/src/skills-lib/wizz-video-styles/scripts/analyze.sh +23 -10
  117. package/src/skills-lib/wizz-video-styles/scripts/beat_grid.py +68 -0
  118. package/src/skills-lib/wizz-video-styles/scripts/references.mjs +265 -0
  119. package/src/skills-lib/wizz-web-security/SKILL.md +1 -1
  120. package/tools/fetch-assets.mjs +1 -1
  121. package/tools/hooks/README.md +18 -14
  122. package/tools/hooks/rtk-rewrite.js +95 -0
  123. package/tools/hooks/security-defensive-context.js +17 -1
  124. package/tools/hooks/session-rules.js +25 -5
  125. package/tools/hooks/wizz-arrumar.js +126 -12
  126. package/tools/hooks/wizz-artifact-guard.js +41 -7
  127. package/tools/hooks/wizz-cerebro-lib.js +239 -0
  128. package/tools/hooks/wizz-close-reminder.js +124 -0
  129. package/tools/hooks/wizz-debug-lib.js +55 -0
  130. package/tools/hooks/wizz-decision-trace.js +19 -2
  131. package/tools/hooks/wizz-feature.js +20 -4
  132. package/tools/hooks/wizz-router-enforce.js +30 -13
  133. package/tools/installer/command-text.js +243 -0
  134. package/tools/installer/commands/catalog.js +2 -0
  135. package/tools/installer/commands/doctor.js +10 -12
  136. package/tools/installer/commands/fetch-assets.js +5 -5
  137. package/tools/installer/commands/install.js +6 -7
  138. package/tools/installer/commands/resolve.js +17 -17
  139. package/tools/installer/commands/trace-report.js +40 -37
  140. package/tools/installer/core/doctor.js +60 -55
  141. package/tools/installer/core/hooks-settings.js +88 -14
  142. package/tools/installer/core/hooks-smoke.js +134 -0
  143. package/tools/installer/core/installer.js +61 -52
  144. package/tools/installer/core/quick-update.js +2 -3
  145. package/tools/installer/install-text.js +201 -0
  146. package/tools/installer/modules/channel-plan.js +2 -2
  147. package/tools/installer/modules/env-vars.js +5 -6
  148. package/tools/installer/modules/skills-lib.js +1 -1
  149. package/tools/installer/ui.js +17 -9
  150. /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-pesquisa-e-memoria.md +0 -0
  151. /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-rotina-e-captura.md +0 -0
  152. /package/src/skills-lib/{cerebro → wizz-cerebro}/references/comandos-sessao.md +0 -0
  153. /package/src/skills-lib/{ctc-align → wizz-ctc-align}/scripts/align.py +0 -0
  154. /package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/README.md +0 -0
  155. /package/src/skills-lib/{enhance-prompt → wizz-enhance-prompt}/references/KEYWORDS.md +0 -0
  156. /package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/assets/template.html +0 -0
  157. /package/src/skills-lib/{pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico-do-piva}/prompts.md +0 -0
  158. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-1-validacao-entrada.md +0 -0
  159. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-2-autorizacao.md +0 -0
  160. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-3-abuso-volume.md +0 -0
  161. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-4-vazamento-resposta.md +0 -0
  162. /package/src/skills-lib/{security-audit-pentest → wizz-security-audit-pentest}/references/stage-5-fusao-plano.md +0 -0
  163. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/01-cta-principal.md +0 -0
  164. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/02-barra-fixa-mobile.md +0 -0
  165. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/03-tempo-de-resposta.md +0 -0
  166. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/04-prova-social.md +0 -0
  167. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/05-faq-decisao.md +0 -0
  168. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/06-imagens-reais.md +0 -0
  169. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/07-endereco-como-chegar.md +0 -0
  170. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/08-titles.md +0 -0
  171. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/09-open-graph.md +0 -0
  172. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/10-breadcrumbs.md +0 -0
  173. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/11-alt-text.md +0 -0
  174. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/12-schema-local.md +0 -0
  175. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/13-robots-sitemap.md +0 -0
  176. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/14-privacidade-termos.md +0 -0
  177. /package/src/skills-lib/{site-launch-kit → wizz-site-launch-kit}/references/15-medicao.md +0 -0
@@ -1,16 +1,16 @@
1
1
  # Area 03 · SEO / Discoverability
2
2
 
3
- Checks whether the product CAN be found on launch day. This is not a ranking, traffic, or Core Web Vitals diagnosis (that's `wizz-seo-audit`), and when the surface is a SITE, it doesn't repeat the execution rounds (that's `site-launch-kit`, rounds 08 to 13): here it only confirms whether basic indexability exists.
3
+ Checks whether the product CAN be found on launch day. This is not a ranking, traffic, or Core Web Vitals diagnosis (that's `wizz-seo-audit`), and when the surface is a SITE, it doesn't repeat the execution rounds (that's `wizz-site-launch-kit`, rounds 08 to 13): here it only confirms whether basic indexability exists.
4
4
 
5
5
  If the project has no indexable public web surface (e.g., mobile-only app, internal tool), respond `ITEM DOES NOT APPLY` with a 1-line justification and stop.
6
6
 
7
7
  ## Objective checks
8
8
 
9
- 1. **`robots.txt` present and not blocking everything.** Missing is 🟠; present but blocking `Disallow: /` in production by mistake is 🔴. Point to `site-launch-kit` (round 13) as the fixer.
9
+ 1. **`robots.txt` present and not blocking everything.** Missing is 🟠; present but blocking `Disallow: /` in production by mistake is 🔴. Point to `wizz-site-launch-kit` (round 13) as the fixer.
10
10
  2. **Sitemap present and referenced in `robots.txt`.** Missing is 🟠.
11
- 3. **Unique title and meta description on the main public pages.** A default/repeated title (e.g., the same title on every page) is 🟠. Point to `site-launch-kit` (round 08).
12
- 4. **Open Graph configured.** Without `og:title`/`og:image`/`og:description`, the share preview (WhatsApp, social) comes out broken. It's 🟡, but escalates to 🟠 if the launch's main acquisition channel is social/WhatsApp. Point to `site-launch-kit` (round 09).
13
- 5. **Basic structured business data.** Absence isn't a standalone blocker, but if the business depends on appearing in Google local/rich snippets, it's 🟡. Point to `site-launch-kit` (round 12) or `wizz-schema-markup`.
11
+ 3. **Unique title and meta description on the main public pages.** A default/repeated title (e.g., the same title on every page) is 🟠. Point to `wizz-site-launch-kit` (round 08).
12
+ 4. **Open Graph configured.** Without `og:title`/`og:image`/`og:description`, the share preview (WhatsApp, social) comes out broken. It's 🟡, but escalates to 🟠 if the launch's main acquisition channel is social/WhatsApp. Point to `wizz-site-launch-kit` (round 09).
13
+ 5. **Basic structured business data.** Absence isn't a standalone blocker, but if the business depends on appearing in Google local/rich snippets, it's 🟡. Point to `wizz-site-launch-kit` (round 12) or `wizz-schema-markup`.
14
14
  6. **Canonical and non-duplicated indexing.** Multiple URLs serving the same content without `rel=canonical` is 🟡.
15
15
  7. **Domain/DNS resolving to the right production environment.** A domain configured but pointing to the staging/preview environment is 🔴 (also an infra finding, see area 07; log only the discoverability part here: whether the search engine has already indexed the wrong domain).
16
16
 
@@ -6,7 +6,7 @@ Checks whether the team will be able to KNOW if the launch worked. A launch with
6
6
 
7
7
  1. **Analytics tool installed and firing.** No GA4/pixel/equivalent tool loading on the public pages at all is 🔴 if the launch depends on measuring acquisition; 🟠 otherwise.
8
8
  2. **Main conversion event configured.** The event that represents the launch's goal (signup, purchase, lead, download) not firing or not existing is 🔴.
9
- 3. **Thank-you/confirmation page event.** A post-conversion page with no "confirmed conversion" event (distinct from just "visited the page") is 🟠. Overlaps with `site-launch-kit` round 15 when the surface is a site.
9
+ 3. **Thank-you/confirmation page event.** A post-conversion page with no "confirmed conversion" event (distinct from just "visited the page") is 🟠. Overlaps with `wizz-site-launch-kit` round 15 when the surface is a site.
10
10
  4. **Trackable traffic source/UTM.** Launch campaigns without standardized UTM is 🟡: it measures what happened, but not where it came from.
11
11
  5. **Production error monitoring (Sentry or equivalent).** A project that already uses an error tool but it's not active in the production environment is 🟠. A project that never adopted one at all is 🟡 (not a recommendation to adopt Sentry now, just logging a gap: the adoption decision belongs to the team).
12
12
  6. **Downtime/uptime alert.** No alert configured for when the product goes down on launch day (when traffic is most sensitive) is 🟠.
@@ -1,20 +1,20 @@
1
1
  # Area 05 · Content / Copy / Social Proof
2
2
 
3
- Checks whether what is written and shown is REAL and ready — not whether the copy is good (that's `wizz-copywriting`/`wizz-copy-editing`). Central rule, inherited from `site-launch-kit`: no invented business data passes as compliant. Whatever is missing becomes a PENDING ITEM, never a guess filled in by estimation.
3
+ Checks whether what is written and shown is REAL and ready — not whether the copy is good (that's `wizz-copywriting`/`wizz-copy-editing`). Central rule, inherited from `wizz-site-launch-kit`: no invented business data passes as compliant. Whatever is missing becomes a PENDING ITEM, never a guess filled in by estimation.
4
4
 
5
5
  ## Objective checks
6
6
 
7
7
  1. **Placeholder text in production.** `Lorem ipsum`, `TODO`, `[insert here]`, `{{LIKE THIS}}`, or any visible marker on a page/screen that's going live is 🔴.
8
- 2. **Real social proof.** A testimonial, rating, or client logo without a verifiable source (a generic name like "Satisfied customer", a rating with no origin, a company logo that isn't actually a client) is 🔴: fake social proof is a reputational and sometimes legal risk. Point to `site-launch-kit` (round 04) when the surface is a site.
8
+ 2. **Real social proof.** A testimonial, rating, or client logo without a verifiable source (a generic name like "Satisfied customer", a rating with no origin, a company logo that isn't actually a client) is 🔴: fake social proof is a reputational and sometimes legal risk. Point to `wizz-site-launch-kit` (round 04) when the surface is a site.
9
9
  3. **Current price, timeline, contact info.** A price/plan/phone/email/hours that diverges from what the business actually does is 🔴. Don't validate this "by estimate": if you have no way to confirm the real data, mark it PENDING and ask — never accept what's already written as correct by default.
10
- 4. **Real image vs. generic stock.** A generic stock photo in a context that should be authentic (team, product, location) is 🟡, escalating to 🟠 if the sector depends on visual trust (health, in-person service, financial). Point to `site-launch-kit` (round 06).
10
+ 4. **Real image vs. generic stock.** A generic stock photo in a context that should be authentic (team, product, location) is 🟡, escalating to 🟠 if the sector depends on visual trust (health, in-person service, financial). Point to `wizz-site-launch-kit` (round 06).
11
11
  5. **Product/brand name consistency.** The product name spelled differently across pages (e.g., "MeJu" vs. "Me Ju" vs. "meju") is 🟡.
12
- 6. **Main CTA and message present and clear.** No main CTA above the fold on the landing page is 🔴 when the launch's goal depends on direct conversion. Point to `site-launch-kit` (round 01).
13
- 7. **FAQ or objection-handling content ready for expected volume.** No FAQ when the product has a known recurring objection is 🟡. Point to `site-launch-kit` (round 05) or `wizz-copywriting`.
12
+ 6. **Main CTA and message present and clear.** No main CTA above the fold on the landing page is 🔴 when the launch's goal depends on direct conversion. Point to `wizz-site-launch-kit` (round 01).
13
+ 7. **FAQ or objection-handling content ready for expected volume.** No FAQ when the product has a known recurring objection is 🟡. Point to `wizz-site-launch-kit` (round 05) or `wizz-copywriting`.
14
14
 
15
15
  ## Cutoff rule
16
16
 
17
- Never fill in missing business data "to unblock the diagnosis". If it can't be confirmed (price, testimonial, address, timeline), the item becomes PENDING with "who to get it from / how to get it", same as `site-launch-kit`. Marking 🟢 without checking the real content is worse than marking PENDING.
17
+ Never fill in missing business data "to unblock the diagnosis". If it can't be confirmed (price, testimonial, address, timeline), the item becomes PENDING with "who to get it from / how to get it", same as `wizz-site-launch-kit`. Marking 🟢 without checking the real content is worse than marking PENDING.
18
18
 
19
19
  ## Output format
20
20
 
@@ -4,7 +4,7 @@ Checks basic legal exposure before launch. This isn't a legal opinion (that requ
4
4
 
5
5
  ## Objective checks
6
6
 
7
- 1. **Privacy policy exists and is accessible.** Total absence, in a product that collects personal data (signup, form, analytics cookie), is 🔴. Point to `site-launch-kit` (round 14) when the surface is a site.
7
+ 1. **Privacy policy exists and is accessible.** Total absence, in a product that collects personal data (signup, form, analytics cookie), is 🔴. Point to `wizz-site-launch-kit` (round 14) when the surface is a site.
8
8
  2. **Privacy policy matches what the product actually does.** A generic copied document that doesn't reflect the real app (e.g., mentions data that isn't collected, or omits data that is) is 🔴: an incorrect policy is worse than none, because it creates a false legal commitment. Read the content, don't just confirm the file exists.
9
9
  3. **Terms of use present when there's a transaction or user account.** Absence is 🟠.
10
10
  4. **Cookie/tracking consent implemented when there's a non-essential cookie.** Analytics/pixel firing with no cookie notice at all is 🟠.
@@ -7,7 +7,7 @@ Takes the 7 tables from the areas (01 to 07) and merges them into a single diagn
7
7
  1. **Paste the 7 tables** (or whichever ran, if any was marked `ITEM DOES NOT APPLY`).
8
8
  2. **Dedup by cross-origin.** The same problem can show up in two areas (e.g., a domain pointing to the wrong environment appears in area 03 and area 07). Keep a single row, citing both source areas.
9
9
  3. **Sort by severity first** (🔴 at the top, 🟢 at the bottom), and within the same severity, by estimated fix effort (lowest effort first): resolve first whatever is closest to go-live.
10
- 4. **Group by fix owner.** Several 🔴 findings going to the same owner (e.g., 3 findings for `site-launch-kit`) form a single block in the delivery, to become a single dispatch.
10
+ 4. **Group by fix owner.** Several 🔴 findings going to the same owner (e.g., 3 findings for `wizz-site-launch-kit`) form a single block in the delivery, to become a single dispatch.
11
11
  5. **Count pending items separately.** MANUAL VERIFICATION PENDING is not a severity: it's "can't be known yet". List it separately, with what's needed to turn it into a real verdict.
12
12
 
13
13
  ## Final table
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wizz-offer-forge
3
- description: Forges irresistible direct-response and info-product offers by integrating a unique mechanism, offer thesis, value stacking, reverse guarantee, price anchoring, and a creative matrix for paid traffic. Use when the user wants to create a new offer from scratch, restructure an existing offer that isn't converting, stack high-perception bonuses, define an aggressive guarantee, or translate audience research (Piva/VoC) into a sales machine. Do NOT use for raw audience research (use pesquisa-de-publico-do-piva) or final page copywriting (use wizz-copywriting).
3
+ description: Forges irresistible direct-response and info-product offers by integrating a unique mechanism, offer thesis, value stacking, reverse guarantee, price anchoring, and a creative matrix for paid traffic. Use when the user wants to create a new offer from scratch, restructure an existing offer that isn't converting, stack high-perception bonuses, define an aggressive guarantee, or translate audience research (Piva/VoC) into a sales machine. Do NOT use for raw audience research (use wizz-pesquisa-de-publico-do-piva) or final page copywriting (use wizz-copywriting).
4
4
  ---
5
5
 
6
6
  # Wizz Offer Forge
@@ -31,10 +31,10 @@ A master artifact `OFFER-SPEC.md` containing:
31
31
 
32
32
  **Before asking anything, read what already exists.** A good offer is born from the result of the previous one, not from a blank page.
33
33
 
34
- If the `cerebro` skill is installed, run `/cerebro ver` for the project and grep by theme in `_decisions/`. Look specifically for: a previous offer to the same audience, a price already tested, a guarantee already used, and any logged decision that forbids a certain path. Bring back what you found as input and state in your reply where it came from. Without the skill installed, skip this block and proceed with the questions below.
34
+ If the `wizz-cerebro` skill is installed, run `/wizz-cerebro ver` for the project and grep by theme in `_decisions/`. Look specifically for: a previous offer to the same audience, a price already tested, a guarantee already used, and any logged decision that forbids a certain path. Bring back what you found as input and state in your reply where it came from. Without the skill installed, skip this block and proceed with the questions below.
35
35
 
36
36
  Then, consult existing context or ask the user:
37
- 1. **Prior Audience Research:** Is there a report from the `pesquisa-de-publico-do-piva` skill or VoC notes? If so, import it as primary input. If not, define the Avatar, Latent Pain, and initial Awareness Level.
37
+ 1. **Prior Audience Research:** Is there a report from the `wizz-pesquisa-de-publico-do-piva` skill or VoC notes? If so, import it as primary input. If not, define the Avatar, Latent Pain, and initial Awareness Level.
38
38
  2. **Business Model:** Low-ticket (R$ 10 to R$ 97), Mid front-end (R$ 197 to R$ 497), or High-ticket / Mentorship (R$ 1,000 to R$ 10,000+)?
39
39
  3. **Delivery Vehicle:** Recorded course, community, templates/tools, live mentorship, SaaS, or hybrid?
40
40
 
@@ -42,7 +42,7 @@ Unzip the `pesquisa-de-publico-do-piva/` folder into `~/.claude/skills/` (to use
42
42
  Open a conversation, attach your offer document (`.docx`, `.pdf`, `.md` or `.txt`) and write:
43
43
 
44
44
  ```
45
- /pesquisa-de-publico-do-piva
45
+ /wizz-pesquisa-de-publico-do-piva
46
46
  ```
47
47
 
48
48
  Or, without the slash, anything in that spirit:
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: pesquisa-de-publico-do-piva
2
+ name: wizz-pesquisa-de-publico-do-piva
3
3
  description: Generates a complete audience research arsenal for an infoproduct offer and paid traffic, from an offer document (.docx/.md/.txt/.pdf). Produces six chained reports — VoC, Schwartz Psychographic Profile, Levels of Awareness, Trend Report, Angle Matrix and Lexicon — compiled into a tab-navigable HTML dashboard. Use when the user sends an offer and asks for audience research, VoC, voice of customer, angle matrix, audience lexicon, persona pain points, or a copy arsenal for direct traffic. Do NOT use for technical research on libraries/code (use context7), broad B2B market research (use deep-research), or visual UI research (use wizz-premium-landing-ui-researcher). Methodology by @soupiva.
4
4
  ---
5
5
 
@@ -20,7 +20,7 @@ You are the **Director / entry point** — not the orchestrator (that's `wizz-ma
20
20
 
21
21
  **Installation scope note:** this is the only skill in the catalog where **global** installation (`~/.claude/skills/wizz-router`) is the operationally correct default, not an exception to the "prefer local" rule (`skills-registry.yaml`, Installation Doctrine, rule 1) — its reason for existing is to route even outside a Wizz project. It stays in sync with the global `wizz-router-enforce.js` hook via `npm run sync:global`.
22
22
 
23
- **Token economy:** the `rtk-rewrite.sh` hook already handles RTK automatically (don't run `rtk --version` on every routing). Before reading raw files, prefer `/cerebro ver` or a specific `grep`.
23
+ **Token economy:** the `rtk-rewrite.sh` hook already handles RTK automatically (don't run `rtk --version` on every routing). Before reading raw files, prefer `/wizz-cerebro ver` or a specific `grep`.
24
24
 
25
25
  ## Triage and delegation (the Director's core job)
26
26
 
@@ -72,7 +72,7 @@ This gate does NOT fire for an open-scope request. "My site is bad, sort it out"
72
72
 
73
73
  **The counterpart, and this is what is left for the maestro:** a request **of open scope, which the request itself does not delimit** — "how do I improve the signup conversion rate", "the sales page gets plenty of visits and almost nobody buys", "my sales page converts badly, improve it". There the scope has to be discovered before anything is delivered, and discovering scope is the Manager's work. The deciding difference is not the size of the request, it is whether **the request already states what the delivery is**.
74
74
 
75
- **And the counterpart has one exception: a single entry already delimits the scope.** If the whole outcome being asked for fits the `when:` of ONE catalogue entry, and what leaves at the end is that entry's own deliverable — a plan, a recommendation, an audit — then the scope is not open, the catalogue delimited it, and the request goes to that entry's area. "A plan to reduce churn" is `wizz-churn-prevention`; "I want ChatGPT and Perplexity to cite us" is `wizz-ai-seo`; "what to check before going live" is `site-launch-kit`. It stops being the exception the moment delivering the outcome means changing what other areas own: "improve the signup conversion rate" ends up in copy, UI and code, so it comes back to the maestro through the area clause. Ask which single entry would deliver it whole — if it takes two, the scope really is open. (Owner's decision, 2026-09-18.)
75
+ **And the counterpart has one exception: a single entry already delimits the scope.** If the whole outcome being asked for fits the `when:` of ONE catalogue entry, and what leaves at the end is that entry's own deliverable — a plan, a recommendation, an audit — then the scope is not open, the catalogue delimited it, and the request goes to that entry's area. "A plan to reduce churn" is `wizz-churn-prevention`; "I want ChatGPT and Perplexity to cite us" is `wizz-ai-seo`; "what to check before going live" is `wizz-site-launch-kit`. It stops being the exception the moment delivering the outcome means changing what other areas own: "improve the signup conversion rate" ends up in copy, UI and code, so it comes back to the maestro through the area clause. Ask which single entry would deliver it whole — if it takes two, the scope really is open. (Owner's decision, 2026-09-18.)
76
76
 
77
77
  **Changing the product's code is `dev`, even when the subject is visual.** "Adjust the secondary button's colour", "fix the mobile spacing": the delivery is a commit, so it is the dev area — `designer` decides what the look should be, it does not ship the change. Ask which artifact leaves at the end: a file in the repo → dev; a decision, a spec or a piece of art → the area that owns it. **Exception: new or rebuilt screens.** When the request asks to BUILD screens in code (a new app, page, dashboard or panel, or a whole screen rebuilt in the product), the visual decision has not been made yet, so `designer` comes first and the sequence is design → dev (2 areas → maestro): the designer runs its research gate before any screen is coded. A tweak to an existing screen (a price, a label, a spacing) stays dev, and redesigning a section with no build asked for (a hero, a card) stays designer.
78
78
 
@@ -105,4 +105,4 @@ When detecting "auditoria completa / revisa tudo / 360 / análise geral", follow
105
105
 
106
106
  ## Memory Duty (at the end)
107
107
 
108
- After non-obvious bugs, architecture decisions, gotchas, or user corrections: record them in the project's `CLAUDE.md` ("Learnings" section) and in Cerebro (`/cerebro decisao` or `/cerebro salvar`). Remind the user if relevant.
108
+ After non-obvious bugs, architecture decisions, gotchas, or user corrections: record them in the project's `CLAUDE.md` ("Learnings" section) and in Cerebro (`/wizz-cerebro decisao` or `/wizz-cerebro salvar`). Remind the user if relevant.
@@ -2,7 +2,7 @@
2
2
 
3
3
  Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `_wizz/`) — there the router fires the skill on its own. **Inside a Wizz project** it can also be consulted as a CAPABILITY INDEX, to discover a relevant capability the user didn't name (e.g. "I want a carousel" → `wizz-canvas-design`); but delegation still happens through the normal SKILL.md dispatch (area agent / maestro) — the table never fires a skill directly inside a Wizz project.
4
4
 
5
- **Existence check:** before offering any skill, confirm it exists in the environment (the session's skill catalog or `ls ~/.claude/skills`); if it doesn't exist, don't offer it: use the missing-skill protocol (`find-skills`).
5
+ **Existence check:** before offering any skill, confirm it exists in the environment (the session's skill catalog or `ls ~/.claude/skills`); if it doesn't exist, don't offer it: use the missing-skill protocol (`wizz-find-skills`).
6
6
 
7
7
  ## Technical Area — Backend / Data / Infra
8
8
 
@@ -15,8 +15,8 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
15
15
  | Auth, secrets, tokens, OAuth, JWT, Clerk, permissions | `wizz-auth-and-secrets` + `wizz-web-security` | 1 |
16
16
  | Dependencies, packages, vulnerabilities, npm audit | `wizz-database-and-deps` | 2 |
17
17
  | Security, XSS, CSRF, SQLi, IDOR, OWASP, rate limit, CORS, clickjacking, PII in the response, user enumeration, headers | `wizz-web-security` + `wizz-auth-and-secrets` | 1 |
18
- | Full-app security audit/pentest, "audit security", "pentest", "find vulnerabilities", pre-release scan | `security-audit-pentest` | 1 |
19
- | **Autonomous, offensive** pentest that actually runs the app and proves each finding with a real PoC | CLI `strix` (qa registry). CONDITIONAL, never the default: only on an app the user owns/is authorized to test, and only when they ask for validated exploitation rather than a review. Start from `security-audit-pentest` | 2 |
18
+ | Full-app security audit/pentest, "audit security", "pentest", "find vulnerabilities", pre-release scan | `wizz-security-audit-pentest` | 1 |
19
+ | **Autonomous, offensive** pentest that actually runs the app and proves each finding with a real PoC | CLI `strix` (qa registry). CONDITIONAL, never the default: only on an app the user owns/is authorized to test, and only when they ask for validated exploitation rather than a review. Start from `wizz-security-audit-pentest` | 2 |
20
20
  | Error monitoring, crash/exception triage, releases and source maps in Sentry | CLI `sentry-cli` (architect registry). CONDITIONAL: only if the project ALREADY uses Sentry (`SENTRY_DSN` in env, `sentry.properties`, or `@sentry/` in package.json) and it's at production stage — never propose adopting Sentry from this row | 2 |
21
21
  | Launch-readiness audit, "is it ready to launch?", broad release checklist (technical, security, SEO, analytics, content, legal, infra), "what's missing before going to production" | `wizz-launch-readiness` | 1 |
22
22
  | Desktop, Electron, contextIsolation, code signing | `wizz-desktop-security` | 2 |
@@ -54,8 +54,8 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
54
54
  | Generate an image via code: carousel, quote card, infographic (editable PNG/PDF), generative hero background/texture | `wizz-canvas-design` + `wizz-algorithmic-art` | 2 |
55
55
  | **Video with audio, narration, SFX, or synced captions** (film assembly) | `wizz-remotion-best-practices` (Remotion assembles; frame timing). Pipeline rule: HyperFrames draws the mute screens, Remotion assembles the film — don't use hyperframes to position audio/captions (~2.76s drift and CSS leaking between screens in production) | 1 |
56
56
  | Draw a video SCREEN/scene in HTML/CSS, mute visual (app mockup, animated chart, title, loop; HTML→MP4) | CLI `hyperframes` (designer registry; `npx skills add heygen-com/hyperframes`) — mute screens only; assembly with audio goes to Remotion (line above) | 2 |
57
- | Word-by-word timestamps for TTS narration (sync captions/cuts/animation with speech) | `ctc-align` (designer registry; single source of timing, replaces Whisper) | 2 |
58
- | Which short-video STYLE to copy, from the inventory of the material (real person, voice only, B-roll, screens, product), with the recipe measured on 99 real shorts; "edit it in the style of", "the video looks amateur" | `wizz-video-styles` (designer registry; picks the style before voice, timing, effects and assembly) | 2 |
57
+ | Word-by-word timestamps for TTS narration (sync captions/cuts/animation with speech) | `wizz-ctc-align` (designer registry; single source of timing, replaces Whisper) | 2 |
58
+ | Which short-video STYLE to copy, from the inventory of the material (real person, voice only, B-roll, screens, product), with the recipe measured on 110 real videos (lyric video, kinetic typography and the UI-only app video "ui-morph" included); "a video of my app moving", "edit it in the style of", "the video looks amateur" | `wizz-video-styles` (designer registry; picks the style before voice, timing, effects and assembly) | 2 |
59
59
  | Effects and sound of a short vertical video (ad or Reels): which effect goes where and when not, which SFX for each event and at what level, ducking, master loudness, safe-zone/density/excess/rhythm gates | `wizz-video-effects` (designer registry; decides the effects, Remotion assembles them) | 2 |
60
60
  | **Find B-roll / inserts / cutaways / supporting footage** for a video or Reel (real footage of the fact, person, product, news item or screen the script names; YouTube/Instagram/TikTok/Pexels/Pixabay/Commons/NASA) | CLI `get-brolls` (designer registry; **macOS**, global `skills add` + its own `install.sh`; needs ffmpeg with drawtext, Node 22+, Python 3.11+). Ends in a Storyboard the HUMAN approves — the agent never self-approves. Stock only when the user explicitly asks for stock | 1 |
61
61
  | **Edit/cut video** (cuts, selects, roughcut) | CLI `buttercut` (designer registry; **Apple Silicon only**, clone-and-run in the project, heavy deps) | 1 |
@@ -72,7 +72,7 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
72
72
  | Paid ads, ads, Google Ads, Meta Ads, TikTok Ads, paid media | `wizz-paid-ads` + `wizz-ad-creative` + `wizz-analytics-tracking` | 1 |
73
73
  | Wrong pixel/UTM/attribution, "sales don't match the ads manager", "where is the funnel leaking", inflated organic traffic, checking tracking before launching a campaign | `wizz-tracking-audit` (+ `wizz-analytics-tracking` if it's a SaaS/product) | 1 |
74
74
  | Feature launch, product launch, go-to-market | `wizz-launch-strategy` + `wizz-social-content` + `wizz-email-sequence` | 1 |
75
- | Site ready to go live, SITE pre-launch, "review before deploy", go-live checklist, or a specific pre-launch item (og:image/link preview, FAQ with schema, robots.txt, LGPD, alt text) | `site-launch-kit` | 1 |
75
+ | Site ready to go live, SITE pre-launch, "review before deploy", go-live checklist, or a specific pre-launch item (og:image/link preview, FAQ with schema, robots.txt, LGPD, alt text) | `wizz-site-launch-kit` | 1 |
76
76
  | Price, plans, pricing, monetization | `wizz-pricing-strategy` + `wizz-paywall-upgrade-cro` | 1 |
77
77
  | Churn, retention, cancellation, NPS | `wizz-churn-prevention` + `wizz-revops` | 1 |
78
78
  | Page conversion, CRO, funnel optimization | `wizz-page-cro` + `wizz-copywriting` + `wizz-form-cro` | 1 |
@@ -84,6 +84,8 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
84
84
  | EXECUTE the SEO distribution: publish articles, build backlinks through the Distribb network, connect Search Console, autopublish news | CLI `distribb` (seo registry) — the doing half; the strategy half is the SEO row above | 2 |
85
85
  | Competitor comparison, alternatives page, war room | `wizz-competitor-alternatives` | 2 |
86
86
  | Content, social media, newsletter, threads | `wizz-content-strategy` + `wizz-social-content` + `wizz-copy-editing` | 2 |
87
+ | Tear down ONE viral Instagram post (Reel, carousel, caption) from its link: why it worked, which hook, a mould to do one like it | `wizz-hook-extractor` (social registry; reads the post itself) | 2 |
88
+ | Audit and rewrite an Instagram PROFILE: bio, search NAME, link, highlights, pinned posts | `wizz-ig-profile-optimizer` (social registry) | 2 |
87
89
  | Actually PUBLISH/schedule to social networks (Instagram, TikTok, YouTube, LinkedIn and more), not write it | CLI `buffer` (social registry; needs `BUFFER_API_KEY`; media must be a public HTTPS URL). Separates "generate" (Wizz skills above) from "publish" | 2 |
88
90
  | Cold email, B2B outbound, prospecting | `wizz-cold-email` | 2 |
89
91
  | Referral, referrals, affiliate program | `wizz-referral-program` | 2 |
@@ -91,7 +93,7 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
91
93
  | Free lead-capture tool | `wizz-free-tool-strategy` | 2 |
92
94
  | A/B test, variations, conversion experiments | `wizz-ab-test-setup` + `wizz-analytics-tracking` | 2 |
93
95
  | Copywriting, copy, persuasion, sales text | `wizz-copywriting` + `wizz-humanizer` | 1 |
94
- | Offer audience research, VoC, angle matrix, info-product lexicon | `pesquisa-de-publico-do-piva` | 1 |
96
+ | Offer audience research, VoC, angle matrix, info-product lexicon | `wizz-pesquisa-de-publico-do-piva` | 1 |
95
97
  | Forge an offer, create an irresistible offer, unique mechanism, bonus, guarantee | `wizz-offer-forge` + `wizz-pricing-strategy` | 1 |
96
98
  | Market research, competitive intelligence | `deep-research` (external plugin — only if installed) | 2 |
97
99
  | Scrape/crawl the web for market research, lead prospecting or competitive intel (anti-bot bypass, adaptive parsing) | MCP `scrapling` (growth registry) — the collection layer under the research rows above | 2 |
@@ -100,7 +102,7 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
100
102
 
101
103
  | Intent / keywords | Skills to offer | Priority |
102
104
  |---|---|---|
103
- | What was decided, past context, learnings, history | `cerebro` (/ver or /dia) | 1 |
105
+ | What was decided, past context, learnings, history | `wizz-cerebro` (/ver or /dia) | 1 |
104
106
 
105
107
  ---
106
108
 
@@ -108,7 +110,7 @@ Use this table to map skills/CLIs/MCPs directly **outside a Wizz project** (no `
108
110
 
109
111
  When no installed skill/MCP covers the request, **classify what's missing** (skill = knowledge/flow; MCP = real access to a tool/API):
110
112
 
111
- **Missing a SKILL:** inform → invoke `find-skills` → `npx skills find "<term>"` → present 2-3 candidates with source → propose `npx skills add <pkg>` with confirmation → route again. Sources: anthropics/skills, superpowers-marketplace, skill-codex, claude-mem, skills.sh. **Review the SKILL.md and any `scripts/` before installing; prefer known owners.**
113
+ **Missing a SKILL:** inform → invoke `wizz-find-skills` → `npx skills find "<term>"` → present 2-3 candidates with source → propose `npx skills add <pkg>` with confirmation → route again. Sources: anthropics/skills, superpowers-marketplace, skill-codex, claude-mem, skills.sh. **Review the SKILL.md and any `scripts/` before installing; prefer known owners.**
112
114
 
113
115
  **Missing an MCP:** inform → `claude mcp list` → check `skills-registry.yaml` (`mcps:`/`mcp_utility:`, with a ready `server`) → propose `claude mcp add <id> [-e VAR=$VAR] -- <command> [args]`. Secrets always via env/placeholder, never a real token.
114
116
 
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: security-audit-pentest
2
+ name: wizz-security-audit-pentest
3
3
  description: >
4
4
  Adversarial 5-stage security audit with standardized output (markdown table, cutoff ruler,
5
5
  concrete payload per finding). Use when the request is to audit/pentest an entire app, review security
@@ -1,5 +1,5 @@
1
1
  ---
2
- name: site-launch-kit
2
+ name: wizz-site-launch-kit
3
3
  description: "Operational pre-launch website checklist in 15 corrective rounds: main CTA above the fold, mobile sticky bar, response-time promise, real social proof, decision-focused FAQ with FAQPage, real images (not stock), address and directions, unique titles, Open Graph, breadcrumbs, alt text, local business schema, robots/sitemap, LGPD privacy policy and terms, event measurement. Use when the site is ready or nearly ready to go live: 'vamos lançar', 'subir o site', 'revisar antes do deploy', 'checklist de lançamento', 'pré-go-live', 'o site tá pronto?', or when the request is one of the individual items (e.g. 'arruma a prévia do WhatsApp', 'coloca FAQ com schema', 'confere robots.txt antes de subir'). Runs AFTER the site is built and BEFORE deploy. Central rule: no invented business data goes into the site; whatever is missing becomes a placeholder and goes into PENDING ITEMS."
4
4
  ---
5
5
 
@@ -9,7 +9,8 @@ A catalogue of effects is easy. What makes a video look professional is the **re
9
9
 
10
10
  ## Where it sits in the video pipeline
11
11
 
12
- 1. Script and narration exist; `ctc-align` gave word-by-word timestamps.
12
+ 1. Script and narration exist; `wizz-ctc-align` gave word-by-word timestamps.
13
+ On a music-driven piece (lyric video over a song) the song is the narration: `scenes[]` start on the downbeats from `wizz-video-styles/scripts/beat_grid.py`, and the song's own hits count as the SFX budget already spent.
13
14
  2. Screens were drawn silent (HyperFrames) or footage was sourced.
14
15
  3. **This skill:** events → SFX and levels → effects anchored on breaths → budget → timeline JSON → (render in Remotion) → gates on the final MP4.
15
16
  4. Remotion assembles from the timeline JSON. For the `<Audio>` and `<Sequence>` API, invoke the `wizz-remotion-best-practices` skill.
@@ -38,7 +39,7 @@ Requires Python 3 (stdlib only) and ffmpeg/ffprobe.
38
39
 
39
40
  ## Per piece
40
41
 
41
- 1. **Timeline.** Write the piece's timeline JSON ([references/data-contract.md](references/data-contract.md)): `words[]` from ctc-align, `scenes[]`, `elements[]`, and the safe-zone profile (`ad` or `organic`).
42
+ 1. **Timeline.** Write the piece's timeline JSON ([references/data-contract.md](references/data-contract.md)): `words[]` from wizz-ctc-align, `scenes[]`, `elements[]`, and the safe-zone profile (`ad` or `organic`).
42
43
  2. **Events to sounds.** List what happens in the narration as semantic events with their times, from the words: a price appears, a verdict lands, a message arrives. Map them with `res = sound.map_requests([(5.4, "verdict"), (7.1, "element_in")], cfg)` from `scripts/sound.py`; it returns the shots (file and `vol` from the config) plus the refusals, with the reason. Write the accepted shots into `sfx[]` with their `event`. Events that trigger an effect (a `verdict` triggers `shake`): pass `sound.effect_candidates(res)` through `budget.select(...)` from `scripts/budget.py` and write the accepted ones into `shakes[]`; no other step writes them.
43
44
  3. **Effects on breaths.** `python3 scripts/fill_breaths.py TIMELINE --narration NARRATION.mp3 --visual LAYOUT_RENDER.mp4 --write` anchors punches and flashes on real speech breaths, runs every candidate through the budget, and sets scene transitions and cut sounds by speech pace. Without `--write` it only reports.
44
45
  - `--narration` is required in practice: ctc-align words touch each other (each ends where the next starts), so `words[]` alone yields almost no breaths.
@@ -80,6 +81,6 @@ Full table, what each gate cannot see, and escape hatches: [references/gates.md]
80
81
 
81
82
  - Assembling the film, captions layout, `<Audio>` API: `wizz-remotion-best-practices`.
82
83
  - Drawing screens: HyperFrames.
83
- - Word timestamps: `ctc-align`.
84
+ - Word timestamps: `wizz-ctc-align`.
84
85
  - Script, hook wording and CTA wording: the copy or social area.
85
86
  - Launch films with music and art direction: `wizz-huashu-design`.
@@ -1,6 +1,6 @@
1
1
  # Timeline data contract
2
2
 
3
- The scripts in `scripts/` read and write one JSON object per piece: the **timeline**. It is the hand-off between whoever plans the edit (HyperFrames screens, `ctc-align` timing) and whoever renders the audio and effects (Remotion). Times are always **seconds from the start of the piece**, as floats. Every list is optional: an absent list is an empty list, never an error.
3
+ The scripts in `scripts/` read and write one JSON object per piece: the **timeline**. It is the hand-off between whoever plans the edit (HyperFrames screens, `wizz-ctc-align` timing) and whoever renders the audio and effects (Remotion). Times are always **seconds from the start of the piece**, as floats. Every list is optional: an absent list is an empty list, never an error.
4
4
 
5
5
  Numbers that decide anything (gaps, ceilings, depths) are never in the timeline: they live in `effects.config.json` and are cited by key.
6
6
 
@@ -11,7 +11,7 @@ Numbers that decide anything (gaps, ceilings, depths) are never in the timeline:
11
11
  | `fps` | int | `sound.py duck` | planner | render fps; default `frame.fps` of the config |
12
12
  | `duration` | float | every check | planner | piece length; if absent, derived from the largest scene end (reports say so) |
13
13
  | `safe_zone_profile` | string | `check_safe_zone.py`, `measure_density.py`, `fill_breaths.py` | planner | `organic` or `ad` (any key of `safe_zones`); overrides the config default for this piece |
14
- | `words[]` | list | `sound.py duck`, `fill_breaths.py` | `ctc-align` | spoken words |
14
+ | `words[]` | list | `sound.py duck`, `fill_breaths.py` | `wizz-ctc-align` | spoken words |
15
15
  | `scenes[]` | list | `check_excess.py`, `check_rhythm.py`, `fill_breaths.py` | planner, `fill_breaths.py` | screens |
16
16
  | `sfx[]` | list | `sound.py duck`, `fill_breaths.py` | planner, `fill_breaths.py` | point sounds |
17
17
  | `punches[]` | list | `check_excess.py`, `check_rhythm.py` | planner, `fill_breaths.py` | zoom punches |
@@ -40,7 +40,7 @@ Only `start` and `end` are required. Breaths are the gaps between words at least
40
40
  }
41
41
  ```
42
42
 
43
- - `transition`: `cut`, `whip`, `zoom` or any name the renderer knows. Anything other than `""` or `cut` counts as a `transition` event in the budget.
43
+ - `transition`: `cut`, `whip`, `zoom` or any name the renderer knows. Anything other than `""` or `cut` counts as a `transition` event in the budget. `fill_breaths.py` only fills scenes without a real transition (absent, `""` or `cut`); a transition the author declared is kept, and its `sfx` too when already set.
44
44
  - `sfx` (optional): the cut sound, played at `start`. Same shape as an `sfx[]` entry without `at`.
45
45
 
46
46
  ### `sfx[]`
@@ -199,13 +199,27 @@ def pace_profile(index: int, wps: float, cfg: Config) -> str:
199
199
  return "fast" if wps >= cfg.breaths.fast_speech_wps else "slow"
200
200
 
201
201
 
202
+ def declared_transition(scene: dict) -> bool:
203
+ """True when the author chose a real transition (anything but absent, "" or
204
+ 'cut', the same rule timeline.transitions uses). Those are kept."""
205
+ return scene.get("transition") not in (None, "", "cut")
206
+
207
+
202
208
  def scene_updates(scenes: list[dict], words: list[dict], cfg: Config) -> list[tuple[dict, float]]:
203
- """(new scene dict, words per second) with transition and cut sound by pace."""
209
+ """(new scene dict, words per second) with transition and cut sound by pace.
210
+ A transition the author declared stays, and so does a cut sound already set:
211
+ pace only fills what is missing."""
204
212
  out = []
205
213
  for i, sc in enumerate(scenes):
206
214
  start = float(sc["start"])
207
215
  wps = words_per_second(words, start, start + float(sc.get("dur", 0.0)))
208
216
  prof = cfg.breaths.pace_profiles[pace_profile(i, wps, cfg)]
217
+ if declared_transition(sc):
218
+ sfx = sc.get("sfx") or {"event": prof.sound_event,
219
+ "src": cfg.sound.src(prof.sound_event),
220
+ "vol": cfg.sound.event(prof.sound_event).vol}
221
+ out.append(({**sc, "sfx": sfx}, round(wps, 2)))
222
+ continue
209
223
  ev = cfg.sound.event(prof.sound_event)
210
224
  out.append(({**sc, "transition": prof.transition,
211
225
  "sfx": {"event": prof.sound_event, "src": cfg.sound.src(prof.sound_event),
@@ -168,6 +168,26 @@ class TestPlan(unittest.TestCase):
168
168
  self.assertTrue(out["punches"])
169
169
  self.assertTrue(all("event" in s for s in out["sfx"]))
170
170
 
171
+ def test_declared_transition_is_kept(self):
172
+ whoosh = {"event": "block_cut", "src": "sfx/mine.mp3", "vol": 0.3}
173
+ data = {**self.DATA, "scenes": [
174
+ {"start": 0.0, "dur": 10.0, "transition": "zoom", "sfx": whoosh},
175
+ {"start": 10.0, "dur": 10.0, "transition": "whip"}]}
176
+ out = FB.apply(data, FB.plan(data, CFG, [], {}))
177
+ self.assertEqual([s["transition"] for s in out["scenes"]], ["zoom", "whip"])
178
+ self.assertEqual(out["scenes"][0]["sfx"], whoosh)
179
+ self.assertIn("sfx", out["scenes"][1])
180
+
181
+ def test_default_transition_is_filled(self):
182
+ for default in ("", "cut", None):
183
+ scene = {"start": 0.0, "dur": 10.0}
184
+ if default is not None:
185
+ scene["transition"] = default
186
+ data = {**self.DATA, "scenes": [scene]}
187
+ out = FB.apply(data, FB.plan(data, CFG, [], {}))
188
+ self.assertEqual(out["scenes"][0]["transition"],
189
+ CFG.breaths.pace_profiles["first"].transition)
190
+
171
191
  def test_pace_profile(self):
172
192
  f = CFG.breaths.fast_speech_wps
173
193
  self.assertEqual(FB.pace_profile(0, 99.0, CFG), "first")
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: wizz-video-styles
3
- description: Catalogue of short vertical video styles (Reels, Shorts, TikTok) measured on real high-reach videos, for any niche. Takes an inventory of the material the project actually has (a real person on camera, voice only, b-roll, app screens, a physical product), crosses it with niche and goal, picks the style to copy and hands over its recipe - rhythm, captions, palette, typography, motion vocabulary, music and SFX rules - plus a Remotion template when one exists and a licensed audio kit. Use when a video is about to be edited or planned and nobody has decided what it should look like, when someone says a video "looks amateur" or asks to copy a creator's style, or before wizz-video-effects and Remotion take over. Triggers - estilo do vídeo, editar no estilo de, copiar a edição de, que estilo usar no reel, referência de edição, catálogo de estilos, o vídeo ficou amador. Does not decide per-event SFX or gates (that is wizz-video-effects) and does not assemble the film (that is Remotion).
3
+ description: Catalogue of short vertical video styles (Reels, Shorts, TikTok) measured on real high-reach videos, for any niche. Takes an inventory of the material the project actually has (a real person on camera, voice only, b-roll, app screens, a physical product), crosses it with niche and goal, picks the style to copy and hands over its recipe - rhythm, captions, palette, typography, motion vocabulary, music and SFX rules - plus a Remotion template when one exists and a licensed audio kit. Use when a video is about to be edited or planned and nobody has decided what it should look like, when someone says a video "looks amateur" or asks to copy a creator's style, or before wizz-video-effects and Remotion take over. Triggers - estilo do vídeo, editar no estilo de, copiar a edição de, que estilo usar no reel, referência de edição, catálogo de estilos, o vídeo ficou amador, vídeo do app mexendo, anima o app num vídeo. Does not decide per-event SFX or gates (that is wizz-video-effects) and does not assemble the film (that is Remotion).
4
4
  ---
5
5
 
6
6
  # wizz-video-styles: which style to copy, and its recipe
@@ -11,7 +11,7 @@ Every number in this skill was measured on a real public short ([references/rese
11
11
 
12
12
  1. Script exists (social area, `wizz-social-content`).
13
13
  2. **This skill:** inventory of the material, then style, then recipe.
14
- 3. Narration and word timing (the person's own recording or TTS, then `ctc-align`).
14
+ 3. Narration and word timing (the person's own recording or TTS, then `wizz-ctc-align`).
15
15
  4. Footage and screens: `get-brolls` for b-roll, HyperFrames for silent screens, real screenshots for app screens.
16
16
  5. Effects and sound per event, plus gates: `wizz-video-effects`. Pass it this style's SFX density ceiling and music level.
17
17
  6. Assembly in Remotion: invoke `wizz-remotion-best-practices`; copy the style's template from `assets/remotion/` when it has one.
@@ -20,6 +20,8 @@ It can also run at step 1, so the script is written for the style (room for b-ro
20
20
 
21
21
  ## Per piece
22
22
 
23
+ Scripts live in this skill's `scripts/`; run them from the project root (the history file is written in the current directory, or in `--project <dir>`).
24
+
23
25
  1. **Inventory first, always.** Ask or read from the plan, one line each:
24
26
  - Is a real person on camera? Which shots exist (face to camera, podcast, stage, street, hands only)?
25
27
  - Voice: the person's own recording, a podcast/interview track, TTS, or none?
@@ -27,16 +29,17 @@ It can also run at step 1, so the script is written for the style (room for b-ro
27
29
  - B-roll or stock, a physical product, food, a place?
28
30
  - Niche, goal of the piece (follow, comment, save, click), duration.
29
31
  Never pick a style the material cannot feed. "Talking head" needs a person on camera; "motion editorial" needs nothing but a voice; "macro / ASMR" needs a physical product filmed close.
30
- 2. **Pick the style** with [references/style-picker.md](references/style-picker.md): material decides which styles are possible, niche and goal rank them. Mixed is allowed and common: person on camera for the hook and the CTA, another style in the middle.
32
+ 2. **Pick the style** with [references/style-picker.md](references/style-picker.md): material decides which styles are possible, niche and goal rank them. Mixed is allowed and common: person on camera for the hook and the CTA, another style in the middle. Before deciding, run `node scripts/references.mjs history` in the project: if the last two pieces used the same style, do not pick it a third time unless the user wants a series; choose another style the material allows, or keep it only for the hook and CTA.
31
33
  3. **Open the style card** in `references/styles/` and follow it: rhythm, captions, palette, typography, motion, music, SFX, hook, CTA, and its "do not" list.
32
- 4. **Watch two of its references** (links in the card) before editing. Reading a card is not watching a video.
34
+ 4. **Get fresh references and watch two** before editing: `node scripts/references.mjs pick --style <key>` returns measured references plus, for styles generated in code, current viral videos from the awesome-opus5-5-videos list, skipping everything this project already used. Reading a card is not watching a video. For how those generated videos were briefed, see [references/generated-prompts.md](references/generated-prompts.md).
33
35
  5. **Audio:** music and SFX choices from [references/audio.md](references/audio.md); the redistributable kit is in `assets/audio/` (credits in `assets/audio/CREDITS.md`).
34
36
  6. **Hand over** to `wizz-video-effects` with the card's SFX ceiling and music level, then to Remotion.
35
37
  7. **Look at the final file**: extract frames and compare them side by side with a contact sheet of one reference.
38
+ 8. **Record the piece**: `node scripts/references.mjs record --style <key> --piece <slug> --refs <ids watched>`. It writes `_wizz-output/video-styles/historico.json`, which is what keeps the next piece from repeating the same references and look.
36
39
 
37
40
  ## What the measurements say across every style
38
41
 
39
- - **SFX are rare.** Across 99 measured shorts, sound effects landed on a cut in a small minority of cuts (per-style counts in each card). Putting a sound on every cut is the most common amateur tell.
42
+ - **SFX are rare.** Across 104 measured shorts, sound effects landed on a cut in a small minority of cuts (per-style counts in each card). Putting a sound on every cut is the most common amateur tell.
40
43
  - **Music bed: style-dependent.** Fast montage, animated explainers and travel POV carry a continuous bed; talking heads and podcast clips mostly have none or a faint one.
41
44
  - **Captions** in reach-heavy styles are 1 to 3 words at a time, bold, lower-centre, with one keyword in an accent colour; editorial and explainer styles keep them small or drop them.
42
45
  - **Rhythm is a style property, not a virtue.** The highest-reach videos in the set range from single takes with no detected cut to a cut every second.
@@ -53,7 +56,10 @@ Details and the per-style table: [references/measured-patterns.md](references/me
53
56
  | [references/audio.md](references/audio.md) | music and SFX per style, the kit, libraries and licences |
54
57
  | [references/research-method.md](references/research-method.md) | how the catalogue was measured, its limits, how to add a niche or a style |
55
58
  | `data/references.json` | every measured short: link, channel, views, niche, style, metrics |
59
+ | [references/generated-prompts.md](references/generated-prompts.md) | prompts of viral code-generated videos, grouped by style, and how they run here |
56
60
  | `scripts/analyze.sh` | measures one short (cuts, music bed, SFX heuristics, loudness, contact sheet) |
61
+ | `scripts/references.mjs` | fresh references per style without repeats, and the project's history of styles used |
62
+ | `scripts/beat_grid.py` | BPM, beats and downbeats of a song, so cuts snap to the music (lyric video, kinetic typography) |
57
63
  | `assets/remotion/editorial/` | Remotion template of the motion editorial style |
58
64
  | `assets/audio/` | licensed music beds and SFX that may ship with a project |
59
65
 
@@ -7,7 +7,8 @@
7
7
  "e": "health / fitness / nutrition",
8
8
  "f": "food / recipes / lifestyle / travel",
9
9
  "g": "beauty / fashion / local services (clinic, salon, architecture, real estate)",
10
- "h": "education / science / comedy"
10
+ "h": "education / science / comedy",
11
+ "i": "music / artists / lyric videos"
11
12
  },
12
13
  "styles": {
13
14
  "motion-editorial": {
@@ -336,6 +337,68 @@
336
337
  "dont": [
337
338
  "Setup longer than 3 s before the first joke."
338
339
  ]
340
+ },
341
+ "tipografia-cinetica": {
342
+ "title": "Kinetic typography and lyric video (mexicat P(doom), PixelValet, Ninh Truong)",
343
+ "needs": "An audio track with words: a song with its lyrics, or a voice-over with its script. Nobody on camera, no footage. Everything is generated (HyperFrames, three.js, canvas). Word timing from ctc-align; a beat grid when there is music.",
344
+ "fits": "Music releases and lyric videos, manifestos, a strong opinion read aloud, brand promos built on a slogan, poetry. Shares and rewatches; weak for teaching step by step.",
345
+ "look": [
346
+ "The words ARE the image: one keyword huge in the frame, the rest of the line small. No caption strip at the bottom.",
347
+ "Plain background (black, or a flat colour that changes per section) or one generated world the camera travels through (a map, a grid in perspective, a 3D object the line wraps around).",
348
+ "Each word is animated by what it means: PAIN breaks, CHEERFUL bounces, LIGHT lights up, a word curves around the object it names.",
349
+ "Code-rendered pieces add film treatment: bloom, halation, grain, a thin HUD in mono."
350
+ ],
351
+ "palette": "Dark base (#0A0A0A or a deep teal #0F3B3A) plus ONE glowing accent (orange #FF6A1A in P(doom), coral in Maps) and off-white text. Flat-colour variant: one saturated background per word or section, text in white or ink.",
352
+ "type": "Two or three families with high contrast: a heavy grotesk or condensed caps for the keyword (Archivo Black, Bebas Neue), a mono for small lines and HUD (IBM Plex Mono), optionally a serif italic for a soft word (Cormorant Garamond). Mix weights inside the same line.",
353
+ "motion": [
354
+ "Words enter on the syllable they are sung or spoken (forced alignment, never guessed); the keyword lands on the beat.",
355
+ "Scene changes snap to the downbeat. P(doom) changes every ~0.3 s at peaks; the calm variant is a single continuous camera move for a whole verse.",
356
+ "The camera moves through the type (push, orbit, travel across a map) instead of the text sliding over a still frame.",
357
+ "Hold the last word of a line a beat longer before it leaves."
358
+ ],
359
+ "captions": "None separate: the type is the caption. Keep the full line readable somewhere (small, mono, corner) when the keyword alone would lose the sense.",
360
+ "hook": "The first sung or spoken word, huge, in the accent colour, landing on the first downbeat (0 to 1 s). No logo intro.",
361
+ "cta": "The title or slogan locked up big and still for 1 to 2 s, the accent lit; one small line (artist, handle, link) under it.",
362
+ "music": "The track itself is the whole soundtrack. Lyric videos: song at full level, no extra bed. Voice-over promos: a beat-driven bed under the voice.",
363
+ "sfx": "Song-driven pieces: almost none (5 of 56 cuts in P(doom), 0 of 2 in Maps). Promo variant: hits on every word change (9/13 and 16/20 cuts), which the heuristic partly confuses with the kick. Never add whooshes over a song.",
364
+ "dont": [
365
+ "Karaoke subtitles at the bottom over a static background: that is a lyric 'overlay', not this style.",
366
+ "Guessing word timing by ear; align it (ctc-align) and snap scenes to the beat grid.",
367
+ "More than one accent colour, or a different font for every word.",
368
+ "Shipping 16:9: every measured reference is horizontal; recompose for 9:16 with the keyword in the upper-middle and nothing in the bottom 20%."
369
+ ],
370
+ "template": null
371
+ },
372
+ "ui-morph": {
373
+ "title": "UI morph: one shape, many UI states (twoclipping, verbove, AnnaCher)",
374
+ "needs": "The product's real screens or a list of 8 to 12 UI states that tell its story (button, loader, player, slider, toggle, tabs, chart, ⌘K, toast), one accent colour and a track around 120 BPM. Nobody on camera, no footage: everything is drawn in code (HyperFrames).",
375
+ "fits": "App and SaaS launches, a feature announcement, a product promo for the site or the store page, a portfolio piece. Strong on X and LinkedIn with a product audience; it shows the product working instead of describing it. Weak for teaching step by step or for anything that needs a face.",
376
+ "look": [
377
+ "One shape on screen the whole time, never cut: it becomes button, loader, player, slider, toggle, tabs, chart, ⌘K and toast, changing size, corners and colour (the same language as the iPhone Dynamic Island).",
378
+ "Warm light grey canvas (#EDEBE6), components in black and white, at most one accent colour; a dark variant (navy with one yellow) for a product film.",
379
+ "Real UI and real data: the product's own labels and numbers, never lorem ipsum or generic components.",
380
+ "A cursor drives every change with real clicks and drags; the camera zooms so each state fills the frame."
381
+ ],
382
+ "palette": "Warm grey #EDEBE6 or beige #E6E2DA, black #111, white, plus ONE accent (orange, peach or yellow) used only where the eye must go. Dark variant: #0B1020 base, one yellow accent.",
383
+ "type": "One UI sans (Inter, Geist or the product's own font) in regular and semibold; mono only for a URL or a code line. No display fonts.",
384
+ "motion": [
385
+ "Every state grows out of the previous one by a spring (size, corner radius, colour), with at most one small overshoot; content swaps with a short blur.",
386
+ "Something happens on every beat; the state changes land on the downbeats of the beat grid (scripts/beat_grid.py), not on a hand-counted 120 BPM.",
387
+ "Build it as a pure function of time (seek(t)): closed-form springs, no CSS transitions or timers, so every frame renders the same. HyperFrames does this natively.",
388
+ "The last frame equals the first, so the piece loops."
389
+ ],
390
+ "captions": "None. The text is the interface's own (button labels, track title, chart numbers). A single short line at most, in the UI font, when the product needs one sentence.",
391
+ "hook": "The first state already on screen at 0 s (a button or the brand pill) and the cursor arriving on the first beat. No logo intro, no title card.",
392
+ "cta": "The shape returns to the first state or closes on the brand pill with the URL in small mono under it, held 1 to 2 s.",
393
+ "music": "The track is the whole soundtrack: a continuous bed in 4 of 6 measured pieces, around -14 LUFS. Pick an electronic or lo-fi track with a clear kick so the beat grid is reliable.",
394
+ "sfx": "Sparse and tied to UI events: a soft click on a press, a low tick on a snap. The measured pieces range from none to a hit on most state changes; never whooshes on every move.",
395
+ "dont": [
396
+ "Cutting between screens: the moment it cuts it becomes a screen recording, not this style.",
397
+ "Bouncy easing, particles, glow, gradients on the UI chrome, icons with uneven stroke, dead time, template look.",
398
+ "Generic components instead of the product's real UI and numbers.",
399
+ "Shipping square or 16:9: every measured piece is 1:1 or 16:9; recompose for 9:16 with the shape in the upper-middle and nothing in the bottom 20 %."
400
+ ],
401
+ "template": null
339
402
  }
340
403
  }
341
- }
404
+ }