# Delta `0.3.4-pre.008` — capabilities account + conformance RAW 10/10 ## 1. Base requise ```text 0.3.4-pre.007-fix.001 workspace.package.version = 0.3.4-pre.7.fix.1 ``` Le gate opérateur fourni le 2026-08-30 pour `pre.007-fix.001` est entièrement vert : ```text cargo fmt --all PASS audit Rust général / exports / workspace PASS audit Markdown PASS — 239 tables / 145 files cargo check --workspace PASS cargo clippy --workspace --all-targets PASS cargo test -p ksp-store-api PASS cargo test -p ksp-store-lib PASS cargo test -p ksp-store-postgres-lib PASS — 63 unit tests + canaris, live ignored cargo test -p ksp-config-lib PASS — 128 unit tests + ownership/public API cargo check -p ksp-store-lib --no-default-features PASS ``` La verticale account possède donc déjà ses primitives physiques read/write/pagination validées avant ouverture des traits. ## 2. Objectif Ouvrir uniquement les quatre capabilities account existantes : ```text RawAccountStateRead RawAccountStateWrite RawAccountObservationRead RawAccountObservationWrite ``` sur : ```text PostgresBackend Store ``` et transformer les canaris pour fermer l'inventaire RAW à : ```text 6 RawTransaction* + 4 RawAccount* = 10/10 ``` Aucun nouveau SQL, modèle, migration, type public ou comportement physique n'est ajouté. ## 3. Version Le workspace passe à : ```text 0.3.4-pre.8 ``` ## 4. `PostgresBackend` — quatre traits account `src/runtime.rs` implémente exactement une fois : ```text RawAccountStateRead RawAccountStateWrite RawAccountObservationRead RawAccountObservationWrite ``` Chaque méthode adapte exclusivement le bridge étroit déjà présent : ```text get_raw_account_state list_raw_account_states persist_raw_account_acquisition get_raw_account_observation record_raw_account_observation ``` Les erreurs physiques passent par `map_capability_error`, comme les six traits transaction. Aucun SQL ou type PostgreSQL n'entre dans l'API de capability. ## 5. `Store` — dispatch backend-neutral `Store` implémente les mêmes quatre traits et délègue uniquement au backend compilé. Guards réseau avant dispatch : ```text get state reference.network list state query.network persist state state.reference.network + observation.account.network record obs observation.account.network get obs aucun input réseau — RawObservationKey uniquement ``` Le backend conserve en plus le guard d'égalité : ```text observation.account == state.reference ``` avant `pool.get()` sur l'acquisition atomique. Avec `postgres` désactivé, les dix traits restent implémentés sur `Store` et leur chemin runtime retourne `backend_not_compiled`, sans dépendance physique compilée. ## 6. Canaris transformés Les canaris historiques anti-account ne sont pas supprimés. Ils deviennent des canaris de placement et de complétude : ```text PostgresBackend : exactement 10 impl Raw* Store : exactement 10 impl Raw* chaque impl account apparaît exactement une fois aucun impl account dans raw_account.rs aucun impl métier dans migration.rs/schema.rs aucun SQL/type PostgreSQL dans ksp-store-lib validate_operation_network occurrences Store = 14 ``` Les canaris `pre.005`, `pre.006` et `pre.007` conservent leurs interdictions destructives et de policy (`UPDATE`, `DELETE`, `ON CONFLICT DO UPDATE`, `OFFSET`, clamp/batch policy), sans exiger que les traits account restent fermés après leur tranche d'ouverture légitime. ## 7. Invariants préservés ```text ksp-store-api inchangée raw_account.rs inchangé raw_account/cursor.rs inchangé SQL runtime account inchangé V000/V001/V002 byte-inchangées aucun account retention/archive/purge aucun worker/job/backfill policy aucun Transport -> Store aucun nouveau backend ``` Checksum V002 inchangé : ```text ff21605ed45f7ab4c0f92bbb692700b4118a9488b04d50a31d259ac59bdb550e ``` ## 8. Fichiers ajoutés ```text deltas/0.3.4/pre.008.md ``` ## 9. Fichiers modifiés ```text Cargo.toml crates/ksp-store-lib/src/lib.rs crates/ksp-store-lib/src/store.rs crates/ksp-store-lib/tests/dependency_boundary.rs crates/ksp-store-lib/tests/hardening_completeness.rs crates/ksp-store-lib/tests/public_api.rs crates/ksp-store-postgres-lib/src/lib.rs crates/ksp-store-postgres-lib/src/runtime.rs crates/ksp-store-postgres-lib/tests/dependency_boundary.rs crates/ksp-store-postgres-lib/tests/hardening_completeness.rs crates/ksp-store-postgres-lib/tests/public_api.rs docs/plans/025-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT_PLAN.md docs/validation/021-V0_3_4_STORE_POSTGRES_RAW_ACCOUNT.md ``` ## 10. Fichiers supprimés ```text aucun ``` ## 11. Validations exécutées à l'assemblage ```text python3 scripts/audit_rust_workspace_rules.py PASS python3 scripts/audit_markdown_tables.py ... deltas/0.3.4 PASS inventaire PostgresBackend Raw* = 10 PASS inventaire Store Raw* = 10 PASS validate_operation_network occurrences Store = 14 PASS migrations V000/V001/V002 byte-identiques à pre.007-fix.001 PASS raw_account.rs / raw_account/cursor.rs inchangés PASS ksp-store-api inchangée PASS ``` `cargo`, `rustfmt`, Clippy et les tests Rust ne sont pas disponibles dans l'environnement d'assemblage ; le gate opérateur complet doit être rejoué. ## 12. Gate opérateur à rejouer ```text 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.4 cargo check --workspace cargo clippy --workspace --all-targets cargo test -p ksp-store-api cargo test -p ksp-store-lib cargo test -p ksp-store-postgres-lib cargo test -p ksp-config-lib cargo check -p ksp-store-lib --no-default-features ``` ## 13. Décisions prises - `pre.008` n'ajoute aucune primitive physique : elle ouvre uniquement les traits déjà prévus par `ksp-store-api`. - `RawAccountObservationRead` n'ajoute pas de faux guard réseau, car `RawObservationKey` ne porte pas de réseau. - La conformance 10/10 est vérifiée par inventaire exact, pas par simple présence partielle. - Les canaris historiques sont transformés vers les invariants encore pertinents au lieu d'être supprimés. - La preuve réelle PostgreSQL account reste réservée à `pre.009`. ## 14. Questions ouvertes ```text aucune question bloquante pour pre.008 ```