0.3.15-pre.014-fix.001

This commit is contained in:
2026-09-17 23:09:21 +02:00
parent ad24cb36fa
commit 6d820bf0d7
14 changed files with 648 additions and 67 deletions

View File

@@ -0,0 +1,145 @@
<!-- file: deltas/0.3.15/pre.014-fix.001.md -->
<!-- version: 1 -->
# Delta v0.3.15-pre.014-fix.001 — troncature `logMessages` compatible non terminale
## Base requise
```text
ksp-general-0.3.15-pre.014.zip
SHA-256 : 73435098f6b8a7cfc5e3af4c04d2c7ffd3a39f6edb322ef79b21b16757f70b87
bytes : 124399
```
Le gate opérateur de `pre.014` est vert côté audits/check/Clippy/tests. Le live reproduit un unique `content_conflict` Yellowstone pendant l'exécution parallèle avec HTTP Block Polling.
Le diagnostic `pre.014` ferme la cause : au slot `447781296`, les deux routes voient la même identité de bloc et la même transaction. Seul `meta.logMessages` diffère. Le canonique déjà stocké contient `176` lignes sans troncature ; l'entrant contient `118` lignes et le marqueur exact `Log truncated` au premier point divergent. Toutes les lignes précédentes sont identiques.
## Objectif
Ne plus transformer ce cas précis en erreur terminale Worker lorsque la version complète est déjà canonique.
La règle `0.3.15` reste volontairement étroite :
```text
canonique complet
+ incoming avec même identité / slot / block_time / format
+ même transaction / version / transactionIndex
+ mêmes champs meta hors logMessages
+ exactement un marqueur "Log truncated" côté incoming
+ préfixe identique avant le marqueur
=> canonique inchangé
=> RawEntityWriteOutcome::AlreadyPresent
=> observation entrante persistée
=> aucun content_conflict
=> Worker continue
```
Le matériel situé après le marqueur de troncature n'est pas utilisé pour prouver la complétude. Le marqueur constitue la frontière informationnelle ; la preuve porte sur le préfixe antérieur et sur l'égalité de tous les autres champs.
Restent des conflits en `0.3.15` : préfixe différent avant le marqueur, autre champ `meta` différent, transaction/version/index différents, marqueur absent/non exact/multiple, ou sens inverse `canonique tronqué -> incoming plus complet`. Ce dernier cas exige une promotion canonique atomique et est réservé à `0.3.16`.
## Handoff `0.3.16``0.3.18`
La décision opérateur est consignée durablement :
```text
0.3.16 RAW resilience / variantes / conflits / résolutions / retry-reconnect / Store Desk
0.3.17 ksp-job-backfill-lib multi-route / multi-stratégie
0.3.18 ksp-app-backfill-desk adapté au Job multi-route
```
Le contrat détaillé est ajouté dans `docs/plans/037-V0_3_16_RAW_RESILIENCE_CONFLICT_HANDOFF.md`.
`0.3.16` devra notamment introduire les variantes RAW durables, la classification `Exact / CompatibleLessComplete / CompatibleMoreComplete / Conflict`, la promotion canonique réversible, la quarantaine des vrais conflits sans arrêt du Worker, l'historique de résolution, le retry Store sans perte silencieuse, la reconnexion Transport configurable/bornée et les vues de gestion correspondantes dans Store Desk.
## Fichiers ajoutés
```text
docs/plans/037-V0_3_16_RAW_RESILIENCE_CONFLICT_HANDOFF.md
deltas/0.3.15/pre.014-fix.001.md
```
## Fichiers modifiés
```text
Cargo.toml
ROADMAP.md
crates/ksp-store-postgres-lib/src/raw_transaction.rs
crates/ksp-store-postgres-lib/tests/hardening_completeness.rs
crates/ksp-store-postgres-lib/unit_tests/raw_transaction.rs
docs/architecture/004-COMPONENT_INVENTORY.md
docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md
docs/architecture/011-RAW_TRANSACTION_ACQUISITION.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/031-V0_3_10_RAW_TRANSACTION_INGEST_PLAN.md
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.
## Version
```text
workspace.package.version : 0.3.15-pre.14.fix.1
root Cargo header counter : 629
```
## Canaris ajoutés
```text
v0_3_15_pre_014_fix_001_incoming_truncated_logs_are_compatible_only_when_missing_middle_is_proven
v0_3_15_pre_014_fix_001_truncated_log_compatibility_rejects_unproven_or_reverse_changes
v0_3_15_pre_014_fix_001_truncated_log_compatibility_is_narrow_and_keeps_canonical_content
```
Les tests vérifient notamment que le préfixe divergent, un autre champ `meta`, un marqueur non exact et le sens inverse restent non compatibles. Le contenu situé après le marqueur n'est volontairement pas traité comme preuve de complétude.
## Validations exécutées dans l'environnement de préparation
```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.3.15
Markdown table audit: clean (318 table(s), 224 file(s))
```
Scan statique du diff production : aucun nouvel `unwrap()`, `expect(`, `panic!(`, `unreachable!(`, `unsafe {`, `unbounded_channel` ou `tokio::spawn`.
## Validations non exécutées ici
`cargo` et `rustfmt` ne sont pas disponibles dans l'environnement de préparation. Ne pas considérer les gates suivants comme passés avant exécution opérateur :
```text
cargo fmt --all
cargo fmt --all -- --check
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-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
```
## Gate live requis
Lancer Yellowstone + HTTP Block Polling Mainnet en `confirmed` suffisamment longtemps pour recroiser une transaction avec logs tronqués côté provider.
Attendus :
```text
aucun terminal content_conflict pour FULL déjà canonique + TRUNCATED compatible
Yellowstone reste Running
route non Unhealthy/Faulted pour ce cas
canonique complet inchangé
observation de la route tronquée enregistrée
pas de grpc_backpressure_overflow
```
Le cas inverse `TRUNCATED canonique puis FULL entrant` peut encore produire `content_conflict` en `0.3.15`; il est explicitement reporté à la promotion/variant machinery de `0.3.16` et ne doit pas être maquillé par un overwrite destructif dans ce fix.