7.8 KiB
Delta 0.2.10-pre.002 — OrbitFlare Devnet Config + characterization smoke
1. Base et version
Base de travail :
0.2.10-pre.001
Validation opérateur fournie sur cette base le 2026-08-25 :
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 :
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 à :
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é :
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 :
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é :
profile_id = orbitflare_devnet
Il conserve les companions standards déjà utilisés sur Devnet :
HTTP = https://api.devnet.solana.com
WS = wss://api.devnet.solana.com
et ajoute exactement un endpoint Yellowstone :
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 :
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 :
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 :
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 :
cargo test -p ksp-onchain-transport-lib --test yellowstone_orbitflare_smoke -- --ignored --nocapture
Interprétation :
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 :
\n\s*\n\s*\n
c'est-à-dire au moins deux lignes vides consécutives hors fenced code block.
Le contrôle :
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 :
.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 :
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 :
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 :
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 :
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é :
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
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 :
pre.003 = gate technique/live final
Si une divergence provider réelle est démontrée :
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.