Communitygithub.com

AFL++

Configure et exécute AFL++ pour du fuzzing multi-cœur de projets C/C++ compilés avec afl-clang-fast ou afl-gcc-fast. Couvre les modes d'instrumentation, les campagnes principales et secondaires parallèles, le mode persistant, la minimisation de corpus et le triage des crashes. À utiliser lors du passage à l'échelle du fuzzing sur plusieurs cœurs, du fuzzing d'une base de code C/C++ mature, de la lecture de l'écran d'état d'afl-fuzz, ou après un plateau de libFuzzer.

Qu'est-ce que AFL++ ?

Cette compétence fournit un guide complet pour l'utilisation d'AFL++ (American Fuzzy Lop Plus Plus), un fork avancé du fuzzer AFL original, spécialisé dans le fuzzing multi-cœur pour les projets C/C++. Elle couvre l'installation via Docker, Ubuntu/Debian ou compilation source, la configuration d'un script wrapper pour exécuter AFL++ en mode hôte ou conteneur, et l'optimisation système (désactivation des mitigations de sécurité, réglages du noyau) pour maximiser les performances. La compétence détaille la création de harnais de test compatibles libFuzzer, les modes de compilation (LTO, LLVM, GCC plugin), l'utilisation de sanitizers (ASan, UBSan), et la gestion de corpus (création, minimisation avec afl-cmin). Les campagnes multi-cœur sont expliquées en détail : démarrage d'un fuzzer principal avec `-M` et de fuzzeurs secondaires avec `-S`, interprétation des statistiques (execs/sec, cycles done, corpus count, crashes, stabilité), et analyse des résultats (afl-whatsup, afl-plot). Les variables d'environnement clés (AFL_TMPDIR, AFL_FAST_CAL, AFL_FINAL_SYNC, AFL_TESTCACHE_SIZE, AFL_EXIT_ON_TIME) sont présentées avec leurs cas d'usage, et les pièges courants (variables à éviter, gestion des terminaux dans CI) sont explicités. Un triage des crashes permet de rejouer les entrées problématiques et d'identifier les bugs.

Compatible avec~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/bg-szy/TOP-SKILLS/tree/HEAD/skills/skills/aflpp

Demander à votre IA préférée

Ouvre une nouvelle conversation avec cette compétence d'agent déjà préchargée.

Documentation

Que fait AFL++ ?

AFL++ est un fork du fuzzer AFL original qui offre de meilleures performances de fuzzing et des fonctionnalités plus avancées tout en maintenant la stabilité. Un avantage majeur par rapport à libFuzzer est qu'AFL++ prend en charge de manière stable l'exécution de campagnes de fuzzing sur plusieurs cœurs, ce qui le rend idéal pour les efforts de fuzzing à grande échelle.

Quand l'utiliser

FuzzerIdéal pourComplexité
AFL++Fuzzing multi-cœur, mutations diverses, projets maturesMoyenne
libFuzzerConfiguration rapide, mono-thread, harnais simplesFaible
LibAFLFuzzers personnalisés, recherche, cas d'usage avancésÉlevée

Choisissez AFL++ quand :

  • Vous avez besoin de fuzzing multi-cœur pour maximiser le débit
  • Votre projet peut être compilé avec Clang ou GCC
  • Vous voulez des stratégies de mutation diverses et des outils matures
  • libFuzzer a atteint un plateau et vous avez besoin de plus de couverture
  • Vous fuzzez des bases de code de production qui bénéficient d'une exécution parallèle

Démarrage Rapide

extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
    // Appelez votre code avec les données fournies par le fuzzer
    check_buf((char*)data, size);
    return 0;
}

Compilez et exécutez :

# Configuration du script wrapper AFL++ d'abord (voir Installation)
./afl++ docker afl-clang-fast++ -DNO_MAIN=1 -O2 -fsanitize=fuzzer harness.cc main.cc -o fuzz
mkdir seeds && echo "aaaa" > seeds/minimal_seed
./afl++ docker afl-fuzz -i seeds -o out -- ./fuzz

Installation

AFL++ a de nombreuses dépendances, notamment LLVM, Python et Rust. Nous recommandons d'utiliser une distribution Debian ou Ubuntu récente pour le fuzzing avec AFL++.

MéthodeQuand l'utiliserCompilateurs supportés
Dépôts Ubuntu/DebianUbuntu récent, fonctionnalités de base uniquementUbuntu 23.10 : Clang 14 & GCC 13Debian 12 : Clang 14 & GCC 12
Docker (depuis Docker Hub)Version spécifique d'AFL++, support Apple SiliconÀ partir de 4.35c : Clang 19 & GCC 11
Docker (depuis les sources)Tester des fonctionnalités non publiées, appliquer des correctifsConfigurable dans le Dockerfile
Depuis les sourcesÉviter Docker, besoin de correctifs spécifiquesAjustable via la variable d'environnement LLVM_CONFIG

Ubuntu/Debian

Avant d'installer afl++, vérifiez la dépendance de version de clang du paquet avec apt-cache show afl++, et installez la version correspondante de lld (par exemple, lld-17).

apt install afl++ lld-17

Docker (depuis Docker Hub)

docker pull aflplusplus/aflplusplus:stable

Docker (depuis les sources)

git clone --depth 1 --branch stable https://github.com/AFLplusplus/AFLplusplus
cd AFLplusplus
docker build -t aflplusplus .

Depuis les sources

Consultez le Dockerfile pour les exigences de version Ubuntu et les dépendances. Définissez LLVM_CONFIG pour spécifier la version de Clang (par exemple, llvm-config-18).

Configuration du Script Wrapper

Créez un script wrapper pour exécuter AFL++ sur l'hôte ou Docker :

cat <<'EOF' > ./afl++
#!/bin/sh
AFL_VERSION="${AFL_VERSION:-"stable"}"
case "$1" in
   host)
        shift
        bash -c "$*"
        ;;
    docker)
        shift
        /usr/bin/env docker run -i \
            --privileged \
            -v ./:/src \
            --rm \
            --name "afl_fuzzing_$$" \
            "aflplusplus/aflplusplus:$AFL_VERSION" \
            bash -c "cd /src && bash -c \"$*\""
        ;;
    *)
        echo "Usage: $0 {host|docker}"
        exit 1
        ;;
esac
EOF
chmod +x ./afl++

Les exemples ci-dessous utilisent le mode docker, à l'exception des commandes de configuration système qui doivent atteindre le noyau hôte. Remplacez par host pour exécuter l'une d'entre elles avec une installation d'AFL++ sur la machine elle-même. Le wrapper concatène tout ce qui suit l'argument de mode en une seule chaîne shell, donc les guillemets ne survivent pas : un argument contenant un espace (-x "my dict.dict") arrive divisé en mots. Renommez ces fichiers sans espaces, ou modifiez le wrapper pour cette exécution.

L'absence de -t est délibérée. docker run -ti échoue avec the input device is not a TTY chaque fois que l'entrée standard n'est pas un terminal, ce qui couvre les tâches CI et tout ce qui est piloté par un agent ou un script. afl-fuzz détecte qu'il n'y a pas de terminal et affiche des lignes d'état simples à la place de l'interface plein écran. Un programme qui nécessite un terminal, comme watch, doit être exécuté côté hôte du wrapper. $$ se développe en PID du wrapper, donc les instances parallèles obtiennent des noms de conteneurs distincts plutôt que de se heurter sur un seul afl_fuzzing. docker ps tronque la colonne COMMAND, donc toutes les lignes se ressemblent ; utilisez docker ps --no-trunc pour distinguer les instances avant d'en arrêter une.

Avertissement de Sécurité : Les scripts afl-system-config et afl-persistent-config nécessitent des privilèges root et désactivent les fonctionnalités de sécurité du système d'exploitation. Ne faites pas de fuzzing sur des systèmes de production ou votre environnement de développement. Utilisez une VM dédiée à la place.

Configuration Système

Exécutez après chaque redémarrage pour jusqu'à 15% d'exécutions supplémentaires par seconde :

./afl++ host afl-system-config

afl-system-config règle le noyau sur lequel il s'exécute, donc exécutez-le sur la machine qui héberge la campagne. ./afl++ docker afl-system-config atteint les mêmes paramètres via le conteneur --privileged du wrapper, ce qui est la seule option quand AFL++ est installé uniquement via Docker.

Pour des performances maximales, désactivez les atténuations de sécurité du noyau (nécessite le chargeur d'amorçage grub, non pris en charge dans Docker) :

./afl++ host afl-persistent-config
update-grub
reboot
./afl++ host afl-system-config

Vérifiez avec cat /proc/cmdline - la sortie doit inclure mitigations=off.

Écrire un Harnais

Structure du Harnais

AFL++ prend en charge les harnais de style libFuzzer :

#include <stdint.h>
#include <stddef.h>

extern "C" int LLVMFuzzerTestOneInput(const uint8_t *data, size_t size) {
    // 1. Validez la taille d'entrée si nécessaire
    if (size < MIN_SIZE || size > MAX_SIZE) return 0;

    // 2. Appelez la fonction cible avec les données de fuzzing
    target_function(data, size);

    // 3. Retournez 0 (non nul réservé pour une utilisation future)
    return 0;
}

Règles du Harnais

À faireÀ ne pas faire
Réinitialisez l'état global entre les exécutionsDépendre de l'état des exécutions précédentes
Gérez les cas limites avec éléganceQuitter sur une entrée invalide
Gardez le harnais déterministeUtiliser des générateurs de nombres aléatoires
Libérez la mémoire allouéeCréer des fuites mémoire
Validez les tailles d'entréeTraiter des entrées non bornées

Voir Aussi : Pour des techniques détaillées d'écriture de harnais, des modèles pour gérer des entrées complexes, et des stratégies avancées, consultez la compétence technique fuzz-harness-writing.

Compilation

AFL++ offre plusieurs modes de compilation avec différents compromis.

Arbre de Décision du Mode de Compilation

Choisissez votre mode de compilation :

  • Mode LTO (afl-clang-lto) : Meilleures performances et instrumentation. Essayez ceci en premier.
  • Mode LLVM (afl-clang-fast) : Repport si LTO ne parvient pas à compiler.
  • Plugin GCC (afl-gcc-fast) : Pour les projets nécessitant GCC.

Compilation de Base (Mode LLVM)

./afl++ docker afl-clang-fast++ -DNO_MAIN=1 -O2 -fsanitize=fuzzer harness.cc main.cc -o fuzz

Compilation GCC

./afl++ docker afl-g++-fast -DNO_MAIN=1 -O2 -fsanitize=fuzzer harness.cc main.cc -o fuzz

Important : La version de GCC doit correspondre à la version utilisée pour compiler le plugin GCC d'AFL++.

Avec Sanitizers

./afl++ docker AFL_USE_ASAN=1 afl-clang-fast++ -DNO_MAIN=1 -O2 -fsanitize=fuzzer harness.cc main.cc -o fuzz

Voir Aussi : Pour une configuration détaillée des sanitizers, les problèmes courants et les drapeaux avancés, consultez les compétences techniques address-sanitizer et undefined-behavior-sanitizer.

Drapeaux de Compilation

Notez que -g n'est pas nécessaire, il est ajouté par défaut par les compilateurs AFL++.

DrapeauObjectif
-DNO_MAIN=1Ignorer la fonction main lors de l'utilisation du harnais libFuzzer
-O2Niveau d'optimisation de production (recommandé pour le fuzzing)
-fsanitize=fuzzerActiver le mode de compatibilité libFuzzer et ajouter l'environnement d'exécution du fuzzer lors de l'édition de liens de l'exécutable
-fsanitize=fuzzer-no-linkInstrumenter sans lier l'environnement d'exécution du fuzzer (pour les bibliothèques statiques et les fichiers objets)

Gestion du Corpus

Créer un Corpus Initial

AFL++ nécessite au moins un fichier de départ non vide :

mkdir seeds
echo "aaaa" > seeds/minimal_seed

Pour de vrais projets, rassemblez des entrées représentatives :

  • Téléchargez des exemples de fichiers pour le format que vous fuzzez
  • Extrayez des cas de test de la suite de tests du projet
  • Utilisez des entrées valides minimales pour votre format de fichier

Minimisation du Corpus

Après une campagne, minimisez le corpus pour ne garder que la couverture unique :

./afl++ docker afl-cmin -i out/default/queue -o minimized_corpus -- ./fuzz

Voir Aussi : Pour les stratégies de création de corpus, les dictionnaires et la sélection des graines, consultez la compétence technique fuzzing-corpus.

Exécution de Campagnes

Exécution de Base

./afl++ docker afl-fuzz -i seeds -o out -- ./fuzz

Définir des Variables d'Environnement

./afl++ docker AFL_FAST_CAL=1 afl-fuzz -i seeds -o out -- ./fuzz

Interpréter la Sortie

AFL++ rapporte ces statistiques dans les deux cas, mais la façon dont vous les lisez dépend du mode. Le docker run -i du wrapper ne donne pas de TTY au conteneur, donc afl-fuzz abandonne l'interface plein écran et écrit des lignes d'état simples dans le journal à la place — les champs ci-dessous y apparaissent, ainsi que dans state/<instance>/fuzzer_stats. Pour obtenir l'interface interactive, exécutez le mode host dans un terminal, ou ajoutez -t au wrapper pour une exécution que vous surveillez manuellement.

SortieSignification
execs/secVitesse d'exécution - plus c'est élevé, mieux c'est
cycles doneNombre de passages de file d'attente terminés
corpus countNombre de cas de test uniques dans la file d'attente
saved crashesNombre de crashes uniques trouvés
stability% de bords stables (devrait être proche de 100%)

Structure du Répertoire de Sortie

out/default/
├── cmdline          # Comment le SUT a-t-il été invoqué ?
├── crashes/         # Entrées qui font planter le SUT
│   └── id:000000,sig:06,src:000002,time:286,execs:13105,op:havoc,rep:4
├── hangs/           # Entrées qui bloquent le SUT
├── queue/           # Cas de test reproduisant l'état final du fuzzer
│   ├── id:000000,time:0,execs:0,orig:minimal_seed
│   └── id:000001,src:000000,time:0,execs:8,op:havoc,rep:6,+cov
├── fuzzer_stats     # Statistiques de la campagne
└── plot_data        # Données pour le traçage

Analyser les Résultats

Affichez les statistiques de campagne en direct :

./afl++ docker afl-whatsup out

Créez des graphiques de couverture. L'image aflplusplus contient déjà gnuplot-nox ; en mode hôte, installez d'abord gnuplot avec apt install gnuplot.

./afl++ docker afl-plot out/default out_graph/

Ré-exécuter des Cas de Test

Passez l'un des noms de fichiers de out/default/crashes/ :

./afl++ docker ./fuzz out/default/crashes/id:000000,sig:06,src:000002,time:286,execs:13105,op:havoc,rep:4

Options du Fuzzer

OptionObjectif
-G 4000Longueur maximale de l'entrée de test (par défaut : 1 048 576 octets)
-t 1000Délai d'attente en millisecondes pour chaque cas de test (par défaut : 1000 ms)
-m 1000Limite mémoire en mégaoctets (par défaut : 0 = illimité)
-x ./dict.dictUtiliser un fichier dictionnaire pour guider les mutations

Variables d'Environnement Qui Comptent

AFL++ a de nombreuses variables d'environnement, mais la plupart sont de niche. Voici celles qui comptent en pratique.

Toujours Définir Celles-ci

# Chaque campagne devrait utiliser tmpfs — vos SSD vous remercieront, et c'est plus rapide
AFL_TMPDIR=/dev/shm

AFL_TMPDIR est un gain de performance gratuit sans inconvénient — ne pas le définir use votre SSD et ralentit le fuzzing.

Cibles Lentes

# Accélère la calibration d'environ 2,5x — à utiliser quand les cibles sont lentes (par exemple, >10 ms/exec)
AFL_FAST_CAL=1

AFL_FAST_CAL réduit le temps de calibration avec une perte de précision négligeable. Recommandé spécifiquement pour les cibles lentes où la calibration prendrait autrement beaucoup de temps.

Campagnes Multi-Cœur

# Sur l'instance principale (-M) uniquement — nécessaire pour afl-cmin, pas pour le fuzzing lui-même
AFL_FINAL_SYNC=1

# Sur toutes les instances — mettre en cache les cas de test en mémoire (par défaut : 50 Mo, bonne plage : 50-250 Mo)
AFL_TESTCACHE_SIZE=100

AFL_FINAL_SYNC indique à l'instance principale d'effectuer une importation finale de tous les secondaires lors de l'arrêt. Cela n'affecte pas le processus de fuzzing lui-même — cela importe seulement lorsque vous exécutez afl-cmin pour la minimisation du corpus, en s'assurant que la file d'attente du primaire contient le corpus combiné complet. AFL_TESTCACHE_SIZE met en cache les cas de test en mémoire pour réduire les E/S disque ; la valeur par défaut est de 50 Mo et des valeurs entre 50 et 250 Mo fonctionnent bien pour la plupart des campagnes.

Fuzzing CI/Automatisé

# Échouer rapidement si le fuzzing ne trouve rien
AFL_EXIT_ON_TIME=3600  # 1 heure sans nouveaux chemins = arrêt

# Ou exécuter jusqu'à "done" (toutes les entrées de file traitées)
AFL_EXIT_WHEN_DONE=1

# Environnements sans interface graphique
AFL_NO_UI=1

Le fuzzing illimité dans CI gaspille des ressources. Définissez des limites de temps ou utilisez des conditions de sortie.

Variables à Éviter

VariablePourquoi l'éviter
AFL_NO_ARITHPeut nuire à la couverture sur les formats binaires, mais peut être utile pour les cibles textuelles
AFL_SHUFFLE_QUEUEUniquement pour des configurations exotiques, généralement nuisible
AFL_DISABLE_TRIMLa taille est précieuse, ne la désactivez pas sans raison

Fuzzing Multi-Cœur

AFL++ excelle dans le fuzzing multi-cœur avec deux avantages majeurs :

  1. Plus d'exécutions par seconde (évolue linéairement avec les cœurs physiques)
  2. Fuzzing asymétrique (par exemple, un job ASan, le reste sans sanitizers)

Démarrer une Campagne

Démarrez le fuzzer principal (en arrière-plan) :

./afl++ docker afl-fuzz -M primary -i seeds -o state -- ./fuzz 1>primary.log 2>primary.error </dev/null &

Démarrez les fuzzers secondaires (autant que vous avez de cœurs) :

./afl++ docker afl-fuzz -S secondary01 -i seeds -o state -- ./fuzz 1>secondary01.log 2>secondary01.error </dev/null &
./afl++ docker afl-fuzz -S secondary02 -i seeds -o state -- ./fuzz 1>secondary02.log 2>secondary02.error </dev/null &

Le </dev/null est requis, pas décoratif. docker run -i maintient le client lisant sa propre entrée standard, et un processus en arrière-plan qui lit le terminal reçoit SIGTTOU et s'arrête. La redirection depuis /dev/null évite cela. Pour la même raison, les redirections stdout et stderr vers des fichiers sont essentielles, sinon la sortie concurrente des instances interfère.

Vérifiez que tout fonctionne :

docker ps --no-trunc
./afl++ host afl-whatsup state

Arrêtez la campagne :

# Tout arrêter en un geste
kill %1 %2 %3  # ou pkill -f afl-fuzz

Nettoyage :

docker container prune --force

Équilibrer les Travaux Multi-Cœur

Évitez de surcharger le CPU avec trop de fuzzers. Utilisez cette formule comme guide :

Nombre de cœurs = CPU_logiques - 2 (réserve pour l'OS)
Exemple : 16 CPU logiques → 14 cœurs de fuzzing

Survie des Campagnes Multi-Cœur Redémarrées

L'interface d'état d'abandon (afl-fuzz sans -M/-S) ne peut pas être redémarrée : afl-fuzz arrête tous les processus de fuzzing s'il reçoit un signal ou détecte une panne. Utilisez -M/-S pour chaque instance. Pour reprendre une campagne :

./afl++ docker afl-fuzz -M primary -i- -o state -- ./fuzz 1>primary.log 2>primary.error </dev/null &
./afl++ docker afl-fuzz -S secondary01 -i- -o state -- ./fuzz 1>secondary01.log 2>secondary01.error </dev/null &

Remplacer -i seeds par -i- signale à AFL++ d'utiliser la file d'attente existante dans le répertoire d'état plutôt que de redémarrer avec les graines.

Triage des Crashes

Identifier les bugs uniques après une campagne :

# Compter les crashes
find state/default/crashes -type f | wc -l

# Utiliser afl-tmin pour minimiser les crashes
./afl++ docker afl-tmin -i state/default/crashes/id:000000* -o minimized_crash -- ./fuzz

Pour un triage avancé, consultez la compétence technique crash-triage.

Dépannage

ProblèmeSolution
"Hmm, your system is configured to forward tiny cores..."Exécutez afl-system-config comme root
"Fatal Python error: Cannot recover from stack overflow"Augmentez la pile avec ulimit -s 16384
"Unable to load LTO plugin"Vérifiez la compatibilité de version Clang/LLD
Core dump files non créésulimit -c unlimited && echo "/tmp/core.%p" > /proc/sys/kernel/core_pattern

Individual skills in this repo

This repo contains 20 individual skills — each has its own dedicated page.

bg-szy/TOP-SKILLS

Brand-first landing page designer — runs a brand-identity interview (colors, typography, shape language), then generates and iterates on a polished landing page via Stitch with deployment-ready HTML. Use when the user asks to create, design, or build a landing page, homepage, or marketing page and has no established visual direction. Skip when they have a design mockup, need a dashboard or app UI, are working at component level, building a multi-page app, or restyling with known design tokens — use frontend-design instead.

bg-szy/TOP-SKILLS

Fill out Microsoft Azure Landing Zone (ALZ) Accelerator checklists by interviewing the user, mapping their Azure subscriptions, integrating IP addressing documentation, and applying Microsoft Cloud Adoption Framework best practices. Produces a completed Excel checklist (.xlsx) ready for ALZ deployment. Use this skill whenever the user mentions Azure Landing Zone, ALZ checklist, landing zone accelerator, platform landing zone configuration, ALZ bootstrap, hub-and-spoke setup, Azure network topology planning, or wants to fill out any ALZ-related checklist or configuration file. Also trigger when the user uploads an Excel file that contains tabs like "Accelerator - Bootstrap", "Accelerator - Bicep", or "Accelerator - Terraform".

bg-szy/TOP-SKILLS

Compose a premium, animated landing page section by section in Next.js + Tailwind + Motion (Framer Motion) — built on a real design system, with editorial copy and motion that feels human-crafted, not template-generated. Use when building or rebuilding a landing page, marketing site, or hero/feature/pricing/CTA sections that need to look production-ready and bespoke from day one.

bg-szy/TOP-SKILLS

Write high-converting landing page copy using proven frameworks like PAS (Problem-Agitate-Solution), AIDA, and StoryBrand. Creates headlines, value propositions, CTAs, and full page sections optimized for conversion. Use when users need landing page copy, sales page content, or marketing website text.

bg-szy/TOP-SKILLS

Optimize landing pages for conversions, performance, and SEO. Use when improving landing pages, increasing conversions, or optimizing page performance.

bg-szy/TOP-SKILLS

Review investment portfolios for risk, diversification, fees. Asset allocation recommendations, tax-loss harvesting, rebalancing.

bg-szy/TOP-SKILLS

Beads Viewer - Graph-aware triage engine for Beads projects. Computes PageRank, betweenness, critical path, and cycles. Use --robot-* flags for AI agents.

bg-szy/TOP-SKILLS

CI red? Call us. Pipeline fire brigade deploys. Use when user mentions CI failures, build errors, test failures, or pipeline issues. Do NOT load for: local builds, standard implementation work, reviews, or setup.

bg-szy/TOP-SKILLS

CASS Memory System - procedural memory for AI coding agents. Three-layer cognitive architecture with confidence decay, anti-pattern learning, cross-agent knowledge transfer, trauma guard safety system. Bun/TypeScript CLI.

bg-szy/TOP-SKILLS

Mandatory entry point: read this first for any request to make, create, edit, animate, or render a video, animation, or motion graphic, including a promo, explainer, captioned clip, title card, overlay, slideshow or interactive deck, Remotion port, or any HyperFrames HTML composition. Also use it to inspect, diagnose, validate, preview, publish, or batch-render an existing HyperFrames project. Inputs may be a website URL, GitHub PR, Figma design or URL, text or brief, existing footage, or music. It resumes project state, captures intent when applicable, selects and installs the owning workflow, and routes domain capabilities. HyperFrames is the default output framework unless the user explicitly chooses another framework for the deliverable or asks only to record a browser session.

bg-szy/TOP-SKILLS

Expert in building portfolios that actually land jobs and clients - not just showing work, but creating memorable experiences. Covers developer portfolios, designer portfolios, creative portfolios, and portfolios that convert visitors into opportunities.

bg-szy/TOP-SKILLS

Use when the user asks to "pre-launch check the landing page", "run a Quality-Score preflight", or "verify ad-to-page message match before launch"; produces an ad↔page continuity report — message-match gaps, above-the-fold check, page-speed read, form-friction count, mobile-render flags — as a pass/fix punch list. Not for redesigning or rewriting the page — use landing-optimizer; not for scoring the account or the RQS — use ad-account-auditor. 落地页体验预检/广告落地页一致性检查

bg-szy/TOP-SKILLS

Use when the user asks to "optimize our landing page for influencer traffic", "fix our promo-code landing page", or "improve conversion from a creator campaign"; produces a message-match audit, page-structure and social-proof recommendations, a promo-code/CTA conversion plan, and an A/B test roadmap. Not for measuring campaign results after launch — use performance-analyzer.

bg-szy/TOP-SKILLS

Audit a landing page, sales page or checkout page for conversion leaks and return a fix list ordered by expected revenue impact. Use when asked to review, critique or improve a landing page, sales page, opt-in page, product page or checkout flow, when conversion rate is low, when paid traffic is not converting, or when someone asks "why isn't this page converting" or wants a CRO / landing page review.

bg-szy/TOP-SKILLS

Landing page conversion optimization with layout rules, hero section design, and CTA psychology. Covers above-the-fold formula, social proof placement, mobile design, and F-pattern reading. Use for: startup landing pages, product pages, SaaS marketing, conversion optimization. Triggers: landing page, hero section, above the fold, conversion optimization, landing page design, cta button, hero image, landing page layout, saas landing page, product page design, conversion rate, landing page best practices

bg-szy/TOP-SKILLS

Create high-converting, visually distinctive landing pages. Use when building marketing pages, product launches, SaaS homepages, or any single-page conversion-focused website. Guides section-by-section composition with anti-AI-slop principles.

bg-szy/TOP-SKILLS

Landing page conversion optimization with layout rules, hero section design, and CTA psychology. Covers above-the-fold formula, social proof placement, mobile design, and F-pattern reading. Use for: startup landing pages, product pages, SaaS marketing, conversion optimization. Triggers: landing page, hero section, above the fold, conversion optimization, landing page design, cta button, hero image, landing page layout, saas landing page, product page design, conversion rate, landing page best practices

bg-szy/TOP-SKILLS

Account assets, equity and fund positions, P&L, cash flow records, account statements, margin ratios, buy-power estimates, order management, and DCA recurring investments via Longbridge (most require Trade permission). Frameworks: portfolio diagnosis, rebalancing, asset allocation, risk analysis (VaR/CVaR), performance attribution, and tax-loss harvesting. Triggers: "持仓", "账户", "盈亏", "资产", "对账单", "下单", "买入", "卖出", "撤单", "定投", "组合诊断", "再平衡", "资产配置", "风险分析", "绩效归因", "税损收割", "持倉", "賬戶", "盈虧", "對賬單", "下單", "買入", "賣出", "組合診斷", "再平衡", "稅損收割", "positions", "portfolio", "P&L", "order", "buy", "sell", "DCA", "statement", "risk analysis", "rebalancing", "tax harvesting", "我的风险", "持仓风险", "风险敞口", "資產", "資產配置", "風險分析", "績效歸因", "撤單

bg-szy/TOP-SKILLS

Auto-loaded context for Portfolio Buddy 2 development. Use for ANY task involving: React 19 development, TypeScript, portfolio analysis features, metrics calculations, trading strategy comparison, or working with the Portfolio Buddy 2 codebase. Contains tech stack, known issues, and architectural constraints.

bg-szy/TOP-SKILLS

Process video files with audio extraction, format conversion (mp4, webm), and Whisper transcription. Use when user mentions video conversion, audio extraction, transcription, mp4, webm, ffmpeg, or whisper transcription.

Skills associés