Admin encoding workflow
Comment encoder les effets des cartes One Piece TCG depuis la file d'attente admin, publier en catalogue public, et gérer les anomalies.
Ce guide s'adresse à l'encodeur : la personne qui transforme le seed brut Bandai (nom, coût, power) en données structurées exploitables par le moteur IA et le validateur de deck.
Vue d'ensemble
Le workflow vit dans /admin/encoding-queue. Chaque carte traverse 3
états explicites :
| Statut | Visible publique ? | Notes |
|---|---|---|
pending | ❌ | État initial du seed. ~3000 cartes à encoder. |
encoded | ❌ | Brouillon enregistré. Reprise possible. |
published | ✅ | Apparaît dans le catalogue public + l'IA peut s'en servir. |
rejected | ❌ | Anomalie identifiée. Reste en base pour audit. |
Le passage encoded → published exige que effectSummary.en soit non
vide (règle IP : nos mots, jamais le texte Bandai verbatim).
Encoder une carte
/admin/encoding-queue→ trie parreleasedAt DESC(les sets récents OP15/OP16 d'abord).Clic Encoder → sur une ligne en
pending.Remplir :
- Keywords : cocher ce qui s'applique (rush, blocker, on_play, …).
- Effects : un bloc par effet. Pour chaque bloc :
Trigger: quand l'effet se déclenche (on_play,when_attacking,permanent, …).Cost: ressource consommée (rest_self,trash_n_cards,don_x2, …).Action: ce que l'effet fait (draw_n_cards,ko_target,give_power_target, …).Target: cible (leader_opp,character_self,all_characters, …).Params: JSON libre pour les valeurs numériques ({"amount": 2},{"power": 1000}).
- Summary :
EN(obligatoire à la publication) : 1 phrase paraphrasée. Pas le texte Bandai. Limite 280 caractères.FR/JP: traductions optionnelles.
Sauver brouillon (Ctrl+S) : carte passe en
encoded, tu peux reprendre plus tard.Publier (Ctrl+Enter) : valide Zod + bascule en
published.
Raccourcis clavier
| Raccourci | Action |
|---|---|
Ctrl+S (ou Cmd+S) | Sauver brouillon |
Ctrl+Enter | Publier (équivalent au bouton Publish) |
Tab | Navigation entre les champs du form |
Rejeter une carte
Pour les doublons scrape, fausses cartes, ou erreurs seed à investiguer.
- Sur la page de la carte, Reject.
- Saisir une raison non-vide dans le prompt (conservée dans
adminAuditLog). - La carte passe en
rejected. Reste invisible côté public.
Voir le JSON debug
Toggle JSON en haut de la page. Affiche le payload final
effectsEncoded en read-only. Utile pour vérifier la cohérence avant
publication.
FAQ
Que faire si une carte a un effet ambigu ?
Cas typiques :
- Effet conditionnel ("if your leader is …") : encode l'effet
principal, mets la condition dans
paramsou dans le résumé EN. - Effet inédit (un keyword Bandai qu'on n'a jamais vu) :
- Ouvre une PR séparée
feat(effect-vocab): add <key>qui ajoute la valeur dansconvex/cards/effectVocabulary.ts. - Reviens sur la carte une fois la PR mergée.
- Ouvre une PR séparée
- Effet ambivalent (peut s'interpréter de 2 façons) : choisis l'interprétation la plus restrictive, documente l'autre dans le résumé.
Une carte est bannie / restrictée — dois-je dépublier ?
Non. La carte reste published (catalogue) ; sa legality.status
passe à banned ou restricted via la page /admin/ban-list.
Les decks contenant la carte deviennent automatiquement isValid: false
et l'owner reçoit un email (feature 04 propagation).
J'ai publié, puis je veux modifier l'encodage
Le workflow V1 ne permet pas d'éditer une carte published. Si l'erreur
est grave :
- Reject la carte (audit row).
- Re-seed la carte côté script (les données factuelles : nom, coût, power viennent du seed, pas de l'encodeur).
- La carte re-passe en
pending. Re-encode.
Plus tard une feature "édition de cartes publiées" pourra arriver.
Ça plante quand je publie
Cas connus :
- "effectSummary.en is required" : remplis le résumé EN. Si tu veux juste sauver un brouillon : utilise Sauver brouillon (pas Publish).
- "Unknown vocab value" : tu as tapé une valeur de trigger / cost / action / target qui n'existe pas. Le form a un dropdown, ne tape jamais à la main.
- Erreur Zod cryptée : retoogle "Voir le JSON" pour inspecter le payload, le path Zod dans le message t'indique le champ fautif.
Comment marche pnpm admin:grant ?
Pour promouvoir un utilisateur au rôle admin sur la plateforme. Le premier admin doit être créé en CLI parce que personne n'est encore admin pour cliquer dans l'UI.
CONVEX_DEPLOY_KEY="<key>" pnpm admin:grant alice@example.com
# ou pour révoquer
CONVEX_DEPLOY_KEY="<key>" pnpm admin:grant alice@example.com --revokeLe script lit CONVEX_DEPLOY_KEY → derive l'URL du deployment →
appelle internal.admin.promoteAdmin.promoteUserToAdminByEmail. Idempotent.
Une fois admin, l'utilisateur peut grant le plan creator depuis
/admin/users/$userId (onglet Plan TCG) à d'autres utilisateurs.
Architecture & limites V1
- Pas de workflow 4-yeux (solo dev) : 1 admin encode et publie seul.
- Pas d'historique versionné des éditions (cartes
publishedsont figées). Voir backlog "cardEncodingHistory" V2. - Pas de bulk encoding (1 carte à la fois). Les ~3000 cartes seront encodées progressivement, en priorité celles des sets récents.
- Vocabulaire
effectsEncoded: 7 triggers / 8 costs / 12 actions / 13 targets (couverture estimée ~90% OP01→OP16). Ajout d'une valeur = PR dédiéefeat(effect-vocab): add <key>.