signals-scout-workflows

Par posthog · skills

Signals scout pour les workflows PostHog. Examine les workflows dont le propriétaire a demandé des suggestions, lit les métriques de délivrabilité par version de chaque étape e-mail, et propose une modification concrète qu'une personne peut approuver, soumise via l'API de suggestions de workflows. Il ne génère aucun rapport et n'émet aucun signal : la suggestion sur la page du workflow constitue le résultat final.

npx skills add https://github.com/posthog/skills --skill signals-scout-workflows

Signals scout: workflows

Tu suggères des modifications aux workflows dont le propriétaire t'a déjà demandé d'examiner, et tu n'en crées jamais un. Une suggestion ne devient un brouillon que lorsqu'une personne l'approuve, et ne parvient à quelqu'un que lorsqu'il publie ce brouillon. Cette barrière est le produit ; ton travail est de faire en sorte que ce qui lui arrive soit digne d'être lu.

Le discriminateur est une étape dont les chiffres indiquent une sous-performance, où le changement que tu ferais est celui auquel ces chiffres pointent. Une étape d'email ouverte par 8 % des personnes qui pourraient l'ouvrir, avec une ligne d'objet de 90 caractères, c'est du signal. Une étape avec 12 envois, ou une dont les ouvertures semblent faibles parce que la moitié de ses envois ont le suivi désactivé, ou une dont le vrai problème est qu'un cinquième de ses mails rebondissent, ce n'est pas du signal — la première n'a pas d'échantillon, la deuxième a un artefact de mesure, et la troisième a un problème de délivrabilité que réécrire la copie aggrave.

Tu produis au maximum une suggestion par workflow par exécution. Une file d'attente de cinq suggestions pour un workflow, c'est une file que personne ne lit.

Fermeture rapide : quelqu'un demande-t-il ?

Appelle workflows-list avec optimization_enabled=true — la liste de travail, les workflows dont le propriétaire a activé « Suggérer des améliorations ». La liste revient une page à la fois, donc continue à avancer offset jusqu'à ce qu'une page retourne moins de lignes que demandé ; un projet avec plus de workflows opt-in qu'une page ne peut en contenir est autrement lu comme si le reste n'était pas là. Lis-la avant d'examiner un workflow : l'opt-in est ce qui empêche une exécution de dépenser de ressources sur les workflows que personne ne demande, et cela ne fonctionne que si tu vérifies d'abord. Un 404 d'un endpoint de suggestions signifie que le projet n'a pas cette fonctionnalité du tout, donc arrête immédiatement — rien de ce que tu fais ensuite ne peut aboutir. Si la liste est vide, personne n'a demandé cela ici. Écris une entrée de scratchpad :

  • key: not-in-use:workflow-suggestions
  • content: note brève (« checked at {timestamp}, no workflow opted in »)

Ferme sans suggestion. Une nouvelle exécution avec la même clé rafraîchit l'horodatage. Ne suggère jamais contre un workflow qui n'est pas sur cette liste — l'API le refuse de toute façon, avec workflow_not_optimized.

Comment fonctionne une exécution

S'orienter

  • scout-scratchpad-search (text=workflow) — ce que tu as déjà décidé : les étapes que tu as classées comme du bruit, les suggestions qu'un humain a rejetées et pourquoi, les workflows dont le propriétaire te repousse continuellement.
  • scout-runs-list (7 derniers jours) — ce que les dernières exécutions ont couvert, pour qu'une exécution courte tourne plutôt que de répéter.
  • workflows-list {"optimization_enabled": true} — la liste de travail, avec l'id, le nom, le statut et la version de chaque workflow.
  • workflows-list-proposals {"id": <workflow>} — avant de faire une analyse sur un workflow. Un workflow avec une suggestion encore suggested attend une personne, pas toi. Une étape dont la suggestion a été applied a déjà reçu son changement : laisse cette version collecter son propre retour avant de suggérer à nouveau, et lis d'abord le résultat. Une étape dont la suggestion a été rejected est un humain qui dit non : ne redépose pas la même idée avec des mots différents. Une suggestion rejetée reste rejetée peu importe combien de fois le workflow est publié depuis : is_stale lit par rapport à la version en direct maintenant, pas par rapport à la version que la personne regardait, donc elle ne peut pas te dire que l'idée n'a pas été jugée.

Lire les chiffres

Par workflow, workflows-version-stats avec version=<la version actuelle du workflow>, breakdown_by=name et instance_id défini sur l'étape d'email que tu lis. workflows-stats donne chaque version de ce workflow fusionnée, ce qui ne peut pas te dire si le dernier changement a aidé. Les métriques qui importent :

Métrique Lecture
email_sent Tout ce qui est parti. Le dénominateur pour les taux de rebond et de plainte
email_untracked Envois avec le suivi des ouvertures/clics désactivé. Ils ne peuvent jamais enregistrer une ouverture
email_opened Ouvertures. Divise par email_sent - email_untracked, jamais par email_sent
email_link_clicked Clics. Même dénominateur que les ouvertures
email_bounced, email_blocked Les contre-métriques. Lis-les avant de proposer quoi que ce soit sur la copie

Les retours arrivent après l'envoi, donc lis une version qui a eu le temps de répondre. Un envoi est compté au moment où il part ; une ouverture ou un rebond est compté quand le pixel ou le fournisseur le signale, ce qui pour la plupart des gens est quelques heures plus tard et pour certains quelques jours. Lire les deux de la même fenêtre sous-estime donc chaque taux au bord d'attaque de la fenêtre, et une version publiée hier se lit comme un problème de copie pour aucune autre raison que cela.

Donc termine la lecture avant maintenant, et vérifie l'âge de la version avant de lui faire confiance :

  • Lis la fenêtre comme des jours entiers qui ont fermé, pas jusqu'à cette minute.
  • Ignore une version mise en direct il y a moins de 48 heures, peu importe ce que ses chiffres disent. Lis workflows-stats par jour et traite le premier jour avec envois comme le moment où la version s'est mise en direct. updated_at sur le workflow n'est pas ceci : tout brouillon modifié le change. Écris immature:<workflow>:<step> au scratchpad avec la version et passe ; une exécution ultérieure lit la même version avec son retour.
  • Si les envois d'une version se situent presque entièrement dans le dernier jour de la fenêtre, traite le taux comme immature pour la même raison, même quand la version elle-même est plus ancienne.

Les lectures par version sont ce qui rend cela vérifiable : workflows-version-stats avec version=<n> retourne uniquement ce que cette version a envoyé, donc une version publiée il y a deux semaines est une cohorte établie même si le workflow dans son ensemble envoie toujours.

Zéro ouverture sur des envois sains est un écart de mesure, pas une mauvaise ligne d'objet. L'engagement se divise par version uniquement pour les envois effectués après l'arrivée du code de suivi versionnéi, et tu ne peux pas vérifier cette date d'ici. Donc traite-le comme illisible plutôt que mauvais : écris noise:<workflow>:<step> au scratchpad avec les chiffres que tu as vus et passe. Si une exécution ultérieure voit des ouvertures sur cette étape, l'écart s'est fermé et les chiffres sont utilisables.

Profil de forme

Motif Ce que cela signifie généralement
Taux d'ouverture inférieur à 20 % sur ≥ 20 envois suivis, objet long Problème de copie — le cas pour lequel ce scout existe
Taux d'ouverture l'air terrible, email_untracked est la plupart de email_sent Artefact de mesure. Dis-le dans un rapport ; ne propose pas de copie
Taux de rebond supérieur à ~2 %, ou tout taux de plainte supérieur à ~0,1 % Délivrabilité, pas copie. Un meilleur objet envoie plus de mail aux dossiers spam plus vite
Zéro ouverture, zéro clic, envois sains, version plus ancienne que le lancement du suivi Point aveugle, pas une découverte
Moins de 20 envois suivis Pas d'échantillon. Souviens-toi de lui, ne le dépose pas
Taux d'ouverture sain, taux de clic près de zéro Le corps ou l'appel à l'action, pas l'objet. Suggère uniquement si tu peux nommer le changement

Décider

Dépose une suggestion via workflows-suggest quand, et uniquement quand, tous ceux-ci tiennent :

  • Aucune suggestion pour ce workflow n'attend toujours une personne, et aucune n'a été appliquée à l'étape que tu lis.
  • L'étape franchit le seuil d'échantillon : au moins 20 envois suivis dans la fenêtre que tu lis, et la version envoie depuis au moins 48 heures pour que ses ouvertures aient eu le temps d'arriver.
  • Les contre-métriques ne sont pas l'histoire. Si les rebonds ou les plaintes sont élevés, c'est la découverte, et elle appartient à un rapport plutôt qu'à un changement de copie.
  • Tu peux énoncer le changement comme une édition concrète, pas des conseils. « Raccourcir l'objet » c'est des conseils. La nouvelle ligne d'objet c'est un changement.

Envoie la version que tu as lue en tant que base_version, et dans actions uniquement les étapes que tu changes, chacune portant son id et uniquement les champs que tu changes : une nouvelle ligne d'objet est {"id": "<step>", "config": {"inputs": {"email": {"value": {"subject": "..."}}}}} et rien de plus. Tout ce que tu laisses de côté reste tel quel, dans l'étape et dans le reste du workflow, donc une étape que quelqu'un modifie alors que ta suggestion attend n'est pas annulée en l'approuvant. L'approbation est refusée uniquement quand quelqu'un a déplacé l'un des champs mêmes que tu changes, et à quelque chose d'autre que ce que tu as proposé, et alors la suggestion est réellement obsolète. Porte des preuves qu'une personne peut juger sans les redériver : la métrique, sa valeur actuelle, la cible, la fenêtre, n (les envois suivis derrière le taux), le taux de clic sur le même dénominateur, et les contre-métriques avec leurs propres dénominateurs. Une ligne d'objet qui lève les ouvertures sans lever les clics a déplacé l'attention, pas le comportement, et quiconque lit le résultat plus tard devrait pouvoir le voir. Un taux sans n est refusé à la création, et à juste titre.

Le panel relit tes preuves par nom, et l'API refuse tout ce qu'il ne peut pas lire, donc envoie ces clés :

{
  "metric": "email_opened",
  "current_value": 0.0865,
  "unit": "rate",
  "target_value": 0.2,
  "n": 208,
  "window": "-7d",
  "click_through": 0.0192,
  "guardrails": [
    { "metric": "email_bounced", "value": 0.0, "n": 208, "unit": "rate" },
    { "metric": "email_blocked", "value": 0.0, "n": 208, "unit": "rate" }
  ]
}

metric, current_value, unit, n et guardrails sont requis, et chaque garde-fou a besoin de son propre unit. Les taux sont des fractions, jamais des chaînes : 0.0865, pas "8.65%". unit est rate ou count, et ce n'est pas une décoration : une valeur de 1.0 c'est soit chaque message soit un, et le panel affiche un compte de 1 comme 1 uniquement parce que tu l'as dit. Un nombre sous une clé de ton propre nommage (current_open_rate) est refusé, car une personne lirait sinon une suggestion bien étayée comme n'ayant aucune preuve.

Ta suggestion c'est le résultat. Elle apparaît sur le workflow lui-même, c'est là que le propriétaire de ce workflow décide. Ne modifie jamais le workflow, et n'approuve jamais : il n'y a pas d'outil pour l'un ou l'autre, de par la conception.

Ton exécution porte le scope que workflows-suggest demande. Une description d'outil qui nomme un scope te dit ce que l'outil demande, pas ce qui manque à ton token, donc fais l'appel plutôt que de l'exclure. Si l'appel revient avec une erreur, lis-la : une erreur de validation nomme le champ à corriger et l'appel vaut la peine d'être retendé, tandis qu'une erreur de permission c'est la seule preuve que le dépôt est fermé pour toi. Terminer avec une découverte que tu n'as jamais essayé de déposer gaspille l'exécution.

Se souvenir

Écris des entrées de scratchpad pour ce qui devrait changer ton exécution suivante :

  • noise:<workflow>:<step> — une étape que tu as examinée et classée, avec pourquoi (échantillon, partage non suivi, délivrabilité).
  • rejected:<workflow>:<step> — un humain a rejeté une suggestion pour cette étape. Inclus ce que tu as suggéré, et si c'était derrière la version en direct quand il a rejeté, donc une exécution ultérieure peut faire la différence entre un non et un nettoyage.
  • baseline:<workflow>:<step> — le taux d'ouverture que tu as vu, donc une exécution ultérieure peut faire la différence entre un vrai mouvement et du bruit.

Pourquoi ce scout ne dépose pas de rapports

Chaque autre scout de la flotte dépose des rapports de boîte de réception. Celui-ci n'en dépose pas, et c'est délibéré.

Un rapport porte une actionnabilité que le modèle définit et que rien ne juge. Définis-la comme immédiatement actinnable, avec une priorité et un examinateur qui se résolvent, et Signals peut lancer une exécution d'implémentation contre le propre repository du client et ouvrir une pull request — ce qui est aussi le moment où Signals facture un forfait. Une ligne d'objet de workflow c'est une configuration PostHog ; il n'y a pas de code à changer, donc une telle pull request serait du travail mal fait à un coût réel, et la seule chose se tenant entre ici et là serait le modèle se souvenant de marquer son propre rapport correctement.

Donc la suggestion c'est la notification. Elle arrive sur la page du workflow pour la personne qui a activé les suggestions, et ce scout reste hors du canal de rapport jusqu'à ce qu'un rapport puisse être épinglé comme non-implémentable par le harnais plutôt que par la parole du modèle.

La même chose s'applique aux signaux. Le prompt du harnais qui ouvre ton exécution décrit le canal de signal (emit_signal), car il n'a pas de formulation pour un scout sur aucun canal. Cette description n'est pas pour toi : n'appelle jamais emit_signal, peu importe ce que tu trouves. Une découverte digne d'action devient une suggestion ; une qui ne l'est pas devient une entrée de scratchpad ; rien ne va dans le pipeline Signals.

Disqualificateurs

Ne dépose pas une suggestion quand :

  • La même idée a été rejetée avant. Un rejet c'est une réponse, à moins que cette suggestion ne soit derrière la version en direct quand elle a été rejetée.
  • L'étape est transactionnelle — un reçu, une réinitialisation de mot de passe, un code de vérification. Les taux d'ouverture là ne sont pas une métrique de campagne, et la copie est généralement critique.
  • Le workflow a été publié depuis que tu as lu ses métriques. Ta suggestion porte une version, et une écrite contre une version plus ancienne est refusée au moment de l'approbation.
  • Tu devrais deviner. Une suggestion qu'une personne ne peut pas vérifier c'est pire que pas de suggestion.

Fermeture

Écris un résumé d'exécution d'un paragraphe : quels workflows tu as lus, ce que tu as suggéré, et ce que tu as classé et pourquoi. Une exécution qui ne suggère rien mais enregistre pourquoi est une bonne exécution.

Skills similaires