wizz-method 2.21.0 → 2.23.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.
- package/THIRD-PARTY-NOTICES.md +24 -0
- package/package.json +4 -2
- package/removals.txt +3 -0
- package/skills-registry.yaml +133 -4
- package/src/bmm-skills/1-analysis/research/wizz-market-research/steps/step-06-research-completion.md +27 -0
- package/src/bmm-skills/1-analysis/wizz-set-feature/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-code-review/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-create-story/SKILL.md +1 -1
- package/src/bmm-skills/4-implementation/wizz-dev-story/SKILL.md +8 -1
- package/src/bmm-skills/4-implementation/wizz-quick-dev/SKILL.md +2 -2
- package/src/bmm-skills/4-implementation/wizz-quick-dev/step-03-implement.md +2 -0
- package/src/bmm-skills/4-implementation/wizz-sprint-status/SKILL.md +1 -1
- package/src/core-skills/wizz-party-mode/customize.toml +3 -3
- package/src/modules/lowticket/README.md +2 -1
- package/src/modules/lowticket/module.yaml +1 -1
- package/src/modules/lowticket/skills/wizz-clone-do-expert/SKILL.md +86 -0
- package/src/modules/lowticket/skills/wizz-clone-do-expert/references/clone-prompt-template.md +21 -0
- package/src/modules/lowticket/skills/wizz-lowticket-trafego/references/reguas.md +2 -0
- package/src/modules/wizz/_shared/cerebro.md +1 -1
- package/src/modules/wizz/_shared/organizacao.md +2 -2
- package/src/modules/wizz/_shared/video-pipeline.md +2 -0
- package/src/modules/wizz/agents/wizz-copy/SKILL.md +1 -0
- package/src/modules/wizz/agents/wizz-copy/customize.toml +5 -0
- package/src/modules/wizz/agents/wizz-copy/knowledge/playbook.md +3 -2
- package/src/modules/wizz/agents/wizz-growth/customize.toml +7 -2
- package/src/modules/wizz/agents/wizz-growth/knowledge/playbook.md +3 -2
- package/src/modules/wizz/agents/wizz-social/knowledge/blueprint-roteiro-viral.md +14 -0
- package/src/modules/wizz/agents/wizz-social/knowledge/legenda-instagram.md +12 -0
- package/src/skills-lib/wizz-cerebro/SKILL.md +18 -5
- package/src/skills-lib/wizz-design-needs/SKILL.md +7 -0
- package/src/skills-lib/wizz-design-needs/references/design-state.md +34 -2
- package/src/skills-lib/wizz-design-needs/references/gap-analysis.md +1 -1
- package/src/skills-lib/wizz-design-needs/scripts/design_state.py +305 -0
- package/src/skills-lib/wizz-design-needs/scripts/tests/test_design_state.py +143 -0
- package/src/skills-lib/wizz-impeccable/references/design-rules.md +18 -0
- package/src/skills-lib/wizz-ios-build/SKILL.md +61 -0
- package/src/skills-lib/wizz-motion-3d-director/references/motion-paths.md +2 -0
- package/src/skills-lib/wizz-offer-forge/SKILL.md +2 -2
- package/src/skills-lib/wizz-paid-ads/SKILL.md +2 -1
- package/src/skills-lib/wizz-paywall-upgrade-cro/SKILL.md +1 -0
- package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/README.md +13 -13
- package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/SKILL.md +11 -7
- package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/assets/template.html +8 -21
- package/src/skills-lib/wizz-pesquisa-de-publico/references/interview-mode.md +69 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/SKILL.md +6 -2
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/audit-protocol.md +7 -34
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/component-sources.md +25 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/design-sources.yaml +325 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/mandatory-process.md +1 -1
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/mining-rubric.md +123 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/source-first-protocol.md +10 -4
- package/src/skills-lib/wizz-premium-landing-ui-researcher/references/web-access-and-evidence.md +1 -1
- package/src/skills-lib/wizz-premium-landing-ui-researcher/scripts/design_sources.py +221 -0
- package/src/skills-lib/wizz-premium-landing-ui-researcher/scripts/tests/test_design_sources.py +130 -0
- package/src/skills-lib/wizz-router/references/routing-table-flat.md +7 -1
- package/src/skills-lib/wizz-seo-audit/SKILL.md +4 -0
- package/src/skills-lib/wizz-seo-audit/references/gsc-regex-perguntas.md +64 -0
- package/src/skills-lib/wizz-signup-flow-cro/SKILL.md +1 -0
- package/src/skills-lib/wizz-signup-flow-cro/references/trial-abuse.md +40 -0
- package/src/skills-lib/wizz-taste-skill/references/anti-slop-tells.md +8 -0
- package/src/skills-lib/wizz-ui-component-curator/SKILL.md +8 -7
- package/src/skills-lib/wizz-ui-ux-pro-max/SKILL.md +1 -1
- package/src/skills-lib/wizz-ui-ux-pro-max/references/common-rules-checklist.md +11 -0
- package/src/skills-lib/wizz-video-effects/LICENSE-motionmaxxing.txt +202 -0
- package/src/skills-lib/wizz-video-effects/SKILL.md +7 -2
- package/src/skills-lib/wizz-video-effects/assets/chrome/collect_layout.js +113 -0
- package/src/skills-lib/wizz-video-effects/assets/effects.config.template.json +45 -0
- package/src/skills-lib/wizz-video-effects/references/data-contract.md +32 -1
- package/src/skills-lib/wizz-video-effects/references/gates.md +4 -1
- package/src/skills-lib/wizz-video-effects/references/one-take.md +41 -0
- package/src/skills-lib/wizz-video-effects/scripts/check_chrome.py +376 -0
- package/src/skills-lib/wizz-video-effects/scripts/check_dead_frames.py +193 -0
- package/src/skills-lib/wizz-video-effects/scripts/check_one_take.py +159 -0
- package/src/skills-lib/wizz-video-effects/scripts/config.py +13 -0
- package/src/skills-lib/wizz-video-effects/scripts/test_chrome.py +181 -0
- package/src/skills-lib/wizz-video-effects/scripts/test_dead_frames.py +171 -0
- package/src/skills-lib/wizz-video-effects/scripts/test_one_take.py +126 -0
- package/src/skills-lib/wizz-video-styles/LICENSE-lemo-opuscar.txt +21 -0
- package/src/skills-lib/wizz-video-styles/SKILL.md +16 -7
- package/src/skills-lib/wizz-video-styles/assets/film-styles/dark-keynote.html +78 -0
- package/src/skills-lib/wizz-video-styles/assets/film-styles/remotion/Riso.tsx +63 -0
- package/src/skills-lib/wizz-video-styles/assets/film-styles/risograph.html +69 -0
- package/src/skills-lib/wizz-video-styles/assets/film-styles/swiss-motion.html +84 -0
- package/src/skills-lib/wizz-video-styles/references/check-ins.md +25 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/DIRECTOR.md +139 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/archive-lighttable.md +109 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/art-deco.md +112 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/ascii-crt.md +115 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/backrooms.md +125 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/blueprint.md +120 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/brick-toy.md +114 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/briefing-board.md +122 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/caption-news.md +137 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/cel-anime-80s.md +119 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/city-symphony.md +142 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/countdown.md +132 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/crayon-book.md +109 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/dark-keynote.md +117 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/data-physical.md +119 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/dataviz.md +123 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/engraving.md +123 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/game-show.md +118 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/glass-product.md +110 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/halftone-dossier.md +122 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/hd-2d.md +111 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/hologram-hud.md +129 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/impasto.md +124 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/ink-wash.md +120 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/iso-infographic.md +117 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/kino-montage.md +151 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/lidar-survey.md +118 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/living-screencast.md +124 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/lowpoly-island.md +112 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/microgame.md +122 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/microscope.md +108 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/midcentury-toon.md +124 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/news-package.md +158 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/newsreel.md +136 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/one-line.md +114 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/paper-lantern.md +116 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/paper-popup.md +119 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/papercut-red.md +110 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/pictogram-motion.md +119 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/pixel-rpg.md +117 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/risograph.md +125 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/rubber-hose.md +112 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/satellite-briefing.md +116 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/scifi-toon.md +121 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/shadow-puppet.md +124 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/silent-film.md +109 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/silkscreen-poster.md +140 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/spy-titles.md +116 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/stained-glass.md +123 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/swiss-motion.md +115 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/teardown.md +127 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/telestrator.md +137 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/tilt-shift.md +107 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/ukiyoe.md +112 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/urban-sketch.md +126 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/visual-investigation.md +140 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/watercolor.md +113 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/white-model.md +115 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/whiteboard.md +118 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles/woodcut.md +122 -0
- package/src/skills-lib/wizz-video-styles/references/film-styles.md +140 -0
- package/src/skills-lib/wizz-video-styles/references/insert-recipes.md +33 -0
- package/src/skills-lib/wizz-video-styles/references/motion-laws.md +62 -0
- package/src/skills-lib/wizz-video-styles/references/styles/desafio-numero.md +1 -0
- package/src/skills-lib/wizz-video-styles/scripts/beat_grid.py +38 -6
- package/src/skills-lib/wizz-video-styles/scripts/blind_review.py +159 -0
- package/src/skills-lib/wizz-video-styles/scripts/taste.mjs +110 -0
- package/src/skills-lib/wizz-video-styles/scripts/test_blind_review.py +82 -0
- package/src/skills-lib/wizz-vsl/LICENSE +49 -0
- package/src/skills-lib/wizz-vsl/SKILL.md +122 -0
- package/src/skills-lib/wizz-vsl/references/assembly-qa.md +123 -0
- package/src/skills-lib/wizz-vsl/references/blocks-and-leads.md +149 -0
- package/src/skills-lib/wizz-vsl/references/diagnosis.md +95 -0
- package/src/skills-lib/wizz-vsl/references/intake.md +200 -0
- package/src/skills-lib/wizz-vsl/references/mechanisms.md +138 -0
- package/src/skills-lib/wizz-vsl/references/niches.md +40 -0
- package/src/skills-lib/wizz-vsl/references/offer.md +91 -0
- package/src/skills-lib/wizz-vsl/references/production.md +75 -0
- package/src/skills-lib/wizz-web-security/SKILL.md +2 -0
- package/tools/hooks/README.md +10 -9
- package/tools/hooks/wizz-arrumar.js +1 -0
- package/tools/hooks/wizz-artifact-guard.js +31 -5
- package/tools/hooks/wizz-cerebro-lib.js +36 -13
- package/tools/hooks/wizz-feature-lib.js +4 -1
- package/tools/hooks/wizz-feature.js +66 -76
- package/tools/hooks/wizz-sprint-archive-lib.js +311 -0
- package/tools/installer/core/hooks-settings.js +1 -0
- package/tools/installer/core/installer.js +6 -0
- package/tools/installer/guided/labels.js +16 -0
- package/tools/installer/install-text.js +2 -0
- package/tools/installer/modules/cli-config.js +3 -0
- package/tools/installer/modules/core-seed.js +72 -0
- package/tools/installer/modules/mcp-config.js +3 -0
- package/tools/installer/ui.js +22 -26
- /package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/prompts.md +0 -0
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
# /// script
|
|
2
|
+
# requires-python = ">=3.10"
|
|
3
|
+
# dependencies = ["pytest>=8.0", "ruamel.yaml>=0.18"]
|
|
4
|
+
# ///
|
|
5
|
+
"""Tests for design_state.py: rubric validation and the implementation gate."""
|
|
6
|
+
|
|
7
|
+
import copy
|
|
8
|
+
import importlib.util
|
|
9
|
+
import json
|
|
10
|
+
|
|
11
|
+
import pytest
|
|
12
|
+
from pathlib import Path
|
|
13
|
+
|
|
14
|
+
SCRIPT = Path(__file__).resolve().parents[1] / "design_state.py"
|
|
15
|
+
spec = importlib.util.spec_from_file_location("design_state", SCRIPT)
|
|
16
|
+
mod = importlib.util.module_from_spec(spec)
|
|
17
|
+
spec.loader.exec_module(mod)
|
|
18
|
+
|
|
19
|
+
RUBRIC = mod.load_rubric()
|
|
20
|
+
CEILING = mod.load_ceiling()
|
|
21
|
+
|
|
22
|
+
ADAPTATION = {
|
|
23
|
+
"padrao": "o título é revelado por uma máscara que sobe com o scroll",
|
|
24
|
+
"por_que": "segura o olho no título",
|
|
25
|
+
"invariante": "a máscara anda mais rápido que o scroll",
|
|
26
|
+
"variavel": ["easing", "duração"],
|
|
27
|
+
"reimplementacao": "tokens do projeto",
|
|
28
|
+
}
|
|
29
|
+
|
|
30
|
+
BASE = {
|
|
31
|
+
"version": 1,
|
|
32
|
+
"nivel": 1,
|
|
33
|
+
"needs": [
|
|
34
|
+
{"id": "b1", "surface": "home", "section": "hero", "layer": "comportamento", "why": "brief editorial", "floor": 7,
|
|
35
|
+
"status": "selected", "satisfied_by": ["d1"]},
|
|
36
|
+
{"id": "s1", "surface": "home", "section": "projetos", "layer": "secao", "why": "portfólio", "floor": 6,
|
|
37
|
+
"status": "open"},
|
|
38
|
+
{"id": "s2", "surface": "home", "section": "contato", "layer": "secao", "why": "captar contato",
|
|
39
|
+
"status": "unmet", "reason": "2 fontes secas"},
|
|
40
|
+
],
|
|
41
|
+
"discoveries": [
|
|
42
|
+
{"id": "d1", "need": "b1", "surface": "home", "layer": "comportamento", "evidence": "verified",
|
|
43
|
+
"pattern_key": "scroll-mask-reveal", "observed": ["420ms"], "disqualifiers": [],
|
|
44
|
+
"scores": {"aderencia": 3, "execucao": 2, "custo_adaptacao": 2, "custo_performance": 1, "originalidade": 1, "total": 9},
|
|
45
|
+
"verdict": "ASSINATURA", "adaptation": ADAPTATION, "status": "selected"},
|
|
46
|
+
{"id": "d2", "need": "b1", "surface": "home", "layer": "comportamento", "evidence": "verified",
|
|
47
|
+
"pattern_key": "fade-up", "observed": ["fade"], "disqualifiers": ["reduced_motion"],
|
|
48
|
+
"verdict": "DESCARTAR", "status": "rejected", "reason": "ignora reduced motion"},
|
|
49
|
+
],
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
|
|
53
|
+
def state(**changes):
|
|
54
|
+
data = copy.deepcopy(BASE)
|
|
55
|
+
for key, value in changes.items():
|
|
56
|
+
data[key] = value
|
|
57
|
+
return data
|
|
58
|
+
|
|
59
|
+
|
|
60
|
+
def codes(data):
|
|
61
|
+
return {item["code"] for item in mod.validate(data, RUBRIC, CEILING)}
|
|
62
|
+
|
|
63
|
+
|
|
64
|
+
def test_rubric_and_ceiling_are_read_from_the_skill_files():
|
|
65
|
+
assert RUBRIC["cut"] == 6 and "licenca" in RUBRIC["disqualifiers"]
|
|
66
|
+
assert CEILING[1] == 1 and CEILING[5] == 8
|
|
67
|
+
|
|
68
|
+
|
|
69
|
+
def test_consistent_state_has_no_findings():
|
|
70
|
+
assert mod.validate(state(), RUBRIC, CEILING) == []
|
|
71
|
+
|
|
72
|
+
|
|
73
|
+
def test_verdict_must_match_the_band():
|
|
74
|
+
data = state()
|
|
75
|
+
data["discoveries"][0]["verdict"] = "FORTE"
|
|
76
|
+
assert "verdict_band" in codes(data)
|
|
77
|
+
data["discoveries"][0]["reason"] = RUBRIC["signature_cap_reason"]
|
|
78
|
+
assert "verdict_band" not in codes(data)
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
def test_entry_condition_forces_descartar_and_blocks_selection():
|
|
82
|
+
data = state()
|
|
83
|
+
data["discoveries"][1]["verdict"] = "UTILITARIO"
|
|
84
|
+
data["discoveries"][1]["status"] = "selected"
|
|
85
|
+
found = codes(data)
|
|
86
|
+
assert {"verdict_band", "selected_discarded"} <= found
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
def test_selected_below_the_need_floor_and_without_adaptation():
|
|
90
|
+
data = state()
|
|
91
|
+
disc = data["discoveries"][0]
|
|
92
|
+
disc["scores"] = {"aderencia": 2, "execucao": 1, "custo_adaptacao": 2, "custo_performance": 1, "originalidade": 0}
|
|
93
|
+
disc["verdict"] = "UTILITARIO"
|
|
94
|
+
disc["adaptation"] = {"padrao": "x"}
|
|
95
|
+
assert {"selected_below_floor", "adaptation_missing"} <= codes(data)
|
|
96
|
+
|
|
97
|
+
|
|
98
|
+
def test_two_signatures_on_one_surface_and_behaviour_ceiling():
|
|
99
|
+
data = state()
|
|
100
|
+
second = copy.deepcopy(data["discoveries"][0])
|
|
101
|
+
second.update(id="d3", pattern_key="cursor")
|
|
102
|
+
data["discoveries"].append(second)
|
|
103
|
+
assert {"signature_cap", "behaviour_ceiling"} <= codes(data)
|
|
104
|
+
|
|
105
|
+
|
|
106
|
+
def test_reasons_and_dedup_links():
|
|
107
|
+
data = state()
|
|
108
|
+
data["needs"][2]["reason"] = None
|
|
109
|
+
data["discoveries"][1]["reason"] = None
|
|
110
|
+
data["discoveries"].append({"id": "d4", "need": "b1", "evidence": "verified", "observed": ["x"],
|
|
111
|
+
"pattern_key": "other", "dup_of": "d1", "status": "rejected", "reason": "dup"})
|
|
112
|
+
assert {"need_reason", "discovery_reason", "dup_of"} <= codes(data)
|
|
113
|
+
|
|
114
|
+
|
|
115
|
+
def test_gate_passes_selected_and_blocks_open_and_unplanned():
|
|
116
|
+
blocked, results = mod.gate(state(), ["home/hero"], [])
|
|
117
|
+
assert not blocked and results[0]["discoveries"] == ["d1"]
|
|
118
|
+
blocked, results = mod.gate(state(), ["home/projetos"], [])
|
|
119
|
+
assert blocked and results[0]["result"] == "blocked"
|
|
120
|
+
blocked, results = mod.gate(state(), ["home/rodape"], [])
|
|
121
|
+
assert blocked and results[0]["result"] == "unplanned"
|
|
122
|
+
|
|
123
|
+
|
|
124
|
+
def test_gate_lets_unmet_through_with_the_justification():
|
|
125
|
+
blocked, results = mod.gate(state(), [], ["s2"])
|
|
126
|
+
assert not blocked and "from scratch" in results[0]["action"]
|
|
127
|
+
|
|
128
|
+
|
|
129
|
+
def test_cli_exit_codes(tmp_path, capsys):
|
|
130
|
+
from ruamel.yaml import YAML
|
|
131
|
+
|
|
132
|
+
path = tmp_path / "design-state.yaml"
|
|
133
|
+
with open(path, "w", encoding="utf-8") as handle:
|
|
134
|
+
YAML().dump(state(), handle)
|
|
135
|
+
with pytest.raises(SystemExit) as ok:
|
|
136
|
+
mod.main(["validate", str(path)])
|
|
137
|
+
assert ok.value.code == 0 and json.loads(capsys.readouterr().out)["ok"] is True
|
|
138
|
+
with pytest.raises(SystemExit) as blocked:
|
|
139
|
+
mod.main(["gate", str(path), "--section", "home/projetos"])
|
|
140
|
+
assert blocked.value.code == 1 and json.loads(capsys.readouterr().out)["gate"] == "blocked"
|
|
141
|
+
with pytest.raises(SystemExit) as missing:
|
|
142
|
+
mod.main(["validate", str(tmp_path / "nope.yaml")])
|
|
143
|
+
assert missing.value.code == 2
|
|
@@ -48,6 +48,24 @@ One hard typographic ceiling you currently miss:
|
|
|
48
48
|
**Gemini-specific defect: hard ban.** Never animate `<img>` elements on hover. This includes any `transform` on `:hover` of an image, AND `.group:hover .group-hover\:scale` / `.group:hover .group-hover\:rotate` / `.group:hover .group-hover\:translate` patterns from Tailwind that animate a child image via a parent hover. This is your single most common motion tell; it adds no information (the image isn't an action target) and reads as "AI animated this because it could". If a card needs hover feedback, animate the card's background, border, or shadow. Never the image, never via the image's parent. <!-- rule:skill-interaction-gemini-no-image-hover -->
|
|
49
49
|
</gemini>
|
|
50
50
|
|
|
51
|
+
#### Landing fine-tuning (Wizz addition, moved here from the landing Audit Protocol)
|
|
52
|
+
|
|
53
|
+
Run with real tokens, real typography and real images; these only show once the page is alive.
|
|
54
|
+
|
|
55
|
+
- **Spacing scale.** Section padding and margins follow one scale (4/8/12/16/24/32/48/64/96/128), not 24 here and 28 there.
|
|
56
|
+
- **Heading hierarchy.** H1, H2 and H3 do not compete: each step has clear size or weight contrast.
|
|
57
|
+
- **Leading.** Body `line-height` ≥ 1.5; display headlines ≤ 1.15.
|
|
58
|
+
- **Small uppercase tracking.** Mono and small-caps labels need more tracking (~0.18em).
|
|
59
|
+
- **Optical alignment.** Icons match the visual weight of adjacent text; mono numbers line up on a shared baseline.
|
|
60
|
+
- **Vertical rhythm.** No run of sections without air, no unexplained huge gap.
|
|
61
|
+
- **Colour hierarchy.** Five or more greys for text need a reason; the accent goes only on what is actionable.
|
|
62
|
+
- **Image cropping.** Thumbnails in one grid share an aspect ratio.
|
|
63
|
+
- **Weight contrast.** Heavy headings need a light or regular body to read against.
|
|
64
|
+
- **Content edge cases.** Check a 1-word and a 4-word project name, a 2-line and a 4-line description.
|
|
65
|
+
- **Tab order.** Focus follows the editorial sequence of the page, not a jump between sections.
|
|
66
|
+
|
|
67
|
+
Output of this check: up to 7 adjustments, each as a specific before/after (e.g. "Hero subhead: leading 1.1 → 1.3").
|
|
68
|
+
|
|
51
69
|
### New projects only (when no prior work exists)
|
|
52
70
|
|
|
53
71
|
#### Color & Theme
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: wizz-ios-build
|
|
3
|
+
description: Build, sign and install an iOS app on a real iPhone from the command line with xtool (SwiftPM project, no Xcode IDE), on macOS, Linux or Windows via WSL. Covers setup and Apple login, creating the project, xtool.yml (bundle ID, Info.plist, icon, resources, entitlements, extensions) and the build-install loop on the device. Use when the user wants to build or install an iOS app without opening Xcode, or to develop for iPhone from Linux or Windows. Not for reviewing native UI against the Apple HIG (apple-design) or for shipping to TestFlight or the App Store.
|
|
4
|
+
---
|
|
5
|
+
|
|
6
|
+
# iOS build with xtool
|
|
7
|
+
|
|
8
|
+
xtool ([xtool-org/xtool](https://github.com/xtool-org/xtool), MIT) builds a SwiftPM package into an `.app`, signs it with your Apple ID and installs it on a connected device. It replaces the Xcode build system, not the iOS SDK: on macOS Xcode still has to be installed for the SDK. The CLI is the registry entry `xtool` (dev area, opt-in).
|
|
9
|
+
|
|
10
|
+
## 1. Check before anything
|
|
11
|
+
|
|
12
|
+
Run `command -v xtool`. If it is missing, show the `install:` of the `xtool` entry and wait for the user. Then check the platform prerequisites:
|
|
13
|
+
|
|
14
|
+
| Platform | Needs | Check |
|
|
15
|
+
|---|---|---|
|
|
16
|
+
| macOS | Xcode installed and opened once (SDK + toolchain) | `xcrun -sdk iphoneos --show-sdk-path` and `swift --version` |
|
|
17
|
+
| Linux | Swift 6.4 toolchain, `usbmuxd`, the `Xcode.xip` downloaded from developer.apple.com in the browser (needs login), then `xtool sdk` | `swift --version`, `usbmuxd --help` |
|
|
18
|
+
| Windows | everything from Linux inside WSL, plus USB passthrough (usbipd) to reach the iPhone | as Linux, from WSL |
|
|
19
|
+
|
|
20
|
+
## 2. One-time setup
|
|
21
|
+
|
|
22
|
+
`xtool setup` asks for the login mode. Explain the choice before the user picks:
|
|
23
|
+
|
|
24
|
+
- **API Key**: needs a paid Apple Developer Program membership; uses the public App Store Connect API (a Team Key with the App Manager role). Recommended when they have the membership.
|
|
25
|
+
- **Password**: any Apple ID, but goes through private Apple APIs. Suggest a throwaway Apple ID.
|
|
26
|
+
|
|
27
|
+
Credentials are typed by the user in their terminal. Never ask them to paste a password or key into the chat, and never write one into a file of the project.
|
|
28
|
+
|
|
29
|
+
## 3. Project
|
|
30
|
+
|
|
31
|
+
- New app: `xtool new <Name>` creates a SwiftPM package with `xtool.yml` (bundle ID, default `com.example.<Name>`) and `.bsp/xtool.json` (editor support through SourceKit-LSP).
|
|
32
|
+
- Existing SwiftPM code: add an `xtool.yml` with at least `version: 1` and `bundleID:`.
|
|
33
|
+
|
|
34
|
+
Everything about the bundle lives in `xtool.yml`:
|
|
35
|
+
|
|
36
|
+
| Key | What it does |
|
|
37
|
+
|---|---|
|
|
38
|
+
| `bundleID` | the app's ID; on device xtool prefixes it (e.g. `XTL-1234.`) so two free accounts don't collide |
|
|
39
|
+
| `infoPath` | a partial `Info.plist` with only the keys to add or replace (display name, orientations) |
|
|
40
|
+
| `iconPath` | PNG, ideally 1024x1024 |
|
|
41
|
+
| `resources` | files copied to the root of the `.app` (e.g. `GoogleServices-Info.plist`); images used in code go in SwiftPM `resources:` instead |
|
|
42
|
+
| `entitlementsPath` | an `.entitlements` plist |
|
|
43
|
+
| `product` + `extensions` | which product is the app and which are extensions (widget, share), each with its own `infoPath` |
|
|
44
|
+
|
|
45
|
+
A mistyped key is ignored without an error (e.g. `entitlements` instead of `entitlementsPath`): after a build, open `./xtool/<App>.app` and confirm the `Info.plist` and files are there.
|
|
46
|
+
|
|
47
|
+
## 4. Build and install loop
|
|
48
|
+
|
|
49
|
+
1. `xtool dev` builds and installs. The first build takes minutes (it builds the SDK modules once, then caches them). Use `xtool dev build` to only build.
|
|
50
|
+
2. Connect the iPhone by USB. First time: tap **Trust** on the phone; if xtool errors right after pairing, run `xtool dev` again.
|
|
51
|
+
3. xtool registers the device, creates certificate, App ID and provisioning profile, signs and installs.
|
|
52
|
+
4. If iOS asks for **Developer Mode**, the user enables it (Settings > Privacy & Security) and you run `xtool dev` again.
|
|
53
|
+
5. First launch shows "Untrusted Developer": Settings > General > VPN & Device Management > the account > Trust.
|
|
54
|
+
|
|
55
|
+
Other commands: `xtool devices` (list connected devices), `xtool install <app.ipa>`, `xtool uninstall`, `xtool launch`, `xtool ds` (Apple Developer Services).
|
|
56
|
+
|
|
57
|
+
## 5. Limits to say up front
|
|
58
|
+
|
|
59
|
+
- Some entitlements don't work with a free account (Network Extension), some need special permission from Apple, and each capability needs a mapping inside xtool; a missing one fails late, at install. When the app depends on one of these, say so before building.
|
|
60
|
+
- With a free account, apps installed this way expire after a few days and need a reinstall; the paid membership lifts that.
|
|
61
|
+
- This skill covers development builds on a device. Shipping to TestFlight or the App Store is out of scope here.
|
|
@@ -29,6 +29,8 @@ Use when you need **real interaction**.
|
|
|
29
29
|
- Framer Motion or Motion for scroll integration;
|
|
30
30
|
- GSAP (ScrollTrigger) when scroll orchestrates the scene — 100% free since v3.13, all plugins included.
|
|
31
31
|
|
|
32
|
+
**Reference for fluid effects:** when the brief asks for a fluid cursor trail, liquid distortion or ink-like smoke over a Three.js scene, `artcodev/three-fluid-fx` (MIT, npm `three-fluid-fx`, 0.1.0 on 2026-10-24) is a drop-in 2D Stable-Fluids solver with WebGL/GLSL and WebGPU/TSL pipelines. Pointer only: the method does not install it, and an early version means pinning the exact release and checking the mobile cost against the performance targets before adopting it.
|
|
33
|
+
|
|
32
34
|
**Examples:** a 3D object that follows the cursor; a mouse-reactive particle sphere; a camera that advances on scroll; real-time wireframe terrain; a configurable 3D product; an interactive WebGL background.
|
|
33
35
|
|
|
34
36
|
**Avoid if:**
|
|
@@ -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 (
|
|
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 (VoC) into a sales machine. Do NOT use for raw audience research (use wizz-pesquisa-de-publico) or final page copywriting (use wizz-copywriting).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
6
|
# Wizz Offer Forge
|
|
@@ -34,7 +34,7 @@ A master artifact `OFFER-SPEC.md` containing:
|
|
|
34
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 `wizz-pesquisa-de-publico
|
|
37
|
+
1. **Prior Audience Research:** Is there a report from the `wizz-pesquisa-de-publico` 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
|
|
|
@@ -86,7 +86,8 @@ LI_LeadGen_CMOs-SaaS_Whitepaper_Mar24
|
|
|
86
86
|
|
|
87
87
|
**Scaling phase:**
|
|
88
88
|
- Consolidate budget into winning combinations
|
|
89
|
-
-
|
|
89
|
+
- On Meta with a bid cap campaign, follow the order in `wizz-lowticket-metodologia` `knowledge/03-campanha-bidcap.md`: bid cap first, then validated creatives, then budget by the ROAS ruler
|
|
90
|
+
- Without a bid cap (other platforms, or a campaign not built on it yet): increase budgets 20-30% at a time
|
|
90
91
|
- Wait 3-5 days between increases for algorithm learning
|
|
91
92
|
|
|
92
93
|
---
|
|
@@ -67,6 +67,7 @@ When trial is ending:
|
|
|
67
67
|
- Early warnings (7, 3, 1 day)
|
|
68
68
|
- Clear "what happens" on expiration
|
|
69
69
|
- Summarize value received
|
|
70
|
+
- People restarting the trial with new accounts: don't block by IP; use the risk score in `wizz-signup-flow-cro` (trial abuse)
|
|
70
71
|
|
|
71
72
|
### Time-Based Prompts
|
|
72
73
|
After X days of free use:
|
package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/README.md
RENAMED
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
# Pesquisa de Público
|
|
1
|
+
# Pesquisa de Público — a skill for Claude
|
|
2
2
|
|
|
3
3
|
Turns **an offer document** into a complete audience research arsenal for paid traffic: six chained reports (VoC, Psychographic Profile, Levels of Awareness, Trend, Angle Matrix and Lexicon) compiled into a tab-navigable HTML, ready to hand to the client or use as a copy foundation.
|
|
4
4
|
|
|
5
|
-
Made by **[@soupiva](https://www.instagram.com/soupiva/)**.
|
|
6
|
-
|
|
7
|
-
---
|
|
8
|
-
|
|
9
5
|
## What's in the box
|
|
10
6
|
|
|
11
7
|
```
|
|
12
|
-
pesquisa-de-publico
|
|
8
|
+
wizz-pesquisa-de-publico/
|
|
13
9
|
├── SKILL.md → the workflow Claude follows
|
|
14
10
|
├── prompts.md → the six research prompts, production-tested
|
|
11
|
+
├── references/
|
|
12
|
+
│ └── interview-mode.md → the guided interview for when there is no data yet
|
|
15
13
|
├── assets/
|
|
16
14
|
│ └── template.html → the final document, already styled and ready
|
|
17
15
|
└── README.md → this file
|
|
@@ -23,7 +21,7 @@ pesquisa-de-publico-do-piva/
|
|
|
23
21
|
|
|
24
22
|
## Installation (Claude web or desktop)
|
|
25
23
|
|
|
26
|
-
1. Download the `pesquisa-de-publico
|
|
24
|
+
1. Download the `wizz-pesquisa-de-publico.zip` file without unzipping it.
|
|
27
25
|
2. First, turn on code execution: **Settings → Capabilities → "Code execution and file creation"**. Without this, skills won't work.
|
|
28
26
|
3. Go to **Customize → Skills**.
|
|
29
27
|
4. Click **+ / Add skill** and upload the ZIP.
|
|
@@ -33,7 +31,7 @@ Done. Skills you upload are private to your account.
|
|
|
33
31
|
|
|
34
32
|
### Using it in Claude Code
|
|
35
33
|
|
|
36
|
-
Unzip the `pesquisa-de-publico
|
|
34
|
+
Unzip the `wizz-pesquisa-de-publico/` folder into `~/.claude/skills/` (to use it across any project) or into `.claude/skills/` at the repo root (to use it only in that project).
|
|
37
35
|
|
|
38
36
|
---
|
|
39
37
|
|
|
@@ -42,7 +40,7 @@ Unzip the `pesquisa-de-publico-do-piva/` folder into `~/.claude/skills/` (to use
|
|
|
42
40
|
Open a conversation, attach your offer document (`.docx`, `.pdf`, `.md` or `.txt`) and write:
|
|
43
41
|
|
|
44
42
|
```
|
|
45
|
-
/wizz-pesquisa-de-publico
|
|
43
|
+
/wizz-pesquisa-de-publico
|
|
46
44
|
```
|
|
47
45
|
|
|
48
46
|
Or, without the slash, anything in that spirit:
|
|
@@ -57,6 +55,12 @@ At the end, you get the finished HTML ready to open in the browser.
|
|
|
57
55
|
|
|
58
56
|
---
|
|
59
57
|
|
|
58
|
+
### No offer or audience data yet
|
|
59
|
+
|
|
60
|
+
Pre-launch, or you can't describe who buys? Say so ("ainda não lancei, me entrevista"). Claude asks one question at a time, each with 3–4 possible answers to pick from, and after every answer tells you what changed in the picture. You get an illustrative persona, clearly marked as a hypothesis, plus the list of what to validate, which is your script for collecting real comments.
|
|
61
|
+
|
|
62
|
+
---
|
|
63
|
+
|
|
60
64
|
## What this skill does NOT do
|
|
61
65
|
|
|
62
66
|
It stops at research. **It doesn't write ads, scripts, final headlines or finished creatives.** The hooks that appear in the Angle Matrix are writing direction built from the audience's own vocabulary — raw material for the copywriter, not a ready-to-run asset.
|
|
@@ -77,7 +81,3 @@ This means you'll sometimes get less material than you expected. That's intentio
|
|
|
77
81
|
- **The segment changes everything.** "People who want to learn X" yields generic results. "People who already tried X and gave up" yields gold. Pick the pain point, not the topic.
|
|
78
82
|
- **The anchor source isn't always the product's subject.** If you sell a book summary, the goldmine might not be the book's readers — it might be the people living the problem the book solves. Tell Claude this when confirming the context.
|
|
79
83
|
- **Run a second round when the caveats point to it.** Pasting 30–50 real comments you copied yourself from niche videos usually doubles the quality of the Lexicon.
|
|
80
|
-
|
|
81
|
-
---
|
|
82
|
-
|
|
83
|
-
**[@soupiva](https://www.instagram.com/soupiva/)**
|
package/src/skills-lib/{wizz-pesquisa-de-publico-do-piva → wizz-pesquisa-de-publico}/SKILL.md
RENAMED
|
@@ -1,11 +1,11 @@
|
|
|
1
1
|
---
|
|
2
|
-
name: wizz-pesquisa-de-publico
|
|
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).
|
|
2
|
+
name: wizz-pesquisa-de-publico
|
|
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. With no offer or audience data yet (pre-launch), runs a guided interview that builds an illustrative persona and the list of what to validate. 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).
|
|
4
4
|
---
|
|
5
5
|
|
|
6
|
-
# Pesquisa de Público
|
|
6
|
+
# Pesquisa de Público
|
|
7
7
|
|
|
8
|
-
Direct-marketing research pipeline for infoproducts and paid-traffic offers, validated in production
|
|
8
|
+
Direct-marketing research pipeline for infoproducts and paid-traffic offers, validated in production. From a single offer, it generates six chained reports and a final tab-navigable HTML document. Each report feeds the next.
|
|
9
9
|
|
|
10
10
|
**This skill stops at research.** It doesn't write ads, scripts, final headlines or ready-to-run creatives. The hooks that appear in the Angle Matrix are strategic writing direction based on the audience's native language.
|
|
11
11
|
|
|
@@ -19,6 +19,8 @@ Direct-marketing research pipeline for infoproducts and paid-traffic offers, val
|
|
|
19
19
|
6. **Audience Lexicon** — exhaustive compilation of native expressions mined by emotional territory, with confidence badge and copy-usage note.
|
|
20
20
|
7. **Final HTML document** — compiles the six reports into a single tab-styled file, using `assets/template.html`.
|
|
21
21
|
|
|
22
|
+
With no data yet, **interview mode** comes first: a guided interview that produces an illustrative persona (`persona-entrevista.md`), marked as a hypothesis, ending with what still needs validating. Protocol in `references/interview-mode.md`.
|
|
23
|
+
|
|
22
24
|
## Non-negotiable principle: epistemic honesty
|
|
23
25
|
|
|
24
26
|
**Never fabricate quotes, links, dates or data.** Only report language that was actually found in real, indexed public sources. Mark the confidence level of every quote:
|
|
@@ -33,6 +35,8 @@ When a source can't be accessed, **state it clearly in the Caveats section** as
|
|
|
33
35
|
|
|
34
36
|
### Step 0 — Read the offer and extract the base context
|
|
35
37
|
|
|
38
|
+
**No offer and no audience data?** (pre-launch, no comments or reviews, or the user can't describe who buys.) Run **interview mode** first, following `references/interview-mode.md`: one question per turn, each with 3-4 hypothesis answers, a new reading after every answer. Its `persona-entrevista.md` becomes the input for this step, and every report built on it says so.
|
|
39
|
+
|
|
36
40
|
Read the offer document (or description). Distill the **base context**:
|
|
37
41
|
- **Product**: what it is, format, price, central promise, positioning.
|
|
38
42
|
- **Likely persona**: who buys, age range, life/work context, awareness level.
|
|
@@ -56,9 +60,9 @@ Follow the dependency order (full prompts in `prompts.md`):
|
|
|
56
60
|
### Step 2 — Compile the final HTML document
|
|
57
61
|
|
|
58
62
|
1. Use the pre-formatted layout in `assets/template.html`.
|
|
59
|
-
2. Replace the `{{...}}` placeholders while keeping the `<style>` and structure intact.
|
|
60
|
-
3. Mandatory file naming: `Pesquisa [SHORT_NAME]
|
|
61
|
-
4. Keep the confidence badges (`.pill`)
|
|
63
|
+
2. Replace the `{{...}}` placeholders while keeping the `<style>` and structure intact. `{{ORIGEM_DA_PESQUISA}}` says what the research stands on (e.g. "Documento da oferta + VoC"); in interview mode use the commented line under it, with the hypothesis badge.
|
|
64
|
+
3. Mandatory file naming: `Pesquisa [SHORT_NAME].html` (saved to `{output_folder}/pesquisa-de-publico/` or the project directory).
|
|
65
|
+
4. Keep the confidence badges (`.pill`).
|
|
62
66
|
|
|
63
67
|
### Step 3 — Deliver and connect
|
|
64
68
|
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
<head>
|
|
4
4
|
<meta charset="UTF-8">
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
6
|
-
<title>Pesquisa {{NOME_CURTO_DA_OFERTA}}
|
|
6
|
+
<title>Pesquisa {{NOME_CURTO_DA_OFERTA}}</title>
|
|
7
7
|
<link rel="preconnect" href="https://fonts.googleapis.com">
|
|
8
8
|
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
|
9
9
|
<link href="https://fonts.googleapis.com/css2?family=Inter:wght@400;500;600;700;800&family=JetBrains+Mono:wght@400;500;700&display=swap" rel="stylesheet">
|
|
@@ -153,16 +153,8 @@ ol.findings li:before{content:counter(f,decimal-leading-zero);position:absolute;
|
|
|
153
153
|
.caveats{background:transparent;border:1px dashed var(--line);border-radius:16px;padding:22px 24px;margin-top:28px}
|
|
154
154
|
.caveats h3{color:var(--txt-mid);font-family:'JetBrains Mono',monospace;font-size:11px;letter-spacing:.16em;text-transform:uppercase}
|
|
155
155
|
|
|
156
|
-
/* ----------
|
|
157
|
-
.sig-fixed{position:fixed;right:18px;bottom:18px;z-index:99;display:flex;align-items:center;gap:9px;
|
|
158
|
-
background:rgba(8,21,19,.92);border:1px solid rgba(46,229,157,.4);border-radius:100px;
|
|
159
|
-
padding:10px 18px 10px 14px;text-decoration:none;color:var(--green);font-size:14px;font-weight:600;
|
|
160
|
-
backdrop-filter:blur(10px);box-shadow:0 6px 26px rgba(0,0,0,.55);transition:.18s}
|
|
161
|
-
.sig-fixed:hover{background:rgba(46,229,157,.14);transform:translateY(-2px)}
|
|
162
|
-
.sig-fixed .ico{width:19px;height:19px;filter:none}
|
|
156
|
+
/* ---------- RODAPÉ ---------- */
|
|
163
157
|
footer{text-align:center;margin-top:44px;padding-top:26px;border-top:1px solid var(--line)}
|
|
164
|
-
footer a{display:inline-flex;align-items:center;gap:9px;text-decoration:none;color:var(--green);
|
|
165
|
-
font-size:16px;font-weight:700}
|
|
166
158
|
footer .made{display:block;font-family:'JetBrains Mono',monospace;font-size:10.5px;
|
|
167
159
|
letter-spacing:.16em;color:var(--txt-dim);margin-top:10px;text-transform:uppercase}
|
|
168
160
|
|
|
@@ -172,7 +164,6 @@ footer .made{display:block;font-family:'JetBrains Mono',monospace;font-size:10.5
|
|
|
172
164
|
.tabs{grid-template-columns:repeat(3,1fr)}
|
|
173
165
|
.grid-4{grid-template-columns:repeat(2,1fr)}
|
|
174
166
|
.fw{flex-direction:column;gap:2px}
|
|
175
|
-
.sig-fixed{right:12px;bottom:12px;padding:9px 15px 9px 12px;font-size:13px}
|
|
176
167
|
}
|
|
177
168
|
</style>
|
|
178
169
|
</head>
|
|
@@ -194,7 +185,6 @@ footer .made{display:block;font-family:'JetBrains Mono',monospace;font-size:10.5
|
|
|
194
185
|
<symbol id="i-quote" viewBox="0 0 24 24"><rect x="3" y="4" width="18" height="14.5" rx="2.5"/><path d="M7.5 9h6M7.5 13h9"/></symbol>
|
|
195
186
|
<symbol id="i-pulse" viewBox="0 0 24 24"><path d="M2 12h4l2.5-7 4 15L15.5 12H22"/></symbol>
|
|
196
187
|
<symbol id="i-layers" viewBox="0 0 24 24"><path d="m12 3 9 5-9 5-9-5z"/><path d="m3 13 9 5 9-5"/></symbol>
|
|
197
|
-
<symbol id="i-insta" viewBox="0 0 24 24"><rect x="3" y="3" width="18" height="18" rx="5"/><circle cx="12" cy="12" r="4"/><path d="M17.2 6.8v.01"/></symbol>
|
|
198
188
|
<symbol id="i-radar" viewBox="0 0 200 200">
|
|
199
189
|
<circle cx="100" cy="100" r="88" stroke-opacity=".28"/><circle cx="100" cy="100" r="62" stroke-opacity=".4"/>
|
|
200
190
|
<circle cx="100" cy="100" r="36" stroke-opacity=".6"/>
|
|
@@ -210,9 +200,12 @@ footer .made{display:block;font-family:'JetBrains Mono',monospace;font-size:10.5
|
|
|
210
200
|
<!-- ================= HERO ================= -->
|
|
211
201
|
<div class="hero">
|
|
212
202
|
<svg class="hero-radar" style="stroke:var(--green);fill:none;stroke-width:1.2;color:var(--green)"><use href="#i-radar"/></svg>
|
|
213
|
-
<div class="kicker"><svg class="ico ico-sm"><use href="#i-target"/></svg> Arsenal de Pesquisa de Oferta
|
|
214
|
-
<h1>Pesquisa {{NOME_CURTO_DA_OFERTA}}
|
|
203
|
+
<div class="kicker"><svg class="ico ico-sm"><use href="#i-target"/></svg> Arsenal de Pesquisa de Oferta</div>
|
|
204
|
+
<h1>Pesquisa {{NOME_CURTO_DA_OFERTA}}</h1>
|
|
215
205
|
<div class="recorte">Recorte: {{RECORTE_DO_PUBLICO}}</div>
|
|
206
|
+
<div class="recorte">Origem: {{ORIGEM_DA_PESQUISA}}</div>
|
|
207
|
+
<!-- Modo entrevista: troque a linha acima por
|
|
208
|
+
<div class="recorte">Origem: Entrevista · <span class="pill pill-blue">Hipótese, validar antes de usar</span></div> -->
|
|
216
209
|
<p>Seis relatórios encadeados de pesquisa de público para tráfego pago.<br>Mineração feita sobre quem vive a dor — não sobre quem já é cliente.</p>
|
|
217
210
|
<div class="pipeline">
|
|
218
211
|
<div class="pipe-step on"><svg class="ico"><use href="#i-mic"/></svg><span class="lbl">VoC</span></div>
|
|
@@ -390,16 +383,10 @@ footer .made{display:block;font-family:'JetBrains Mono',monospace;font-size:10.5
|
|
|
390
383
|
</div>
|
|
391
384
|
|
|
392
385
|
<footer>
|
|
393
|
-
<
|
|
394
|
-
<svg class="ico ico-sm"><use href="#i-insta"/></svg> @soupiva
|
|
395
|
-
</a>
|
|
396
|
-
<span class="made">Pesquisa de Público do Piva</span>
|
|
386
|
+
<span class="made">Pesquisa de Público</span>
|
|
397
387
|
</footer>
|
|
398
388
|
</div>
|
|
399
389
|
|
|
400
|
-
<a class="sig-fixed" href="https://www.instagram.com/soupiva/" target="_blank" rel="noopener">
|
|
401
|
-
<svg class="ico"><use href="#i-insta"/></svg> @soupiva
|
|
402
|
-
</a>
|
|
403
390
|
|
|
404
391
|
<script>
|
|
405
392
|
function showTab(i,btn){
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
# Interview mode (no data yet)
|
|
2
|
+
|
|
3
|
+
For when there is nothing to mine from: pre-launch, no offer document, no VoC, or a user who can't describe the audience. The interview builds an **illustrative persona** from what the user knows and suspects. It is a hypothesis, never evidence, and its last section is the script for collecting the real VoC.
|
|
4
|
+
|
|
5
|
+
## When to use it
|
|
6
|
+
|
|
7
|
+
- The user has no offer document and no audience material, or says so ("ainda não lancei", "não sei quem compra", "não tenho comentário nenhum").
|
|
8
|
+
- The user asks for it by name ("me entrevista", "modo entrevista").
|
|
9
|
+
- An offer exists but Step 0 can't fill the likely persona or the problems it solves: offer the interview before running the reports.
|
|
10
|
+
|
|
11
|
+
When real material exists (offer document, comments, reviews, calls), the normal workflow wins. The interview can still run on top to fill a gap, and the output says which parts came from where.
|
|
12
|
+
|
|
13
|
+
## Protocol
|
|
14
|
+
|
|
15
|
+
1. **One question per turn.** Never a questionnaire. Wait for the answer.
|
|
16
|
+
2. **Every question carries 3 or 4 hypothesis answers**, lettered, plus "outra coisa". The hypotheses unlock someone who can't describe the audience; they are guesses grounded in the niche, not leading answers. The user may pick, mix or reject them.
|
|
17
|
+
3. **After each answer, give a new reading before the next question:** 2 or 3 lines on what the answer changes in the persona, and what it hints at that hasn't been said yet. The reading is where the hidden blocker shows up (in testing, 4 rounds surfaced a fear of social judgment that wasn't in the briefing; the brief only talked about fear of selling).
|
|
18
|
+
4. **Follow the thread that surprises.** The question order below is a default; when an answer opens something unexpected, the next question digs there.
|
|
19
|
+
5. **Stop at saturation**, usually 6 to 10 rounds: when two answers in a row change nothing in the reading, or when the user asks to stop. Say how many rounds ran.
|
|
20
|
+
|
|
21
|
+
### Default question sequence
|
|
22
|
+
|
|
23
|
+
Ask in Portuguese, in the user's register. Adapt the wording to the niche.
|
|
24
|
+
|
|
25
|
+
| # | Topic | What it opens |
|
|
26
|
+
|---|---|---|
|
|
27
|
+
| 1 | Who buys and at what moment of life | Persona, trigger moment |
|
|
28
|
+
| 2 | What they already tried and why it didn't work | Sophistication, false solutions |
|
|
29
|
+
| 3 | What stops them from buying today | **The fear that blocks the purchase** |
|
|
30
|
+
| 4 | What goes through their head at night about it | Mental ruminations |
|
|
31
|
+
| 5 | Who they want to become, and how others would see them | Desired identity |
|
|
32
|
+
| 6 | An ordinary day: where the problem shows up | A day in the life |
|
|
33
|
+
| 7 | Where they talk about it in public, and in which words | Anchor source for the real VoC |
|
|
34
|
+
| 8 | What they'd never admit about it | Won't Tell / Can't Tell (feeds Report 3) |
|
|
35
|
+
|
|
36
|
+
Example of one turn (question 3):
|
|
37
|
+
|
|
38
|
+
> **O que mais trava essa pessoa na hora de comprar?**
|
|
39
|
+
> a) Medo de jogar dinheiro fora de novo
|
|
40
|
+
> b) Vergonha de os outros descobrirem que ela precisou de ajuda
|
|
41
|
+
> c) Não acreditar que funciona para o caso dela
|
|
42
|
+
> d) Falta de tempo para aplicar
|
|
43
|
+
> e) Outra coisa
|
|
44
|
+
|
|
45
|
+
## Output
|
|
46
|
+
|
|
47
|
+
Save to `{output_folder}/pesquisa-de-publico/persona-entrevista.md`, in Portuguese, with these sections in this order:
|
|
48
|
+
|
|
49
|
+
1. **Aviso no topo:** "Persona ilustrativa: hipótese montada em entrevista com <quem> em <data>, <N> rodadas. Não é VoC. Valide antes de usar como prova."
|
|
50
|
+
2. **Contexto base** (the same five fields as Step 0).
|
|
51
|
+
3. **Persona** (who, life moment, context).
|
|
52
|
+
4. **O medo que bloqueia a compra.**
|
|
53
|
+
5. **Ruminações mentais** (what they repeat to themselves, in their words as the user imagined them).
|
|
54
|
+
6. **Identidade desejada.**
|
|
55
|
+
7. **Um dia na vida.**
|
|
56
|
+
8. **Plano de aplicação da persona** (where each trait goes: hook, offer, objection handling, page section).
|
|
57
|
+
9. **O que ainda não sabemos** (every point where the user hesitated, guessed, or picked a hypothesis without conviction).
|
|
58
|
+
10. **O que precisamos validar:** one row per hypothesis, with where to collect (the anchor source from question 7), what to look for, and what would refute it. This list **is the VoC collection script**: hand it over as the next step.
|
|
59
|
+
|
|
60
|
+
Interview answers are never quotes. They never get the `Verificável`, `Fórum` or `EN` badges, and never go into the VoC report as audience language.
|
|
61
|
+
|
|
62
|
+
## How the six reports use it
|
|
63
|
+
|
|
64
|
+
The interview replaces the offer document as the input to Step 0. Then the workflow runs as usual:
|
|
65
|
+
|
|
66
|
+
- **VoC (1) and Trend (4)** still mine the web, using the anchor source from question 7. What they find is real and keeps its badges.
|
|
67
|
+
- **Schwartz (2), Awareness (3) and Matrix (5)** open with one line saying they start from interview, not VoC, and how much real VoC was found to support it. Every trait that rests only on the interview is marked `hipótese`.
|
|
68
|
+
- **Lexicon (6)** only lists expressions actually found. Words the user imagined stay in the persona file.
|
|
69
|
+
- In the HTML, fill `{{ORIGEM_DA_PESQUISA}}` with `Entrevista` and keep the hypothesis badge on every item from the interview.
|
|
@@ -11,7 +11,7 @@ Autonomous strategist for premium landing pages, SaaS UI, and advanced visual ex
|
|
|
11
11
|
|
|
12
12
|
Check for `{output_folder}/design-state.yaml` (default `_wizz-output/`). Cheap check first: `grep -c 'status: open'`. Not there? Run `find . -name design-state.yaml -not -path '*/node_modules/*'` before concluding it does not exist: a map found elsewhere is still the map, so use it and tell the user it is off-place.
|
|
13
13
|
|
|
14
|
-
- **It exists, with open needs:** you are not deciding what to research. Work **one need per pass**, in the order given, and take `query`, `budget.fontes` and `floor` as given. Read the `proibidos` block before writing any query: a query that lands on a forbidden capability is not run, not even for comparison.
|
|
14
|
+
- **It exists, with open needs:** you are not deciding what to research. Work **one need per pass**, in the order given, and take `query`, `budget.fontes` and `floor` as given. Read the `proibidos` block before writing any query: a query that lands on a forbidden capability is not run, not even for comparison. Judge each candidate with [mining-rubric](references/mining-rubric.md) (entry conditions, score, verdict, selection) and write it back under `discoveries` with the `need` id. Each need closes on one of the rubric's stop conditions, never on a feeling of having seen enough. After writing, run `uv run --no-cache ../wizz-design-needs/scripts/design_state.py validate {output_folder}/design-state.yaml` and fix its findings before the handoff. Stop when the needs are exhausted, not when the ideas are.
|
|
15
15
|
- **It exists, no open needs:** the map is done. Do not open new research on your own: report it and hand back to `wizz-design-needs` if something is genuinely missing.
|
|
16
16
|
- **It does not exist, and the work is non-trivial:** invoke `skill:wizz-design-needs` first. Mining without a map is how a project ends up depending on the user to name every effect, one request at a time.
|
|
17
17
|
- **It does not exist, and the work is one isolated component the user named:** proceed, and say the map was not created.
|
|
@@ -28,6 +28,8 @@ Absolute rule: inspect real sources, log evidence, and recommend options, adapt
|
|
|
28
28
|
|
|
29
29
|
## Gate 2: classify the site's level (always, before recommending components)
|
|
30
30
|
|
|
31
|
+
The brief and the visual identity belong to `wizz-decision-maker` (`brief` and `identidade` in `design-state.yaml`): when they exist, read objective, audience and references from them instead of asking again, and never redefine palette or typography here. This skill owns only the level classification and the component and motion research.
|
|
32
|
+
|
|
31
33
|
If essential data is missing, ask at most 5 strategic questions: (1) business/product/offer, (2) target audience, (3) page's main objective, (4) desired visual level, (5) existing visual references. If the user doesn't answer everything, continue with coherent strategic hypotheses. Master rule: ask, infer, execute.
|
|
32
34
|
|
|
33
35
|
Classify the project into one of 5 levels (rules, allowed/forbidden motion, and budget per level in [site-levels](references/site-levels.md)):
|
|
@@ -60,7 +62,8 @@ Classify the project into one of 5 levels (rules, allowed/forbidden motion, and
|
|
|
60
62
|
| Handoffs to wizz-motion-3d-director and wizz-implementation-planner, final ladder rule | [handoffs](references/handoffs.md) |
|
|
61
63
|
| SaaS Dashboard Mode and Portfolio / Authority Site Mode | [dashboard-and-portfolio-modes](references/dashboard-and-portfolio-modes.md) |
|
|
62
64
|
| The mandatory 12-step process and honesty checkpoint | [mandatory-process](references/mandatory-process.md) |
|
|
63
|
-
| The
|
|
65
|
+
| The 6-phase protocol (inventory, public search, cache, evidence, adaptation, stop) | [source-first-protocol](references/source-first-protocol.md) |
|
|
66
|
+
| Entry conditions, 0-10 score, verdicts, selection, stop conditions, dedup and the adaptation protocol | [mining-rubric](references/mining-rubric.md) |
|
|
64
67
|
| Audit Protocol: Pass 1 Taste, Pass 2 Impeccable, Pass 3 Cross-check, Pass 4 A11y/Perf | [audit-protocol](references/audit-protocol.md) |
|
|
65
68
|
| Component sources (React Bits, Cult UI, Ali Imam, Watermelon, StyleUI, Skiper UI, Bklit UI, Componentry), animation engines (GSAP, anime.js), reference and visual inspiration sources, Clone Policy, Paid Source Policy | [component-sources](references/component-sources.md) |
|
|
66
69
|
| Default stack, visual direction, palettes, typography, and animation selection rules | [stack-and-visual-direction](references/stack-and-visual-direction.md) |
|
|
@@ -68,6 +71,7 @@ Classify the project into one of 5 levels (rules, allowed/forbidden motion, and
|
|
|
68
71
|
| Base prompts (complete landing page and 3D scroll hero) | [prompt-templates](references/prompt-templates.md) |
|
|
69
72
|
| Final response format, Quality Bar, and self-check before closing the delivery | [output-format-and-quality](references/output-format-and-quality.md) |
|
|
70
73
|
| Direct links to every authorized source | [source-links](references/source-links.md) |
|
|
74
|
+
| The source catalogue as data (kind, access, license, need tags, cache folder), queried with `scripts/design_sources.py list --need <tag>`; cache freshness and refresh with `freshness` / `refresh` | [design-sources.yaml](references/design-sources.yaml) |
|
|
71
75
|
| Opening web access before mining, BLOCKED, and the evidence gate before delivering | [web-access-and-evidence](references/web-access-and-evidence.md) |
|
|
72
76
|
|
|
73
77
|
Final rule: never put real keys inside the skill (environment variables only), and never deliver a landing page that looks like a template with no positioning.
|