0.3.15-pre.016

This commit is contained in:
2026-09-19 05:08:05 +02:00
parent b1b0e91616
commit 5f19786ce9
4 changed files with 208 additions and 9 deletions

View File

@@ -1,12 +1,12 @@
# file: Cargo.toml # file: Cargo.toml
# version: 633 # version: 634
[workspace] [workspace]
resolver = "3" resolver = "3"
members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-raw-transaction-ingest-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-raw-transaction-lib", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api", "crates/ksp-worker-raw-transaction-ingest-lib"] members = ["crates/ksp-app-backfill-desk", "crates/ksp-app-config-desk", "crates/ksp-app-raw-transaction-ingest-desk", "crates/ksp-app-solprices-desk", "crates/ksp-app-store-desk", "crates/ksp-app-wallet-desk", "crates/ksp-config-lib", "crates/ksp-core-lib", "crates/ksp-interface-lib", "crates/ksp-job-api", "crates/ksp-job-backfill-lib", "crates/ksp-logging-lib", "crates/ksp-offchain-transport-lib", "crates/ksp-onchain-transport-lib", "crates/ksp-program-api", "crates/ksp-raw-transaction-lib", "crates/ksp-store-api", "crates/ksp-store-lib", "crates/ksp-store-postgres-lib", "crates/ksp-wallet-lib", "crates/ksp-worker-api", "crates/ksp-worker-raw-transaction-ingest-lib"]
[workspace.package] [workspace.package]
version = "0.3.15-pre.15.fix.1" version = "0.3.15-pre.16"
edition = "2024" edition = "2024"
license = "MIT" license = "MIT"
repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project" repository = "https://git.sasedev.com/Sasedev/khadhroony-solana-project"

137
deltas/0.3.15/pre.016.md Normal file
View File

@@ -0,0 +1,137 @@
<!-- file: deltas/0.3.15/pre.016.md -->
<!-- version: 1 -->
# Delta v0.3.15-pre.016 — gate technique/live final
## Base
```text
ksp-general-0.3.15-pre.015-fix.001.zip
SHA-256: f5048fdf4b77c418b359ba363aafa1e0d2a1ec65d5d111bc85776d5067afb012
```
Le gate opérateur de la base est vert : audits Rust/Markdown, `cargo check --workspace`, Clippy strict, suites ciblées et workspace sans échec. Les canaris récents confirment `396/396` unitaires Transport, `49/49` release completeness Transport, `161/161` unitaires Worker et `50/50` unitaires Raw Transaction Ingest Desk.
Le live Mainnet de la base ferme également `pre.015` : Yellowstone et HTTP Block Polling restent actifs ensemble environ 19 minutes, sans `grpc_backpressure_overflow`, sans `Yellowstone subscribe update queue overflowed` et sans terminal `Faulted`; les deux Stop ciblés finissent `Stopped/Healthy`.
## Objet
Ouvrir exclusivement le gate technique/live final de `0.3.15` conformément à `VER-LIFECYCLE-007`. Aucun nouveau comportement métier, runtime, test fonctionnel, frontend, Config, schema, migration ou dépendance n'est introduit.
Cette tranche ne modifie aucun :
```text
crates/**/src/**
crates/**/tests/**
crates/**/unit_tests/**
frontend/**
config/**
manifest de crate
README / USAGE durable
CHANGELOG.md
ROADMAP.md
prompt suivant
```
## Version
```text
workspace.package.version : 0.3.15-pre.16
root Cargo header counter : 634
```
Aucune autre propriété Cargo n'est modifiée.
## Gate technique final attendu
```bash
cargo fmt --all
cargo fmt --all -- --check
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.3.15
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-store-postgres-lib --all-targets --all-features
cargo test -p ksp-onchain-transport-lib --all-targets --all-features
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features
cargo test -p ksp-app-raw-transaction-ingest-desk --all-targets --all-features
cargo test --workspace --all-targets --all-features
cargo tree -p ksp-onchain-transport-lib --edges normal
cargo tree -p ksp-onchain-transport-lib -e features
cargo tree -p ksp-worker-raw-transaction-ingest-lib --edges normal
cargo tree -p ksp-worker-raw-transaction-ingest-lib -e features
cargo tree -p ksp-app-raw-transaction-ingest-desk --edges normal
cargo tree -p ksp-app-raw-transaction-ingest-desk -e features
cargo tree --duplicates
(cd crates/ksp-app-raw-transaction-ingest-desk && cargo tauri build)
```
Les graphes sont rejoués même si cette tranche ne modifie aucune dépendance : Transport doit rester provider-neutral, le Worker doit rester dépendant des façades existantes sans backend physique, et la Desk doit composer Config/Transport/Store/Worker sans edge PostgreSQL direct.
## Gate live
Aucun nouveau live n'est requis par `pre.016` elle-même tant que son inventaire reste strictement mécanique/documentaire : `pre.015-fix.001`, base immédiate et runtime-identique, possède déjà la preuve live longue requise.
La preuve héritée est :
```text
Yellowstone Mainnet + HTTP Block Polling : ~19 minutes en parallèle
Faulted : 0
grpc_backpressure_overflow : 0
Yellowstone subscribe update queue overflowed : 0
Yellowstone Stop : Stopped / Healthy
HTTP Block Polling Stop : Stopped / Healthy
```
Si le gate technique impose une modification runtime, cette preuve n'est plus suffisante : le changement doit suivre le lifecycle approprié et le live final doit être rejoué.
## Fichiers ajoutés
```text
deltas/0.3.15/pre.016.md
```
## Fichiers modifiés
```text
Cargo.toml
docs/plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md
docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md
```
## Fichiers supprimés
Aucun.
## Validations exécutées dans l'environnement de génération
```text
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.3.15
contrôle statique du scope gate-only
contrôle de version/header
contrôle différentiel exact
reconstruction overlay de l'archive
intégrité ZIP
```
Cargo/rustc/rustfmt ne sont pas disponibles dans l'environnement de génération ; aucun résultat du gate `pre.016` n'est déclaré PASS avant rejeu opérateur.
## Questions ouvertes
Aucune question de design. Tout échec appartenant au gate ouvre `pre.016-fix.NNN`. Une anomalie d'un couloir antérieur suit `VER-LIFECYCLE-010`.
## Suite
Après gate entièrement vert :
```text
0.3.15-pre.017 — réconciliation documentaire finale
0.3.15-pre.018 — préparation publication minimale + prompt 0.3.16
0.3.15-rel.001 — publication stable mécanique
```

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md --> <!-- file: docs/plans/036-V0_3_15_RAW_TRANSACTION_INGEST_DESK_PLAN.md -->
<!-- version: 24 --> <!-- version: 25 -->
# Plan v0.3.15 — Raw Transaction Ingest Desk # Plan v0.3.15 — Raw Transaction Ingest Desk
@@ -869,19 +869,25 @@ Budget cible : une tranche de convergence/completeness cross-layer, sans modific
### `pre.015` — Yellowstone sustained gRPC backpressure ### `pre.015` — Yellowstone sustained gRPC backpressure
**État : en cours.** Le live prolongé de `pre.014-fix.001` a reproduit `Yellowstone subscribe update queue overflowed` à `22:09:54`, alors que le Stop opérateur n'est demandé qu'à `22:12:03`. `pre.013` a donc amélioré le débit sans fermer le défaut durable : lorsque les `256` slots pending Worker sont pleins, le Worker suspend `next_update()` ; la queue Transport bornée de `256` updates finit ensuite par se remplir et son ancien `try_send` transforme cette pression locale en faute terminale `grpc_backpressure_overflow`. **État : implémenté et validé après `pre.015-fix.001`.** Le live prolongé de `pre.014-fix.001` avait reproduit `Yellowstone subscribe update queue overflowed` à `22:09:54`, alors que le Stop opérateur n'était demandé qu'à `22:12:03`. `pre.013` avait donc amélioré le débit sans fermer le défaut durable : lorsque les `256` slots pending Worker étaient pleins, le Worker suspendait `next_update()` ; la queue Transport bornée de `256` updates finissait ensuite par se remplir et son ancien `try_send` transformait cette pression locale en faute terminale `grpc_backpressure_overflow`.
La correction conserve toutes les bornes et n'augmente aucune queue. L'acteur Yellowstone Transport remplace uniquement l'envoi non bloquant de l'update décodée par un `send().await` sélectionné avec le signal de shutdown prioritaire. Une queue pleine suspend ainsi le polling du stream Tonic et propage la backpressure au flux gRPC/HTTP/2 ; lorsque le consumer libère une place, la livraison reprend. Aucun update n'est dropé et aucune allocation non bornée n'est introduite. `grpc_backpressure_overflow` reste un code public valide pour les queues de mutations de requête synchrones/fail-fast et les bornes de message ; seule la saturation de la queue d'updates reçues cesse d'être un terminal local. La correction conserve toutes les bornes et n'augmente aucune queue. L'acteur Yellowstone Transport remplace uniquement l'envoi non bloquant de l'update décodée par un `send().await` sélectionné avec le signal de shutdown prioritaire. Une queue pleine suspend ainsi le polling du stream Tonic et propage la backpressure au flux gRPC/HTTP/2 ; lorsque le consumer libère une place, la livraison reprend. Aucun update n'est dropé et aucune allocation non bornée n'est introduite. `grpc_backpressure_overflow` reste un code public valide pour les queues de mutations de requête synchrones/fail-fast et les bornes de message ; seule la saturation de la queue d'updates reçues cesse d'être un terminal local.
Le gate live doit dépasser la durée de reproduction précédente : Yellowstone Mainnet seul puis Yellowstone + HTTP Block Polling doivent chacun rester actifs au moins 10 minutes, sans WARN `Yellowstone subscribe update queue overflowed`, sans `grpc_backpressure_overflow` et avec Stop ciblé terminant `Stopped`. Une vraie rupture distante reste traitée par le reconnect/replay borné existant. Le gate de `pre.015` a ensuitecouvert une seconde anomalie appartenant au même contrat : après un Stop local explicite, PublicNode pouvait renvoyer un `Status::Unknown` pendant le half-close et remplacer à tort la terminaison coopérative par `source_failed`. `pre.015-fix.001` limite la correction à `finish_client_half_close()` : un status reçu après fermeture locale engagée produit `Closed`, tandis qu'un status reçu pendant une session active reste soumis au reconnect puis à `grpc_status` si la reprise échoue.
Budget cible : une tranche corrective Transport/acquisition, sans croissance d'API publique. Le rejeu opérateur de `pre.015-fix.001` ferme le couloir : audits propres, Cargo/Clippy/tests sans échec, canaris Transport `396/396` et Worker `161/161`; Yellowstone Mainnet et HTTP Block Polling tournent ensemble environ 19 minutes sans `grpc_backpressure_overflow` ni état `Faulted`, puis terminent tous deux `Stopped/Healthy`.
Budget consommé : correction Transport/acquisition sans croissance d'API publique.
### `pre.016` — gate technique/live final ### `pre.016` — gate technique/live final
Exécuter le workspace complet, Clippy strict, suites ciblées, graphes/duplicates, smokes réellement accessibles et build frontend/Tauri final. Aucun nouveau scope métier. **État : ouvert.** Aucun nouveau comportement métier ou runtime n'est introduit. La preuve live de `pre.015-fix.001` est la baseline autoritaire puisque `pre.016` ne modifie ni source, ni test fonctionnel, ni Config, ni manifest de crate, ni frontend.
Budget cible : une tranche technique. Le gate final rejoue : format, audits, `cargo check`, Clippy strict, suites ciblées Store/Transport/Worker/Desk, workspace all-targets/all-features, graphes Cargo des trois composants critiques, duplicates et `cargo tauri build` de la Desk. Les smokes live déjà fournis restent valides tant qu'aucun fichier runtime n'est modifié dans cette tranche.
Tout défaut découvert ici ouvre `pre.016-fix.NNN`. Toute anomalie appartenant à un couloir antérieur ouvre une nouvelle prerelease dédiée conformément à `VER-LIFECYCLE-010`, puis les couloirs de clôture sont rejoués.
Budget cible : une tranche technique de clôture uniquement.
### `pre.017` — réconciliation documentaire finale ### `pre.017` — réconciliation documentaire finale

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md --> <!-- file: docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md -->
<!-- version: 33 --> <!-- version: 34 -->
# Validation v0.3.15 — Raw Transaction Ingest Desk # Validation v0.3.15 — Raw Transaction Ingest Desk
@@ -1072,3 +1072,59 @@ release_v0_3_15_pre_015_fix_001_local_close_status_is_closed_without_weakening_a
Gate live attendu : Yellowstone Mainnet doit rester `Running/Healthy` pendant le run, puis un Stop ciblé doit terminer `Stopped` même si PublicNode répond `Unknown` après le half-close. Une occurrence de `grpc_status` avant la demande de Stop reste un échec réel et ne doit pas être reclassée. Gate live attendu : Yellowstone Mainnet doit rester `Running/Healthy` pendant le run, puis un Stop ciblé doit terminer `Stopped` même si PublicNode répond `Unknown` après le half-close. Une occurrence de `grpc_status` avant la demande de Stop reste un échec réel et ne doit pas être reclassée.
### `pre.016` — ouverture du gate technique/live final
Le retour opérateur de `pre.015-fix.001` ferme la responsabilité backpressure/shutdown de `pre.015`. Après un `cargo clean`, les audits Rust/Markdown sont propres, `cargo check --workspace` et Clippy strict passent, et aucune suite testée ne rapporte d'échec. Les canaris récents passent notamment :
```text
ksp-onchain-transport-lib unitaires : 396 passed / 0 failed
ksp-onchain-transport-lib release completeness : 49 passed / 0 failed
ksp-worker-raw-transaction-ingest-lib unitaires : 161 passed / 0 failed
ksp-app-raw-transaction-ingest-desk unitaires : 50 passed / 0 failed
```
La preuve live finale de la base `pre.015-fix.001` est également cohérente :
```text
21:52:59 Yellowstone Mainnet installé
21:53:02 HTTP Block Polling Mainnet installé
22:11:52 Stop Yellowstone demandé
22:11:57 Yellowstone -> Stopped / Healthy / fault none
22:11:59 Stop HTTP Block Polling demandé
22:12:02 HTTP Block Polling -> Stopped / Healthy / fault none
```
Sur ce run d'environ 19 minutes en parallèle :
```text
worker_state=Faulted : aucune occurrence
grpc_backpressure_overflow : aucune occurrence
Yellowstone subscribe update queue overflowed : aucune occurrence
content_conflict terminal : aucune occurrence
```
`pre.016` ne modifie aucun runtime. Le gate technique final attendu est donc :
```text
cargo fmt --all
cargo fmt --all -- --check
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.3.15
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-store-postgres-lib --all-targets --all-features
cargo test -p ksp-onchain-transport-lib --all-targets --all-features
cargo test -p ksp-worker-raw-transaction-ingest-lib --all-targets --all-features
cargo test -p ksp-app-raw-transaction-ingest-desk --all-targets --all-features
cargo test --workspace --all-targets --all-features
cargo tree -p ksp-onchain-transport-lib --edges normal
cargo tree -p ksp-onchain-transport-lib -e features
cargo tree -p ksp-worker-raw-transaction-ingest-lib --edges normal
cargo tree -p ksp-worker-raw-transaction-ingest-lib -e features
cargo tree -p ksp-app-raw-transaction-ingest-desk --edges normal
cargo tree -p ksp-app-raw-transaction-ingest-desk -e features
cargo tree --duplicates
(cd crates/ksp-app-raw-transaction-ingest-desk && cargo tauri build)
```
Aucun nouveau live n'est requis par cette archive tant que ce scope reste strictement mécanique/documentaire : la base immédiatement précédente possède déjà le run long requis et `pre.016` ne change aucun fichier consommé par le runtime. Une modification runtime découverte nécessaire pendant le gate invaliderait cette non-claim et devrait être portée par un fix ou une nouvelle prerelease conforme au lifecycle.