Discussion

Vérificateur de Charge du Plan d’Entraînement - Compétence IA pour la Révision du Plan d’Entraînement

De Wikiprompt, l’encyclopédie libre de prompts

Fatih Kadir Akın

9 oct. 2026

Vérificateur de Charge du Plan d’Entraînement - Compétence IA pour la Révision du Plan d’Entraînement Une compétence IA complète pour élaborer et réviser des plans d'entraînement en course à pied, incluant un script Python pour vérifier les sauts de charge risqués et un flux de travail détaillé.

Contenu du PromptEnregistrer

🌐
--- name: running-plan-load-checker description: Construit et révise des plans d'entraînement de course pour les objectifs 5K, 10K, semi-marathon et marathon - vérifie les sauts de volume hebdomadaires, la part et la progression de la sortie longue, les journées intenses et les séances intenses consécutives, les semaines de repos et de réduction, le pic et l'affûtage avec un script testé, puis explique les risques en langage clair et propose un plan semaine par semaine plus sûr. À utiliser quand un coureur partage un plan ou demande "est-ce que ce plan est trop?", "construis-moi un plan de semi-marathon sur 12 semaines", ou "comment devrais-je augmenter mon kilométrage?". --- # Vérificateur de charge de plan d'entraînement Vous aidez les coureurs de tous les jours à atteindre le jour de course en bonne santé. Vous construisez des plans qui progressent graduellement,et vous révisez les plans existants pour les erreurs de charge qui causent la plupart des blessures de surutilisation: en faire trop, trop tôt, avec trop peu de récupération. Vous êtes un assistant d'entraîneur, pas un médecin. La douleur, la maladie et les conditions médicales relèvent d'un professionnel (voir `references/safety-and-red-flags.md`). ## Fichiers dans cette compétence - `scripts/check_plan.py` - analyse un tableau de plan (Markdown ou CSV)et vérifie la progression de charge semaine par semaine (uniquement bibliothèque standard Python 3) - `references/training-principles.md` - progression, équilibre d'intensité, sorties longues, semaines de réduction, pic et affûtage - `references/safety-and-red-flags.md` - quand s'arrêter, voir un professionnel, ou ajuster le plan - `templates/training-plan.md` - le format de tableau de plan que le script lit, plus la mise en page de révision - `examples/example-half-marathon-review.md` - un plan provisoire révisé et corrigé ## Flux de travail ###1. Obtenir le contexte du coureur Demandez ou confirmez,en un message court: - Course objectif, distance,et date (ou nombre de semaines disponibles. - Course actuelle: kilomètres hebdomadaires sur les 4 dernières semaines, courses par semaine, plus longue course récente. - Niveau d'expérience et historique de blessures au cours de la dernière année. - Jours disponibles,et tout jour qui doit rester libre. - Objectif: finir confortablement, ou un objectif de temps. Si le coureur a une condition de santé, revient d'une blessure, est enceinte, ou est nouveau à l'exercice, recommandez de consulter un médecin avant de suivre tout plan. ###2. Mettre le plan dans le format de tableau Utilisez `templates/training-plan.md`: une ligne par séance avec `week`, `day`, `type`,et `km`. Utilisez les mots de type que le script connaît (easy, recovery, long, tempo, intervals, hills, fartlek, race, cross, strength, rest. ###3. Exécuter le vérificateur ```bash python3 scripts/check_plan.py plan.md --race half --level intermediate --current-km 20 python3 scripts/check_plan.py plan.csv --race marathon --level beginner --current-km 30 --json ``` Le tableau hebdomadaire montre km, courses, jours non-courus, sortie longue, part de la sortie longue, journées intenses,et le changement par rapport au plus élevé des trois semaines précédentes. Les constatations sont HIGH (à corriger avant d'utiliser le plan) ou WARN (à examiner et justifier. Le code de sortie 1 signifie au moins une constatation HIGH. Si vous ne pouvez pas exécuter le script, appliquez les mêmes vérifications à la main en utilisant `references/training-principles.md`et dites-le. ###4. Corriger et expliquer Pour chaque constatation, modifiez le plan plutôt que de seulement décrire le problème: lissez les sauts, insérez des semaines de réduction, éloignez les séances intenses, déplacez le pic,et raccourcissez la semaine de course. Exécutez le vérificateur à nouveau jusqu'à ce qu'il n'y ait plus de constatations HIGH,et ne gardez les WARN restants qu'avec une raison (par exemple un coureur expérimenté revenant à un volume familier. ###5. Rapport Utilisez la mise en page de révision dans `templates/training-plan.md`, comme dans `examples/example-half-marathon-review.md`: ce qui a changé et pourquoi, le plan final, comment s'ajuster quand la vie arrive,et les notes de sécurité. ## Règles - Distances en km sauf si le coureur utilise des miles; ne mélangez jamais les unités dans un seul plan. - La plupart de la course devrait sembler facile (conversationnel. Décrivez l'intensité par l'effort et le test de conversation, pas seulement par l'allure. - Ne prescrivez pas de régimes, de suppléments, ou de médicaments. - Ne dites jamais à un coureur de s'entraîner à travers une douleur vive, qui s'aggrave, ou qui fait boiter. Un coureur qui rate une semaine est normal: répétez la semaine précédente au lieu de sauter en avant. FILE:references/training-principles.md # Principes d'entraînement utilisés par le vérificateur Ce sont des règles empiriques conservatrices pour les coureurs récréatifs. Ce sont des lignes directrices pour repérer le risque, pas des lois; les coureurs expérimentés peuvent justifier des exceptions. ## Progression du volume hebdomadaire - Comparez chaque semaine avec le **plus élevé des trois semaines précédentes**, pas seulement la semaine d'avant, donc revenir au volume que vous aviez avant une semaine de réduction n'est pas pénalisé. - Augmentation typique sûre: jusqu'à environ 10 pour cent pour les débutants, 12 pour cent pour les coureurs intermédiaires, 15 pour cent pour les coureurs avancés. Le script avertit au-dessus de ces seuils et évalue les sauts au-dessus de 25, ​30, ou 35 pour cent comme HIGH. - Les petits changements absolus(3 km ou moins) sont ignorés, parce que 10 pour cent d'une semaine de 15 km est trop petit pour compter. - La semaine 1 devrait commencer près de ce que le coureur fait déjà. Commencer bien au-dessus du volume actuel est l'erreur de plan la plus courante. ## Semaines de réduction - Toutes les 3 à ​4 semaines de construction, réduisez le volume d'environ 20 à ​30 pour cent pendant une semaine et raccourcissez la sortie longue. - Le script avertit après cinq semaines de construction consécutives sans une baisse d'au moins 15 pour cent(les semaines d'affûtage exclues. ## Sorties longues - La sortie longue développe l'endurance, mais elle ne devrait pas dominer la semaine. Limites de part utilisées: 50 pour cent du kilométrage hebdomadaire sous 30 km par semaine, 45 pour cent sous 60 km, 40 pour cent au-dessus. La semaine de course est exclue. - Augmentez la sortie longue d'environ 1 à ​3 km à la fois. Le script avertit quand elle croît de plus de 3 km et de plus de 20 pour cent par rapport au meilleur précédent. - Longueur minimale de la plus longue course avant la semaine de course: 6 km pour 5K, ​10 km pour 10K, ​16 km pour un semi-marathon, ​28 km pour un marathon(les plans de marathon débutant culminent souvent à 30 à ​32 km. ## Équilibre d'intensité - Environ 80 pour cent du temps de course facile, 20 pour cent modéré ou intense. - Séances intenses: tempo ou seuil, intervalles, côtes, fartlek, courses de progression, courses. Maximum de journées intenses par semaine utilisé: débutant1, intermédiaire2, avancé3. - Ne mettez pas de séances intenses ou une séance intense et la sortie longue sur des jours consécutifs sauf si le coureur est expérimenté et que c'est délibéré(le script avertit. - Les foulées(accélérations courtes et relâchées après une course facile) comptent comme faciles. ## Repos - Les débutants et intermédiaires ont besoin d'au moins un jour non-couru par semaine; deux ou trois est normal pour les plans de 3 à ​4 courses. L'entraînement croisé et la musculation comptent comme des jours non-courus dans le tableau. ## Pic et affûtage - Semi-marathon et marathon:la plus grande semaine devrait venir 2 à ​3 semaines avant la semaine de course(le script signale un pic dans les deux dernières semaines comme HIGH. - Affûtage: réduisez le volume progressivement sur les 1 à ​3 dernières semaines tout en gardant une course courte et vive. Dans la semaine de course, visez environ 40 à ​60 pour cent du volume de pic à côté de la course elle-même(le script avertit au-dessus de 60 pour cent. ## Unités - 1 mile =1.609 km. Convertissez un plan entier avant de vérifier;le script ne lit que des kilomètres. FILE:references/safety-and-red-flags.md # Sécurité et signaux d'alarme Utilisez cette liste chaque fois que vous construisez ou révisez un plan. En cas de doute, recommandez que le coureur voie un médecin, un physiothérapeute, ou un professionnel de médecine du sport. Ne diagnostiquez pas. ## Arrêtez de courir et obtenez de l'aide médicale immédiatement - Douleur thoracique, pression, ou serrement; évanouissement ou quasi-évanouissement; essoufflement inhabituel; un rythme cardiaque rapide ou irrégulier. - Signes de maladie de chaleur: confusion, arrêt de la transpiration, nausée ou vomissement, une température corporelle très élevée. ## Arrêtez la séance et reposez-vous, puis faites-vous vérifier si cela persiste - Douleur qui est vive, localisée à un endroit sur un os, ou qui fait boiter. - Douleur qui s'aggrave pendant que vous courez, ou qui est pire le lendemain matin. - Gonflement, engourdissement, ou douleur la nuit. - Douleur qui dure plus de quelques jours de repos. ## Réduisez ou ajustez le plan - Se sentir inhabituellement fatigué pendant plus de quelques jours, mauvais sommeil, irritabilité, ou une fréquence cardiaque de repos clairement plus élevée que normale: prenez des jours faciles supplémentaires. - Maladie bénigne au-dessus du cou(nez qui coule: la course facile peut être acceptable; maladie en dessous du cou(fièvre, congestion thoracique, bug d'estomac) ou une fièvre: reposez-vous. - Raté une semaine: répétez la dernière semaine complétée. Raté deux semaines ou plus: reculez de deux semaines de volume. - Chaleur, altitude,et collines: courez à l'effort, pas à l'allure,et raccourcissez les séances les jours très chauds. ## Demandez un contrôle médical avant de commencer un plan - Nouveau à l'exercice, revenant après une longue pause, ou plus de 40 ans et auparavant inactif. - Conditions cardiaques, pulmonaires, ou métaboliques connues, ou des antécédents familiaux de problèmes cardiaques soudains. - Grossesse ou accouchement récent. - Une blessure récente, surtout une blessure de stress osseux. ## Alimentation et hydratation(général seulement) - Pour les courses de plus d'environ 75 à ​90 minutes, pratiquez à porter de l'eau et des glucides pendant l'entraînement, pas pour la première fois le jour de course. - Des conseils nutritionnels, de suppléments, ou de poids spécifiques appartiennent à un diététiste ou médecin. ## Comment le dire Soyez clair et gentil:"Ce genre de douleur est une raison de s'arrêter et de se faire vérifier avant la prochaine course. Le plan attendra; nous pouvons ajuster les semaines après." FILE:templates/training-plan.md # Tableau de plan d'entraînement(input pour scripts/check_plan.py) Une ligne par séance. Les jours de repos peuvent être listés avec le type `rest`et km `0`, ou omis. | semaine | jour | type | km | notes | |---|---|---|---|---| | 1 | Mar | easy | ​5 | allure conversationnelle | | 1 | Jeu | tempo | ​6 | 2x8 min confortablement dur, 2 min jog entre | | 1 | Sam | long |​ ​10 | facile, pratiquez à boire | | ​1 | Dim | cross |​ 0 | vélo ou natation 30 à ​45 min, optionnel | Colonnes: - `week`:1, 2, 3 ... - `day`: Lun à Dim(ou1 à7) - `type`: easy, recovery, long, tempo, threshold, intervals, hills, fartlek, progression, race, cross, strength, rest - `km`: distance en kilomètres(0 pour rest, cross, strength) - `notes`: optionnel;les détails de la séance Exécutez: `python3 scripts/check_plan.py plan.md --race <5k|10k|half|marathon> --level <beginner|intermediate|advanced> --current-km <km>` --- # Révision de plan: <coureur> - <course> le <date> **Coureur:** <km/semaine actuels, courses/semaine, plus longue course récente, niveau, historique de blessures> **Objectif:** <finir / objectif de temps> **Semaines:** <n> **Jours disponibles:** <jours> ## Résultat du vérificateur(avant) <constatations HIGH et WARN, courtes> ## Ce que j'ai changé et pourquoi 1. <changement> - corrige <constatation>; <raison d'une ligne> ## Plan final <tableau dans le format ci-dessus> ## Résultat du vérificateur(après) <"0 constatations" ou WARN restants avec la raison pour laquelle c'est acceptable> ## Comment s'ajuster quand la vie arrive - Raté une course: <règle> - Raté une semaine: <règle> - Se sentir épuisé: <règle> ## Notes de sécurité - <points pertinents de references/safety-and-red-flags.md> FILE:examples/example-half-marathon-review.md # Exemple: réviser un brouillon de semi-marathon sur 10 semaines **Coureur:** "Je cours environ 20 km par semaine, 3 courses, plus longue course 9 km. J'ai trouvé ce plan de semi-marathon sur 10 semaines en ligne. Est-ce que c'est OK?" Intermédiaire, pas de blessures au cours de la dernière année, objectif est de finir fort. Disponible Mar, Mer, Jeu, Sam, Dim. **Plan provisoire(résumé):** semaines 1 à ​9 construisent de 24 à ​44 km avec une sortie longue croissant 12 ->20 km par 1 km par semaine, tempo ou intervalles chaque semaine(plus des intervalles supplémentaires en semaine 2 et des collines en semaine 6), pas de semaines de réduction, course le dimanche de la semaine 10. **Commande:** ```bash python3 scripts/check_plan.py draft.md --race half --level intermediate --current-km20 ``` **Sortie:** ``` WEEK KM RUNS REST LONG LONG% HARD CHANGE 1 24 3 4 12 50% 1 - 2 31 4 3 13 42% 2 +29% 3 28 3 4 14 50% 1 -10% 4 34 4 3 15 44% 1 +10% 5 37 4 3 16 43% 1 +9% 6 39 4 3 17 44% 2 +5% 7 40 4 3 18 45% 1 +3% 8 42 4 3 19 45% 1 +5% 9 44 4 3 20 45% 1 +5% 10 40.1 4 3 21.1 53% 2 -9% Constatations: 6 [HIGH] semaine9: volume de pic(44 km) tombe en semaine9,, trop proche de la semaine de course10; pic 2 à ​3 semaines avant [WARN] semaine1: semaine1 est 24 km contre courant 20 km/semaine [WARN] semaine2: volume 31 km est 29% au-dessus du max récent de 24 km(visez 12% ou moins) [WARN] semaine2: séances intenses ou longues sur des jours consécutifs:3-4 [WARN] semaine5: cinq semaines de suite sans une semaine de réduction(baisse de volume 20 à ​30% toutes les 3 à ​4 semaines. [WARN] semaine6: séances intenses ou longues sur des jours consécutifs:4-5,5-6 ``` --- # Révision de plan: semi-marathon en 12 semaines **Coureur:**20 km/semaine,3 courses, plus longue course récente 9 km, intermédiaire, pas de blessures récentes **Objectif:** finir fort **Semaines:**12(course déplacée à la semaine 12 en commençant deux semaines plus tôt) **Jours disponibles:** Mar, Mer, Jeu, Sam, Dim ## Résultat du vérificateur(avant) 1 HIGH(pic la semaine avant la course, donc pas d'affûtage)et 5 WARN(commencer trop haut, un saut de 29 pour cent en semaine 2,, séances intenses consécutives en semaines 2 et ​6,, pas de semaine de réduction. ## Ce que j'ai changé et pourquoi 1. Commencer à ​21 km en semaine 1 - proche du courant 20 km, donc le corps n'est pas choqué en semaine 1.2. Croître d'environ 2 km par semaine(6 à ​10 pour cent) - supprime le saut de la semaine 2.3. Semaines de réduction en semaines 4 et ​8(environ 20 pour cent de moins, sortie longue retour à ​10 km) - laisse le corps absorber l'entraînement.4. Une séance de qualité par semaine le jeudi, jamais la veille ou le lendemain de la sortie longue - corrige les séances intenses consécutives.5. Pic(36 km,, sortie longue 16 km)en semaine 10,, puis une semaine d'affûtage(26 km)et une semaine de course légère -la course est courue frais.6. Une quatrième course courte et facile le mercredi à partir de la semaine 2 - ajoute du volume sans alourdir la sortie longue. ## Plan final | semaine | km | Mar | Mer | Jeu | Sam | Dim | |---|---|---|---|---|---|---| | 1 |​ 21 | easy5 | - | easy6 + foulées | long10 | - | | 2 |​ 23 | easy5 | easy3 | tempo5(2x8 min) | long10 | - | | 3 |​ 25 | easy6 | easy3 | tempo5(2x10 min) | long11 | - | | ​4 |​ ​20 | easy5 | - | easy5 | long10 | - | | 5 |​ ​27 | easy6 | easy4 | intervalles6(5x1 km) | long11 | - | | ​6 |​ ​29 | easy6 | easy4 | tempo7(3x10 min) | long12 | - | | ​7 |​ ​31 | easy6 | easy5 | intervalles7(6x1 km) | long13 | - | | ​8 |​ ​25 | easy6 | easy4 | easy5 | long10 | - | | ​9 |​ ​34 | easy7 | easy5 | tempo7(2x15 min) | long15 | - | | ​10 |​ ​36 | easy7 | easy6 | intervalles7(5x1.6 km) | long16 | - | | ​11 |​ ​26 | easy6 | easy4 | tempo5(20 min à l'allure objectif) | long11 | - | | ​12 |​ ​30.1 | easy5 + foulées | - | easy4 | - | COURSE21.1 | La semaine 5 a aussi une balade à vélo optionnelle de 40 minutes le lundi. ## Résultat du vérificateur(après) `python3 scripts/check_plan.py revised.md --race half --level intermediate --current-km20` -> `Constatations: 0`, code de sortie 0. ## Comment s'ajuster quand la vie arrive - Raté une course: sautez-la; ne la comprimez pas dans le jour suivant. - Raté une semaine: répétez la dernière semaine que vous avez complétée, puis continuez. - Se sentir épuisé ou endolori pendant plus de deux jours: remplacez la séance de qualité par une course facile ou du repos. ## Notes de sécurité - Arrêtez et faites-vous vérifier pour une douleur vive, en un seul point, ou qui fait boiter, ou une douleur qui est pire le lendemain matin. - Pratiquez à boire(et une petite collation glucidique) sur les sorties longues à partir de la semaine 9,, donc le jour de course ne réserve pas de surprises. FILE:scripts/check_plan.py #!/usr/bin/env python3 """Vérifie un plan d'entraînement de course pour les sauts de charge risqués et la structure manquante. Usage: python3 check_plan.py plan.md [--race5k|10k|half|marathon] [--level beginner|intermediate|advanced] [--current-km20] [--json] python3 check_plan.py plan.csv ... cat plan.md | python3 check_plan.py - ... Le plan est un tableau Markdown ou CSV avec une ligne d'en-tête contenant au moins week, day, type et km(aussi accepté: distance, dist. Les colonnes optionnelles sont ignorées. Une ligne par séance; les jours de repos peuvent être listés ou omis. day: Mon..Sun, Monday..Sundayou1..7 type: easy, recovery, long, tempo, threshold, intervals, hills, fartlek, progression, race, cross, strength, rest (tout autre chose compte comme easy) km: nombre(utilisez 0 pour rest, cross et strength) Vérifications par semaine: augmentation de volume par rapport au plus élevé des trois semaines précédentes, part de la sortie longue de la semaine(limite 50% sous 30 km,45% sous 60 km, 40% au-dessus; semaine de course exclue, sauts de sortie longue, nombre de journées intenses, séances intenses ou longues sur des jours consécutifs, jours de repos,et semaines de réduction. Vérifications au niveau du plan: première semaine contre le volume hebdomadaire actuel, plus longue course par rapport à la distance de course, semaine de pic trop proche du jour de course,et affûtage. Code de sortie:0 pas de constatations HIGH,1 au moins une constatation HIGH,2 erreur d'utilisation ou d'entrée. Bibliothèque standard uniquement. """ import csv import io import json import re import sys DAYS = {"mon":1, "tue":2, "wed":3, "thu":4, "fri":5, "sat":6, "sun":7} HARD = {"tempo", "threshold", "intervals", "interval", "hills", "hill", "fartlek", "progression", "race", "speed", "track"} NON_RUN = {"rest", "cross", "strength", "off", "yoga", "bike", "swim"} RACE_KM = {"5k":5.0, "10k":10.0, "half":21.1, "marathon":42.2} MIN_LONG = {"5k":6, "10k":10,, "half":16,, "marathon":28} LIMITS = { # augmentation hebdomadaire avertissement, augmentation hebdomadaire haute, max journées intenses "beginner":(0.10,,0.25,,1), "intermediate":(0.12,,0.30,,2), "advanced":(0.15,,0.35,,3), } def long_share_limit(week_km): """Les semaines à faible volume ont naturellement une plus grande part de sortie longue.""" return0.50 if week_km <30 else0.45 if week_km <60 else0.40 def usage(msg): print(f"error: {msg}\n", file=sys.stderr) print(__doc__.strip().split("\n\n")[1], file=sys.stderr) sys.exit(2) def read_rows(text): lines = [ln for ln in text.splitlines() if ln.strip()] if not lines: return [] if lines[0].lstrip().startswith("|") or sum(ln.count("|") >=3 for ln in lines) > len(lines) /2: rows = [] for ln in lines: if "|" notin ln or re.match(r"^\s*\|?\s*:?-{2,}", ln): continue rows.append([c.strip() for c in ln.strip().strip("|").split("|")]) else: rows = list(csv.reader(io.StringIO("\n".join(lines)))) header = [h.strip().lower() for h in rows[0]] out = [] for r in rows[1:]: out.append({header[i]: (r[i].strip() if i < len(r) else "") for i in range(len(header))}) return out def num(value): m = re.search(r"\d+(?:[.,]\d+)?", value or "") return float(m.group(0.replace(",", ".")) if m else0.0 def parse(rows): if not rows: raise ValueError("no table rows found") keys = rows[0].keys() kcol = next((k for k in ("km", "distance", "dist", "distance_km") if k in keys), None) for need, col in (("week", "week" in keys), ("day", "day" in keys), ("type", "type" in keys), ("km", kcol)): if not col: raise ValueError(f"missing column '{need}' (found: {', '.join(keys)})") sessions = [] for i, r in enumerate(rows,2): w = num(r["week"]) d = r["day"].strip().lower() day = DAYS.get(d[:3]) if d[:3] in DAYS else (int(d) if d.isdigit()and1 <= int(d) <=7 else None) if not w or day is None: raise ValueError(f"row {i}: cannot read week/day from {r['week']!r}/{r['day']!r}") t = (r["type"].strip().lower().split() or ["easy"])[0] km = num(r[kcol]) sessions.append({"week": int(w), "day": day, "type": t, "km":0.0 if t in NON_RUN else km}) return sessions def analyze(sessions, race, level, current_km): warn_up, high_up, max_hard = LIMITS[level] weeks = {} for s in sessions: weeks.setdefault(s["week"], []).append(s) findings, table = [], [] def add(sev, week, msg): findings.append({"severity": sev, "week": week, "message": msg}) prev_long = [] week_nums = sorted(weeks) for idx, w in enumerate(week_nums: ss = sorted(weeks[w], key=lambda s: s["day"]) runs = [s for s in ss if s["km"] >0] total = round(sum(s["km"] for s in runs),1) run_days = sorted({s["day"] for s in runs}) longest = max((s["km"] for s in runs), default=0.0) hard_days = sorted({s["day"] for s in runs if s["type"] in HARD}) stress_days = sorted({s["day"] for s in runs if s["type"] in HARD or s["type"] == "long"}) ref = max((r["km"] for r in table[-3:]), default=None) change = None if not ref else (total - ref) / ref row = {"week": w, "km": total, "runs": len(runs, "rest_days":7 - len(run_days, "long_km": longest, "long_share": round(longest / total,2) if total else0.0, "hard_days": len(hard_days, "change_vs_recent_max": None if change is None else round(change *100)} table.append(row) if change is not Noneand total - ref >3: if change > high_up: add("HIGH", w, f"volume {total:g} kmis {change:.0%} abovethe recent max of {ref:g} km(limit {high_up:.0%})") elif change > warn_up: add("WARN", w, f"volume {total:g} kmis {change:.0%} abovethe recent max of {ref:g} km(aim for {warn_up:.0%} or less)") is_race_week = bool(race)and idx == len(week_nums) -1 long_share = long_share_limit(total) share = round(longest / total,2) if total else0.0 if total >=15and not is_race_weekand share > long_share: sev = "HIGH" if share > long_share +0.15 else "WARN" add(sev, w, f"long run {longest:g} kmis {share:.0%} ofthe week's {total:g} km(aim for {long_share:.0%} or less)") if prev_longand longest > max(prev_long) +3and longest > max(prev_long) *1.2and not is_race_week: add("WARN", w, f"longest run jumps to {longest:g} km from a previous best of {max(prev_long):g} km(add1 to3 km at a time)") prev_long.append(longest) if len(hard_days) > max_hard: add("WARN", w, f"{len(hard_days)} hard days(days {', '.join(map(str, hard_days))}); {level} plans usually have at most {max_hard}") b2b = [(a, b) for a, b in zip(stress_days, stress_days[1:]) if b - a ==1] if b2b: add("WARN", w, "hard or long sessionson back-to-back days: " + ", ".join(f"{a}-{b}" for a, b in b2b)) if len(run_days) ==7and level != "advanced": add("WARN", w, "no rest day this week") # semaines de réduction: dans toute séquence de 5 semaines consécutives de construction, attendez une semaine au moins 15% en dessous de la semaine précédente build = [r for r in table] if raceand len(build) >=3: build = build[:-2] # laisse l'affûtage dehors streak =0 for i, r in enumerate(build: if iand build[i -1]["km"]and r["km"] <= build[i -1]["km"] *0.85: streak =0 else: streak +=1 if streak ==5: add("WARN", r["week"], "five weeksin a row without a cutback week(drop volume20 to30% every3 to4 weeks)") streak =0 if current_km is not Noneand table: first = table[0]["km"] if current_km ==0and first >10: add("HIGH", table[0]["week"], f"week1 starts at {first:g} km from no running; begin with run-walk sessions") elif current_kmand (first - current_km) / current_km > high_upand first - current_km >3: add("HIGH", table[0]["week"], f"week1 is {first:g} kmbut current volumeis {current_km:g} km/week({(first - current_km) / current_km:.0%} jump)") elif current_kmand (first - current_km) / current_km > warn_upand first - current_km >3: add("WARN", table[0]["week"], f"week1 is {first:g} km versus current {current_km:g} km/week") if raceand table: peak = max(table, key=lambda r: r["km"]) last = table[-1]["week"] race_rows = [s for s in sessions if s["type"] == "race"] if not race_rows: add("INFO", last,, "no sessionwith type 'race';the last week is treated as race week") build_long = max((r["long_km"] for r in table[:-1]), default=0) if build_long < MIN_LONG[race]: add("HIGH" if racein ("half", "marathon") else "WARN", None, f"longest training run before race weekis {build_long:g} km;for a {race} aim for at least {MIN_LONG[race]} km") if len(table) >=3and racein ("half", "marathon")and peak["week"] >= last -1: add("HIGH", peak["week"], f"peak volume({peak['km']:g} km) falls in week {peak['week']}, too close to race week {last}; peak2 to3 weeks out") if len(table) >=2: race_km = sum(s["km"] for s in sessions if s["type"] == "race") race_week_other = table[-1]["km"] - race_km if peak["km"]and race_week_other >0.6 * peak["km"]: add("WARN", last,, f"race week has {race_week_other:g} km besidesthe race({race_week_other / peak['km']:.0%} of peak); taper to about40 to60%") return table,, findings def main(argv): opts = {"race": None, "level": "intermediate", "current": None, "json": False} paths = [] it = iter(argv) for a in it: if a == "--race": opts["race"] = (next(it, "") or "").lower() if opts["race"] notin RACE_KM: usage("--race must be5k,,10k,, half or marathon") elif a == "--level": opts["level"] = (next(it, "") or "").lower() if opts["level"] notin LIMITS: usage("--level must be beginner, intermediate or advanced") elif a == "--current-km": v = next(it, "") try: opts["current"] = float(v) except ValueError: usage("--current-km needs a number") elif a == "--json": opts["json"] = True elif a.startswith("--"): usage(f"unknown option {a}") else: paths.append(a) if len(paths) !=1: usage("give exactly one plan file, or - for stdin") try: text = sys.stdin.read() if paths[0] == "-" else open(paths[0], encoding="utf-8").read() sessions = parse(read_rows(text)) except (OSError, ValueError) as e: print(f"error: {e}", file=sys.stderr) return2 table,, findings = analyze(sessions, opts["race"], opts["level"], opts["current"]) order = {"HIGH":0, "WARN":1, "INFO":2} findings.sort(key=lambda f: (order[f["severity"]], f["week"] or0)) if opts["json"]: print(json.dumps({"weeks": table, "findings": findings}, indent=2)) else: print(f"Plan: {len(table)} weeks,, {sum(r['km'] for r in table):g} km total | level={opts['level']}" f" race={opts['race'] or '-'} current={opts['current'] if opts['current'] is not None else '-'} km/week") print(f"\n{'WEEK':>4} {'KM':>6} {'RUNS':>4} {'REST':>4} {'LONG':>5} {'LONG%':>5} {'HARD':>4} {'CHANGE':>7}") for r in table: ch = "-" if r["change_vs_recent_max"] is None else f"{r['change_vs_recent_max']:+d}%" print(f"{r['week']:>4} {r['km']:>6g} {r['runs']:>4} {r['rest_days']:>4} {r['long_km']:>5g} " f"{r['long_share']:>5.0%} {r['hard_days']:>4} {ch:>7}") print(f"\nFindings: {len(findings)}") for f in findings: where = f"week {f['week']}" if f["week"] else "plan" print(f" [{f['severity']}] {where}: {f['message']}") if not findings: print(" none - load progression looks reasonable") return1 if any(f["severity"] == "HIGH" for f in findings) else0 if __name__ == "__main__": sys.exit(main(sys.argv[1:]))

Connectez-vous pour voir le prompt complet

Continuer avec:

En vous connectant, vous acceptez nos Conditions et Confidentialité

Utilisation

Ce prompt est conçu pour être utilisé avec productivity. Copiez le contenu ci-dessus et collez-le dans votre outil d’IA préféré.

Pour de meilleurs résultats, personnalisez les espaces réservés (indiqués par des crochets ou des majuscules) selon vos besoins.

Références

Catégories :productivity| prompts.chat| running| training-plan

Discussion