Skip to content

[EPIC] Datastudy consommation flotte - dashboard, series temporelles multi-lanes, dettes et leviers #116

Description

@jsboige

EPIC parapluie — Datastudy consommation flotte : dashboard, séries temporelles multi-lanes, dettes & leviers

Mandat (user, 15/09) : « élargir en un vrai travail de datascience qui doit viser la constitution d'un dashboard avec graphiques et interprétations pour nous expliquer, en utilisant les métriques des différents workspaces des projets communs (traffic, issues, merges, diff LOC, nb messages, nb appels d'outils, LOC des commentaires d'issues, des reviews, verbosité générale etc.) et ceux spécifiques aux projets (messages nanoclaw/hermes, nb Notebooks / nb de lignes ajoutées ou supprimées spécifiquement aux notebooks…). Il me semble que si tu collectes le max de données dans le temps, tu devrais avec les bons outils […] pouvoir conduire l'investigation sur les dettes qu'on paye, et les leviers d'amélioration de nos perf et de nos coûts. »

Deuxième mandat, même jour — le modèle de coût et le point d'arrivée décisionnel (§4bis et P5) : « on devrait avoir une idée de ce que le token coûte réellement pour nos souscriptions » … « cibler les crons idéaux avec les protocoles de coordination optimaux, pour chaque projet, et donc décider ceux qu'on ralentit car leur veille ne produit pas de nouveauté intéressante. »

Issue parapluie : elle englobe #41, #60 et #102 (liées en sub-issues), ainsi que les épics roo-extensions qui touchent la même chaîne (#3647, #1980, #1997, #2336, #3293, #3381, #3111). Elle ne les remplace pas : elle porte le livrable commun (le dashboard + ses interprétations) et la boucle de mesure qui les alimente tous.

Marquage des affirmations : [M] mesuré (chiffre reproductible, source citée) · [I] inféré · [?] non tranché.


1. Pourquoi un parapluie, et pourquoi maintenant

Trois constats mesurés cette semaine rendent la fragmentation coûteuse :

  1. [M] Les organes de mesure ne regardent que ~4 % du trafic. La lane native (facturée Anthropic) est la seule instrumentée en profondeur (native-consumption.py, native-trend.py, billed-attrib.py) — or elle ne représente plus que 4,27 % des réponses servies au 14/09 (contre 14,79 % au 08/09). Toute conclusion tirée des organes actuels est une conclusion sur la queue de la distribution.
  2. [M] Le poste de coût a changé de nature sans que personne ne le voie venir. Sur les archives du hub, openai-deepseek-flash (PAYG, facturé à l'usage) passe de 0 réponse le 08/09 à 13 103 le 13/09, pendant que le volume total reste plat (~19 k → ~34 k réponses/jour). Le PAYG n'est plus un appoint : c'est une lane de premier plan.
  3. [M] Il n'existe aucun prix local. pricing-cache.json est absent de po-2025 et all-models.json (358 entrées) ne porte aucun champ pricing → nous ne pouvons pas calculer notre propre coût, seulement lire des consoles fournisseur qui ne sont ni par-machine ni par-workspace. C'est le blocage n°1 du dashboard.

Aucune de ces trois choses n'appartient à un seul des épics existants. Le parapluie est le lieu où elles se rejoignent.

2. Baseline mesurée (point de départ de toutes les séries)

2.1 Matrice lane × jour — archives hub G:\Mon Drive\Backups-Cloud\claudish\captures-*.7z [M]

lane 09-08 09-09 09-10 09-11 09-12 09-13 09-14
openai|glm-5.3 10 537 10 664 8 222 7 986 9 437 10 522 10 949
anthropic|MiniMax-M3 9 213 7 711 7 257 8 695 10 675 6 027 7 785
openai|deepseek-flash (PAYG) 0 0 825 9 017 9 775 13 103 10 552
native (Anthropic) 4 351 1 477 0 3 881 3 314 1 494 1 362
openai|deepseek-v4-flash-vision-exp 4 681 422 120 0 0 0 0
anthropic|deepseek-v4-flash-0731 0 2 149 2 015 0 0 0 0
openai|glm-5.2 631 1 579 970 688 997 782 735
autres (≤305/j) 0 813 6 0 0 204 515
TOTAL 29 413 24 815 19 415 30 267 34 198 32 132 31 903
part native 14,79 % 5,95 % 0 % 12,82 % 9,69 % 4,65 % 4,27 %

⚠ Les sept jours d'archive sont muets sur la lane Sol (responses-gpt-5.6-sol) — non par choix, mais par bug de capture, corrigé le 14/09 21:42Z (#90). Voir §5.2 : toute courbe Sol doit démarrer après cette date.

2.2 Tokens par lane — 15/09 (journée partielle, captures non compactées) [M]

lane n IN OUT cache_read
openai|glm-5.3 6 953 736 161 700 6 326 788 196 226 240
openai|deepseek-flash (PAYG) 6 503 42 287 883 6 034 777 964 385 408
anthropic|MiniMax-M3 4 848 27 760 363 1 679 158 714 480 121
anthropic|k3 2 315 9 190 013 672 439 257 938 760
openai|qwen3.6-35b-a3b 595 30 496 1 752 398 0
responses-gpt-5.6-sol 585 109 150 237 815 495 0
openai|deepseek-v4-pro 75 14 594 521 69 071 0
native 78 15 462 306 510 15 201 780
openai|glm-5.2 269 18 593 621 157 955 6 088 128
TOTAL 22 222 957 784 378 17 814 646 —

OUT moyen par réponse : 802 tokens.
Trois faits à retenir : (a) le PAYG DeepSeek lit 964 M tokens de cache — il n'est pas un appoint, il porte la mémoire chaude du parc ; (b) la lane Sol brûle 109 M d'input sans un seul token de cache (#115) ; (c) n plat avec OUT ×4,5 à n comparable (09-09 : n=1 476 / 2,09 M OUT vs 09-13 : n=1 494 / 9,42 M OUT) → l'inflation est dans ce que le modèle écrit, pas dans le nombre d'appels.

2.3 Ce que la flotte produit (dénominateur du coût) [M]

  • Merges CoursIA : juillet ≈ 124/j → 4 dernières semaines ≈ 97/j (−22 %) — le coût a monté pendant que le débit baissait.
  • Coût par merge : ×8,6 entre juillet et le 13/09 ([CONSO] Coût par merge ×8,6 — la coordination est passée du merge à l'audit (juillet → septembre) #102).
  • Merges roo-extensions : 230 sur 14 jours (~16/j) · claudish : 28.
  • claudish 15/09 seul : 7 merges, +18 839 / −1 107 lignes, 156 fichiers.
  • Rétention des captures : juin 0,7 Go → juil. 2,5 → août 4,6 → sept. 3,6 Go en 16 jours (≈ ×2/mois). D:\claudish-captures : 47 457 fichiers / 13,7 Go.

2.4 Instruments déjà livrés (à réutiliser, pas à réécrire) [M]

Instrument Ce qu'il répond
scripts/traffic-consumption.py Phase 1 de #41 déjà livrée : rollup lane × bucket (cron/interactive/agent-sdk/other), cache hit-rate, débit/h
scripts/traffic-mxws.py machine × workspace × modèle (req/resp appariés par (day, reqN))
scripts/harness-injection-measure.py coût réel du bloc harnais injecté (6 pièges documentés)
scripts/native-consumption.py · native-trend.py · billed-attrib.py lane native : attribution, dérive, facture
scripts/per_action.py · tool_mix.py · cmd_intent.py décomposition par action, mix d'outils, bascule merge→audit
scripts/harness-mcp-audit.py · harnesscmp.py serveurs MCP déclarés vs appelés ; cohorte verbeuse vs frugale
MCP claudish_traffic (#72) lecture temporelle fiable, gap-déclarative
scripts/compress-captures.ps1 · claudish-watchdog.ps1 · claudish-drain.ps1 rétention 7z, santé, redémarrage drainé

3. Les métriques à collecter

3.1 Socle commun (toutes les workspaces)

Axe Métrique Source naturelle État
Volume réponses, requêtes, tokens IN/OUT, cache read/create captures hub ✅ existant (hub)
Répartition par lane, par machine, par workspace, par bucket cron/interactive/agent traffic-consumption.py, traffic-mxws.py ✅ existant
Harnais empreinte harnais (cc version + hash bloc position-0 + modèle résolu), part harnais fixe / mémoires / conversation harness-injection-measure.py 🟡 partiel (#41 §mandat 11/09)
Condensation compactions/jour, tokens re-payés par compaction — ❌ non mesuré (#89)
Production merges/jour, PRs ouvertes/fermées, issues ouvertes/fermées API GitHub 🟡 à câbler
Diff LOC ajoutées/supprimées, fichiers touchés, par PR et par jour API GitHub 🟡 à câbler
Collaboration nb de messages (dashboard + DM), nb d'appels d'outils, mix d'outils captures + dashboards 🟡 partiel
Revue nb de reviews, LOC des commentaires d'issue, LOC des reviews, refs/PR API GitHub ❌ à câbler
Verbosité OUT/req, p50/p90, marqueurs de vérification, taux de relecture dérivés 🟡 partiel

3.2 Spécifique projet

Projet Métrique Source État
NanoClaw messages échangés, cadence, coût par message traces harnais / captures ❌ inventaire en cours
Hermes-agent idem idem ❌ inventaire en cours
CoursIA nb de Notebooks, LOC ajoutées/supprimées dans les notebooks uniquement, exécutions git (*.ipynb diff) ❌ à câbler
CoursIA nb de PRs mergées, LOC de contenu pédagogique API GitHub 🟡 partiel (#102)
claudish merges, LOC, lanes servies API GitHub + captures ✅ partiel

Note explicite du user, à ne pas déformer : « il ne s'agit pas de chercher à optimiser pour la quantité de Notebooks produits, mais il se trouve qu'on en a créé de façon assez libérale depuis 3 mois, et donc la métrique ». Les notebooks sont un indicateur de production, pas une cible. Aucune recommandation ne doit viser à en produire plus ou moins.

4bis. Économie des souscriptions — le modèle de coût (P0)

Recadrage du user (15/09) : « Pour ce qui est du calcul du coût réel, il devrait être facile d'identifier dans les logs d'activité les périodes où les providers étaient maxés, sur le débit 5h ou sur le débit hebdo. Pour peu qu'on ait une consistance dans la formule qui permet de pondérer les tokens par les multiplicateurs d'heures pleines, on devrait avoir une idée de ce que le token coûte réellement pour nos souscriptions. »

Conséquence : le blocage « pas de table de prix » (§5.3) n'est pas un blocage. Il n'y a pas besoin de tarifs publics pour savoir ce qu'un token nous coûte — il y a besoin de la position de la consommation courante par rapport à la borne de chaque souscription, que nos propres logs contiennent déjà.

4bis.1 Le principe (corrigé le 15/09 sur précision du user — v1 reformulait de travers)

Pour une lane forfaitaire, le coût marginal d'un token est nul jusqu'à la borne, puis la cascade bascule. Le point clé, celui que le mur nous donne gratuitement : c'est quand un forfait maxe qu'on connaît sa borne réelle en tokens. Chaque mur, daté et mis en regard de ce qui a été consommé dans la fenêtre, est une mesure de la capacité effective du forfait — pas une panne à subir.

La borne étant mesurée événement par événement, le modèle s'obtient par extrapolation :

  1. Réinjecter les périodes officielles d'heures pleines et leurs multiplicateurs associés (source : consoles/doc fournisseurs — à relever, pas à supposer ; DeepSeek documente des heures creuses).
  2. Ajouter au besoin des variables latentes pour représenter les métriques fines qu'on n'a pas (mix de requêtes, poids des appels longs, etc.) — le modèle n'a pas à tout mesurer pour estimer juste, il a à être contraint par les bornes observées. On a la data pour ça : ~100 jours d'archives et 690 murs GLM déjà recensés.

Le corollaire opérationnel est plus utile que le chiffre : une souscription n'est pas chère ou bon marché en absolu — elle l'est par rapport à sa borne, et la borne est datée. D'où l'exigence d'exhaustivité des murs (§5.4) : sans la date de reset, « 40 % de la conso hebdo » ne veut rien dire.

4bis.2 Les murs à instrumenter (état de connaissance)

Lane Borne Reset Où on la lit
GLM (gc@ Coding) fenêtre glissante 5 h continue 429 code 1308 + message nommant l'heure de reset (UTC+8 → convertir)
Qwen Token Plan pool hebdomadaire nommé par la réponse mur nommé dans le corps
MiniMax Coding hebdomadaire compteur dans le corps mur nommé / compteur
Kimi Coding mur 5 h (403) continue armé par le fix failover du 15/09
Mistral crédit one-shot date d'expiration console
OpenAI (Codex / Responses) crédit mensuel derrière l'abonnement mensuel console
Anthropic crédit mensuel (ai-01) mensuel console
DeepSeek PAYG aucune borne — pas de mur : c'est le pas terminal de la cascade

Un mur 402/429/529 n'est pas une panne du hub — c'est une donnée de mesure, et c'est précisément le signal d'entrée du modèle de coût.

Inventaire clos (user, 15/09) : la liste ci-dessus est complète. OPENROUTER_API_KEY présent dans la config du hub n'est pas dans le trousseau de failover — présence en config ≠ appartenance à la cascade ; ne pas le compter au dénominateur.

4bis.3 Générosité observée — verdicts du user, à convertir en séries mesurées

[R] rapporté par le user le 15/09, non encore re-mesuré — chaque ligne doit devenir une courbe :

Lane Verdict user Ce qu'il faut mesurer pour le confirmer ou l'infirmer
Qwen très cher et sous-utilisé — « il faudrait mieux l'exploiter, mais on verra ça plus tard, avec un modèle un poil plus fiable » (user 15/09) consommation vs borne hebdo : c'est le cas « capacité payée non consommée », l'inverse du GLM — le gisement est dans le remplissage, pas dans le ralentissement
Kimi très cher idem, sous fenêtre 5 h
Mistral cher, « se rattrape avec Vibe » part du crédit Vibe réellement consommée
MiniMax généreux — « tient sans trop de pb 3 lanes de 30 min de crons rapides (le modèle est l'un des plus légers et rapides) » marge restante en fin de semaine à cadence constante
Anthropic devient cher et précieux OUT/jour, coût/merge, fréquence de compaction
OpenAI « aura un peu amorti, mais a quand même pris du retard cette semaine » crédit restant vs consommation
GLM powerhouse, mais maxe de plus en plus vite sur 5 h délai jusqu'au 1308, jour par jour — c'est la série la plus importante du dashboard

Le fait à retenir : le user relie explicitement la montée en vitesse du mur GLM à l'explosion des coûts DeepSeek, « même avec Kimi ». C'est exactement l'hypothèse que §5.1 laissait non tranchée, et elle est désormais falsifiable : il s'agit de corréler les événements de mur GLM (429 code 1308 horodatés) aux pics de openai-deepseek-flash. Si la corrélation tient, le levier n'est pas « réduire DeepSeek » — c'est lisser la consommation GLM sur la fenêtre de 5 h. (À noter : le hub est aveugle à une partie de ces événements, une requête servie localement par un sidecar AUTONOMOUS n'écrit aucune capture — la corrélation devra être faite côté hub et côté relais.)

4bis.4 Contrainte de méthode

Le user insiste sur « une consistance dans la formule ». C'est la vraie exigence, et elle est plus dure qu'elle n'en a l'air : une formule qui change de convention entre deux jours produit une courbe qui bouge sans que rien ne bouge. La formule de pondération (multiplicateurs heures pleines/creuses, traitement du cache, agrégation IN/OUT) doit être écrite, versionnée, datée et identique d'un bout à l'autre des séries — au prix, s'il le faut, de recalculer l'historique plutôt que de mélanger deux conventions.

4bis.5 Le point d'arrivée revendiqué

« Tout ça devra s'étudier avec le max de métriques permettant de caractériser tous les gisements de consommation des différents consommateurs. Et ça tu vas le voir dans tes traces et dans les artefacts des projets. »

Autrement dit : les traces du hub (qui consomme, où, quand, sous quel harnais) croisées avec les artefacts des projets (ce que la consommation a produit) — c'est ce croisement qui donne P5.

4. Livrable : le dashboard

Forme : un artefact reproductible, alimenté par un script versionné, régénéré hors pointe (fenêtre 05-07Z uniquement — incident 2026-08-26 : un job d'analyse en journée a dégradé le hub 40 min). Sorties : séries temporelles + interprétations écrites, pas seulement des chiffres.

Contraintes dures :

  • Généré côté hub, jamais depuis un relais (un sidecar NOMINAL n'écrit aucune capture).
  • Extractions 7z vers D:, jamais C: (le vhdx Docker/WSL2 y vit).
  • Aucune valeur de secret n'apparaît dans une sortie, un log ou un artefact — noms de variables uniquement, longueurs et empreintes sha8 comme seules preuves.
  • Ne bloque jamais le cron de surveillance 3 h.

Phases :

  • P0 — Modèle de coût (blocage n°1, reformulé le 15/09). Voir §4bis. Il ne s'agit pas de recopier des tarifs publics mais de dériver ce qu'un token nous coûte réellement sous nos souscriptions.
  • P1 — Série temporelle multi-lanes + détection de saturation. Étendre les organes au-delà de -native- : la matrice §2.1 doit devenir un organe récurrent, pas un script ad-hoc de session. Y adjoindre la détection des fenêtres saturées (mur 5 h, mur hebdo) — c'est l'entrée du modèle de coût de P0.
  • P2 — Dashboard (graphiques + interprétations). Séries par lane/machine/workspace ; coût/jour et coût/merge ; part harnais ; compactions ; production GitHub. Chaque graphique accompagné de sa lecture : ce qu'il montre, ce qu'il ne montre pas, ce qu'il faudrait pour trancher.
  • P3 — Métriques projet. NanoClaw, Hermes, Notebooks/LOC notebooks, contenu CoursIA.
  • P4 — Dettes & leviers. Pour chaque dette identifiée, son coût mesuré, son levier, et le rendement attendu du levier — dans la forme déjà validée par [CONSO] Coût par merge ×8,6 — la coordination est passée du merge à l'audit (juillet → septembre) #102 (bascule merge→audit, actions/tour, profondeur de relecture).
  • P5 — Crons idéaux & protocoles de coordination (le livrable décisionnel). « cibler les crons idéaux avec les protocoles de coordination optimaux, pour chaque projet, et donc décider ceux qu'on ralentit car leur veille ne produit pas de nouveauté intéressante. » → une métrique de rendement par réveil : ce qu'un cron produit (nouveaux artefacts actionnables : issues, PRs, commits, découvertes) divisé par ce qu'il brûle. Sortie : une liste classée, chaque cron accompagné d'une recommandation (garder / ralentir / arrêter) et de sa preuve.
  • P6 — Distillation « vibe coding ». « La distillation de la suite de l'épopée claudish et de cette investigation datascience pourront enrichir notre volet vibe coding avec des infos précieuses pour qui est confronté comme nous à l'inflation du budget de tokens dans la durée. » → un contenu publiable : quelles hypothèses naïves sur le coût d'un agent sont fausses, quels signaux regarder, quels pièges de mesure rendent un tableau faux-mais-plausible.

5. Dettes identifiées (chacune devra être chiffrée en P4)

5.1 Le poste PAYG a changé de nature sans décision explicite — hypothèse désormais posée et falsifiable

openai-deepseek-flash passe de 0 à 13 103 réponses/jour en cinq jours. Le user avance le mécanisme le 15/09 : GLM maxe de plus en plus vite sur sa fenêtre de 5 h, et le débordement part sur DeepSeek — « même avec Kimi » (§4bis.3). C'est cohérent avec tout ce qu'on mesure : PAYG = pas terminal de la cascade, et la lane Kimi n'est entrée en service que récemment.

Mais c'est une hypothèse, pas une mesure. Elle se teste : corréler les événements de mur GLM (429 code 1308, horodatés) aux pics de openai-deepseek-flash sur la même fenêtre, et vérifier que la montée du PAYG suit la montée en vitesse du mur plutôt que le volume total (qui, lui, est plat).

L'enjeu de la réponse est décisif, parce qu'elle change le levier : si l'hypothèse tient, la cible n'est pas la lane DeepSeek mais la forme de la consommation GLM dans la fenêtre de 5 h — un problème de lissage de cadence, pas de forfait.

5.3 Le prix n'est pas introuvable — il n'est pas au bon endroit

pricing-cache.json est absent de po-2025 et all-models.json (358 entrées) ne porte aucun champ pricing. Ce n'est pas un blocage pour autant : voir §4bis — le coût réel se dérive de la position par rapport aux bornes, pas d'une grille tarifaire.

Ce qui reste vrai, et qui doit être dit à chaque fois qu'un tableau est publié : tant qu'on ne dispose que de tokens, les comparaisons inter-lanes sont biaisées — elles flatte les lanes forfaitaires (coût marginal nul à court terme, mur invisible) et pénalise les PAYG (facturés à l'unité). Le biais va exactement dans le sens inverse de ce qu'il faut pour décider.

5.2 La lane Sol était aveugle, par bug, pas par politique

[M] #90 (fermée 14/09 21:42Z) : createResponseCapture n'était pas câblé dans openai-responses-sse.ts → aucune capture resp- sur la lane Sol/Codex. L'absence totale de Sol dans les 7 jours d'archive n'est donc pas un fait de consommation : c'est un fait d'instrumentation. Les 585 réponses Sol du 15/09 (109 M d'input, 0 cache) sont réelles, mais leur trajectoire n'est pas lisible dans les archives — toute courbe Sol doit démarrer au 14/09 21:42Z, jamais avant.
[M] #115 (ouverte 15/09) : le wire Responses perd usage.input_tokens_details.cached_tokens → la lane reste aveugle au cache même après #90. Un chiffre « 0 % de cache » sur cette lane est un artefact d'instrument, pas une mesure.

5.3 Le prix est introuvable localement

Voir P0. Tant que c'est vrai, les comparaisons inter-lanes sont des comparaisons de tokens, ce qui flatte les lanes forfaitaires (coût marginal nul à court terme) et pénalise les lanes PAYG — l'inverse exact de ce qu'il faut pour décider.

5.4 Les organes sous-échantillonnent de deux ordres de grandeur

Les organes historiques filtrent -native-. Le hub sert ~30 000 réponses/jour ; natif en représente ~4 %. Un tableau natif-centré est un tableau faux-mais-plausible : il est exact sur son périmètre et trompeur sur la flotte.

5.5 La rétention croît plus vite que la capacité d'analyse

≈ ×2/mois (0,7 → 3,6 Go). La donnée n'est pas le goulot — l'organe qui la lit l'est.

6. Ce que cet épic n'est PAS (anti-doublon)

7. Critères d'acceptation

  • P0 : la formule de pondération (heures pleines/creuses, cache, IN/OUT) est écrite, versionnée et datée, identique sur toute la longueur des séries ; chaque lane porte son délai jusqu'au mur et son volume de débordement vers le pas suivant.
  • P0 : la borne réelle en tokens de chaque forfait est estimée — extrapolation contrainte par les murs observés, les périodes/multiplicateurs officiels d'heures pleines, et des variables latentes pour les métriques fines non mesurées.
  • P0 : les verdicts de générosité de §4bis.3 sont soit mesurés, soit explicitement encore marqués [R] — jamais présentés comme des faits établis.
  • P1 : la matrice lane × jour existe comme organe récurrent, pas comme script de session ; elle couvre 100 % des préfixes de wire, et détecte les fenêtres saturées.
  • P2 : dashboard régénérable par une commande, hors pointe, avec interprétations écrites sous chaque graphique.
  • P3 : NanoClaw, Hermes et les Notebooks (nombre + LOC notebooks uniquement) sont des séries continues.
  • P4 : chaque dette identifiée porte un coût mesuré et un levier avec rendement attendu.
  • P4 : l'hypothèse §5.1 (mur GLM 5 h → débordement DeepSeek) est tranchée — corrélation mesurée, ou réfutée avec la mesure qui la réfute.
  • P5 : chaque cron de la flotte porte un rendement par réveil et une recommandation (garder / ralentir / arrêter) adossée à une preuve ; les crons dont la veille ne produit aucune nouveauté sont nommés.
  • P6 : le contenu « vibe coding » est publiable et autonome (lisible sans ce dépôt).
  • Chaque affirmation du dashboard est marquée [M] / [I] / [?], avec sa source reproductible.
  • Aucune conclusion publiée ne repose sur un organe natif-seul sans que la limite de périmètre soit énoncée dans le même paragraphe.

8. Terrains et garde-fous

  • Gouvernance de flotte inchangée : tout changement de config/routage/recréation passe par [PROPOSAL] puis [ACK] de la coordination ai-01 ; une absence de réponse ne vaut jamais validation.
  • Toute recréation du hub passe par --env-file D:\claudish-shadow\.env (préflight docker compose config + vérification des sources de bind).
  • Jamais de valeur de secret exposée : noms de variables, longueurs et sha8 seuls.
  • Un mur 402/429/529 n'est pas une panne du hub.
  • Les traces de consommation NanoClaw/Hermes ne sont pas encore inventoriées → un inventaire de sources récupérables est en cours et viendra en commentaire de cette issue.

Activity

  1. jsboige commented on Sep 15, 2026

    @jsboige
    OwnerAuthor

    [M] L'hypothèse §5.1 est TRANCHÉE : le mur GLM 5 h cause l'explosion DeepSeek PAYG — corrélation mesurée

    Le user avançait le 15/09 : « GLM reste notre powerhouse, mais maxe de plus en plus vite sur 5 h, en témoignent l'explosion des coûts Deepseek ». C'est désormais mesuré, pas une impression.

    Instrument

    Croisement de deux sources hub, sans décompression :

    • Murs GLM : D:\claudish-captures\upstream-errors.log (JSONL {ts, model, provider, status, body}), filtré 429 + corps 1308 + "Usage limit reached for 5 hour". 690 événements, 40 épisodes de sonde, du 05/09 au 15/09.
    • Volumes par lane et par heure : noms de fichiers resp-* des listings d'archives 7z (09-08 → 09-14) + captures libres du jour — l'horodatage est dans le nom, pas besoin d'ouvrir les fichiers.

    191 heures croisées. Corrélations de Pearson horaires :

    paire r
    murs 1308 ↔ deepseek-flash +0,697
    murs 1308 ↔ glm-5.3 −0,555
    murs 1308 ↔ glm-5.2 −0,452
    murs 1308 ↔ MiniMax-M3 −0,054
    murs 1308 ↔ qwen3.6-35b-a3b +0,164
    glm-5.3 ↔ deepseek-flash −0,405

    Le chiffre qui ferme le débat

    DeepSeek-flash a servi 49 507 réponses pendant les heures de mur GLM, contre 732 pendant les heures sans mur — soit 98,5 % du trafic PAYG qui arrive exactement pendant que le forfait GLM est fermé. Heures-mur : médiane 269 réponses/h, max 3 023. Heures-sans-mur : médiane 0, max 193.

    Le contrôle anti-confound tient : si les heures de mur n'étaient que des heures de pointe, MiniMax corrigerait aussi (+0,05 ≈ rien) et GLM ne s'effondrerait pas (−0,555). Le débordement va spécifiquement sur le PAYG — c'est la signature d'une cascade qui tombe sur son pas terminal, pas d'un pic de demande.

    Illustration du jour (15/09, UTC)

    heure murs 1308 glm-5.3 deepseek-flash
    06h 5 811 344
    07h 11 779 586
    08h 14 0 2 689
    09h 12 0 1 000
    10h 14 0 1 524
    11h 6 36 780

    Mur armé à 07:28Z, reset annoncé 19:17:09 heure fournisseur (UTC+8) = 11:17Z — et GLM revient à l'instant où la borne se lève (36 réponses dès 11h). L'épisode en cours (07:28 → 11:14, 57 événements de sonde) est le plus long et le plus intense des 10 jours.

    La dérive se voit dans les murs eux-mêmes

    Événements 1308 par jour : 09-05 : 15 · 09-07 : 36 · 09-11 : 64 · 09-12 : 64 · 09-13 : 92 · 09-14 : 116 · 09-15 : 86 (partiel). Le mur se déclenche plus tôt, plus souvent, et tient plus longtemps — exactement le « maxe de plus en plus vite sur 5 h » du user. La série délai jusqu'au mur demandée en §4bis.3 est dérivable de ces épisodes : elle est déjà en germe dans ces chiffres.

    Conséquence sur le levier

    Ce n'est pas un problème de lane DeepSeek et ce n'est pas un choix de routage : c'est la forme de la consommation GLM dans sa fenêtre de 5 h. Les candidats leviers changent de nature :

    1. Lisser la consommation GLM sur la fenêtre (étaler les crons lourds plutôt que les concentrer) — retarder l'armée du mur.
    2. Ordonner la cascade pour que le débordement tombe d'abord sur les forfaits résiduels (Kimi kc@k3, Qwen, MiniMax) avant le PAYG — vérifier pourquoi kc@k3 n'apparaît pas dans les heures de mur du 15/09 alors qu'il précède ds@deepseek-flash dans la table Sonnet.
    3. Réduire la consommation qui arme le mur (harnais, verbosité — le chantier [CONSO] Coût par merge ×8,6 — la coordination est passée du merge à l'audit (juillet → septembre) #102/#3647).

    Limites de la mesure (à garder avec le chiffre)

    • Granularité horaire : l'alignage minute-by-minute n'est pas fait ; il pourrait resserrer r encore.
    • « Heure de mur » = heure avec ≥1 événement 1308. Or la sonde s'interrompt pendant les backoffs alors que le mur, lui, tient jusqu'au reset annoncé — les heures de mur sont sous-comptées, pas sur-comptées. La conclusion est donc conservatrice : le vrai lien est au moins aussi fort.
    • Captures hub uniquement : un sidecar en AUTONOMOUS sert localement sans écrire de capture — mais ces épisodes sont rares et le routage nominal passe par le hub.
    • Le 15/09 est une journée partielle (captures non encore compactées) — les totaux du jour monteront encore.

    Instrument : script de session wallcorr.py (scratchpad) — à verser au dépôt comme organe récurrent en P1, avec le piège de regex qui l'a faussement annulé au premier passage (le champ millisecondes T06-18-15-927Z casse -\d{2}-\d{2}Z-$).

  2. jsboige commented on Sep 15, 2026

    @jsboige
    OwnerAuthor

    Inventaire des sources récupérables (P0/P1/P3) — tout ce qui existe, où c'est, et ce qui manque

    Inventaire de terrain du 15/09 (lecture directe des disques, pas de mémoire). Trois découvertes changent l'échelle du chantier, le reste confirme la faisabilité.

    Les trois découvertes

    1. La profondeur d'historique est de ~3,5 mois, pas 7 jours. G:\Mon Drive\Backups-Cloud\claudish contient ~100 archives captures-YYYY-MM-DD.7z du 03/06 au 14/09 (~12,5 Go, compression ~75:1). La série multi-lanes de P1 peut donc démarrer début juin — elle couvrira tout le régime « début juillet » qui sert de référence au coût par merge ([CONSO] Coût par merge ×8,6 — la coordination est passée du merge à l'audit (juillet → septembre) #102), au lieu de le déplorer hors données.
    2. stats-cache.json local porte 205 jours de séries quotidiennes (dailyActivity, dailyModelTokens, modelUsage avec costUSD), du 12/01 au 14/09 — machine po-2025 uniquement, mais c'est la seule série déjà en euros qui existe dans la flotte. À recouper avec les captures avant d'être crue (elle mesure le client, pas le hub), mais elle fournit un étalon de validation du modèle de coût de §4bis.
    3. Les métriques « verbosité / messages » ont déjà des magasins. RooSync détient : messages\ (inbox 5 325 · sent 37 343 · archive 30 682 depuis nov. 2025), dashboards\archive\ (8 137 instantanés condensés depuis le 07/05), et 17 instantanés hebdo tool-usage-snapshots depuis le 06/07 — le « nb d'appels d'outils » du mandat est donc partiellement pré-agrégé, il ne reste qu'à les aligner sur les dates.

    A. Socle commun — ce qui existe

    Métrique mandatée Source État
    traffic, tokens, lanes D:\claudish-captures (jour courant) + archives GDrive 03/06→ ✅ primaire, granularité requête
    attribution session envelope de chaque capture : machine, src, model, pid + body.metadata.user_id (device_id, session_id) ; workspace depuis « Primary working directory » du system prompt ✅ déjà exploité par billed-attrib.py
    merges, PRs, issues API GitHub (GITHUB_TOKEN présent) 🟡 volumes faciles ; LOC des commentaires/reviews, appels d'outils par PR, verbosité par review : aucun extracteur n'existe → backfill gh api à écrire
    nb de messages RooSync messages\ (73 k fichiers JSON datés) ✅ comptable par date
    appels d'outils tool-usage-snapshots (17 hebdo) + captures (reconstruction fine) 🟡
    verbosité générale captures (OUT/req, p50/p90) + traces de conversation ✅ dérivable
    agrégats persistants aucun magasin sqlite/parquet — tout est à la demande ❌ à créer en P1 (c'est le « collecte le max de données dans le temps » du mandat)

    B. Spécifique projet — ce qui existe, ce qui est ailleurs

    Projet Métrique Verdict
    CoursIA — Notebooks nb de Notebooks, LOC ajoutées/supprimées notebooks ✅ 1 218 *.ipynb suivis en git (tous sous MyIA.AI.Notebooks). git log --numstat donne le churn brut, mais un notebook est du JSON → bruit élevé. Reconstructible : historique lissé du nombre de lignes par notebook. Pas reconstructible : LOC exactes par cellule. La métrique du mandat est faisable en version lissée — le dire ainsi, pas autrement.
    CoursIA — outillage DS « les bons outils, ceux qu'on présente dans CoursIA » ✅ identifiés : MyIA.AI.Notebooks\ML\DataScienceWithAgents\ — NumPy / Pandas / Matplotlib / Scikit-Learn (+ pistes agents LangChain/ADK), 52 notebooks. C'est donc cette stack qui porte le dashboard de P2 — pas un choix ouvert.
    NanoClaw messages, cadence ❌ rien en local : runtime = conteneur Docker sur ai-01, SQLite par groupe, logs sur cette machine. → collecte à demander au siège ai-01 (les artefacts ne sont pas rapatriés).
    Hermes messages, cadence 🟡 pas de magasin dédié, mais siège cron sur po-2026 → ses tours sont dans les captures hub (machine: myia-po-2026) et visibles dans les logs (blocs # Hermes — Cluster Secretary). Attribuable depuis l'existant, sans nouveau plombier.

    Ce que l'inventaire ajoute aux phases

    • P1 : le magasin intermédiaire (sqlite/parquet) n'existe pas — c'est lui qui matérialise « collecter le max dans le temps ». À créer côté hub, hors pointe.
    • P3 : NanoClaw est le seul trou de collecte exigeant une action distante (ai-01). Hermes et Notebooks se font depuis l'existant.
    • P2 : la stack est arrêtée (NumPy/Pandas/Matplotlib/Scikit-Learn), cohérente avec ce que CoursIA enseigne — double emploi contenu/outil, à exploiter dans la distillation P6.

    Non vérifié (à ne pas affirmer sans contrôle)

    • Le contenu du magasin Postgres unifié (UNIFIED_STORE_PG_URL, pg.myia.io/unified_store) : existe dans le code du roo-state-manager, joignabilité non testée depuis ce siège.
    • L'exhaustivité des archives GDrive avant le 03/06.
    • Ce que NanoClaw/Hermes écrivent réellement sur leurs machines hôtes.
  3. jsboige commented on Sep 15, 2026

    @jsboige
    OwnerAuthor

    Correction de localisation (inventaire instruments) : l'implémentation du MCP claudish_traffic (cité au §2.4, livraison roo-extensions#3391 ⇄ claudish#72) vit dans roo-extensions, pas dans les scripts claudish — mcps/internal/servers/roo-state-manager/src/tools/claudish-traffic.ts (+ tests, + build/tools/claudish-traffic.js). Ses garanties (histogramme horaire rendu jusqu'à maintenant, GAP: traffic STOPPED déclaratif, split cron/interactif par machine, distinction zéro-requête vs panne) en font une brique P1 directe : toute série multi-lanes du dashboard devrait passer par le même contrat de format que cet outil, pas par un parseur parallèle du log.

  4. jsboige commented on Sep 15, 2026

    @jsboige
    OwnerAuthor

    Addendum câblage (inventaire instruments, vérifié par grep croisé) : les deux ensembles d'instruments sont aujourd'hui disjoints et indécouvrables l''un depuis l''autre — roo-extensions ne référence traffic-live.ps1 / traffic-summary.ps1 / claudish-watchdog.ps1 nulle part, et côté claudish ce sont les skills qui portent la boucle de mesure récurrente (worker/SKILL.md:31, claudish-coordinate/SKILL.md:206, qui documente déjà un piège de faux-négatif du MCP claudish_traffic sur hôtes sidecar). Conséquence pour P1 : l''organe récurrent ne doit pas devenir un troisième pipeline parallèle — il s''appuie sur le contrat claudish_traffic (cf. commentaire précédent) et la jonction scripts↔MCP↔skills fait partie du livrable, pas un au-cas-où.

  5. jsboige commented on Sep 15, 2026

    @jsboige
    OwnerAuthor

    Précision P3 (addendum inventaire) : Hermes ne nécessite AUCUNE collecte distante — son substrat de coordination est le shared-state RooSync déjà inventorié (docs/architecture/hermes-bootstrap.md le confirme), donc ses métriques se reconstruisent depuis (a) les fichiers messages/dashboards du shared-state et (b) les captures hub machine: myia-po-2026. Le paquet Hermes est affectable à n''importe quel worker, sans dépendance. NanoClaw en revanche confirme sa contrainte : le design v2 (docs/harness/adr/009) place l''état SQLite dans le conteneur Docker sur ai-01 (avec un PAT dédié dans son env — identifiant non cité ici par principe) → collecte possible uniquement depuis ai-01.

  6. added 2 commits that reference this issue on Sep 16, 2026
  7. jsboige commented on Sep 16, 2026

    @jsboige
    OwnerAuthor

    [M] P2 seed LIVRÉ (#120, mergée e5b59fa) + juillet natif complet 31/31

    Le générateur du dashboard P2 est dans le dépôt : scripts/fleet-dashboard.py — HTML autonome (CSS+SVG inline, zéro JS/asset), deux sources lecture-seule : le store lane-series (#118) + l'historique merges GitHub (gh api, pulls paginées). Régénération = une commande, fenêtre 05-07Z (§4).

    Deux pièges de pagination mesurés et encodés dans le script (utiles à quiconque récupère la série merges) :

    • gh pr list --search plafonne à 1000 résultats — CoursIA merge ~120/j, 3 mois tronquent en silence ;
    • pulls sort=updated casse tout early-stop : un vieux PR commenté aujourd'hui passe devant les 124 merges d'hier. Mesuré : 1 472 récupérés vs 3 730 réels en juillet. Fix : sort=created (ordre total) + tampon 14 j.

    Chiffres du smoke (99 jours, 06-03 → 09-15, 3 repos : 11 468 merges) :

    • Merges/j : 127 (juillet) → 129 (14 derniers j) — la production est TENUE.
    • Réponses/j : 14 441 → 27 362 (×1,89) — toute la dérive est en tokens, pas en volume de travail.
    • Proxy PRs/M-réponses : 8,8 → 4,7.

    Juillet natif complet (native-trend.py, 31/31 jours) — la référence token est désormais mensuelle, pas un échantillon :

    • 101,8 M OUT sur le mois (3,28 M/j moyen ; pics 02/07 : 9,65 M et 16/07 : 9,52 M) à $ marginal nul → ~39 PRs/M-OUT en moyenne juillet, ~20 les jours de pic mi-juillet (les deux bases se disent, elles ne se mélangent pas).
    • Régime maigre début juillet : OUT/req 1,6-1,9k, compactions 13-17 %, moyComp 9,0-9,9k.
    • L'inflation du coût unitaire de compaction a démarré DANS juillet : moyComp 9,5k (1-16/07) → 14,3k le 30/07 — déjà au niveau du 13/09. L'événement spécifique à septembre est l'explosion d'OUT/req (→6 307 le 13/09), pas les compactions.

    Prochains branchements sur ce seed : (a) P0 bornes de mur → la série « délai jusqu'au 1308 » vient se superposer au chart PAYG ; (b) extraction OUT multi-lanes (généraliser native-trend au-delà de -native-) → le proxy PRs/M-réponses devient le KPI exact PRs/M-OUT et PRs/$ PAYG ; (c) P5 rendement par réveil des crons. Le champ reste marqué [I] tant que (b) n'est pas livré.

    posté par myia-ai-01 (coordinateur) — chiffres reproductibles : store lane-series-full (99 j) + native-trend 31 jours juillet, 16/09

  8. jsboige commented on Sep 17, 2026

    @jsboige
    OwnerAuthor

    Packet #115 — proof of end-to-end closure (deployed + live-verified).

    Dossier closed per the 2026-09-12 mandate (merge ≠ FAIT; FAIT = measured per-consumer verification in-session). Evidence relayed by po-203.

    🤖 Generated with Claude Code

  9. jsboige commented on Oct 5, 2026

    @jsboige
    OwnerAuthor

    [P1] Série jour × lane sur 14 jours (22/09 → 05/10), depuis le store lane-series.sqlite — [po-203], même session

    Provenance : archives 7z du namespace partagé GDrive (non taguées = hub po-2025, + *-po-2023 / *-po-2026 taguées, sommées par jour post-#203) + jour courant en loose. Ingest 14 jours en 15,9 s, 0 jour archive-présente-zéro-réponse (une panne de lane reste distinguable d'un trou de collecte).

    lane                           09-22   09-23   09-24   09-25   09-26   09-27   09-28   09-29   09-30   10-01   10-02   10-03   10-04   10-05
    openai|glm-5.3                 13922   13502   11631   12414   12452   15997   14539   16570   15781   14578   17784   17983   18674       1
    anthropic|MiniMax-M3            9237    4837    8784    9108   10014   49575   13631    6926   12047   15660   16557   11347    1386       0
    native|claude-opus-5-5          5112   19595    8140    5607    4380    5175    4487    5649    3505    3001    4383    4146    4846       0
    openai|deepseek-flash           3802       0     192    9337    5338    8862       0       0       0       0     999     449   10791       0
    anthropic|deepseek-v4.1-fla        0    5767    3171    6338       0       0    5348    5701    1529       0    1119     682     621       0
    responses|gpt-6-sol                0     621    2436       0    3627    6005    3132     616    1204    1027    1635       0       0       0
    openai|glm-5.2                  1655    1511    1331    1503    1749    1858    1885    1930    1947    1811    1515     608     260       1
    anthropic|k3                  2996     354    1539    3888       0       0       0    3144       0       0    3384       0       0       0
    anthropic|deepseek-v4-flash       0    3580      45       2       0       0       0       0       0       1       3       0       0       0
    anthropic|kimi-for-coding          0       0       0       0       0       0       0       0       0    2451     465       0       0       0
    responses|gpt-6.1-sol              0       0       0       0       0       0       0       0       0       0     581    1050    1100       0
    native|claude-opus-5            2313       0       0       0       0       0       0       0       0       0       0       0       0       0
    openai|zai-glm-5-3                 0       0       0       0       0       0       0       0       0       0     993       0       0       0
    responses|gpt-5.6-sol            292       3       0       0       0       0       0       0       0       0       0       0       0       0
    TOTAL                          39429   49791   37325   48221   37581   87522   43056   40624   36088   38621   49512   36302   37717       2
    

    (31 lanes distinctes sur la fenêtre, top 14 affiché ; le store couvre désormais 119 jours · 49 lanes — requêtable à D:\claudish-captures\lane-series.sqlite, CSV complet exportable par --csv.)

    Lectures factuelles (pas d'interprétation causaliste — à croiser avec les journaux failover par qui veut creuser) :

    1. glm-5.3 = lane dominante chaque jour, en croissance : 13 922 → 18 674 (+34 % du 22/09 au 04/10), minimum 11 631 — jamais détrônée.
    2. Pic MiniMax-M3 le 27/09 : 49 575 (×3,6 vs voisinage 10-13 k) — la plus grosse journée lane de la fenêtre, jour qui porte aussi le TOTAL max (87 522).
    3. deepseek-flash : trou de 7 jours (0 du 23/09 au 29/09 après 3 802 le 22/09), retour discret le 02/10 (999), 10 791 le 04/10.
    4. kimi-for-coding apparaît le 01/10 (2 451) — cohérent avec la cascade HAIKU kc@kimi-for-coding du déploiement hub post-feat(failover): role-as-failover-step - a cascade step can delegate to another role #274 (02/10 04:21Z, la lane a dû tourner en amont sur le hub de prod ou par les settings AVANT le déploiement formel — à ne pas conclure sans croiser, la date exacte du premier kimi dans les captures est le 01/10).
    5. Le 10-05 n'est PAS un effondrement : jour courant en loose uniquement (2 réponses = les artefacts d'épisodes AUTONOMOUS du relais po-203, classification sur Transport errors during local serving bypass the cascade (client 400 while fallback steps reachable) — measured 23:49-23:54Z #298) — l'archive du jour n'existe pas encore, la ligne se remplira au pack de 02:47Z.
    6. native|claude-opus-5 (id sans suffixe) présent uniquement le 22/09 (2 313) — trace du pin de version pré-fix(proxy): pin the native lane to the configured role model #218.

    🤖 Generated with Claude Code

  10. jsboige commented on Oct 6, 2026

    @jsboige
    OwnerAuthor

    [P1 suivi] La ligne 10-05 est remplie — le pack 02:47Z a tenu la promesse du commentaire du 05/10 (ingest idempotent lane-matrix.py, store désormais 120 jours · 49 lanes, 0 jour archive-présente-zéro-réponse) :

    lane                          10-04   10-05
    openai|glm-5.3                18674   18026
    anthropic|MiniMax-M3           1386   14045
    openai|deepseek-flash         10791    9847
    native|claude-opus-5-5          4846    6471
    responses|gpt-6.1-sol               0    1572
    anthropic|k3                       0    1254
    openai|glm-5.2                  260     376
    openai|glm-4.7                     0      19
    openai|glm-5.3-flash               0      10
    openai|qwen3.6-35b-a3b             0       9
    TOTAL                        37717   51629
    

    Lectures factuelles :

    1. Le 10-05 n'était pas un effondrement — c'est le 2ᵉ plus gros jour de la fenêtre 14 j (51 629, derrière le 27/09 à 87 522) : MiniMax-M3 remonte à 14 045 (×10 vs 10-04) et deepseek-flash confirme sa résurgence (9 847 après 10 791 — deux jours consécutifs ~10 k après 7 jours à 0).
    2. k3 sert 1 254 réponses le 10-05 — cohérent avec la 2ᵉ marche sonnet observée en session ce jour-là.
    3. La ligne 10-06 (loose, 2 réponses = artefacts AUTONOMOUS du relais po-203) suivra le même cycle : archive au pack 02:47Z, la ligne se remplira d'elle-même.

    🤖 Generated with Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions