v0.3.11-pre.010

This commit is contained in:
2026-09-08 17:28:37 +02:00
parent d231eba8be
commit 02919e959e
6 changed files with 634 additions and 5 deletions

View File

@@ -1,5 +1,5 @@
<!-- file: docs/plans/032-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION_PLAN.md -->
<!-- version: 9 -->
<!-- version: 10 -->
# Plan v0.3.11 — fondation runtime du Worker RawTransaction ingest
@@ -744,12 +744,14 @@ Budget cible : **1520 min**. `watch` latest-value, compteurs checked, common
Budget cible : **1520 min**. Drain deadline, stop/fault ordering, saturation, source failure, Store slow/failure, abort+join au timeout, no orphan tasks. Scinder immédiatement si le gate réel dépasse le budget.
État après matérialisation : **implémenté, gate opérateur requis**. Les tâches source privées retournent désormais `ksp_core_lib::Result<()>` dans le `JoinSet` du supervisor ; une erreur source ou un `JoinError` devient `worker_raw_transaction_ingest.source_failed` et incrémente `source_failure_total` sans exposer de texte provider. Le shutdown possède une deadline stricte `shutdown_drain_timeout` ; au timeout, admission, persistences et sources sont fermées/abortées puis toutes rejointes avant `Faulted(worker_raw_transaction_ingest.drain_timeout)`. Le stop reste prioritaire dans le `select!`, mais un Store fault découvert pendant le drain n'est pas masqué par un stop antérieur ; un fault terminal déjà décidé n'est pas remplacé par un stop tardif. La saturation est instrumentée de façon source-neutral au dequeue d'une queue `mpsc` pleine via `backpressure_wait_total`, sans drop ni queue non bornée. Les tests déterministes couvrent source failure, stop/Store fault, saturation et timeout avec absence de tâches orphelines. Aucune source live, aucun Transport, aucun backend direct et aucune nouvelle dépendance/feature ne sont introduits.
État après matérialisation : **implémenté et gate opérateur validé après `pre.009-fix.003`**. Les tâches source privées retournent désormais `ksp_core_lib::Result<()>` dans le `JoinSet` du supervisor ; une erreur source ou un `JoinError` devient `worker_raw_transaction_ingest.source_failed` et incrémente `source_failure_total` sans exposer de texte provider. Le shutdown possède une deadline stricte `shutdown_drain_timeout` ; au timeout, admission, persistences et sources sont fermées/abortées puis toutes rejointes avant `Faulted(worker_raw_transaction_ingest.drain_timeout)`. Le stop reste prioritaire dans le `select!`, mais un Store fault découvert pendant le drain n'est pas masqué par un stop antérieur ; un fault terminal déjà décidé n'est pas remplacé par un stop tardif. La saturation est instrumentée de façon source-neutral au dequeue d'une queue `mpsc` pleine via `backpressure_wait_total`, sans drop ni queue non bornée. Les correctifs `pre.009-fix.001` à `.003` ont uniquement réparé les nouveaux tests (signature de `receive`, annotation du `JoinSet`, `store_guard` et `implicit_return`) sans modifier le code de production ni les dépendances. Le gate communiqué le 8 septembre 2026 est vert sur `fmt`, audits, `check`, Clippy strict, 45 tests de crate et doc-tests. Aucun arbre Cargo n'a été requis car aucune dépendance/feature n'avait changé.
### `pre.010` — hardening public/release/security
Budget cible : **1015 min**. Tests externes exacts : API root, dependencies, historical-surface absence, redaction, error codes, module inventory et scans Config/secret/backend.
État après matérialisation : **implémenté, gate opérateur requis**. Deux suites externes nouvelles ferment la tranche sans modifier le runtime : `hardening.rs` vérifie les sept codes d'erreur publics, la redaction du `WorkerId` et des valeurs invalides, la surface de dépendances exacte, l'usage `crate::Item`, l'absence de surface historique/Backfill/retriever, les scans Config/secret/backend/Transport et l'absence de dépendance retour depuis les couches basses ; `release_completeness.rs` verrouille l'inventaire exact des huit modules de production, les vingt-quatre exports publics crate-root et la présence des canaries externes attendues. Aucun fichier `src/`, aucune dépendance et aucune feature ne changent.
### `pre.011` — gate technique final
Budget cible : **1015 min**. Workspace tests/all-features, Clippy strict, suites ciblées, arbres normal/features, duplicate tree. Aucun nouveau scope fonctionnel.

View File

@@ -1,5 +1,5 @@
<!-- file: docs/validation/028-V0_3_11_RAW_TRANSACTION_INGEST_WORKER_FOUNDATION.md -->
<!-- version: 12 -->
<!-- version: 13 -->
# Validation v0.3.11 — fondation runtime du Worker RawTransaction ingest
@@ -1404,3 +1404,114 @@ cargo test -p ksp-worker-raw-transaction-ingest-lib
```
Critère de passage : races stop/fault déterministes, timeout borné sans tâche orpheline, saturation observable sans drop et frontières de dépendances inchangées.
## 21. `pre.010` — hardening public/release/security
### 21.1 Clôture opérateur de `pre.009-fix.003`
Le gate communiqué le 8 septembre 2026 est vert :
```text
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean (340 table(s), 789 file(s))
cargo check --workspace: PASS
cargo clippy --workspace --all-targets --all-features -- -D warnings: PASS
35 unit tests: PASS
3 dependency-boundary tests: PASS
7 public API tests: PASS
doc-tests: PASS
```
Les trois fixes `pre.009-fix.001` à `.003` ont uniquement corrigé les nouveaux tests ; aucun code de production, edge de dépendance ou feature n'a changé. Aucun `cargo tree` intermédiaire n'était requis.
### 21.2 Surface publique exacte
`pre.010` n'ajoute aucun symbole productif. La suite `release_completeness.rs` verrouille exactement les vingt-quatre exports publics crate-root déjà ouverts par `pre.003` à `pre.009` et interdit `pub mod`.
Inventaire productif exact verrouillé :
```text
admission.rs
error.rs
identity.rs
lib.rs
persistence.rs
runtime.rs
settings.rs
snapshot.rs
```
Aucun nouveau module de production n'est introduit.
### 21.3 Hardening externe et redaction
La suite `hardening.rs` ajoute des preuves externes pour :
```text
7 ErrorCode publics uniques et domain-scoped
WorkerId redacted dans Debug
settings invalides sans echo de valeur ni WorkerId
manifest exact et backend-neutral
crate::Item pour les impl partagées
aucune surface historical/Backfill/checkpoint/discovery/hydration/retriever
aucun Config productif
aucun secret-like material productif
aucun backend Store direct
aucun Transport productif
aucune dépendance retour depuis les couches basses vers le Worker concret
aucun type Tokio/backend/live-source exposé par la crate-root
```
Les scans secret ciblent uniquement des marqueurs à valeur de credential (`api_key`, `authorization`, `bearer`, `password`, `credential`, `secret`) et ne confondent pas les tokens de contrôle runtime avec des secrets.
### 21.4 Dépendances
Le manifest productif reste exactement :
```text
ksp-core-lib
ksp-logging-lib
ksp-raw-transaction-lib
ksp-store-lib (default-features = false)
ksp-worker-api
sha2
tokio (macros, rt, sync, time)
```
Aucun `[dev-dependencies]` ni `[build-dependencies]` n'est ajouté. Aucun arbre Cargo intermédiaire n'est requis puisque le manifest de la crate Worker est inchangé.
### 21.5 Frontière volontaire de `pre.010`
La tranche reste purement tests/release/security et n'introduit aucun :
```text
source live
Transport
Config
backend Store direct
nouvelle API publique
nouveau runtime behavior
nouvelle dépendance/feature
réconciliation README/USAGE
publication metadata
```
`pre.011` reste propriétaire du gate technique final workspace et des arbres Cargo.
### 21.6 Gate opérateur demandé pour `pre.010`
Aucune dépendance ni feature n'est modifiée ; le gate ciblé reste :
```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
cargo check --workspace
cargo clippy --workspace --all-targets --all-features -- -D warnings
cargo test -p ksp-worker-raw-transaction-ingest-lib
```
Critère de passage : toutes les canaries public/release/security sont vertes sans modification de la surface productive.