288 lines
7.8 KiB
Markdown
288 lines
7.8 KiB
Markdown
<!-- file: deltas/0.2.10/pre.002.md -->
|
|
<!-- version: 1 -->
|
|
|
|
# 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.
|