40 KiB
Validation 0.3.5 — Interface passive acquisition events
1. Portée
Ce document suit toute la fermeture de 0.3.5. pre.002 matérialise SlotLifecycleEvent; pre.003 admet TransactionExecutionEvent; pre.004 verrouille les canaris externes et la complétude ; pre.005 ajoute le hardening adversarial ; son fix corrige uniquement un faux négatif du canari de manifeste ; pre.006 ferme le gate technique final ; pre.007 réconcilie la documentation durable sans modifier la surface Rust.
Base :
v0.3.4
workspace.package.version = 0.3.4
Version de travail :
0.3.5-pre.7
2. Gate d'entrée v0.3.4
Le log opérateur fourni avec l'archive indique un gate stable v0.3.4 propre : audits Rust/Markdown, cargo check, Clippy, tests ciblés des crates, cargo test --workspace, ksp-store-lib --no-default-features et graphes Store ont été exécutés sans échec visible ; les smokes réseau restent explicitement ignorés/opt-in.
Cette preuve est l'entrée de 0.3.5. Elle n'est pas réétiquetée comme validation exécutée dans l'environnement d'assemblage de pre.001.
3. Gate de lecture pre.001
| Contrôle | Résultat | Preuve / décision |
|---|---|---|
| règles globales relues | PASS | familles KSP-API/TRANSPORT/STORE/NOTIFY/PROC/REL et DEP applicables relues |
| architecture durable relue | PASS | Interface passif, Transport protocol/runtime, Store persistant, composition owner des conversions |
| fondation Interface stable relue | PASS | surface Program petite ; dépendance normale Core-only |
| Store API RAW relu | PASS | RawTransaction* + RawAccount* restent Store-owned |
Store/PostgreSQL 0.3.2–0.3.4 relu |
PASS | RAW physique 10/10 fermé ; aucune rétention account |
| surfaces HTTP/WS/gRPC/Helius relues | PASS | status/log/slot/vote/account/transaction/block/Entry inventoriés |
| documentation Solana courante auditée | PASS | slotSubscribe, slotsUpdatesSubscribe, status/log/vote/account/program, getTransaction/getBlock |
| Yellowstone upstream courant audité | PASS | SlotStatus et familles SubscribeUpdate courantes |
| Helius courant audité | PASS | standard WSS préserve wire Solana ; Enhanced transactionSubscribe reste extension provider |
| producer/consumer inventory | PASS | lifecycle slot 7 stages admis ; TransactionExecutionEvent rouvert comme candidat actif |
| threat model | PASS | mega enum, Option soup, Store duplication, mapping lifecycle explicite et provider promotion couverts |
| sizing release | PASS | 8 prereleases prévues avant rel.001 ; second candidat soumis à gate dédié |
4. Matrice de décision par famille
| Famille | Décision | Owner | Motif déterminant |
|---|---|---|---|
| slot lifecycle intersection | ADMIS | Interface | 7 faits compacts normalisés ; détails protocol/provider restent Transport |
| transaction execution | ADMIS pre.003 |
Interface | slot + TransactionSignature + Succeeded/Failed multi-producer |
| logs realtime | IDÉE DIFFÉRÉE | Interface si futur gate | payload variable/bornes/consumer non démontrés ; ne pas mélanger avec execution |
| signature commitment/snapshot | REPORTÉ | Transport | HTTP snapshot != WS one-shot commitment ; distinct de l'exécution |
| vote | REPORTÉ | Transport | gossip pré-consensus != transaction qualifiée is_vote |
| account/program | REJET Interface | Store/Transport | risque de doublon RawAccountState/observation ou wrapper Transport |
| transaction | REJET Interface | Store/Transport | RawTransaction/observation déjà persistants |
| block | REJET Interface | Transport | conteneur/payload d'acquisition ; aucun besoin passif transversal démontré |
| Yellowstone Entry | REPORTÉ | Transport DTO | mono-producer aujourd'hui ; un futur fait transversal KSP serait réaudité pour Interface |
| persisted-data available notification | REJET Interface | Store API | ownership normatif KSP-NOTIFY-001..006 |
| Helius Enhanced transaction | PRODUCTEUR ADMIS | Transport DTO / Interface fact | DTO provider-specific ; projection conservative vers le fait commun admis |
5. Intersection lifecycle retenue
| Stage Interface prévu | Producer Solana standard | Producer Yellowstone | Verdict | Détails exclus du contrat commun |
|---|---|---|---|---|
Processed |
slotSubscribe |
Processed |
PASS | WS parent/root ; Yellowstone filters/created_at/parent |
FirstShredReceived |
slotsUpdates::FirstShredReceived |
FirstShredReceived |
PASS | timestamps/metadata source |
Completed |
slotsUpdates::Completed |
Completed |
PASS | timestamps/metadata source |
CreatedBank |
slotsUpdates::CreatedBank |
CreatedBank |
PASS | parent reste dans le DTO Transport riche |
Dead |
slotsUpdates::Dead |
Dead |
PASS | diagnostic err/dead_error et timestamp restent Transport |
OptimisticallyConfirmed |
slotsUpdates::OptimisticConfirmation |
Confirmed |
PASS | nom KSP conserve l'optimistic confirmation ; delivery/metadata restent Transport |
Rooted |
rootSubscribe / slotsUpdates::Root |
Finalized |
PASS | nom KSP conserve le fait root ; Finalized reste un label Yellowstone source |
| — | slotsUpdates::Frozen |
— | FAIL | pas d'intersection |
6. Validation anti-Option-soup
Les modèles suivants sont explicitement non admis par le gate :
TransactionStatusObservation {
confirmations?: ...,
confirmation_status?: ...,
received?: ...,
is_vote?: ...,
transaction_index?: ...,
logs?: ...,
...
}
SlotLifecycleEvent {
parent?: ...,
root?: ...,
timestamp?: ...,
dead_error?: ...,
provider?: ...,
...
}
La surface admise reste conceptuellement :
SlotLifecycleEvent { slot, stage }
Le candidat séparé, non encore admis, reste :
TransactionExecutionEvent { slot, signature, outcome }
7. Validation anti-duplication Store
| Modèle Store stable | Action 0.3.5 |
Justification |
|---|---|---|
RawTransaction |
inchangé | payload durable/replayable |
RawTransactionObservation |
inchangé | provenance persistante |
RawAccountState |
inchangé | état account durable |
RawAccountObservation |
inchangé | observation persistante |
| pagination/cursors RAW | inchangés | contrats de navigation Store |
| retention/tombstone transaction | inchangés | lifecycle de persistence Store |
| notification after commit | non implémentée ici | ownership Store API réservé par KSP-NOTIFY-* |
Canari conceptuel : aucun futur fichier source Interface de 0.3.5 ne doit importer ksp_store_api, ksp_store_lib ou copier leurs modèles.
8. Validation dependency/ownership
État de l'archive stable inspecté :
crates/ksp-interface-lib/Cargo.toml
runtime dependency = ksp-core-lib seulement
Cible 0.3.5 :
ksp-interface-lib -> ksp-core-lib
ksp-interface-lib -X-> ksp-onchain-transport-lib
ksp-interface-lib -X-> ksp-store-api
ksp-interface-lib -X-> ksp-store-lib
ksp-interface-lib -X-> ksp-program-api
ksp-interface-lib -X-> serde/tracing/tokio/channel runtime additions
Le gate opérateur de pre.001 confirme cargo check --workspace, Clippy et les tests ksp-interface-lib. Les graphes cargo tree restent réservés au gate technique final de la release.
9. Consumer concret retenu
Consumer proche documenté par l'architecture : futur worker RAW live / composition d'acquisition.
Usage possible sans dépendance protocol-specific :
Solana standard WS -----------+
+-> converter composition -> SlotLifecycleEvent -> réaction lifecycle du consumer
Yellowstone gRPC -------------+
0.3.6 backfill n'est pas forcé d'utiliser ce type ; il reste une composition historique Transport + Store.
10. Threat gates
| Gate | Attendu 0.3.5 |
Statut courant |
|---|---|---|
| mega enum | absent | PLAN PASS |
| protocol/provider enum leakage | absent | PLAN PASS |
| timestamp semantics conflated | absent | PLAN PASS |
| root/finalized label confusion | évitée par le stage KSP Rooted |
PLAN PASS |
| optimistic/confirmed label confusion | évitée par le stage KSP OptimisticallyConfirmed |
PLAN PASS |
| dead diagnostic in shared API | absent | PLAN PASS |
| RAW Store duplication | absent | PLAN PASS |
| event persistence | absent | PLAN PASS |
| event bus/runtime | absent | PLAN PASS |
| network id duplicated from Store | absent | PLAN PASS |
| cross-network use | composition doit conserver son scope réseau | À CANARIER |
| public enum evolution | SlotLifecycleStage doit être non-exhaustive |
IMPLÉMENTÉ pre.002 |
| Core-only graph | aucune dependency nouvelle | PASS opérateur |
| external consumer | type consommable depuis crate externe | CANARI pre.002 |
11. Fichiers de pre.001
Ajoutés :
docs/plans/026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md
docs/validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md
deltas/0.3.5/pre.001.md
Modifié :
Cargo.toml
Aucun autre fichier ne doit changer dans cet overlay.
12. Validations statiques de l'overlay initial
L'overlay pre.001 avait exécuté les audits disponibles dans l'environnement d'assemblage :
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.5
-> Markdown table audit: clean (251 table(s), 137 file(s))
13. Gate opérateur pre.001 reçu avant fix.001
L'opérateur a rejoué depuis un cargo clean :
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.3.5
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-interface-lib
Résultat : PASS intégral.
Preuves synthétiques :
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean (251 table(s), 137 file(s))
cargo check --workspace -> PASS
cargo clippy --workspace --all-targets -> PASS
ksp-interface-lib unit tests -> 10 passed
ksp-interface-lib dependency_boundary -> 4 passed
ksp-interface-lib external_consumer -> 1 passed
ksp-interface-lib public_api -> 5 passed
ksp-interface-lib release_completeness -> 3 passed
doc-tests -> 0 failed
pre.001-fix.001 est documentation-only ; il ne modifie ni Cargo ni Rust. L'opérateur doit néanmoins rejouer les deux audits Markdown/Rust après application du fix pour confirmer l'overlay final.
14. Exit gate pre.001-fix.001
Le gate corrigé impose désormais :
workspace.package.version = 0.3.5-pre.1 inchangée
SlotLifecycle admis avec 7 stages
stages = Processed / FirstShredReceived / Completed / CreatedBank / Dead / OptimisticallyConfirmed / Rooted
Frozen reste hors intersection
TransactionExecutionEvent = candidat actif mais non encore admis
TransactionLogEvent = idée différée, distincte de l'exécution
getSignatureStatuses/signatureSubscribe = snapshot/commitment Transport, non fusionnés avec execution
Helius transactionSubscribe et Yellowstone Entry restent des DTOs Transport
un futur fait provider-neutral produit par une extension provider peut appartenir à Interface après gate
aucun fichier Rust/Transport/Store/Cargo n'est modifié par le fix
15. Gate opérateur post-pre.001-fix.001
Avant l'ouverture de pre.002, l'opérateur a rejoué les audits demandés sur l'état corrigé :
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.5
Résultat fourni : PASS.
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean (240 table(s), 138 file(s))
Ce résultat constitue le gate d'entrée immédiat de 0.3.5-pre.002.
16. Implémentation 0.3.5-pre.002
pre.002 ajoute exactement une famille passive provider-neutral à ksp-interface-lib :
SlotLifecycleStage
Processed
FirstShredReceived
Completed
CreatedBank
Dead
OptimisticallyConfirmed
Rooted
SlotLifecycleEvent
new(slot, stage)
slot()
stage()
Propriétés de représentation matérialisées :
SlotLifecycleStage -> #[non_exhaustive] + Clone + Copy + Debug + Eq + PartialEq
SlotLifecycleEvent -> champs privés + Clone + Copy + Debug + Eq + PartialEq
slot -> u64 conservé exactement, y compris u64::MAX
validation -> aucune admission faillible
error code -> aucun nouvel error code
serde/codec -> absent
runtime/logging -> absent
Transport/Store -> aucune dépendance ni conversion
Le graphe Cargo reste inchangé pour ksp-interface-lib : son manifest n'est pas modifié et sa seule dépendance normale demeure ksp-core-lib.
Canaris ajoutés/ajustés :
unit_tests/slot_lifecycle.rs
-> 7 stages distincts
-> traits Copy/Eq attendus
-> domaine u64 complet
-> Debug borné et provider-neutral
tests/slot_lifecycle_public_api.rs
-> construction et getters depuis crate root
-> match downstream avec wildcard imposé par #[non_exhaustive]
tests/release_completeness.rs
-> inventaire crate-root mis à jour à 8 reexports
-> inventaire de modules mis à jour avec slot_lifecycle uniquement
-> absence de serde/tracing/Transport/Store dans la racine Interface
TransactionExecutionEvent reste non implémenté et réservé au gate pre.003.
17. Fichiers de pre.002
Modifiés :
Cargo.toml
crates/ksp-interface-lib/src/lib.rs
crates/ksp-interface-lib/tests/release_completeness.rs
docs/validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md
Ajoutés :
crates/ksp-interface-lib/src/slot_lifecycle.rs
crates/ksp-interface-lib/unit_tests/slot_lifecycle.rs
crates/ksp-interface-lib/tests/slot_lifecycle_public_api.rs
deltas/0.3.5/pre.002.md
Explicitement inchangés :
crates/ksp-interface-lib/Cargo.toml
crates/ksp-onchain-transport-lib/**
crates/ksp-store-api/**
crates/ksp-store-lib/**
crates/ksp-store-postgres-lib/**
README.md
ROADMAP.md
CHANGELOG.md
18. Gate opérateur demandé pour pre.002
Après application de l'overlay :
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.3.5
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-interface-lib
cargo test -p ksp-program-api
Les validations Cargo de pre.002 restent à exécuter par l'opérateur ; elles ne sont pas déclarées réussies par l'environnement d'assemblage.
19. Gate opérateur pre.002 et correction pre.002-fix.001
Le gate opérateur de pre.002 confirme que le contrat fonctionnel SlotLifecycleEvent compile et que ses tests ciblés passent, mais la tranche n'est pas admissible en l'état : l'audit Rust détecte quinze violations RUST-FMT-101 dans les nouveaux tests et Clippy rejette deux usages de ? ainsi que des closures à retour implicite. Les deux nouveaux tests d'intégration exposent également un warning missing_docs au niveau crate.
pre.002-fix.001 corrige uniquement ces défauts de conformité : suppression des lignes vides à l'intérieur des fonctions, propagation d'erreur explicite par match, return explicite dans les closures concernées et documentation crate-level des tests d'intégration. Aucun contrat public SlotLifecycleEvent / SlotLifecycleStage n'est modifié.
Comme le fix modifie des sources Rust, la version workspace évolue conformément à la politique KSP :
0.3.5-pre.2.fix.1
Le nom documentaire de la correction reste 0.3.5-pre.002-fix.001.
20. Gate opérateur pre.002-fix.001
Le gate opérateur du 2026-08-31 confirme :
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
cargo check --workspace: PASS
cargo clippy --workspace --all-targets: PASS
cargo test -p ksp-interface-lib: PASS
cargo test -p ksp-program-api: PASS
Le seul défaut restant est documentaire : deux lignes vides consécutives dans ce fichier de validation. L'opérateur demande explicitement de ne pas créer un fix dédié pour ce seul défaut ; pre.003 le corrige avec ses propres modifications.
21. Gate TransactionExecutionEvent — pre.003
21.1 Représentation de signature
Verdict : PASS.
La primitive admise est :
TransactionSignature([u8; 64])
Contraintes :
- construction depuis 64 octets déjà décodés uniquement ;
- aucun base58/serde/codec dans Interface ;
Debugmasque systématiquement les bytes ;- aucune dependency Solana supplémentaire ;
- aucune capability de signature Wallet ; il s'agit uniquement d'une identité transactionnelle passive observée.
ksp-store-api::RawTransactionSignature reste Store-owned. Aucun alias, reexport ou conversion implicite cross-domain n'est introduit. Une future composition peut effectuer explicitement la conversion via les 64 octets lorsque nécessaire.
21.2 Convergence producer
| Producer | Slot | Signature | Outcome | Metadata volontairement exclue | Verdict |
|---|---|---|---|---|---|
Solana WS logsSubscribe |
context.slot |
base58, décodée par la composition | err == null / err != null |
logs, commitment, subscription | PASS |
Yellowstone TransactionStatus |
slot |
64 bytes | err None / err Some |
filters, created_at, is_vote, index, opaque error bytes | PASS |
Helius transactionSubscribe |
slot si forme typée |
signature si forme typée | seulement si erreur déterminable | detail mode, transactionIndex, memo, blockTime, confirmation | PASS* |
PASS* Helius signifie projection conservative : aucune TransactionExecutionEvent n'est fabriquée pour une forme none, inconnue ou dont l'erreur d'exécution est absente/indéterminable. Le DTO provider reste Transport-owned.
21.3 Outcome commun
Le contrat n'encode pas les erreurs provider :
Solana `err: null` / Yellowstone `err: None` / Helius `err: null` explicite -> Succeeded
Solana/Yellowstone/Helius erreur explicite -> Failed
Helius `err` omis ou forme inconnue -> aucune projection
Cette normalisation décrit uniquement le résultat d'exécution observé. Elle ne prétend pas encoder un commitment, une finalité, une cause d'erreur, un index de transaction ou une garantie de replay.
21.4 Consumer concret
Verdict : PASS.
Le futur worker RAW live décrit dans docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md peut consommer le fait compact pour déclencher une hydratation/acquisition par signature sans dépendre du DTO source. Le premier backfill historique 0.3.6 ne dépend pas de cet event.
21.5 Anti-duplication Store
Verdict : PASS.
TransactionExecutionEvent ne contient ni payload RAW, format, content hash, block time, provenance, observation key, retention state ni network id durable. Il ne peut donc pas remplacer RawTransaction, RawTransactionReference ou RawTransactionObservation.
21.6 Décision finale
TransactionSignature
TransactionExecutionOutcome
TransactionExecutionEvent
-> ADMIS Interface
TransactionLogEvent
-> idée différée
TransactionCommitmentEvent
-> non admis
DTOs logsSubscribe / Yellowstone TransactionStatus / Helius transactionSubscribe
-> Transport-owned
22. Implémentation 0.3.5-pre.003
Surface ajoutée au crate-root :
TransactionSignature
TransactionExecutionOutcome
TransactionExecutionEvent
API :
TransactionSignature::new([u8; 64])
TransactionSignature::as_bytes()
TransactionExecutionOutcome::{Succeeded, Failed}
TransactionExecutionEvent::new(slot, signature, outcome)
TransactionExecutionEvent::slot()
TransactionExecutionEvent::signature()
TransactionExecutionEvent::outcome()
TransactionExecutionOutcome est #[non_exhaustive]. Les deux Debug contenant une signature sont bornés et n'affichent aucun byte de signature.
Le graphe normal visé reste :
ksp-interface-lib
└── ksp-core-lib
Aucun converter Transport, aucune dependency Store, aucun serde, logging, runtime, channel ou codec n'est ajouté.
23. Fichiers de pre.003
Modifiés :
Cargo.toml
crates/ksp-interface-lib/src/lib.rs
crates/ksp-interface-lib/tests/release_completeness.rs
docs/plans/026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md
docs/validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md
Ajoutés :
crates/ksp-interface-lib/src/transaction_execution.rs
crates/ksp-interface-lib/unit_tests/transaction_execution.rs
crates/ksp-interface-lib/tests/transaction_execution_public_api.rs
deltas/0.3.5/pre.003.md
Explicitement inchangés :
crates/ksp-interface-lib/Cargo.toml
crates/ksp-onchain-transport-lib/**
crates/ksp-store-api/**
crates/ksp-store-lib/**
crates/ksp-store-postgres-lib/**
README.md
ROADMAP.md
CHANGELOG.md
24. Gate opérateur demandé pour pre.003
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.3.5
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-interface-lib
cargo test -p ksp-program-api
Les gates Cargo de pre.003 restent à exécuter par l'opérateur dans le repository réel.
25. Gate opérateur pre.003
Le gate opérateur du 2026-08-31 est intégralement propre :
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean (240 table(s), 141 file(s))
cargo check --workspace: PASS
cargo clippy --workspace --all-targets: PASS
cargo test -p ksp-interface-lib: PASS
cargo test -p ksp-program-api: PASS
ksp-interface-lib exécute alors seize tests unitaires, dont les trois canaris transaction_execution, et les deux tests publics transaction_execution_public_api passent. ksp-program-api reste vert avec ses frontières historiques inchangées.
26. Complétude API et canaris externes — pre.004
pre.004 n'ajoute aucun contrat de production. La version workspace évolue vers 0.3.5-pre.4 parce que la tranche modifie des sources Rust de test/canari.
Les canaris figent désormais explicitement :
2 familles passives d'acquisition exactement
5 modules privés de production exactement
11 reexports crate-root exactement
SlotLifecycleStage #[non_exhaustive]
TransactionExecutionOutcome #[non_exhaustive]
consumer externe crate-root pour SlotLifecycleEvent
consumer externe crate-root pour TransactionExecutionEvent
aucune dependency/path Transport, Store, runtime, serde ou logging dans les sources acquisition
Le consumer externe ne dépend d'aucun module privé et consomme les deux contrats uniquement via ksp_interface_lib::*. Le firewall de dépendances balaie maintenant également slot_lifecycle.rs et transaction_execution.rs.
Restent hors de la surface :
converters Transport -> Interface
DTOs provider
Store RAW
serde/codecs
logging/tracing
runtime/channels
TransactionLogEvent
TransactionCommitmentEvent
Aucun changement n'est apporté à crates/ksp-interface-lib/Cargo.toml, aux sources de production Interface, à Transport, Store, Program API, README, ROADMAP ou CHANGELOG.
27. Gate opérateur demandé pour pre.004
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.3.5
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-interface-lib
cargo test -p ksp-program-api
Les gates Cargo de pre.004 restent à exécuter par l'opérateur dans le repository réel.
28. Gate opérateur pre.004
Le gate opérateur du 2026-08-31 est intégralement propre :
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean (240 table(s), 142 file(s))
cargo check --workspace: PASS
cargo clippy --workspace --all-targets: PASS
cargo test -p ksp-interface-lib: PASS
cargo test -p ksp-program-api: PASS
ksp-interface-lib exécute alors seize tests unitaires, cinq canaris de dependency boundary, deux canaris external consumer, quatre canaris de release completeness et les quatre tests publics des deux familles acquisition. ksp-program-api reste vert sans changement de contrat.
29. Hardening final Interface — pre.005
pre.005 n'ajoute aucun type ni champ de production. La version workspace évolue vers 0.3.5-pre.5 parce que la tranche ajoute/modifie des sources Rust de test/canari.
Le hardening verrouille explicitement :
TransactionSignature = exactement 64 octets déjà décodés
Debug TransactionSignature = redacted
Debug TransactionExecutionEvent = aucune signature brute
SlotLifecycleEvent = exactement slot + stage
TransactionExecutionEvent = exactement slot + signature + outcome
aucun Vec/String/Box/payload/timestamp/provider/endpoint/filter/network dans les events acquisition
aucun second RAW exporté depuis Interface
aucune famille deferred promue silencieusement
manifest Interface = Core-only, sans features/dev/build dependencies
ProgramInstruction foundation = bornes historiques inchangées
Le canari adversarial injecte une signature contenant un marqueur hostile lisible et vérifie que les octets exacts restent accessibles par as_bytes() tout en restant absents des surfaces Debug. L'event d'exécution conserve u64::MAX sans narrowing.
Le contrôle anti-persistence interdit explicitement dans la façade Interface les familles RawTransaction, RawAccount, payload/cursor/retention/observation RAW. Interface conserve uniquement des faits event-only compacts.
Le graphe reste :
ksp-interface-lib
└── ksp-core-lib
Le manifeste ne possède toujours ni [features], ni [dev-dependencies], ni [build-dependencies]. Aucun serde, codec, logging, runtime, Transport ou Store n'est ajouté.
30. Inventaire des candidats reportés après hardening
La clôture fonctionnelle de pre.005 conserve exactement deux familles acquisition admises. Les autres candidats restent :
TransactionLogEvent -> idée différée ; aucun type 0.3.5
TransactionCommitmentEvent -> reporté ; signatureSubscribe/getSignatureStatuses ne sont pas fusionnés
VoteEvent -> reporté ; vote gossip != transaction is_vote
LedgerEntryEvent -> reporté ; Yellowstone Entry reste mono-producer/protocol-specific
Account/Program event RAW -> rejet Interface ; Store/Transport owner
Transaction complète -> rejet Interface ; RawTransaction/Transport owner
Block event -> rejet Interface ; Transport/acquisition container
Persisted-data available -> rejet Interface ; Store API notification owner
TransactionExecutionEvent n'est plus un candidat reporté : il est admis depuis pre.003. TransactionLogEvent reste l'idée différée à transférer vers la surface TODO/IDEAS durable pendant la réconciliation documentaire pre.007 si elle demeure hors scope.
31. Fichiers de pre.005
Modifiés :
Cargo.toml
crates/ksp-interface-lib/tests/dependency_boundary.rs
docs/validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md
Ajoutés :
crates/ksp-interface-lib/tests/security_hardening.rs
deltas/0.3.5/pre.005.md
Explicitement inchangés :
crates/ksp-interface-lib/Cargo.toml
crates/ksp-interface-lib/src/**
crates/ksp-interface-lib/unit_tests/**
crates/ksp-onchain-transport-lib/**
crates/ksp-store-api/**
crates/ksp-store-lib/**
crates/ksp-store-postgres-lib/**
crates/ksp-program-api/**
README.md
ROADMAP.md
CHANGELOG.md
32. Gate opérateur demandé pour pre.005
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.3.5
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-interface-lib
cargo test -p ksp-program-api
Les gates Cargo de pre.005 restent à exécuter par l'opérateur dans le repository réel.
33. Gate opérateur pre.005 et correction pre.005-fix.001
Le gate opérateur du 2026-08-31 confirme que les audits Rust/Markdown et cargo check --workspace sont propres, mais révèle un défaut dans le nouveau canari de manifeste :
v0_3_5_pre_005_manifest_keeps_exact_core_only_graph_without_features_or_hidden_dependency_sections: FAILED
left: 2
right: 1
Le manifeste Interface reste pourtant strictement Core-only. Le canari comptait naïvement les occurrences textuelles de ksp-core-lib dans :
ksp-core-lib = { path = "../ksp-core-lib" }
Le nom apparaît donc deux fois sur une seule déclaration de dépendance : une fois comme clé et une fois dans le chemin. pre.005-fix.001 corrige uniquement ce faux négatif en réutilisant le parseur de clés de dépendances déjà présent dans dependency_boundary.rs. Le canari vérifie désormais que la section [dependencies] existe exactement une fois et que son inventaire de clés vaut exactement ksp-core-lib, tout en conservant les interdictions [features], [dev-dependencies] et [build-dependencies].
Le fix modifie une source Rust de test ; la version workspace évolue donc vers :
0.3.5-pre.5.fix.1
Aucun manifeste de crate, source de production, contrat public ou dependency graph n'est modifié.
34. Gate opérateur pre.005-fix.001
Le gate opérateur du 2026-08-31 est intégralement propre après correction du faux négatif du canari de manifeste :
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean (240 table(s), 144 file(s))
cargo check --workspace: PASS
cargo clippy --workspace --all-targets: PASS
cargo test -p ksp-interface-lib: PASS
cargo test -p ksp-program-api: PASS
cargo test --workspace: PASS
Les tests live/diagnostiques restent uniquement ignored et n'introduisent aucun échec. Le canari corrigé v0_3_5_pre_005_manifest_keeps_exact_core_only_graph_without_features_or_hidden_dependency_sections passe. La surface Interface reste limitée aux deux familles acquisition admises et au graphe Core-only.
35. Gate technique final — pre.006
pre.006 n'ajoute ni type, ni test, ni dépendance, ni source de production. La tranche matérialise uniquement le gate technique final prévu par le prompt de démarrage et fait évoluer la version workspace vers 0.3.5-pre.6.
Le gate final doit confirmer l'état suivant :
ksp-interface-lib -> ksp-core-lib uniquement
aucune feature Interface
aucune dev/build dependency Interface
aucun duplicate dependency introduit par 0.3.5
2 familles acquisition exactement
SlotLifecycleEvent
TransactionExecutionEvent
aucun serde/codec/logging/runtime/Transport/Store dans Interface
Les commandes opérateur de clôture technique sont :
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.3.5
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-interface-lib
cargo test --workspace
cargo tree -p ksp-interface-lib --edges normal
cargo tree -p ksp-interface-lib -e features
cargo tree --duplicates
Aucun smoke réseau n'est requis : 0.3.5 ne modifie aucun moteur Transport et les contrats Interface sont passifs. Les résultats cargo tree sont capturés dans le résultat opérateur de clôture ci-dessous.
36. Fichiers de pre.006
Modifiés :
Cargo.toml
docs/validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md
Ajouté :
deltas/0.3.5/pre.006.md
Explicitement inchangés :
crates/ksp-interface-lib/**
crates/ksp-program-api/**
crates/ksp-onchain-transport-lib/**
crates/ksp-store-api/**
crates/ksp-store-lib/**
crates/ksp-store-postgres-lib/**
README.md
ROADMAP.md
CHANGELOG.md
37. Résultat du gate technique final pre.006
Le gate opérateur du 2026-08-31 est propre après correction locale des numéros d'en-tête réellement modifiés dans Cargo.toml et ce document de validation :
General Rust rule audit: clean
Rust export completeness audit: 0 candidate(s)
KSP workspace Rust rule audit: clean
Markdown table audit: clean (240 table(s), 145 file(s))
cargo check --workspace: PASS
cargo clippy --workspace --all-targets: PASS
cargo test -p ksp-interface-lib: PASS
cargo test --workspace: PASS
Les tests live/réseau et probes diagnostiques restent explicitement ignored conformément à leur contrat ; aucun test non ignoré n'échoue.
Les trois preuves Cargo finales confirment :
cargo tree -p ksp-interface-lib --edges normal
ksp-interface-lib -> ksp-core-lib -> solana-pubkey -> solana-address
cargo tree -p ksp-interface-lib -e features
aucune feature propre Interface ; seule la feature default de ksp-core-lib est activée
cargo tree --duplicates
doublons du workspace global présents, aucun nouveau doublon imputable à ksp-interface-lib/0.3.5
Le manifeste Interface reste sans [features], [dev-dependencies] ni [build-dependencies]. La surface fonctionnelle finale demeure exactement :
ProgramAccountMeta / ProgramInstruction
SlotLifecycleEvent / SlotLifecycleStage
TransactionSignature / TransactionExecutionEvent / TransactionExecutionOutcome
Aucun serde, codec, logging, runtime, Transport ou Store n'est entré dans le graphe Interface.
38. Réconciliation documentaire finale — pre.007
pre.007 ne modifie aucun code Rust ni manifeste de crate. La version workspace devient :
0.3.5-pre.7
La réconciliation ferme les incohérences documentaires restantes :
crates/ksp-interface-lib/README.mddécrit désormais les contrats Program et les deux familles d'événements passifs sans présenter Interface comme un runtime ;crates/ksp-interface-lib/USAGE.mddevient version-neutral et documente la construction/consommation des événements via le crate-root ;- les documents d'architecture concernés distinguent explicitement contrat passif Interface, DTO riche Transport et modèle replayable Store ;
- le futur RAW worker peut dépendre d'Interface pour un fait passif partagé, mais son backlog/recovery reste Store-owned ;
TransactionLogEventreste hors scope et est transféré versdocs/IDEAS.mdavec un nouveau gate consumer/bornes obligatoire ;CHANGELOG.md,ROADMAP.mdet le prompt0.3.6restent réservés à la tranche de publication suivante.
Fichiers modifiés par la tranche :
Cargo.toml
crates/ksp-interface-lib/README.md
crates/ksp-interface-lib/USAGE.md
docs/IDEAS.md
docs/architecture/002-LAYERS_AND_DEPENDENCIES.md
docs/architecture/003-COMPONENT_CONTRACTS.md
docs/architecture/004-COMPONENT_INVENTORY.md
docs/architecture/005-DEPENDENCY_GRAPH.md
docs/architecture/006-WIRE_AND_PROGRAM.md
docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md
docs/plans/026-V0_3_5_INTERFACE_ACQUISITION_EVENTS_PLAN.md
docs/validation/022-V0_3_5_INTERFACE_ACQUISITION_EVENTS.md
deltas/0.3.5/pre.007.md
Aucun autre fichier ne doit être modifié.