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
# version: 633
# version: 634
[workspace]
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"]
[workspace.package]
version = "0.3.15-pre.15.fix.1"
version = "0.3.15-pre.16"
edition = "2024"
license = "MIT"
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 -->
<!-- version: 24 -->
<!-- version: 25 -->
# 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
**É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.
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
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

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/032-V0_3_15_RAW_TRANSACTION_INGEST_DESK.md -->
<!-- version: 33 -->
<!-- version: 34 -->
# 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.
### `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.