# Delta `0.2.10-pre.002` — OrbitFlare Devnet Config + characterization smoke ## 1. Base et version Base de travail : ```text 0.2.10-pre.001 ``` Validation opérateur fournie sur cette base le 2026-08-25 : ```text cargo fmt --all PASS python3 scripts/audit_rust_workspace_rules.py PASS python3 scripts/audit_markdown_tables.py PASS / 97 tables / 233 files cargo check --workspace PASS cargo clippy --workspace --all-targets PASS cargo test --workspace PASS cargo tree -p ksp-onchain-transport-lib fourni cargo tree -p ksp-onchain-transport-lib --duplicates fourni ``` Le graphe confirme notamment : ```text yellowstone-grpc-proto 12.6.0 tonic 0.14.6 tonic-prost 0.14.6 prost 0.14.4 tokio 1.53.1 ``` Cette livraison passe à : ```text workspace.package.version = 0.2.10-pre.2 commit attendu = v0.2.10-pre.002 aucun tag prerelease ``` ## 2. Invariant architectural Aucun moteur physique n'est modifié : ```text src/grpc_settings.rs inchangé src/grpc_channel.rs inchangé src/grpc_unary.rs inchangé src/grpc_subscribe.rs inchangé src/grpc_stream.rs inchangé ``` Le standard Yellowstone N2 reste également inchangé. OrbitFlare est matérialisé uniquement par : ```text Config provider profile provider-neutral Yellowstone smoke provider validation/documentation ``` Aucun SDK OrbitFlare, second client Tonic, proto provider, heartbeat moteur ou metadata secrète n'est ajouté. ## 3. Profil Config V3 `orbitflare_devnet` `config/std.transport.json` ajoute un profil dédié : ```text profile_id = orbitflare_devnet ``` Il conserve les companions standards déjà utilisés sur Devnet : ```text HTTP = https://api.devnet.solana.com WS = wss://api.devnet.solana.com ``` et ajoute exactement un endpoint Yellowstone : ```text name = orbitflare_solana_devnet_yellowstone provider = orbitflare cluster = devnet protocol = solana_yellowstone url = http://devnet.rpc.orbitflare.com:10000 metadata = [] secret_metadata = [] ``` Le format reste V3. `.env.example` n'est pas modifié et aucune API key de compte OrbitFlare n'est reclassifiée comme credential gRPC. `ksp-config-lib` ajoute un test déterministe qui prouve : ```text sélection explicite orbitflare_devnet companions HTTP/WS Devnet préservés provider/cluster/protocol gRPC corrects URL plaintext conservée telle quelle aucune metadata inventée Debug gRPC sans URL provider absence de X-ORBIT-KEY dans Transport settings ``` ## 4. Smoke OrbitFlare Devnet Nouveau test opt-in : ```text crates/ksp-onchain-transport-lib/tests/yellowstone_orbitflare_smoke.rs ``` Le test utilise directement les API publiques Yellowstone existantes de Transport, sans dépendre de Config : ```text endpoint Devnet OrbitFlare sans metadata reconnect max_retries = 0 Subscribe slots commitment = confirmed fenêtre de caractérisation = 45 s preuve Slot non nul preuve SubscribeUpdate::Ping serveur close borné ``` Le `Ping` reçu reste traité par le moteur N1 déjà livré en `0.2.9`, qui répond automatiquement sur le même stream. Le test n'ajoute aucune policy heartbeat. Commande live : ```bash cargo test -p ksp-onchain-transport-lib --test yellowstone_orbitflare_smoke -- --ignored --nocapture ``` Interprétation : ```text Slot + Ping PASS OrbitFlare reste standard ; aucune façade/policy provider heartbeat requise connection/auth failure classifier le service/licence réel avant toute metadata Slot PASS mais Ping absent qualifier une divergence heartbeat provider avant toute implémentation spécifique ``` ## 5. Audit Markdown étendu `scripts/audit_markdown_tables.py` passe en version 2 et contrôle désormais aussi l'équivalent structurel de : ```text \n\s*\n\s*\n ``` c'est-à-dire au moins deux lignes vides consécutives hors fenced code block. Le contrôle : ```text considère une ligne whitespace-only comme vide signale fichier + première ligne + longueur de la séquence n'interprète pas les blancs internes aux ``` / ~~~ fenced blocks ignore les répertoires générés ou tiers en parcours récursif ``` Répertoires récursifs exclus : ```text .git .idea .venv __pycache__ dist node_modules target ``` Cette exclusion rend le résultat déterministe entre une archive Gitea propre et un checkout développeur contenant des `node_modules`. Le nombre de fichiers audités peut donc diminuer par rapport à l'ancien script sans signifier une perte de couverture KSP-owned. Une seule séquence de deux lignes vides existait dans le scope KSP actif de l'archive : elle est supprimée dans `crates/ksp-onchain-transport-lib/README.md`. `docs/rules/RULES_DOCUMENTATION.md` formalise `DOC-BLANK-001` à `DOC-BLANK-003`, y compris l'immuabilité des anciens deltas publiés. ## 6. Documents de plan/validation Le plan 017 et la validation 013 passent en version 2 pour enregistrer : ```text pre.001 operator gate fermé profil orbitflare_devnet matérialisé smoke de caractérisation matérialisé N1/N2 inchangés live Devnet encore PENDING ``` Aucun README/USAGE OrbitFlare durable n'est finalisé ici ; cette responsabilité reste réservée au couloir documentaire final. ## 7. Validation disponible dans l'environnement de génération Exécuté sans Cargo : ```text python3 scripts/audit_rust_workspace_rules.py General Rust rule audit: clean Rust export completeness audit: 0 candidate(s) KSP workspace Rust rule audit: clean python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.10 clean / 98 tables / 98 KSP-owned files config/std.transport.json JSON parse PASS JSON Schema validation PASS ``` Le nouvel audit Markdown a aussi été caractérisé avec des fixtures temporaires : ```text deux lignes vides hors fence FAIL attendu plusieurs lignes vides dans fence PASS attendu node_modules récursif ignoré attendu ``` Aucune commande Cargo n'est déclarée exécutée dans l'environnement de génération. ## 8. Gates opérateur `pre.002` Exécuter : ```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.10 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 ``` Puis le live dédié : ```bash cargo test -p ksp-onchain-transport-lib --test yellowstone_orbitflare_smoke -- --ignored --nocapture ``` `pre.002` ne ferme son gate provider que lorsque le résultat live est classifié. Un échec d'auth ou l'absence de `Ping` ne doit jamais être corrigé par modification du moteur N1. ## 9. Fichiers ajoutés/modifiés ```text Cargo.toml config/std.transport.json crates/ksp-config-lib/unit_tests/transport.rs crates/ksp-onchain-transport-lib/README.md crates/ksp-onchain-transport-lib/tests/yellowstone_orbitflare_smoke.rs docs/plans/017-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC_PLAN.md docs/rules/RULES_DOCUMENTATION.md docs/validation/013-V0_2_10_ORBITFLARE_YELLOWSTONE_GRPC.md scripts/audit_markdown_tables.py deltas/0.2.10/pre.002.md ``` ## 10. Suite conditionnelle Si le live retourne `Slot + Ping PASS` : ```text pre.003 = gate technique/live final ``` Si une divergence provider réelle est démontrée : ```text pre.003 = tranche provider-specific minimale au-dessus de N1/N2 pre.004 = gate technique/live final ``` Le couloir documentaire final puis la prerelease de publication restent distincts dans les deux cas.