0.5.1-pre.006

This commit is contained in:
2026-08-10 02:44:24 +02:00
parent b6a286a4df
commit 34a670eaec
72 changed files with 5589 additions and 1932 deletions

View File

@@ -1,8 +1,14 @@
<!-- file: ks-pipeline-demo-scenarios/CHANGELOG.md -->
<!-- version: 76 -->
<!-- version: 77 -->
# CHANGELOG — ks-pipeline-demo-scenarios
## `0.5.1-pre.006`
- remplace la dépendance runtime au document applicatif monolithique par `config/ks-pipeline-demo-scenarios.default.config.json` pour les scénarios Devnet opt-in ;
- résout la composition par `ks-config`, puis conserve le contrat `AppConfig/ProfileConfig` runtime existant afin de ne pas requalifier les scénarios réseau ;
- aligne les fixtures unitaires sur les snapshots runtime sous `test-fixtures/config/` plutôt que sur une configuration source de binaire.
## `0.5.1-pre.005`
- aligne les scénarios et fixtures sur `config/app.config.json` comme document général par défaut ;

View File

@@ -1,5 +1,5 @@
<!-- file: ks-pipeline-demo-scenarios/USAGE.md -->
<!-- version: 29 -->
<!-- version: 30 -->
# Utilisation de ks-pipeline-demo-scenarios
@@ -113,7 +113,7 @@ KS_SECRET_POSTGRES_TEST_URL='postgresql://…' \
cargo test -p ks-pipeline-demo-scenarios optional_devnet_token_2022_metadata_campaign_from_env -- --nocapture
```
`KS_DEVNET_PROFILE` peut sélectionner explicitement le profil Devnet et `KS_DEVNET_CONFIG_PATH` peut remplacer `config/app.config.json`. Le profil doit utiliser un wallet persistant, autoriser les soumissions Devnet et respecter les plafonds de dépense et de frais.
`KS_DEVNET_PROFILE` peut sélectionner explicitement le profil Devnet et `KS_DEVNET_CONFIG_PATH` peut remplacer la composition `config/ks-pipeline-demo-scenarios.default.config.json`. La composition résout ensuite les profils transport/listeners et le profil runtime doit utiliser un wallet persistant, autoriser les soumissions Devnet et respecter les plafonds de dépense et de frais.
La sortie `TOKEN_2022_METADATA_FIXTURE` conserve le mint et la signature de préparation. Chaque ligne `TOKEN_2022_METADATA_STEP` conserve lopération, la signature, le slot, la postcondition, le nombre de matérialisations et, pour `Emit`, la taille du `returnData`. La campagne de référence de `pre.012` a été exécutée avec succès et ses preuves sont conservées dans `SPL_TOKEN_2022_METADATA_DEVNET_VALIDATION_MATRIX.json` et dans le rapport `docs/validation/V0_4_8_METADATA_VALIDATION_REPORT.md` ; le rapport détaillé `pre.012` est archivé sous `olddocs/archivekbot3/docs/validation/`. Une nouvelle exécution produit de nouvelles transactions et ne remplace ces preuves quaprès validation explicite.

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/environment.rs
// version: 5
// version: 6
//! Environment initialization for opt-in demonstration scenarios.
@@ -151,8 +151,9 @@ pub async fn prepare_demo_devnet_profile_store(
#[cfg(test)]
mod tests {
fn example_config() -> ks_config::AppConfig {
return match ks_config::parse_config_json(include_str!("../../config/app.config.json"))
{
return match ks_config::parse_config_json(include_str!(
"../../test-fixtures/config/resolved.app.config.json"
)) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("example config parse failed: {error}"),
};

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/collection_verify_campaign.rs
// version: 4
// version: 5
//! Confirmed Devnet collection parent/member `Verify -> Unverify` campaign.
@@ -648,13 +648,16 @@ mod tests {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => workspace_root.join("config/app.config.json"),
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let config = ks_config::read_config_json_file_with_environment(
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/create_mint_campaign.rs
// version: 12
// version: 13
//! Confirmed Devnet `Create -> Mint` campaign for one Metaplex asset family.
@@ -813,13 +813,16 @@ mod tests {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => workspace_root.join("config/app.config.json"),
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let config = ks_config::read_config_json_file_with_environment(
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/devnet_execution.rs
// version: 20
// version: 21
//! Real Devnet simulation and submission for current Metaplex Token Metadata operations.
@@ -1267,7 +1267,7 @@ fn validate_available_signers(
mod tests {
fn example_devnet_profile() -> ks_config::ProfileConfig {
let config = match ks_config::parse_config_json(include_str!(
"../../../../config/app.config.json"
"../../../../test-fixtures/config/resolved.app.config.json"
)) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("example config parse failed: {error}"),

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/escrow_campaign.rs
// version: 4
// version: 5
//! Confirmed Devnet Token Owned Escrow campaign for current Metaplex escrow operations.
@@ -973,13 +973,16 @@ mod tests {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => workspace_root.join("config/app.config.json"),
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let config = ks_config::read_config_json_file_with_environment(
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/maintenance_campaign.rs
// version: 6
// version: 7
//! Final bounded Devnet qualification campaign for current Metaplex maintenance operations.
@@ -577,13 +577,16 @@ mod tests {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => workspace_root.join("config/app.config.json"),
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let config = ks_config::read_config_json_file_with_environment(
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/pnft_lifecycle_campaign.rs
// version: 6
// version: 7
//! Confirmed Devnet pNFT delegate, lock, unlock, revoke and transfer campaign.
@@ -1071,13 +1071,16 @@ mod tests {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => workspace_root.join("config/app.config.json"),
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let config = ks_config::read_config_json_file_with_environment(
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/print_burn_campaign.rs
// version: 7
// version: 8
//! Devnet printable master NFT `Print -> Burn` campaign.
@@ -1180,13 +1180,16 @@ mod tests {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => workspace_root.join("config/app.config.json"),
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let config = ks_config::read_config_json_file_with_environment(
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/metadata/metaplex_token_metadata/use_campaign.rs
// version: 4
// version: 5
//! Bounded Devnet availability probe for the current Metaplex `Use` surface.
@@ -425,13 +425,16 @@ mod tests {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => workspace_root.join("config/app.config.json"),
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let config = ks_config::read_config_json_file_with_environment(
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/solana.rs
// version: 14
// version: 15
//! Devnet Solana execution orchestration with canonical post-validation.
@@ -1224,11 +1224,12 @@ pub(crate) fn emit<O>(
#[cfg(test)]
mod tests {
fn example_devnet_profile() -> ks_config::ProfileConfig {
let config =
match ks_config::parse_config_json(include_str!("../../config/app.config.json")) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("example config parse failed: {error}"),
};
let config = match ks_config::parse_config_json(include_str!(
"../../test-fixtures/config/resolved.app.config.json"
)) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("example config parse failed: {error}"),
};
return match crate::resolve_demo_devnet_profile(&config, std::option::Option::None) {
std::result::Result::Ok(profile) => profile,
std::result::Result::Err(error) => panic!("Devnet profile resolution failed: {error}"),

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/associated_token_account.rs
// version: 13
// version: 14
//! Devnet ATA execution with stateful and canonical post-validation.
@@ -993,12 +993,12 @@ mod tests {
}
fn example_devnet_profile() -> ks_config::ProfileConfig {
let config =
match ks_config::parse_config_json(include_str!("../../../config/app.config.json"))
{
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("example config parse failed: {error}"),
};
let config = match ks_config::parse_config_json(include_str!(
"../../../test-fixtures/config/resolved.app.config.json"
)) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("example config parse failed: {error}"),
};
return match crate::resolve_demo_devnet_profile(&config, std::option::Option::None) {
std::result::Result::Ok(profile) => profile,
std::result::Result::Err(error) => panic!("Devnet profile resolution failed: {error}"),

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/memo.rs
// version: 9
// version: 10
//! Devnet SPL Memo v4 execution with canonical post-validation.
@@ -754,12 +754,12 @@ fn decode_completed(summary: &ks_pipeline::DecodeReplaySummary) -> bool {
#[cfg(test)]
mod tests {
fn example_devnet_profile() -> ks_config::ProfileConfig {
let config =
match ks_config::parse_config_json(include_str!("../../../config/app.config.json"))
{
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("example config parse failed: {error}"),
};
let config = match ks_config::parse_config_json(include_str!(
"../../../test-fixtures/config/resolved.app.config.json"
)) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("example config parse failed: {error}"),
};
return match crate::resolve_demo_devnet_profile(&config, std::option::Option::None) {
std::result::Result::Ok(profile) => profile,
std::result::Result::Err(error) => panic!("Devnet profile resolution failed: {error}"),

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token/execution.rs
// version: 13
// version: 14
//! Devnet classic SPL Token execution with stateful and canonical post-validation.
@@ -975,7 +975,7 @@ pub(crate) fn decode_completed(summary: &ks_pipeline::DecodeReplaySummary) -> bo
mod tests {
fn example_devnet_profile() -> ks_config::ProfileConfig {
let config = match ks_config::parse_config_json(include_str!(
"../../../../config/app.config.json"
"../../../../test-fixtures/config/resolved.app.config.json"
)) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("example config parse failed: {error}"),

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token/lifecycle.rs
// version: 12
// version: 13
//! Controlled Devnet lifecycle for freshly prepared classic SPL Token accounts.
@@ -1688,7 +1688,7 @@ mod tests {
fn example_devnet_profile() -> ks_config::ProfileConfig {
let config = match ks_config::parse_config_json(include_str!(
"../../../../config/app.config.json"
"../../../../test-fixtures/config/resolved.app.config.json"
)) {
std::result::Result::Ok(value) => value,
std::result::Result::Err(error) => panic!("example config parse failed: {error}"),

View File

@@ -1,5 +1,5 @@
// file: ks-pipeline-demo-scenarios/src/spl/token_2022/metadata/campaign.rs
// version: 7
// version: 8
//! Ordered confirmed Devnet campaign for the five Token-2022 Token Metadata instructions.
@@ -502,13 +502,16 @@ mod tests {
let path = std::path::PathBuf::from(value);
if path.is_absolute() { path } else { workspace_root.join(path) }
},
std::result::Result::Err(_) => workspace_root.join("config/app.config.json"),
std::result::Result::Err(_) => {
workspace_root.join("config/ks-pipeline-demo-scenarios.default.config.json")
},
};
let config = ks_config::read_config_json_file_with_environment(
let composed = ks_config::read_composed_app_config_with_environment(
config_path.as_path(),
workspace_root,
)
.unwrap_or_else(|error| panic!("Devnet configuration loading failed: {error}"));
let config = composed.app_config;
let profile_name = std::env::var("KS_DEVNET_PROFILE").ok();
let mut profile = crate::resolve_demo_devnet_profile(&config, profile_name.as_deref())
.unwrap_or_else(|error| panic!("Devnet profile resolution failed: {error}"));