Skip to content

Story 32-6a : le point d'entrée /mcp et sa garde (refs #723) - #760

Merged
guycorbaz merged 23 commits into
mainfrom
story/32-6
Oct 25, 2026
Merged

guycorbaz merged 23 commits into
mainfrom
story/32-6

Conversation

@guycorbaz

Copy link
Copy Markdown
Owner

Story 32-6a : le point d'entrée /mcp et sa garde (refs #723)

  • POST /mcp, JSON-RPC 2025-11-25 sans session, liste close des méthodes ; registre d'outils (McpTool, portée sans défaut) et kesh_version.
  • Authentification par clé MCP seule (PAT, JWT et cookie refusés en 401 identique) ; règle « servi » par société — désactivé, /mcp est indiscernable d'une route absente (route_service).
  • Filtre d'adresse sur le pair TCP et X-Forwarded-For des seuls mandataires déclarés ; contrôle d'Origin (403 en amont, 401 fixe quand la société de la clé ne l'admet pas).
  • Pool des outils en READ ONLY, max_statement_time posé à chaque connexion, connexion fermée à sa restitution ; l'outil s'exécute dans une tâche qui garde permis et connexion jusqu'à la fin de l'instruction (C-32-6-56).
  • Politique required refusée avant exécution jusqu'à la 32-8 ; gardes lexicales (lecture seule jamais défaite, pas de pool hors du MCP).

Fiche : 7 passes de validation. Revue de code : 3 passes — P1 Sonnet ×3 0/0/2/16 → P2 Opus ciblée 0/0/2/7 → P3 Sonnet ciblée 0/0/0/1.

Gates au dernier commit de code (dd4b8398) : test-fast.sh --ci 4183/4183 (7 ignorés), frontend 1939/1939, build vert, E2E complet 315 passés + 7 échecs = KF-029. La fusion de main qui suit ne porte que de la documentation.

Tracé : #759 (tâche abandonnée qui va au bout, attentes de permis non bornées, marges de temps des tests d'abandon).

🤖 Generated with Claude Code

guycorbaz and others added 23 commits October 25, 2026 04:52
…2-6b (journal) (refs #723)

Fiche 32-6-endpoint-mcp.md (35 AC, 11 tâches, 36 mutations, inventaire clos
des chemins vers un outil), registre epic-32-choix-autonomes-326.md
(C-32-6-1 à 30), prompt de validation P1 (Sonnet, lentilles R et F).
sprint-status : 32-6-endpoint-mcp à split ; 32-6a et 32-6b ready-for-dev,
développement après 32-5b, 32-5d, 32-5c.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sonnet x2, R 0/0/3/14 et F 0/0/8/8 : ConnectInfo par Result, détecteur du
registre des routes étendu à fallback(, comparaisons octet pour octet,
corps jamais lu avant les contrôles, sous-routeur à état propre EtatMcp,
gardes ContexteAcces::mcp et AppError, Donnees en politique.rs, statuts du
registre en 32-6a et 32-6b. Registre C-32-6-31 à 34 ; prompt de
validation P2 (Opus, R et F).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opus x2, R 0/0/4/12 et F 0/0/5/11, recyclage déclaré (sept MEDIUM nés de
la remédiation P1). Conception simplifiée : liste blanche des erreurs de
service, sortie unique reponse::rendre, politique::autoriser avant
l'exécution, EtatMcp sans AppState, extraction de tout fallback(,
after_release qui ferme chaque connexion du pool du MCP. Registre
C-32-6-35 à 37 et annotations datées ; prompt de validation P3 (Sonnet).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sonnet x2, R 0/0/4/9 et F 0/0/3/4, recyclage déclaré (les sept MEDIUM nés
d'une remédiation). Règle commune des gardes lexicales : propriété,
périmètre et formes, motif mesuré sur le dépôt à l'étape 0, témoins rouge
et vert. Points d'accès du registre renommés, couche de capture générique
avec témoin, rendre asynchrone avec RouteAbsente(Request), Ma17 visée sur
authentifier, EtatMcp sans Config, garde sur la Lecture ordinaire avant
tout emprunt du pool des outils. Registre C-32-6-38 et 39 ; prompt de
validation P4 (Opus).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Opus x2, F 0/1/4/7 et R 0/0/1/12. HIGH F1, vérifié au code d'Axum 0.8.9 :
/mcp monté par route_service (Endpoint::Route appelé not_top_level, comme
le repli) au lieu d'un MethodRouter qui ajoutait Allow et content-length ;
autre_methode et l'extension du détecteur à fallback( retirées. Type
LectureOutils pour la lecture des outils, témoin serveur de la capture,
notification complète, id null, CORS absent à dessein. Registre C-32-6-40
et 41 ; prompt de validation P5 (Sonnet).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Sonnet x2, R 0/0/1/12 et F 0/0/1/6, deux MEDIUM nés de la P4. AC-b6 et
AC-a31 suivent le montage par route_service ; Ma20b écrite sous ses deux
formes compilables (post_service, any_service), et toute la matrice du
test d'indiscernabilité passe par oneshot, hyper posant lui-même
content-length: 0 sur le fil. LOW d'une ligne traités, le reste à
l'étape 0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…er (refs #723)

Opus, une lentille, braquée sur le commit ac52657 (remédiation P5) ;
axes obligatoires conservés : motifs greppés sur le dépôt réel,
affirmations sur les dépendances prouvées à leur source.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Passe ciblée Opus, 0/0/1/8. H1 : la règle « une entrée invalide de
trusted_proxies écarte la société de S » est gardée et propagée
(C-32-6-6 annoté, Ma13 bornée, Ma13b et test n prime, liste de la 32-7,
journal en error!). LOW H2 à H9 traités, dont la demande mal formée au
répartiteur (AC-a19) et la Config des tests d'intégration nommée.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…er (refs #723)

Sonnet, une lentille, braquée sur le commit 3b884bd (remédiation P6) ;
axes obligatoires conservés : motifs greppés sur le dépôt réel,
affirmations sur les dépendances prouvées à leur source.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
P7 ciblée Sonnet 0/0/0/4 : les quatre LOW vont à l'étape 0 du
développement avec leur correction attendue. Change Log complet,
32-6a et 32-6b ready-for-dev, développement après 32-5d et 32-5c.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ool des outils en lecture seule ; T-a0, test d'indiscernabilité vert (refs #723)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…tion, outils, gardes lexicales et leurs tests (refs #723)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ie (refs #723)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…H1 à H4, clé à review, prompt de revue P1 (refs #723)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…outils, ordre de l'enveloppe prouvé, 401 fixe à l'étape 9, en-têtes répétés refusés, gardes élargies (refs #723)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… choix C-32-6-52 à 55, C-32-6-42 accepté (refs #723)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…i garde ses connexions, garde de max_statement_time, fiche annotée (refs #723)

- H1 : repartiteur::appeler lance l'outil dans un tokio::spawn qui possède
  l'outil (Arc<dyn McpTool>), le contexte d'accès et la lecture des outils ;
  le handler n'attend que la tâche, sous le délai. Un abandon (délai ou
  déconnexion) ne rend plus le permis avant la fin de l'instruction
  (C-32-6-56). Tests abandon_au_delai_le_permis_reste_pris et
  abandon_par_deconnexion_le_permis_reste_pris ; mutation P2-Mq1.
- Doc de pool_lecture_seule et § « Ce que les gardes ne voient pas » :
  la borne se compte depuis le début de l'instruction (texte faux corrigé).
- H2 : AC-a10 et ordre des contrôles annotés (étape 9 → 401, C-32-6-52).
- H3 : max_statement_time dans la garde lecture_seule_jamais_defaite
  (C-32-6-57) ; mutations P2-Mq2, P2-Mq3.
- H4, H5, H6, H7, H9 : angles morts et faux positif écrits, preuve
  reformulée, doc de kesh_version, emprunt hors de la fenêtre du test (g).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…, gates au commit de remédiation (refs #723)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ne (refs #723)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@guycorbaz
guycorbaz merged commit 7e47bff into main Oct 25, 2026
4 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant