Veille Firebird

généré 2026-09-05 17:09 UTC · dépôt · revue · propositions · catalogue

Ce matin 2026-09-05

🟥 5 rouge 🟧 1 orange ⬜ 1 sauté 🟩 25 vert · Firebird-Mono 9653f168 · 82 s · runs · issue de la nuit

contrôlevaleurseuil / base30 nuitssi rouge
🟥deps.audit
Vulnérabilités des dépendances
12 preuve(s)
  • api · critical · tar — Denial of service while parsing a tar file due to lack of folders count validation
  • api · critical · shell-quote — shell-quote quote() does not escape newlines in object .op values
  • api · critical · sequelize (directe) — Sequelize v6 Vulnerable to SQL Injection via JSON Column Cast Type
  • api · critical · mysql2 (directe) — mysql2 Remote Code Execution (RCE) via the readCodeFor function
  • api · critical · handlebars — Handlebars.js has JavaScript Injection via AST Type Confusion by tampering @partial-block
  • app · critical · swiper (directe) — Prototype pollution in swiper
  • app · critical · next (directe) — Next.js missing cache-control header may lead to CDN caching empty reply
  • app · critical · form-data — form-data uses unsafe random function in form-data for choosing boundary
  • app · critical · fast-xml-parser — fast-xml-parser has an entity encoding bypass via regex injection in DOCTYPE entity names
  • app · high · @aws-amplify/api — @aws-amplify/api-graphql
  • dashboard · high · next (directe) — Next.js missing cache-control header may lead to CDN caching empty reply
  • dashboard · high · postcss — PostCSS line return parsing error
65 high + critical (3 paquets)rouge si value > 0Ouvrir l'avis, mettre à jour ou écrire l'exception (raison + date) — jamais ignorer sans note. Rouge attendu la première nuit : le stock est un chantier, pas un incident.
🟥deps.eol
Composants de la pile en fin de vie
4 preuve(s)
  • Node (CI) 18 — EOL depuis 2025-04-30 (courant : 26)
  • Next (app) 13 — EOL depuis 2024-12-21 (courant : 16)
  • Next (dashboard) 12 — EOL depuis 2022-11-21 (courant : 16)
  • MySQL (supposé) 8.0 — EOL depuis 2026-04-30 (courant : 9.7)
4 composants en fin de vierouge si value > 0Ce n'est pas un correctif, c'est un chantier : le planifier (PLAN.md), avec une date. Rouge attendu dès la première nuit (Node 18, Next 12/13, MySQL 8.0).
🟥docs.lockfiles
Un lockfile par paquet
1 preuve(s)
  • api/ : package-lock.json + yarn.lock
1 paquets sans lockfile uniquerouge si value > 0Supprimer le lockfile orphelin (api/yarn.lock — dette connue, CLAUDE.md « Tooling drift »).
🟥judge.review
La revue hebdomadaire
1 preuve(s)
  • aucune revue dans reviews/ — le workflow « Revue hebdomadaire » n'a pas encore tourné
999 jours depuis la dernière revuerouge si value > 8Revue absente : lire le run « Revue hebdomadaire » (clé API ? périmètre refusé ?). Note basse : lire reviews/<semaine>.md — la preuve citée dit quel fichier.
🟥server.resources
Ressources du serveur
1 preuve(s)
  • aucun swap configuré — un build peut être tué par le kernel (OOM du 2026-08-26)
77.8 % de disque librerouge si value < 15 || d.swap_total_gb === 0Sans swap, un `next build` peut être tué par le kernel (OOM du 2026-08-26, BACKLOG) : ajouter 2 Go de swap. Disque bas : purger les logs PM2 et les vieux builds.
🟧docs.migrations_root
Migrations en attente
2 preuve(s)
  • 2026-09-03-journey-versions-graduate-not-draft.sql (2 j)
  • 2026-09-03-profil-image-default-null.sql (2 j)
2 migrations en attenteorange si value > 0Déployer (elle est dûe) ou archiver dans applied/ (elle l'est déjà) — `node scripts/migrate.mjs status` tranche.
db.slow_queries
Requêtes lentes
slow_query_log est OFF sur le serveur — à activer (seuil 1 s) pour mesurer
🟩ci.preprod_green
CI verte sur la tête de preprod
0 workflows non verts sur la tête preprodrouge si value > 0
🟩code.bigfiles
Fichiers de plus de 500 lignes
10 preuve(s)
  • 2451 lignes · api/src/services/Ai/ai.service.ts
  • 1169 lignes · app/src/components/shared/atoms/table/tableOrder/tableFunctions.tsx
  • 1113 lignes · api/src/services/BetaReport/beta-report.service.ts
  • 1033 lignes · api/src/services/Plan/plan-db.service.ts
  • 1031 lignes · app/src/components/documents/DocumentsScreen.tsx
  • 862 lignes · app/src/components/my-plan/MyPlanContainer.tsx
  • 845 lignes · app/src/components/shared/popups/popupsContact/StackableEditContact/StackableEditContact.tsx
  • 818 lignes · app/src/components/shared/popups/popupsContact/StackableAddContact/StackableAddContact.tsx
  • 810 lignes · app/src/components/my-todo/MyTodoDetail/MyTodoDetail.tsx
  • 801 lignes · app/src/components/my-touchpoints/TouchPointsContainer/TouchPointsContainer.tsx
39 fichiers > 500 lignes≤ 39 (base, tolérance 0 %)
🟩code.cycles
Cycles d'imports
12 preuve(s)
  • api · models/User/user.model.ts → models/User/loguser.model.ts
  • api · models/scopes.ts → models/Administrator/administrator.model.ts
  • api · models/Resource/resource.model.ts → models/Resource/resourcetag.model.ts
  • api · models/Tag/tag.model.ts → models/Resource/resource.model.ts → models/Resource/resourcetag.model.ts
  • app · utils/types/companyTypes.ts → utils/types/opportunityTypes.ts
  • app · utils/types/companyTypes.ts → utils/types/opportunityTypes.ts → utils/types/contactTypes.ts
  • app · utils/types/opportunityTypes.ts → utils/types/contactTypes.ts
  • app · utils/types/contactTypes.ts → utils/types/touchpointTypes.ts
  • dashboard · api-client/models/resources/resource.model.ts → api-client/models/resources/tag.model.ts
  • dashboard · components/shared/Info/index.ts → components/shared/Info/Info.tsx
  • dashboard · components/Form/AdminForm/EditAdminForm/EditAdminForm.tsx → components/Form/AdminForm/EditAdminForm/index.ts
  • dashboard · components/Form/HelpForm/ViewHelpForm/ViewHelpForm.tsx → components/Form/HelpForm/ViewHelpForm/index.ts
87 cycles d'imports (3 paquets)≤ 87 (base, tolérance 0 %)
🟩code.dead
Code mort
26 preuve(s)
  • api · fichier orphelin · src/app-test.js
  • api · fichier orphelin · src/configurations/database.ts
  • api · fichier orphelin · src/definitions/super-of.ts
  • api · fichier orphelin · src/middlewares/passport.middleware.ts
  • api · export inutilisé · src/instrument.ts: scrubSecretBody
  • api · export inutilisé · src/services/Ai/ai.service.ts: AI_UNIFIED_CAPABILITY
  • api · export inutilisé · src/services/AccountErasure/user-scoped-tables.ts: cascadeTables
  • api · export inutilisé · seed/guard.ts: isDevDatabase
  • api · export inutilisé · src/services/Plan/plan-engine.service.ts: ACTIVE_DAYS_PER_WEEK
  • api · export inutilisé · src/services/Ai/agent-config.service.ts: invalidateAgentConfig
  • api · export inutilisé · src/services/Ai/improve-agent.service.ts: MEMO_MIN_ITEMS
  • api · export inutilisé · src/utils/validations/index.ts: isNonEmptyString
429 fichiers + exports + types inutilisés (3 paquets)≤ 429 (base, tolérance 5 %)
🟩code.dup
Code dupliqué
10 preuve(s)
  • 136 lignes · components/my-todo/TableTodoMedias/TableTodoMedias.tsx:88 ↔ components/shared/popups/popupsTouchPoint/TableAttachments/TableAttachments.tsx:92
  • 110 lignes · components/shared/popups/popupsCompany/AutoCompleteOpportunitiesForCompany/AutoCompleteOpportunitiesForCompany.tsx:373 ↔ components/shared/popups/popupsTouchPoint/AutoCompleteOpportunities/AutoCompleteOpportunities.tsx:516
  • 103 lignes · components/shared/popups/popupsContact/shared/popupContactFunctions.tsx:65 ↔ components/shared/popups/popupsContact/shared/popupContactFunctions.tsx:315
  • 94 lignes · components/shared/popups/popupsContact/StackableAddContact/StackableAddContact.tsx:249 ↔ components/shared/popups/popupsContact/StackableEditContact/StackableEditContact.tsx:292
  • 92 lignes · components/my-todo/TableTodoMedias/TableTodoMedias.tsx:124 ↔ components/shared/popups/popupsOpportunities/TableOpportunityDocs/TableOpportunityDocs.tsx:133
  • 83 lignes · components/shared/popups/popupsOpportunities/shared/popupOpportunityFunctions.tsx:47 ↔ components/shared/popups/popupsOpportunities/shared/popupOpportunityFunctions.tsx:190
  • 73 lignes · components/shared/popups/popupsCompany/StackableAddCompany/StackableAddCompany.tsx:37 ↔ components/shared/popups/popupsCompany/StackableEditCompany/StackableEditCompany.tsx:31
  • 70 lignes · components/shared/popups/popupsContact/GridTouchpointsContact/GridTouchpointsContact.tsx:182 ↔ components/shared/popups/popupsOpportunities/GridTouchpointOpportunities/GridTouchpointOpportunities.tsx:262
  • 67 lignes · components/my-todo/TableTodoMedias/TableTodoMedias.tsx:232 ↔ components/shared/popups/popupsTouchPoint/TableAttachments/TableAttachments.tsx:236
  • 66 lignes · components/shared/popups/popupsCompany/StackableAddCompany/StackableAddCompany.tsx:38 ↔ components/shared/popups/popupsCompany/StackableAddCompany/StackableAddCompany.tsx:103
10.92 % de tokens dupliqués≤ 10.92 (base, tolérance 3 %)
🟩code.strictness.api
Distance au mode strict (api)
8 preuve(s)
  • src/configurations/database.ts(21,15): error TS2339: Property 'code' does not exist on type '{}'.
  • src/configurations/database.ts(24,15): error TS2339: Property 'code' does not exist on type '{}'.
  • src/configurations/database.ts(27,15): error TS2339: Property 'code' does not exist on type '{}'.
  • src/controllers/Activity/activity.controller.ts(51,41): error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  • src/controllers/Activity/activity.controller.ts(110,41): error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  • src/controllers/Company/company.controller.ts(22,40): error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  • src/controllers/Company/company.controller.ts(44,40): error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
  • src/controllers/Company/company.controller.ts(81,40): error TS2345: Argument of type 'string | undefined' is not assignable to parameter of type 'string'.
190 erreurs tsc --strict (api)≤ 190 (base, tolérance 2 %)
🟩code.tests
Nombre de tests
373 tests (E2E + API)≥ 373 (base, tolérance 0 %)
🟩code.tooling_ratio
Poids de l'outillage
0.215 outillage ÷ produit (lignes)≤ 0.215 (base, tolérance 5 %)
🟩db.dup_indexes
Index dupliqués
0 index en doublerouge si value > 0
🟩db.fk_without_index
Clés étrangères sans index
0 FK sans index≤ 0 (base, tolérance 0 %)
🟩db.migrations
État des migrations sur la base vivante
0 migrations en attente ou en alarmerouge si d.alarms > 0
🟩db.sizes
Taille de la base et croissance
8 preuve(s)
  • companies_contacts · 2 Mo · 9124 lignes
  • contacts · 1.9 Mo · 9157 lignes
  • companies · 1.6 Mo · 6511 lignes
  • tasks · 1.6 Mo · 105 lignes
  • steps · 1.1 Mo · 542 lignes
  • admin_action_logs · 0.3 Mo · 1541 lignes
  • document_derivatives · 0.2 Mo · 8 lignes
  • users_tasks · 0.2 Mo · 199 lignes
11.8 Mo (données + index)rouge si d.growth_7d_pct > 50
🟩deploy.alignment
Le servi est le poussé
0 écarts entre le servi et le poussérouge si d.stale_builds.length > 0
🟩deps.outdated
Dépendances en retard d'une majeure
15 preuve(s)
  • dashboard · @ckeditor/ckeditor5-alignment 37.1.0 → 48.5.0
  • app · @ckeditor/ckeditor5-alignment 39.0.0 → 48.5.0
  • api · @types/node 18.14.6 → 26.4.1
  • app · @types/node 18.15.10 → 26.4.1
  • dashboard · @types/node 18.6.5 → 26.4.1
  • app · @ckeditor/ckeditor5-react 6.1.0 → 11.2.0
  • app · react-datepicker 4.14.1 → 9.1.0
  • dashboard · @ckeditor/ckeditor5-react 6.3.0 → 11.2.0
  • dashboard · react-datepicker 4.25.0 → 9.1.0
  • app · swiper 10.1.0 → 14.2.0
  • dashboard · @ckeditor/ckeditor5-build-classic 37.1.0 → 41.4.2
  • dashboard · @next/eslint-plugin-next 12.3.7 → 16.3.4
106 dépendances ≥ 1 majeure de retard (3 paquets)≤ 106 (base, tolérance 5 %)
🟩docs.email_registry
Registre des e-mails à jour
0 écarts code ↔ registre des e-mailsrouge si value > 0
🟩docs.revision_collisions
Numéros de révision en double
7 preuve(s)
  • PRD.md : 0.33 ×4
  • Feature_Specs.md : 0.48 ×2, 0.50 ×3
  • Dev_Reference.md : 0.41 ×2, 0.49 ×2
  • SECURITY.md : 0.41 ×2, 0.40 ×2, 0.38 ×2, 0.33 ×2, 0.32 ×2
  • ARCHITECTURE.md : 0.7 ×2, 0.12 ×2
  • DEPLOY.md : 0.39 ×2, 0.38 ×2, 0.31 ×2, 0.30 ×2, 0.25 ×2, 0.24 ×2
  • HARNESS_MONO.md : 0.65 ×2
19 numéros de révision en double≤ 19 (base, tolérance 0 %)
🟩errors.sentry
Erreurs nouvelles dans Sentry
0 issues nouvelles en 24 hrouge si d.regressed > 0 || value > 51 point
🟩http.latency
Latence p95 des routes de la sonde
126 ms (p95 sur les routes de la sonde)≤ 167 (base, tolérance 30 % ou 150)
🟩http.live
Les trois fronts répondent
0 fronts en défaut (vie ou certificat)rouge si value > 0
🟩http.product
La sonde produit passe
0 routes en échec sur 8rouge si value > 0
🟩ops.backup_fresh
Sauvegarde fraîche
2 preuve(s)
  • [2026-09-05 02:30:04] Backup OK: firebird_preprod -> b2:Firebird-backups/daily/firebird_preprod_2026-09-05_0230.sql.gz
  • [2026-09-05 02:30:02] Dump written: /home/firebird/backups/firebird_preprod_2026-09-05_0230.sql.gz (1.1M)
14.7 heures depuis le dernier backup OKrouge si value > 26 || d.size_mb < 1
🟩ops.probes_state
Les sondes du serveur tournent
0 sondes serveur en défautrouge si value > 0
🟩ops.restore_drill
Test de restauration récent
1 preuve(s)
  • [2026-09-01 03:30:09] Restore-test OK: firebird_preprod, 70/70 tables, 19 comptes
4.6 jours depuis le dernier restore-test OKrouge si value > 35
🟩server.certbot
Renouvellement TLS armé
0 timer certbot inactifrouge si value > 0
🟩server.pm2
Process PM2
0 process attendus non « online »rouge si value > 0

Revue hebdomadaire

Pas encore de revue. La première tourne le dimanche suivant la mise en place du lot 3.

Propositions et idées

À valider (toutes)

Aucune proposition ouverte.

Idées (+ nouvelle)

Aucune idée en attente.

Catalogue 34 / 40 contrôles · ≈ 19 / 25 min

idquestionfréquenceseuilcoûtsi rouge
deps.auditUne dépendance d'un des trois paquets porte-t-elle une CVE high ou critical connue ?dailyrouge si value > 090 sOuvrir l'avis, mettre à jour ou écrire l'exception (raison + date) — jamais ignorer sans note. Rouge attendu la première nuit : le stock est un chantier, pas un incident.
deps.outdatedCombien de dépendances ont au moins une version majeure de retard ?dailycliquet (lower)90 sUne majeure de plus est apparue : la noter au chantier de mise à niveau, pas la subir.
deps.eolNode, Next ou MySQL tels que déployés sont-ils sortis du support de leur éditeur ?dailyrouge si value > 05 sCe n'est pas un correctif, c'est un chantier : le planifier (PLAN.md), avec une date. Rouge attendu dès la première nuit (Node 18, Next 12/13, MySQL 8.0).
code.deadCombien de fichiers, exports et types ne sont importés par rien ?dailycliquet (lower)180 sSupprimer ce qui vient d'être laissé mort, ou l'exporter pour une raison écrite (l'arbre app/src/redux/ orphelin est connu — CLAUDE.md).
code.dupQuelle part du code des trois sources est un copier-coller d'au moins 50 tokens ?dailycliquet (lower)60 sLe clone le plus long de la liste de preuves est le premier à factoriser. Un agent qui réécrit au lieu de réutiliser laisse exactement cette trace.
code.cyclesCombien de cycles d'imports les trois paquets portent-ils ?dailycliquet (lower)120 sUn cycle de plus : l'extraire dans un module tiers (précédent : improve-agent ↔ evaluation-agent, BACKLOG).
code.bigfilesCombien de fichiers source dépassent 500 lignes ?dailycliquet (lower)10 sLe fichier qui vient de franchir la barre se découpe maintenant, pas dans six mois.
code.strictness.apiCombien d'erreurs `tsc --strict` l'API porterait-elle aujourd'hui ?dailycliquet (lower)120 sLe code neuf ajoute de la dette strict : le corriger dans le commit qui l'a créée (la cible est strict, CLAUDE.md).
code.tooling_ratioL'outillage (scripts/, .claude/) grossit-il plus vite que le produit qu'il sert ?dailycliquet (lower)10 sAvant d'ajouter un script, en retirer un. Le ratio initial (≈ 0,23) est la référence, pas un objectif.
code.testsLe nombre de tests (E2E + API) monte-t-il, ou quelqu'un en a-t-il retiré ?dailycliquet (higher)5 sUn test a disparu : retrouver le commit et l'autorité de spec qui le justifie (barre A3 du dev loop).
ci.preprod_greenLe dernier commit de `preprod` a-t-il tous ses checks verts ?dailyrouge si value > 05 sLire le run rouge avant tout autre travail — 16 CI rouges d'affilée sont passées inaperçues un jour (cockpit, bannière CI).
docs.migrations_rootDes migrations attendent-elles à la racine d'api/migrations/, et depuis combien de temps ?dailyrouge si d.oldest_days > 72 sDéployer (elle est dûe) ou archiver dans applied/ (elle l'est déjà) — `node scripts/migrate.mjs status` tranche.
docs.email_registryLe nombre de sites d'envoi dans le code correspond-il encore au registre docs/emails/REGISTRE.md ?dailyrouge si value > 02 sUn envoi est apparu ou a disparu sans passer par le registre : l'y inscrire (règle 11 CLAUDE.md), puis mettre à jour les valeurs attendues ici.
docs.lockfilesChaque paquet a-t-il exactement un lockfile ?dailyrouge si value > 01 sSupprimer le lockfile orphelin (api/yarn.lock — dette connue, CLAUDE.md « Tooling drift »).
docs.revision_collisionsDeux lignes de révision portent-elles le même numéro dans un même document ?dailycliquet (lower)1 sRenuméroter la collision neuve dans le commit qui l'a créée ; le stock (19 au 2026-09-05) est un item BACKLOG.
http.liveapi, app et admin preprod répondent-ils en TLS valide, avec un certificat qui a plus de 14 jours devant lui ?dailyrouge si value > 020 sIncident : lire les logs PM2 du front concerné ; un certificat court = certbot.timer (server.certbot).
http.productUn admin dédié peut-il se connecter, imiter le persona et lire ses huit routes avec un corps sensé ?dailyrouge si value > 060 sIncident produit : la route en échec et sa raison sont dans les preuves ; c'est ce que verify-live-cron aurait dû mailer.
http.latencyLes routes GET authentifiées de la sonde ralentissent-elles ?dailycliquet (lower)5 sProfiler la route la plus lente (details.slowest) : EXPLAIN sur sa requête, puis index ou pagination.
errors.sentryCombien d'issues Sentry sont apparues en 24 h sur les trois projets, et y a-t-il des régressions ?dailyrouge si d.regressed > 0 || value > 510 sTrier : une régression est un bug réintroduit — retrouver le commit ; une nouvelle issue est lue avant d'être fermée.
deploy.alignmentLe serveur preprod sert-il la tête de `preprod`, avec un front rebâti après le dernier pull ?dailyrouge si d.stale_builds.length > 05 sUn front plus vieux que le commit servi = déploiement mort à mi-chemin (OOM du 2026-08-26) : relancer deploy-preprod.sh. Un simple retard = déployer depuis /sessions.
db.migrationsQue dit `migrate.mjs status firebird_preprod` : migrations en attente, et surtout alarmes (divergent, undeclared, drifted) ?dailyrouge si d.alarms > 05 sUne alarme est un désaccord entre le registre et la base : instruire avec api/migrations/README.md, jamais arbitrer en silence.
db.dup_indexesDes index portant exactement les mêmes colonnes coexistent-ils sur une table (le leak de sync alter) ?dailyrouge si value > 05 sLe leak est revenu (un `unique: true` de colonne réintroduit ?) — trouver le modèle, puis nettoyer à la main (cleanup-duplicate-indexes.sh est dev-only).
db.fk_without_indexUne clé étrangère existe-t-elle sans index porteur ?dailycliquet (lower)5 sMigration compagnon pour l'index (les deux moitiés : modèle + migration, CLAUDE.md).
db.sizesLa base grossit-elle à un rythme normal (moins de 20 % par semaine) ?dailyrouge si d.growth_7d_pct > 505 sRegarder la table qui grossit (preuves) : une table de log sans purge, ou un seed rejoué en boucle.
db.slow_queriesCombien de requêtes ont dépassé le seuil lent depuis la mesure précédente ?dailyrouge si d.delta_24h > 505 sLire le slow log du serveur, EXPLAIN sur la requête, puis index ou pagination.
server.resourcesLe VPS a-t-il du disque, de la mémoire et un swap, sans charge anormale ?dailyrouge si value < 15 || d.swap_total_gb === 05 sSans swap, un `next build` peut être tué par le kernel (OOM du 2026-08-26, BACKLOG) : ajouter 2 Go de swap. Disque bas : purger les logs PM2 et les vieux builds.
server.pm2Les six process (preprod et prod) sont-ils online, et lesquels ont redémarré depuis 24 h ?dailyrouge si value > 05 sUn process absent ou errored : `pm2 logs <nom>` sur le serveur avant tout redémarrage — un EPERM ou un ENOENT dit une panne d'environnement, pas une régression.
server.certbotLe timer certbot est-il actif ?dailyrouge si value > 02 s`systemctl enable --now certbot.timer` (sudo) — le trou est noté DEPLOY.md §8.
ops.backup_freshLe dernier backup B2 de preprod a-t-il moins de 26 h et une taille plausible ?dailyrouge si value > 26 || d.size_mb < 12 sIncident sauvegarde : lire backup.log sur le serveur (FATAL sur stderr), vérifier rclone (`rclone ls b2:Firebird-backups/daily/`), relancer à la main.
ops.restore_drillLe dernier test de restauration réussi date-t-il de moins de 35 jours ?dailyrouge si value > 352 sRejouer à la main : `bash scripts/restore-test.sh firebird_preprod` sur le serveur (docs/runbooks/RESTORE.md), et lire pourquoi le cron du 1er n'a pas écrit OK.
ops.probes_stateuptime-check et verify-live tournent-elles encore, et disent-elles « up » ?dailyrouge si value > 02 sUn fichier d'état figé = cron mort (crontab -l) ; un « down » ou « broken » = ce que le cron aurait dû mailer — vérifier msmtp.
sec.headersLes trois fronts preprod servent-ils HSTS, CSP, X-Frame-Options, Referrer-Policy, X-Content-Type-Options, sans bavarder (server, x-powered-by) ?weeklycliquet (lower)15 sUn en-tête a disparu : nginx (DEPLOY.md) ou next.config — le remettre dans le même lot.
sec.semgrep_fullLe scan semgrep complet (OWASP, nodejs, react, nextjs) sur tout l'arbre rend-il des findings ERROR ?weeklycliquet (lower)300 sUn finding ERROR de plus : le lire avec SECURITY.md §5, corriger ou écrire l'exception dans .semgrepignore avec la raison.
judge.reviewLa revue par modèle a-t-elle tourné cette semaine, et une dimension est-elle passée sous 5 ?dailyrouge si value > 81 s · sonnet-5Revue absente : lire le run « Revue hebdomadaire » (clé API ? périmètre refusé ?). Note basse : lire reviews/<semaine>.md — la preuve citée dit quel fichier.