Files
khadhroony-solana-project/docs/validation/024-V0_3_7_BACKFILL_DESK.md

42 KiB

Validation v0.3.7 — Backfill Desk

1. Gate pre.001

  • Archive KSP v0.3.6 testée intégralement avant travail.
  • Archive kbot3 testée intégralement et extraite dans un arbre séparé.
  • Aucune entrée ZIP absolue, traversal, séparateur inversé ou lien symbolique détecté.
  • workspace.package.version = 0.3.6 confirmé sur la base.
  • deltas/0.3.6/rel.001.md confirmé.
  • ksp-job-api, ksp-job-backfill-lib et les trois Desks existants confirmés.
  • Règles générales, Rust, dépendances, documentation, file contracts, version workflow et prompt structure relus.
  • Architectures Layers/Dependencies/Components/Jobs/Apps relues.
  • README/USAGE/plan/validation/delta v0.3.6 relus.
  • Surfaces publiques Job/Backfill auditées depuis le code stable.
  • Config composite/Transport/Store audités.
  • Gabarits Config Desk, Wallet Desk et SOL Prices Desk audités.
  • Ports 1436/1437 confirmés libres dans les gabarits existants ; 1434/1435 appartiennent à SOL Prices.
  • kbot3 audité uniquement comme référence fonctionnelle/UX.
  • Matrice REPRENDRE/REDESSINER/REPORTER/REJETER produite.
  • Screen map, DTO/command map, Config/composition map et dependency map produits.
  • Threat model produit.
  • Single-run lifecycle, rôle HTTP, validation réseau et reprise in-session tranchés.
  • Gate Tauri/live tranché sans dépendance payante obligatoire.
  • Forecast scindé afin d'éviter une tranche Transport+Store manifestement trop large.
  • Aucun scaffold Tauri, code Rust/TS/HTML ou composite runtime ajouté en pre.001.

2. Preuve des archives

Source SHA-256 Résultat Usage
khadhroony-solana-project-v0.3.6.zip 90eceb9fd28d87e580e3881cdd3eda935784532caac07d0ba3fb845be664c845 1 594 entrées, ZIP propre source exclusive de code
khadhroony-bot3_v0.5.3-pre.005-fix010-thelatest1(2).zip ee47643b9f8b582ee8db97b2381ec107e45aef8c009fee44757531514615d318 2 501 entrées, ZIP propre référence fonctionnelle isolée
Texte collé(20260901-220002).txt f70930be652d2532e2403f01227af9870fd31ec0603e64ddadca4a44d910d8cc journal opérateur preuve externe baseline v0.3.6

Le journal opérateur fourni rapporte cargo clean, cargo fmt, audits Rust/Markdown, cargo check --workspace, Clippy, suites ciblées de toutes les crates, arbres Job/Backfill et cargo tree --duplicates sur v0.3.6. Cette preuve est conservée comme externe ; elle n'est pas assimilée à une exécution locale de pre.001.

3. Baseline locale

  • python3 scripts/audit_rust_workspace_rules.py : propre, zéro candidat d'export.
  • python3 scripts/audit_markdown_tables.py README.md RULES.md ROADMAP.md CHANGELOG.md docs prompts crates deltas : 295 tables / 652 fichiers propres avant modification.
  • cargo fmt --all : non exécuté localement, exécutable cargo absent.
  • cargo check --workspace : non exécuté localement, exécutable cargo absent.
  • cargo clippy --workspace --all-targets : non exécuté localement, exécutable cargo absent.

4. Surface KSP acquise à préserver

  • BackfillRequest reste l'autorité des bornes et de la cohérence des scopes.
  • Latest/Before/After/Explicit restent les seuls scopes V1.
  • BackfillJobRuntime reste single-run.
  • BackfillJobHandle reste la primitive de contrôle.
  • BackfillSnapshotSource latest-value reste la primitive d'observation.
  • BackfillCheckpoint reste opaque et Rust-only.
  • Transport reste propriétaire retry/reroute/rate-limit/provider/endpoint.
  • Store reste propriétaire backend/persistence/idempotence.
  • Config reste propriétaire documents/env/secrets/composites.

5. Décisions de composition

  • Composite dédié config/composite.ksp-app-backfill-desk.json prévu.
  • Profils devnet, mainnet, testnet prévus avec couples Transport/Store de même réseau.
  • Default final : mainnet depuis pre.006; Devnet/Testnet restent disponibles par reconfiguration du composite.
  • Aucun std.job_backfill.json en V1.
  • Les rôles sont dérivés de Transport et validés pour getSignaturesForAddress + getTransaction.
  • Aucun rôle history_backfill n'est hardcodé ; pre.006 expose les rôles logiques backfill_pool, backfill_solana_public et backfill_publicnode depuis Transport.
  • Une incohérence réseau est rejetée avant Start.
  • Le Desk ouvre Store via ksp-store-lib, jamais via backend direct.

6. Contrat IPC prévu

  • DTO applicatifs spécifiques au Desk ; aucune contrainte serde/TS-RS ajoutée aux crates Job.
  • Options DTO : réseau sûr, rôles, commitments, scopes, bornes, readiness.
  • Request DTO : inputs campagne uniquement.
  • Status DTO : lifecycle/phase/boundary/compteurs/checkpoint-present/contiguous/failure code.
  • Cancel/Resume responses sûres.
  • Aucun checkpoint opaque, Store, Transport, channel Tokio, URL, secret ou RAW payload ne traverse IPC.
  • Monitoring prévu via latest-value + événement Tauri, avec commande status de resynchronisation.

7. Threat model

  • URI Store et secrets Config restent backend-only.
  • Endpoint URLs/provider credentials restent backend-only.
  • Signatures et adresse ne sont pas loggées côté frontend.
  • RAW transaction data n'est pas projetée.
  • Bornes et signatures sont revalidées côté Rust.
  • Double Start est rejeté atomiquement.
  • Cancel/terminal race est résolue par lifecycle réel et handle installé avant spawn.
  • Checkpoint frontend forgé impossible : aucun checkpoint n'est sérialisé.
  • Capabilities Tauri prévues minimales : core + tracing seulement tant qu'aucun autre besoin n'est démontré.

8. Gates futures

  • Package Rust lib + bin conforme.
  • Ports Vite/HMR 1436/1437 stricts.
  • Splash/main + tracing conformes.
  • Composite Backfill Desk packagé et valide.
  • Transport readiness et role inventory sûrs.
  • Store readiness et cohérence réseau.
  • Quatre scopes + commitments + bornes mappés.
  • Single active run + Start.
  • Snapshot latest-value bridge.
  • Cancel + races terminales.
  • Checkpoint/frontier projection + Resume in-session.
  • Frontend/security/composition tests verts.
  • cargo test --workspace final vert.
  • (cd crates/ksp-app-backfill-desk && cargo tauri build) final vert.
  • Smoke live opt-in exécuté si environnement sûr disponible, sinon explicitement non requis.
  • Réconciliation README/USAGE/plan/validation dans sa tranche dédiée.
  • Prompt 0.3.8 + CHANGELOG + ROADMAP uniquement dans la lane de publication.

9. pre.002 — scaffold desktop

Le scaffold ksp-app-backfill-desk matérialise le gabarit Desk avant toute ouverture Transport/Store/Backfill : lib+bin, verrou single-instance, Config/Logging standard transitoire, splash commun, bridge Logging frontend, shell Backfill / Diagnostics, ports 1436/1437 et capabilities core:default + tracing:default.

Contraintes de gabarit vérifiées statiquement : mêmes assets splash/logo/DOS Amazigh que les trois Desk existantes, corps des cinq fichiers SASS partagés identique à SOL Prices Desk, splash HTML/SCSS identique hors identité Backfill et métadonnées de fichier, shell commun header + sidebar + content + footer, dépendances frontend minimales @fltsci/tauri-plugin-tracing, Font Awesome, Tauri API, Bootstrap, ResizeObserver polyfill et SimpleBar, plus les mêmes devDependencies que les trois Desk. Les clics, tabs, transitions de vue, refresh diagnostic et IPC sont instrumentés sans payload Backfill, adresse, signature, endpoint ou secret.

Gate statique local

  • audit Rust workspace propre, zéro candidat d'export ;
  • audit Markdown propre : 270 tableaux / 149 fichiers ;
  • 4 manifests JSON et 2 manifests TOML parsés ;
  • 6 dépendances frontend minimales aux versions du gabarit ;
  • devDependencies strictement identiques dans Config Desk, Wallet Desk, SOL Prices Desk et Backfill Desk ;
  • 5 assets binaires strictement identiques dans les quatre Desk ;
  • 5 fichiers SASS partagés identiques à SOL Prices Desk hors header de propriété ;
  • splash commun et shell sidebar contrôlés ;
  • capabilities core:default + tracing:default seulement ;
  • aucune dépendance Transport/Store/Backfill ouverte en pre.002 ;
  • audit frontend interaction/security propre ;
  • audit syntaxique TypeScript propre sur 5 fichiers ;
  • diff pre.001 -> pre.002 borné à 46 ajouts, 3 modifications et aucune suppression ;
  • cargo fmt/check/clippy/test : non exécutés, cargo/rustfmt absents du sandbox ;
  • typecheck npm complet / build Tauri : non exécutés dans le sandbox.

Le contrôle TypeScript local est syntaxique avec le compilateur global disponible ; il ne remplace pas le typecheck complet avec dépendances npm et bindings TS-RS générés. Toute correction révélée par le gate opérateur reste dans la lane pre.002-fix.NNN.

10. pre.003 — composite Config et packaging

Le composite cfg.composite.ksp-app-backfill-desk est enregistré dans ksp-config-lib avec devnet par défaut. Il sélectionne supertrace + devnet_public + devnet, tandis que mainnet et testnet conservent des couples Transport/Store cohérents. Le bootstrap Backfill Desk valide les trois composants requis mais ne résout encore que Logging : aucun HttpTransportPool, Store::open, BackfillRequest ou BackfillJobRuntime n'est ouvert dans cette tranche.

Le niveau de développement est volontairement verbeux pour cette application : devnet utilise supertrace, et le fallback Logging propre à Backfill Desk utilise LogFilterLevel::Trace. Les autres applications Desk ne changent pas de profil Logging.

La découverte du contrat réel de prepare_packaged_runtime() a réconcilié le plan : la fonction traverse tout ConfigFileRegistry::defaults(). Le registre compte désormais 14 descriptors, de sorte que Config Desk, Wallet Desk, SOL Prices Desk et Backfill Desk embarquent toutes les 14 resources Config/schema. Les documents Wallet/offchain présents dans le bundle Backfill ne sont pas consommés par son runtime et n'élargissent ni ses capabilities ni ses dépendances Rust.

Gate pre.002 opérateur acquis

  • audits Rust et Markdown propres ;
  • cargo check --workspace propre ;
  • cargo clippy --workspace --all-targets propre ;
  • cargo test -p ksp-app-backfill-desk : 12 unitaires + 5 desktop contract + 4 desktop security + 1 public API, aucun échec.

Gate statique local pre.003

  • composite Backfill Desk ajouté au source Config et aux fixtures Config ;
  • registre Config porté à 14 descriptors avec exports publics associés ;
  • profils devnet/mainnet/testnet et références Logging/Transport/Store couplés conformément au plan ;
  • les quatre tauri.conf.json Desk embarquent le registre Config complet de 14 resources ;
  • release packaging Backfill Desk appelle prepare_packaged_runtime() avant l'initialisation applicative ;
  • bootstrap Backfill valide Logging/Transport/Store puis ne résout que Logging ;
  • niveau de développement Backfill Desk verrouillé à supertrace via Config et trace en fallback ;
  • aucune dépendance ksp-job-backfill-lib, ksp-onchain-transport-lib, ksp-store-lib ou backend Store ajoutée au manifeste Backfill Desk ;
  • audit Rust workspace propre, zéro candidat d'export ;
  • audit Markdown propre : 270 tableaux / 150 fichiers ;
  • parsing JSON/TOML, validation JSON Schema et audit structurel Config/package propres ;
  • gate opérateur pre.003 exécuté le 2026-09-02 : FIX REQUIRED ; cargo check --workspace passe, mais l'audit Rust, Clippy, Config Desk et un canari Backfill Desk isolent quatre défauts locaux détaillés ci-dessous.

11. Correctif pre.003-fix.001

Le gate opérateur de pre.003 a isolé quatre défauts qui appartiennent tous au couloir Config/composition de pre.003 :

  • RUST-FMT-104 dans src/errors.rs : ERROR_CODE_CONFIG_COMPOSITE_INVALID précédait les constantes ERROR_CODE_APP_STATE_* ; le bloc est remis dans l'ordre alphabétique sans changer aucune valeur ;
  • Clippy implicit_return dans tests/desktop_contract.rs : la closure qui lit bundle.resources utilise désormais un return explicite, conformément aux lints workspace ;
  • la fixture composite.ksp-app-backfill-desk.json reprenait les profils de production (supertrace, devnet_public, mainnet_public, publicnode_testnet) alors que les fixtures réduites Logging/Transport n'exposent que local_dev et secret_test pour ces besoins ; comme les fixtures Wallet/SOL Prices existantes, la fixture Backfill utilise donc les profils disponibles du corpus de test, sans modifier le composite de production ;
  • tests/desktop_security.rs attendait littéralement ksp-config-lib.workspace = true, alors que les Desk KSP déclarent leurs dépendances internes par chemin local ; le canari vérifie désormais la forme réelle ksp-config-lib = { path = "../ksp-config-lib" } et conserve les interdictions des couches Transport/Store/Backfill.

Le correctif ne modifie ni le profil supertrace de production, ni les 14 resources packagées, ni le bootstrap runtime, ni les capabilities Tauri, ni les dépendances fonctionnelles de Backfill Desk.

La version Cargo devient 0.3.7-pre.3.fix.1 conformément à VER-ID-007 et VER-ID-010, car le correctif touche des fichiers Rust compilés.

Gate opérateur ayant déclenché le fix

cargo fmt --all                                               exécuté
python3 scripts/audit_rust_workspace_rules.py                 FAIL — 1 x RUST-FMT-104
python3 scripts/audit_markdown_tables.py ... deltas/0.3.7    PASS
cargo check --workspace                                       PASS
cargo clippy --workspace --all-targets                        FAIL — implicit_return dans desktop_contract.rs
cargo test -p ksp-config-lib                                  PASS — 128 tests unitaires + suites associées
cargo test -p ksp-app-config-desk                             FAIL — fixture Backfill / profil supertrace absent
cargo test -p ksp-app-wallet-desk                             PASS
cargo test -p ksp-app-solprices-desk                          PASS
cargo test -p ksp-app-backfill-desk                           FAIL — canari Cargo.toml obsolète

Gate du fix

  • audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
  • replay opérateur du 2026-09-02 : audits Rust/Markdown propres, cargo check --workspace propre, Clippy propre ;
  • cargo test -p ksp-config-lib : 128 tests unitaires + suites ownership/public API, aucun échec ;
  • cargo test -p ksp-app-config-desk : 63 tests unitaires + desktop/security/public API, aucun échec ;
  • cargo test -p ksp-app-wallet-desk et cargo test -p ksp-app-solprices-desk : suites ciblées propres ;
  • cargo test -p ksp-app-backfill-desk : 13 unitaires + 2 composition + 7 desktop contract + 5 desktop security + 1 public API, aucun échec ;
  • arbres cargo tree Backfill Desk exécutés sans anomalie rapportée.

12. pre.004 — Transport readiness

Backfill Desk dépend désormais directement de ksp-onchain-transport-lib au niveau backend uniquement. initialize_transport() résout le profil Transport déjà sélectionné par le composite, construit HttpTransportPool, dérive les clusters HTTP activés et déduplique les rôles logiques à partir des snapshots sûrs. Chaque rôle candidat doit réussir select_for_method() pour getSignaturesForAddress et getTransaction avant d'être exposé comme compatible.

Le sous-contrat BackfillDeskOptionsDto expose uniquement : réseaux configurés, rôles compatibles, readiness Transport et diagnostic applicatif sûr. Il ne contient ni provider, URL, endpoint physique, token, checkpoint, payload RAW ou objet Transport. La commande Tauri backfill_options est centralisée dans tauri.rs. Les scopes, commitments et bornes restent hors de cette tranche et seront ajoutés en pre.007 après la stabilisation du routage HTTP de pre.006.

Une seule network distincte et au moins un rôle compatible sont requis pour transport_ready = true. Une erreur Config/Transport n'empêche pas le shell de démarrer : elle produit une options projection non-ready avec CommandErrorDto, tandis que le pool n'est pas conservé. La cohérence avec le réseau Store reste explicitement réservée à pre.005.

Gate statique local pre.004

  • dépendance ksp-onchain-transport-lib ajoutée à Backfill Desk ;
  • aucune dépendance ksp-store-lib, ksp-store-api, ksp-store-postgres-lib ou ksp-job-backfill-lib ajoutée ;
  • HttpTransportPool construit uniquement dans transport_runtime.rs, pas dans le bootstrap Config/Logging ;
  • inventaire des clusters dérivé sans URL/provider ;
  • rôles candidats dédupliqués et vérifiés sur les deux RPC requis ;
  • le profil standard devnet_public possède un unique cluster devnet et le rôle wildcard default ;
  • capabilities Tauri inchangées : core:default + tracing:default ;
  • tracing de développement Backfill inchangé : Config supertrace, fallback trace ;
  • audit Rust workspace local propre, zéro candidat d'export ;
  • cargo fmt/check/clippy/test de pre.004 à rejouer par l'opérateur ; cargo/rustfmt restent absents du sandbox.

13. pre.005 — Store readiness et cohérence réseau

Gate opérateur pre.004 acquis

  • audits Rust/Markdown propres ;
  • cargo check --workspace propre ;
  • cargo clippy --workspace --all-targets propre ;
  • cargo test -p ksp-app-backfill-desk : 17 unitaires + 3 composition + 8 desktop contract + 5 desktop security + 1 public API, aucun échec ;
  • arbres cargo tree Backfill Desk exécutés sans anomalie rapportée ;
  • cargo tauri dev démarre le shell sur le profil Logging supertrace et le profil Transport devnet_public ;
  • le runtime réel rapporte un seul réseau, un rôle compatible et transport_ready = true ;
  • les changements de tabs sont visibles dans le tracing frontend DEBUG.

Gate statique local pre.005

  • dépendance directe ksp-store-lib ajoutée à Backfill Desk ;
  • aucune dépendance directe ksp-store-api, ksp-store-postgres-lib, ksp-job-backfill-lib, reqwest ou tokio-postgres ajoutée ;
  • le réseau Store est dérivé des settings Config résolus et comparé au réseau Transport unique avant Store::open ;
  • une incohérence ou l'absence de réseau Transport cohérent empêche l'ouverture Store ;
  • Store::health() est exécuté une fois après ouverture et sa projection reste backend-neutre ;
  • BackfillDeskOptionsDto expose seulement réseau Store, network_coherent, store_ready, composition_ready et diagnostics sûrs en plus du sous-contrat Transport ;
  • aucune URI PostgreSQL, URL Transport, identité provider, credential ou objet Store n'est projeté vers l'IPC ;
  • le Store est détenu côté Rust derrière une fermeture one-shot et Store::close() ;
  • la fermeture de la fenêtre principale est interceptée pour exécuter le close Store borné avant la sortie applicative ;
  • capabilities Tauri inchangées : core:default + tracing:default ;
  • tracing de développement Backfill inchangé : Config supertrace, fallback trace ;
  • aucun BackfillRequest, BackfillJobRuntime, Start/Cancel/Resume n'est ouvert ;
  • audit Rust workspace local propre, zéro candidat d'export ;
  • cargo fmt/check/clippy/test de pre.005 à rejouer par l'opérateur ; cargo/rustfmt restent absents du sandbox.

14. Correctif pre.005-fix.001

Le gate opérateur de pre.005 confirme que les audits Rust/Markdown, cargo check --workspace et Clippy sont propres, puis isole un seul échec déterministe dans tests/config_composition.rs : le canari de cohérence réseau essayait de mapper intégralement le profil Transport publicnode_testnet, ce qui résout aussi son endpoint Yellowstone gRPC et exige donc KSP_SECRET_PUBLICNODE_TESTNET_GRPC_X_TOKEN même si le test ne vérifiait que l'identité du réseau HTTP.

Le correctif ne modifie aucun runtime, aucun composite Config, aucun profil Transport/Store et aucune capability. Le canari lit désormais uniquement les champs non secrets déjà validés des profils composés : clusters des endpoints HTTP activés et réseau logique Store. Les tests runtime unitaires restent responsables de la comparaison effective avant Store::open, tandis que les tests Config/Transport propriétaires couvrent séparément la résolution des secrets gRPC.

Gate du fix

  • correction strictement limitée au couloir Store/composition de pre.005 ;
  • aucune modification du composite de production ni des settings Transport/Store ;
  • aucun secret provider requis par le test déterministe de cohérence réseau ;
  • audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
  • replay opérateur cargo fmt/check/clippy/test de pre.005-fix.001 propre.

La décision utilisateur de faire de Mainnet le profil Backfill par défaut et de tester plusieurs familles de transport Backfill (HTTP standard, HTTP provider tel que Helius, Yellowstone gRPC ; WebSocket exclu de V1 sauf besoin démontré) appartient à des couloirs Config/Transport antérieurs. Conformément à VER-LIFECYCLE-010, elle n'est pas introduite dans ce fix et doit ouvrir une prerelease dédiée après validation du correctif.

0.3.7-pre.006 — Mainnet par défaut et routage HTTP opérateur

La décision post-pre.005 est appliquée dans une nouvelle tranche dédiée : le composite Backfill Desk utilise mainnet par défaut, avec Logging supertrace pendant le développement et un profil Transport mainnet_backfill_pool. Ce profil expose deux endpoints HTTP sans secret obligatoire au démarrage : Solana Public et PublicNode.

Trois rôles logiques sont proposés : backfill_pool pour le pool multi-provider, backfill_solana_public et backfill_publicnode pour le ciblage explicite. L'IPC expose uniquement le rôle et les labels provider sûrs ; aucune URL ni credential. Le frontend charge backfill_options() au démarrage, rend le sélecteur et trace le changement de route. Aucun Start n'est ajouté dans cette tranche.

Le support Yellowstone gRPC de ksp-job-backfill-lib/Backfill Desk est retiré du périmètre 0.3.7 et reporté à une version ultérieure (0.3.12+ comme cible indicative). WebSocket reste hors Backfill V1.

Gate pre.006

  • Mainnet est le profil composite par défaut et conserve supertrace pendant le développement ;
  • le profil mainnet_backfill_pool expose Solana Public + PublicNode en HTTP avec rôles pool/ciblés ;
  • aucun endpoint gRPC n'est introduit dans ce profil ;
  • l'IPC expose uniquement rôle logique et labels provider sûrs ;
  • le frontend charge/rend le sélecteur et trace son changement ;
  • aucun Start ni dépendance ksp-job-backfill-lib n'est ouvert par la Desk ;
  • audits statiques Rust/Markdown, JSON Schema et syntaxe TypeScript propres dans l'environnement d'assemblage ;
  • replay opérateur cargo fmt/check/clippy/test de pre.006 exécuté ; un fix Clippy strictement local a été requis puis traité.

Correctif pre.006-fix.001

Le gate opérateur de pre.006 confirme que les audits Rust/Markdown et cargo check --workspace sont propres, puis Clippy isole trois closures de tests/config_composition.rs qui violaient clippy::implicit_return. Les tests exécutés après cet arrêt restent propres, mais le gate global est bloqué tant que Clippy échoue.

Le correctif reste strictement dans la responsabilité de pre.006 : il ajoute uniquement les return explicites exigés par les lints workspace dans le canari Mainnet/pool HTTP. Aucun profil Config, rôle Transport, DTO, frontend, runtime Store/Transport ou contrat Job n'est modifié.

Gate du fix

  • trois closures filter_map/flat_map utilisent désormais un return explicite ;
  • aucun contenu fonctionnel de pre.006 n'est modifié ;
  • version Cargo synchronisée en 0.3.7-pre.6.fix.1 conformément à VER-ID-007 et VER-ID-010 ;
  • audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
  • replay opérateur cargo fmt/check/clippy/test du fix propre : audits, check, Clippy, Config et toutes les suites Backfill Desk passent.

15. pre.007 — DTO et mapping de requête

Le replay opérateur de pre.006-fix.001 est acquis : audits Rust/Markdown propres, cargo check --workspace et Clippy propres, ksp-config-lib intégralement vert, puis Backfill Desk vert sur ses 21 tests unitaires, 5 tests de composition, 10 desktop contract, 6 desktop security et 1 public API. Les arbres Cargo ont également été exécutés sans anomalie rapportée.

pre.007 ouvre ksp-job-api et ksp-job-backfill-lib uniquement pour construire et valider le contrat de requête. BackfillStartRequestDto reste app-owned et ne transporte ni network, provider, endpoint, URL, credential, checkpoint ou JobId. Le backend dérive le réseau depuis le Store déjà composé et refuse tout http_role absent de l'inventaire sûr courant.

Le formulaire expose les quatre scopes HTTP V1 (latest_address, before_address, after_address, explicit_signatures), finalized/confirmed, les quatre bornes numériques et min_context_slot. Ce dernier traverse l'IPC comme texte décimal afin d'éviter toute perte de précision JavaScript avant parsing u64 côté Rust. Les maxima proviennent exclusivement des constantes publiques de ksp-job-backfill-lib; les defaults de Desk restent strictement inférieurs ou égaux à ces maxima.

La commande backfill_validate_request construit un JobId interne uniquement pour satisfaire le contrat BackfillRequest, applique le même mapping qui sera réutilisé par Start, puis renvoie une BackfillRequestPreviewDto sûre. La preview contient le réseau, le rôle logique, commitment/scope, bornes et seulement présence/comptage pour les valeurs sensibles. Aucun Job n'est créé ni lancé dans cette tranche.

Gate statique local pre.007

  • dépendances directes ksp-job-api et ksp-job-backfill-lib ajoutées à Backfill Desk ;
  • aucune dépendance directe backend Store, reqwest, tonic ou Yellowstone ajoutée ;
  • request DTO sans network/provider/endpoint/URL/JobId ;
  • réseau dérivé du Store configuré et rôle HTTP revalidé contre l'inventaire courant ;
  • quatre scopes et deux commitments mappés explicitement ;
  • min_context_slot transporté comme texte puis parsé en u64 côté Rust ;
  • bornes maxima dérivées des constantes publiques Job et defaults applicatifs vérifiés ;
  • preview sûre sans adresse ni signature ;
  • formulaire frontend + validation backend disponibles, sans bouton Start ni BackfillJobRuntime ;
  • instrumentation frontend limitée aux codes/rôle/scope et métadonnées de contrôle ;
  • capabilities Tauri inchangées : core:default + tracing:default ;
  • cargo fmt/check/clippy/test de pre.007 à rejouer par l'opérateur ; cargo/rustfmt restent absents du sandbox.

16. Correctif pre.007-fix.001

Le gate opérateur de pre.007 confirme que les audits Rust/Markdown et cargo check --workspace sont propres et que ksp-job-backfill-lib passe intégralement ses suites. Le blocage est limité au test unitaire Backfill Desk explicit_signatures_reject_address_context_and_deduplicate_in_job_contract : une variable locale nommée job_id masquait le helper job_id(), rendant l'appel suivant illégal au compile-time.

Le correctif renomme uniquement cette variable locale en request_job_id. Aucun code de production, DTO, mapping BackfillRequest, formulaire frontend, runtime Transport/Store ou contrat Job n'est modifié.

Gate du fix

  • shadowing job_id supprimé dans le test concerné ;
  • aucun fichier fonctionnel de pre.007 modifié ;
  • version Cargo synchronisée en 0.3.7-pre.7.fix.1 conformément à VER-ID-007 et VER-ID-010 ;
  • audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
  • replay opérateur cargo fmt/check/clippy/test du fix propre : audits, check, Clippy, ksp-job-backfill-lib et toutes les suites Backfill Desk passent.

17. pre.008 — runtime et Start réel

Le replay opérateur de pre.007-fix.001 est acquis. pre.008 ouvre l'exécution réelle sans modifier le contrat de requête : backfill_start réutilise map_backfill_request, génère le JobId côté backend, construit BackfillJobRuntime, capture son BackfillJobHandle puis installe ce handle dans un slot single-active-run avant le spawn Tauri. Un second Start est rejeté par backfill_run_active.

Le pool HTTP est clonable et reste possédé par Transport. Le Store backend-neutre, non clonable, est temporairement retiré de son slot applicatif pour être déplacé dans le task du run ; après terminal, il est restauré avant libération du slot actif. La réponse IPC Start contient uniquement job_id et l'état initial created. Le monitoring détaillé, les événements latest-value et la projection terminale restent réservés à pre.009. Cancel et la fermeture coopérative d'un run actif restent réservés à pre.010.

La note UX ajoutée pendant cette tranche est reportée à pre.012 : l'input adresse restera libre mais utilisera un datalist HTML construit depuis le registre canonique ksp-core-lib::entries()/ProgramIdEntry, sur le principe fonctionnel de l'ancien ks-program-ids de kbot3 sans en reprendre le code.

Gate statique local pre.008

  • BackfillJobRuntime::new est appelé uniquement après le mapping autoritaire pre.007 ;
  • BackfillJobHandle est obtenu et installé dans le slot actif avant tauri::async_runtime::spawn ;
  • admission single-run atomique avec erreur stable backfill_run_active ;
  • JobId généré côté backend, jamais reçu du frontend ;
  • pool HTTP cloné depuis TransportRuntime, sans URL/provider physique supplémentaire ;
  • Store temporairement prêté au run puis restauré après terminal ;
  • BackfillStartResponseDto limité à job_id + état initial ;
  • frontend conserve le bouton de validation et ajoute un bouton Start distinct, activé seulement si composition_ready ;
  • aucune adresse, signature, ancre ou min_context_slot ajoutée aux logs Start ;
  • capabilities Tauri inchangées : core:default + tracing:default ;
  • audits statiques Rust/Markdown propres dans l'environnement d'assemblage ;
  • cargo fmt/check/clippy/test de pre.008 à rejouer par l'opérateur ; cargo/rustfmt restent absents du sandbox.

18. Correctif pre.008-fix.001 — futures Job Backfill Send

Le gate opérateur de pre.008 confirme que les audits Rust/Markdown sont propres, puis cargo check --workspace bloque l'intégration Tauri du Start : tauri::async_runtime::spawn exige une future Send + 'static, alors que deux alias privés de ksp-job-backfill-lib effaçaient la propriété Send des futures discovery et candidate-processing.

StoreApiFuture était déjà Send; le défaut se trouvait uniquement dans SignaturePageFuture et CandidateProcessFuture. Le correctif ajoute std::marker::Send à ces deux objets future privés et verrouille ce contrat par deux canaries compile-time dédiées.

Gate du fix

  • SignaturePageFuture impose Future + Send ;
  • CandidateProcessFuture impose Future + Send ;
  • canary discovery compile-time Send ajoutée ;
  • canary execution compile-time Send ajoutée ;
  • aucune API publique Job, logique de requête, Start Desk, Store, Transport ou frontend n'est modifiée ;
  • audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
  • replay opérateur cargo fmt/check/clippy/test de pre.008-fix.001 à exécuter.

19. pre.008-fix.002 — canari d'ordre Start local au bon spawn

Le replay opérateur de pre.008-fix.001 confirme que la correction Send est effective : audits, cargo check --workspace, Clippy et ksp-job-backfill-lib passent. La suite Backfill Desk atteint alors le canari pre_008_start_installs_handle_before_non_blocking_spawn_and_keeps_single_run_backend_owned, qui échoue sur prepare_index < spawn_index.

La production respecte pourtant l'invariant : AppState::prepare_backfill_start construit le runtime, récupère son handle, installe le slot single-run, acquiert Transport/Store puis retourne BackfillRunLaunch; ensuite seulement la commande Tauri backfill_start appelle tauri::async_runtime::spawn. Le défaut vient du test, qui utilisait tauri.find("tauri::async_runtime::spawn(async move") sur tout src/tauri.rs et capturait ainsi le spawn antérieur du shutdown Store.

Le fix rend le canari contextuel : après localisation de state.prepare_backfill_start(request), la recherche du spawn est limitée au suffixe de source qui suit cette admission. Aucun code de production, DTO, frontend, contrat Job, Store ou Transport n'est modifié.

Gate opérateur requis après application :

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.7
cargo check --workspace
cargo clippy --workspace --all-targets
cargo test -p ksp-job-backfill-lib
cargo test -p ksp-app-backfill-desk
cargo tree -p ksp-app-backfill-desk --edges normal
cargo tree -p ksp-app-backfill-desk -e features

20. pre.008-fix.003 — canaris sécurité bornés aux DTO exacts

Le replay opérateur de pre.008-fix.002 confirme que les corrections précédentes sont effectives : audits Rust/Markdown, cargo check --workspace, Clippy et ksp-job-backfill-lib passent, puis le canari d'ordre Start corrigé passe également. Le dernier blocage est limité à deux canaris desktop_security.

Les DTO de production sont conformes. Les deux échecs sont des faux positifs causés par des fenêtres textuelles trop larges : le contrôle de BackfillStartRequestDto s'étendait jusqu'à BackfillRequestPreviewDto et incluait donc légitimement BackfillStartResponseDto::job_id; le contrôle de BackfillStartResponseDto incluait les commentaires de documentation du DTO suivant, qui contiennent les mots address/signature.

Le correctif ajoute un helper de test qui extrait uniquement la déclaration de struct visée, de son marqueur struct jusqu'à son accolade fermante immédiate. Les deux canaris auditeront désormais exactement BackfillStartRequestDto et BackfillStartResponseDto, sans modifier les DTO ni aucun code de production.

Gate du fix

  • aucun fichier de production Backfill Desk, Job Backfill, Store ou Transport modifié ;
  • le canari request ne peut plus inclure BackfillStartResponseDto::job_id ;
  • le canari Start acknowledgement ne peut plus inclure la documentation de BackfillRequestPreviewDto ;
  • les champs réellement interdits restent vérifiés dans le corps exact des DTO exposés ;
  • version Cargo synchronisée en 0.3.7-pre.8.fix.3 ;
  • audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
  • replay opérateur cargo fmt/check/clippy/test de pre.008-fix.003 à exécuter ; aucun cargo tree requis car dépendances/features inchangées.

21. pre.009 — monitoring latest-value et resynchronisation

Le replay opérateur de pre.008-fix.003 ferme le couloir Start : audits Rust/Markdown, cargo check --workspace, Clippy, les 49 tests unitaires ksp-job-backfill-lib et toutes les suites Backfill Desk passent. Aucun cargo tree supplémentaire n'était requis pour ce dernier fix test-only sans changement de dépendances/features.

pre.009 branche directement la source latest-value déjà possédée par BackfillJobHandle. BackfillRunLaunch conserve une BackfillSnapshotSource indépendante avant déplacement du runtime dans le task, tandis que BackfillRunState conserve le handle actif et retient la dernière notification terminale après finish. La commande backfill_status retourne donc soit la valeur active courante, soit le dernier terminal retenu, ce qui fournit une resynchronisation explicite sans dépendre de l'historique des événements frontend.

Le bridge Tauri attend JobSnapshotSource::wait_for_change et émet ksp-backfill-status. Cette primitive latest-value coalesce les mises à jour intermédiaires : aucun event queue métier supplémentaire ni polling de logs n'est introduit. BackfillRunStatusDto expose uniquement des métadonnées sûres et bornées : JobId/kind, sequence en texte décimal, lifecycle/completion, phase/scope/boundary, compteurs candidates/entities/observations, missing/conflicts/cancelled/holes, maximum in-flight, checkpoint_present, contiguous_completed et éventuel failure_domain/failure_code. Adresse, signatures, endpoint/provider, payload RAW, contexte d'erreur et checkpoint concret restent backend-only.

Le frontend installe le listener avant la resynchronisation startup, rend le dernier snapshot complet, propose un bouton manuel de resynchronisation et réactive Start lorsque le snapshot devient terminal. Cancel, état cancelling piloté par l'UI et races fermeture/Cancel/terminal restent réservés à pre.010.

Gate statique local pre.009

  • monitoring branché sur JobSnapshotSource, sans parsing de logs ;
  • événement latest-value coalescé ksp-backfill-status ;
  • commande backfill_status de resynchronisation ;
  • dernier terminal retenu après libération du slot single-run ;
  • sequence u64 projetée comme texte décimal ;
  • compteurs complets projetés avec conversion bornée vers u32 ;
  • checkpoint projeté seulement par présence + frontier contigu ;
  • erreurs projetées seulement par domaine/code stables ;
  • aucun payload métier, URL/provider/credential ou checkpoint concret exposé ;
  • frontend réactive Start sur terminal et garde un resync manuel ;
  • aucun Cancel/Resume ajouté prématurément ;
  • cargo fmt/check/clippy/test de pre.009 à rejouer par l'opérateur ; cargo/rustfmt restent absents du sandbox.

22. Correctif pre.009-fix.001 — helpers de canaris monitoring

Le gate opérateur de pre.009 confirme que les audits Rust/Markdown et cargo check --workspace sont propres. ksp-job-backfill-lib reste intégralement vert. Le blocage est limité à la compilation de deux nouveaux canaris Backfill Desk : desktop_contract appelle un helper inexistant read, tandis que desktop_security appelle workspace_root et read, helpers absents de ce fichier.

Le smoke Tauri manuel confirme parallèlement le comportement fonctionnel de pre.009 : avec le Store Mainnet joignable et tls_mode = disabled dans la configuration locale opérateur, le Store devient ready, un backfill latest_address est admis, dix candidats sont traités puis un snapshot terminal finished est retenu et resynchronisable via backfill_status. Cette configuration TLS locale n'appartient pas au delta du correctif de tests.

Le correctif réutilise uniquement les helpers déjà possédés par chaque fichier de test : app_root() et read_text(). Aucun code de production, DTO, monitoring latest-value, runtime Job, Store, Transport, frontend ou configuration n'est modifié.

Gate du fix

  • desktop_contract utilise app_root() + read_text() pour les quatre sources pre.009 ;
  • desktop_security utilise app_root() + read_text() pour backfill_status.rs ;
  • aucun nouveau helper de test redondant n'est introduit ;
  • aucun fichier de production ou Config n'est modifié ;
  • version Cargo synchronisée en 0.3.7-pre.9.fix.1 ;
  • audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
  • replay opérateur cargo fmt/check/clippy/test du fix à exécuter ; aucun cargo tree requis car dépendances/features inchangées.

23. Correctif pre.009-fix.002 — canari monitoring borné aux champs sérialisés

Le replay opérateur de pre.009-fix.001 confirme que les audits Rust/Markdown, cargo check --workspace, Clippy, ksp-job-backfill-lib et les suites desktop_contract sont propres. Le seul échec restant est le canari pre_009_monitoring_projection_exposes_counters_and_codes_without_checkpoint_or_business_payloads.

Le DTO de production est conforme : il n'expose aucun champ adresse/signature. Le faux positif vient du canari, qui cherche les mots nus address et signature dans toute la source de BackfillRunStatusDto, y compris les commentaires de documentation. Or la documentation de scope_kind précise explicitement que ce champ est exposé « without address/signature payloads ».

Le correctif conserve le même niveau de sécurité mais cible désormais les déclarations de champs réellement sérialisés : pub(crate) address:, pub(crate) signature:, pub(crate) endpoint:, pub(crate) provider:, pub(crate) credential:, pub(crate) token:, pub(crate) checkpoint:, pub(crate) payload: et pub(crate) raw_transaction:. checkpoint_present reste explicitement autorisé.

Gate du fix

  • aucun fichier de production, DTO, monitoring, frontend, Store, Transport ou Job n'est modifié ;
  • le canari n'interprète plus les doc-comments comme des champs IPC ;
  • les champs métier/sensibles restent interdits par leur déclaration exacte ;
  • checkpoint_present reste autorisé tandis que pub(crate) checkpoint: reste interdit ;
  • version Cargo synchronisée en 0.3.7-pre.9.fix.2 ;
  • audits statiques Rust/Markdown rejoués dans l'environnement d'assemblage ;
  • replay opérateur cargo fmt/check/clippy/test du fix à exécuter ; aucun cargo tree requis car dépendances/features inchangées.