Panel TR (synthetic focus group)
À quoi ça sert : détecter les problèmes avant un vrai public — une offre mal comprise, des petits caractères illisibles, une ouverture qui n'accroche pas dans les 3 premières secondes, un élément qui repousse une certaine tranche d'âge. Ce que ce n'est pas : une prévision de ventes ou une étude de marché. Les chiffres sont un décompte de réponses synthétiques, jamais un « % du marché ».
Versions (fichier EDITION) : Lite = 10 fiches spectateur, une seule option, rapport rapide prêt à l'emploi.
Pro = 30 spectateurs + 24 fiches acheteur (10 segments), mode A/B, tableaux et graphiques par segment, rédacteur de rapport séparé.
Les étapes spécifiques à la Pro sont marquées (Pro) ci-dessous ; en Lite, le script les refuse poliment.
Fichiers
SKILL.md ce fichier
EDITION lite | pro
config.example.yaml copier -> config.yaml (chemins, navigateur, taux de base) ; chemin absolu non requis
requirements.txt PyYAML, Pillow, playwright (pour le mode site)
personas/viewers.yaml fiches spectateur (Lite 10, Pro 30)
personas/buyers.yaml fiches acheteur (Pro uniquement, 24)
sources/index.yaml + *.md résumés de sources publiques citées par les fiches (TÜİK, DataReportal, …)
prompts/persona_batch.md instruction d'un sous-agent de groupe (plan rempli par panel.py)
prompts/aggregator.md (Pro) instruction du rédacteur de rapport (rempli par panel.py report-prompt)
scripts/make_stimulus.py vidéo/site/publication -> images clés, captures d'écran, stimulus.md
scripts/panel.py doctor | validate | cite | init-run | plan [--dry-run] | report-prompt (Pro)
scripts/aggregate.py responses/*.json -> tableaux, graphiques, contrôles d'honnêteté, rapport rapide
examples/demo-kafe-reel/ exemple de bout en bout avec un reel de café fictif
Ci-dessous, S = dossier de cette compétence (généralement ~/.claude/skills/panel-tr), PY = python3 (de préférence
S/.venv/bin/python). Les dossiers d'exécution sont écrits dans le runs_dir du config.yaml (par défaut
~/panel-tr-runs).
Étapes
- Lors de la première installation / en cas de problème :
PY S/scripts/panel.py doctor(dépendances, ffmpeg, navigateur, version). Si les fiches ont changé :PY S/scripts/panel.py validatedoit renvoyer 0 erreur.PY S/scripts/panel.py cite V07affiche une fiche avec les lignes de source qu'elle cite. - Dossier d'exécution :
RUN=$(PY S/scripts/panel.py init-run --slug kafe-reels-v2)→ modèles dansRUN/inputs/. - Rédiger les entrées (dans
RUN/inputs/), en turc neutre, d'après ta propre analyse :context.txt— où et comment la personne voit ce contenu ("Il apparaît dans le flux Reels ; le compte qui partage est @x ; il y a / il n'y a pas de texte de description"). N'écris le compte partageur que s'il est visible dans l'application. N'écris jamais qui a fait quoi, quel est l'objectif ou quelle version est préférée.onscreen.txt(vidéo) — tout texte à l'écran, avec intervalle de temps, tel qu'il apparaît à l'écran.audio.txt(vidéo) — ce qui est entendu, factuellement : son live ou quel morceau, à quelle seconde, y a-t-il de la parole/des effets, cohérent avec l'image ? Présenté aux personnes sous le titre « NOTRE ANALYSE — tu n'as pas entendu cela ».caption.txt(publication/reel) — le texte de description qui sera publié, s'il y en a un.
- Stimulus (un par option ; A/B =
stimulus_A,stimulus_B) :
Vidéo : images clés à 0,0 / 0,5 / … / 2,5 s, puis une par seconde + dernière image ;PY S/scripts/make_stimulus.py video IN.mp4 RUN/stimulus --onscreen RUN/inputs/onscreen.txt --audio RUN/inputs/audio.txt [--caption RUN/inputs/caption.txt] [--transcript] PY S/scripts/make_stimulus.py site https://ornek.com RUN/stimulus # ou un fichier .html local PY S/scripts/make_stimulus.py post a.jpg,b.jpg,c.jpg RUN/stimulus --caption RUN/inputs/caption.txtsheet_00_ilk3sn.jpget pages 2-3 numérotées avec le temps sous chaque image ;--transcriptajoute le texte si parole (si faster-whisper / openai-whisper installé). Site : Playwright Firefox (par défaut) ou WebKit — bureau 1440×900 et mobile 390×844, première page + page entière par tranches de deux écrans, plus le texte visible. Chrome / Chromium / Chrome for Testing n'est jamais ouvert. Ouvre les pages toi-même et vérifie queonscreen.txtcorrespond aux images. - Planifier le panel :
Tailles : contrôle rapide 10 personnes (2×5) ; contrôle complet (Pro) 30 spectateurs (6×5) et/ou 24 acheteurs (5×~5). La sélection des spectateurs est pondérée selon la répartition par âge d'Instagram Turquie (config :PY S/scripts/panel.py plan --run RUN --panel viewer --n 10 --batches 2 --stimulus RUN/stimulus --context-file RUN/inputs/context.txt [--action "…"] [--seed 7] [--dry-run] PY S/scripts/panel.py plan --run RUN --panel viewer --n 30 --batches 6 … (Pro) PY S/scripts/panel.py plan --run RUN --panel buyer --n 24 --batches 5 --segments kafe_restoran,emlak,… … (Pro) PY S/scripts/panel.py plan … --stimulus-a RUN/stimulus_A --stimulus-b RUN/stimulus_B (Pro, A/B)viewer_age_weights, source NapoleonCat), au moins une personne par tranche d'âge ; ~20% de personnes « hors cible » (--out-share) ;--local İzmirfavorise les personnes de cette ville ;--idspour une sélection manuelle. Chaque panel garde au moins un sceptique/hors cible. A/B (Pro) : les options sont présentées comme « Option 1/2 » ; les groupes impairs voient A en premier, les groupes pairs voient B en premier ; la clé n'est que dansplan.json, jamais dans une instruction. Si la question d'action par défaut ne convient pas, utilise--actionpour la modifier ("En voyant ce reel, irais-tu ce week-end ?"). - Exécuter les groupes — un sous-agent frais et séparé par groupe, tous en parallèle. Utilise un agent à usage général dans
l'outil agent, pas un fork (le fork apporterait notre contexte et nos attentes). Instruction :
"Read
<RUN>/batches/batch_NN.mdand do exactly what it says. Write only the JSON file it names." Chaque sous-agent ne voit que son propre fichier d'instruction et les images. Ensuite, vérifie que chaque fichierRUN/responses/batch_NN.jsonexiste ; relance le groupe échoué une fois avec la même instruction. - Compter :
PY S/scripts/aggregate.py RUN --title "…" [--real-people "…"]→RUN/data/panel_data.md,chart_aksiyon.png,chart_ilk3sn.png,all_answers.mdet contrôles : schéma, référence (citation d'une image non montrée = la personne a inventé), écho de fiche (la personne a répété sa propre fiche), univocité (chevauchement de mots intra-groupe vs inter-groupes). Lite écrit ici le rapport rapideRUN/PANEL_REPORT.md. Pro écrit en plus un tableau et des graphiques par segment (chart_aksiyon_<segment>.png) et la préférence A/B. - (Pro) Rapport :
PY S/scripts/panel.py report-prompt --run RUN --title "…" --real-people "…"→RUN/aggregator_prompt.md. Donne-le à un nouveau sous-agent ("Read … and do it") →RUN/PANEL_REPORT.md(objections agrégées, correctifs prioritaires, commentaire par segment). Compare le rapport avecall_answers.md(les citations doivent être réelles, les chiffres inchangés). - Dire à l'utilisateur (en turc) : résultat en 3-5 lignes avec chiffres, les 3 premiers correctifs, une phrase de la case d'honnêteté et 3-5 vraies personnes à interroger. Le panel ne remplace pas le goût de l'utilisateur ou du client.
Règles
- D'abord la preuve. Chaque caractéristique de fiche se termine par
[CLÉ:Fnn](une ligne de fait danssources/) ou[hypothèse].panel.py validatevérifie chaque référence. Aujourd'hui, environ la moitié des caractéristiques sont[hypothèse](pas de donnée publique mesurée pour la personnalité et les goûts) — le rapport affiche ce ratio. Pour ajouter votre propre recherche, écrivez un fichier .md avec des lignes "Fnn …" danssources/et ajoutez sa clé àsources/index.yaml. - Pas de théorie marketing/fiction dans les fiches. Les fiches portent des faits sur la personne (métier, ville, budget, habitude), pas nos opinions (comme « les 2 premières secondes sont importantes »). Sinon, le panel ne ferait que nous renvoyer nos propres croyances.
- Diversité délibérée : sceptiques, sensibles au prix, peu technophiles, ruraux, conservateurs, personnes âgées à dominante Facebook, personnes hors cible. Leur « non » est une information de ciblage.
- Évaluer seulement ce qui est montré. Les personnes voient les images clés, les captures d'écran, les visuels et les faits textes/sons que nous avons écrits. Ils n'ont pas regardé la vidéo, n'ont pas entendu le son ; chaque réponse repose sur ≥ 2 images ; ce qu'ils ne peuvent pas évaluer va dans le champ
goremedigim. Le son est toujours « notre analyse », jamais « j'ai entendu ». - Test en aveugle : les fichiers context/onscreen/audio ne contiennent pas qui a fait, « notre version » ni la réponse attendue ; les étiquettes A/B sont neutres et l'ordre est équilibré.
- Pas poli, calibré : l'instruction porte un vrai taux de base (
calibrationdans config.yaml ; les valeurs par défaut sont les taux d'engagement Click Analytic / Socialinsider et le taux de réponse aux e-mails froids Hunter, voirsources/EB_*.md). Si vous connaissez le vrai taux de votre compte, écrivez-le. Un panel où la majorité dit « J'enverrais un DM » est un drapeau rouge, pas un succès. - Contextes indépendants : un sous-agent par groupe ; dans un groupe, chaque personne est écrite à tour de rôle, sans utiliser les phrases de la personne précédente. Si aggregate.py émet un avertissement d'univocité, relance avec des groupes plus petits (3).
- Le script compte les chiffres, le modèle écrit les mots. Le rédacteur de rapport ne peut pas inventer de chiffres, ni les recalculer.
- Case d'honnêteté obligatoire dans chaque rapport : synthétique ≠ données de marché ; vérifier avec 3-5 vraies personnes (t'arrêterais-tu dans les 3 premières secondes ? qu'est-ce que ça raconte en une phrase ? qu'aurais-tu fait ensuite ?).
- Les réponses sont en turc et dans la bouche de la personne ; les citations conservent le turc İ/ı.
- Coût : ~6-8 images par groupe ; une exécution de 10 personnes ≈ 2 sous-agents en parallèle ; 30 personnes ≈ 6 sous-agents + 1 rédacteur de rapport. Pour les brouillons : contrôle rapide (10), pour la version finale : panel complet (Pro, 24-30).
- Confidentialité : les dossiers d'exécution sont locaux ; ne télécharge pas le matériel client ailleurs. Avant de partager, nettoie les entrées contenant des noms de clients et des données personnelles.
Dossier de sortie
RUN/inputs/{context,onscreen,audio,caption}.txt
RUN/stimulus[_A|_B]/{stimulus.md,stimulus.json,sheet_*.jpg,frames/|shots/|post/}
RUN/plan.json RUN/batches/batch_NN.md RUN/responses/batch_NN.json
RUN/data/{panel_data.md,panel_data.json,all_answers.md,chart_*.png}
RUN/PANEL_REPORT.md (Lite : rapport rapide ; Pro : rapport du rédacteur, rapport rapide dans data/quick_report.md)
RUN/aggregator_prompt.md (Pro)