diff --git a/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md b/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md index c6b74f0..ed2e881 100644 --- a/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md +++ b/docs/plans/016-V0_2_9_YELLOWSTONE_GRPC_PLAN.md @@ -1,9 +1,9 @@ - + # Plan `0.2.9` — moteur Yellowstone gRPC + standard Solana + PublicNode -**Statut courant : `0.2.9-pre.011` est fermée par gate opérateur complet sans warning. `0.2.9-pre.012` est la tranche active de fermeture technique : réaudit upstream final, smoke PublicNode Mainnet opt-in, compliance finale, graphes Cargo, README/USAGE, règles de tableaux Markdown et prompt autonome `0.2.10 — OrbitFlare Yellowstone gRPC`. Les journaux détaillés restent dans `deltas/0.2.9/`; ce plan conserve l’état courant et les décisions.** +**Statut courant : `0.2.9-pre.012` a passé son gate déterministe local sans warning ; le smoke PublicNode live et les graphes Cargo finaux n'ont pas été exécutés dans le log opérateur fourni. `pre.012-fix.001` introduit une règle durable de séparation des dernières prereleases et recalibre la fermeture : `pre.013` technique/live, `pre.014` réconciliation documentaire, `pre.015` préparation de publication minimale, puis `rel.001`.** ## 1. Objet et autorité de la release @@ -604,25 +604,32 @@ Aucun secret provider n'est versionné. Les preuves détaillées restent dans les fichiers `deltas/0.2.9/*.md`. Le plan ne duplique plus leurs journaux complets. -| Tranche | Objet | État consolidé | -|-------------------|----------------------------------------------------------|----------------------| -| `pre.001` + fixes | audit upstream, licence, providers, architecture, sizing | **CLOSED** | -| `pre.002` + fixes | dépendances, settings/errors, channel minimal | **CLOSED** | -| `pre.003` + fix | TLS, metadata, fixture locale, 7 unary | **CLOSED** | -| `pre.004` + fix | Subscribe foundation/common | **CLOSED** | -| `pre.005` + fix | Accounts + Slots | **CLOSED** | -| `pre.006` | namespace privé HTTP explicite | **CLOSED** | -| `pre.007` | Transactions + transaction_status | **CLOSED** | -| `pre.008` + fix | Blocks + block_meta + entry | **CLOSED** | -| `pre.009` + fix | bidi, Ping/Pong, backpressure, half-close, shutdown | **CLOSED** | -| `pre.010` + fix | reconnect, from_slot, ReplayInfo, gaps/duplicates | **CLOSED** | -| `pre.011` | Config V3 + protocol/provider + PublicNode Mainnet | **CLOSED** | -| `pre.012` | live/compliance/docs/graph/prompt suivant | **ACTIVE CANDIDATE** | +| Tranche | Objet | État consolidé | +|-------------------|----------------------------------------------------------|----------------------------| +| `pre.001` + fixes | audit upstream, licence, providers, architecture, sizing | **CLOSED** | +| `pre.002` + fixes | dépendances, settings/errors, channel minimal | **CLOSED** | +| `pre.003` + fix | TLS, metadata, fixture locale, 7 unary | **CLOSED** | +| `pre.004` + fix | Subscribe foundation/common | **CLOSED** | +| `pre.005` + fix | Accounts + Slots | **CLOSED** | +| `pre.006` | namespace privé HTTP explicite | **CLOSED** | +| `pre.007` | Transactions + transaction_status | **CLOSED** | +| `pre.008` + fix | Blocks + block_meta + entry | **CLOSED** | +| `pre.009` + fix | bidi, Ping/Pong, backpressure, half-close, shutdown | **CLOSED** | +| `pre.010` + fix | reconnect, from_slot, ReplayInfo, gaps/duplicates | **CLOSED** | +| `pre.011` | Config V3 + protocol/provider + PublicNode Mainnet | **CLOSED** | +| `pre.012` | réaudit + smoke ajouté + docs préparatoires | **LOCAL GATE PASS** | +| `pre.012-fix.001` | règles de séparation de fermeture + recalibrage | **ACTIVE DOCUMENTARY FIX** | +| `pre.013` | gate technique/live PublicNode + graphes finaux | **PLANNED** | +| `pre.014` | réconciliation documentaire finale | **PLANNED** | +| `pre.015` | prompt + CHANGELOG + ROADMAP | **PLANNED** | -Gate opérateur de fermeture `pre.011` : +Gate opérateur déterministe de `pre.012` reçu le 2026-08-24 : ```text -fmt/audit/check/clippy PASS sans warning +fmt/audit Rust PASS sans warning +Markdown tables PASS, 87 tableaux / 252 fichiers +cargo check PASS +cargo clippy PASS sans warning Config unit 113/113 Config public API 15/15 Config ownership 5/5 @@ -632,35 +639,71 @@ Transport completeness 43/43 Transport doctests 4/4 workspace dependencies 3/3 cargo test --workspace PASS +PublicNode live smoke NOT RUN, test ignored +cargo tree final NOT PROVIDED / NOT RUN in supplied log ``` -## 13. Forecast restant +`pre.012` reste historiquement une tranche mixte créée avant l'adoption de la nouvelle règle. Son fix ne réécrit pas cette histoire : le prompt `0.2.10` déjà présent est désormais considéré comme un brouillon à finaliser seulement en `pre.015`, et les README/USAGE préparés seront réconciliés en `pre.014`. -### `pre.012` — fermeture technique et live +## 13. Forecast restant recalibré -Cible active : +### `pre.013` — gate technique/live final + +Payload autorisé : ```text -workspace.package.version = 0.2.9-pre.12 -réaudit upstream final -réaudit PublicNode Testnet sans endpoint inventé -smoke PublicNode Mainnet opt-in, programmatique et sans credential -compliance HTTP 52 current + 14 historical -compliance Standard WS 18/18 -Helius WebSocket non régressé -cargo tree direct + duplicates final -README/USAGE Transport synchronisés -règles Markdown sur les tableaux reformulées et auditées mécaniquement -validation 012 fermée si les gates opérateur sont verts -prompt 0.2.10 OrbitFlare autonome -workspace final vert +workspace.package.version = 0.2.9-pre.13 +exécution du smoke PublicNode Mainnet déjà versionné +cargo tree Transport direct +cargo tree Transport --duplicates +cargo tree --duplicates +constat factuel de tout incident réseau/provider/TLS +aucune réconciliation README/USAGE +aucune finalisation prompt/CHANGELOG/ROADMAP ``` -La candidate ajoute un smoke live **ignoré par défaut** ; elle ne modifie pas le runtime Yellowstone déjà fermé. Le smoke Mainnet utilise uniquement la façade provider-neutral KSP, `GetVersion` et `GetSlot`, avec TLS et sans metadata d'authentification. +Commande live centrale : -Le Testnet reste `EXTERNAL BLOCK / NOT GUESSED` tant que PublicNode n'expose pas l'endpoint exact dans une source autoritative. +```bash +cargo test -p ksp-onchain-transport-lib --test yellowstone_publicnode_smoke -- --ignored --nocapture +``` -Si le gate opérateur révèle une anomalie réelle, un `pre.012-fix.001` est créé. Si la fermeture nécessite une nouvelle frontière fonctionnelle plutôt qu'un fix, une `pre.013+` est ouverte ; le numéro n'est pas une deadline. +Un échec local du smoke est corrigé dans `pre.013-fix.NNN`. Un incident externe est documenté comme tel. Un fix de `pre.013` ne contient pas de correction documentaire de clôture. + +### `pre.014` — réconciliation documentaire finale + +Payload : + +```text +workspace.package.version = 0.2.9-pre.14 +plan 016 réconcilié avec le gate technique/live réel +validation 012 fermée avec uniquement des preuves exécutées +README/USAGE Transport relus et corrigés +références durables liées à 0.2.9 réconciliées si nécessaire +audit Markdown final des documents touchés +aucune modification fonctionnelle/runtime +aucune finalisation CHANGELOG/ROADMAP/prompt suivant +``` + +Si une correction de code ou de smoke apparaît ici, `pre.014` ne l'absorbe pas : une nouvelle tranche technique est ouverte, puis la réconciliation documentaire est rejouée. + +### `pre.015` — préparation de publication minimale + +Payload fonctionnel strict : + +```text +workspace.package.version = 0.2.9-pre.15 +prompt 0.2.10 OrbitFlare finalisé +CHANGELOG.md synchronisé pour 0.2.9 +ROADMAP.md état global 0.2.9 / suite synchronisé +delta pre.015 +``` + +Aucun README, USAGE, plan, validation, règle, code, test, schema ou config n'est modifié dans cette tranche. Si l'un de ces fichiers nécessite encore une correction, la tranche de publication est décalée après une nouvelle prerelease dédiée. + +### `rel.001` — publication stable + +`rel.001` ne sert qu'à la mécanique de publication stable : version Cargo finale `0.2.9`, delta de release, commit final et tag `v0.2.9` après gate. Aucun rattrapage technique ou documentaire n'y est mélangé. ## 14. Critères de split @@ -670,7 +713,8 @@ Scinder avant dette silencieuse si : 2. PublicNode exige une divergence provider-specific significative ; 3. le replay nécessite un sous-système de fork/equivocation plus large que la foundation ; 4. une tranche dépasse nettement le budget nominal sans frontière claire ; -5. le gate final montre une dette dépendance/licence ou une non-régression qui ne peut pas être corrigée proprement dans la tranche. +5. le gate technique/live montre une dette dépendance/licence ou une non-régression qui ne peut pas être corrigée proprement dans son couloir ; +6. une correction appartenant à un couloir déjà franchi est découverte pendant un couloir ultérieur. Le noyau à préserver reste : @@ -678,37 +722,29 @@ Le noyau à préserver reste : moteur Yellowstone + façade Solana standard + Config provider-neutral + première intégration PublicNode minimale ``` -## 15. Gates opérateur +## 15. Gates opérateur restants -Gate `pre.012` : +Gate `pre.013` : ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py -python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.9 cargo check --workspace cargo clippy --workspace --all-targets -cargo test -p ksp-config-lib -cargo test -p ksp-onchain-transport-lib -cargo test -p ksp-core-lib --test workspace_dependencies -cargo test --workspace -``` - -Graphes finaux : - -```bash cargo tree -p ksp-onchain-transport-lib cargo tree -p ksp-onchain-transport-lib --duplicates cargo tree --duplicates -``` - -Smoke live opt-in Mainnet : - -```bash cargo test -p ksp-onchain-transport-lib --test yellowstone_publicnode_smoke -- --ignored --nocapture ``` -Le smoke n'est jamais déclaré réussi avant exécution. Un incident externe PublicNode/TLS/réseau est consigné comme tel et ne doit pas être maquillé en PASS local. Le Testnet n'est pas exécuté tant que son endpoint exact n'est pas confirmé par une source PublicNode autoritative. +Gate `pre.014` : + +```bash +python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.9 +cargo test --workspace +``` + +Gate `pre.015` : audit documentaire ciblé sur `prompts/`, `CHANGELOG.md` et `ROADMAP.md`, plus les validations minimales imposées par le changement de version Cargo. Aucun smoke n'est rejoué dans cette tranche en l'absence de changement technique. ## 16. Conditions de clôture `0.2.9` @@ -724,15 +760,15 @@ bounds/backpressure/shutdown verts reconnect/replay documentés sans lossless implicite Config V3 backward V1/V2 provider/protocol distincts -PublicNode Mainnet validé -Testnet validé si endpoint exact confirmé, sinon report factuel documenté +PublicNode Mainnet live exécuté avec résultat consigné +Testnet reporté factuellement si endpoint exact non confirmé HTTP 52+14 non régressé Standard WS 18/18 non régressé Helius WS non régressé cargo graphs finaux inspectés -README/USAGE finaux synchronisés -validation 012 fermée -prompt release suivante prêt +README/USAGE finaux réconciliés en pre.014 +validation 012 fermée en pre.014 +prompt/CHANGELOG/ROADMAP seuls finalisés en pre.015 workspace final vert ``` diff --git a/docs/rules/FILE_CONTRACTS.md b/docs/rules/FILE_CONTRACTS.md index b49956f..99d5ffa 100644 --- a/docs/rules/FILE_CONTRACTS.md +++ b/docs/rules/FILE_CONTRACTS.md @@ -1,5 +1,5 @@ - + # Contrats des fichiers @@ -20,25 +20,25 @@ Les règles `FILE-*` définissent la responsabilité et le mode de modification | `.cargo/config.toml` | Définir les réglages Cargo propres au workspace qui ne relèvent pas du manifeste, notamment l'emplacement des artefacts de build. | Modifier lorsqu'un réglage Cargo commun change ; ne pas y placer de secret ni de configuration spécifique à une machine particulière. | | `rustfmt.toml` | Définir le formatage Rust commun. | Modifier comme changement normatif, avec justification dans le delta. | | `clippy.toml` | Définir les paramètres Clippy communs. | Modifier comme changement normatif, avec justification dans le delta. | -| `ROADMAP.md` | Décrire les objectifs globaux et les grandes étapes prévues par phase/version, avec leur état synthétique. | Modifier lorsqu'un objectif, une grande étape, un report, une annulation ou un état global change ; ne pas y recopier le détail des prereleases prévu dans les plans de version. | -| `CHANGELOG.md` | Résumer les releases stables dans un ordre chronologique décroissant, sous forme d'un ou plusieurs paragraphes par release. | Synchroniser lors de la phase documentaire finale ; ne pas dupliquer les deltas ni créer de changelog par crate/module. | +| `ROADMAP.md` | Décrire les objectifs globaux et les grandes étapes prévues par phase/version, avec leur état synthétique. | Modifier lorsqu'un objectif, une grande étape, un report, une annulation ou un état global change ; pour une clôture de release, réserver sa synchronisation finale à la dernière prerelease de publication et ne pas y recopier le détail des prereleases prévu dans les plans de version. | +| `CHANGELOG.md` | Résumer les releases stables dans un ordre chronologique décroissant, sous forme d'un ou plusieurs paragraphes par release. | Synchroniser uniquement dans la dernière prerelease de préparation de publication ; ne pas le finaliser dans la prerelease de réconciliation README/USAGE et ne pas dupliquer les deltas ni créer de changelog par crate/module. | ## Répertoire `docs/` -| Fichier/famille | Responsabilité | Règle de modification | -|-----------------------------------|-------------------------------------------------------------------------------------------------------------------------|--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `docs/000-README.md` | Indexer et expliquer la documentation tout en restant en tête des listings et arbres de fichiers. | Modifier lorsque l'organisation durable de `docs/` change ; `000-README.md` reste prioritaire lorsqu'un ordre numérique existe. | -| `docs/formats/000-README.md` | Indexer les spécifications de formats durables KSP destinées à l'interopérabilité externe. | Modifier lorsqu'un format durable entre/sort de cette famille ou que son statut change ; conserver `000-README.md` comme point d'entrée. | -| `docs/formats/*.md` | Spécifier un wire KSP durable indépendamment de son implémentation, avec encodages, limites, parsing, auth et vecteurs. | Modifier avec traçabilité lorsqu'un contrat de format évolue ; après publication stable d'une version de format, toute incompatibilité de wire ouvre une nouvelle version de format plutôt qu'une tolérance silencieuse. | -| `docs/rules/*.md` | Définir les règles normatives par portée. | Modifier uniquement pour une décision normative ; incrémenter la version du fichier à chaque enregistrement modifiant son contenu. | -| `docs/rules/PROMPT_STRUCTURE.md` | Définir la structure, le cycle de vie et le dimensionnement des prompts/sessions KSP. | Modifier lorsque le contrat des prompts ou les règles de découpage de sessions/prereleases changent. | -| `docs/architecture/000-README.md` | Indexer les documents décrivant l'architecture KSP décidée ou en cours de cadrage explicite. | Modifier lorsque la structure documentaire d'architecture change. | -| `docs/architecture/*.md` | Décrire les objectifs, frontières, responsabilités et architecture courante ou explicitement proposée. | Ne pas utiliser comme journal de livraison ; distinguer clairement les décisions validées des hypothèses encore ouvertes. | -| `docs/plans/000-README.md` | Indexer les plans de versions/phases. | Modifier lorsque l'organisation des plans change. | -| `docs/plans/*.md` | Organiser une version ou phase complexe et, pour `pre.001`, détailler la prévision souple de ses prereleases. | Faire évoluer le plan lorsque la planification change ; prévoir des tranches intermédiaires bornées et redécouper toute tranche estimée trop lourde. | -| `docs/IDEAS.md` | Conserver les idées, pistes, questions et alternatives à explorer qui ne sont pas encore des engagements du roadmap. | Ajouter une idée dès qu'elle mérite d'être conservée ; mettre à jour son statut lorsqu'elle est explorée, retenue, rejetée ou transférée. | -| futurs documents de référence | Définir vocabulaire, identifiants et références canoniques. | Mettre à jour quand la référence canonique évolue. | -| futures validations | Conserver des résultats réellement exécutés. | Ne jamais enregistrer une validation supposée comme réussie. | +| Fichier/famille | Responsabilité | Règle de modification | +|-----------------------------------|-------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `docs/000-README.md` | Indexer et expliquer la documentation tout en restant en tête des listings et arbres de fichiers. | Modifier lorsque l'organisation durable de `docs/` change ; `000-README.md` reste prioritaire lorsqu'un ordre numérique existe. | +| `docs/formats/000-README.md` | Indexer les spécifications de formats durables KSP destinées à l'interopérabilité externe. | Modifier lorsqu'un format durable entre/sort de cette famille ou que son statut change ; conserver `000-README.md` comme point d'entrée. | +| `docs/formats/*.md` | Spécifier un wire KSP durable indépendamment de son implémentation, avec encodages, limites, parsing, auth et vecteurs. | Modifier avec traçabilité lorsqu'un contrat de format évolue ; après publication stable d'une version de format, toute incompatibilité de wire ouvre une nouvelle version de format plutôt qu'une tolérance silencieuse. | +| `docs/rules/*.md` | Définir les règles normatives par portée. | Modifier uniquement pour une décision normative ; incrémenter la version du fichier à chaque enregistrement modifiant son contenu. | +| `docs/rules/PROMPT_STRUCTURE.md` | Définir la structure, le cycle de vie et le dimensionnement des prompts/sessions KSP. | Modifier lorsque le contrat des prompts ou les règles de découpage de sessions/prereleases changent. | +| `docs/architecture/000-README.md` | Indexer les documents décrivant l'architecture KSP décidée ou en cours de cadrage explicite. | Modifier lorsque la structure documentaire d'architecture change. | +| `docs/architecture/*.md` | Décrire les objectifs, frontières, responsabilités et architecture courante ou explicitement proposée. | Ne pas utiliser comme journal de livraison ; distinguer clairement les décisions validées des hypothèses encore ouvertes. | +| `docs/plans/000-README.md` | Indexer les plans de versions/phases. | Modifier lorsque l'organisation des plans change. | +| `docs/plans/*.md` | Organiser une version ou phase complexe et, pour `pre.001`, détailler la prévision souple de ses prereleases. | Faire évoluer le plan lorsque la planification change ; prévoir des tranches intermédiaires bornées et les couloirs de fermeture. Sa réconciliation finale appartient à l'avant-dernière prerelease documentaire, pas à la dernière prerelease de publication. | +| `docs/IDEAS.md` | Conserver les idées, pistes, questions et alternatives à explorer qui ne sont pas encore des engagements du roadmap. | Ajouter une idée dès qu'elle mérite d'être conservée ; mettre à jour son statut lorsqu'elle est explorée, retenue, rejetée ou transférée. | +| futurs documents de référence | Définir vocabulaire, identifiants et références canoniques. | Mettre à jour quand la référence canonique évolue. | +| futures validations | Conserver des résultats réellement exécutés. | Ne jamais enregistrer une validation supposée comme réussie. La validation finale est réconciliée et fermée dans l'avant-dernière prerelease documentaire, avant la dernière prerelease de publication. | ## Répertoire `config/` @@ -61,10 +61,10 @@ Pour un document standard profilé, `default_profile` et `profiles` sont des cl ## Répertoire `prompts/` -| Fichier/famille | Responsabilité | Règle de modification | -|-----------------------------|----------------------------------------------------------------------------------------------------|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| `prompts/000-README.md` | Point d'entrée des prompts et de leur cycle de vie. | Modifier lorsque l'organisation pratique des prompts change ; les règles normatives restent sous `docs/rules/PROMPT_STRUCTURE.md`. | -| `prompts/*START_PROMPT*.md` | Conserver un prompt de reprise versionné et réutilisable pour ouvrir une phase/version de travail. | Le créer tôt sous forme de brouillon lorsque la trajectoire devient assez claire, le mettre à jour au fil des décisions, puis le finaliser pendant la phase documentaire de clôture avant son utilisation. | +| Fichier/famille | Responsabilité | Règle de modification | +|-----------------------------|----------------------------------------------------------------------------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| `prompts/000-README.md` | Point d'entrée des prompts et de leur cycle de vie. | Modifier lorsque l'organisation pratique des prompts change ; les règles normatives restent sous `docs/rules/PROMPT_STRUCTURE.md`. | +| `prompts/*START_PROMPT*.md` | Conserver un prompt de reprise versionné et réutilisable pour ouvrir une phase/version de travail. | Le créer tôt sous forme de brouillon lorsque la trajectoire devient assez claire et le mettre à jour au fil des décisions ; sa finalisation appartient exclusivement à la dernière prerelease de préparation de publication, avec CHANGELOG et ROADMAP. | ## Répertoire `deltas/` @@ -72,6 +72,12 @@ Pour un document standard profilé, `default_profile` et `profiles` sont des cl |----------------------------------|---------------------------------------------------------------------------------------------------------------------------------------------------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| | `deltas//.md` | Tracer une livraison précise, sa base, son contenu, ses suppressions, validations et questions ouvertes, regroupée sous la version cible `X.Y.Z`. | Créé avec la livraison ; une livraison déjà publiée n'est pas réécrite silencieusement. Les prereleases utilisent `pre.NNN`, leurs correctifs `pre.NNN-fix.NNN`, et les publications de release utilisent `rel.NNN`. | +## Séparation des fichiers pendant la fermeture + +La prerelease de réconciliation documentaire possède la dernière passe sur les README/USAGE, plans, validations et références durables de la release. Après son gate, ces familles sont considérées figées pour la préparation de publication. + +La dernière prerelease ne rouvre pas ces documents : son payload fonctionnel est limité au prompt suivant, `CHANGELOG.md` et `ROADMAP.md`, en plus des fichiers mécaniques de version/delta exigés par le workflow. Si un document durable doit encore être corrigé, une nouvelle prerelease documentaire est ouverte et la tranche de publication finale est décalée. + ## Rust | Fichier/famille | Responsabilité | Règle de modification | diff --git a/docs/rules/PROMPT_STRUCTURE.md b/docs/rules/PROMPT_STRUCTURE.md index 478452c..3643e73 100644 --- a/docs/rules/PROMPT_STRUCTURE.md +++ b/docs/rules/PROMPT_STRUCTURE.md @@ -1,5 +1,5 @@ - + # Structure des prompts KSP @@ -19,8 +19,42 @@ Sauf raison explicitement documentée : - `pre.001` = lectures obligatoires + audit interne/externe + brainstorming + sizing + planification ; - les prereleases intermédiaires = tranches bornées de développement/validation ; -- la dernière prerelease = validation finale + documentation + nettoyage/archivage + prompt de la release suivante ; -- une `fix` corrige l'étape réellement livrée sans réécrire l'historique. +- la fermeture réserve des prereleases distinctes pour le gate technique/live, la réconciliation documentaire puis la préparation de publication ; +- la dernière prerelease avant `rel.NNN` est une tranche de publication minimale, distincte de la réconciliation documentaire et des smokes ; +- une `fix` corrige uniquement la responsabilité de la tranche à laquelle il est rattaché et ne sert pas à absorber un autre couloir de fermeture. + +## Séparation obligatoire des dernières prereleases + +La queue de fermeture d'une release est structurée de manière à empêcher qu'un correctif de dernière minute mélange tests réseau, documentation durable et préparation de publication. + +Lorsqu'un smoke final ou un autre gate live est pertinent, les trois dernières responsabilités sont ordonnées ainsi : + +```text +pre.N-2 gate technique/live : smoke(s), graphes ou vérifications finales directement liées au runtime +pre.N-1 réconciliation documentaire : plan, validation, README, USAGE et autres références durables concernées +pre.N préparation de publication : prompt suivant + CHANGELOG + ROADMAP uniquement +rel.001 mécanique de publication stable +``` + +Les numéros `N-2`, `N-1` et `N` sont relatifs : l'insertion d'une tranche ou d'une correction décale la numérotation réelle sans affaiblir cette séparation. + +Si aucun smoke/gate live final n'existe, le couloir `pre.N-2` est omis ; les deux dernières prereleases restent néanmoins séparées entre réconciliation documentaire et préparation de publication. + +La dernière prerelease ne modifie fonctionnellement que : + +```text +prompt de démarrage de la release suivante +CHANGELOG.md +ROADMAP.md +``` + +Les fichiers mécaniques imposés par le workflow restent autorisés : `Cargo.toml` pour la version d'une prerelease non-fix et `deltas//pre.NNN.md` pour sa traçabilité. Aucun README, USAGE, plan, validation, code, test, schema, config ou règle normative ne doit être introduit ou corrigé dans cette dernière tranche. + +La prerelease documentaire immédiatement précédente possède la réconciliation finale des documents durables de la release : README/USAGE, plan, validation, architecture/référence concernée et cohérence documentaire globale. Elle ne finalise ni `CHANGELOG.md`, ni `ROADMAP.md`, ni le prompt de la release suivante. + +Le gate technique/live, lorsqu'il existe, précède cette réconciliation documentaire. Les smokes et leurs corrections restent donc isolés avant que les documents finaux soient figés. + +Un `fix` reste local à son couloir. Si un défaut d'une responsabilité antérieure est découvert après avoir avancé, il ne doit pas être glissé dans le `fix` de la tranche courante : une nouvelle tranche dédiée à la responsabilité concernée est ouverte, puis les couloirs de fermeture postérieurs sont rejoués si nécessaire. La livraison `rel.NNN` ne sert jamais à absorber un correctif fonctionnel ou documentaire qui aurait dû être traité en prerelease. ## Dimensionnement @@ -28,6 +62,8 @@ Lors de `pre.001`, une prerelease intermédiaire estimée à plus d'environ **15 La trajectoire initiale est **souple** : elle indique un nombre prévisionnel de prereleases, leur objectif et leur ordre, mais autorise l'insertion de tranches/fixes lorsqu'un audit ou une validation révèle un besoin réel. La fermeture ne doit jamais être forcée pour respecter un numéro prévu. +La prévision `pre.001` réserve explicitement les couloirs de fermeture applicables : gate technique/live éventuel, réconciliation documentaire, puis préparation de publication minimale. Leur numérotation peut dériver, mais leur ordre et leur séparation de responsabilités restent normatifs. + ## Structure obligatoire d'un prompt de démarrage Un prompt de nouvelle session contient explicitement, dans un ordre facile à retrouver : diff --git a/docs/rules/VERSION_WORKFLOW.md b/docs/rules/VERSION_WORKFLOW.md index 79d48eb..ff2e7b1 100644 --- a/docs/rules/VERSION_WORKFLOW.md +++ b/docs/rules/VERSION_WORKFLOW.md @@ -1,5 +1,5 @@ - + # Versionnement, sessions et livraisons @@ -69,6 +69,14 @@ Les règles `VER-*` définissent la progression des versions KSP, les identifian - **VER-LIFECYCLE-001** — La première prerelease d'une nouvelle phase fonctionnelle est prioritairement consacrée au brainstorming, à l'inventaire, aux risques, dépendances, hors-périmètre, critères de validation et plan de travail. - **VER-LIFECYCLE-002** — Une phase importante ne commence pas directement par des modifications fonctionnelles dispersées sans cadrage. -- **VER-LIFECYCLE-003** — La dernière prerelease d'une phase est prioritairement consacrée aux validations finales, écarts résiduels, documentation finale, synthèse changelog et prompt de reprise. +- **VER-LIFECYCLE-003** — La dernière prerelease avant `rel.NNN` est une tranche de préparation de publication minimale. Hors `Cargo.toml` et delta obligatoires, elle ne modifie que le prompt de démarrage de la release suivante, `CHANGELOG.md` et `ROADMAP.md`. - **VER-LIFECYCLE-004** — Le document de planification établi ou révisé pendant `pre.001` d'une version détaille une prévision souple des prereleases de cette version : objectifs de chaque tranche, ordre envisagé, dépendances, validations et éventuels hors-périmètre. Cette prévision peut être réorganisée lorsque la réflexion ou le développement le justifie ; le delta trace ces changements. - **VER-LIFECYCLE-005** — Le `ROADMAP.md` n'est pas obligé de reprendre une entrée par prerelease. Il décrit la trajectoire globale ; le plan de version porte le découpage prévisionnel plus fin des prereleases. + +- **VER-LIFECYCLE-006** — La prerelease immédiatement antérieure à la dernière prerelease de publication est dédiée à la réconciliation documentaire finale : plan, validation, README, USAGE et autres documents durables concernés. Elle ne finalise pas `CHANGELOG.md`, `ROADMAP.md` ni le prompt de la release suivante. +- **VER-LIFECYCLE-007** — Lorsqu'un smoke final, un test live ou un gate réseau/provider est requis, une prerelease technique dédiée précède la prerelease de réconciliation documentaire. Cette tranche peut également porter les graphes et contrôles techniques finaux directement liés au gate, mais elle ne mélange pas la réconciliation README/USAGE ni la préparation de publication. +- **VER-LIFECYCLE-008** — Lorsqu'aucun smoke/gate live final n'est pertinent, la tranche technique dédiée peut être omise ; les deux dernières responsabilités restent obligatoirement séparées entre réconciliation documentaire puis préparation de publication. +- **VER-LIFECYCLE-009** — Un correctif `pre.NNN-fix.MMM` reste strictement dans le périmètre de responsabilité de `pre.NNN`. Un fix de smoke ne corrige pas README/USAGE/CHANGELOG/prompt ; un fix documentaire ne contient pas de nouveau smoke/runtime ; un fix de publication ne contient pas de correction documentaire durable hors `CHANGELOG.md`, `ROADMAP.md` et prompt suivant. +- **VER-LIFECYCLE-010** — Si une anomalie appartenant à un couloir antérieur est découverte après son franchissement, elle ouvre une nouvelle prerelease dédiée à cette responsabilité au lieu d'être mélangée au fix de la tranche courante. Les couloirs postérieurs sont ensuite rejoués si nécessaire afin que la dernière prerelease reste une préparation de publication minimale. +- **VER-LIFECYCLE-011** — Le plan établi en `pre.001` réserve explicitement, dans sa prévision souple, le gate technique/live éventuel, la réconciliation documentaire et la préparation de publication. La numérotation peut évoluer, mais l'ordre de ces responsabilités ne doit pas être fusionné pour raccourcir artificiellement la release. +- **VER-LIFECYCLE-012** — Une livraison `rel.NNN` effectue la mécanique de publication stable et ne sert pas de tranche de rattrapage. Tout nouveau défaut fonctionnel, test live manquant, correction README/USAGE/validation, ou préparation CHANGELOG/ROADMAP/prompt non achevée renvoie vers une prerelease appropriée avant `rel.NNN`. diff --git a/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md b/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md index d6afa43..aade42a 100644 --- a/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md +++ b/docs/validation/012-V0_2_9_YELLOWSTONE_GRPC.md @@ -1,9 +1,9 @@ - + # Validation `0.2.9` — Yellowstone gRPC standard + PublicNode -**Statut courant : `pre.011` est fermée par gate opérateur complet sans warning. `pre.012` est la candidate de fermeture technique : réaudit upstream, smoke PublicNode Mainnet opt-in, graphes Cargo finaux, documentation, audit des tableaux Markdown et prompt `0.2.10 — OrbitFlare Yellowstone gRPC`. Les logs historiques détaillés restent dans `deltas/0.2.9/`.** +**Statut courant : le gate déterministe de `pre.012` est vert sans warning ; le smoke PublicNode live et les graphes Cargo finaux ne figurent pas comme exécutés dans le log opérateur fourni. `pre.012-fix.001` ajoute la règle durable de séparation de fermeture et déplace les gates restants vers `pre.013` technique/live, `pre.014` réconciliation documentaire et `pre.015` publication minimale.** ## 1. Autorités et baseline courante @@ -348,75 +348,111 @@ Les détails de commandes, warnings corrigés et fichiers exacts restent dans le Cette table remplace les anciens appendices numérotés successivement `19.x`, `20`, `21`, etc. qui rendaient le document ambigu. -## 12. Gate opérateur `pre.012` +## 12. Verdict opérateur `pre.012` -### 12.1 Preuves source déjà matérialisées +### 12.1 Gate déterministe reçu -| Exigence | État candidate | -|----------------------------------------------|----------------------| -| réaudit `master` Yellowstone | **PASS SOURCE** | -| service `Geyser` et wire N2 inchangés | **PASS SOURCE** | -| licence proto Apache-2.0 toujours déclarée | **PASS SOURCE** | -| PublicNode Mainnet endpoint officiel | **PASS SOURCE** | -| PublicNode Testnet hostname exact | **EXTERNAL BLOCK** | -| smoke Mainnet programmatique sans credential | **ADDED, NOT RUN** | -| README/USAGE Yellowstone + Config V3 | **SOURCE OK** | -| règles tableaux Markdown | **ADDED** | -| audit mécanique tableaux | **ADDED** | -| prompt `0.2.10` OrbitFlare | **ADDED** | -| graphes Cargo finaux | **PENDING OPERATOR** | -| workspace final | **PENDING OPERATOR** | +| Exigence | Résultat opérateur | +|----------------------------------------------|--------------------------------------| +| `cargo fmt --all` | **PASS** | +| audit Rust workspace | **PASS, 0 candidate export** | +| audit Markdown | **PASS, 87 tableaux / 252 fichiers** | +| `cargo check --workspace` | **PASS** | +| `cargo clippy --workspace --all-targets` | **PASS sans warning** | +| Config unit | **113/113 PASS** | +| Config public API | **15/15 PASS** | +| Config ownership | **5/5 PASS** | +| Transport unit | **383/383 PASS** | +| Transport public API | **49/49 PASS** | +| Transport release completeness | **43/43 PASS** | +| Transport doctests | **4/4 PASS** | +| workspace dependencies | **3/3 PASS** | +| `cargo test --workspace` | **PASS** | +| smoke Mainnet programmatique sans credential | **NOT RUN, ignored** | +| graphes Cargo finaux | **NOT PROVIDED / NOT RUN** | -Le réaudit `master` distingue explicitement le plugin courant du dernier tag GitHub indexé : `master` déclare `yellowstone-grpc-geyser 15.1.2`, `yellowstone-grpc-client 13.3.0`, `yellowstone-grpc-proto 12.6.0` et Agave `4.2.0`, alors que la page des releases indexée expose encore `v14.2.2+solana.4.1.0` comme dernière release publiée. Aucun numéro n'est fusionné artificiellement. +Le test `yellowstone_publicnode_smoke` compile et apparaît correctement comme `ignored` dans les tests Transport et workspace, mais cela ne constitue pas une exécution live. Aucune preuve de `cargo tree` final n'est présente dans le log fourni. -### 12.2 Commandes requises +### 12.2 Effet de `pre.012-fix.001` + +Le fix ne change ni runtime, ni schema, ni Config, ni smoke. Il corrige le workflow de fermeture afin que les responsabilités restantes ne soient plus mélangées : + +```text +pre.013 technique/live : smoke PublicNode + graphes Cargo finaux +pre.014 réconciliation documentaire : plan/validation/README/USAGE/références +pre.015 publication minimale : prompt suivant + CHANGELOG + ROADMAP +rel.001 mécanique stable uniquement +``` + +Le contenu prompt/README/USAGE déjà préparé en `pre.012` n'est pas supprimé rétroactivement. Le prompt reste un brouillon jusqu'à `pre.015` ; README/USAGE seront réconciliés définitivement en `pre.014`. + +## 13. Gate `pre.013` — technique/live + +Commandes minimales : ```bash cargo fmt --all python3 scripts/audit_rust_workspace_rules.py -python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.9 cargo check --workspace cargo clippy --workspace --all-targets -cargo test -p ksp-config-lib -cargo test -p ksp-onchain-transport-lib -cargo test -p ksp-core-lib --test workspace_dependencies -cargo test --workspace cargo tree -p ksp-onchain-transport-lib cargo tree -p ksp-onchain-transport-lib --duplicates cargo tree --duplicates -``` - -Smoke live séparé : - -```bash cargo test -p ksp-onchain-transport-lib --test yellowstone_publicnode_smoke -- --ignored --nocapture ``` -Une commande non exécutée n'est jamais déclarée réussie. Le smoke peut révéler un incident externe ; ce résultat doit être consigné sans transformer un échec réseau/provider en défaut local fictif. - -## 13. Compliance finale et verdict stable - -### 13.1 Inventaires à préserver +Verdicts attendus : ```text -HTTP current typed 52/52 -HTTP historical 14/14 Deprecated/Removed -Standard WebSocket 9 familles / 18 opérations -Helius LaserStream WebSocket 7 familles standard + transaction + slotsUpdates -Yellowstone unary 7/7 -Yellowstone Subscribe standard N2 + 9 updates -Config Transport V1/V2/V3 backward-readable +smoke Mainnet réellement exécuté +GetVersion + GetSlot via TLS sans credential ou incident externe précisément classifié +graphes Cargo inspectés +aucun changement README/USAGE/prompt/CHANGELOG/ROADMAP ``` -### 13.2 Documentation et règles +Un défaut local découvert dans ce gate reste dans `pre.013-fix.NNN`. Un incident externe n'est jamais maquillé en PASS local. -Le format des tableaux Markdown devient normatif dans `RULES_DOCUMENTATION.md` : aucun pipe littéral ou échappé dans une cellule, colonnes alignées sur le contenu le plus large, une seule marge d'espace autour du contenu maximal, et séparateurs dimensionnés exactement. Le canari `scripts/audit_markdown_tables.py` vérifie mécaniquement les fichiers Markdown modifiés hors blocs de code. +## 14. Gate `pre.014` — réconciliation documentaire -Le nettoyage `pre.012` a également normalisé les neuf documents modifiables qui présentaient encore des écarts connus. Le scan de préparation sur les documents KSP, crates et deltas `0.2.9` est vert sur 87 tableaux dans 116 fichiers. Les seuls écarts trouvés par un scan de tout le repository appartiennent à d'anciens deltas `0.1.4` immuables ; ils ne sont pas réécrits uniquement pour du formatage. +Cette tranche ferme les documents durables après le gate technique réel : -### 13.3 Verdict stable +```text +plan 016 +validation 012 +README/USAGE Transport +documents de référence 0.2.9 réellement concernés +audit Markdown des documents touchés +``` -`0.2.9` peut devenir stable lorsque le gate opérateur `pre.012` confirme tous les points locaux suivants : +Elle n'introduit aucun nouveau runtime/smoke et ne finalise pas `CHANGELOG.md`, `ROADMAP.md` ni le prompt suivant. + +Le verdict de la validation 012 devient définitif dans cette tranche, sur la base exclusive des preuves réellement exécutées en `pre.013` et des gates antérieurs. + +## 15. Gate `pre.015` — préparation de publication + +Payload fonctionnel autorisé : + +```text +prompts/015-V0_2_10_START_PROMPT.md +CHANGELOG.md +ROADMAP.md +``` + +Seuls les fichiers mécaniques de version et de traçabilité (`Cargo.toml`, delta `pre.015`) peuvent s'ajouter à ce payload. Aucun README, USAGE, plan, validation, règle, code, test, schema ou config ne doit être corrigé dans `pre.015`. + +Si un tel défaut est découvert, une nouvelle prerelease dédiée est ouverte puis la préparation de publication est rejouée sous un nouveau numéro. + +## 16. Verdict stable attendu avant `rel.001` + +`0.2.9` peut passer à `rel.001` seulement après la séquence suivante : + +```text +pre.013 technique/live fermé +pre.014 réconciliation documentaire fermée +pre.015 prompt/CHANGELOG/ROADMAP fermé +``` + +Et si tous les invariants suivants sont vrais : ```text standard vs extension explicitement classifié @@ -427,14 +463,13 @@ resource/backpressure/lifecycle verts reconnect/replay sans promesse lossless Config V3 backward V1/V2 provider/protocol distincts -PublicNode Mainnet smoke exécuté avec résultat consigné +PublicNode Mainnet live exécuté avec résultat consigné Testnet jamais inventé HTTP/WS/Helius non régressés dependency firewall vert cargo graphs inspectés -README/USAGE finaux -prompt 0.2.10 prêt +README/USAGE réconciliés avant la dernière pre +validation 012 fermée avant la dernière pre +prompt/CHANGELOG/ROADMAP seuls dans la dernière pre workspace final vert ``` - -Le bloc Testnet n'est pas un faux FAIL local : l'existence du service est confirmée, mais l'endpoint exact reste indisponible dans la source officielle consultée. Il est donc fermé comme limite externe documentée, sans profil ni smoke inventé.