Files
khadhroony-solana-project/prompts/018-V0_2_13_START_PROMPT.md

1360 lines
39 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
<!-- file: prompts/018-V0_2_13_START_PROMPT.md -->
<!-- version: 2 -->
# Prompt de démarrage `0.2.13` — Interface / wire foundation
## 1. Identité de la release et base exacte requise
La base attendue est **exclusivement** la release stable :
```text
v0.2.12
```
Ne pas ouvrir `0.2.13` depuis :
```text
0.2.12-pre.*
0.2.12-pre.*-fix.*
0.2.12-rel.* non encore validé stable
une archive intermédiaire de travail
l'ancien dépôt khadhroony-bot3
un souvenir de session
```
Si une archive opérateur de `v0.2.12` est fournie au démarrage, **cette archive réelle est la première autorité** devant les snippets, anciennes archives, anciens prompts et mémoire de conversation. Une divergence entre la base réelle et ce prompt déclenche un audit explicite ; elle ne se résout jamais par supposition.
La release à ouvrir est :
```text
0.2.13 — Interface / wire foundation
```
La première tranche est :
```text
0.2.13-pre.001
```
`pre.001` est obligatoirement une tranche **lecture + audit interne + audit d'héritage kbot3 + audit externe ciblé + brainstorming + frontières + dependency graph + threat/robustness model + sizing + planification**.
Aucune API wire lourde, aucun trait Program et aucun portage de code kbot3 ne doit commencer avant la sortie cohérente de ce gate.
À l'ouverture, vérifier au minimum :
```text
git describe / tag stable si metadata Git disponible
workspace.package.version = 0.2.12
deltas/0.2.12/rel.001.md présent
prompts/018-V0_2_13_START_PROMPT.md présent
ksp-interface-lib absent au démarrage sauf contradiction de la base réelle
ksp-program-api absent au démarrage sauf contradiction de la base réelle
```
---
## 2. Mission et résultat attendu
La mission de `0.2.13` est d'introduire la **première surface de `ksp-interface-lib`**, conformément à l'architecture KSP actuelle :
```text
façade wire officielle KSP
API publique wire réutilisable
contrats passifs / codecs / validation locale
pas de comportement Program
pas de runtime réseau
pas de persistence
```
La release doit préparer proprement :
```text
0.2.14 — ksp-program-api foundation
```
sans implémenter cette release par anticipation.
Résultat attendu à la clôture, sous réserve du scope exact décidé en `pre.001` :
```text
ksp-interface-lib existe comme crate membre du workspace
façade publique explicite via crate root
surface wire minimale réellement justifiée par le futur Program API
ownership Core / Interface / Program clairement séparé
codec(s) wire seulement si un contrat réel l'exige
validation/bornes déterministes des données exposées
aucune logique decode/reconnaissance/exécution/materialisation
aucune dépendance reverse vers Transport/Store/Wallet/App
aucune dépendance protocolaire opportuniste non auditée
canari consumer externe/public API
canaris de dependency firewall
round-trips/adversarial tests si sérialisation retenue
README/USAGE durables réconciliés avant publication
plan/validation de release complets
prompt 0.2.14 préparé dans le couloir final dédié
```
Le résultat n'est **pas** de recréer un modèle universel de transaction/replay ni de remplir Interface par symétrie avec l'ancien `ks-lib`.
La question centrale de la release est :
> quel est le **minimum wire public KSP-owned** qu'il faut stabiliser maintenant pour que `ksp-program-api` puisse être conçu proprement en `0.2.14`, sans anticiper les wires génériques RAW/CORE réservés aux séries suivantes ?
---
## 3. Sources de vérité internes obligatoires — ordre de lecture
### 3.1 Règles globales
Lire d'abord, dans cet ordre :
```text
RULES.md
docs/000-README.md
docs/rules/RULES_GENERAL.md
docs/rules/RULES_KSP.md
docs/rules/RULES_RUST.md
docs/rules/RULES_DEPENDENCIES.md
docs/rules/RULES_DOCUMENTATION.md
docs/rules/FILE_CONTRACTS.md
docs/rules/VERSION_WORKFLOW.md
docs/rules/PROMPT_STRUCTURE.md
```
Le présent prompt est un contrat opératoire autonome, mais **ne remplace aucune règle normative**.
Rappels qui conditionnent directement cette release :
```text
Rust 2024
unsafe / unwrap / expect / panic interdits selon les règles KSP
? interdit en production selon les lints KSP
#![warn(missing_docs)]
#![deny(unreachable_pub)]
#![forbid(unsafe_code)]
pas de pub mod comme raccourci de façade
surface publique réexportée explicitement depuis crate root
unit tests sous unit_tests/ autant que possible
tests/ réservé aux tests d'intégration consommant l'API publique
Error/Result communs possédés par ksp-core-lib
Program IDs fondamentaux possédés par ksp-core-lib
Pubkey consommé via ksp-core-lib lorsque la frontière KSP l'exige
```
Règles wire/dependency à relire particulièrement :
```text
KSP-WIRE-001..003
DEP-WIRE-001..007
DEP-PROGRAM-001..004
DEP-KSP-001..005
DEP-CARGO-001..007
```
Après toute modification Rust :
```bash
cargo fmt --all
python3 scripts/audit_rust_workspace_rules.py
cargo check --workspace
cargo clippy --workspace --all-targets
```
Pour tout Markdown touché :
```bash
python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas/0.2.13
```
Une commande non exécutée n'est jamais déclarée PASS.
### 3.2 Architecture durable à préserver
Lire ensuite, dans cet ordre :
```text
docs/architecture/000-README.md
docs/architecture/001-PROJECT_OBJECTIVES.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/007-EXECUTION_AND_POLICY.md
docs/architecture/008-DATA_MATERIALIZATION_AND_STORE.md
docs/architecture/009-ACQUISITION_WORKERS_AND_JOBS.md
```
`docs/architecture/006-WIRE_AND_PROGRAM.md` est la référence architecturale centrale de cette release.
Points acquis à préserver :
```text
ksp-interface-lib = façade wire officielle + API wire publique
pas de ksp-interface-api séparée actuellement
Program IDs fondamentaux restent dans Core
Interface peut posséder codecs/layouts/discriminants/seeds/constructeurs wire lorsqu'ils appartiennent réellement au contrat
Interface ne possède pas interprétation métier/decode Program/policy/exécution réseau
ksp-program-api est ouvert/extensible et vient ensuite
ksp-program-lib porte plus tard les implémentations officielles
une extension externe peut consommer les wires officiels sans dépendre de ksp-program-lib
RAW -> CORE reste générique et ne dépend pas de Program
CORE -> DECODE est la première frontière qui peut utiliser Program API
```
Ne pas remplacer ces décisions par la structure de kbot3.
### 3.3 Plans, roadmap et clôture `0.2.12`
Relire :
```text
ROADMAP.md
CHANGELOG.md
docs/plans/002-FUNCTIONAL_RELEASE_SEQUENCE.md
docs/plans/019-V0_2_12_SOL_PRICES_DESK_PLAN.md
docs/validation/015-V0_2_12_SOL_PRICES_DESK.md
deltas/0.2.12/rel.001.md
```
Le but n'est pas de rouvrir `0.2.12`, mais de confirmer la base stable et la séquence retenue :
```text
0.2.13 interface/wire foundation
0.2.14 program-api foundation
0.3.1 Store RAW
0.3.2 extension Interface pour wires génériques acquisition/CORE
```
Cette séquence est une contrainte importante : `0.2.13` ne doit pas absorber prématurément `0.3.2`.
### 3.4 Code réel à inventorier avant design
Inventorier au minimum :
```text
Cargo.toml
crates/ksp-core-lib/Cargo.toml
crates/ksp-core-lib/src/lib.rs
crates/ksp-core-lib/src/program_ids.rs
crates/ksp-onchain-transport-lib/Cargo.toml
crates/ksp-onchain-transport-lib/src/lib.rs
crates/ksp-onchain-transport-lib/src/rpc_common.rs
crates/ksp-onchain-transport-lib/src/rpc_accounts.rs
crates/ksp-onchain-transport-lib/src/rpc_transactions.rs
crates/ksp-onchain-transport-lib/src/rpc_blocks.rs
crates/ksp-onchain-transport-lib/src/ws_*.rs selon types réellement pertinents
crates/ksp-onchain-transport-lib/src/grpc_*.rs selon types réellement pertinents
```
L'inventaire doit distinguer :
```text
type fondamental déjà possédé par Core
wire/provider DTO privé de Transport
type générique potentiellement partageable mais actuellement transport-owned
contrat nouveau réellement nécessaire à Interface
type qui appartient seulement à RAW/CORE plus tard
```
Ne pas déplacer un DTO Transport vers Interface uniquement pour réduire une duplication apparente. Ownership et stabilité priment.
---
## 4. Sources externes normatives à réauditer en `pre.001`
La release ne doit pas figer un wire Solana ou choisir un codec depuis des souvenirs historiques.
Selon le scope candidat retenu pendant l'audit, consulter en priorité les sources **officielles et actuelles** suivantes :
```text
Documentation officielle Solana / Anza correspondant aux structures wire réellement ciblées
sources Agave / crates officielles actuelles lorsque leur comportement wire fait autorité
crates officielles d'interface Solana/Anza candidates à un réexport contrôlé
API actuelle de solana-pubkey déjà utilisée par Core
sources primaires des codecs candidats : borsh, wincode ou équivalent seulement si un besoin réel existe
```
Pour toute crate candidate :
```text
vérifier version stable réellement courante
vérifier ownership/source officielle ou normative
vérifier MSRV/edition/features utiles si pertinents
vérifier default-features et features réellement nécessaires
inspecter dépendances transitives fondamentales
cargo tree -d
cargo tree -i <codec-ou-primitive> si ajouté
```
L'exemple historique `solana-loader-v3-interface` dans l'architecture doit être **réaudité** s'il devient pertinent ; il n'est pas une dépendance obligatoire. De même, le rejet historique de `mpl-token-metadata` illustre une politique de contrôle du wire, pas une règle imposant son implémentation dans `0.2.13`.
Aucun résultat externe ancien n'est considéré frais par défaut.
---
## 5. État validé à préserver depuis `v0.2.12`
### 5.1 Workspace et Core
État attendu :
```text
workspace Rust 2024 stable
ksp-core-lib possède Error / ErrorCode / ErrorContext / Result
ksp-core-lib réexporte la Pubkey KSP
ksp-core-lib possède le registry des Program IDs fondamentaux
18 Program IDs fondamentaux couverts par les canaris actuels
ksp-interface-lib absent
ksp-program-api absent
```
`0.2.13` ne doit pas déplacer les Program IDs fondamentaux hors de Core.
### 5.2 Transport
Les transports on-chain sont déjà fonctionnels et séparés :
```text
HTTP typed complet
WebSocket standard
Helius LaserStream WebSocket
Yellowstone gRPC standard/provider-neutral
```
Ils restent propriétaires de leurs DTOs réseau/provider et ne doivent pas acquérir une dépendance vers Interface/Program par commodité.
Frontière durable :
```text
Transport -X-> ksp-interface-lib sauf besoin architectural explicitement décidé plus tard
Transport -X-> ksp-program-api
Transport -X-> ksp-program-lib
```
`0.2.13` n'est pas une refactorisation générale de Transport.
### 5.3 Off-chain, Wallet et Desks
Les surfaces stabilisées jusqu'à `0.2.12` restent hors chantier :
```text
ksp-offchain-transport-lib
ksp-wallet-lib
ksp-app-config-desk
ksp-app-wallet-desk
ksp-app-solprices-desk
```
Ne pas les modifier pour démontrer Interface, sauf si un gate de dépendance global révèle une violation préexistante directement bloquante et que le workflow impose une tranche dédiée.
### 5.4 Pipeline durable
Préserver :
```text
RAW -> CORE -> DECODE -> SPECIALIZED
```
Avec :
```text
RAW -> CORE -X-> Program API
RAW -> CORE -X-> Program Lib
CORE -> DECODE peut utiliser Program API plus tard
```
Les modèles d'acquisition/replay/store ne sont pas la mission de `0.2.13`.
---
## 6. Décisions acquises — ne pas redébattre sans contradiction réelle
Les décisions suivantes sont considérées acquises :
1. la crate cible s'appelle `ksp-interface-lib` ;
2. aucune crate `ksp-interface-api` séparée n'est créée par symétrie ;
3. `ksp-interface-lib` expose une API wire publique réutilisable par les implémentations officielles et externes ;
4. `ksp-interface-lib` ne dépend pas de `ksp-program-api` ni de `ksp-program-lib` ;
5. `ksp-program-api` est réservé à `0.2.14` ;
6. `ksp-program-lib` et les implémentations officielles concrètes sont reportés à des vertical slices ultérieures ;
7. Program IDs fondamentaux et `Pubkey` KSP restent possédés par Core ;
8. les codecs wire officiels utilisés directement par KSP appartiennent normalement à Interface ;
9. une crate protocolaire externe incompatible peut être remplacée par une implémentation KSP bornée ;
10. une extension Program externe peut temporairement posséder son propre wire lorsqu'Interface ne le possède pas encore ;
11. l'ancien `khadhroony-bot3` est une source d'idées, **jamais une autorité architecturale** ;
12. aucun monolithe équivalent à l'ancien `ks-lib` n'est recréé ;
13. la compatibilité automatique avec les anciens types kbot3 n'est pas un objectif ;
14. `0.3.2` reste propriétaire de l'extension Interface nécessaire aux acquisitions et à la normalisation CORE ;
15. une release concrète doit rester clôturable dans une seule session et être réduite si le sizing est négatif.
Une contradiction avec la base stable réelle se traite par audit et décision documentée, pas par réécriture silencieuse de ces acquis.
---
## 7. Questions réellement ouvertes à trancher pendant `pre.001`
### 7.1 Premier périmètre wire concret
Décider ce qui constitue réellement la **première surface** de `ksp-interface-lib` :
```text
scaffold + primitives publiques uniquement
wire Program générique minimal
autre lot officiel minimal démontré par l'architecture
```
Ne pas forcer une famille de types parce qu'elle existait dans kbot3.
### 7.2 Frontière Program-facing vs acquisition-facing
Pour chaque candidat — instruction identity, CPI path, account meta, logs, return data, transaction failure, balance deltas, contexte de replay — décider explicitement :
```text
nécessaire à Program API dès 0.2.14
utile mais acquisition/CORE -> reporter 0.3.2+
spécifique à un transport -> rester Transport
spécifique à un Program concret -> vertical slice ultérieure
```
### 7.3 Réutilisation Core vs nouveau wrapper
Déterminer :
```text
quand utiliser directement ksp_core_lib::Pubkey
quand créer un newtype KSP-owned
quand un simple alias serait insuffisant
quels identifiants ont déjà un owner canonique
```
Aucun wrapper ne doit être créé uniquement pour renommer un type stable déjà possédé par Core.
### 7.4 Représentation des bytes et bornes
Si la surface contient des données binaires :
```text
Vec<u8> borné ?
newtype borné ?
encodage texte seulement à la frontière serde ?
limites maximales exactes ou conservatrices ?
validation avant allocation pathologique ?
Debug complet, résumé ou redacted/bounded ?
```
La décision doit être justifiée par le wire réel et les usages publics.
### 7.5 Sérialisation et codecs
Décider si `serde`, `borsh`, `wincode` ou autre est réellement requis dans `0.2.13`.
Questions :
```text
le contrat public a-t-il besoin d'un round-trip stable dès maintenant ?
le codec appartient-il au wire du protocole ou seulement à un stockage futur ?
une crate officielle actuelle peut-elle être réexportée/wrappée proprement ?
une réimplémentation KSP est-elle préférable à un graphe incompatible ?
```
Ne pas ajouter plusieurs codecs « pour préparer la suite ».
### 7.6 Versionnement du contrat wire
Ne pas introduire `format_version`, `contract_version` ou enum V1/V2 par réflexe.
Si une version explicite est retenue, documenter :
```text
ce qui est versionné
pourquoi l'évolution incompatible est plausible
qui choisit/interprète la version
comment unknown/future est traité
```
### 7.7 Error model et validation locale
Décider quelles erreurs sont :
```text
construction invalide
borne dépassée
wire malformed
unsupported local
invariant structurel
```
Utiliser l'Error KSP commun lorsque cela correspond au contrat actuel. Ne pas inventer une hiérarchie d'erreurs Program avant `ksp-program-api`.
### 7.8 Surface d'extension externe
Définir le canari minimum prouvant qu'une crate externe peut :
```text
dépendre de ksp-interface-lib
importer uniquement les exports crate-root
construire/lire les types publics retenus
sérialiser/désérialiser si cette capacité fait partie du contrat
ne pas dépendre de modules privés ni de ksp-program-lib
```
### 7.9 Héritage kbot3
Pour les concepts historiques pertinents, produire une matrice :
```text
REPRENDRE
REDESSINER
REPORTER
REJETER
```
Chaque ligne doit expliquer **pourquoi**, et vers quelle couche/version un report est effectué.
### 7.10 Sizing
Confirmer que le scope retenu tient dans une release/session.
Si le premier wire officiel complet est trop large :
```text
réduire 0.2.13 au socle public réellement nécessaire
reporter les familles additionnelles
ne pas ouvrir plusieurs protocoles en parallèle
```
---
## 8. Héritage `khadhroony-bot3` — audit historique contrôlé
L'archive historique fournie avant la publication de `v0.2.12` est :
```text
khadhroony-bot3_v0.5.3-pre.005-fix010.zip
```
Elle peut être redonnée dans la nouvelle session pour inspection complète.
La reconnaissance préalable a identifié dans l'ancien `ks-lib` plusieurs familles d'idées :
```text
identités et modèles wire
instruction path / contexte CPI
accounts résolus / instruction accounts
payload brut / return data / logs
état d'échec transaction
version de contrat
contrats decoder historiques
identity / surfaces / coverage
recognize / outcome
diagnostics / proof
external decoder canaries
contrats execution/materialization historiques
prepared execution plans
required signers / policy
materializer contracts
```
Deux leçons négatives sont déjà acquises :
```text
ancien ks-lib = monolithe de plusieurs centaines de fichiers
plusieurs générations de Decoder API y coexistent
```
Donc :
- ne copier aucun dossier/module entier ;
- ne conserver aucun nom historique uniquement pour compatibilité ;
- ne créer aucun trait Decoder/Executor/Materializer dans `0.2.13` ;
- ne considérer un type historique que si son **concept** répond à un besoin KSP actuel démontré ;
- comparer l'idée à l'architecture KSP avant de comparer le code ligne par ligne.
Si l'archive n'est pas disponible au démarrage, ne pas inventer ses détails. Utiliser seulement le seed ci-dessus et signaler les points nécessitant une nouvelle inspection opérateur.
---
## 9. Objectifs et livrables de `0.2.13`
Le scope exact est recalibré par `pre.001`, mais la release doit viser les livrables suivants.
### 9.1 Crate et façade
```text
crates/ksp-interface-lib/
Cargo.toml
src/lib.rs
README.md
USAGE.md
unit_tests/
tests/
```
La crate respecte les conventions workspace et n'expose pas ses modules privés comme API.
### 9.2 Surface wire publique
Le lot retenu doit posséder :
```text
rustdoc public
constructeurs/validation explicites si nécessaires
invariants et bornes définis
ordre sémantique préservé
états optionnels fidèles au wire réel
Debug maîtrisé
serde/codec seulement si décidé
```
### 9.3 Dependency firewall
Prouver au minimum :
```text
Interface -> Core autorisé
Interface -X-> Program API
Interface -X-> Program Lib
Interface -X-> Config
Interface -X-> Transport
Interface -X-> Store
Interface -X-> Wallet
Interface -X-> Tauri
Interface -X-> reqwest / tonic / runtime réseau
```
Une dépendance logging n'est ajoutée que si un comportement runtime réel à instrumenter existe ; une crate wire déclarative ne doit pas ajouter Logging par réflexe.
### 9.4 Consumer externe
Créer un canari integration/downstream-style démontrant que la surface voulue est consommable uniquement via l'API publique.
### 9.5 Documentation et validation
`pre.001` doit créer :
```text
docs/plans/020-V0_2_13_INTERFACE_PLAN.md
docs/validation/016-V0_2_13_INTERFACE.md
```
Ces noms sont la suite documentaire attendue si la base stable ne contient pas déjà ces numéros. En cas de contradiction réelle, conserver la nomenclature effective de la base et documenter l'écart.
---
## 10. Hors périmètre explicite
Ne pas implémenter dans `0.2.13` :
```text
ksp-program-api
ksp-program-lib
ProgramInstructionDecoder
ProgramAccountDecoder
ProgramEventDecoder
ProgramReturnDataDecoder
registry comportemental Program
recognition / coverage / decoder outcome définitifs
ProgramExecutionPreparer
PreparedProgramExecution définitif
materializer
execution policy
execution orchestration
System/SPL/Token-2022/Metadata/Anchor/DEX decoder concret
IDL parser/generator
Store/persistence RAW ou CORE
replay ledger / claims / jobs / workers
application Tauri
provider réseau
plugin dynamique / ABI C / WASM sandbox
compatibilité automatique avec ks-lib
migration des anciens modèles kbot3
```
Ne pas implémenter non plus un modèle complet :
```text
RawBlock
CoreTransactionReplayInput
CoreInstructionReplayInput
pipeline acquisition universel
```
uniquement parce que ces structures pourront être utiles plus tard. Les wires génériques d'acquisition/CORE restent notamment attendus en `0.3.2`.
---
## 11. Contraintes sécurité, API et architecture spécifiques
### 11.1 Robustesse des données
Toute donnée de taille variable doit avoir une politique explicite :
```text
limite
moment de validation
allocation
conversion
Debug
serde
```
Rejeter avant allocation/copie pathologique lorsque techniquement possible.
### 11.2 Fidélité wire
Ne pas confondre :
```text
absent
null / None lorsque le wire le permet
empty
zero
unknown/future
```
Ne pas normaliser une distinction wire utile pour simplifier l'API.
### 11.3 Ordre
Préserver l'ordre lorsque Solana lui donne une sémantique :
```text
account metas
instruction accounts
instruction order
CPI path si retenu
```
Ne pas remplacer une séquence ordonnée par une map/set sans justification.
### 11.4 Numeric safety
Aucune vérité canonique lossless ne passe par `f32`/`f64`.
Les slots, indexes, offsets, lengths et counts utilisent des types/bornes compatibles avec le wire réel et les conversions sont vérifiées.
### 11.5 API évolutive
Pour les enums publics susceptibles d'acquérir de nouvelles variantes externes, évaluer `#[non_exhaustive]` explicitement.
Ne pas appliquer `#[non_exhaustive]` mécaniquement à chaque enum ; documenter le choix lorsqu'il affecte l'extensibilité downstream.
### 11.6 Debug et données volumineuses
Une structure contenant des bytes ou collections potentiellement importantes ne doit pas produire accidentellement un `Debug` gigantesque.
Choisir selon le contrat :
```text
Debug dérivé sûr et borné par construction
Debug custom résumant length/hash/metadata non sensible
pas de Debug public si inutile
```
### 11.7 Pas de comportement Program prématuré
Une méthode passive de validation/codec/constructeur wire est autorisée lorsqu'elle appartient au contrat de données.
Une méthode qui choisit :
```text
quel decoder
si une instruction est reconnue
quelle sémantique canonique produire
comment matérialiser
comment exécuter
```
appartient aux couches Program/Materializer/Execution ultérieures.
---
## 12. Première mission `0.2.13-pre.001` — gate obligatoire
### 12.1 Baseline stable
Avant toute modification lourde :
```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/0.2.13
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test --workspace
```
Pour une base stable intacte, `cargo fmt --all` ne doit pas servir à introduire des modifications opportunistes. Si une commande modifie ou échoue sur la base stable, documenter le constat avant d'avancer.
### 12.2 Audit interne complet
Produire un inventaire concret :
```text
Core public API utile
Program IDs / Pubkey ownership
DTOs Transport potentiellement ressemblants
règles wire/dependency
architecture 006
roadmap 0.2.13 / 0.2.14 / 0.3.2
workspace dependencies actuelles
```
Pour chaque type candidat déjà existant :
```text
owner actuel
visibilité
consumer actuel
sémantique
raison éventuelle de réutiliser / laisser en place / redessiner
```
### 12.3 Audit kbot3
Si l'archive est disponible :
1. inventorier uniquement les familles pertinentes ;
2. identifier les concepts, pas seulement les noms de fichiers ;
3. produire la matrice `REPRENDRE / REDESSINER / REPORTER / REJETER` ;
4. distinguer clairement les idées Interface des idées Program API/Program Lib/Materializer/Execution ;
5. noter les anti-patterns historiques à ne pas reproduire.
Ne pas porter de code pendant cette étape.
### 12.4 Audit externe actuel
Pour chaque dépendance/wire externe réellement candidat :
```text
source primaire
version stable courante
contrat wire actuel
features requises
dépendances transitives
compatibilité avec solana-pubkey/Core actuel
codec generations
licence si nouvelle dépendance
```
Ne pas auditer vingt crates spéculatives : seulement les candidates du scope retenu.
### 12.5 Matrice de frontières
Produire une matrice explicite, au minimum :
```text
concept/type
owner cible
0.2.13 ?
0.2.14 ?
0.3.2+ ?
source d'autorité
raison
```
Cette matrice doit empêcher la fuite entre :
```text
Core
Interface
Transport
Program API
Program Lib
RAW/CORE
Store
```
### 12.6 Surface API proposée
Avant implémentation, écrire conceptuellement la façade visée :
```text
exports crate-root
principaux types publics
constructeurs
validation
serde/codec éventuel
erreurs
bornes
```
Les noms restent modifiables pendant `pre.001`; le but est de vérifier la cohérence, pas de figer prématurément tous les détails.
### 12.7 Threat / robustness model
Auditer :
```text
oversized byte payload
oversized collection
integer overflow / index conversion
malformed wire
unknown enum/discriminant
nested structures pathologiques
Debug volumineux
allocation/copie excessive
serde hostile
panic/unwrap/expect
```
Pour chaque risque retenu, indiquer le test/canari prévu.
### 12.8 Dependency graph cible
Établir la cible réelle, par exemple :
```text
ksp-interface-lib
-> ksp-core-lib
-> serde ?
-> codec(s) réellement retenu(s) ?
-> interface officielle compatible ?
```
et prouver explicitement les interdictions.
Si une nouvelle dépendance externe est proposée, prévoir les `cargo tree` de validation.
### 12.9 Stratégie de tests
Décider avant le développement :
```text
unit tests privés
integration public API
external consumer compile canary
round-trip fixtures
malformed fixtures
oversized/adversarial
compile-fail si utile
cargo tree/firewall
```
Aucun smoke réseau n'est requis par défaut pour une crate wire pure.
### 12.10 Sizing
Estimer chaque tranche intermédiaire avec le budget KSP d'environ **1520 minutes de travail effectif** comme outil de découpage, jamais comme promesse.
Si une tranche est manifestement trop grosse, la scinder avant implémentation.
Si la release entière paraît impossible à clôturer raisonnablement dans la session, réduire le scope fonctionnel de `0.2.13` avant de coder.
### 12.11 Documents de sortie
Créer ou mettre à jour au minimum :
```text
docs/plans/020-V0_2_13_INTERFACE_PLAN.md
docs/validation/016-V0_2_13_INTERFACE.md
deltas/0.2.13/pre.001.md
```
Le plan doit contenir la prévision souple recalibrée sous forme de headings `### pre.NNN`, avec statuts et éventuels fixes imbriqués conformément aux conventions KSP utilisées dans les releases récentes.
### Critères de sortie de `pre.001`
`pre.001` n'est fermé que si :
```text
sources internes obligatoires réellement relues
base stable confirmée
surface Core/Transport pertinente inventoriée
architecture 006 confrontée à la base réelle
archive kbot3 auditée si disponible ou absence explicitement notée
matrice REPRENDRE/REDESSINER/REPORTER/REJETER produite
frontière 0.2.13 / 0.2.14 / 0.3.2 explicite
premier lot wire exact décidé ou réduit
ownership des types décidé
dépendances candidates auditables et bornées
threat/robustness model écrit
strategy de tests définie
dependency graph cible défini
plan + validation créés
forecast recalibré
sizing compatible avec une release/session
aucune implémentation Program lourde commencée
```
Si l'une de ces sorties reste ambiguë, `pre.001` continue ou reçoit un fix ; `pre.002` ne commence pas par défaut.
---
## 13. Prévision souple initiale des prereleases
Cette trajectoire est un **forecast de départ**. `pre.001` doit la fusionner, scinder, supprimer ou prolonger selon le scope réellement démontré.
### `pre.001` — Audit actuel + héritage kbot3 + frontières + sizing
**Statut : prévu**
Lectures obligatoires, baseline, audit Core/Transport, audit kbot3, audit externe ciblé, matrice d'ownership, threat model, dependency graph, plan/validation et sizing. Aucun développement fonctionnel lourd.
### `pre.002` — Scaffold `ksp-interface-lib` + façade + firewall
**Statut : prévu**
Créer la crate, l'ajouter au workspace, poser la façade publique minimale, README/USAGE initiaux et canaris de dépendances. Ne pas introduire encore une grande famille wire si le scaffold suffit pour fermer la tranche.
### `pre.003` — Primitives publiques retenues
**Statut : prévu**
Introduire uniquement les wrappers/identités/bornes réellement confirmés par `pre.001`, en réutilisant Core lorsque possible. Aucun modèle d'acquisition général par anticipation.
### `pre.004` — Premier lot wire officiel retenu
**Statut : prévu**
Matérialiser le premier lot fonctionnel réellement justifié : layouts/types/codec/constructeurs wire selon le plan final. Aucun decode sémantique.
### `pre.005` — Second lot wire uniquement si démontré
**Statut : optionnel**
Ajouter une seconde famille uniquement si `pre.001` a démontré qu'elle appartient réellement à la foundation `0.2.13`. Supprimer cette tranche si le minimum est déjà complet.
### `pre.006` — Sérialisation / bornes / adversarial
**Statut : prévu**
Durcir round-trips, malformed/unknown, tailles hostiles, integer conversions, Debug, ordre et options. Si aucun codec n'est retenu, convertir cette tranche en hardening structurel pertinent plutôt que d'inventer de la sérialisation.
### `pre.007` — Consumer externe + API/dependency hardening
**Statut : prévu**
Prouver la consommation via crate-root, stabilité de la façade, firewall interne/externe, docs publiques et graphes Cargo. Aucun nouveau domaine wire opportuniste.
### `pre.008` — Gate technique final
**Statut : prévu**
Gate workspace complet, canaris public API/dependencies, `cargo tree` pertinents et audit de complétude de la surface retenue. Aucun README/USAGE final ni préparation de publication dans cette tranche.
### `pre.009` — Réconciliation documentaire finale
**Statut : prévu**
Réconcilier plan, validation, README/USAGE et architectures/références durables réellement affectées. Ne pas finaliser `CHANGELOG.md`, `ROADMAP.md` ni le prompt suivant.
### `pre.010` — Préparation de publication minimale
**Statut : prévu**
Modifier fonctionnellement uniquement :
```text
prompts/019-V0_2_14_START_PROMPT.md
CHANGELOG.md
ROADMAP.md
```
plus `Cargo.toml` et le delta mécanique requis. Aucun code, test, README, USAGE, plan, validation, règle ou architecture n'est rouvert.
### `rel.001` — Publication stable
**Statut : prévu**
Passer la version Cargo à `0.2.13`, exécuter le gate de publication requis, créer le commit de livraison puis le tag stable `v0.2.13` conformément au workflow KSP.
Les responsabilités de fermeture restent donc séparées :
```text
gate technique final
réconciliation documentaire
préparation de publication minimale
rel.001
```
Un `fix` reste strictement local à la responsabilité de sa tranche.
---
## 14. Versionnement, deltas, commits, archives et tags
Version Cargo des prereleases :
```text
0.2.13-pre.1
0.2.13-pre.2
...
0.2.13-pre.N.fix.M
```
Deltas :
```text
deltas/0.2.13/pre.001.md
deltas/0.2.13/pre.002.md
...
deltas/0.2.13/pre.NNN-fix.MMM.md
deltas/0.2.13/rel.001.md
```
Commits de livraison :
```text
v0.2.13-pre.001
v0.2.13-pre.002
v0.2.13-pre.NNN-fix.MMM
v0.2.13-rel.001
```
Aucun tag Git pour prerelease/fix/rel.
Seule la release stable reçoit :
```text
v0.2.13
```
Archives :
```text
ksp-general-<delivery-id>.zip
ksp-doc-<delivery-id>.zip lorsque le payload est strictement documentaire/prompts
```
Chaque archive contient uniquement les fichiers ajoutés/modifiés du delta plus son fichier delta. Les suppressions sont listées explicitement.
Une prerelease non-fix synchronise `workspace.package.version` même si elle est documentaire. Un fix purement documentaire ne force pas de bump Cargo ; un fix code/build/runtime/config suit l'identifiant SemVer technique prévu par `VERSION_WORKFLOW.md`.
Chaque delta est commité à partir de `0.1.x`; un fix ne réécrit jamais silencieusement le delta d'origine.
---
## 15. Validation opérateur et procédure d'application
Le mode opératoire reste celui des releases KSP récentes :
1. l'assistant travaille à partir de la base opérateur réellement validée ;
2. il produit un delta ZIP minimal ;
3. l'opérateur applique l'archive dans son checkout ;
4. l'opérateur exécute les gates ;
5. les logs réels font autorité pour fermer la tranche ou produire un fix ;
6. un fix reste dans le scope exact de la tranche défectueuse.
Gate Rust standard après modification :
```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/0.2.13
cargo check --workspace
cargo clippy --workspace --all-targets
```
Puis tests ciblés de la crate :
```bash
cargo test -p ksp-interface-lib
```
Aux gates globaux :
```bash
cargo test --workspace
```
Lorsque le graphe change ou qu'une dépendance wire est ajoutée :
```bash
cargo tree -p ksp-interface-lib --edges normal
cargo tree --duplicates
cargo tree -i <dependency-fondamentale> si pertinent
```
Ne jamais déclarer PASS :
```text
cargo fmt
rust audit
cargo check
clippy
tests
cargo tree
```
si la commande correspondante n'a pas réellement été exécutée.
Il n'y a **aucun gate Tauri** par défaut pour `0.2.13`, car la release ne doit modifier aucune application.
Il n'y a **aucun smoke réseau** par défaut pour une crate wire pure. Si `pre.001` découvre un besoin réellement justifié, le gate doit être défini explicitement avant implémentation et ne doit pas transformer Interface en consumer réseau.
---
## 16. Tests et canaris attendus
Le plan final doit couvrir, selon la surface retenue :
### 16.1 Public API
```text
exports crate-root complets
aucun pub mod opportuniste
rustdoc public
consumer externe compile
aucun import de module privé nécessaire
```
### 16.2 Dependency firewall
```text
Interface -> Core seulement selon besoins réels
Interface -X-> Program API / Program Lib
Interface -X-> Config
Interface -X-> Transport
Interface -X-> Store
Interface -X-> Wallet
Interface -X-> Tauri
Interface -X-> reqwest / tonic / provider SDK
codec/direct protocol deps uniquement si possédés par le wire retenu
```
### 16.3 Wire fidelity
Selon le contrat :
```text
round-trip exact
fixtures officielles/externes lorsque disponibles
ordre préservé
unknown/malformed géré
absent/empty/value distingués
integer conversions vérifiées
no f64 canonical truth
```
### 16.4 Adversarial
```text
oversized bytes
oversized collections
invalid discriminant
truncated input
trailing data si interdit par le wire
path/index overflow
nested/pathological input
Debug borné
```
### 16.5 Architecture
Canaris empêchant l'introduction prématurée de :
```text
Decoder trait
Program registry comportemental
Materializer trait
Execution preparer
Store DTO
Transport dependency
```
### 16.6 External consumer
Le canari doit simuler une crate externe qui ne dépend pas de l'implémentation officielle Program et n'accède qu'à l'API publique Interface.
---
## 17. Critères de clôture de `0.2.13`
La release peut devenir stable seulement si :
```text
ksp-interface-lib existe dans le workspace
scope public final correspond au plan recalibré de pre.001
aucun trait Program n'a fuité dans Interface
aucun modèle RAW/CORE prématuré n'a été imposé
Program IDs fondamentaux restent dans Core
ownership de chaque type public est documenté
surface publique est consommable depuis crate externe
bornes/adversarial canaris verts
codec/serde éventuels sont justifiés et testés
dependency firewall vert
cargo tree pertinent inspecté si graphe modifié
cargo fmt + audit Rust + check + clippy verts
cargo test -p ksp-interface-lib vert
cargo test --workspace vert
aucun smoke réseau inventé sans besoin
README/USAGE finaux réconciliés dans la tranche documentaire dédiée
plan/validation/architecture durable réconciliés dans cette même tranche documentaire
prompt 0.2.14 finalisé seulement dans la dernière prerelease
CHANGELOG/ROADMAP finalisés seulement dans la dernière prerelease
aucun rattrapage code/doc dans rel.001
```
Le numéro de prerelease prévu n'est jamais un critère de clôture.
---
## 18. Release/session suivante envisagée
La release suivante est :
```text
0.2.14 — Program API foundation
```
Elle doit ouvrir `ksp-program-api` comme contrat **ouvert et extensible** pour les comportements Program réellement démontrés.
Inputs historiques utiles à réauditer alors, notamment depuis kbot3 :
```text
identity / descriptor
surfaces / capabilities
recognition
instruction/account decoder families
outcomes / diagnostics / proof
prepared execution boundary
external implementation canaries
```
Mais `0.2.13` ne doit pas figer leur forme trait avant cet audit.
Après `0.2.14`, les implémentations officielles `ksp-program-lib` arrivent avec les vertical slices qui en ont réellement besoin, et non comme une grande couche monolithique préalable.
La trajectoire RAW/CORE reste séparée :
```text
0.3.1 Store RAW
0.3.2 extension Interface pour wires génériques acquisition/CORE
```
---
## 19. Instruction d'ouverture
Au début de la session `0.2.13` :
1. confirmer la base stable `v0.2.12` ou l'archive stable opérateur autoritaire ;
2. vérifier `workspace.package.version = 0.2.12` et `deltas/0.2.12/rel.001.md` ;
3. lire les règles de la section 3.1 dans l'ordre ;
4. lire l'architecture de la section 3.2, en particulier `006-WIRE_AND_PROGRAM.md` ;
5. relire la séquence fonctionnelle et la clôture `0.2.12` ;
6. exécuter la baseline complète avant développement lourd ;
7. inventorier la surface publique réelle Core et les DTOs Transport pertinents ;
8. réinspecter l'archive kbot3 si elle est disponible ;
9. produire la matrice `REPRENDRE / REDESSINER / REPORTER / REJETER` ;
10. auditer uniquement les sources externes réellement candidates et leurs versions actuelles ;
11. décider le premier minimum wire de `ksp-interface-lib` ;
12. produire la matrice d'ownership `Core / Interface / Transport / Program API / 0.3.2+` ;
13. décider bytes/bornes/serde/codec/versionnement/error model ;
14. produire la façade publique conceptuelle et le dependency graph cible ;
15. produire le threat/robustness model et la stratégie de tests ;
16. dimensionner la release et chaque tranche ;
17. créer le plan `020`, la validation `016` et `deltas/0.2.13/pre.001.md` ;
18. **ne pas commencer les traits Program, les decoders, les materializers, l'execution ou un modèle RAW/CORE complet avant la fermeture de ce gate**.
La première réponse de travail de la nouvelle session doit donc être un **audit/sizing `0.2.13-pre.001` complet**, avec matrice d'héritage kbot3, frontières, surface wire proposée, dépendances, risques, tests et forecast recalibré — pas un scaffold déjà figé ni un portage de `ks-lib`.