From b335b5cb0672d330499da2727c5f87ae4cdec0a4 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 5 Aug 2026 05:00:40 -0400 Subject: [PATCH 1/3] fix(sccm): remove fixture identity allowlists from intake --- .../src/sccm/server/windows/catalog.rs | 7 + .../src/sccm/server/windows/intake.rs | 461 ++++-------------- .../tests/sccm_server_intake.rs | 54 +- ...sccm-409-server-intake-identity-grammar.md | 171 +++++++ library.md | 1 + 5 files changed, 313 insertions(+), 381 deletions(-) create mode 100644 docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md diff --git a/crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs b/crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs index a8c69b70c..2ef4467d4 100644 --- a/crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs +++ b/crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs @@ -300,6 +300,13 @@ pub fn declared_server_source_catalog() -> &'static [SccmServerSourceSpec] { SERVER_SOURCE_SPECS } +pub(crate) fn is_declared_server_source_id(source_id: &str) -> bool { + SERVER_SOURCE_SPECS + .iter() + .chain(std::iter::once(&SERVER_STRUCTURED_SUPPLEMENT_SPEC)) + .any(|spec| spec.source_id == source_id) +} + pub(crate) fn classify_declared_server_source( source_id: &str, producer_role: &SccmRole, diff --git a/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs b/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs index 179b0235d..278bb1eff 100644 --- a/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs +++ b/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs @@ -21,9 +21,10 @@ use crate::sccm::{ use super::catalog::{ classify_declared_hierarchy_source, classify_declared_server_source, - declared_hierarchy_source_contracts, expected_family, SccmServerHierarchyDirection, - SccmServerHierarchySourceContract, SccmServerSourceKind, SccmServerSourceSpec, - SCCM_SERVER_HIERARCHY_SOURCE_CONTRACT_VERSION, SCCM_SERVER_SITE_DATABASE_SCHEMA_VERSION, + declared_hierarchy_source_contracts, expected_family, is_declared_server_source_id, + SccmServerHierarchyDirection, SccmServerHierarchySourceContract, SccmServerSourceKind, + SccmServerSourceSpec, SCCM_SERVER_HIERARCHY_SOURCE_CONTRACT_VERSION, + SCCM_SERVER_SITE_DATABASE_SCHEMA_VERSION, }; /// Keep parser-side work bounded even when the manifest did not come from the @@ -37,75 +38,6 @@ const MAX_SCCM_SERVER_OPAQUE_EXTENSION_BYTES_PER_SCOPE: usize = 8 * 1024; const MAX_SCCM_SERVER_TOTAL_OPAQUE_EXTENSIONS: usize = 1_024; const MAX_SCCM_SERVER_TOTAL_OPAQUE_EXTENSION_BYTES: usize = 256 * 1024; -// Closed synthetic hierarchy vocabulary from the reviewed #331 corpus. These -// values are intake fixtures, not a prefix admission rule: adding one requires -// changing this registry and therefore the canonical intake integrity surface. -const SYNTHETIC_HIERARCHY_ARTIFACT_IDS: &[&str] = &[ - "absent-01-sender", - "absent-02-despool", - "backlog-01-replmgr", - "clock-01-sender", - "clock-02-despool", - "generic-01-sender", - "healthy-01-replmgr", - "healthy-02-sender", - "healthy-03-despool", - "healthy-04-rcmctrl", - "incomplete-01-replmgr", - "mismatch-01-sender", - "mismatch-02-despool", - "receiver-01-sender", - "receiver-02-despool", - "recovery-01-sender", - "recovery-02-despool", - "rotation-01-current", - "rotation-02-lo", - "sender-failure-01-chd", -]; -const SYNTHETIC_HIERARCHY_LINEAGES: &[&str] = &[ - "absent-despool", - "absent-sender", - "backlog-replmgr", - "clock-despool", - "clock-sender", - "generic-site-token-sender", - "healthy-despool", - "healthy-rcmctrl", - "healthy-replmgr", - "healthy-sender", - "incomplete-replmgr", - "mismatch-despool", - "mismatch-sender", - "receiver-despool", - "receiver-sender", - "recovery-despool", - "recovery-sender", - "rotation-sender", - "sender-failure", -]; -const SYNTHETIC_HIERARCHY_PATH_FINGERPRINTS: &[&str] = &[ - "synthetic:absent-despool", - "synthetic:absent-sender", - "synthetic:backlog-replmgr", - "synthetic:clock-despool", - "synthetic:clock-sender", - "synthetic:generic-site-token-sender", - "synthetic:healthy-despool", - "synthetic:healthy-rcmctrl", - "synthetic:healthy-replmgr", - "synthetic:healthy-sender", - "synthetic:incomplete-replmgr", - "synthetic:mismatch-despool", - "synthetic:mismatch-sender", - "synthetic:receiver-despool", - "synthetic:receiver-sender", - "synthetic:recovery-despool", - "synthetic:recovery-sender", - "synthetic:rotation-current", - "synthetic:rotation-lo", - "synthetic:sender-failure-current", -]; - type PathFingerprintKey = ( String, Option, @@ -1099,17 +1031,15 @@ fn normalize_topology( manifest: &RawServerManifest, ) -> Result { let site_handle = if manifest.synthetic_fixture { - // Manifest v1 synthetic fixtures use a closed, committed topology vocabulary. - // Expanding it requires an explicit fixture/profile review, not a caller-chosen label. - if manifest.topology.site_code != "LAB" - || !matches!( - manifest.topology.capture_host.as_str(), - "LAB-CM01" | "LAB-MP01" - ) + if !synthetic_site_code(&manifest.topology.site_code) + || !synthetic_capture_host(&manifest.topology.capture_host) { return Err(SccmServerIntakeError::InvalidTopology); } - "synthetic:site:lab".to_owned() + format!( + "synthetic:site:{}", + manifest.topology.site_code.to_ascii_lowercase() + ) } else if opaque_sha256_handle(&manifest.topology.site_code, "cmtraceopen.site.sha256.v1:") { manifest.topology.site_code.clone() } else { @@ -1176,15 +1106,12 @@ fn normalize_hierarchy_link( return Err(SccmServerIntakeError::InvalidTopology); } let valid = if synthetic_fixture { - link.origin_site_code == "LAB" - && link.origin_host_handle == "synthetic:host:site-01" - && matches!( - ( - link.target_site_code.as_str(), - link.target_host_handle.as_str() - ), - ("CHD", "synthetic:host:site-02") | ("SEC", "synthetic:host:site-03") - ) + link.origin_site_code != link.target_site_code + && link.origin_host_handle != link.target_host_handle + && synthetic_site_code(&link.origin_site_code) + && synthetic_site_code(&link.target_site_code) + && synthetic_handle(&link.origin_host_handle, "host") + && synthetic_handle(&link.target_host_handle, "host") } else { link.origin_site_code != link.target_site_code && link.origin_host_handle != link.target_host_handle @@ -3006,17 +2933,7 @@ fn validate_declared_source_tuple( } else { artifact.rotation.kind == "providerDefined" } && artifact.rotation.value.is_none(); - if artifact.producer_host_handle.as_deref() != Some("synthetic:host:wsus-01") - || !matches!( - subject.instance_handle.as_deref(), - Some("synthetic:subject:sup-01" | "safe:sup:lab-sup-01") - ) - || source_version != Some("5.00.TEST") - || artifact.configured_path_provenance.path_fingerprint - != "synthetic:path:sup-wsus-health" - || !rotation_is_bounded - || artifact.rotation.lineage_id != "sup-wsus-health" - { + if source_version != Some("5.00.TEST") || !rotation_is_bounded { return Err(SccmServerIntakeError::InvalidArtifact); } } @@ -3117,138 +3034,16 @@ fn source_version_is_profile_eligible(value: &str, synthetic_fixture: bool) -> b fn safe_manifest_artifact_id(value: &str, synthetic_fixture: bool) -> bool { if synthetic_fixture { - // The top-level manifest version gate makes this the v1 synthetic-fixture vocabulary. - // These public identities must never become free-form based on the manifest flag alone. - return matches!( - value, - "a-mp-policy" - | "b-sitecomp" - | "dp-dist-current" - | "dp-distribution-absent-candidate" - | "dp-absent-01-distmgr" - | "dp-absent-02-provider" - | "dp-distribution-failure-01-distmgr" - | "dp-healthy-01-distmgr" - | "dp-healthy-02-pkgxfer" - | "dp-healthy-03-provider" - | "dp-incomplete-01-distmgr" - | "dp-incomplete-02-pkgxfer-denied" - | "dp-incomplete-03-provider-absent" - | "dp-malformed-01-provider" - | "dp-rotation-01-current-fragment" - | "dp-rotation-02-lo-fragment" - | "dp-rotation-03-malformed" - | "dp-serve-01-distmgr" - | "dp-serve-02-pkgxfer" - | "dp-serve-03-provider" - | "dp-serve-04-status" - | "dp-transfer-retry-01-distmgr" - | "dp-transfer-retry-02-pkgxfer" - | "dp-transfer-failure-01-distmgr" - | "dp-transfer-failure-02-pkgxfer" - | "dp-backlog-blocked-01-distmgr" - | "dp-backlog-blocked-02-pkgxfer" - | "dp-transfer-deferred-01-distmgr" - | "dp-transfer-deferred-02-pkgxfer" - | "dp-recovery-01-distmgr" - | "dp-recovery-02-pkgxfer" - | "dp-recovery-03-provider" - | "dp-validation-failure-01-distmgr" - | "dp-validation-failure-02-pkgxfer" - | "dp-validation-failure-03-provider" - | "dp-version-01-distmgr" - | "dp-version-02-pkgxfer" - | "dp-version-03-provider" - | "dp-version-04-provider-dp02" - | "dp-version-05-distmgr-dp02" - | "dp-version-06-pkgxfer-dp02" - | "mp-iis-skipped" - | "mp-policy-access-denied" - | "mp-policy-configured" - | "mp-policy-current" - | "mp-policy-lo" - | "mp-policy-multiline" - | "mp-policy-numbered-2" - | "mp-policy-root-a-current" - | "mp-policy-root-b-current" - | "mp-policy-ts-20260729-235700" - | "incomplete-01-wcm" - | "incomplete-02-wsync-denied" - | "incomplete-03-wsus-absent" - | "metadata-failure-01-wcm" - | "metadata-failure-02-wsync" - | "rotation-01-current" - | "rotation-02-lo" - | "rotation-03-malformed" - | "sitecomp-current" - | "sup-setup-failure-01-setup" - | "sup-sync-capped" - | "sup-sync-current" - | "sup-wsus-health-skipped" - | "supplemental-01-wcm" - | "supplemental-02-wsync" - | "supplemental-03-wsus" - | "supplemental-04-wsus-health" - | "sync-retry-01-wcm" - | "sync-retry-02-wsync" - | "sync-success-01-wcm" - | "sync-success-02-wsync" - | "sync-success-03-wsus" - | "admin-auth-current" - | "admin-backend-current" - | "admin-iis-current" - | "admin-success-current" - | "blocked-deferred-admin-current" - | "contradictory-provider-current" - | "coverage-admin-access-denied" - | "coverage-admin-parse-failed" - | "coverage-admin-skipped" - | "coverage-provider-absent" - | "coverage-provider-capped" - | "coverage-provider-unsupported" - | "iis-supplemental-current" - | "incomplete-admin-current" - | "privacy-admin-current" - | "privacy-provider-current" - | "provider-authz-current" - | "provider-query-current" - | "provider-retry-current" - | "provider-success-current" - | "provider-timeout-current" - | "unrelated-02-wcm" - | "unrelated-03-wsync" - | "unrelated-04-wsus" - | "wcm-failure-01-wcm" - | "wsus-failure-01-wcm" - | "wsus-failure-02-wsync" - | "wsus-failure-03-wsus" - | "z-site-status" - ) || SYNTHETIC_HIERARCHY_ARTIFACT_IDS.contains(&value); + return synthetic_slug(value); } opaque_sha256_handle(value, "cmtraceopen.artifact.sha256.v1:") } fn safe_source_id(value: &str, allow_unknown: bool, synthetic_fixture: bool) -> bool { - matches!( - value, - "server-sitecomp" - | "server-status" - | "server-mp-auth" - | "server-mp-policy" - | "server-mp-iis" - | "server-dp-distribution" - | "server-dp-serve" - | "server-hierarchy-control" - | "server-hierarchy-transfer" - | "server-hierarchy-site-database" - | "server-sup-sync" - | "server-sup-wsus" - | "server-provider" - | "server-admin-service" - | "server-admin-service-iis" - ) || (allow_unknown - && !synthetic_fixture - && opaque_sha256_handle(value, "cmtraceopen.source.sha256.v1:")) + is_declared_server_source_id(value) + || (allow_unknown + && !synthetic_fixture + && opaque_sha256_handle(value, "cmtraceopen.source.sha256.v1:")) } fn safe_source_kind(value: &str, allow_unknown: bool, synthetic_fixture: bool) -> bool { @@ -3270,128 +3065,14 @@ fn safe_public_basename(value: &str, synthetic_fixture: bool) -> bool { fn safe_lineage_id(value: &str, synthetic_fixture: bool) -> bool { if synthetic_fixture { - return matches!( - value, - "dp-dist-lab" - | "dp-distribution-default" - | "absent-distmgr" - | "absent-provider" - | "distribution-failure" - | "healthy-distmgr" - | "healthy-pkgxfer" - | "healthy-provider" - | "incomplete-distmgr" - | "incomplete-pkgxfer" - | "incomplete-provider" - | "malformed-provider" - | "retry-distmgr" - | "retry-pkgxfer" - | "transfer-failure-distmgr" - | "transfer-failure-pkgxfer" - | "backlog-blocked-distmgr" - | "backlog-blocked-pkgxfer" - | "transfer-deferred-distmgr" - | "transfer-deferred-pkgxfer" - | "recovery-distmgr" - | "recovery-pkgxfer" - | "recovery-provider" - | "rotation-distmgr" - | "rotation-provider" - | "serve-distmgr" - | "serve-pkgxfer" - | "serve-provider" - | "serve-status" - | "validation-distmgr" - | "validation-pkgxfer" - | "validation-provider" - | "version-distmgr" - | "version-pkgxfer" - | "version-provider" - | "version-provider-dp02" - | "version-distmgr-dp02" - | "version-pkgxfer-dp02" - | "mp-iis-supplement" - | "mp-policy-a" - | "mp-policy-access" - | "mp-policy-configured" - | "mp-policy-lab" - | "mp-policy-multiline" - | "mp-policy-root-a" - | "mp-policy-root-b" - | "mp-policy-rotation" - | "site-status-z" - | "sitecomp-a" - | "sitecomp-lab" - | "sup-sync-cap" - | "sup-sync-lab" - | "sup-wsus-health" - | "provider-primary" - | "admin-service-primary" - | "admin-service-iis" - ) || SYNTHETIC_HIERARCHY_LINEAGES.contains(&value); + return synthetic_slug(value); } opaque_sha256_handle(value, "cmtraceopen.lineage.sha256.v1:") } fn safe_path_fingerprint(value: &str, synthetic_fixture: bool) -> bool { if synthetic_fixture { - return matches!( - value, - "synthetic:path:a-mp" - | "synthetic:path:a-site" - | "synthetic:absent-distmgr" - | "synthetic:absent-provider" - | "synthetic:distribution-failure" - | "synthetic:healthy-distmgr" - | "synthetic:healthy-pkgxfer" - | "synthetic:healthy-provider" - | "synthetic:incomplete-distmgr" - | "synthetic:incomplete-pkgxfer" - | "synthetic:incomplete-provider" - | "synthetic:malformed-provider" - | "synthetic:retry-distmgr" - | "synthetic:retry-pkgxfer" - | "synthetic:transfer-failure-distmgr" - | "synthetic:transfer-failure-pkgxfer" - | "synthetic:backlog-blocked-distmgr" - | "synthetic:backlog-blocked-pkgxfer" - | "synthetic:transfer-deferred-distmgr" - | "synthetic:transfer-deferred-pkgxfer" - | "synthetic:recovery-distmgr" - | "synthetic:recovery-pkgxfer" - | "synthetic:recovery-provider" - | "synthetic:rotation-current" - | "synthetic:rotation-distmgr" - | "synthetic:rotation-lo" - | "synthetic:rotation-malformed" - | "synthetic:serve-distmgr" - | "synthetic:serve-pkgxfer" - | "synthetic:serve-provider" - | "synthetic:serve-status" - | "synthetic:validation-distmgr" - | "synthetic:validation-pkgxfer" - | "synthetic:validation-provider" - | "synthetic:version-distmgr" - | "synthetic:version-pkgxfer" - | "synthetic:version-provider" - | "synthetic:version-provider-dp02" - | "synthetic:version-distmgr-dp02" - | "synthetic:version-pkgxfer-dp02" - | "synthetic:path:dp-default" - | "synthetic:path:iis-not-requested" - | "synthetic:path:mp-configured-a" - | "synthetic:path:mp-default" - | "synthetic:path:mp-root-a" - | "synthetic:path:mp-root-b" - | "synthetic:path:site-default" - | "synthetic:path:site-dp-control" - | "synthetic:path:site-sup-control" - | "synthetic:path:sup-wsus-health" - | "synthetic:path:provider-primary" - | "synthetic:path:admin-service-primary" - | "synthetic:path:admin-service-iis" - | "synthetic:path:z-site" - ) || SYNTHETIC_HIERARCHY_PATH_FINGERPRINTS.contains(&value); + return synthetic_path_fingerprint(value); } opaque_sha256_handle(value, "cmtraceopen.path.sha256.v1:") } @@ -3513,35 +3194,79 @@ fn safe_optional_handle(value: Option<&str>, synthetic_fixture: bool, domain: &s return true; }; if synthetic_fixture { - return match domain { - "host" => matches!( - value, - "synthetic:host:mp-01" - | "synthetic:host:site-01" - | "synthetic:host:site-02" - | "synthetic:host:site-03" - | "synthetic:host:wsus-01" - | "synthetic:host:provider-01" - | "synthetic:host:provider-02" - | "synthetic:host:admin-service-01" - ), - "subject" => { - matches!( - value, - "synthetic:subject:dp-01" - | "synthetic:subject:dp-02" - | "synthetic:subject:sup-01" - | "safe:sup:lab-sup-01" - | "synthetic:subject:provider-01" - | "synthetic:subject:admin-service-01" - ) - } - _ => false, - }; + return synthetic_handle(value, domain) + || (domain == "subject" && safe_synthetic_handle(value)); } opaque_sha256_handle(value, &format!("cmtraceopen.{domain}.sha256.v1:")) } +fn synthetic_slug(value: &str) -> bool { + (3..=128).contains(&value.len()) + && value.contains('-') + && !value.starts_with('-') + && !value.ends_with('-') + && !value.contains("--") + && value + .bytes() + .all(|byte| byte.is_ascii_lowercase() || byte.is_ascii_digit() || byte == b'-') +} + +fn synthetic_numbered_slug(value: &str) -> bool { + let Some((_, ordinal)) = value.rsplit_once('-') else { + return false; + }; + synthetic_slug(value) && ordinal.len() == 2 && ordinal.bytes().all(|byte| byte.is_ascii_digit()) +} + +fn synthetic_handle(value: &str, domain: &str) -> bool { + value + .strip_prefix(&format!("synthetic:{domain}:")) + .is_some_and(synthetic_numbered_slug) +} + +fn safe_synthetic_handle(value: &str) -> bool { + let Some((domain, identifier)) = value + .strip_prefix("safe:") + .and_then(|value| value.split_once(':')) + else { + return false; + }; + (2..=16).contains(&domain.len()) + && domain.bytes().all(|byte| byte.is_ascii_lowercase()) + && synthetic_numbered_slug(identifier) +} + +fn synthetic_path_fingerprint(value: &str) -> bool { + let Some(value) = value.strip_prefix("synthetic:") else { + return false; + }; + match value.split_once(':') { + Some((scope, identifier)) => { + (1..=16).contains(&scope.len()) + && scope.bytes().all(|byte| byte.is_ascii_lowercase()) + && synthetic_slug(identifier) + } + None => synthetic_slug(value), + } +} + +fn synthetic_site_code(value: &str) -> bool { + value.len() == 3 && value.bytes().all(|byte| byte.is_ascii_uppercase()) +} + +fn synthetic_capture_host(value: &str) -> bool { + let Some((site, role_and_ordinal)) = value.split_once('-') else { + return false; + }; + if role_and_ordinal.len() < 3 { + return false; + } + let (role, ordinal) = role_and_ordinal.split_at(role_and_ordinal.len() - 2); + synthetic_site_code(site) + && matches!(role, "CM" | "MP" | "DP" | "SUP" | "PROVIDER" | "ADMIN") + && ordinal.bytes().all(|byte| byte.is_ascii_digit()) +} + fn opaque_sha256_digest<'a>(value: &'a str, prefix: &str) -> Option<&'a str> { value.strip_prefix(prefix).filter(|digest| { digest.len() == 64 diff --git a/crates/cmtraceopen-parser/tests/sccm_server_intake.rs b/crates/cmtraceopen-parser/tests/sccm_server_intake.rs index f2f2007bd..8b22d938d 100644 --- a/crates/cmtraceopen-parser/tests/sccm_server_intake.rs +++ b/crates/cmtraceopen-parser/tests/sccm_server_intake.rs @@ -915,6 +915,30 @@ fn server_intake_rejects_identity_bearing_public_inputs() { }); } +#[test] +fn server_intake_accepts_new_conforming_synthetic_identities() { + let (manifest_json, mut payloads) = load_bundle("complete-multi-role"); + let mut manifest = manifest_value(&manifest_json); + + manifest["topology"]["siteCode"] = Value::String("DEV".to_owned()); + manifest["topology"]["captureHost"] = Value::String("DEV-CM02".to_owned()); + + let artifact = &mut manifest["artifacts"][0]; + artifact["artifactId"] = Value::String("fixture-sitecomp-04".to_owned()); + artifact["producerHostHandle"] = Value::String("synthetic:host:site-04".to_owned()); + artifact["configuredPathProvenance"]["pathFingerprint"] = + Value::String("synthetic:path:fixture-root-04".to_owned()); + artifact["rotation"]["lineageId"] = Value::String("fixture-lineage-04".to_owned()); + manifest["artifacts"][2]["workflowSubject"]["instanceHandle"] = + Value::String("synthetic:subject:dp-04".to_owned()); + payloads[0].manifest_artifact_id = "fixture-sitecomp-04".to_owned(); + + assert!( + assess_server_intake(&serialize_manifest(&manifest), &payloads).is_ok(), + "a structurally synthetic identity must not require a production-source edit" + ); +} + #[test] fn server_intake_reserves_windows_equivalent_paths_and_fingerprints() { let (manifest_json, payloads) = load_bundle("collision-same-basename-configured-roots"); @@ -1729,8 +1753,13 @@ fn server_intake_admits_only_the_catalogued_optional_wsus_supplement_contract() .expect("requests") .is_empty()); + let mut manifest = manifest_value(&manifest_json); + manifest["artifacts"][0]["artifactId"] = Value::String("fixture-wsus-artifact-04".to_owned()); + let generic = assess_server_intake(&serialize_manifest(&manifest), &payloads) + .expect("a synthetic artifact ID is structural, not a catalog entry"); + assert_eq!(generic.artifacts[0].artifact_id, "fixture-wsus-artifact-04"); + for (field, replacement) in [ - ("artifactId", "free-form-wsus-artifact"), ("sourceId", "free-form-wsus-source"), ("sourceKind", "structuredSupplement"), ("originalBasename", "WSUSHealth.json"), @@ -1740,7 +1769,7 @@ fn server_intake_admits_only_the_catalogued_optional_wsus_supplement_contract() assert_eq!( assess_server_intake(&serialize_manifest(&manifest), &payloads), Err(SccmServerIntakeError::InvalidArtifact), - "{field} must remain in the frozen WSUS supplemental vocabulary" + "{field} must remain bound to the catalogued WSUS supplemental contract" ); } @@ -1783,7 +1812,7 @@ fn wsus_supplement_expected_coverage_uses_only_serialized_fields() { } #[test] -fn server_intake_rejects_wsus_supplement_cross_tuple_mutations() { +fn server_intake_rejects_wsus_supplement_malformed_provenance() { type ManifestMutation = (&'static str, fn(&mut Value)); let (manifest_json, payloads) = load_bundle("supplemental-wsus-skipped"); @@ -1801,13 +1830,13 @@ fn server_intake_rejects_wsus_supplement_cross_tuple_mutations() { manifest["artifacts"][0]["workflowSubject"]["role"] = Value::String("distributionPoint".to_owned()); }), - ("producer host rebound", |manifest| { + ("producer host malformed", |manifest| { manifest["artifacts"][0]["producerHostHandle"] = - Value::String("synthetic:host:mp-01".to_owned()); + Value::String("synthetic:host:wsus-x".to_owned()); }), - ("subject handle rebound", |manifest| { + ("subject handle malformed", |manifest| { manifest["artifacts"][0]["workflowSubject"]["instanceHandle"] = - Value::String("synthetic:subject:dp-01".to_owned()); + Value::String("synthetic:subject:sup-x".to_owned()); }), ("source version omitted", |manifest| { manifest["artifacts"][0] @@ -1815,13 +1844,12 @@ fn server_intake_rejects_wsus_supplement_cross_tuple_mutations() { .expect("artifact is an object") .remove("sourceVersion"); }), - ("path fingerprint substituted", |manifest| { + ("path fingerprint malformed", |manifest| { manifest["artifacts"][0]["configuredPathProvenance"]["pathFingerprint"] = - Value::String("synthetic:path:site-sup-control".to_owned()); + Value::String("synthetic:path:sup".to_owned()); }), - ("rotation lineage substituted", |manifest| { - manifest["artifacts"][0]["rotation"]["lineageId"] = - Value::String("sup-sync-lab".to_owned()); + ("rotation lineage malformed", |manifest| { + manifest["artifacts"][0]["rotation"]["lineageId"] = Value::String("sup".to_owned()); }), ]; @@ -1838,7 +1866,7 @@ fn server_intake_rejects_wsus_supplement_cross_tuple_mutations() { assert!( unexpected.is_empty(), - "WSUS supplemental tuple mutations must fail closed:\n{}", + "WSUS supplemental malformed provenance must fail closed:\n{}", unexpected.join("\n") ); } diff --git a/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md b/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md new file mode 100644 index 000000000..09191d1af --- /dev/null +++ b/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md @@ -0,0 +1,171 @@ +# SCCM #409 Server Intake Identity Grammar Implementation Plan + +> **For agentic workers:** REQUIRED SUB-SKILL: Use superpowers:subagent-driven-development (recommended) or superpowers:executing-plans to implement this plan task-by-task. Steps use checkbox (`- [ ]`) syntax for tracking. + +**Goal:** Remove fixture-specific server-intake identity allowlists while keeping synthetic and production manifests privacy-safe and fail-closed. + +**Architecture:** Keep declared source IDs owned by the server source catalog, rather than duplicating them in intake. Replace every synthetic fixture identity list in intake with small field-specific closed grammars: structural synthetic artifact/lineage/path tokens, synthetic host/subject handles, and SCCM-shaped synthetic topology. Production remains opaque-handle-only; malformed or identity-bearing strings remain rejected before public projection. + +**Tech Stack:** Rust, Serde, existing `cmtraceopen-parser` SCCM server catalog/intake modules, Cargo tests, Clippy, rustfmt. + +--- + +## File structure + +- `crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs` owns declared server source-ID membership. +- `crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs` owns generic synthetic/opaque identity validation and topology normalization. +- `crates/cmtraceopen-parser/tests/sccm_server_intake.rs` proves generic synthetic acceptance plus rejection of malformed and identity-bearing values. + +### Task 1: Prove generic synthetic identities and privacy rejection + +**Files:** +- Modify: `crates/cmtraceopen-parser/tests/sccm_server_intake.rs` + +- [ ] **Step 1: Add failing acceptance and rejection cases** + +Add one test that mutates a committed synthetic manifest with a new conforming artifact ID, lineage, path fingerprint, producer host, workflow subject, and SCCM-shaped topology; `assess_server_intake` must succeed. Add table-driven mutations that must return `InvalidTopology` or `InvalidArtifact`: bare/user-like identifiers, malformed token separators, non-three-character site code, topology host without a typed two-digit suffix, and malformed synthetic handles. + +```rust +assert!(assess_server_intake(&serialize_manifest(&manifest), &payloads).is_ok()); +assert_eq!( + assess_server_intake(&serialize_manifest(&malformed), &payloads), + Err(SccmServerIntakeError::InvalidArtifact) +); +``` + +- [ ] **Step 2: Run the red test** + +Run: `cargo test -p cmtraceopen-parser --test sccm_server_intake server_intake_accepts_new_conforming_synthetic_identities` + +Expected: FAIL while literal fixture allowlists reject the new conforming values. + +### Task 2: Make the catalog the sole owner of declared source IDs + +**Files:** +- Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs` +- Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs` +- Test: `crates/cmtraceopen-parser/tests/sccm_server_intake.rs` + +- [ ] **Step 1: Add catalog membership helper** + +Expose a crate-visible helper that recognizes a source ID in `SERVER_SOURCE_SPECS` or `SERVER_STRUCTURED_SUPPLEMENT_SPEC`; do not restate source strings in intake. + +```rust +pub(crate) fn is_declared_server_source_id(source_id: &str) -> bool { + SERVER_SOURCE_SPECS + .iter() + .chain(std::iter::once(&SERVER_STRUCTURED_SUPPLEMENT_SPEC)) + .any(|spec| spec.source_id == source_id) +} +``` + +- [ ] **Step 2: Replace the intake source literal match** + +Make `safe_source_id` call that helper for known IDs and preserve its current opaque-future allowance only for non-synthetic retained-unknown artifacts. + +```rust +is_declared_server_source_id(value) + || (allow_unknown + && !synthetic_fixture + && opaque_sha256_handle(value, "cmtraceopen.source.sha256.v1:")) +``` + +- [ ] **Step 3: Run the focused test** + +Run: `cargo test -p cmtraceopen-parser --test sccm_server_intake` + +Expected: PASS; catalogued sources, opaque future sources, and untrusted sources retain their existing outcomes. + +### Task 3: Replace synthetic fixture allowlists with closed grammars + +**Files:** +- Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs` +- Test: `crates/cmtraceopen-parser/tests/sccm_server_intake.rs` + +- [ ] **Step 1: Delete fixture-derived constants and literal matches** + +Remove `SYNTHETIC_HIERARCHY_*` constants and the literal sets in `safe_manifest_artifact_id`, `safe_lineage_id`, `safe_path_fingerprint`, `safe_optional_handle`, `normalize_topology`, and `normalize_hierarchy_link`. + +- [ ] **Step 2: Add bounded field grammars** + +Implement small ASCII validators with no fixture values: + +```rust +fn synthetic_slug(value: &str) -> bool { + (3..=128).contains(&value.len()) + && value.contains('-') + && !value.starts_with('-') + && !value.ends_with('-') + && !value.contains("--") + && value.bytes().all(|byte| { + byte.is_ascii_lowercase() || byte.is_ascii_digit() || byte == b'-' + }) +} + +fn synthetic_handle(value: &str, domain: &str) -> bool { + value + .strip_prefix(&format!("synthetic:{domain}:")) + .is_some_and(synthetic_numbered_slug) +} + +fn synthetic_site_code(value: &str) -> bool { + value.len() == 3 && value.bytes().all(|byte| byte.is_ascii_uppercase()) +} + +fn synthetic_capture_host(value: &str) -> bool { + let Some((site, role_and_ordinal)) = value.split_once('-') else { + return false; + }; + if role_and_ordinal.len() < 3 { + return false; + } + let (role, ordinal) = role_and_ordinal.split_at(role_and_ordinal.len() - 2); + synthetic_site_code(site) + && matches!(role, "CM" | "MP" | "DP" | "SUP" | "PROVIDER" | "ADMIN") + && ordinal.bytes().all(|byte| byte.is_ascii_digit()) +} +``` + +Use them for the identity-bearing fields and links. Keep `safe_original_path_marker`, opaque SHA-256 production handles, canonical role/source classification, payload binding, and path-collision checks unchanged. + +- [ ] **Step 3: Run focused tests** + +Run: `cargo test -p cmtraceopen-parser --test sccm_server_intake` + +Expected: PASS, including accepted generic synthetic values and rejected privacy/malformed mutations. + +### Task 4: Freeze the regression boundary + +**Files:** +- Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs` +- Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs` +- Modify: `crates/cmtraceopen-parser/tests/sccm_server_intake.rs` +- Modify: `docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md` +- Modify: `library.md` + +- [ ] **Step 1: Format and run targeted verification** + +Run: + +```bash +rustfmt --check crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs crates/cmtraceopen-parser/tests/sccm_server_intake.rs +cargo test -p cmtraceopen-parser --test sccm_server_intake +cargo test -p cmtraceopen-parser +cargo clippy -p cmtraceopen-parser --all-targets -- -D warnings +git diff --check origin/main...HEAD +``` + +Expected: every command exits zero. + +- [ ] **Step 2: Commit the isolated change** + +```bash +git add library.md docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs crates/cmtraceopen-parser/tests/sccm_server_intake.rs +git commit -m "fix(sccm): remove fixture identity allowlists from intake" +``` + +## Self-review + +- Spec coverage: catalog source IDs, synthetic topology/artifact/lineage/path/handles, production opaque identities, and malformed/identity-bearing rejection each have a task and test. +- Placeholder scan: no deferred behavior or compatibility path is proposed. +- Type consistency: the catalog helper returns a boolean source-membership answer; intake remains the only identity validator and public schema is unchanged. diff --git a/library.md b/library.md index 0c3003c8b..e7d9ced4b 100644 --- a/library.md +++ b/library.md @@ -1,5 +1,6 @@ # CMTrace Open — Workspace Library +- IF implementing or reviewing SCCM issue #409 server intake synthetic identity grammar → read [[docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md]] - IF implementing or reviewing SCCM issue #321 client policy production analysis → read [[docs/superpowers/plans/2026-08-04-sccm-321-policy-production.md]] - IF implementing or reviewing SCCM issue #333 client/server production correlation → read [[docs/superpowers/plans/2026-08-04-sccm-333-production-correlation.md]] - IF reviewing SCCM issue #333 executable correlation fixture oracles → read [[crates/cmtraceopen-parser/tests/fixtures/sccm/correlation/README.md]] From 0621aee2b50559b3fb319f1a90d7befa2e939da6 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 5 Aug 2026 05:21:33 -0400 Subject: [PATCH 2/3] fix(sccm): harden synthetic identity grammar --- .../src/sccm/server/windows/intake.rs | 98 +++---- .../server/intake/absent-dp/manifest.json | 4 +- .../intake/access-denied-mp/manifest.json | 4 +- .../server/intake/capped-sup/expected.json | 2 +- .../server/intake/capped-sup/manifest.json | 4 +- .../expected.json | 6 +- .../manifest.json | 6 +- .../intake/complete-multi-role/expected.json | 10 +- .../intake/complete-multi-role/manifest.json | 10 +- .../configured-nondefault-path/expected.json | 6 +- .../configured-nondefault-path/manifest.json | 4 +- .../server/intake/multiline/expected.json | 4 +- .../server/intake/multiline/manifest.json | 4 +- .../server/intake/rotations/expected.json | 12 +- .../server/intake/rotations/manifest.json | 10 +- .../server/intake/skipped-iis/manifest.json | 4 +- .../supplemental-wsus-skipped/manifest.json | 14 +- .../intake/unsorted-manifest/expected.json | 8 +- .../intake/unsorted-manifest/manifest.json | 8 +- .../tests/sccm_server_intake.rs | 246 +++++++++++++----- ...sccm-409-server-intake-identity-grammar.md | 63 ++--- 21 files changed, 303 insertions(+), 224 deletions(-) diff --git a/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs b/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs index 278bb1eff..ce2039afc 100644 --- a/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs +++ b/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs @@ -1032,7 +1032,10 @@ fn normalize_topology( ) -> Result { let site_handle = if manifest.synthetic_fixture { if !synthetic_site_code(&manifest.topology.site_code) - || !synthetic_capture_host(&manifest.topology.capture_host) + || !synthetic_capture_host( + &manifest.topology.capture_host, + &manifest.topology.site_code, + ) { return Err(SccmServerIntakeError::InvalidTopology); } @@ -1110,8 +1113,8 @@ fn normalize_hierarchy_link( && link.origin_host_handle != link.target_host_handle && synthetic_site_code(&link.origin_site_code) && synthetic_site_code(&link.target_site_code) - && synthetic_handle(&link.origin_host_handle, "host") - && synthetic_handle(&link.target_host_handle, "host") + && synthetic_identity(&link.origin_host_handle, "host") + && synthetic_identity(&link.target_host_handle, "host") } else { link.origin_site_code != link.target_site_code && link.origin_host_handle != link.target_host_handle @@ -3034,7 +3037,7 @@ fn source_version_is_profile_eligible(value: &str, synthetic_fixture: bool) -> b fn safe_manifest_artifact_id(value: &str, synthetic_fixture: bool) -> bool { if synthetic_fixture { - return synthetic_slug(value); + return synthetic_identity(value, "artifact"); } opaque_sha256_handle(value, "cmtraceopen.artifact.sha256.v1:") } @@ -3065,14 +3068,14 @@ fn safe_public_basename(value: &str, synthetic_fixture: bool) -> bool { fn safe_lineage_id(value: &str, synthetic_fixture: bool) -> bool { if synthetic_fixture { - return synthetic_slug(value); + return synthetic_identity(value, "lineage"); } opaque_sha256_handle(value, "cmtraceopen.lineage.sha256.v1:") } fn safe_path_fingerprint(value: &str, synthetic_fixture: bool) -> bool { if synthetic_fixture { - return synthetic_path_fingerprint(value); + return synthetic_identity(value, "path"); } opaque_sha256_handle(value, "cmtraceopen.path.sha256.v1:") } @@ -3194,77 +3197,46 @@ fn safe_optional_handle(value: Option<&str>, synthetic_fixture: bool, domain: &s return true; }; if synthetic_fixture { - return synthetic_handle(value, domain) - || (domain == "subject" && safe_synthetic_handle(value)); + return synthetic_identity(value, domain); } opaque_sha256_handle(value, &format!("cmtraceopen.{domain}.sha256.v1:")) } -fn synthetic_slug(value: &str) -> bool { - (3..=128).contains(&value.len()) - && value.contains('-') - && !value.starts_with('-') - && !value.ends_with('-') - && !value.contains("--") - && value - .bytes() - .all(|byte| byte.is_ascii_lowercase() || byte.is_ascii_digit() || byte == b'-') -} - -fn synthetic_numbered_slug(value: &str) -> bool { - let Some((_, ordinal)) = value.rsplit_once('-') else { - return false; - }; - synthetic_slug(value) && ordinal.len() == 2 && ordinal.bytes().all(|byte| byte.is_ascii_digit()) -} - -fn synthetic_handle(value: &str, domain: &str) -> bool { - value - .strip_prefix(&format!("synthetic:{domain}:")) - .is_some_and(synthetic_numbered_slug) -} - -fn safe_synthetic_handle(value: &str) -> bool { - let Some((domain, identifier)) = value - .strip_prefix("safe:") - .and_then(|value| value.split_once(':')) +fn synthetic_identity(value: &str, domain: &str) -> bool { + let Some((actual_domain, digest)) = value + .strip_prefix("synthetic:") + .and_then(|value| value.split_once(":sha256.v1:")) else { return false; }; - (2..=16).contains(&domain.len()) - && domain.bytes().all(|byte| byte.is_ascii_lowercase()) - && synthetic_numbered_slug(identifier) -} - -fn synthetic_path_fingerprint(value: &str) -> bool { - let Some(value) = value.strip_prefix("synthetic:") else { - return false; - }; - match value.split_once(':') { - Some((scope, identifier)) => { - (1..=16).contains(&scope.len()) - && scope.bytes().all(|byte| byte.is_ascii_lowercase()) - && synthetic_slug(identifier) - } - None => synthetic_slug(value), - } + actual_domain == domain + && digest.len() == 64 + && digest + .bytes() + .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte)) } fn synthetic_site_code(value: &str) -> bool { - value.len() == 3 && value.bytes().all(|byte| byte.is_ascii_uppercase()) + matches!(value.as_bytes(), [b'S', first, second] if first.is_ascii_digit() && second.is_ascii_digit()) } -fn synthetic_capture_host(value: &str) -> bool { - let Some((site, role_and_ordinal)) = value.split_once('-') else { - return false; - }; - if role_and_ordinal.len() < 3 { +fn synthetic_capture_host(value: &str, site_code: &str) -> bool { + if !value.is_ascii() { return false; } - let (role, ordinal) = role_and_ordinal.split_at(role_and_ordinal.len() - 2); - synthetic_site_code(site) - && matches!(role, "CM" | "MP" | "DP" | "SUP" | "PROVIDER" | "ADMIN") - && ordinal.bytes().all(|byte| byte.is_ascii_digit()) + let Some(role_and_ordinal) = value + .strip_prefix(site_code) + .and_then(|value| value.strip_prefix('-')) + else { + return false; + }; + ["CM", "MP", "DP", "SUP", "PROVIDER", "ADMIN"] + .iter() + .any(|role| { + role_and_ordinal.strip_prefix(role).is_some_and(|ordinal| { + ordinal.len() == 2 && ordinal.bytes().all(|byte| byte.is_ascii_digit()) + }) + }) } fn opaque_sha256_digest<'a>(value: &'a str, prefix: &str) -> Option<&'a str> { diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/absent-dp/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/absent-dp/manifest.json index 17e21458b..672d494d8 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/absent-dp/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/absent-dp/manifest.json @@ -4,8 +4,8 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "LAB-CM01", "siteCode": "LAB", "rolesObserved": ["siteServer"] }, + "topology": { "captureHost": "S01-CM01", "siteCode": "S01", "rolesObserved": ["siteServer"] }, "artifacts": [ - { "artifactId": "dp-distribution-absent-candidate", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:site-01", "workflowSubject": { "role": "distributionPoint", "basis": "incidentScopeOnly" }, "sourceId": "server-dp-distribution", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_DEFAULT_DP_CANDIDATE", "originalBasename": "distmgr.log", "configuredPathProvenance": { "state": "defaultCandidate", "pathFingerprint": "synthetic:path:dp-default" }, "rotation": { "kind": "current", "lineageId": "dp-distribution-default" }, "captureState": "absent", "collectedUtc": "2026-07-30T00:04:00Z", "relativePath": null, "bytesCopied": 0 } + { "artifactId": "synthetic:artifact:sha256.v1:08b572c79ca8a7c3f5d9ac3d1f5900ee21e8dc14f9431acbee243d579a4880f5", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "workflowSubject": { "role": "distributionPoint", "basis": "incidentScopeOnly" }, "sourceId": "server-dp-distribution", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_DEFAULT_DP_CANDIDATE", "originalBasename": "distmgr.log", "configuredPathProvenance": { "state": "defaultCandidate", "pathFingerprint": "synthetic:path:sha256.v1:6f8fc72bb6fbe681ce9594ed6727eb5dc54bd53be5e174429c502466459464e3" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:ce486242d5484616648fb9a33cf16549e2146ed970978aca1c798c29daa1e35f" }, "captureState": "absent", "collectedUtc": "2026-07-30T00:04:00Z", "relativePath": null, "bytesCopied": 0 } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/access-denied-mp/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/access-denied-mp/manifest.json index cb93c009e..46e8bfbe8 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/access-denied-mp/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/access-denied-mp/manifest.json @@ -4,8 +4,8 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, "artifacts": [ - { "artifactId": "mp-policy-access-denied", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:mp-default" }, "rotation": { "kind": "current", "lineageId": "mp-policy-access" }, "captureState": "accessDenied", "collectionDetail": "synthetic permission denial", "collectedUtc": "2026-07-30T00:05:00Z", "relativePath": null, "bytesCopied": 0 } + { "artifactId": "synthetic:artifact:sha256.v1:f4115e29df70bab46be15daf2625ad0528a72564a3d8edfd530d76f0d914bfa0", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:66fc48770e32c403a5c6db66e23c9272b9d66e5713c25f83b6feca09bb80769f" }, "captureState": "accessDenied", "collectionDetail": "synthetic permission denial", "collectedUtc": "2026-07-30T00:05:00Z", "relativePath": null, "bytesCopied": 0 } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/expected.json index 06b6b9ed0..162132694 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/expected.json @@ -1,7 +1,7 @@ { "pre318ExpectedVersion": 1, "coverage": [{ "producerRole": "siteServer", "workflowSubjectRole": "softwareUpdatePoint", "sourceId": "server-sup-sync", "state": "capped", "truncated": true }], - "artifactProvenance": [{ "artifactId": "sup-sync-capped", "encoding": "utf-8", "byteLimit": 64, "limitApplied": true, "bytesCopied": 64, "fragmentComplete": false, "relativePath": "evidence/sccm/server/site-server/server-sup-sync/subject-software-update-point/instance-17eae15500d8968f/root-b11afca548220198/current/wsyncmgr.log", "sha256": "49e36353149bd66ac7a2946050836e00828de5cc47081a508888a5cea786cd16" }], + "artifactProvenance": [{ "artifactId": "synthetic:artifact:sha256.v1:8ffd2bfbfcd641204b0108f4d880ef9aae8472e9cde9abc4da5207791e09f47a", "encoding": "utf-8", "byteLimit": 64, "limitApplied": true, "bytesCopied": 64, "fragmentComplete": false, "relativePath": "evidence/sccm/server/site-server/server-sup-sync/subject-software-update-point/instance-17eae15500d8968f/root-b11afca548220198/current/wsyncmgr.log", "sha256": "49e36353149bd66ac7a2946050836e00828de5cc47081a508888a5cea786cd16" }], "rawByteCountedBeforeDecoding": true, "completeCcmRecordCount": 0, "logicalRecordParseable": false, diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/manifest.json index 300ba634f..186b157b4 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/manifest.json @@ -4,8 +4,8 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "LAB-CM01", "siteCode": "LAB", "rolesObserved": ["siteServer"] }, + "topology": { "captureHost": "S01-CM01", "siteCode": "S01", "rolesObserved": ["siteServer"] }, "artifacts": [ - { "artifactId": "sup-sync-capped", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:site-01", "workflowSubject": { "role": "softwareUpdatePoint", "instanceHandle": "synthetic:subject:sup-01" }, "sourceId": "server-sup-sync", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_SUP_CONTROL_ROOT", "originalBasename": "wsyncmgr.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:site-sup-control" }, "rotation": { "kind": "current", "lineageId": "sup-sync-cap" }, "captureState": "capped", "encoding": "utf-8", "collectionLimit": { "byteLimit": 64, "limitApplied": true }, "bytesCopied": 64, "truncated": true, "fragmentComplete": false, "collectedUtc": "2026-07-30T00:06:00Z", "relativePath": "evidence/sccm/server/site-server/server-sup-sync/subject-software-update-point/instance-17eae15500d8968f/root-b11afca548220198/current/wsyncmgr.log" } + { "artifactId": "synthetic:artifact:sha256.v1:8ffd2bfbfcd641204b0108f4d880ef9aae8472e9cde9abc4da5207791e09f47a", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "workflowSubject": { "role": "softwareUpdatePoint", "instanceHandle": "synthetic:subject:sha256.v1:ca790a8bf688c51101b35dc762ac94f7dd1a576bda7a1d85773a52e546004722" }, "sourceId": "server-sup-sync", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_SUP_CONTROL_ROOT", "originalBasename": "wsyncmgr.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:a191b8c7a7e93b6e3a4ce54076ff13237f987fc0805192c4bcfe3263e0824f11" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:f85299e714aa2d18654c5e38d20430329daaeed476b2ff028c6258f494283baf" }, "captureState": "capped", "encoding": "utf-8", "collectionLimit": { "byteLimit": 64, "limitApplied": true }, "bytesCopied": 64, "truncated": true, "fragmentComplete": false, "collectedUtc": "2026-07-30T00:06:00Z", "relativePath": "evidence/sccm/server/site-server/server-sup-sync/subject-software-update-point/instance-17eae15500d8968f/root-b11afca548220198/current/wsyncmgr.log" } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/expected.json index 6043945d3..453936bc0 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/expected.json @@ -1,6 +1,6 @@ { "pre318ExpectedVersion": 1, - "canonicalArtifactIds": ["mp-policy-root-a-current", "mp-policy-root-b-current"], + "canonicalArtifactIds": ["synthetic:artifact:sha256.v1:721420190054ad85f091f558f77cd4e6e54b50da9426b7d979f7edcda7970b78", "synthetic:artifact:sha256.v1:b117cc48fba84a0cef85a662fdba0009e1d2723edc6b51af457d829cfa09e7c8"], "coverage": [{ "producerRole": "managementPoint", "sourceId": "server-mp-policy", "state": "captured", "configuredRootInstances": 2 }], "collisionAssertions": { "sameBasename": "MP_GetPolicy.log", @@ -11,7 +11,7 @@ "exactReferencesResolve": true }, "artifactProvenance": [ - { "artifactId": "mp-policy-root-a-current", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 173, "relativePath": "evidence/sccm/server/management-point/server-mp-policy/root-7d4a9c2e/current/MP_GetPolicy.log", "sha256": "021ea9b3a82c25f42095ee2fe460ed25718193b3798f624041a0621a62ed6cd0" }, - { "artifactId": "mp-policy-root-b-current", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 172, "relativePath": "evidence/sccm/server/management-point/server-mp-policy/root-b83f10d6/current/MP_GetPolicy.log", "sha256": "b95b8b26b4d87f9a6a9b708a8290a4ac9bb30b9c95849e20d6b434d14d91f909" } + { "artifactId": "synthetic:artifact:sha256.v1:721420190054ad85f091f558f77cd4e6e54b50da9426b7d979f7edcda7970b78", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 173, "relativePath": "evidence/sccm/server/management-point/server-mp-policy/root-7d4a9c2e/current/MP_GetPolicy.log", "sha256": "021ea9b3a82c25f42095ee2fe460ed25718193b3798f624041a0621a62ed6cd0" }, + { "artifactId": "synthetic:artifact:sha256.v1:b117cc48fba84a0cef85a662fdba0009e1d2723edc6b51af457d829cfa09e7c8", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 172, "relativePath": "evidence/sccm/server/management-point/server-mp-policy/root-b83f10d6/current/MP_GetPolicy.log", "sha256": "b95b8b26b4d87f9a6a9b708a8290a4ac9bb30b9c95849e20d6b434d14d91f909" } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/manifest.json index 32d856c01..8eb0ee89e 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/manifest.json @@ -4,9 +4,9 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, "artifacts": [ - { "artifactId": "mp-policy-root-a-current", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_CONFIGURED_MP_ROOT_A", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:mp-root-a" }, "rotation": { "kind": "current", "lineageId": "mp-policy-root-a" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:10:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/root-7d4a9c2e/current/MP_GetPolicy.log", "bytesCopied": 173 }, - { "artifactId": "mp-policy-root-b-current", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_CONFIGURED_MP_ROOT_B", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:mp-root-b" }, "rotation": { "kind": "current", "lineageId": "mp-policy-root-b" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:10:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/root-b83f10d6/current/MP_GetPolicy.log", "bytesCopied": 172 } + { "artifactId": "synthetic:artifact:sha256.v1:721420190054ad85f091f558f77cd4e6e54b50da9426b7d979f7edcda7970b78", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_CONFIGURED_MP_ROOT_A", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:sha256.v1:726b792daf9cacdbe3cfb1db5040be98abff98294f960ca41dd151c1ed8c0e38" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:0a1ecb81641046880800d633ac232e5ff06ae8c60a0b2ee23914d6302801f00d" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:10:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/root-7d4a9c2e/current/MP_GetPolicy.log", "bytesCopied": 173 }, + { "artifactId": "synthetic:artifact:sha256.v1:b117cc48fba84a0cef85a662fdba0009e1d2723edc6b51af457d829cfa09e7c8", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_CONFIGURED_MP_ROOT_B", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:sha256.v1:d35f1ee4d93ebae4a64a7ab9d7ef886a28f7cb01aca87ba52c9b3f9e2b2492cc" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:4b296015c846c68e4025a09a4d58eecf7668a68aa45e15d0b82b3b327e182ddc" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:10:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/root-b83f10d6/current/MP_GetPolicy.log", "bytesCopied": 172 } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/expected.json index b8cc218dd..f7fb53c2c 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/expected.json @@ -1,7 +1,7 @@ { "pre318ExpectedVersion": 1, "privacy": "synthetic", - "canonicalArtifactIds": ["mp-policy-current", "dp-dist-current", "sitecomp-current", "sup-sync-current"], + "canonicalArtifactIds": ["synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53", "synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6", "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", "synthetic:artifact:sha256.v1:3eab84121ff2ad1e7b4cb559bad24f451ab7c26fc4db657fadd3bc190f945e9d"], "coverage": [ { "producerRole": "managementPoint", "sourceId": "server-mp-policy", "state": "captured" }, { "producerRole": "siteServer", "workflowSubjectRole": "distributionPoint", "sourceId": "server-dp-distribution", "state": "captured" }, @@ -9,10 +9,10 @@ { "producerRole": "siteServer", "workflowSubjectRole": "softwareUpdatePoint", "sourceId": "server-sup-sync", "state": "captured" } ], "artifactProvenance": [ - { "artifactId": "mp-policy-current", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }, - { "artifactId": "dp-dist-current", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }, - { "artifactId": "sitecomp-current", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }, - { "artifactId": "sup-sync-current", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false } + { "artifactId": "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }, + { "artifactId": "synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }, + { "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }, + { "artifactId": "synthetic:artifact:sha256.v1:3eab84121ff2ad1e7b4cb559bad24f451ab7c26fc4db657fadd3bc190f945e9d", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false } ], "roleHealthFinding": "none" } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/manifest.json index 515dd4a60..c32fa71d7 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/manifest.json @@ -4,11 +4,11 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "LAB-CM01", "siteCode": "LAB", "rolesObserved": ["siteServer", "managementPoint", "distributionPoint", "softwareUpdatePoint"] }, + "topology": { "captureHost": "S01-CM01", "siteCode": "S01", "rolesObserved": ["siteServer", "managementPoint", "distributionPoint", "softwareUpdatePoint"] }, "artifacts": [ - { "artifactId": "sitecomp-current", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:site-01", "sourceId": "server-sitecomp", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_ROOT", "originalBasename": "sitecomp.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:site-default" }, "rotation": { "kind": "current", "lineageId": "sitecomp-lab" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:00:00Z", "relativePath": "evidence/sccm/server/site-server/server-sitecomp/current/sitecomp.log", "bytesCopied": 171 }, - { "artifactId": "mp-policy-current", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:mp-default" }, "rotation": { "kind": "current", "lineageId": "mp-policy-lab" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:00:01Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 184 }, - { "artifactId": "dp-dist-current", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:site-01", "workflowSubject": { "role": "distributionPoint", "instanceHandle": "synthetic:subject:dp-01" }, "sourceId": "server-dp-distribution", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_DP_CONTROL_ROOT", "originalBasename": "distmgr.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:site-dp-control" }, "rotation": { "kind": "current", "lineageId": "dp-dist-lab" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:00:02Z", "relativePath": "evidence/sccm/server/site-server/server-dp-distribution/subject-distribution-point/current/distmgr.log", "bytesCopied": 174 }, - { "artifactId": "sup-sync-current", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:site-01", "workflowSubject": { "role": "softwareUpdatePoint", "instanceHandle": "synthetic:subject:sup-01" }, "sourceId": "server-sup-sync", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_SUP_CONTROL_ROOT", "originalBasename": "wsyncmgr.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:site-sup-control" }, "rotation": { "kind": "current", "lineageId": "sup-sync-lab" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:00:03Z", "relativePath": "evidence/sccm/server/site-server/server-sup-sync/subject-software-update-point/current/wsyncmgr.log", "bytesCopied": 178 } + { "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "sourceId": "server-sitecomp", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_ROOT", "originalBasename": "sitecomp.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:f0ee78d9745f476478f0b8093f9b7b93f7cf66b8b7e6247e089f070c24a98dcb" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:1cb1ba23d64805a34ef23b7b4561a7e7a60e74aed85185b4e2b8851a412e4d34" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:00:00Z", "relativePath": "evidence/sccm/server/site-server/server-sitecomp/current/sitecomp.log", "bytesCopied": 171 }, + { "artifactId": "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:646b39fe2060806801722b0582f7c89ce9162199bce33a22dd8b28768a4b9206" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:00:01Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 184 }, + { "artifactId": "synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "workflowSubject": { "role": "distributionPoint", "instanceHandle": "synthetic:subject:sha256.v1:303b321cad551bed85d9b6d366165e1cb287c824090779eadea5673cbeeacf33" }, "sourceId": "server-dp-distribution", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_DP_CONTROL_ROOT", "originalBasename": "distmgr.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:f4c2118ebe9befe586df654d4a3d2e32ffbbcbb174dd1b1b00155eee4937c4c0" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:8717cd88e50756e8c7c3bd8b7fb244f69f8998861e9eaeae8b7261736941b19c" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:00:02Z", "relativePath": "evidence/sccm/server/site-server/server-dp-distribution/subject-distribution-point/current/distmgr.log", "bytesCopied": 174 }, + { "artifactId": "synthetic:artifact:sha256.v1:3eab84121ff2ad1e7b4cb559bad24f451ab7c26fc4db657fadd3bc190f945e9d", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "workflowSubject": { "role": "softwareUpdatePoint", "instanceHandle": "synthetic:subject:sha256.v1:ca790a8bf688c51101b35dc762ac94f7dd1a576bda7a1d85773a52e546004722" }, "sourceId": "server-sup-sync", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_SUP_CONTROL_ROOT", "originalBasename": "wsyncmgr.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:a191b8c7a7e93b6e3a4ce54076ff13237f987fc0805192c4bcfe3263e0824f11" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:6b46eccbe6ae613242bed25c90a75e27a219fcb38f72d84542d5e7b903f3d3f9" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:00:03Z", "relativePath": "evidence/sccm/server/site-server/server-sup-sync/subject-software-update-point/current/wsyncmgr.log", "bytesCopied": 178 } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/expected.json index 55bd2c0bb..5a08ecd16 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/expected.json @@ -1,9 +1,9 @@ { "pre318ExpectedVersion": 1, - "artifactId": "mp-policy-configured", - "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:mp-configured-a" }, + "artifactId": "synthetic:artifact:sha256.v1:a77e71c0b196187e25d552021e469b7441592a61640ee134aa45b3fc106860d0", + "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:sha256.v1:b75a3632071cb269affe517c8d05f7a71fbe0d7e691ef489f4bb77717c6a6d32" }, "defaultCandidateInterpretation": "candidateAbsentOnly", "coverage": [{ "producerRole": "managementPoint", "sourceId": "server-mp-policy", "state": "captured" }], - "artifactProvenance": [{ "artifactId": "mp-policy-configured", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }], + "artifactProvenance": [{ "artifactId": "synthetic:artifact:sha256.v1:a77e71c0b196187e25d552021e469b7441592a61640ee134aa45b3fc106860d0", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }], "roleInference": "managementPoint is observed from topology, not from default path" } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/manifest.json index 3986a09b4..052b77515 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/manifest.json @@ -4,8 +4,8 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, "artifacts": [ - { "artifactId": "mp-policy-configured", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_CONFIGURED_NONDEFAULT_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:mp-configured-a" }, "defaultCandidateState": "absentCandidateOnly", "rotation": { "kind": "current", "lineageId": "mp-policy-configured" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:01:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 183 } + { "artifactId": "synthetic:artifact:sha256.v1:a77e71c0b196187e25d552021e469b7441592a61640ee134aa45b3fc106860d0", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_CONFIGURED_NONDEFAULT_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:sha256.v1:b75a3632071cb269affe517c8d05f7a71fbe0d7e691ef489f4bb77717c6a6d32" }, "defaultCandidateState": "absentCandidateOnly", "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:878487409fe658c72ede1deef1f02bc1fd414ff73035bfd54bd6dcb968cf18f5" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:01:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 183 } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/expected.json index e4e75e818..dc463044b 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/expected.json @@ -1,7 +1,7 @@ { "pre318ExpectedVersion": 1, - "evidence": [{ "artifactId": "mp-policy-multiline", "lineRange": { "start": 1, "end": 2 }, "logicalRecordCount": 1 }], + "evidence": [{ "artifactId": "synthetic:artifact:sha256.v1:fab8972d821bbc3016ad15e49e13aeaf0559c7ef385bda8bc2b1158f085fb338", "lineRange": { "start": 1, "end": 2 }, "logicalRecordCount": 1 }], "coverage": [{ "producerRole": "managementPoint", "sourceId": "server-mp-policy", "state": "captured" }], - "artifactProvenance": [{ "artifactId": "mp-policy-multiline", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 207 }], + "artifactProvenance": [{ "artifactId": "synthetic:artifact:sha256.v1:fab8972d821bbc3016ad15e49e13aeaf0559c7ef385bda8bc2b1158f085fb338", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 207 }], "partialPhysicalFragmentCreatesTerminalResult": false } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/manifest.json index 64b91d9bb..8cb163a6c 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/manifest.json @@ -4,8 +4,8 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, "artifacts": [ - { "artifactId": "mp-policy-multiline", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:mp-default" }, "rotation": { "kind": "current", "lineageId": "mp-policy-multiline" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:03:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 207 } + { "artifactId": "synthetic:artifact:sha256.v1:fab8972d821bbc3016ad15e49e13aeaf0559c7ef385bda8bc2b1158f085fb338", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:cd39f6fa5ab52f618332a652c0e0360161e51284b6475b507bc7f078ff5ac7b9" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:03:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 207 } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/expected.json index 5aec5351d..6a95e2a09 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/expected.json @@ -1,16 +1,16 @@ { "pre318ExpectedVersion": 1, - "lineageId": "mp-policy-rotation", - "canonicalRotationArtifactIds": ["mp-policy-ts-20260729-235700", "mp-policy-numbered-2", "mp-policy-lo", "mp-policy-current"], + "lineageId": "synthetic:lineage:sha256.v1:23bf9e874701c542bf0fe2e3fcdf5f3438a5a92ecf4bb76d8d274802e8ea8019", + "canonicalRotationArtifactIds": ["synthetic:artifact:sha256.v1:ea4afe186fc87642f4641b3f207dd2b56a5275d38d418ef0a8363c5dfa2a7fb5", "synthetic:artifact:sha256.v1:0ccdeaa6040b48f044e18ccb64d0b9192440d4837de83b31efea34f9a782cab7", "synthetic:artifact:sha256.v1:10e37cba0f125b6bd5b5e84cae6cb52e70c5921eb4cfc5a414bbfd2bc39ae10e", "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53"], "totalRotationSort": true, "serializationOrderIsChronology": false, "uniqueRelativePaths": true, "collisionSafe": true, "coverage": [{ "producerRole": "managementPoint", "sourceId": "server-mp-policy", "state": "captured" }], "artifactProvenance": [ - { "artifactId": "mp-policy-ts-20260729-235700", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 182 }, - { "artifactId": "mp-policy-numbered-2", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 179 }, - { "artifactId": "mp-policy-lo", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 177 }, - { "artifactId": "mp-policy-current", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 178 } + { "artifactId": "synthetic:artifact:sha256.v1:ea4afe186fc87642f4641b3f207dd2b56a5275d38d418ef0a8363c5dfa2a7fb5", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 182 }, + { "artifactId": "synthetic:artifact:sha256.v1:0ccdeaa6040b48f044e18ccb64d0b9192440d4837de83b31efea34f9a782cab7", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 179 }, + { "artifactId": "synthetic:artifact:sha256.v1:10e37cba0f125b6bd5b5e84cae6cb52e70c5921eb4cfc5a414bbfd2bc39ae10e", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 177 }, + { "artifactId": "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false, "bytesCopied": 178 } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/manifest.json index 48051361c..0c1b54c5f 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/manifest.json @@ -4,11 +4,11 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, "artifacts": [ - { "artifactId": "mp-policy-ts-20260729-235700", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log.20260729-235700", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:mp-default" }, "rotation": { "kind": "timestamped", "value": "20260729-235700", "lineageId": "mp-policy-rotation" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:02:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/timestamped-20260729-235700/MP_GetPolicy.log.20260729-235700", "bytesCopied": 182 }, - { "artifactId": "mp-policy-current", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:mp-default" }, "rotation": { "kind": "current", "lineageId": "mp-policy-rotation" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:02:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 178 }, - { "artifactId": "mp-policy-lo", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.lo_", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:mp-default" }, "rotation": { "kind": "lo_", "lineageId": "mp-policy-rotation" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:02:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/lo_/MP_GetPolicy.lo_", "bytesCopied": 177 }, - { "artifactId": "mp-policy-numbered-2", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log.2", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:mp-default" }, "rotation": { "kind": "numbered", "value": 2, "lineageId": "mp-policy-rotation" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:02:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/numbered-2/MP_GetPolicy.log.2", "bytesCopied": 179 } + { "artifactId": "synthetic:artifact:sha256.v1:ea4afe186fc87642f4641b3f207dd2b56a5275d38d418ef0a8363c5dfa2a7fb5", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log.20260729-235700", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "timestamped", "value": "20260729-235700", "lineageId": "synthetic:lineage:sha256.v1:23bf9e874701c542bf0fe2e3fcdf5f3438a5a92ecf4bb76d8d274802e8ea8019" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:02:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/timestamped-20260729-235700/MP_GetPolicy.log.20260729-235700", "bytesCopied": 182 }, + { "artifactId": "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:23bf9e874701c542bf0fe2e3fcdf5f3438a5a92ecf4bb76d8d274802e8ea8019" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:02:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 178 }, + { "artifactId": "synthetic:artifact:sha256.v1:10e37cba0f125b6bd5b5e84cae6cb52e70c5921eb4cfc5a414bbfd2bc39ae10e", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.lo_", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "lo_", "lineageId": "synthetic:lineage:sha256.v1:23bf9e874701c542bf0fe2e3fcdf5f3438a5a92ecf4bb76d8d274802e8ea8019" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:02:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/lo_/MP_GetPolicy.lo_", "bytesCopied": 177 }, + { "artifactId": "synthetic:artifact:sha256.v1:0ccdeaa6040b48f044e18ccb64d0b9192440d4837de83b31efea34f9a782cab7", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log.2", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "numbered", "value": 2, "lineageId": "synthetic:lineage:sha256.v1:23bf9e874701c542bf0fe2e3fcdf5f3438a5a92ecf4bb76d8d274802e8ea8019" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:02:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/numbered-2/MP_GetPolicy.log.2", "bytesCopied": 179 } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/skipped-iis/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/skipped-iis/manifest.json index 74e1ebf47..84aa8f354 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/skipped-iis/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/skipped-iis/manifest.json @@ -4,8 +4,8 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, "artifacts": [ - { "artifactId": "mp-iis-skipped", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-iis", "sourceKind": "iisW3c", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_IIS_EXPORT", "originalBasename": "u_ex_synthetic.log", "configuredPathProvenance": { "state": "notRequested", "pathFingerprint": "synthetic:path:iis-not-requested" }, "rotation": { "kind": "providerDefined", "lineageId": "mp-iis-supplement" }, "captureState": "skipped", "skipReason": "optional supplemental source not requested", "collectedUtc": "2026-07-30T00:07:00Z", "relativePath": null, "bytesCopied": 0 } + { "artifactId": "synthetic:artifact:sha256.v1:34860def3e267a59a95606346ab9d6ef1fe7777505d662ece3ef674a0e617d9f", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-iis", "sourceKind": "iisW3c", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_IIS_EXPORT", "originalBasename": "u_ex_synthetic.log", "configuredPathProvenance": { "state": "notRequested", "pathFingerprint": "synthetic:path:sha256.v1:3e891309d960cb72191b6a45bcfb690c145680068a8b298cd0b5c144f77142be" }, "rotation": { "kind": "providerDefined", "lineageId": "synthetic:lineage:sha256.v1:235ef78b53e533c0f69d85c9fa4911c1c701abb178c9f6bfb84eb9e9c8ee3439" }, "captureState": "skipped", "skipReason": "optional supplemental source not requested", "collectedUtc": "2026-07-30T00:07:00Z", "relativePath": null, "bytesCopied": 0 } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/supplemental-wsus-skipped/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/supplemental-wsus-skipped/manifest.json index fe8f697a2..de02318ea 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/supplemental-wsus-skipped/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/supplemental-wsus-skipped/manifest.json @@ -5,18 +5,18 @@ "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", "topology": { - "captureHost": "LAB-CM01", - "siteCode": "LAB", + "captureHost": "S01-CM01", + "siteCode": "S01", "rolesObserved": ["softwareUpdatePoint", "wsUs"] }, "artifacts": [ { - "artifactId": "sup-wsus-health-skipped", + "artifactId": "synthetic:artifact:sha256.v1:2f21b2fe3c38a5162001ce80e0c2e88757dff11c261e8caa192693e500c3885a", "producerRole": "wsUs", - "producerHostHandle": "synthetic:host:wsus-01", + "producerHostHandle": "synthetic:host:sha256.v1:984a7c5273c97dbb410cdaffda740fc87a61975b3f76dfe37a19772327da0b20", "workflowSubject": { "role": "softwareUpdatePoint", - "instanceHandle": "synthetic:subject:sup-01" + "instanceHandle": "synthetic:subject:sha256.v1:ca790a8bf688c51101b35dc762ac94f7dd1a576bda7a1d85773a52e546004722" }, "sourceId": "server-sup-wsus", "sourceKind": "profileDefined", @@ -25,9 +25,9 @@ "originalBasename": "WsusHealth.json", "configuredPathProvenance": { "state": "notRequested", - "pathFingerprint": "synthetic:path:sup-wsus-health" + "pathFingerprint": "synthetic:path:sha256.v1:f7c7d7244f6e05a5e6d0ef2431abaf3123362d6bcfaed2d6b39008f69e541e7b" }, - "rotation": { "kind": "providerDefined", "lineageId": "sup-wsus-health" }, + "rotation": { "kind": "providerDefined", "lineageId": "synthetic:lineage:sha256.v1:3850e8bdba95c779ae0dfe9df0ada110e81d5887594c0ce5a154a15d5e04ab2b" }, "captureState": "skipped", "skipReason": "optional supplemental source not requested", "collectedUtc": "2026-07-30T00:08:00Z", diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/expected.json index 0efb1836c..864292c7f 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/expected.json @@ -1,6 +1,6 @@ { "pre318ExpectedVersion": 1, - "canonicalArtifactIds": ["a-mp-policy", "b-sitecomp", "z-site-status"], + "canonicalArtifactIds": ["synthetic:artifact:sha256.v1:985f51f224668b9bc7dab4496cf3bbd46c29f5b8968931b6a74307d53011c944", "synthetic:artifact:sha256.v1:930503e728322cd7bff72d0c239e9aa3db5178f8c77c3fa349fdeec1e3a7b96d", "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c"], "normalizedOutputByteIdenticalWhenReordered": true, "artifactIdDerivationIgnoresDiscoveryOrder": true, "artifactIdUniquenessScope": "manifest", @@ -12,8 +12,8 @@ { "producerRole": "siteServer", "sourceId": "server-status", "state": "captured" } ], "artifactProvenance": [ - { "artifactId": "a-mp-policy", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }, - { "artifactId": "b-sitecomp", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }, - { "artifactId": "z-site-status", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false } + { "artifactId": "synthetic:artifact:sha256.v1:985f51f224668b9bc7dab4496cf3bbd46c29f5b8968931b6a74307d53011c944", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }, + { "artifactId": "synthetic:artifact:sha256.v1:930503e728322cd7bff72d0c239e9aa3db5178f8c77c3fa349fdeec1e3a7b96d", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false }, + { "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", "encoding": "utf-8", "byteLimit": 4096, "limitApplied": false } ] } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/manifest.json index 28e9c338f..cc13eb8ed 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/manifest.json @@ -4,11 +4,11 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "LAB-CM01", "siteCode": "LAB", "rolesObserved": ["siteServer", "managementPoint"] }, + "topology": { "captureHost": "S01-CM01", "siteCode": "S01", "rolesObserved": ["siteServer", "managementPoint"] }, "inputOrderIsDeliberatelyUnsorted": true, "artifacts": [ - { "artifactId": "z-site-status", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:site-01", "sourceId": "server-status", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_ROOT_B", "originalBasename": "statmgr.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:z-site" }, "rotation": { "kind": "current", "lineageId": "site-status-z" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:09:00Z", "relativePath": "evidence/sccm/server/site-server/server-status/current/statmgr.log", "bytesCopied": 167 }, - { "artifactId": "a-mp-policy", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:mp-01", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT_A", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:a-mp" }, "rotation": { "kind": "current", "lineageId": "mp-policy-a" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:09:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 176 }, - { "artifactId": "b-sitecomp", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:site-01", "sourceId": "server-sitecomp", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_ROOT_A", "originalBasename": "sitecomp.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:a-site" }, "rotation": { "kind": "current", "lineageId": "sitecomp-a" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:09:00Z", "relativePath": "evidence/sccm/server/site-server/server-sitecomp/current/sitecomp.log", "bytesCopied": 180 } + { "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "sourceId": "server-status", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_ROOT_B", "originalBasename": "statmgr.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:a3870e1eb69c41328d97c369032f1d54c92a86e4d1e330bf74865fb9bb88919f" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:d69adee776032725b5bc1a2186ca41ef91956ab03ed4c1d25211004c808b5f75" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:09:00Z", "relativePath": "evidence/sccm/server/site-server/server-status/current/statmgr.log", "bytesCopied": 167 }, + { "artifactId": "synthetic:artifact:sha256.v1:985f51f224668b9bc7dab4496cf3bbd46c29f5b8968931b6a74307d53011c944", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT_A", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:3bf06ec529316daa662e540184314a49c5ea321dcc865da3cdd1127894a8085e" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:39628bdaafd21601cb0934d0e32742ff04e6510263019fa806cd53dca8305610" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:09:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 176 }, + { "artifactId": "synthetic:artifact:sha256.v1:930503e728322cd7bff72d0c239e9aa3db5178f8c77c3fa349fdeec1e3a7b96d", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "sourceId": "server-sitecomp", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_ROOT_A", "originalBasename": "sitecomp.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:20024cdf67d54bdd24244095fdef25fd547d9cb9798b5204aa7b5cc66c5862dc" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:30b4ad9fe96ef8043b273334e1db6303517f9cd98ea1ddb9b4b433df8278e617" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:09:00Z", "relativePath": "evidence/sccm/server/site-server/server-sitecomp/current/sitecomp.log", "bytesCopied": 180 } ] } diff --git a/crates/cmtraceopen-parser/tests/sccm_server_intake.rs b/crates/cmtraceopen-parser/tests/sccm_server_intake.rs index 8b22d938d..713cdb941 100644 --- a/crates/cmtraceopen-parser/tests/sccm_server_intake.rs +++ b/crates/cmtraceopen-parser/tests/sccm_server_intake.rs @@ -155,6 +155,10 @@ fn opaque_handle(prefix: &str, ordinal: usize) -> String { format!("{prefix}{ordinal:064x}") } +fn synthetic_identity(domain: &str, ordinal: usize) -> String { + opaque_handle(&format!("synthetic:{domain}:sha256.v1:"), ordinal) +} + fn bounded_manifest( artifact_count: usize, byte_limit: u64, @@ -340,6 +344,23 @@ fn assert_unsafe_mutation_is_rejected( } } +fn assert_mutation_fails_closed_without_panicking( + scenario: &str, + expected: SccmServerIntakeError, + mutate: impl FnOnce(&mut Value, &mut Vec), +) { + let (manifest_json, mut payloads) = load_bundle(scenario); + let mut manifest = manifest_value(&manifest_json); + mutate(&mut manifest, &mut payloads); + let manifest_json = serialize_manifest(&manifest); + + let actual = std::panic::catch_unwind(std::panic::AssertUnwindSafe(|| { + assess_server_intake(&manifest_json, &payloads) + })); + assert!(actual.is_ok(), "untrusted intake must not panic"); + assert_eq!(actual.expect("panic result was checked"), Err(expected)); +} + fn artifact_json<'a>(assessment: &'a Value, artifact_id: &str) -> &'a Value { assessment["artifacts"] .as_array() @@ -628,10 +649,10 @@ fn assert_remaining_expected_contracts( .as_str() .expect("synthetic capture host is a string"); Value::String( - if current_host == "LAB-MP01" { - "LAB-CM01" + if current_host == "S01-MP01" { + "S01-CM01" } else { - "LAB-MP01" + "S01-MP01" } .to_owned(), ) @@ -915,23 +936,115 @@ fn server_intake_rejects_identity_bearing_public_inputs() { }); } +#[test] +fn server_intake_rejects_personal_name_shaped_synthetic_identities() { + assert_mutation_fails_closed_without_panicking( + "complete-multi-role", + SccmServerIntakeError::UnexpectedPayload, + |manifest, payloads| { + manifest["artifacts"][0]["artifactId"] = Value::String("alice-smith".to_owned()); + payloads[0].manifest_artifact_id = "alice-smith".to_owned(); + }, + ); + assert_mutation_fails_closed_without_panicking( + "complete-multi-role", + SccmServerIntakeError::InvalidArtifact, + |manifest, _payloads| { + manifest["artifacts"][0]["producerHostHandle"] = + Value::String("synthetic:host:alice-smith-01".to_owned()); + }, + ); + assert_mutation_fails_closed_without_panicking( + "complete-multi-role", + SccmServerIntakeError::InvalidArtifact, + |manifest, _payloads| { + manifest["artifacts"][2]["workflowSubject"]["instanceHandle"] = + Value::String("synthetic:subject:alice-smith-01".to_owned()); + }, + ); + assert_mutation_fails_closed_without_panicking( + "complete-multi-role", + SccmServerIntakeError::InvalidArtifact, + |manifest, _payloads| { + manifest["artifacts"][0]["configuredPathProvenance"]["pathFingerprint"] = + Value::String("synthetic:path:alice-smith".to_owned()); + }, + ); + assert_mutation_fails_closed_without_panicking( + "complete-multi-role", + SccmServerIntakeError::InvalidArtifact, + |manifest, _payloads| { + manifest["artifacts"][0]["rotation"]["lineageId"] = + Value::String("alice-smith".to_owned()); + }, + ); +} + +#[test] +fn server_intake_rejects_unicode_and_malformed_synthetic_identities_without_panicking() { + for capture_host in ["ALC-CM01", "S01-CM0é", "S01-CM", "S01-CM000", "S02-CM01"] { + assert_mutation_fails_closed_without_panicking( + "complete-multi-role", + SccmServerIntakeError::InvalidTopology, + |manifest, _payloads| { + manifest["topology"]["captureHost"] = Value::String(capture_host.to_owned()); + }, + ); + } + assert_mutation_fails_closed_without_panicking( + "complete-multi-role", + SccmServerIntakeError::InvalidTopology, + |manifest, _payloads| { + manifest["topology"]["siteCode"] = Value::String("S01".to_owned()); + }, + ); + + let unicode_artifact = "synthetic:artifact:sha256.v1:0000000000000000000000000000000000000000000000000000000000000001"; + assert_mutation_fails_closed_without_panicking( + "complete-multi-role", + SccmServerIntakeError::UnexpectedPayload, + |manifest, payloads| { + manifest["artifacts"][0]["artifactId"] = Value::String(unicode_artifact.to_owned()); + payloads[0].manifest_artifact_id = unicode_artifact.to_owned(); + }, + ); + assert_mutation_fails_closed_without_panicking( + "complete-multi-role", + SccmServerIntakeError::InvalidArtifact, + |manifest, _payloads| { + manifest["artifacts"][0]["producerHostHandle"] = Value::String( + "synthetic:host:sha256.v1:000000000000000000000000000000000000000000000000000000000000000g" + .to_owned(), + ); + }, + ); + assert_mutation_fails_closed_without_panicking( + "complete-multi-role", + SccmServerIntakeError::InvalidArtifact, + |manifest, _payloads| { + manifest["artifacts"][0]["configuredPathProvenance"]["pathFingerprint"] = + Value::String("synthetic:path:sha256.v1:0000".to_owned()); + }, + ); +} + #[test] fn server_intake_accepts_new_conforming_synthetic_identities() { let (manifest_json, mut payloads) = load_bundle("complete-multi-role"); let mut manifest = manifest_value(&manifest_json); - manifest["topology"]["siteCode"] = Value::String("DEV".to_owned()); - manifest["topology"]["captureHost"] = Value::String("DEV-CM02".to_owned()); + manifest["topology"]["siteCode"] = Value::String("S02".to_owned()); + manifest["topology"]["captureHost"] = Value::String("S02-CM02".to_owned()); let artifact = &mut manifest["artifacts"][0]; - artifact["artifactId"] = Value::String("fixture-sitecomp-04".to_owned()); - artifact["producerHostHandle"] = Value::String("synthetic:host:site-04".to_owned()); + artifact["artifactId"] = Value::String(synthetic_identity("artifact", 4)); + artifact["producerHostHandle"] = Value::String(synthetic_identity("host", 4)); artifact["configuredPathProvenance"]["pathFingerprint"] = - Value::String("synthetic:path:fixture-root-04".to_owned()); - artifact["rotation"]["lineageId"] = Value::String("fixture-lineage-04".to_owned()); + Value::String(synthetic_identity("path", 4)); + artifact["rotation"]["lineageId"] = Value::String(synthetic_identity("lineage", 4)); manifest["artifacts"][2]["workflowSubject"]["instanceHandle"] = - Value::String("synthetic:subject:dp-04".to_owned()); - payloads[0].manifest_artifact_id = "fixture-sitecomp-04".to_owned(); + Value::String(synthetic_identity("subject", 4)); + payloads[0].manifest_artifact_id = synthetic_identity("artifact", 4); assert!( assess_server_intake(&serialize_manifest(&manifest), &payloads).is_ok(), @@ -982,7 +1095,7 @@ fn server_intake_rejects_mp_produced_mpcontrol_without_workflow_subject() { .as_array_mut() .expect("artifacts are an array") .iter_mut() - .find(|artifact| artifact["artifactId"] == "mp-policy-current") + .find(|artifact| artifact["artifactId"] == "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53") .expect("MP policy artifact is present"); artifact["originalBasename"] = Value::String("mpcontrol.log".to_owned()); artifact["relativePath"] = Value::String( @@ -1003,10 +1116,13 @@ fn server_intake_accepts_site_server_mpcontrol_with_management_point_subject() { .as_array_mut() .expect("artifacts are an array") .iter_mut() - .find(|artifact| artifact["artifactId"] == "mp-policy-current") + .find(|artifact| artifact["artifactId"] == "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53") .expect("MP policy artifact is present"); artifact["producerRole"] = Value::String("siteServer".to_owned()); - artifact["producerHostHandle"] = Value::String("synthetic:host:site-01".to_owned()); + artifact["producerHostHandle"] = Value::String( + "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339" + .to_owned(), + ); artifact["workflowSubject"] = json!({ "role": "managementPoint" }); artifact["originalBasename"] = Value::String("mpcontrol.log".to_owned()); artifact["relativePath"] = Value::String( @@ -1019,7 +1135,7 @@ fn server_intake_accepts_site_server_mpcontrol_with_management_point_subject() { let mpcontrol = assessment .artifacts .iter() - .find(|artifact| artifact.artifact_id == "mp-policy-current") + .find(|artifact| artifact.artifact_id == "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53") .expect("MP control artifact is retained"); assert_eq!(mpcontrol.producer_role, SccmRole::SiteServer); assert_eq!( @@ -1053,10 +1169,14 @@ fn server_intake_scopes_canonical_identity_to_producer_host() { let fingerprint = manifest["artifacts"][0]["configuredPathProvenance"]["pathFingerprint"].clone(); let lineage = manifest["artifacts"][0]["rotation"]["lineageId"].clone(); - manifest["artifacts"][0]["producerHostHandle"] = - Value::String("synthetic:host:site-01".to_owned()); - manifest["artifacts"][1]["producerHostHandle"] = - Value::String("synthetic:host:mp-01".to_owned()); + manifest["artifacts"][0]["producerHostHandle"] = Value::String( + "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339" + .to_owned(), + ); + manifest["artifacts"][1]["producerHostHandle"] = Value::String( + "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f" + .to_owned(), + ); manifest["artifacts"][1]["configuredPathProvenance"]["pathFingerprint"] = fingerprint; manifest["artifacts"][1]["rotation"]["lineageId"] = lineage; @@ -1069,7 +1189,7 @@ fn server_intake_scopes_canonical_identity_to_producer_host() { .iter() .map(|artifact| artifact.producer_host_handle.as_deref()) .collect::>(), - vec![Some("synthetic:host:mp-01"), Some("synthetic:host:site-01"),], + vec![Some("synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f"), Some("synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339"),], "producer-host provenance orders otherwise-equal artifacts before caller ids", ); @@ -1094,8 +1214,10 @@ fn server_intake_coverage_binds_each_row_to_its_producer_host() { let fingerprint = manifest["artifacts"][0]["configuredPathProvenance"]["pathFingerprint"].clone(); let lineage = manifest["artifacts"][0]["rotation"]["lineageId"].clone(); - manifest["artifacts"][0]["producerHostHandle"] = - Value::String("synthetic:host:site-01".to_owned()); + manifest["artifacts"][0]["producerHostHandle"] = Value::String( + "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339" + .to_owned(), + ); manifest["artifacts"][1]["configuredPathProvenance"]["pathFingerprint"] = fingerprint; manifest["artifacts"][1]["rotation"]["lineageId"] = lineage; @@ -1107,19 +1229,19 @@ fn server_intake_coverage_binds_each_row_to_its_producer_host() { json!([ { "producerRole": "managementPoint", - "producerHostHandle": "synthetic:host:mp-01", + "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "workflowSubjectRole": null, "sourceId": "server-mp-policy", "state": "captured", - "artifactIds": ["mp-policy-root-b-current"], + "artifactIds": ["synthetic:artifact:sha256.v1:b117cc48fba84a0cef85a662fdba0009e1d2723edc6b51af457d829cfa09e7c8"], }, { "producerRole": "managementPoint", - "producerHostHandle": "synthetic:host:site-01", + "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "workflowSubjectRole": null, "sourceId": "server-mp-policy", "state": "captured", - "artifactIds": ["mp-policy-root-a-current"], + "artifactIds": ["synthetic:artifact:sha256.v1:721420190054ad85f091f558f77cd4e6e54b50da9426b7d979f7edcda7970b78"], }, ]), "coverage membership must retain the physical producer that supplied each artifact", @@ -1145,8 +1267,10 @@ fn server_intake_scopes_path_fingerprint_lineage_to_producer_host() { let mut manifest = manifest_value(&manifest_json); let fingerprint = manifest["artifacts"][0]["configuredPathProvenance"]["pathFingerprint"].clone(); - manifest["artifacts"][1]["producerHostHandle"] = - Value::String("synthetic:host:site-01".to_owned()); + manifest["artifacts"][1]["producerHostHandle"] = Value::String( + "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339" + .to_owned(), + ); manifest["artifacts"][1]["configuredPathProvenance"]["pathFingerprint"] = fingerprint; let assessment = assess_server_intake(&serialize_manifest(&manifest), &payloads) @@ -1185,8 +1309,8 @@ fn server_intake_scopes_canonical_identity_to_workflow_subject() { let (manifest_json, payloads) = load_bundle("complete-multi-role"); let mut manifest = manifest_value(&manifest_json); manifest["artifacts"][2]["workflowSubject"]["instanceHandle"] = - Value::String("synthetic:subject:dp-02".to_owned()); - configure_second_artifact_as_dp_identity(&mut manifest, "synthetic:subject:dp-01", true); + Value::String("synthetic:subject:sha256.v1:b7f6d3e42b018582c500e7f0abcbb3d976bc45df22eb889e14c5e8b58902a299".to_owned()); + configure_second_artifact_as_dp_identity(&mut manifest, "synthetic:subject:sha256.v1:303b321cad551bed85d9b6d366165e1cb287c824090779eadea5673cbeeacf33", true); let assessment = assess_server_intake(&serialize_manifest(&manifest), &payloads) .expect("the same artifact identity for a distinct workflow subject is independent"); @@ -1199,8 +1323,8 @@ fn server_intake_scopes_canonical_identity_to_workflow_subject() { .map(|artifact| artifact.workflow_subject_handle.as_deref()) .collect::>(), vec![ - Some("synthetic:subject:dp-01"), - Some("synthetic:subject:dp-02"), + Some("synthetic:subject:sha256.v1:303b321cad551bed85d9b6d366165e1cb287c824090779eadea5673cbeeacf33"), + Some("synthetic:subject:sha256.v1:b7f6d3e42b018582c500e7f0abcbb3d976bc45df22eb889e14c5e8b58902a299"), ], "workflow-subject provenance orders otherwise-equal artifacts before caller ids", ); @@ -1223,7 +1347,7 @@ fn server_intake_scopes_canonical_identity_to_workflow_subject() { fn server_intake_coverage_binds_each_row_to_its_workflow_subject() { let (manifest_json, payloads) = load_bundle("complete-multi-role"); let mut manifest = manifest_value(&manifest_json); - configure_second_artifact_as_dp_identity(&mut manifest, "synthetic:subject:dp-02", false); + configure_second_artifact_as_dp_identity(&mut manifest, "synthetic:subject:sha256.v1:b7f6d3e42b018582c500e7f0abcbb3d976bc45df22eb889e14c5e8b58902a299", false); let assessment = assess_server_intake(&serialize_manifest(&manifest), &payloads) .expect("the same source captured for distinct workflow subjects is assessed"); @@ -1233,37 +1357,37 @@ fn server_intake_coverage_binds_each_row_to_its_workflow_subject() { json!([ { "producerRole": "managementPoint", - "producerHostHandle": "synthetic:host:mp-01", + "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "workflowSubjectRole": null, "sourceId": "server-mp-policy", "state": "captured", - "artifactIds": ["mp-policy-current"], + "artifactIds": ["synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53"], }, { "producerRole": "siteServer", - "producerHostHandle": "synthetic:host:site-01", + "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "workflowSubjectRole": "distributionPoint", - "workflowSubjectHandle": "synthetic:subject:dp-01", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:303b321cad551bed85d9b6d366165e1cb287c824090779eadea5673cbeeacf33", "sourceId": "server-dp-distribution", "state": "captured", - "artifactIds": ["dp-dist-current"], + "artifactIds": ["synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6"], }, { "producerRole": "siteServer", - "producerHostHandle": "synthetic:host:site-01", + "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "workflowSubjectRole": "distributionPoint", - "workflowSubjectHandle": "synthetic:subject:dp-02", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:b7f6d3e42b018582c500e7f0abcbb3d976bc45df22eb889e14c5e8b58902a299", "sourceId": "server-dp-distribution", "state": "captured", - "artifactIds": ["sup-sync-current"], + "artifactIds": ["synthetic:artifact:sha256.v1:3eab84121ff2ad1e7b4cb559bad24f451ab7c26fc4db657fadd3bc190f945e9d"], }, { "producerRole": "siteServer", - "producerHostHandle": "synthetic:host:site-01", + "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "workflowSubjectRole": null, "sourceId": "server-sitecomp", "state": "captured", - "artifactIds": ["sitecomp-current"], + "artifactIds": ["synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff"], }, ]), "coverage membership must retain the exact workflow subject for each DP artifact", @@ -1298,7 +1422,7 @@ fn server_intake_coverage_omits_absent_optional_topology_handles() { assert_eq!( management_point["producerHostHandle"], - Value::String("synthetic:host:mp-01".to_owned()), + Value::String("synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f".to_owned()), "present producer topology stays additive in coverage JSON", ); assert!( @@ -1311,7 +1435,7 @@ fn server_intake_coverage_omits_absent_optional_topology_handles() { fn server_intake_scopes_path_fingerprint_lineage_to_workflow_subject() { let (manifest_json, payloads) = load_bundle("complete-multi-role"); let mut manifest = manifest_value(&manifest_json); - configure_second_artifact_as_dp_identity(&mut manifest, "synthetic:subject:dp-02", false); + configure_second_artifact_as_dp_identity(&mut manifest, "synthetic:subject:sha256.v1:b7f6d3e42b018582c500e7f0abcbb3d976bc45df22eb889e14c5e8b58902a299", false); let assessment = assess_server_intake(&serialize_manifest(&manifest), &payloads) .expect("path fingerprints are scoped to their workflow subject"); @@ -1322,7 +1446,7 @@ fn server_intake_scopes_path_fingerprint_lineage_to_workflow_subject() { fn server_intake_rejects_relabelled_duplicate_for_same_workflow_subject() { let (manifest_json, payloads) = load_bundle("complete-multi-role"); let mut manifest = manifest_value(&manifest_json); - configure_second_artifact_as_dp_identity(&mut manifest, "synthetic:subject:dp-01", true); + configure_second_artifact_as_dp_identity(&mut manifest, "synthetic:subject:sha256.v1:303b321cad551bed85d9b6d366165e1cb287c824090779eadea5673cbeeacf33", true); assert_eq!( assess_server_intake(&serialize_manifest(&manifest), &payloads), @@ -1348,7 +1472,7 @@ fn server_intake_preserves_physical_parse_failure_provenance() { assert_eq!(assessment.next_artifact_requests.len(), 1); let serialized = serde_json::to_value(&assessment).expect("assessment serializes"); - let artifact = artifact_json(&serialized, "mp-policy-multiline"); + let artifact = artifact_json(&serialized, "synthetic:artifact:sha256.v1:fab8972d821bbc3016ad15e49e13aeaf0559c7ef385bda8bc2b1158f085fb338"); assert_eq!(artifact["bytesCopied"], 207); assert_eq!(artifact["captureProvenance"]["schemaVersion"], 1); assert_eq!(artifact["captureProvenance"]["encoding"], "utf-8"); @@ -1378,7 +1502,7 @@ fn server_intake_converts_malformed_captured_ccm_to_parse_failed() { assert_eq!(assessment.next_artifact_requests.len(), 1); let serialized = serde_json::to_value(&assessment).expect("assessment serializes"); - let artifact = artifact_json(&serialized, "mp-policy-multiline"); + let artifact = artifact_json(&serialized, "synthetic:artifact:sha256.v1:fab8972d821bbc3016ad15e49e13aeaf0559c7ef385bda8bc2b1158f085fb338"); assert_eq!(artifact["captureProvenance"]["encoding"], "utf-8"); assert_eq!(artifact["captureProvenance"]["byteLimit"], 4096); assert_eq!(artifact["captureProvenance"]["limitApplied"], false); @@ -1390,7 +1514,7 @@ fn server_intake_projects_versioned_capture_provenance() { let captured = assess_server_intake(&captured_manifest, &captured_payloads) .expect("captured bundle is assessed"); let captured_json = serde_json::to_value(&captured).expect("assessment serializes"); - let captured_artifact = artifact_json(&captured_json, "mp-policy-configured"); + let captured_artifact = artifact_json(&captured_json, "synthetic:artifact:sha256.v1:a77e71c0b196187e25d552021e469b7441592a61640ee134aa45b3fc106860d0"); assert_eq!(captured_artifact["captureProvenance"]["schemaVersion"], 1); assert_eq!(captured_artifact["captureProvenance"]["encoding"], "utf-8"); assert_eq!(captured_artifact["captureProvenance"]["byteLimit"], 4096); @@ -1403,7 +1527,7 @@ fn server_intake_projects_versioned_capture_provenance() { let capped = assess_server_intake(&capped_manifest, &capped_payloads) .expect("capped bundle is assessed"); let capped_json = serde_json::to_value(&capped).expect("assessment serializes"); - let capped_artifact = artifact_json(&capped_json, "sup-sync-capped"); + let capped_artifact = artifact_json(&capped_json, "synthetic:artifact:sha256.v1:8ffd2bfbfcd641204b0108f4d880ef9aae8472e9cde9abc4da5207791e09f47a"); assert_eq!(capped_artifact["captureProvenance"]["schemaVersion"], 1); assert_eq!(capped_artifact["captureProvenance"]["encoding"], "utf-8"); assert_eq!(capped_artifact["captureProvenance"]["byteLimit"], 64); @@ -1447,7 +1571,10 @@ fn server_intake_does_not_suppress_default_request_across_producer_hosts() { let mut combined = manifest_value(&configured_manifest); let (absent_manifest, _absent_payloads) = load_bundle("access-denied-mp"); let mut absent = manifest_value(&absent_manifest)["artifacts"][0].clone(); - absent["producerHostHandle"] = Value::String("synthetic:host:site-01".to_owned()); + absent["producerHostHandle"] = Value::String( + "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339" + .to_owned(), + ); absent["captureState"] = Value::String("absent".to_owned()); absent["collectionDetail"] = Value::Null; absent["configuredPathProvenance"]["state"] = Value::String("defaultCandidate".to_owned()); @@ -1473,7 +1600,7 @@ fn server_intake_does_not_suppress_default_request_across_workflow_subjects() { let mut absent = manifest_value(&absent_manifest)["artifacts"][0].clone(); absent["workflowSubject"] = json!({ "role": "distributionPoint", - "instanceHandle": "synthetic:subject:dp-02", + "instanceHandle": "synthetic:subject:sha256.v1:b7f6d3e42b018582c500e7f0abcbb3d976bc45df22eb889e14c5e8b58902a299", }); combined["artifacts"] .as_array_mut() @@ -1547,7 +1674,7 @@ fn server_intake_exercises_role_state_rotation_and_privacy_matrix() { .expect("role-aware bundle is assessed"); assert_eq!( complete.topology.capture_host_handle, - "synthetic:host:lab-cm01" + "synthetic:host:s01-cm01" ); assert_eq!( complete.topology.roles_observed, @@ -1711,7 +1838,7 @@ fn server_intake_admits_only_the_catalogued_optional_wsus_supplement_contract() let assessment = assess_server_intake(&manifest_json, &payloads) .expect("the catalogued optional WSUS supplement is assessable"); let serialized = serde_json::to_value(&assessment).expect("assessment serializes"); - let artifact = artifact_json(&serialized, "sup-wsus-health-skipped"); + let artifact = artifact_json(&serialized, "synthetic:artifact:sha256.v1:2f21b2fe3c38a5162001ce80e0c2e88757dff11c261e8caa192693e500c3885a"); let source = declared_server_source_catalog() .iter() @@ -1736,9 +1863,9 @@ fn server_intake_admits_only_the_catalogued_optional_wsus_supplement_contract() assert_eq!(artifact["sourceVersion"], "5.00.TEST"); assert_eq!( artifact["pathFingerprint"], - "synthetic:path:sup-wsus-health" + "synthetic:path:sha256.v1:f7c7d7244f6e05a5e6d0ef2431abaf3123362d6bcfaed2d6b39008f69e541e7b" ); - assert_eq!(artifact["rotationLineageHandle"], "sup-wsus-health"); + assert_eq!(artifact["rotationLineageHandle"], "synthetic:lineage:sha256.v1:3850e8bdba95c779ae0dfe9df0ada110e81d5887594c0ce5a154a15d5e04ab2b"); assert_eq!(artifact["state"], "skipped"); assert_eq!(artifact["family"], "softwareUpdatePoint"); assert!(!artifact["parserEligible"] @@ -1754,10 +1881,11 @@ fn server_intake_admits_only_the_catalogued_optional_wsus_supplement_contract() .is_empty()); let mut manifest = manifest_value(&manifest_json); - manifest["artifacts"][0]["artifactId"] = Value::String("fixture-wsus-artifact-04".to_owned()); + let generic_artifact_id = synthetic_identity("artifact", 5); + manifest["artifacts"][0]["artifactId"] = Value::String(generic_artifact_id.clone()); let generic = assess_server_intake(&serialize_manifest(&manifest), &payloads) .expect("a synthetic artifact ID is structural, not a catalog entry"); - assert_eq!(generic.artifacts[0].artifact_id, "fixture-wsus-artifact-04"); + assert_eq!(generic.artifacts[0].artifact_id, generic_artifact_id); for (field, replacement) in [ ("sourceId", "free-form-wsus-source"), @@ -2320,7 +2448,7 @@ fn server_manifest_v1_retains_safe_nested_extensions_without_interpreting_them() "value": extension_value, }]); assert_eq!(public["privacyExtensions"], expected); - let artifact = artifact_json(&public, "dp-dist-current"); + let artifact = artifact_json(&public, "synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6"); assert_eq!(artifact["workflowSubjectExtensions"], expected); assert_eq!(artifact["configuredPathProvenanceExtensions"], expected); assert_eq!(artifact["rotationExtensions"], expected); diff --git a/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md b/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md index 09191d1af..fdb4b1cc5 100644 --- a/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md +++ b/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md @@ -4,7 +4,7 @@ **Goal:** Remove fixture-specific server-intake identity allowlists while keeping synthetic and production manifests privacy-safe and fail-closed. -**Architecture:** Keep declared source IDs owned by the server source catalog, rather than duplicating them in intake. Replace every synthetic fixture identity list in intake with small field-specific closed grammars: structural synthetic artifact/lineage/path tokens, synthetic host/subject handles, and SCCM-shaped synthetic topology. Production remains opaque-handle-only; malformed or identity-bearing strings remain rejected before public projection. +**Architecture:** Keep declared source IDs owned by the server source catalog, rather than duplicating them in intake. Synthetic artifact, lineage, path, host, and subject identities use a domain-bound `synthetic::sha256.v1:<64 lowercase hex>` contract, so fixture labels cannot become public identities. Synthetic topology uses `S` site codes and SCCM role hosts such as `S01-CM01`; production remains opaque-handle-only. Malformed, Unicode, or identity-bearing strings are rejected before public projection. **Tech Stack:** Rust, Serde, existing `cmtraceopen-parser` SCCM server catalog/intake modules, Cargo tests, Clippy, rustfmt. @@ -21,7 +21,7 @@ **Files:** - Modify: `crates/cmtraceopen-parser/tests/sccm_server_intake.rs` -- [ ] **Step 1: Add failing acceptance and rejection cases** +- [x] **Step 1: Add failing acceptance and rejection cases** Add one test that mutates a committed synthetic manifest with a new conforming artifact ID, lineage, path fingerprint, producer host, workflow subject, and SCCM-shaped topology; `assess_server_intake` must succeed. Add table-driven mutations that must return `InvalidTopology` or `InvalidArtifact`: bare/user-like identifiers, malformed token separators, non-three-character site code, topology host without a typed two-digit suffix, and malformed synthetic handles. @@ -33,7 +33,7 @@ assert_eq!( ); ``` -- [ ] **Step 2: Run the red test** +- [x] **Step 2: Run the red test** Run: `cargo test -p cmtraceopen-parser --test sccm_server_intake server_intake_accepts_new_conforming_synthetic_identities` @@ -46,7 +46,7 @@ Expected: FAIL while literal fixture allowlists reject the new conforming values - Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs` - Test: `crates/cmtraceopen-parser/tests/sccm_server_intake.rs` -- [ ] **Step 1: Add catalog membership helper** +- [x] **Step 1: Add catalog membership helper** Expose a crate-visible helper that recognizes a source ID in `SERVER_SOURCE_SPECS` or `SERVER_STRUCTURED_SUPPLEMENT_SPEC`; do not restate source strings in intake. @@ -59,7 +59,7 @@ pub(crate) fn is_declared_server_source_id(source_id: &str) -> bool { } ``` -- [ ] **Step 2: Replace the intake source literal match** +- [x] **Step 2: Replace the intake source literal match** Make `safe_source_id` call that helper for known IDs and preserve its current opaque-future allowance only for non-synthetic retained-unknown artifacts. @@ -70,7 +70,7 @@ is_declared_server_source_id(value) && opaque_sha256_handle(value, "cmtraceopen.source.sha256.v1:")) ``` -- [ ] **Step 3: Run the focused test** +- [x] **Step 3: Run the focused test** Run: `cargo test -p cmtraceopen-parser --test sccm_server_intake` @@ -82,57 +82,36 @@ Expected: PASS; catalogued sources, opaque future sources, and untrusted sources - Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs` - Test: `crates/cmtraceopen-parser/tests/sccm_server_intake.rs` -- [ ] **Step 1: Delete fixture-derived constants and literal matches** +- [x] **Step 1: Delete fixture-derived constants and literal matches** Remove `SYNTHETIC_HIERARCHY_*` constants and the literal sets in `safe_manifest_artifact_id`, `safe_lineage_id`, `safe_path_fingerprint`, `safe_optional_handle`, `normalize_topology`, and `normalize_hierarchy_link`. -- [ ] **Step 2: Add bounded field grammars** +- [x] **Step 2: Add bounded field grammars** -Implement small ASCII validators with no fixture values: +Implement small ASCII validators with no fixture values. Identity-bearing surfaces accept only domain-bound synthetic SHA-256 tokens; topology is limited to a structural site/role/ordinal grammar and validates ASCII before any byte-sensitive operation. ```rust -fn synthetic_slug(value: &str) -> bool { - (3..=128).contains(&value.len()) - && value.contains('-') - && !value.starts_with('-') - && !value.ends_with('-') - && !value.contains("--") - && value.bytes().all(|byte| { - byte.is_ascii_lowercase() || byte.is_ascii_digit() || byte == b'-' - }) -} - -fn synthetic_handle(value: &str, domain: &str) -> bool { +fn synthetic_identity(value: &str, domain: &str) -> bool { value - .strip_prefix(&format!("synthetic:{domain}:")) - .is_some_and(synthetic_numbered_slug) -} - -fn synthetic_site_code(value: &str) -> bool { - value.len() == 3 && value.bytes().all(|byte| byte.is_ascii_uppercase()) -} - -fn synthetic_capture_host(value: &str) -> bool { - let Some((site, role_and_ordinal)) = value.split_once('-') else { - return false; - }; - if role_and_ordinal.len() < 3 { - return false; - } - let (role, ordinal) = role_and_ordinal.split_at(role_and_ordinal.len() - 2); - synthetic_site_code(site) - && matches!(role, "CM" | "MP" | "DP" | "SUP" | "PROVIDER" | "ADMIN") - && ordinal.bytes().all(|byte| byte.is_ascii_digit()) + .strip_prefix("synthetic:") + .and_then(|value| value.split_once(":sha256.v1:")) + .is_some_and(|(actual_domain, digest)| { + actual_domain == domain + && digest.len() == 64 + && digest.bytes().all(|byte| { + byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte) + }) + }) } ``` Use them for the identity-bearing fields and links. Keep `safe_original_path_marker`, opaque SHA-256 production handles, canonical role/source classification, payload binding, and path-collision checks unchanged. -- [ ] **Step 3: Run focused tests** +- [x] **Step 3: Run focused tests** Run: `cargo test -p cmtraceopen-parser --test sccm_server_intake` -Expected: PASS, including accepted generic synthetic values and rejected privacy/malformed mutations. +Expected: PASS (66 tests), including accepted generic synthetic values, the four critic reproductions, and rejected Unicode/malformed mutations without panics. ### Task 4: Freeze the regression boundary From 2af3c9ae20ef40f84fa929889af9d99bb38f2381 Mon Sep 17 00:00:00 2001 From: Adam Date: Wed, 5 Aug 2026 06:02:26 -0400 Subject: [PATCH 3/3] fix(sccm): seal synthetic intake identities --- .../sccm/server/windows/distribution_point.rs | 24 +- .../src/sccm/server/windows/hierarchy.rs | 133 ++----- .../src/sccm/server/windows/intake.rs | 2 +- .../sccm/server/windows/management_point.rs | 32 +- .../server/windows/management_point_tests.rs | 21 +- .../src/sccm/server/windows/site_core.rs | 25 +- .../absent-dp/expected.json | 4 +- .../backlog-blocked/expected.json | 28 +- .../content-version-mismatch/expected.json | 160 ++++---- .../contradiction-recovery/expected.json | 56 +-- .../distribution-failure/expected.json | 24 +- .../healthy-package/expected.json | 44 +-- .../incomplete/expected.json | 24 +- .../malformed-current/expected.json | 2 +- .../rotation-boundary/expected.json | 4 +- .../serve-observed/expected.json | 52 +-- .../transfer-deferred/expected.json | 28 +- .../transfer-failure/expected.json | 32 +- .../transfer-retry/expected.json | 28 +- .../validation-failure/expected.json | 40 +- .../absent-remote-source/expected.json | 6 +- .../backlog-retry/expected.json | 4 +- .../clock-offset-unknown/expected.json | 6 +- .../generic-site-token/expected.json | 2 +- .../healthy-link/expected.json | 16 +- .../incomplete/expected.json | 4 +- .../receiver-processing-failure/expected.json | 8 +- .../recovery/expected.json | 12 +- .../rotation-boundary/expected.json | 4 +- .../sender-failure/expected.json | 6 +- .../topology-mismatch/expected.json | 6 +- .../server/intake/absent-dp/manifest.json | 2 +- .../intake/access-denied-mp/manifest.json | 2 +- .../server/intake/capped-sup/manifest.json | 2 +- .../manifest.json | 2 +- .../intake/complete-multi-role/manifest.json | 2 +- .../configured-nondefault-path/manifest.json | 2 +- .../server/intake/multiline/manifest.json | 2 +- .../server/intake/rotations/manifest.json | 2 +- .../server/intake/skipped-iis/manifest.json | 2 +- .../supplemental-wsus-skipped/manifest.json | 4 +- .../intake/unsorted-manifest/manifest.json | 2 +- .../manifest.json | 8 +- .../admin-service-access-denied/expected.json | 20 +- .../admin-service-auth-failure/expected.json | 54 +-- .../expected.json | 74 ++-- .../admin-service-parse-failed/expected.json | 20 +- .../admin-service-skipped/expected.json | 20 +- .../admin-service-success/expected.json | 48 +-- .../blocked-deferred/expected.json | 58 +-- .../contradictory-evidence/expected.json | 84 ++--- .../iis-supplemental/expected.json | 58 +-- .../incomplete/expected.json | 38 +- .../privacy-redaction/expected.json | 98 ++--- .../provider-authz-denied/expected.json | 54 +-- .../provider-query-failure/expected.json | 64 ++-- .../provider-retry/expected.json | 80 ++-- .../provider-source-absent/expected.json | 20 +- .../provider-source-capped/expected.json | 24 +- .../provider-source-unsupported/expected.json | 20 +- .../provider-success/expected.json | 42 +-- .../provider-timeout/expected.json | 58 +-- .../rotation-boundary/expected.json | 44 +-- .../site_core/component-failure/expected.json | 282 +++++++------- .../site_core/contradictory/expected.json | 238 ++++++------ .../server/site_core/healthy/expected.json | 98 ++--- .../site_core/inbox-backlog/expected.json | 334 +++++++++-------- .../server/site_core/incomplete/expected.json | 352 ++++++++++-------- .../server/site_core/malformed/expected.json | 140 +++---- .../server/site_core/recovery/expected.json | 178 ++++----- .../site_core/rotation-boundary/expected.json | 244 ++++++------ .../status-processing-failure/expected.json | 194 +++++----- .../tests/sccm_hierarchy_reducer.rs | 69 ++-- .../tests/sccm_server_distribution_point.rs | 159 ++++---- ...rarchy_and_replication_fixture_contract.rs | 53 ++- .../tests/sccm_server_intake.rs | 16 +- .../tests/sccm_server_management_point.rs | 3 +- .../sccm_server_provider_and_admin_service.rs | 49 ++- .../tests/sccm_server_site_core.rs | 120 ++++-- .../sccm_server_software_update_point.rs | 154 +++++++- ...sccm-409-server-intake-identity-grammar.md | 25 +- 81 files changed, 2460 insertions(+), 2095 deletions(-) diff --git a/crates/cmtraceopen-parser/src/sccm/server/windows/distribution_point.rs b/crates/cmtraceopen-parser/src/sccm/server/windows/distribution_point.rs index ea0c89bb3..35871568b 100644 --- a/crates/cmtraceopen-parser/src/sccm/server/windows/distribution_point.rs +++ b/crates/cmtraceopen-parser/src/sccm/server/windows/distribution_point.rs @@ -558,7 +558,7 @@ fn parse_distribution_point_fact( } }; let observed_distribution_point = match observation.producer_role { - SccmRole::SiteServer => observation.workflow_subject_handle.as_deref(), + SccmRole::SiteServer => observation.workflow_subject_handle.clone(), SccmRole::DistributionPoint => { canonical_dp_subject_for_host(observation.producer_host_handle.as_deref()) } @@ -566,7 +566,7 @@ fn parse_distribution_point_fact( }; let expected_terminal = expected_terminal(phase, disposition)?; if !expected_source - || observed_distribution_point != Some(distribution_point_handle) + || observed_distribution_point.as_deref() != Some(distribution_point_handle) || terminal != if expected_terminal { "true" } else { "false" } { return None; @@ -589,12 +589,9 @@ fn parse_distribution_point_fact( }) } -fn canonical_dp_subject_for_host(host: Option<&str>) -> Option<&'static str> { - match host { - Some("synthetic:host:mp-01") => Some("synthetic:subject:dp-01"), - Some("synthetic:host:wsus-01") => Some("synthetic:subject:dp-02"), - _ => None, - } +fn canonical_dp_subject_for_host(host: Option<&str>) -> Option { + let digest = synthetic_identity_digest(host?, "synthetic:host:sha256.v1:")?; + Some(format!("synthetic:subject:sha256.v1:{digest}")) } fn expected_terminal( @@ -1018,7 +1015,16 @@ fn safe_site_code(value: &str) -> bool { } fn safe_distribution_point_handle(value: &str) -> bool { - matches!(value, "synthetic:subject:dp-01" | "synthetic:subject:dp-02") + synthetic_identity_digest(value, "synthetic:subject:sha256.v1:").is_some() +} + +fn synthetic_identity_digest<'a>(value: &'a str, prefix: &str) -> Option<&'a str> { + let digest = value.strip_prefix(prefix)?; + (digest.len() == 64 + && digest + .bytes() + .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte))) + .then_some(digest) } fn intake_authority_invalid_analysis() -> SccmDistributionPointAnalysis { diff --git a/crates/cmtraceopen-parser/src/sccm/server/windows/hierarchy.rs b/crates/cmtraceopen-parser/src/sccm/server/windows/hierarchy.rs index e20c1e0b4..20a088667 100644 --- a/crates/cmtraceopen-parser/src/sccm/server/windows/hierarchy.rs +++ b/crates/cmtraceopen-parser/src/sccm/server/windows/hierarchy.rs @@ -29,102 +29,32 @@ pub const SCCM_HIERARCHY_SOURCE_VERSION: &str = "5.00.TEST"; pub const SCCM_HIERARCHY_PROFILE_VERSION: u32 = 1; const MISSING_TARGET_REASON_CODE: &str = "missingTargetReceiveProcessApply"; -// Exact raw-payload registry for the synthetic profile. A caller can invoke -// canonical intake, but cannot turn arbitrary CCM text into reviewed hierarchy -// facts by reusing one of the public fixture artifact IDs. -const SYNTHETIC_PROFILE_PAYLOADS: &[(&str, &str)] = &[ - ( - "absent-01-sender", - "e2b8000d9c61a1d8cc8fc5adf67aa09ef18c0ac83aa6c2be82bb31ab96cf7d43", - ), - ( - "backlog-01-replmgr", - "5076cad377b0161380e205b6da68743f77d9cca3b1ce38be518283f7a9b6b4a3", - ), - ( - "clock-01-sender", - "0d0f5f0e21da23617b45afeb469cd315bd250c19d61e98ceda4d8982d9b1e8c7", - ), - ( - "clock-02-despool", - "e6f19320c96b7939a25124bb8bfaa3699e9762c08e6a2f7c86d0290cd98c24a1", - ), - ( - "generic-01-sender", - "1e16a6a63b19610c91ea714fa74d82328b5d1e64f5d680d43842312c19722530", - ), - ( - "healthy-01-replmgr", - "46c5657073e106c6543283d2374dd4c16a4018288a27b2fca4f5581bd7dd0a94", - ), - ( - "healthy-01-replmgr", - "8dfae54db00614bd99b39b77dc7d6fed838be518bc2e7c44045057382303734d", - ), - ( - "healthy-01-replmgr", - "03b983e6f7282d3c919e46cc44e721521c41f0b32bf7ffd5559d9c95374f954a", - ), - ( - "healthy-02-sender", - "7147bd84db5386ecb685519a9393b26ddd1280ce179ff3bf5acac8c05f9e004a", - ), - ( - "healthy-02-sender", - "60755b460ccc3bd4c77ad30c8bf8b3e0c72091c7e9e05da8061e79c4e1799687", - ), - ( - "healthy-03-despool", - "6fecb3909732f086f2cd3ec0244a345373f6754e5e53e948a20c414ece8a6d49", - ), - ( - "healthy-04-rcmctrl", - "12b3a0d0210606312c744e38d34f54c4f4210b8e1def4acab85fbaf05cb023c7", - ), - ( - "incomplete-01-replmgr", - "179bf0e10615d0ffa0a5ec72748e79d6b8ec86e26d285d75b33592c91fbde25e", - ), - ( - "mismatch-01-sender", - "6f0813d7bf0309401adaac19ac96fe4b674ab8491d3dc5f581f529c9fa108dcd", - ), - ( - "mismatch-02-despool", - "8d08a41bc7d735ecbaae4c8dc18285f1a77b65e30fb3903fa3e83b4d7be40a8b", - ), - ( - "receiver-01-sender", - "efa57e6e8b95133d4fa1be54998eec8959e4c85ad0a28221adff44d93e48ff9f", - ), - ( - "receiver-02-despool", - "34ae490e3409e3f3f3c63257a6d72c60e73e05383b8dbdec7747856ae514bc83", - ), - ( - "recovery-01-sender", - "9ae1d3697976dfe61cf7aa3638086d91602b7f28ed41f1af4a6edc0e31b2652b", - ), - ( - "recovery-02-despool", - "c391334f761c4acb88c0dfb21edaa870ba9d8da51d315dfbc948e337fb71b2a2", - ), - ( - "rotation-01-current", - "b678f0249923f82c2fdbd3e532209c45aa81921bdbf542ba655056bb5f102705", - ), - ( - "rotation-02-lo", - "550fdcc7fae3b2f9f8586676cd964e21f265e0bc766d26c455bf816ba52221ab", - ), - ( - "sender-failure-01-chd", - "52f2b9609a19a966680e063994d2656fd93a89929e5d6a6f46978c9cfd0ddb08", - ), - ( - "sender-failure-01-chd", - "2b47b825171f2acf95895adb206f79ec65afb4c1126a535866127a1b907ba990", - ), +// Exact raw-payload registry for the synthetic profile. Admission binds to +// reviewed content, not caller-chosen artifact identifiers. +const SYNTHETIC_PROFILE_PAYLOADS: &[&str] = &[ + "e2b8000d9c61a1d8cc8fc5adf67aa09ef18c0ac83aa6c2be82bb31ab96cf7d43", + "5076cad377b0161380e205b6da68743f77d9cca3b1ce38be518283f7a9b6b4a3", + "0d0f5f0e21da23617b45afeb469cd315bd250c19d61e98ceda4d8982d9b1e8c7", + "e6f19320c96b7939a25124bb8bfaa3699e9762c08e6a2f7c86d0290cd98c24a1", + "1e16a6a63b19610c91ea714fa74d82328b5d1e64f5d680d43842312c19722530", + "46c5657073e106c6543283d2374dd4c16a4018288a27b2fca4f5581bd7dd0a94", + "8dfae54db00614bd99b39b77dc7d6fed838be518bc2e7c44045057382303734d", + "03b983e6f7282d3c919e46cc44e721521c41f0b32bf7ffd5559d9c95374f954a", + "7147bd84db5386ecb685519a9393b26ddd1280ce179ff3bf5acac8c05f9e004a", + "60755b460ccc3bd4c77ad30c8bf8b3e0c72091c7e9e05da8061e79c4e1799687", + "6fecb3909732f086f2cd3ec0244a345373f6754e5e53e948a20c414ece8a6d49", + "12b3a0d0210606312c744e38d34f54c4f4210b8e1def4acab85fbaf05cb023c7", + "179bf0e10615d0ffa0a5ec72748e79d6b8ec86e26d285d75b33592c91fbde25e", + "6f0813d7bf0309401adaac19ac96fe4b674ab8491d3dc5f581f529c9fa108dcd", + "8d08a41bc7d735ecbaae4c8dc18285f1a77b65e30fb3903fa3e83b4d7be40a8b", + "efa57e6e8b95133d4fa1be54998eec8959e4c85ad0a28221adff44d93e48ff9f", + "34ae490e3409e3f3f3c63257a6d72c60e73e05383b8dbdec7747856ae514bc83", + "9ae1d3697976dfe61cf7aa3638086d91602b7f28ed41f1af4a6edc0e31b2652b", + "c391334f761c4acb88c0dfb21edaa870ba9d8da51d315dfbc948e337fb71b2a2", + "b678f0249923f82c2fdbd3e532209c45aa81921bdbf542ba655056bb5f102705", + "550fdcc7fae3b2f9f8586676cd964e21f265e0bc766d26c455bf816ba52221ab", + "52f2b9609a19a966680e063994d2656fd93a89929e5d6a6f46978c9cfd0ddb08", + "2b47b825171f2acf95895adb206f79ec65afb4c1126a535866127a1b907ba990", ]; #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord, Serialize, Deserialize)] @@ -844,13 +774,10 @@ fn registered_profile_provenance(artifact: &SccmServerArtifactAssessment) -> boo }); artifact.profile_eligible && artifact.source_version.as_deref() == Some(SCCM_HIERARCHY_SOURCE_VERSION) - && artifact.content_sha256.as_deref().is_some_and(|digest| { - SYNTHETIC_PROFILE_PAYLOADS - .iter() - .any(|(artifact_id, expected)| { - *artifact_id == artifact.artifact_id && *expected == digest - }) - }) + && artifact + .content_sha256 + .as_deref() + .is_some_and(|digest| SYNTHETIC_PROFILE_PAYLOADS.contains(&digest)) && provenance_ok && chrono::DateTime::parse_from_rfc3339(&artifact.collected_at_utc).is_ok() && !artifact.rotation_lineage_handle.is_empty() diff --git a/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs b/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs index ce2039afc..1a22c3321 100644 --- a/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs +++ b/crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs @@ -3217,7 +3217,7 @@ fn synthetic_identity(value: &str, domain: &str) -> bool { } fn synthetic_site_code(value: &str) -> bool { - matches!(value.as_bytes(), [b'S', first, second] if first.is_ascii_digit() && second.is_ascii_digit()) + value.len() == 3 && value.bytes().all(|byte| byte.is_ascii_uppercase()) } fn synthetic_capture_host(value: &str, site_code: &str) -> bool { diff --git a/crates/cmtraceopen-parser/src/sccm/server/windows/management_point.rs b/crates/cmtraceopen-parser/src/sccm/server/windows/management_point.rs index 51367bd66..2ca198555 100644 --- a/crates/cmtraceopen-parser/src/sccm/server/windows/management_point.rs +++ b/crates/cmtraceopen-parser/src/sccm/server/windows/management_point.rs @@ -298,8 +298,8 @@ struct ReducedTransaction { /// Reduce Management Point evidence only after canonical server intake has /// admitted its topology, artifact provenance, and CCM records for the /// synthetic `mp-server-5.00.test-v1` profile. This adapter admits only the -/// literal `synthetic:site:lab` site handle and exact `5.00.TEST` source -/// version; canonical non-synthetic intake bundles intentionally return +/// structural three-character `synthetic:site:` namespace and exact `5.00.TEST` +/// source version; canonical non-synthetic intake bundles intentionally return /// [`SccmManagementPointIntakeError::TopologyMismatch`]. /// /// This is the server-intake entry point. It preserves the intake artifact IDs @@ -469,10 +469,12 @@ fn canonical_fragment_complete(artifact: &SccmServerArtifactAssessment) -> Optio } } -/// Maps the sole synthetic site handle admitted by this adapter. Opaque -/// production handles intentionally do not select the test-only profile. +/// Maps the structural three-character synthetic site namespace admitted by this adapter. +/// Opaque production handles intentionally do not select the test-only profile. fn canonical_intake_site_code(site_handle: &str) -> Option { - (site_handle == "synthetic:site:lab").then(|| "LAB".to_owned()) + let site_code = site_handle.strip_prefix("synthetic:site:")?; + (site_code.len() == 3 && site_code.bytes().all(|byte| byte.is_ascii_alphanumeric())) + .then(|| site_code.to_ascii_uppercase()) } fn management_point_profile_is_admitted(artifact: &SccmServerArtifactAssessment) -> bool { @@ -1328,19 +1330,21 @@ fn valid_safe_handle(value: &str, prefix: &str) -> bool { fn valid_management_point_handle(value: &str) -> bool { valid_safe_handle(value, "safe:mp:") - || value == "synthetic:host:mp-01" + || sha256_handle(value, "synthetic:host:sha256.v1:") || opaque_host_handle(value) } fn opaque_host_handle(value: &str) -> bool { - value - .strip_prefix("cmtraceopen.host.sha256.v1:") - .is_some_and(|digest| { - digest.len() == 64 - && digest - .bytes() - .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte)) - }) + sha256_handle(value, "cmtraceopen.host.sha256.v1:") +} + +fn sha256_handle(value: &str, prefix: &str) -> bool { + value.strip_prefix(prefix).is_some_and(|digest| { + digest.len() == 64 + && digest + .bytes() + .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte)) + }) } #[cfg(test)] diff --git a/crates/cmtraceopen-parser/src/sccm/server/windows/management_point_tests.rs b/crates/cmtraceopen-parser/src/sccm/server/windows/management_point_tests.rs index 5f301867f..27d4ae017 100644 --- a/crates/cmtraceopen-parser/src/sccm/server/windows/management_point_tests.rs +++ b/crates/cmtraceopen-parser/src/sccm/server/windows/management_point_tests.rs @@ -637,7 +637,7 @@ fn canonical_intake_adapter_uses_assessed_mp_evidence_and_rejects_mismatches() { assert!(analysis.source_local_observations[0] .evidence .iter() - .all(|reference| reference.artifact_id == "mp-policy-current")); + .all(|reference| reference.artifact_id == "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53")); let mut supplemental_iis = assessment.clone(); let mut iis_artifact = supplemental_iis.artifacts[0].clone(); @@ -871,8 +871,10 @@ fn canonical_intake_coverage_rows_distinguished_by_producer_host_reach_topology_ let fingerprint = manifest["artifacts"][0]["configuredPathProvenance"]["pathFingerprint"].clone(); let lineage = manifest["artifacts"][0]["rotation"]["lineageId"].clone(); - manifest["artifacts"][1]["producerHostHandle"] = - Value::String("synthetic:host:site-01".to_owned()); + manifest["artifacts"][1]["producerHostHandle"] = Value::String( + "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339" + .to_owned(), + ); manifest["artifacts"][1]["configuredPathProvenance"]["pathFingerprint"] = fingerprint; manifest["artifacts"][1]["rotation"]["lineageId"] = lineage; @@ -892,7 +894,10 @@ fn canonical_intake_coverage_rows_distinguished_by_producer_host_reach_topology_ .iter() .map(|record| record.producer_host_handle.as_deref()) .collect::>(), - vec![Some("synthetic:host:mp-01"), Some("synthetic:host:site-01")], + vec![ + Some("synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f"), + Some("synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339"), + ], ); assert!( @@ -926,7 +931,7 @@ fn canonical_intake_adapter_accepts_coverage_rows_distinguished_by_workflow_subj let artifact = &mut manifest["artifacts"][3]; artifact["workflowSubject"] = json!({ "role": "distributionPoint", - "instanceHandle": "synthetic:subject:dp-02", + "instanceHandle": "synthetic:subject:sha256.v1:b7f6d3e42b018582c500e7f0abcbb3d976bc45df22eb889e14c5e8b58902a299", }); artifact["sourceId"] = Value::String("server-dp-distribution".to_owned()); artifact["originalPath"] = Value::String("REDACTED_SITE_DP_CONTROL_ROOT_COPY".to_owned()); @@ -954,8 +959,8 @@ fn canonical_intake_adapter_accepts_coverage_rows_distinguished_by_workflow_subj .map(|record| record.workflow_subject_handle.as_deref()) .collect::>(), vec![ - Some("synthetic:subject:dp-01"), - Some("synthetic:subject:dp-02"), + Some("synthetic:subject:sha256.v1:303b321cad551bed85d9b6d366165e1cb287c824090779eadea5673cbeeacf33"), + Some("synthetic:subject:sha256.v1:b7f6d3e42b018582c500e7f0abcbb3d976bc45df22eb889e14c5e8b58902a299"), ], ); @@ -1041,7 +1046,7 @@ fn canonical_intake_adapter_rejects_promoted_capped_profile_ineligible_metadata( .remove("sourceVersion"); let manifest_json = serde_json::to_string(&manifest).expect("manifest serializes"); let payloads = vec![SccmServerArtifactPayload { - manifest_artifact_id: "sup-sync-capped".to_owned(), + manifest_artifact_id: "synthetic:artifact:sha256.v1:8ffd2bfbfcd641204b0108f4d880ef9aae8472e9cde9abc4da5207791e09f47a".to_owned(), bytes: fs::read(directory.join( "evidence/sccm/server/site-server/server-sup-sync/subject-software-update-point/instance-17eae15500d8968f/root-b11afca548220198/current/wsyncmgr.log", )) diff --git a/crates/cmtraceopen-parser/src/sccm/server/windows/site_core.rs b/crates/cmtraceopen-parser/src/sccm/server/windows/site_core.rs index d7b9b3513..e95d0718e 100644 --- a/crates/cmtraceopen-parser/src/sccm/server/windows/site_core.rs +++ b/crates/cmtraceopen-parser/src/sccm/server/windows/site_core.rs @@ -699,13 +699,7 @@ fn source_shape_is_valid(artifact: &SccmServerArtifactAssessment, group: SiteCor && artifact .producer_host_handle .as_deref() - .is_some_and(|host| { - !host.is_empty() - && host.len() <= 256 - && host.bytes().all(|byte| { - byte.is_ascii_alphanumeric() || matches!(byte, b':' | b'-' | b'_') - }) - }) + .is_some_and(safe_site_core_host) } fn expected_evidence_component(artifact: &SccmServerArtifactAssessment) -> Option<&'static str> { @@ -2004,6 +1998,23 @@ fn safe_site_core_opaque_id(value: &str) -> bool { .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b'.' | b':' | b'_' | b'-')) } +fn safe_site_core_host(value: &str) -> bool { + let existing_opaque_shape = !value.is_empty() + && value.len() <= 256 + && value + .bytes() + .all(|byte| byte.is_ascii_alphanumeric() || matches!(byte, b':' | b'-' | b'_')); + let synthetic_digest = value + .strip_prefix("synthetic:host:sha256.v1:") + .is_some_and(|digest| { + digest.len() == 64 + && digest + .bytes() + .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte)) + }); + existing_opaque_shape || synthetic_digest +} + fn mark_repeated_keys<'a>(unique: &mut [bool], keys: impl Iterator) { let mut positions = BTreeMap::<&str, Vec>::new(); for (position, key) in keys.enumerate() { diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/absent-dp/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/absent-dp/expected.json index 70d5d6fca..a1100c5b4 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/absent-dp/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/absent-dp/expected.json @@ -19,7 +19,7 @@ "coverageGaps": [ { "artifactIds": [ - "dp-absent-02-provider" + "synthetic:artifact:sha256.v1:fb2e402e1fbf5535663e1b2b3c3f018dd681cbba87c924e0a1968efa10c5da7c" ], "producerRole": "distributionPoint", "reason": "Distribution Point source coverage is absent; recollect the declared source without changing its state.", @@ -29,7 +29,7 @@ }, { "artifactIds": [ - "dp-absent-01-distmgr" + "synthetic:artifact:sha256.v1:efc91a21e86562fbd3ac33a2ac867338e40ed93cd76748fe966411bede9b4d41" ], "producerRole": "siteServer", "reason": "Distribution Point source coverage is absent; recollect the declared source without changing its state.", diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/backlog-blocked/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/backlog-blocked/expected.json index e4bdd9a58..802b9bf76 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/backlog-blocked/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/backlog-blocked/expected.json @@ -21,20 +21,20 @@ "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-backlog-blocked-01-distmgr", - "entryId": "dp-backlog-blocked-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:69de6aa9ca426d7f8f3477b7ccc99b7223d982b0849cacd22c70c8f40a8f1840", + "entryId": "synthetic:artifact:sha256.v1:69de6aa9ca426d7f8f3477b7ccc99b7223d982b0849cacd22c70c8f40a8f1840:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-backlog-blocked-01-distmgr", - "entryId": "dp-backlog-blocked-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:69de6aa9ca426d7f8f3477b7ccc99b7223d982b0849cacd22c70c8f40a8f1840", + "entryId": "synthetic:artifact:sha256.v1:69de6aa9ca426d7f8f3477b7ccc99b7223d982b0849cacd22c70c8f40a8f1840:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-backlog-blocked-02-pkgxfer", - "entryId": "dp-backlog-blocked-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:d60c73e9ff1013dd437b14d18c061526dc81e5aa2bbfec8de537c2b13e40e1ae", + "entryId": "synthetic:artifact:sha256.v1:d60c73e9ff1013dd437b14d18c061526dc81e5aa2bbfec8de537c2b13e40e1ae:1-1", "lineEnd": 1, "lineStart": 1 } @@ -42,7 +42,7 @@ "key": { "contentId": "content-theta", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00008", @@ -59,8 +59,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-backlog-blocked-01-distmgr", - "entryId": "dp-backlog-blocked-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:69de6aa9ca426d7f8f3477b7ccc99b7223d982b0849cacd22c70c8f40a8f1840", + "entryId": "synthetic:artifact:sha256.v1:69de6aa9ca426d7f8f3477b7ccc99b7223d982b0849cacd22c70c8f40a8f1840:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -77,8 +77,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-backlog-blocked-01-distmgr", - "entryId": "dp-backlog-blocked-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:69de6aa9ca426d7f8f3477b7ccc99b7223d982b0849cacd22c70c8f40a8f1840", + "entryId": "synthetic:artifact:sha256.v1:69de6aa9ca426d7f8f3477b7ccc99b7223d982b0849cacd22c70c8f40a8f1840:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -95,8 +95,8 @@ { "disposition": "blocked", "evidence": { - "artifactId": "dp-backlog-blocked-02-pkgxfer", - "entryId": "dp-backlog-blocked-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:d60c73e9ff1013dd437b14d18c061526dc81e5aa2bbfec8de537c2b13e40e1ae", + "entryId": "synthetic:artifact:sha256.v1:d60c73e9ff1013dd437b14d18c061526dc81e5aa2bbfec8de537c2b13e40e1ae:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -117,7 +117,7 @@ "state": "blocked", "stopPhase": "transfer", "terminalEvidence": [], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00008:content=content-theta:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00008:content=content-theta:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/content-version-mismatch/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/content-version-mismatch/expected.json index cbd5af777..143b94e7a 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/content-version-mismatch/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/content-version-mismatch/expected.json @@ -18,35 +18,35 @@ { "classification": "success", "confidence": "medium", - "contentVersionMismatch": true, + "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-version-01-distmgr", - "entryId": "dp-version-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:aa40a5a4798fa109c3f9062023929b7155c4362082353caa0b74798d317572d8", + "entryId": "synthetic:artifact:sha256.v1:aa40a5a4798fa109c3f9062023929b7155c4362082353caa0b74798d317572d8:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-version-01-distmgr", - "entryId": "dp-version-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:aa40a5a4798fa109c3f9062023929b7155c4362082353caa0b74798d317572d8", + "entryId": "synthetic:artifact:sha256.v1:aa40a5a4798fa109c3f9062023929b7155c4362082353caa0b74798d317572d8:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-version-02-pkgxfer", - "entryId": "dp-version-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:c1f12e6949c17d283542bcc15069ecb3fc6609a47cbad17b3319712bdc1d513b", + "entryId": "synthetic:artifact:sha256.v1:c1f12e6949c17d283542bcc15069ecb3fc6609a47cbad17b3319712bdc1d513b:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-version-03-provider", - "entryId": "dp-version-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:81a74fd31efa3b011d89ed221579cd2867d5b9b80253fee456ed6e9a3a81e654", + "entryId": "synthetic:artifact:sha256.v1:81a74fd31efa3b011d89ed221579cd2867d5b9b80253fee456ed6e9a3a81e654:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-version-03-provider", - "entryId": "dp-version-03-provider:2-2", + "artifactId": "synthetic:artifact:sha256.v1:81a74fd31efa3b011d89ed221579cd2867d5b9b80253fee456ed6e9a3a81e654", + "entryId": "synthetic:artifact:sha256.v1:81a74fd31efa3b011d89ed221579cd2867d5b9b80253fee456ed6e9a3a81e654:2-2", "lineEnd": 2, "lineStart": 2 } @@ -54,7 +54,7 @@ "key": { "contentId": "content-epsilon", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:404acc0782eaaec91bb24fdc96507f876aead18fed7010ee1daf1a6f9e3db528", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00005", @@ -67,8 +67,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-01-distmgr", - "entryId": "dp-version-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:aa40a5a4798fa109c3f9062023929b7155c4362082353caa0b74798d317572d8", + "entryId": "synthetic:artifact:sha256.v1:aa40a5a4798fa109c3f9062023929b7155c4362082353caa0b74798d317572d8:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -78,15 +78,15 @@ "timestamp": { "offsetMinutes": 0, "orderingState": "normalizedUtc", - "originalDisplay": "07-30-2026 12:05:00.000", - "utcMillis": 1785413100000 + "originalDisplay": "07-30-2026 12:10:00.000", + "utcMillis": 1785413400000 } }, { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-01-distmgr", - "entryId": "dp-version-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:aa40a5a4798fa109c3f9062023929b7155c4362082353caa0b74798d317572d8", + "entryId": "synthetic:artifact:sha256.v1:aa40a5a4798fa109c3f9062023929b7155c4362082353caa0b74798d317572d8:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -96,15 +96,15 @@ "timestamp": { "offsetMinutes": 0, "orderingState": "normalizedUtc", - "originalDisplay": "07-30-2026 12:05:01.000", - "utcMillis": 1785413101000 + "originalDisplay": "07-30-2026 12:10:01.000", + "utcMillis": 1785413401000 } }, { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-02-pkgxfer", - "entryId": "dp-version-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:c1f12e6949c17d283542bcc15069ecb3fc6609a47cbad17b3319712bdc1d513b", + "entryId": "synthetic:artifact:sha256.v1:c1f12e6949c17d283542bcc15069ecb3fc6609a47cbad17b3319712bdc1d513b:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -114,15 +114,15 @@ "timestamp": { "offsetMinutes": 0, "orderingState": "normalizedUtc", - "originalDisplay": "07-30-2026 12:05:02.000", - "utcMillis": 1785413102000 + "originalDisplay": "07-30-2026 12:10:02.000", + "utcMillis": 1785413402000 } }, { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-03-provider", - "entryId": "dp-version-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:81a74fd31efa3b011d89ed221579cd2867d5b9b80253fee456ed6e9a3a81e654", + "entryId": "synthetic:artifact:sha256.v1:81a74fd31efa3b011d89ed221579cd2867d5b9b80253fee456ed6e9a3a81e654:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -132,15 +132,15 @@ "timestamp": { "offsetMinutes": 0, "orderingState": "normalizedUtc", - "originalDisplay": "07-30-2026 12:05:03.000", - "utcMillis": 1785413103000 + "originalDisplay": "07-30-2026 12:10:03.000", + "utcMillis": 1785413403000 } }, { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-03-provider", - "entryId": "dp-version-03-provider:2-2", + "artifactId": "synthetic:artifact:sha256.v1:81a74fd31efa3b011d89ed221579cd2867d5b9b80253fee456ed6e9a3a81e654", + "entryId": "synthetic:artifact:sha256.v1:81a74fd31efa3b011d89ed221579cd2867d5b9b80253fee456ed6e9a3a81e654:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -150,8 +150,8 @@ "timestamp": { "offsetMinutes": 0, "orderingState": "normalizedUtc", - "originalDisplay": "07-30-2026 12:05:04.000", - "utcMillis": 1785413104000 + "originalDisplay": "07-30-2026 12:10:04.000", + "utcMillis": 1785413404000 } } ], @@ -161,40 +161,40 @@ "state": "succeeded", "stopPhase": null, "terminalEvidence": [], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00005:content=content-epsilon:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00005:content=content-epsilon:content-version=1:dp=synthetic:subject:sha256.v1:404acc0782eaaec91bb24fdc96507f876aead18fed7010ee1daf1a6f9e3db528:profile=dp-server-5.00.test-v1:profile-version=1" }, { "classification": "success", "confidence": "medium", - "contentVersionMismatch": false, + "contentVersionMismatch": true, "evidence": [ { - "artifactId": "dp-version-05-distmgr-dp02", - "entryId": "dp-version-05-distmgr-dp02:1-1", + "artifactId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5", + "entryId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-version-05-distmgr-dp02", - "entryId": "dp-version-05-distmgr-dp02:2-2", + "artifactId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5", + "entryId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-version-06-pkgxfer-dp02", - "entryId": "dp-version-06-pkgxfer-dp02:1-1", + "artifactId": "synthetic:artifact:sha256.v1:09435feb3c4103f06c75e23b25288c4b31b6b6563cae013c8ac4a38d4681bdf1", + "entryId": "synthetic:artifact:sha256.v1:09435feb3c4103f06c75e23b25288c4b31b6b6563cae013c8ac4a38d4681bdf1:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-version-04-provider-dp02", - "entryId": "dp-version-04-provider-dp02:1-1", + "artifactId": "synthetic:artifact:sha256.v1:0b62a96e835cb37ffc95eac300752a21ada6a0399913bddbbc0d5673543e5d7c", + "entryId": "synthetic:artifact:sha256.v1:0b62a96e835cb37ffc95eac300752a21ada6a0399913bddbbc0d5673543e5d7c:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-version-04-provider-dp02", - "entryId": "dp-version-04-provider-dp02:2-2", + "artifactId": "synthetic:artifact:sha256.v1:0b62a96e835cb37ffc95eac300752a21ada6a0399913bddbbc0d5673543e5d7c", + "entryId": "synthetic:artifact:sha256.v1:0b62a96e835cb37ffc95eac300752a21ada6a0399913bddbbc0d5673543e5d7c:2-2", "lineEnd": 2, "lineStart": 2 } @@ -202,7 +202,7 @@ "key": { "contentId": "content-epsilon", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-02", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00005", @@ -215,8 +215,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-05-distmgr-dp02", - "entryId": "dp-version-05-distmgr-dp02:1-1", + "artifactId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5", + "entryId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -226,15 +226,15 @@ "timestamp": { "offsetMinutes": 0, "orderingState": "normalizedUtc", - "originalDisplay": "07-30-2026 12:10:00.000", - "utcMillis": 1785413400000 + "originalDisplay": "07-30-2026 12:05:00.000", + "utcMillis": 1785413100000 } }, { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-05-distmgr-dp02", - "entryId": "dp-version-05-distmgr-dp02:2-2", + "artifactId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5", + "entryId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -244,15 +244,15 @@ "timestamp": { "offsetMinutes": 0, "orderingState": "normalizedUtc", - "originalDisplay": "07-30-2026 12:10:01.000", - "utcMillis": 1785413401000 + "originalDisplay": "07-30-2026 12:05:01.000", + "utcMillis": 1785413101000 } }, { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-06-pkgxfer-dp02", - "entryId": "dp-version-06-pkgxfer-dp02:1-1", + "artifactId": "synthetic:artifact:sha256.v1:09435feb3c4103f06c75e23b25288c4b31b6b6563cae013c8ac4a38d4681bdf1", + "entryId": "synthetic:artifact:sha256.v1:09435feb3c4103f06c75e23b25288c4b31b6b6563cae013c8ac4a38d4681bdf1:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -262,15 +262,15 @@ "timestamp": { "offsetMinutes": 0, "orderingState": "normalizedUtc", - "originalDisplay": "07-30-2026 12:10:02.000", - "utcMillis": 1785413402000 + "originalDisplay": "07-30-2026 12:05:02.000", + "utcMillis": 1785413102000 } }, { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-04-provider-dp02", - "entryId": "dp-version-04-provider-dp02:1-1", + "artifactId": "synthetic:artifact:sha256.v1:0b62a96e835cb37ffc95eac300752a21ada6a0399913bddbbc0d5673543e5d7c", + "entryId": "synthetic:artifact:sha256.v1:0b62a96e835cb37ffc95eac300752a21ada6a0399913bddbbc0d5673543e5d7c:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -280,15 +280,15 @@ "timestamp": { "offsetMinutes": 0, "orderingState": "normalizedUtc", - "originalDisplay": "07-30-2026 12:10:03.000", - "utcMillis": 1785413403000 + "originalDisplay": "07-30-2026 12:05:03.000", + "utcMillis": 1785413103000 } }, { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-04-provider-dp02", - "entryId": "dp-version-04-provider-dp02:2-2", + "artifactId": "synthetic:artifact:sha256.v1:0b62a96e835cb37ffc95eac300752a21ada6a0399913bddbbc0d5673543e5d7c", + "entryId": "synthetic:artifact:sha256.v1:0b62a96e835cb37ffc95eac300752a21ada6a0399913bddbbc0d5673543e5d7c:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -298,8 +298,8 @@ "timestamp": { "offsetMinutes": 0, "orderingState": "normalizedUtc", - "originalDisplay": "07-30-2026 12:10:04.000", - "utcMillis": 1785413404000 + "originalDisplay": "07-30-2026 12:05:04.000", + "utcMillis": 1785413104000 } } ], @@ -309,7 +309,7 @@ "state": "succeeded", "stopPhase": null, "terminalEvidence": [], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00005:content=content-epsilon:content-version=1:dp=synthetic:subject:dp-02:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00005:content=content-epsilon:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" }, { "classification": "blockedOrDeferred", @@ -317,20 +317,20 @@ "contentVersionMismatch": true, "evidence": [ { - "artifactId": "dp-version-01-distmgr", - "entryId": "dp-version-01-distmgr:3-3", + "artifactId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5", + "entryId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5:3-3", "lineEnd": 3, "lineStart": 3 }, { - "artifactId": "dp-version-01-distmgr", - "entryId": "dp-version-01-distmgr:4-4", + "artifactId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5", + "entryId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5:4-4", "lineEnd": 4, "lineStart": 4 }, { - "artifactId": "dp-version-02-pkgxfer", - "entryId": "dp-version-02-pkgxfer:2-2", + "artifactId": "synthetic:artifact:sha256.v1:09435feb3c4103f06c75e23b25288c4b31b6b6563cae013c8ac4a38d4681bdf1", + "entryId": "synthetic:artifact:sha256.v1:09435feb3c4103f06c75e23b25288c4b31b6b6563cae013c8ac4a38d4681bdf1:2-2", "lineEnd": 2, "lineStart": 2 } @@ -338,7 +338,7 @@ "key": { "contentId": "content-epsilon", "contentVersion": 2, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00005", @@ -355,8 +355,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-01-distmgr", - "entryId": "dp-version-01-distmgr:3-3", + "artifactId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5", + "entryId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5:3-3", "lineEnd": 3, "lineStart": 3 }, @@ -373,8 +373,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-version-01-distmgr", - "entryId": "dp-version-01-distmgr:4-4", + "artifactId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5", + "entryId": "synthetic:artifact:sha256.v1:7cc42853582107362794bb55a402e89e955cbbb023595206eb67d483496a48f5:4-4", "lineEnd": 4, "lineStart": 4 }, @@ -391,8 +391,8 @@ { "disposition": "retrying", "evidence": { - "artifactId": "dp-version-02-pkgxfer", - "entryId": "dp-version-02-pkgxfer:2-2", + "artifactId": "synthetic:artifact:sha256.v1:09435feb3c4103f06c75e23b25288c4b31b6b6563cae013c8ac4a38d4681bdf1", + "entryId": "synthetic:artifact:sha256.v1:09435feb3c4103f06c75e23b25288c4b31b6b6563cae013c8ac4a38d4681bdf1:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -413,7 +413,7 @@ "state": "retrying", "stopPhase": "transfer", "terminalEvidence": [], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00005:content=content-epsilon:content-version=2:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00005:content=content-epsilon:content-version=2:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/contradiction-recovery/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/contradiction-recovery/expected.json index 22653652c..2e5dadc63 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/contradiction-recovery/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/contradiction-recovery/expected.json @@ -15,38 +15,38 @@ "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-recovery-01-distmgr", - "entryId": "dp-recovery-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:628c19cf1b9ea5d8162df44950bbeccfabf98e42d40a1b43ab2d0382e09ee699", + "entryId": "synthetic:artifact:sha256.v1:628c19cf1b9ea5d8162df44950bbeccfabf98e42d40a1b43ab2d0382e09ee699:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-recovery-01-distmgr", - "entryId": "dp-recovery-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:628c19cf1b9ea5d8162df44950bbeccfabf98e42d40a1b43ab2d0382e09ee699", + "entryId": "synthetic:artifact:sha256.v1:628c19cf1b9ea5d8162df44950bbeccfabf98e42d40a1b43ab2d0382e09ee699:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-recovery-02-pkgxfer", - "entryId": "dp-recovery-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1b07c9a0006563c19cba0b0acc384f7865547dd5c9107cc80a9ea4db08e986d4", + "entryId": "synthetic:artifact:sha256.v1:1b07c9a0006563c19cba0b0acc384f7865547dd5c9107cc80a9ea4db08e986d4:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-recovery-02-pkgxfer", - "entryId": "dp-recovery-02-pkgxfer:2-2", + "artifactId": "synthetic:artifact:sha256.v1:1b07c9a0006563c19cba0b0acc384f7865547dd5c9107cc80a9ea4db08e986d4", + "entryId": "synthetic:artifact:sha256.v1:1b07c9a0006563c19cba0b0acc384f7865547dd5c9107cc80a9ea4db08e986d4:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-recovery-03-provider", - "entryId": "dp-recovery-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:45dc07bc27e1115f1108ec9420799341607f583dc1f900184f0acb4a6f006f69", + "entryId": "synthetic:artifact:sha256.v1:45dc07bc27e1115f1108ec9420799341607f583dc1f900184f0acb4a6f006f69:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-recovery-03-provider", - "entryId": "dp-recovery-03-provider:2-2", + "artifactId": "synthetic:artifact:sha256.v1:45dc07bc27e1115f1108ec9420799341607f583dc1f900184f0acb4a6f006f69", + "entryId": "synthetic:artifact:sha256.v1:45dc07bc27e1115f1108ec9420799341607f583dc1f900184f0acb4a6f006f69:2-2", "lineEnd": 2, "lineStart": 2 } @@ -54,7 +54,7 @@ "key": { "contentId": "content-kappa", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00010", @@ -67,8 +67,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-recovery-01-distmgr", - "entryId": "dp-recovery-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:628c19cf1b9ea5d8162df44950bbeccfabf98e42d40a1b43ab2d0382e09ee699", + "entryId": "synthetic:artifact:sha256.v1:628c19cf1b9ea5d8162df44950bbeccfabf98e42d40a1b43ab2d0382e09ee699:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -85,8 +85,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-recovery-01-distmgr", - "entryId": "dp-recovery-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:628c19cf1b9ea5d8162df44950bbeccfabf98e42d40a1b43ab2d0382e09ee699", + "entryId": "synthetic:artifact:sha256.v1:628c19cf1b9ea5d8162df44950bbeccfabf98e42d40a1b43ab2d0382e09ee699:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -103,8 +103,8 @@ { "disposition": "failed", "evidence": { - "artifactId": "dp-recovery-02-pkgxfer", - "entryId": "dp-recovery-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1b07c9a0006563c19cba0b0acc384f7865547dd5c9107cc80a9ea4db08e986d4", + "entryId": "synthetic:artifact:sha256.v1:1b07c9a0006563c19cba0b0acc384f7865547dd5c9107cc80a9ea4db08e986d4:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -121,8 +121,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-recovery-02-pkgxfer", - "entryId": "dp-recovery-02-pkgxfer:2-2", + "artifactId": "synthetic:artifact:sha256.v1:1b07c9a0006563c19cba0b0acc384f7865547dd5c9107cc80a9ea4db08e986d4", + "entryId": "synthetic:artifact:sha256.v1:1b07c9a0006563c19cba0b0acc384f7865547dd5c9107cc80a9ea4db08e986d4:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -139,8 +139,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-recovery-03-provider", - "entryId": "dp-recovery-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:45dc07bc27e1115f1108ec9420799341607f583dc1f900184f0acb4a6f006f69", + "entryId": "synthetic:artifact:sha256.v1:45dc07bc27e1115f1108ec9420799341607f583dc1f900184f0acb4a6f006f69:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -157,8 +157,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-recovery-03-provider", - "entryId": "dp-recovery-03-provider:2-2", + "artifactId": "synthetic:artifact:sha256.v1:45dc07bc27e1115f1108ec9420799341607f583dc1f900184f0acb4a6f006f69", + "entryId": "synthetic:artifact:sha256.v1:45dc07bc27e1115f1108ec9420799341607f583dc1f900184f0acb4a6f006f69:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -180,13 +180,13 @@ "stopPhase": null, "terminalEvidence": [ { - "artifactId": "dp-recovery-02-pkgxfer", - "entryId": "dp-recovery-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1b07c9a0006563c19cba0b0acc384f7865547dd5c9107cc80a9ea4db08e986d4", + "entryId": "synthetic:artifact:sha256.v1:1b07c9a0006563c19cba0b0acc384f7865547dd5c9107cc80a9ea4db08e986d4:1-1", "lineEnd": 1, "lineStart": 1 } ], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00010:content=content-kappa:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00010:content=content-kappa:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/distribution-failure/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/distribution-failure/expected.json index 3394ffeb1..40f769085 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/distribution-failure/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/distribution-failure/expected.json @@ -15,14 +15,14 @@ "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-distribution-failure-01-distmgr", - "entryId": "dp-distribution-failure-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:55a84f7a94798311da069498db66a772201b115d52dd90157d72246ad851b2e9", + "entryId": "synthetic:artifact:sha256.v1:55a84f7a94798311da069498db66a772201b115d52dd90157d72246ad851b2e9:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-distribution-failure-01-distmgr", - "entryId": "dp-distribution-failure-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:55a84f7a94798311da069498db66a772201b115d52dd90157d72246ad851b2e9", + "entryId": "synthetic:artifact:sha256.v1:55a84f7a94798311da069498db66a772201b115d52dd90157d72246ad851b2e9:2-2", "lineEnd": 2, "lineStart": 2 } @@ -30,7 +30,7 @@ "key": { "contentId": "content-beta", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00002", @@ -43,8 +43,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-distribution-failure-01-distmgr", - "entryId": "dp-distribution-failure-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:55a84f7a94798311da069498db66a772201b115d52dd90157d72246ad851b2e9", + "entryId": "synthetic:artifact:sha256.v1:55a84f7a94798311da069498db66a772201b115d52dd90157d72246ad851b2e9:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -61,8 +61,8 @@ { "disposition": "failed", "evidence": { - "artifactId": "dp-distribution-failure-01-distmgr", - "entryId": "dp-distribution-failure-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:55a84f7a94798311da069498db66a772201b115d52dd90157d72246ad851b2e9", + "entryId": "synthetic:artifact:sha256.v1:55a84f7a94798311da069498db66a772201b115d52dd90157d72246ad851b2e9:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -84,13 +84,13 @@ "stopPhase": "distribute", "terminalEvidence": [ { - "artifactId": "dp-distribution-failure-01-distmgr", - "entryId": "dp-distribution-failure-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:55a84f7a94798311da069498db66a772201b115d52dd90157d72246ad851b2e9", + "entryId": "synthetic:artifact:sha256.v1:55a84f7a94798311da069498db66a772201b115d52dd90157d72246ad851b2e9:2-2", "lineEnd": 2, "lineStart": 2 } ], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00002:content=content-beta:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00002:content=content-beta:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/healthy-package/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/healthy-package/expected.json index 88f63f1d4..bec9d72e0 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/healthy-package/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/healthy-package/expected.json @@ -15,32 +15,32 @@ "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-healthy-01-distmgr", - "entryId": "dp-healthy-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:7d752d27851293831f0be0854c119a77a0315c5518e24396c9aff71aa602da2f", + "entryId": "synthetic:artifact:sha256.v1:7d752d27851293831f0be0854c119a77a0315c5518e24396c9aff71aa602da2f:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-healthy-01-distmgr", - "entryId": "dp-healthy-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:7d752d27851293831f0be0854c119a77a0315c5518e24396c9aff71aa602da2f", + "entryId": "synthetic:artifact:sha256.v1:7d752d27851293831f0be0854c119a77a0315c5518e24396c9aff71aa602da2f:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-healthy-02-pkgxfer", - "entryId": "dp-healthy-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1e3e3170c66a1685e2c6bc567c3285d6e1588b7367e0e59d3f6f3843b50e3b0b", + "entryId": "synthetic:artifact:sha256.v1:1e3e3170c66a1685e2c6bc567c3285d6e1588b7367e0e59d3f6f3843b50e3b0b:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-healthy-03-provider", - "entryId": "dp-healthy-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:272499e352cea0bb75ce2177210f3dfb97fd1d6a69b942e76645f73b8a915a0c", + "entryId": "synthetic:artifact:sha256.v1:272499e352cea0bb75ce2177210f3dfb97fd1d6a69b942e76645f73b8a915a0c:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-healthy-03-provider", - "entryId": "dp-healthy-03-provider:2-2", + "artifactId": "synthetic:artifact:sha256.v1:272499e352cea0bb75ce2177210f3dfb97fd1d6a69b942e76645f73b8a915a0c", + "entryId": "synthetic:artifact:sha256.v1:272499e352cea0bb75ce2177210f3dfb97fd1d6a69b942e76645f73b8a915a0c:2-2", "lineEnd": 2, "lineStart": 2 } @@ -48,7 +48,7 @@ "key": { "contentId": "content-alpha", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00001", @@ -61,8 +61,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-healthy-01-distmgr", - "entryId": "dp-healthy-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:7d752d27851293831f0be0854c119a77a0315c5518e24396c9aff71aa602da2f", + "entryId": "synthetic:artifact:sha256.v1:7d752d27851293831f0be0854c119a77a0315c5518e24396c9aff71aa602da2f:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -79,8 +79,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-healthy-01-distmgr", - "entryId": "dp-healthy-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:7d752d27851293831f0be0854c119a77a0315c5518e24396c9aff71aa602da2f", + "entryId": "synthetic:artifact:sha256.v1:7d752d27851293831f0be0854c119a77a0315c5518e24396c9aff71aa602da2f:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -97,8 +97,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-healthy-02-pkgxfer", - "entryId": "dp-healthy-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1e3e3170c66a1685e2c6bc567c3285d6e1588b7367e0e59d3f6f3843b50e3b0b", + "entryId": "synthetic:artifact:sha256.v1:1e3e3170c66a1685e2c6bc567c3285d6e1588b7367e0e59d3f6f3843b50e3b0b:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -115,8 +115,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-healthy-03-provider", - "entryId": "dp-healthy-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:272499e352cea0bb75ce2177210f3dfb97fd1d6a69b942e76645f73b8a915a0c", + "entryId": "synthetic:artifact:sha256.v1:272499e352cea0bb75ce2177210f3dfb97fd1d6a69b942e76645f73b8a915a0c:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -133,8 +133,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-healthy-03-provider", - "entryId": "dp-healthy-03-provider:2-2", + "artifactId": "synthetic:artifact:sha256.v1:272499e352cea0bb75ce2177210f3dfb97fd1d6a69b942e76645f73b8a915a0c", + "entryId": "synthetic:artifact:sha256.v1:272499e352cea0bb75ce2177210f3dfb97fd1d6a69b942e76645f73b8a915a0c:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -155,7 +155,7 @@ "state": "succeeded", "stopPhase": null, "terminalEvidence": [], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00001:content=content-alpha:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00001:content=content-alpha:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/incomplete/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/incomplete/expected.json index 8cb3d4c58..18440f0e5 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/incomplete/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/incomplete/expected.json @@ -19,7 +19,7 @@ "coverageGaps": [ { "artifactIds": [ - "dp-incomplete-03-provider-absent" + "synthetic:artifact:sha256.v1:fb7c7171033eb902da21c8381fd7e6194d9f45d05f3d3916ee4ea94d47e0f643" ], "producerRole": "distributionPoint", "reason": "Distribution Point source coverage is absent; recollect the declared source without changing its state.", @@ -29,7 +29,7 @@ }, { "artifactIds": [ - "dp-incomplete-02-pkgxfer-denied" + "synthetic:artifact:sha256.v1:726ac8490c014561cfb86db2cf953ca3abbb40c1850e7f77c3fef53f95a9aeec" ], "producerRole": "siteServer", "reason": "Distribution Point source coverage is accessDenied; recollect the declared source without changing its state.", @@ -52,14 +52,14 @@ "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-incomplete-01-distmgr", - "entryId": "dp-incomplete-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1f70befc7be3ce7bd4126163b15e4d064c5d2b67c5789ce14d95b6d03d701030", + "entryId": "synthetic:artifact:sha256.v1:1f70befc7be3ce7bd4126163b15e4d064c5d2b67c5789ce14d95b6d03d701030:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-incomplete-01-distmgr", - "entryId": "dp-incomplete-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:1f70befc7be3ce7bd4126163b15e4d064c5d2b67c5789ce14d95b6d03d701030", + "entryId": "synthetic:artifact:sha256.v1:1f70befc7be3ce7bd4126163b15e4d064c5d2b67c5789ce14d95b6d03d701030:2-2", "lineEnd": 2, "lineStart": 2 } @@ -67,7 +67,7 @@ "key": { "contentId": "content-eta", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00007", @@ -84,8 +84,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-incomplete-01-distmgr", - "entryId": "dp-incomplete-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1f70befc7be3ce7bd4126163b15e4d064c5d2b67c5789ce14d95b6d03d701030", + "entryId": "synthetic:artifact:sha256.v1:1f70befc7be3ce7bd4126163b15e4d064c5d2b67c5789ce14d95b6d03d701030:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -102,8 +102,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-incomplete-01-distmgr", - "entryId": "dp-incomplete-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:1f70befc7be3ce7bd4126163b15e4d064c5d2b67c5789ce14d95b6d03d701030", + "entryId": "synthetic:artifact:sha256.v1:1f70befc7be3ce7bd4126163b15e4d064c5d2b67c5789ce14d95b6d03d701030:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -124,7 +124,7 @@ "state": "incomplete", "stopPhase": "transfer", "terminalEvidence": [], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00007:content=content-eta:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00007:content=content-eta:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/malformed-current/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/malformed-current/expected.json index 712e757ff..833543bf7 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/malformed-current/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/malformed-current/expected.json @@ -9,7 +9,7 @@ "coverageGaps": [ { "artifactIds": [ - "dp-malformed-01-provider" + "synthetic:artifact:sha256.v1:047110ccf882fe1d1e9b9a81e17cff7463be29e804d23233365ca869566bf8e7" ], "producerRole": "distributionPoint", "reason": "Distribution Point source coverage is parseFailed; recollect the declared source without changing its state.", diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/rotation-boundary/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/rotation-boundary/expected.json index 018925d55..0d02a189b 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/rotation-boundary/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/rotation-boundary/expected.json @@ -14,8 +14,8 @@ "coverageGaps": [ { "artifactIds": [ - "dp-rotation-01-current-fragment", - "dp-rotation-02-lo-fragment" + "synthetic:artifact:sha256.v1:4e69776de65089e53498b26003cdf45bf88edc8b55bc331eeafb98f1dcda9ca1", + "synthetic:artifact:sha256.v1:8a8d4a5f5d35e824b3417e5b9d8215d3c6f05eba27a5d43a6be2e4f7ab21041f" ], "producerRole": "siteServer", "reason": "Captured Distribution Point evidence is incomplete or outside the supported intake profile.", diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/serve-observed/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/serve-observed/expected.json index 701ffb209..66ff2f112 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/serve-observed/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/serve-observed/expected.json @@ -15,38 +15,38 @@ "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-serve-01-distmgr", - "entryId": "dp-serve-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:8c889ff07689b563b288b2f5d1eb8b5918b2d88e7ad1b376557c9e37b4f96487", + "entryId": "synthetic:artifact:sha256.v1:8c889ff07689b563b288b2f5d1eb8b5918b2d88e7ad1b376557c9e37b4f96487:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-serve-01-distmgr", - "entryId": "dp-serve-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:8c889ff07689b563b288b2f5d1eb8b5918b2d88e7ad1b376557c9e37b4f96487", + "entryId": "synthetic:artifact:sha256.v1:8c889ff07689b563b288b2f5d1eb8b5918b2d88e7ad1b376557c9e37b4f96487:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-serve-02-pkgxfer", - "entryId": "dp-serve-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:40ac2ace33945633c14b8266143414db9c047248717311f7d587b23847dcc74d", + "entryId": "synthetic:artifact:sha256.v1:40ac2ace33945633c14b8266143414db9c047248717311f7d587b23847dcc74d:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-serve-03-provider", - "entryId": "dp-serve-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:469e3fa552b79ff16913f430427bff5dd96cd0a248a43d246876b5b38b45ab7f", + "entryId": "synthetic:artifact:sha256.v1:469e3fa552b79ff16913f430427bff5dd96cd0a248a43d246876b5b38b45ab7f:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-serve-03-provider", - "entryId": "dp-serve-03-provider:2-2", + "artifactId": "synthetic:artifact:sha256.v1:469e3fa552b79ff16913f430427bff5dd96cd0a248a43d246876b5b38b45ab7f", + "entryId": "synthetic:artifact:sha256.v1:469e3fa552b79ff16913f430427bff5dd96cd0a248a43d246876b5b38b45ab7f:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-serve-04-status", - "entryId": "dp-serve-04-status:1-1", + "artifactId": "synthetic:artifact:sha256.v1:b36187c1a68e3dad747e65f1a0a09ed5d0f633fc2991bd4aa0834674b76672cd", + "entryId": "synthetic:artifact:sha256.v1:b36187c1a68e3dad747e65f1a0a09ed5d0f633fc2991bd4aa0834674b76672cd:1-1", "lineEnd": 1, "lineStart": 1 } @@ -54,7 +54,7 @@ "key": { "contentId": "content-zeta", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00006", @@ -67,8 +67,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-serve-01-distmgr", - "entryId": "dp-serve-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:8c889ff07689b563b288b2f5d1eb8b5918b2d88e7ad1b376557c9e37b4f96487", + "entryId": "synthetic:artifact:sha256.v1:8c889ff07689b563b288b2f5d1eb8b5918b2d88e7ad1b376557c9e37b4f96487:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -85,8 +85,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-serve-01-distmgr", - "entryId": "dp-serve-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:8c889ff07689b563b288b2f5d1eb8b5918b2d88e7ad1b376557c9e37b4f96487", + "entryId": "synthetic:artifact:sha256.v1:8c889ff07689b563b288b2f5d1eb8b5918b2d88e7ad1b376557c9e37b4f96487:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -103,8 +103,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-serve-02-pkgxfer", - "entryId": "dp-serve-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:40ac2ace33945633c14b8266143414db9c047248717311f7d587b23847dcc74d", + "entryId": "synthetic:artifact:sha256.v1:40ac2ace33945633c14b8266143414db9c047248717311f7d587b23847dcc74d:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -121,8 +121,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-serve-03-provider", - "entryId": "dp-serve-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:469e3fa552b79ff16913f430427bff5dd96cd0a248a43d246876b5b38b45ab7f", + "entryId": "synthetic:artifact:sha256.v1:469e3fa552b79ff16913f430427bff5dd96cd0a248a43d246876b5b38b45ab7f:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -139,8 +139,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-serve-03-provider", - "entryId": "dp-serve-03-provider:2-2", + "artifactId": "synthetic:artifact:sha256.v1:469e3fa552b79ff16913f430427bff5dd96cd0a248a43d246876b5b38b45ab7f", + "entryId": "synthetic:artifact:sha256.v1:469e3fa552b79ff16913f430427bff5dd96cd0a248a43d246876b5b38b45ab7f:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -157,8 +157,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-serve-04-status", - "entryId": "dp-serve-04-status:1-1", + "artifactId": "synthetic:artifact:sha256.v1:b36187c1a68e3dad747e65f1a0a09ed5d0f633fc2991bd4aa0834674b76672cd", + "entryId": "synthetic:artifact:sha256.v1:b36187c1a68e3dad747e65f1a0a09ed5d0f633fc2991bd4aa0834674b76672cd:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -179,7 +179,7 @@ "state": "succeeded", "stopPhase": null, "terminalEvidence": [], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00006:content=content-zeta:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00006:content=content-zeta:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-deferred/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-deferred/expected.json index 621d73908..cf126ca42 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-deferred/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-deferred/expected.json @@ -21,20 +21,20 @@ "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-transfer-deferred-01-distmgr", - "entryId": "dp-transfer-deferred-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1f5a3a673eac5bc2580d9adc89d4efb039628894342568bda67423712feb0976", + "entryId": "synthetic:artifact:sha256.v1:1f5a3a673eac5bc2580d9adc89d4efb039628894342568bda67423712feb0976:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-transfer-deferred-01-distmgr", - "entryId": "dp-transfer-deferred-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:1f5a3a673eac5bc2580d9adc89d4efb039628894342568bda67423712feb0976", + "entryId": "synthetic:artifact:sha256.v1:1f5a3a673eac5bc2580d9adc89d4efb039628894342568bda67423712feb0976:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-transfer-deferred-02-pkgxfer", - "entryId": "dp-transfer-deferred-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:baf95ddfa4243c8848b9a89f0e8ef769354e78b7a07648b0b046cd698ade27d2", + "entryId": "synthetic:artifact:sha256.v1:baf95ddfa4243c8848b9a89f0e8ef769354e78b7a07648b0b046cd698ade27d2:1-1", "lineEnd": 1, "lineStart": 1 } @@ -42,7 +42,7 @@ "key": { "contentId": "content-iota", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00009", @@ -59,8 +59,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-transfer-deferred-01-distmgr", - "entryId": "dp-transfer-deferred-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1f5a3a673eac5bc2580d9adc89d4efb039628894342568bda67423712feb0976", + "entryId": "synthetic:artifact:sha256.v1:1f5a3a673eac5bc2580d9adc89d4efb039628894342568bda67423712feb0976:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -77,8 +77,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-transfer-deferred-01-distmgr", - "entryId": "dp-transfer-deferred-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:1f5a3a673eac5bc2580d9adc89d4efb039628894342568bda67423712feb0976", + "entryId": "synthetic:artifact:sha256.v1:1f5a3a673eac5bc2580d9adc89d4efb039628894342568bda67423712feb0976:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -95,8 +95,8 @@ { "disposition": "deferred", "evidence": { - "artifactId": "dp-transfer-deferred-02-pkgxfer", - "entryId": "dp-transfer-deferred-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:baf95ddfa4243c8848b9a89f0e8ef769354e78b7a07648b0b046cd698ade27d2", + "entryId": "synthetic:artifact:sha256.v1:baf95ddfa4243c8848b9a89f0e8ef769354e78b7a07648b0b046cd698ade27d2:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -117,7 +117,7 @@ "state": "deferred", "stopPhase": "transfer", "terminalEvidence": [], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00009:content=content-iota:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00009:content=content-iota:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-failure/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-failure/expected.json index 1abbc7211..7165f07df 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-failure/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-failure/expected.json @@ -15,20 +15,20 @@ "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-transfer-failure-01-distmgr", - "entryId": "dp-transfer-failure-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:a83be0e994ca01ceee22d935941de0e9b5fdc8d0b88ab31a29f6d4fef8f3c5c6", + "entryId": "synthetic:artifact:sha256.v1:a83be0e994ca01ceee22d935941de0e9b5fdc8d0b88ab31a29f6d4fef8f3c5c6:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-transfer-failure-01-distmgr", - "entryId": "dp-transfer-failure-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:a83be0e994ca01ceee22d935941de0e9b5fdc8d0b88ab31a29f6d4fef8f3c5c6", + "entryId": "synthetic:artifact:sha256.v1:a83be0e994ca01ceee22d935941de0e9b5fdc8d0b88ab31a29f6d4fef8f3c5c6:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-transfer-failure-02-pkgxfer", - "entryId": "dp-transfer-failure-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:0b9a2184933434a5c90970ceae8e32e7b03de7cf126ea33741c15cf0dd62bcc5", + "entryId": "synthetic:artifact:sha256.v1:0b9a2184933434a5c90970ceae8e32e7b03de7cf126ea33741c15cf0dd62bcc5:1-1", "lineEnd": 1, "lineStart": 1 } @@ -36,7 +36,7 @@ "key": { "contentId": "content-eta", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00007", @@ -49,8 +49,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-transfer-failure-01-distmgr", - "entryId": "dp-transfer-failure-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:a83be0e994ca01ceee22d935941de0e9b5fdc8d0b88ab31a29f6d4fef8f3c5c6", + "entryId": "synthetic:artifact:sha256.v1:a83be0e994ca01ceee22d935941de0e9b5fdc8d0b88ab31a29f6d4fef8f3c5c6:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -67,8 +67,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-transfer-failure-01-distmgr", - "entryId": "dp-transfer-failure-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:a83be0e994ca01ceee22d935941de0e9b5fdc8d0b88ab31a29f6d4fef8f3c5c6", + "entryId": "synthetic:artifact:sha256.v1:a83be0e994ca01ceee22d935941de0e9b5fdc8d0b88ab31a29f6d4fef8f3c5c6:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -85,8 +85,8 @@ { "disposition": "failed", "evidence": { - "artifactId": "dp-transfer-failure-02-pkgxfer", - "entryId": "dp-transfer-failure-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:0b9a2184933434a5c90970ceae8e32e7b03de7cf126ea33741c15cf0dd62bcc5", + "entryId": "synthetic:artifact:sha256.v1:0b9a2184933434a5c90970ceae8e32e7b03de7cf126ea33741c15cf0dd62bcc5:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -108,13 +108,13 @@ "stopPhase": "transfer", "terminalEvidence": [ { - "artifactId": "dp-transfer-failure-02-pkgxfer", - "entryId": "dp-transfer-failure-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:0b9a2184933434a5c90970ceae8e32e7b03de7cf126ea33741c15cf0dd62bcc5", + "entryId": "synthetic:artifact:sha256.v1:0b9a2184933434a5c90970ceae8e32e7b03de7cf126ea33741c15cf0dd62bcc5:1-1", "lineEnd": 1, "lineStart": 1 } ], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00007:content=content-eta:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00007:content=content-eta:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-retry/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-retry/expected.json index a1bb6dc7d..befd72053 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-retry/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/transfer-retry/expected.json @@ -21,20 +21,20 @@ "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-transfer-retry-01-distmgr", - "entryId": "dp-transfer-retry-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:85bf8b4149ce4f69fa5802f17b525a1f4fd5c385e5c97a85d455134641510d43", + "entryId": "synthetic:artifact:sha256.v1:85bf8b4149ce4f69fa5802f17b525a1f4fd5c385e5c97a85d455134641510d43:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-transfer-retry-01-distmgr", - "entryId": "dp-transfer-retry-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:85bf8b4149ce4f69fa5802f17b525a1f4fd5c385e5c97a85d455134641510d43", + "entryId": "synthetic:artifact:sha256.v1:85bf8b4149ce4f69fa5802f17b525a1f4fd5c385e5c97a85d455134641510d43:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-transfer-retry-02-pkgxfer", - "entryId": "dp-transfer-retry-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:a98cfa893d1127e7461abc4374b879cdea3cf6572d068448cd4a0fc376b02f2a", + "entryId": "synthetic:artifact:sha256.v1:a98cfa893d1127e7461abc4374b879cdea3cf6572d068448cd4a0fc376b02f2a:1-1", "lineEnd": 1, "lineStart": 1 } @@ -42,7 +42,7 @@ "key": { "contentId": "content-gamma", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00003", @@ -59,8 +59,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-transfer-retry-01-distmgr", - "entryId": "dp-transfer-retry-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:85bf8b4149ce4f69fa5802f17b525a1f4fd5c385e5c97a85d455134641510d43", + "entryId": "synthetic:artifact:sha256.v1:85bf8b4149ce4f69fa5802f17b525a1f4fd5c385e5c97a85d455134641510d43:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -77,8 +77,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-transfer-retry-01-distmgr", - "entryId": "dp-transfer-retry-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:85bf8b4149ce4f69fa5802f17b525a1f4fd5c385e5c97a85d455134641510d43", + "entryId": "synthetic:artifact:sha256.v1:85bf8b4149ce4f69fa5802f17b525a1f4fd5c385e5c97a85d455134641510d43:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -95,8 +95,8 @@ { "disposition": "retrying", "evidence": { - "artifactId": "dp-transfer-retry-02-pkgxfer", - "entryId": "dp-transfer-retry-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:a98cfa893d1127e7461abc4374b879cdea3cf6572d068448cd4a0fc376b02f2a", + "entryId": "synthetic:artifact:sha256.v1:a98cfa893d1127e7461abc4374b879cdea3cf6572d068448cd4a0fc376b02f2a:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -117,7 +117,7 @@ "state": "retrying", "stopPhase": "transfer", "terminalEvidence": [], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00003:content=content-gamma:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00003:content=content-gamma:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/validation-failure/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/validation-failure/expected.json index 642e270ec..9c2422166 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/validation-failure/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/distribution_point/validation-failure/expected.json @@ -15,26 +15,26 @@ "contentVersionMismatch": false, "evidence": [ { - "artifactId": "dp-validation-failure-01-distmgr", - "entryId": "dp-validation-failure-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:897db0806c24d0c47681dc718e5c8cf4bdb2f62463349d8047bbeb78fed21586", + "entryId": "synthetic:artifact:sha256.v1:897db0806c24d0c47681dc718e5c8cf4bdb2f62463349d8047bbeb78fed21586:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-validation-failure-01-distmgr", - "entryId": "dp-validation-failure-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:897db0806c24d0c47681dc718e5c8cf4bdb2f62463349d8047bbeb78fed21586", + "entryId": "synthetic:artifact:sha256.v1:897db0806c24d0c47681dc718e5c8cf4bdb2f62463349d8047bbeb78fed21586:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "dp-validation-failure-02-pkgxfer", - "entryId": "dp-validation-failure-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:8ec1c5cdf3907b6a60670d9fefc346e0bbdb339772d45a9f0098f696cedeb52e", + "entryId": "synthetic:artifact:sha256.v1:8ec1c5cdf3907b6a60670d9fefc346e0bbdb339772d45a9f0098f696cedeb52e:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "dp-validation-failure-03-provider", - "entryId": "dp-validation-failure-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:c814c5ea07b67076ede4171bd3f846d89a8de14bd89628440d76d69857825e24", + "entryId": "synthetic:artifact:sha256.v1:c814c5ea07b67076ede4171bd3f846d89a8de14bd89628440d76d69857825e24:1-1", "lineEnd": 1, "lineStart": 1 } @@ -42,7 +42,7 @@ "key": { "contentId": "content-delta", "contentVersion": 1, - "distributionPointHandle": "synthetic:subject:dp-01", + "distributionPointHandle": "synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea", "extractionProfileId": "dp-server-5.00.test-v1", "extractionProfileVersion": 1, "packageId": "LAB00004", @@ -55,8 +55,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-validation-failure-01-distmgr", - "entryId": "dp-validation-failure-01-distmgr:1-1", + "artifactId": "synthetic:artifact:sha256.v1:897db0806c24d0c47681dc718e5c8cf4bdb2f62463349d8047bbeb78fed21586", + "entryId": "synthetic:artifact:sha256.v1:897db0806c24d0c47681dc718e5c8cf4bdb2f62463349d8047bbeb78fed21586:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -73,8 +73,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-validation-failure-01-distmgr", - "entryId": "dp-validation-failure-01-distmgr:2-2", + "artifactId": "synthetic:artifact:sha256.v1:897db0806c24d0c47681dc718e5c8cf4bdb2f62463349d8047bbeb78fed21586", + "entryId": "synthetic:artifact:sha256.v1:897db0806c24d0c47681dc718e5c8cf4bdb2f62463349d8047bbeb78fed21586:2-2", "lineEnd": 2, "lineStart": 2 }, @@ -91,8 +91,8 @@ { "disposition": "succeeded", "evidence": { - "artifactId": "dp-validation-failure-02-pkgxfer", - "entryId": "dp-validation-failure-02-pkgxfer:1-1", + "artifactId": "synthetic:artifact:sha256.v1:8ec1c5cdf3907b6a60670d9fefc346e0bbdb339772d45a9f0098f696cedeb52e", + "entryId": "synthetic:artifact:sha256.v1:8ec1c5cdf3907b6a60670d9fefc346e0bbdb339772d45a9f0098f696cedeb52e:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -109,8 +109,8 @@ { "disposition": "failed", "evidence": { - "artifactId": "dp-validation-failure-03-provider", - "entryId": "dp-validation-failure-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:c814c5ea07b67076ede4171bd3f846d89a8de14bd89628440d76d69857825e24", + "entryId": "synthetic:artifact:sha256.v1:c814c5ea07b67076ede4171bd3f846d89a8de14bd89628440d76d69857825e24:1-1", "lineEnd": 1, "lineStart": 1 }, @@ -132,13 +132,13 @@ "stopPhase": "validate", "terminalEvidence": [ { - "artifactId": "dp-validation-failure-03-provider", - "entryId": "dp-validation-failure-03-provider:1-1", + "artifactId": "synthetic:artifact:sha256.v1:c814c5ea07b67076ede4171bd3f846d89a8de14bd89628440d76d69857825e24", + "entryId": "synthetic:artifact:sha256.v1:c814c5ea07b67076ede4171bd3f846d89a8de14bd89628440d76d69857825e24:1-1", "lineEnd": 1, "lineStart": 1 } ], - "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00004:content=content-delta:content-version=1:dp=synthetic:subject:dp-01:profile=dp-server-5.00.test-v1:profile-version=1" + "transactionId": "dp:topology-site=synthetic:site:lab:site=LAB:package=LAB00004:content=content-delta:content-version=1:dp=synthetic:subject:sha256.v1:7254d2b8e39da0f9e69d6af6e4d512ad3578a8f88e9a1d02b5c76037ce9f34ea:profile=dp-server-5.00.test-v1:profile-version=1" } ], "workflow": "distributionPointContent" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/absent-remote-source/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/absent-remote-source/expected.json index cb1641c1f..6badc3415 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/absent-remote-source/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/absent-remote-source/expected.json @@ -5,14 +5,14 @@ "stateChain": ["initiate","queueOrSerialize","send","receive","process","acknowledge","healthyOrTerminal"], "analysisContract": {"independentReducer":true,"crossSideCorrelationPerformed":false,"nativeCollectionPerformed":false}, "extractionProfile": {"selectionState":"selectedSynthetic","profileId":"hierarchy-server-5.00.test-v1","validatedRole":"siteServer"}, - "coverage": [{"artifactId":"absent-01-sender","state":"captured"},{"artifactId":"absent-02-despool","state":"absent"}], + "coverage": [{"artifactId":"synthetic:artifact:sha256.v1:335cb266395cf7c7d238f2c5cc59b01ea326824dc25a341857bb8d6cd93cd842","state":"captured"},{"artifactId":"synthetic:artifact:sha256.v1:2a72dae78102cf278678f6480a276b4d958ae574e9c06c693abf5b037c19cf82","state":"absent"}], "transactions": [{ "transactionId":"hierarchy:msg-absent-01:LAB:CHD:link-lab-chd", "key":{"messageId":"msg-absent-01","linkId":"link-lab-chd","originSiteCode":"LAB","targetSiteCode":"CHD","confidence":"exact","extractionProfileId":"hierarchy-server-5.00.test-v1"}, "topologyCompatibility":"exact","timestampOrdering":"usable","terminalEvidence":false, "state":"incomplete","classification":"insufficientEvidence","confidence":"low","confidenceCeiling":"low", - "coverageGapArtifactIds":["absent-02-despool"], - "observations":[{"observationId":"absent-01-send","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"absent-01-sender","startLine":1,"endLine":1}]}] + "coverageGapArtifactIds":["synthetic:artifact:sha256.v1:2a72dae78102cf278678f6480a276b4d958ae574e9c06c693abf5b037c19cf82"], + "observations":[{"observationId":"absent-01-send","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:335cb266395cf7c7d238f2c5cc59b01ea326824dc25a341857bb8d6cd93cd842","startLine":1,"endLine":1}]}] }], "sourceLocalObservations": [], "artifactRequests": [ diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/backlog-retry/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/backlog-retry/expected.json index c0fac1777..08e6e165d 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/backlog-retry/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/backlog-retry/expected.json @@ -5,14 +5,14 @@ "stateChain": ["initiate","queueOrSerialize","send","receive","process","acknowledge","healthyOrTerminal"], "analysisContract": {"independentReducer":true,"crossSideCorrelationPerformed":false,"nativeCollectionPerformed":false}, "extractionProfile": {"selectionState":"selectedSynthetic","profileId":"hierarchy-server-5.00.test-v1","validatedRole":"siteServer"}, - "coverage": [{"artifactId":"backlog-01-replmgr","state":"captured"}], + "coverage": [{"artifactId":"synthetic:artifact:sha256.v1:75d9aaa235969f55de0f041e643b8c0f4b6cb5e8134eb4b7db654290424203f9","state":"captured"}], "transactions": [{ "transactionId":"hierarchy:msg-backlog-01:LAB:CHD:link-lab-chd", "key":{"messageId":"msg-backlog-01","linkId":"link-lab-chd","originSiteCode":"LAB","targetSiteCode":"CHD","confidence":"exact","extractionProfileId":"hierarchy-server-5.00.test-v1"}, "topologyCompatibility":"exact","timestampOrdering":"usable","terminalEvidence":false, "state":"incomplete","classification":"insufficientEvidence","confidence":"low","confidenceCeiling":"low", "coverageGapArtifactIds":[], - "observations":[{"observationId":"backlog-01-queue","phase":"queueOrSerialize","disposition":"retrying","terminal":false,"evidence":[{"artifactId":"backlog-01-replmgr","startLine":1,"endLine":1}]}] + "observations":[{"observationId":"backlog-01-queue","phase":"queueOrSerialize","disposition":"retrying","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:75d9aaa235969f55de0f041e643b8c0f4b6cb5e8134eb4b7db654290424203f9","startLine":1,"endLine":1}]}] }], "sourceLocalObservations": [], "artifactRequests": [ diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/clock-offset-unknown/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/clock-offset-unknown/expected.json index ca97399d8..bb4f79868 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/clock-offset-unknown/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/clock-offset-unknown/expected.json @@ -5,7 +5,7 @@ "stateChain": ["initiate","queueOrSerialize","send","receive","process","acknowledge","healthyOrTerminal"], "analysisContract": {"independentReducer":true,"crossSideCorrelationPerformed":false,"nativeCollectionPerformed":false}, "extractionProfile": {"selectionState":"selectedSynthetic","profileId":"hierarchy-server-5.00.test-v1","validatedRole":"siteServer"}, - "coverage": [{"artifactId":"clock-01-sender","state":"captured"},{"artifactId":"clock-02-despool","state":"captured"}], + "coverage": [{"artifactId":"synthetic:artifact:sha256.v1:58d5f826db9e8079f9b6173ae90c1274a98c89bf83257bd6b4f41c9b429d40b2","state":"captured"},{"artifactId":"synthetic:artifact:sha256.v1:9c6e69cfb000db48ff3efc559807a43720cd412c64bc765b5ad399d6e6931f55","state":"captured"}], "transactions": [{ "transactionId":"hierarchy:msg-clock-01:LAB:CHD:link-lab-chd", "key":{"messageId":"msg-clock-01","linkId":"link-lab-chd","originSiteCode":"LAB","targetSiteCode":"CHD","confidence":"exact","extractionProfileId":"hierarchy-server-5.00.test-v1"}, @@ -13,8 +13,8 @@ "state":"incomplete","classification":"insufficientEvidence","confidence":"low","confidenceCeiling":"low", "coverageGapArtifactIds":[], "observations":[ - {"observationId":"clock-01-send","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"clock-01-sender","startLine":1,"endLine":1}]}, - {"observationId":"clock-02-process","phase":"process","disposition":"failed","terminal":true,"evidence":[{"artifactId":"clock-02-despool","startLine":1,"endLine":1}]} + {"observationId":"clock-01-send","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:58d5f826db9e8079f9b6173ae90c1274a98c89bf83257bd6b4f41c9b429d40b2","startLine":1,"endLine":1}]}, + {"observationId":"clock-02-process","phase":"process","disposition":"failed","terminal":true,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:9c6e69cfb000db48ff3efc559807a43720cd412c64bc765b5ad399d6e6931f55","startLine":1,"endLine":1}]} ] }], "sourceLocalObservations": [], diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/generic-site-token/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/generic-site-token/expected.json index 4d198160a..3b205422a 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/generic-site-token/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/generic-site-token/expected.json @@ -23,7 +23,7 @@ }, "coverage": [ { - "artifactId": "generic-01-sender", + "artifactId": "synthetic:artifact:sha256.v1:a12a03bf09588a996e01b7abd27c15856c880d4995c32f2962e8585255bd6104", "state": "captured" } ], diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/healthy-link/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/healthy-link/expected.json index fa3b9f9f8..ebefbd54a 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/healthy-link/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/healthy-link/expected.json @@ -5,7 +5,7 @@ "stateChain": ["initiate","queueOrSerialize","send","receive","process","acknowledge","healthyOrTerminal"], "analysisContract": {"independentReducer":true,"crossSideCorrelationPerformed":false,"nativeCollectionPerformed":false}, "extractionProfile": {"selectionState":"selectedSynthetic","profileId":"hierarchy-server-5.00.test-v1","validatedRole":"siteServer"}, - "coverage": [{"artifactId":"healthy-01-replmgr","state":"captured"},{"artifactId":"healthy-02-sender","state":"captured"},{"artifactId":"healthy-03-despool","state":"captured"},{"artifactId":"healthy-04-rcmctrl","state":"captured"}], + "coverage": [{"artifactId":"synthetic:artifact:sha256.v1:2cc60951a5755e6a54bde2bd7c7cbb48c55c18cea8a88352b07c18e61877c517","state":"captured"},{"artifactId":"synthetic:artifact:sha256.v1:a10cd5c1473e0037e8da15607daddc90ed534182200fb8cb1d43d65faab62ffe","state":"captured"},{"artifactId":"synthetic:artifact:sha256.v1:f8cbce297b67601140038ff2a88dae7918e2e33c334f1f27652eeb70a590fc0d","state":"captured"},{"artifactId":"synthetic:artifact:sha256.v1:213c2dcc74c62b18c7e3af018d0ff840bbc0e3979f7232032d6597f69d35ccd6","state":"captured"}], "transactions": [{ "transactionId":"hierarchy:msg-healthy-01:LAB:CHD:link-lab-chd", "key":{"messageId":"msg-healthy-01","linkId":"link-lab-chd","originSiteCode":"LAB","targetSiteCode":"CHD","confidence":"exact","extractionProfileId":"hierarchy-server-5.00.test-v1"}, @@ -13,13 +13,13 @@ "state":"succeeded","classification":"success","confidence":"high","confidenceCeiling":"high", "coverageGapArtifactIds":[], "observations":[ - {"observationId":"healthy-01-initiate","phase":"initiate","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"healthy-01-replmgr","startLine":1,"endLine":1}]}, - {"observationId":"healthy-02-queue","phase":"queueOrSerialize","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"healthy-01-replmgr","startLine":2,"endLine":2}]}, - {"observationId":"healthy-03-send","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"healthy-02-sender","startLine":1,"endLine":1}]}, - {"observationId":"healthy-04-receive","phase":"receive","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"healthy-03-despool","startLine":1,"endLine":1}]}, - {"observationId":"healthy-05-process","phase":"process","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"healthy-03-despool","startLine":2,"endLine":2}]}, - {"observationId":"healthy-06-acknowledge","phase":"acknowledge","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"healthy-04-rcmctrl","startLine":1,"endLine":1}]}, - {"observationId":"healthy-07-terminal","phase":"healthyOrTerminal","disposition":"succeeded","terminal":true,"evidence":[{"artifactId":"healthy-04-rcmctrl","startLine":2,"endLine":2}]} + {"observationId":"healthy-01-initiate","phase":"initiate","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:2cc60951a5755e6a54bde2bd7c7cbb48c55c18cea8a88352b07c18e61877c517","startLine":1,"endLine":1}]}, + {"observationId":"healthy-02-queue","phase":"queueOrSerialize","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:2cc60951a5755e6a54bde2bd7c7cbb48c55c18cea8a88352b07c18e61877c517","startLine":2,"endLine":2}]}, + {"observationId":"healthy-03-send","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:a10cd5c1473e0037e8da15607daddc90ed534182200fb8cb1d43d65faab62ffe","startLine":1,"endLine":1}]}, + {"observationId":"healthy-04-receive","phase":"receive","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:f8cbce297b67601140038ff2a88dae7918e2e33c334f1f27652eeb70a590fc0d","startLine":1,"endLine":1}]}, + {"observationId":"healthy-05-process","phase":"process","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:f8cbce297b67601140038ff2a88dae7918e2e33c334f1f27652eeb70a590fc0d","startLine":2,"endLine":2}]}, + {"observationId":"healthy-06-acknowledge","phase":"acknowledge","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:213c2dcc74c62b18c7e3af018d0ff840bbc0e3979f7232032d6597f69d35ccd6","startLine":1,"endLine":1}]}, + {"observationId":"healthy-07-terminal","phase":"healthyOrTerminal","disposition":"succeeded","terminal":true,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:213c2dcc74c62b18c7e3af018d0ff840bbc0e3979f7232032d6597f69d35ccd6","startLine":2,"endLine":2}]} ] }], "sourceLocalObservations": [], diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/incomplete/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/incomplete/expected.json index 2415f6005..39537553a 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/incomplete/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/incomplete/expected.json @@ -5,9 +5,9 @@ "stateChain": ["initiate","queueOrSerialize","send","receive","process","acknowledge","healthyOrTerminal"], "analysisContract": {"independentReducer":true,"crossSideCorrelationPerformed":false,"nativeCollectionPerformed":false}, "extractionProfile": {"selectionState":"selectedSynthetic","profileId":"hierarchy-server-5.00.test-v1","validatedRole":"siteServer"}, - "coverage": [{"artifactId":"incomplete-01-replmgr","state":"capped"}], + "coverage": [{"artifactId":"synthetic:artifact:sha256.v1:4be424c1fb940199b920d681f5e0dccf3d5c08d8441af87a19d3caa0cd612973","state":"capped"}], "transactions": [], - "sourceLocalObservations": [{"observationId":"incomplete-01-fragment","classification":"coverageOnly","confidence":"low","correlationEligible":false,"artifactIds":["incomplete-01-replmgr"],"evidence":[]}], + "sourceLocalObservations": [{"observationId":"incomplete-01-fragment","classification":"coverageOnly","confidence":"low","correlationEligible":false,"artifactIds":["synthetic:artifact:sha256.v1:4be424c1fb940199b920d681f5e0dccf3d5c08d8441af87a19d3caa0cd612973"],"evidence":[]}], "artifactRequests": [{"sourceId":"server-hierarchy-control","producerRole":"siteServer","direction":"origin","targetSiteCode":"CHD","basenames":["replmgr.log"],"reasonCode":"coverageCapped"}], "crossSideCausalClaims": [], "correlationHandoff": {"issue":"#333","performed":false,"timeOnlyEligible":false} diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/receiver-processing-failure/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/receiver-processing-failure/expected.json index e6f092fb4..168c9a618 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/receiver-processing-failure/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/receiver-processing-failure/expected.json @@ -5,7 +5,7 @@ "stateChain": ["initiate","queueOrSerialize","send","receive","process","acknowledge","healthyOrTerminal"], "analysisContract": {"independentReducer":true,"crossSideCorrelationPerformed":false,"nativeCollectionPerformed":false}, "extractionProfile": {"selectionState":"selectedSynthetic","profileId":"hierarchy-server-5.00.test-v1","validatedRole":"siteServer"}, - "coverage": [{"artifactId":"receiver-01-sender","state":"captured"},{"artifactId":"receiver-02-despool","state":"captured"}], + "coverage": [{"artifactId":"synthetic:artifact:sha256.v1:48d72b7cbc91762721025b77cbf8afdd0713d0a21a34870671d1f5c8434c451d","state":"captured"},{"artifactId":"synthetic:artifact:sha256.v1:f8b07b7b846e6569a73fee926d8b8475017ffa49f0626cbaff8b7a5b772c69a1","state":"captured"}], "transactions": [{ "transactionId":"hierarchy:msg-receiver-01:LAB:CHD:link-lab-chd", "key":{"messageId":"msg-receiver-01","linkId":"link-lab-chd","originSiteCode":"LAB","targetSiteCode":"CHD","confidence":"exact","extractionProfileId":"hierarchy-server-5.00.test-v1"}, @@ -13,9 +13,9 @@ "state":"incomplete","classification":"insufficientEvidence","confidence":"low","confidenceCeiling":"low", "coverageGapArtifactIds":[], "observations":[ - {"observationId":"receiver-01-send","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"receiver-01-sender","startLine":1,"endLine":1}]}, - {"observationId":"receiver-02-receive","phase":"receive","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"receiver-02-despool","startLine":1,"endLine":1}]}, - {"observationId":"receiver-03-process","phase":"process","disposition":"failed","terminal":true,"evidence":[{"artifactId":"receiver-02-despool","startLine":2,"endLine":2}]} + {"observationId":"receiver-01-send","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:48d72b7cbc91762721025b77cbf8afdd0713d0a21a34870671d1f5c8434c451d","startLine":1,"endLine":1}]}, + {"observationId":"receiver-02-receive","phase":"receive","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:f8b07b7b846e6569a73fee926d8b8475017ffa49f0626cbaff8b7a5b772c69a1","startLine":1,"endLine":1}]}, + {"observationId":"receiver-03-process","phase":"process","disposition":"failed","terminal":true,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:f8b07b7b846e6569a73fee926d8b8475017ffa49f0626cbaff8b7a5b772c69a1","startLine":2,"endLine":2}]} ] }], "sourceLocalObservations": [], diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/recovery/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/recovery/expected.json index 7b78d488d..4643a3774 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/recovery/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/recovery/expected.json @@ -5,7 +5,7 @@ "stateChain": ["initiate","queueOrSerialize","send","receive","process","acknowledge","healthyOrTerminal"], "analysisContract": {"independentReducer":true,"crossSideCorrelationPerformed":false,"nativeCollectionPerformed":false}, "extractionProfile": {"selectionState":"selectedSynthetic","profileId":"hierarchy-server-5.00.test-v1","validatedRole":"siteServer"}, - "coverage": [{"artifactId":"recovery-01-sender","state":"captured"},{"artifactId":"recovery-02-despool","state":"captured"}], + "coverage": [{"artifactId":"synthetic:artifact:sha256.v1:22bd8285e739080b41afcbfc19864fc995ef87298c8973a78a906264b73e371d","state":"captured"},{"artifactId":"synthetic:artifact:sha256.v1:3d3258a0caad4a2ecc3d46c1cdbf9af577fef0514e70386fc2a3d47b3b859752","state":"captured"}], "transactions": [{ "transactionId":"hierarchy:msg-recovery-01:LAB:CHD:link-lab-chd", "key":{"messageId":"msg-recovery-01","linkId":"link-lab-chd","originSiteCode":"LAB","targetSiteCode":"CHD","confidence":"exact","extractionProfileId":"hierarchy-server-5.00.test-v1"}, @@ -13,11 +13,11 @@ "state":"incomplete","classification":"insufficientEvidence","confidence":"low","confidenceCeiling":"low", "coverageGapArtifactIds":[], "observations":[ - {"observationId":"recovery-01-retry","phase":"send","disposition":"retrying","terminal":false,"evidence":[{"artifactId":"recovery-01-sender","startLine":1,"endLine":1}]}, - {"observationId":"recovery-02-send","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"recovery-01-sender","startLine":2,"endLine":2}]}, - {"observationId":"recovery-03-receive","phase":"receive","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"recovery-02-despool","startLine":1,"endLine":1}]}, - {"observationId":"recovery-04-process","phase":"process","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"recovery-02-despool","startLine":2,"endLine":2}]}, - {"observationId":"recovery-05-terminal","phase":"healthyOrTerminal","disposition":"succeeded","terminal":true,"evidence":[{"artifactId":"recovery-02-despool","startLine":3,"endLine":3}]} + {"observationId":"recovery-01-retry","phase":"send","disposition":"retrying","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:22bd8285e739080b41afcbfc19864fc995ef87298c8973a78a906264b73e371d","startLine":1,"endLine":1}]}, + {"observationId":"recovery-02-send","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:22bd8285e739080b41afcbfc19864fc995ef87298c8973a78a906264b73e371d","startLine":2,"endLine":2}]}, + {"observationId":"recovery-03-receive","phase":"receive","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:3d3258a0caad4a2ecc3d46c1cdbf9af577fef0514e70386fc2a3d47b3b859752","startLine":1,"endLine":1}]}, + {"observationId":"recovery-04-process","phase":"process","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:3d3258a0caad4a2ecc3d46c1cdbf9af577fef0514e70386fc2a3d47b3b859752","startLine":2,"endLine":2}]}, + {"observationId":"recovery-05-terminal","phase":"healthyOrTerminal","disposition":"succeeded","terminal":true,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:3d3258a0caad4a2ecc3d46c1cdbf9af577fef0514e70386fc2a3d47b3b859752","startLine":3,"endLine":3}]} ] }], "sourceLocalObservations": [], diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/rotation-boundary/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/rotation-boundary/expected.json index 888cc67f4..8d0dc9660 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/rotation-boundary/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/rotation-boundary/expected.json @@ -5,9 +5,9 @@ "stateChain": ["initiate","queueOrSerialize","send","receive","process","acknowledge","healthyOrTerminal"], "analysisContract": {"independentReducer":true,"crossSideCorrelationPerformed":false,"nativeCollectionPerformed":false}, "extractionProfile": {"selectionState":"selectedSynthetic","profileId":"hierarchy-server-5.00.test-v1","validatedRole":"siteServer"}, - "coverage": [{"artifactId":"rotation-01-current","state":"captured"},{"artifactId":"rotation-02-lo","state":"captured"}], + "coverage": [{"artifactId":"synthetic:artifact:sha256.v1:74c4dbd840d49599e5493974bb14d3ec6c1fa9a121cafab7acb68f27be982f66","state":"captured"},{"artifactId":"synthetic:artifact:sha256.v1:b755717f473fd02da03bfb215a0607120af5005a718980a342caaba72b7fab77","state":"captured"}], "transactions": [], - "sourceLocalObservations": [{"observationId":"rotation-01-split","classification":"rotationSplit","confidence":"low","correlationEligible":false,"artifactIds":["rotation-01-current","rotation-02-lo"],"evidence":[]}], + "sourceLocalObservations": [{"observationId":"rotation-01-split","classification":"rotationSplit","confidence":"low","correlationEligible":false,"artifactIds":["synthetic:artifact:sha256.v1:74c4dbd840d49599e5493974bb14d3ec6c1fa9a121cafab7acb68f27be982f66","synthetic:artifact:sha256.v1:b755717f473fd02da03bfb215a0607120af5005a718980a342caaba72b7fab77"],"evidence":[]}], "artifactRequests": [{"sourceId":"server-hierarchy-transfer","producerRole":"siteServer","direction":"origin","targetSiteCode":"CHD","basenames":["sender.lo_","sender.log"],"reasonCode":"coverageRotationSplit"}], "crossSideCausalClaims": [], "correlationHandoff": {"issue":"#333","performed":false,"timeOnlyEligible":false} diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/sender-failure/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/sender-failure/expected.json index 27727275c..b0c47e8ef 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/sender-failure/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/sender-failure/expected.json @@ -5,21 +5,21 @@ "stateChain": ["initiate","queueOrSerialize","send","receive","process","acknowledge","healthyOrTerminal"], "analysisContract": {"independentReducer":true,"crossSideCorrelationPerformed":false,"nativeCollectionPerformed":false}, "extractionProfile": {"selectionState":"selectedSynthetic","profileId":"hierarchy-server-5.00.test-v1","validatedRole":"siteServer"}, - "coverage": [{"artifactId":"sender-failure-01-chd","state":"captured"}], + "coverage": [{"artifactId":"synthetic:artifact:sha256.v1:4acb172595b19a24f787a1d072724d2a7614fc90d87d51f495b12d356ec294a7","state":"captured"}], "transactions": [ { "transactionId":"hierarchy:msg-send-chd:LAB:CHD:link-lab-chd", "key":{"messageId":"msg-send-chd","linkId":"link-lab-chd","originSiteCode":"LAB","targetSiteCode":"CHD","confidence":"exact","extractionProfileId":"hierarchy-server-5.00.test-v1"}, "topologyCompatibility":"exact","timestampOrdering":"usable","terminalEvidence":true, "state":"incomplete","classification":"insufficientEvidence","confidence":"low","confidenceCeiling":"low","coverageGapArtifactIds":[], - "observations":[{"observationId":"sender-01-chd-failure","phase":"send","disposition":"failed","terminal":true,"evidence":[{"artifactId":"sender-failure-01-chd","startLine":1,"endLine":1}]}] + "observations":[{"observationId":"sender-01-chd-failure","phase":"send","disposition":"failed","terminal":true,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:4acb172595b19a24f787a1d072724d2a7614fc90d87d51f495b12d356ec294a7","startLine":1,"endLine":1}]}] }, { "transactionId":"hierarchy:msg-send-sec:LAB:SEC:link-lab-sec", "key":{"messageId":"msg-send-sec","linkId":"link-lab-sec","originSiteCode":"LAB","targetSiteCode":"SEC","confidence":"exact","extractionProfileId":"hierarchy-server-5.00.test-v1"}, "topologyCompatibility":"exact","timestampOrdering":"usable","terminalEvidence":true, "state":"incomplete","classification":"insufficientEvidence","confidence":"low","confidenceCeiling":"low","coverageGapArtifactIds":[], - "observations":[{"observationId":"sender-02-sec-failure","phase":"send","disposition":"failed","terminal":true,"evidence":[{"artifactId":"sender-failure-01-chd","startLine":2,"endLine":2}]}] + "observations":[{"observationId":"sender-02-sec-failure","phase":"send","disposition":"failed","terminal":true,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:4acb172595b19a24f787a1d072724d2a7614fc90d87d51f495b12d356ec294a7","startLine":2,"endLine":2}]}] } ], "sourceLocalObservations": [], diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/topology-mismatch/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/topology-mismatch/expected.json index 8feecd461..79adc2014 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/topology-mismatch/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/hierarchy_and_replication/topology-mismatch/expected.json @@ -5,7 +5,7 @@ "stateChain": ["initiate","queueOrSerialize","send","receive","process","acknowledge","healthyOrTerminal"], "analysisContract": {"independentReducer":true,"crossSideCorrelationPerformed":false,"nativeCollectionPerformed":false}, "extractionProfile": {"selectionState":"selectedSynthetic","profileId":"hierarchy-server-5.00.test-v1","validatedRole":"siteServer"}, - "coverage": [{"artifactId":"mismatch-01-sender","state":"captured"},{"artifactId":"mismatch-02-despool","state":"captured"}], + "coverage": [{"artifactId":"synthetic:artifact:sha256.v1:9abb1980622a951c31d68d7bb756f0368d7c686aa44a3c785ec245d77d4894c9","state":"captured"},{"artifactId":"synthetic:artifact:sha256.v1:44eb25869e3e172808393044c27bab973411ee4948fb1bfc79a4a122cc25870f","state":"captured"}], "transactions": [ { "transactionId":"hierarchy:msg-mismatch-01:LAB:CHD:link-lab-chd", @@ -14,7 +14,7 @@ "state":"incomplete","classification":"insufficientEvidence","confidence":"low","confidenceCeiling":"low", "coverageGapArtifactIds":[], "observations":[ - {"observationId":"mismatch-01-origin","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"mismatch-01-sender","startLine":1,"endLine":1}]} + {"observationId":"mismatch-01-origin","phase":"send","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:9abb1980622a951c31d68d7bb756f0368d7c686aa44a3c785ec245d77d4894c9","startLine":1,"endLine":1}]} ] }, { @@ -24,7 +24,7 @@ "state":"incomplete","classification":"insufficientEvidence","confidence":"low","confidenceCeiling":"low", "coverageGapArtifactIds":[], "observations":[ - {"observationId":"mismatch-02-target","phase":"receive","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"mismatch-02-despool","startLine":1,"endLine":1}]} + {"observationId":"mismatch-02-target","phase":"receive","disposition":"succeeded","terminal":false,"evidence":[{"artifactId":"synthetic:artifact:sha256.v1:44eb25869e3e172808393044c27bab973411ee4948fb1bfc79a4a122cc25870f","startLine":1,"endLine":1}]} ] } ], diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/absent-dp/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/absent-dp/manifest.json index 672d494d8..bcb2373b4 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/absent-dp/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/absent-dp/manifest.json @@ -4,7 +4,7 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "S01-CM01", "siteCode": "S01", "rolesObserved": ["siteServer"] }, + "topology": { "captureHost": "LAB-CM01", "siteCode": "LAB", "rolesObserved": ["siteServer"] }, "artifacts": [ { "artifactId": "synthetic:artifact:sha256.v1:08b572c79ca8a7c3f5d9ac3d1f5900ee21e8dc14f9431acbee243d579a4880f5", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "workflowSubject": { "role": "distributionPoint", "basis": "incidentScopeOnly" }, "sourceId": "server-dp-distribution", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_DEFAULT_DP_CANDIDATE", "originalBasename": "distmgr.log", "configuredPathProvenance": { "state": "defaultCandidate", "pathFingerprint": "synthetic:path:sha256.v1:6f8fc72bb6fbe681ce9594ed6727eb5dc54bd53be5e174429c502466459464e3" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:ce486242d5484616648fb9a33cf16549e2146ed970978aca1c798c29daa1e35f" }, "captureState": "absent", "collectedUtc": "2026-07-30T00:04:00Z", "relativePath": null, "bytesCopied": 0 } ] diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/access-denied-mp/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/access-denied-mp/manifest.json index 46e8bfbe8..33fd05791 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/access-denied-mp/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/access-denied-mp/manifest.json @@ -4,7 +4,7 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, "artifacts": [ { "artifactId": "synthetic:artifact:sha256.v1:f4115e29df70bab46be15daf2625ad0528a72564a3d8edfd530d76f0d914bfa0", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:66fc48770e32c403a5c6db66e23c9272b9d66e5713c25f83b6feca09bb80769f" }, "captureState": "accessDenied", "collectionDetail": "synthetic permission denial", "collectedUtc": "2026-07-30T00:05:00Z", "relativePath": null, "bytesCopied": 0 } ] diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/manifest.json index 186b157b4..d12fae789 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/capped-sup/manifest.json @@ -4,7 +4,7 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "S01-CM01", "siteCode": "S01", "rolesObserved": ["siteServer"] }, + "topology": { "captureHost": "LAB-CM01", "siteCode": "LAB", "rolesObserved": ["siteServer"] }, "artifacts": [ { "artifactId": "synthetic:artifact:sha256.v1:8ffd2bfbfcd641204b0108f4d880ef9aae8472e9cde9abc4da5207791e09f47a", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "workflowSubject": { "role": "softwareUpdatePoint", "instanceHandle": "synthetic:subject:sha256.v1:ca790a8bf688c51101b35dc762ac94f7dd1a576bda7a1d85773a52e546004722" }, "sourceId": "server-sup-sync", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_SUP_CONTROL_ROOT", "originalBasename": "wsyncmgr.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:a191b8c7a7e93b6e3a4ce54076ff13237f987fc0805192c4bcfe3263e0824f11" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:f85299e714aa2d18654c5e38d20430329daaeed476b2ff028c6258f494283baf" }, "captureState": "capped", "encoding": "utf-8", "collectionLimit": { "byteLimit": 64, "limitApplied": true }, "bytesCopied": 64, "truncated": true, "fragmentComplete": false, "collectedUtc": "2026-07-30T00:06:00Z", "relativePath": "evidence/sccm/server/site-server/server-sup-sync/subject-software-update-point/instance-17eae15500d8968f/root-b11afca548220198/current/wsyncmgr.log" } ] diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/manifest.json index 8eb0ee89e..171217745 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/collision-same-basename-configured-roots/manifest.json @@ -4,7 +4,7 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, "artifacts": [ { "artifactId": "synthetic:artifact:sha256.v1:721420190054ad85f091f558f77cd4e6e54b50da9426b7d979f7edcda7970b78", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_CONFIGURED_MP_ROOT_A", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:sha256.v1:726b792daf9cacdbe3cfb1db5040be98abff98294f960ca41dd151c1ed8c0e38" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:0a1ecb81641046880800d633ac232e5ff06ae8c60a0b2ee23914d6302801f00d" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:10:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/root-7d4a9c2e/current/MP_GetPolicy.log", "bytesCopied": 173 }, { "artifactId": "synthetic:artifact:sha256.v1:b117cc48fba84a0cef85a662fdba0009e1d2723edc6b51af457d829cfa09e7c8", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_CONFIGURED_MP_ROOT_B", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:sha256.v1:d35f1ee4d93ebae4a64a7ab9d7ef886a28f7cb01aca87ba52c9b3f9e2b2492cc" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:4b296015c846c68e4025a09a4d58eecf7668a68aa45e15d0b82b3b327e182ddc" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:10:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/root-b83f10d6/current/MP_GetPolicy.log", "bytesCopied": 172 } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/manifest.json index c32fa71d7..7b608cfe8 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/complete-multi-role/manifest.json @@ -4,7 +4,7 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "S01-CM01", "siteCode": "S01", "rolesObserved": ["siteServer", "managementPoint", "distributionPoint", "softwareUpdatePoint"] }, + "topology": { "captureHost": "LAB-CM01", "siteCode": "LAB", "rolesObserved": ["siteServer", "managementPoint", "distributionPoint", "softwareUpdatePoint"] }, "artifacts": [ { "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "sourceId": "server-sitecomp", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_ROOT", "originalBasename": "sitecomp.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:f0ee78d9745f476478f0b8093f9b7b93f7cf66b8b7e6247e089f070c24a98dcb" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:1cb1ba23d64805a34ef23b7b4561a7e7a60e74aed85185b4e2b8851a412e4d34" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:00:00Z", "relativePath": "evidence/sccm/server/site-server/server-sitecomp/current/sitecomp.log", "bytesCopied": 171 }, { "artifactId": "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:646b39fe2060806801722b0582f7c89ce9162199bce33a22dd8b28768a4b9206" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:00:01Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 184 }, diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/manifest.json index 052b77515..04b0d6cc3 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/configured-nondefault-path/manifest.json @@ -4,7 +4,7 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, "artifacts": [ { "artifactId": "synthetic:artifact:sha256.v1:a77e71c0b196187e25d552021e469b7441592a61640ee134aa45b3fc106860d0", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_CONFIGURED_NONDEFAULT_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathClass": "nonDefault", "pathFingerprint": "synthetic:path:sha256.v1:b75a3632071cb269affe517c8d05f7a71fbe0d7e691ef489f4bb77717c6a6d32" }, "defaultCandidateState": "absentCandidateOnly", "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:878487409fe658c72ede1deef1f02bc1fd414ff73035bfd54bd6dcb968cf18f5" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:01:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 183 } ] diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/manifest.json index 8cb163a6c..1ca58e3ea 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/multiline/manifest.json @@ -4,7 +4,7 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, "artifacts": [ { "artifactId": "synthetic:artifact:sha256.v1:fab8972d821bbc3016ad15e49e13aeaf0559c7ef385bda8bc2b1158f085fb338", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:cd39f6fa5ab52f618332a652c0e0360161e51284b6475b507bc7f078ff5ac7b9" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:03:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 207 } ] diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/manifest.json index 0c1b54c5f..389d5a8c6 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/rotations/manifest.json @@ -4,7 +4,7 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, "artifacts": [ { "artifactId": "synthetic:artifact:sha256.v1:ea4afe186fc87642f4641b3f207dd2b56a5275d38d418ef0a8363c5dfa2a7fb5", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log.20260729-235700", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "timestamped", "value": "20260729-235700", "lineageId": "synthetic:lineage:sha256.v1:23bf9e874701c542bf0fe2e3fcdf5f3438a5a92ecf4bb76d8d274802e8ea8019" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:02:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/timestamped-20260729-235700/MP_GetPolicy.log.20260729-235700", "bytesCopied": 182 }, { "artifactId": "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_MP_ROOT", "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:23bf9e874701c542bf0fe2e3fcdf5f3438a5a92ecf4bb76d8d274802e8ea8019" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:02:00Z", "relativePath": "evidence/sccm/server/management-point/server-mp-policy/current/MP_GetPolicy.log", "bytesCopied": 178 }, diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/skipped-iis/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/skipped-iis/manifest.json index 84aa8f354..55363c272 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/skipped-iis/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/skipped-iis/manifest.json @@ -4,7 +4,7 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "S01-MP01", "siteCode": "S01", "rolesObserved": ["managementPoint"] }, + "topology": { "captureHost": "LAB-MP01", "siteCode": "LAB", "rolesObserved": ["managementPoint"] }, "artifacts": [ { "artifactId": "synthetic:artifact:sha256.v1:34860def3e267a59a95606346ab9d6ef1fe7777505d662ece3ef674a0e617d9f", "producerRole": "managementPoint", "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-iis", "sourceKind": "iisW3c", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_IIS_EXPORT", "originalBasename": "u_ex_synthetic.log", "configuredPathProvenance": { "state": "notRequested", "pathFingerprint": "synthetic:path:sha256.v1:3e891309d960cb72191b6a45bcfb690c145680068a8b298cd0b5c144f77142be" }, "rotation": { "kind": "providerDefined", "lineageId": "synthetic:lineage:sha256.v1:235ef78b53e533c0f69d85c9fa4911c1c701abb178c9f6bfb84eb9e9c8ee3439" }, "captureState": "skipped", "skipReason": "optional supplemental source not requested", "collectedUtc": "2026-07-30T00:07:00Z", "relativePath": null, "bytesCopied": 0 } ] diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/supplemental-wsus-skipped/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/supplemental-wsus-skipped/manifest.json index de02318ea..966df7b1d 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/supplemental-wsus-skipped/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/supplemental-wsus-skipped/manifest.json @@ -5,8 +5,8 @@ "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", "topology": { - "captureHost": "S01-CM01", - "siteCode": "S01", + "captureHost": "LAB-CM01", + "siteCode": "LAB", "rolesObserved": ["softwareUpdatePoint", "wsUs"] }, "artifacts": [ diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/manifest.json index cc13eb8ed..55368774f 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/intake/unsorted-manifest/manifest.json @@ -4,7 +4,7 @@ "proposalOnly": true, "privacy": { "synthetic": true, "rawPaths": "redacted" }, "bundleRole": "server", - "topology": { "captureHost": "S01-CM01", "siteCode": "S01", "rolesObserved": ["siteServer", "managementPoint"] }, + "topology": { "captureHost": "LAB-CM01", "siteCode": "LAB", "rolesObserved": ["siteServer", "managementPoint"] }, "inputOrderIsDeliberatelyUnsorted": true, "artifacts": [ { "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", "producerRole": "siteServer", "producerHostHandle": "synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339", "sourceId": "server-status", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", "originalPath": "REDACTED_SITE_ROOT_B", "originalBasename": "statmgr.log", "configuredPathProvenance": { "state": "configured", "pathFingerprint": "synthetic:path:sha256.v1:a3870e1eb69c41328d97c369032f1d54c92a86e4d1e330bf74865fb9bb88919f" }, "rotation": { "kind": "current", "lineageId": "synthetic:lineage:sha256.v1:d69adee776032725b5bc1a2186ca41ef91956ab03ed4c1d25211004c808b5f75" }, "captureState": "captured", "encoding": "utf-8", "collectionLimit": { "byteLimit": 4096, "limitApplied": false }, "collectedUtc": "2026-07-30T00:09:00Z", "relativePath": "evidence/sccm/server/site-server/server-status/current/statmgr.log", "bytesCopied": 167 }, diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/management-point/canonical-intake-policy-scope/manifest.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/management-point/canonical-intake-policy-scope/manifest.json index b8caa94af..03cfebe0f 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/management-point/canonical-intake-policy-scope/manifest.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/management-point/canonical-intake-policy-scope/manifest.json @@ -11,9 +11,9 @@ }, "artifacts": [ { - "artifactId": "mp-policy-current", + "artifactId": "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53", "producerRole": "managementPoint", - "producerHostHandle": "synthetic:host:mp-01", + "producerHostHandle": "synthetic:host:sha256.v1:3b4244b8d95c569d9d3435c3e8c8e3f0f4a9bd3115b4db9110845abcd32ee86f", "sourceId": "server-mp-policy", "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST", @@ -21,11 +21,11 @@ "originalBasename": "MP_GetPolicy.log", "configuredPathProvenance": { "state": "configured", - "pathFingerprint": "synthetic:path:mp-default" + "pathFingerprint": "synthetic:path:sha256.v1:d24353f18797081ab8321e25f1b644d92a7f468046ce4e5a32a5254d5b9466d3" }, "rotation": { "kind": "current", - "lineageId": "mp-policy-lab" + "lineageId": "synthetic:lineage:sha256.v1:646b39fe2060806801722b0582f7c89ce9162199bce33a22dd8b28768a4b9206" }, "captureState": "captured", "encoding": "utf-8", diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-access-denied/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-access-denied/expected.json index 32f9c6faa..1642e39ef 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-access-denied/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-access-denied/expected.json @@ -2,7 +2,7 @@ "artifactRequests": [ { "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "request": { "logicalId": "adminService", @@ -10,18 +10,18 @@ "role": "adminService" }, "sourceVersion": null, - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "coverage": [ { - "artifactId": "coverage-admin-access-denied", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:9752f398d2afc4c0f243b8bb09303c199a4121fffebe04609caed771a3fdc1a2", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service", "sourceVersion": null, "state": "accessDenied", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "crossSideCausalClaims": [], @@ -33,13 +33,13 @@ "correlationKeys": [], "coverageGaps": [ { - "artifactId": "coverage-admin-access-denied", + "artifactId": "synthetic:artifact:sha256.v1:9752f398d2afc4c0f243b8bb09303c199a4121fffebe04609caed771a3fdc1a2", "coverage": "accessDenied", "role": "adminService" } ], "evidence": [], - "findingId": "provider-admin-coverage:coverage-admin-access-denied", + "findingId": "provider-admin-coverage:synthetic:artifact:sha256.v1:9752f398d2afc4c0f243b8bb09303c199a4121fffebe04609caed771a3fdc1a2", "nextArtifacts": [ { "logicalId": "adminService", @@ -56,11 +56,11 @@ }, "lastSuccessfulPhase": null, "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "sourceId": "server-admin-service", "sourceVersion": null, - "subjectId": "coverage-admin-access-denied", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "subjectId": "synthetic:artifact:sha256.v1:9752f398d2afc4c0f243b8bb09303c199a4121fffebe04609caed771a3fdc1a2", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "profiles": [ diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-auth-failure/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-auth-failure/expected.json index dc6b5d73e..66a12a5b7 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-auth-failure/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-auth-failure/expected.json @@ -2,13 +2,13 @@ "artifactRequests": [], "coverage": [ { - "artifactId": "admin-auth-current", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "crossSideCausalClaims": [], @@ -21,25 +21,25 @@ "coverageGaps": [], "evidence": [ { - "artifactId": "admin-auth-current", - "entryId": "admin-auth-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff", + "entryId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "admin-auth-current", - "entryId": "admin-auth-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff", + "entryId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "admin-auth-current", - "entryId": "admin-auth-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff", + "entryId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff:3-3", "lineEnd": 3, "lineStart": 3 } ], - "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:7048cb42fdd9ce196771736db023d9cb9f8d32d49610156a612bbe7ff8be51cb", + "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:db82dc0fa9a4df39bbe8050a82175e6f7da4d84f82a721f4552aeb4a85be88c1", "nextArtifacts": [], "phase": "providerAndAdminService", "role": "adminService", @@ -49,8 +49,8 @@ { "kind": "observedFailure", "reference": { - "artifactId": "admin-auth-current", - "entryId": "admin-auth-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff", + "entryId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff:3-3", "lineEnd": 3, "lineStart": 3 } @@ -60,11 +60,11 @@ }, "lastSuccessfulPhase": "receive", "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", - "subjectId": "adminService:cmtraceopen.request.sha256.v1:aaed0dd34503443365ef8be494a344c589a37d241e8d05370b51a399beee2b59:cmtraceopen.operation.sha256.v1:36819ae35e44be7bafa2ba69cc69e50b53286f81dd0cbce4f2bc4974150fc7c2:synthetic:host:admin-service-01:synthetic:subject:admin-service-01", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "subjectId": "adminService:cmtraceopen.request.sha256.v1:aaed0dd34503443365ef8be494a344c589a37d241e8d05370b51a399beee2b59:cmtraceopen.operation.sha256.v1:36819ae35e44be7bafa2ba69cc69e50b53286f81dd0cbce4f2bc4974150fc7c2:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "profiles": [ @@ -96,7 +96,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:admin-service-01", + "endpointHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -109,7 +109,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:36819ae35e44be7bafa2ba69cc69e50b53286f81dd0cbce4f2bc4974150fc7c2", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "requestHandle": "cmtraceopen.request.sha256.v1:aaed0dd34503443365ef8be494a344c589a37d241e8d05370b51a399beee2b59" }, "lastSuccessfulPhase": "receive", @@ -120,13 +120,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-auth-current", - "entryId": "admin-auth-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff", + "entryId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "admin-auth-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff:1-1-01", "phase": "receive", "terminal": false }, @@ -134,13 +134,13 @@ "disposition": "failed", "evidence": [ { - "artifactId": "admin-auth-current", - "entryId": "admin-auth-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff", + "entryId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "admin-auth-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -148,13 +148,13 @@ "disposition": "failed", "evidence": [ { - "artifactId": "admin-auth-current", - "entryId": "admin-auth-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff", + "entryId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "admin-auth-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:e15ff5c4dd4268588ce9ec784875ab8e484a23c0c66836cb96cc6340c0d474ff:3-3-03", "phase": "recordOutcome", "terminal": true } @@ -166,7 +166,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "adminService:cmtraceopen.request.sha256.v1:aaed0dd34503443365ef8be494a344c589a37d241e8d05370b51a399beee2b59:cmtraceopen.operation.sha256.v1:36819ae35e44be7bafa2ba69cc69e50b53286f81dd0cbce4f2bc4974150fc7c2:synthetic:host:admin-service-01:synthetic:subject:admin-service-01" + "transactionId": "adminService:cmtraceopen.request.sha256.v1:aaed0dd34503443365ef8be494a344c589a37d241e8d05370b51a399beee2b59:cmtraceopen.operation.sha256.v1:36819ae35e44be7bafa2ba69cc69e50b53286f81dd0cbce4f2bc4974150fc7c2:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-backend-failure/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-backend-failure/expected.json index f15893efa..50f4651b5 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-backend-failure/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-backend-failure/expected.json @@ -2,13 +2,13 @@ "artifactRequests": [], "coverage": [ { - "artifactId": "admin-backend-current", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "crossSideCausalClaims": [], @@ -21,37 +21,37 @@ "coverageGaps": [], "evidence": [ { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:3-3", "lineEnd": 3, "lineStart": 3 }, { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:4-4", "lineEnd": 4, "lineStart": 4 }, { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:5-5", "lineEnd": 5, "lineStart": 5 } ], - "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:ed811b8050ba1f029dba64ff7caa00623603849848ad2c72ef68b54f80a3c60e", + "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:cd312ed5e01c11ec9b6dce620aa4f743f65576ea7ffd148e12008db9642f5c32", "nextArtifacts": [], "phase": "providerAndAdminService", "role": "adminService", @@ -61,8 +61,8 @@ { "kind": "observedFailure", "reference": { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:5-5", "lineEnd": 5, "lineStart": 5 } @@ -72,11 +72,11 @@ }, "lastSuccessfulPhase": "route", "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", - "subjectId": "adminService:cmtraceopen.request.sha256.v1:c83b03e700efb70eeb3a27cf47f69f9e54e59375f79b1d8b2896f4d89cfc32ab:cmtraceopen.operation.sha256.v1:526ee4e602f7917ad02c5a48c2c4406d02a9f6a19d27173de039e74896de2ec2:synthetic:host:admin-service-01:synthetic:subject:admin-service-01", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "subjectId": "adminService:cmtraceopen.request.sha256.v1:c83b03e700efb70eeb3a27cf47f69f9e54e59375f79b1d8b2896f4d89cfc32ab:cmtraceopen.operation.sha256.v1:526ee4e602f7917ad02c5a48c2c4406d02a9f6a19d27173de039e74896de2ec2:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "profiles": [ @@ -108,7 +108,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:admin-service-01", + "endpointHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -121,7 +121,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:526ee4e602f7917ad02c5a48c2c4406d02a9f6a19d27173de039e74896de2ec2", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "requestHandle": "cmtraceopen.request.sha256.v1:c83b03e700efb70eeb3a27cf47f69f9e54e59375f79b1d8b2896f4d89cfc32ab" }, "lastSuccessfulPhase": "route", @@ -132,13 +132,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "admin-backend-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:1-1-01", "phase": "receive", "terminal": false }, @@ -146,13 +146,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "admin-backend-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -160,13 +160,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "admin-backend-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:3-3-03", "phase": "route", "terminal": false }, @@ -174,13 +174,13 @@ "disposition": "failed", "evidence": [ { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:4-4", "lineEnd": 4, "lineStart": 4 } ], - "observationId": "admin-backend-current:4-4-04", + "observationId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:4-4-04", "phase": "executeBackendOperation", "terminal": false }, @@ -188,13 +188,13 @@ "disposition": "failed", "evidence": [ { - "artifactId": "admin-backend-current", - "entryId": "admin-backend-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1", + "entryId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:5-5", "lineEnd": 5, "lineStart": 5 } ], - "observationId": "admin-backend-current:5-5-05", + "observationId": "synthetic:artifact:sha256.v1:740d8904c9f08ce916ab359bf5fb81d54366036d5b32fec02b0355ccc68981b1:5-5-05", "phase": "recordOutcome", "terminal": true } @@ -206,7 +206,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "adminService:cmtraceopen.request.sha256.v1:c83b03e700efb70eeb3a27cf47f69f9e54e59375f79b1d8b2896f4d89cfc32ab:cmtraceopen.operation.sha256.v1:526ee4e602f7917ad02c5a48c2c4406d02a9f6a19d27173de039e74896de2ec2:synthetic:host:admin-service-01:synthetic:subject:admin-service-01" + "transactionId": "adminService:cmtraceopen.request.sha256.v1:c83b03e700efb70eeb3a27cf47f69f9e54e59375f79b1d8b2896f4d89cfc32ab:cmtraceopen.operation.sha256.v1:526ee4e602f7917ad02c5a48c2c4406d02a9f6a19d27173de039e74896de2ec2:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-parse-failed/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-parse-failed/expected.json index e101c8b7b..2b2801bd8 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-parse-failed/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-parse-failed/expected.json @@ -2,7 +2,7 @@ "artifactRequests": [ { "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "request": { "logicalId": "adminService", @@ -10,18 +10,18 @@ "role": "adminService" }, "sourceVersion": "5.00.TEST", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "coverage": [ { - "artifactId": "coverage-admin-parse-failed", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:a41d94f279f9ce85bec50cf7407eff01a3f7b86f8578cc96c6e92aa0ba352b71", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", "state": "parseFailed", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "crossSideCausalClaims": [], @@ -33,13 +33,13 @@ "correlationKeys": [], "coverageGaps": [ { - "artifactId": "coverage-admin-parse-failed", + "artifactId": "synthetic:artifact:sha256.v1:a41d94f279f9ce85bec50cf7407eff01a3f7b86f8578cc96c6e92aa0ba352b71", "coverage": "parseFailed", "role": "adminService" } ], "evidence": [], - "findingId": "provider-admin-coverage:coverage-admin-parse-failed", + "findingId": "provider-admin-coverage:synthetic:artifact:sha256.v1:a41d94f279f9ce85bec50cf7407eff01a3f7b86f8578cc96c6e92aa0ba352b71", "nextArtifacts": [ { "logicalId": "adminService", @@ -56,11 +56,11 @@ }, "lastSuccessfulPhase": null, "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", - "subjectId": "coverage-admin-parse-failed", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "subjectId": "synthetic:artifact:sha256.v1:a41d94f279f9ce85bec50cf7407eff01a3f7b86f8578cc96c6e92aa0ba352b71", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "profiles": [ diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-skipped/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-skipped/expected.json index 5f9deae25..0da885bdf 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-skipped/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-skipped/expected.json @@ -2,7 +2,7 @@ "artifactRequests": [ { "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "request": { "logicalId": "adminService", @@ -10,18 +10,18 @@ "role": "adminService" }, "sourceVersion": null, - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "coverage": [ { - "artifactId": "coverage-admin-skipped", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:6d50e660bbeb213d13489a41090a042b224e72afd17913d86178eca011ef792f", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service", "sourceVersion": null, "state": "skipped", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "crossSideCausalClaims": [], @@ -33,13 +33,13 @@ "correlationKeys": [], "coverageGaps": [ { - "artifactId": "coverage-admin-skipped", + "artifactId": "synthetic:artifact:sha256.v1:6d50e660bbeb213d13489a41090a042b224e72afd17913d86178eca011ef792f", "coverage": "skipped", "role": "adminService" } ], "evidence": [], - "findingId": "provider-admin-coverage:coverage-admin-skipped", + "findingId": "provider-admin-coverage:synthetic:artifact:sha256.v1:6d50e660bbeb213d13489a41090a042b224e72afd17913d86178eca011ef792f", "nextArtifacts": [ { "logicalId": "adminService", @@ -56,11 +56,11 @@ }, "lastSuccessfulPhase": null, "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "sourceId": "server-admin-service", "sourceVersion": null, - "subjectId": "coverage-admin-skipped", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "subjectId": "synthetic:artifact:sha256.v1:6d50e660bbeb213d13489a41090a042b224e72afd17913d86178eca011ef792f", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "profiles": [ diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-success/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-success/expected.json index 3b9218db4..6a7951a07 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-success/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/admin-service-success/expected.json @@ -2,13 +2,13 @@ "artifactRequests": [], "coverage": [ { - "artifactId": "admin-success-current", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "crossSideCausalClaims": [], @@ -42,7 +42,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:admin-service-01", + "endpointHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -55,7 +55,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:2d6d688f3314b2323ce53f3ead467801d78f03ad9de815273ae1bfeaf2f7fdf1", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "requestHandle": "cmtraceopen.request.sha256.v1:eff6cfda08449d552d2482cc2735ed08e2e4b65d6e20a90548ff4c95824e565a" }, "lastSuccessfulPhase": "recordOutcome", @@ -66,13 +66,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-success-current", - "entryId": "admin-success-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0", + "entryId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "admin-success-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:1-1-01", "phase": "receive", "terminal": false }, @@ -80,13 +80,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-success-current", - "entryId": "admin-success-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0", + "entryId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "admin-success-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -94,13 +94,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-success-current", - "entryId": "admin-success-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0", + "entryId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "admin-success-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:3-3-03", "phase": "route", "terminal": false }, @@ -108,13 +108,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-success-current", - "entryId": "admin-success-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0", + "entryId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:4-4", "lineEnd": 4, "lineStart": 4 } ], - "observationId": "admin-success-current:4-4-04", + "observationId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:4-4-04", "phase": "executeBackendOperation", "terminal": false }, @@ -122,13 +122,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-success-current", - "entryId": "admin-success-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0", + "entryId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:5-5", "lineEnd": 5, "lineStart": 5 } ], - "observationId": "admin-success-current:5-5-05", + "observationId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:5-5-05", "phase": "respond", "terminal": false }, @@ -136,13 +136,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-success-current", - "entryId": "admin-success-current:6-6", + "artifactId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0", + "entryId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:6-6", "lineEnd": 6, "lineStart": 6 } ], - "observationId": "admin-success-current:6-6-06", + "observationId": "synthetic:artifact:sha256.v1:2889cc8e3a74d8d6071d0a99f1cb52660a3eedbc83bdafe032c1013ed04eb2b0:6-6-06", "phase": "recordOutcome", "terminal": true } @@ -154,7 +154,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "adminService:cmtraceopen.request.sha256.v1:eff6cfda08449d552d2482cc2735ed08e2e4b65d6e20a90548ff4c95824e565a:cmtraceopen.operation.sha256.v1:2d6d688f3314b2323ce53f3ead467801d78f03ad9de815273ae1bfeaf2f7fdf1:synthetic:host:admin-service-01:synthetic:subject:admin-service-01" + "transactionId": "adminService:cmtraceopen.request.sha256.v1:eff6cfda08449d552d2482cc2735ed08e2e4b65d6e20a90548ff4c95824e565a:cmtraceopen.operation.sha256.v1:2d6d688f3314b2323ce53f3ead467801d78f03ad9de815273ae1bfeaf2f7fdf1:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/blocked-deferred/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/blocked-deferred/expected.json index eba08c0b8..f210847ff 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/blocked-deferred/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/blocked-deferred/expected.json @@ -2,7 +2,7 @@ "artifactRequests": [ { "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "request": { "logicalId": "adminService", @@ -10,18 +10,18 @@ "role": "adminService" }, "sourceVersion": "5.00.TEST", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "coverage": [ { - "artifactId": "blocked-deferred-admin-current", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "crossSideCausalClaims": [], @@ -34,25 +34,25 @@ "coverageGaps": [], "evidence": [ { - "artifactId": "blocked-deferred-admin-current", - "entryId": "blocked-deferred-admin-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5", + "entryId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "blocked-deferred-admin-current", - "entryId": "blocked-deferred-admin-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5", + "entryId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "blocked-deferred-admin-current", - "entryId": "blocked-deferred-admin-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5", + "entryId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5:3-3", "lineEnd": 3, "lineStart": 3 } ], - "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:1daee4807bef24f65f11588e50c2917eb53be2645485bc2da695e59165fa0ed2", + "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:47431b531453b9c7ade49fefd9a91a6248f67023bb08bca393e9c964335d483b", "nextArtifacts": [ { "logicalId": "adminService", @@ -69,11 +69,11 @@ }, "lastSuccessfulPhase": "authenticateOrAuthorize", "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", - "subjectId": "adminService:cmtraceopen.request.sha256.v1:c90815886d04b162dd7a2e2393ee97fbbbc1c5ccb166116ec825e167f0bb094b:cmtraceopen.operation.sha256.v1:845ac95236bc882dceb085e4c8f22b2080fa2f1731b7e30e3a63a5c22627f305:synthetic:host:admin-service-01:synthetic:subject:admin-service-01", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "subjectId": "adminService:cmtraceopen.request.sha256.v1:c90815886d04b162dd7a2e2393ee97fbbbc1c5ccb166116ec825e167f0bb094b:cmtraceopen.operation.sha256.v1:845ac95236bc882dceb085e4c8f22b2080fa2f1731b7e30e3a63a5c22627f305:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "profiles": [ @@ -105,7 +105,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:admin-service-01", + "endpointHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -118,7 +118,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:845ac95236bc882dceb085e4c8f22b2080fa2f1731b7e30e3a63a5c22627f305", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "requestHandle": "cmtraceopen.request.sha256.v1:c90815886d04b162dd7a2e2393ee97fbbbc1c5ccb166116ec825e167f0bb094b" }, "lastSuccessfulPhase": "authenticateOrAuthorize", @@ -126,7 +126,7 @@ "nextArtifactRequests": [ { "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "request": { "logicalId": "adminService", @@ -134,7 +134,7 @@ "role": "adminService" }, "sourceVersion": "5.00.TEST", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "observations": [ @@ -142,13 +142,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "blocked-deferred-admin-current", - "entryId": "blocked-deferred-admin-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5", + "entryId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "blocked-deferred-admin-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5:1-1-01", "phase": "receive", "terminal": false }, @@ -156,13 +156,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "blocked-deferred-admin-current", - "entryId": "blocked-deferred-admin-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5", + "entryId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "blocked-deferred-admin-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -170,13 +170,13 @@ "disposition": "pending", "evidence": [ { - "artifactId": "blocked-deferred-admin-current", - "entryId": "blocked-deferred-admin-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5", + "entryId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "blocked-deferred-admin-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:38470155bbb82614e18867255fdb56d56038c9ce4cc4ffe39f55d5501ddc24e5:3-3-03", "phase": "route", "terminal": false } @@ -188,7 +188,7 @@ "terminalEvidence": false, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "adminService:cmtraceopen.request.sha256.v1:c90815886d04b162dd7a2e2393ee97fbbbc1c5ccb166116ec825e167f0bb094b:cmtraceopen.operation.sha256.v1:845ac95236bc882dceb085e4c8f22b2080fa2f1731b7e30e3a63a5c22627f305:synthetic:host:admin-service-01:synthetic:subject:admin-service-01" + "transactionId": "adminService:cmtraceopen.request.sha256.v1:c90815886d04b162dd7a2e2393ee97fbbbc1c5ccb166116ec825e167f0bb094b:cmtraceopen.operation.sha256.v1:845ac95236bc882dceb085e4c8f22b2080fa2f1731b7e30e3a63a5c22627f305:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/contradictory-evidence/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/contradictory-evidence/expected.json index 4a6941b8a..8da6dc424 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/contradictory-evidence/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/contradictory-evidence/expected.json @@ -2,13 +2,13 @@ "artifactRequests": [], "coverage": [ { - "artifactId": "contradictory-provider-current", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -21,43 +21,43 @@ "coverageGaps": [], "evidence": [ { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:3-3", "lineEnd": 3, "lineStart": 3 }, { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:4-4", "lineEnd": 4, "lineStart": 4 }, { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:5-5", "lineEnd": 5, "lineStart": 5 }, { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:6-6", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:6-6", "lineEnd": 6, "lineStart": 6 } ], - "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:90053a39747d875b371d60ecddc5d814d7f83b83d8b2267db0229615824a50eb", + "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:11a988d254baf823819e3b73d3acb72da59b700dabfad178a8e9801adcf90abe", "nextArtifacts": [], "phase": "providerAndAdminService", "role": "provider", @@ -67,8 +67,8 @@ { "kind": "observedFailure", "reference": { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:6-6", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:6-6", "lineEnd": 6, "lineStart": 6 } @@ -78,11 +78,11 @@ }, "lastSuccessfulPhase": "recordOutcome", "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", - "subjectId": "provider:cmtraceopen.request.sha256.v1:e15a4cfebaf90cdd88c82b9b3aac5d8d046b083b42b751bbbad8aad4de4c0712:cmtraceopen.operation.sha256.v1:5c85529b2d5209d5fab67a4624f312b55977b53339770b99628ef6d00f339a3a:synthetic:host:provider-01:synthetic:subject:provider-01", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "subjectId": "provider:cmtraceopen.request.sha256.v1:e15a4cfebaf90cdd88c82b9b3aac5d8d046b083b42b751bbbad8aad4de4c0712:cmtraceopen.operation.sha256.v1:5c85529b2d5209d5fab67a4624f312b55977b53339770b99628ef6d00f339a3a:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "profiles": [ @@ -114,7 +114,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:provider-01", + "endpointHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -127,7 +127,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:5c85529b2d5209d5fab67a4624f312b55977b53339770b99628ef6d00f339a3a", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "requestHandle": "cmtraceopen.request.sha256.v1:e15a4cfebaf90cdd88c82b9b3aac5d8d046b083b42b751bbbad8aad4de4c0712" }, "lastSuccessfulPhase": "recordOutcome", @@ -138,13 +138,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "contradictory-provider-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:1-1-01", "phase": "receive", "terminal": false }, @@ -152,13 +152,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "contradictory-provider-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -166,13 +166,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "contradictory-provider-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:3-3-03", "phase": "executeProviderOperation", "terminal": false }, @@ -180,13 +180,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:4-4", "lineEnd": 4, "lineStart": 4 } ], - "observationId": "contradictory-provider-current:4-4-04", + "observationId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:4-4-04", "phase": "respond", "terminal": false }, @@ -194,13 +194,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:5-5", "lineEnd": 5, "lineStart": 5 } ], - "observationId": "contradictory-provider-current:5-5-05", + "observationId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:5-5-05", "phase": "recordOutcome", "terminal": true }, @@ -208,13 +208,13 @@ "disposition": "failed", "evidence": [ { - "artifactId": "contradictory-provider-current", - "entryId": "contradictory-provider-current:6-6", + "artifactId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905", + "entryId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:6-6", "lineEnd": 6, "lineStart": 6 } ], - "observationId": "contradictory-provider-current:6-6-06", + "observationId": "synthetic:artifact:sha256.v1:45060921b9a4f6e6d7bbfa664ff90e86d93ca49b5d2ff13d7b34c90e567db905:6-6-06", "phase": "recordOutcome", "terminal": true } @@ -226,7 +226,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "provider:cmtraceopen.request.sha256.v1:e15a4cfebaf90cdd88c82b9b3aac5d8d046b083b42b751bbbad8aad4de4c0712:cmtraceopen.operation.sha256.v1:5c85529b2d5209d5fab67a4624f312b55977b53339770b99628ef6d00f339a3a:synthetic:host:provider-01:synthetic:subject:provider-01" + "transactionId": "provider:cmtraceopen.request.sha256.v1:e15a4cfebaf90cdd88c82b9b3aac5d8d046b083b42b751bbbad8aad4de4c0712:cmtraceopen.operation.sha256.v1:5c85529b2d5209d5fab67a4624f312b55977b53339770b99628ef6d00f339a3a:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/iis-supplemental/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/iis-supplemental/expected.json index 6f6fe200e..1032a572d 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/iis-supplemental/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/iis-supplemental/expected.json @@ -2,22 +2,22 @@ "artifactRequests": [], "coverage": [ { - "artifactId": "admin-iis-current", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" }, { - "artifactId": "iis-supplemental-current", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:246edf20b542f4b024290629f7f018118897a361fa63b5be0a5b2de5009f44f0", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service-iis", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "crossSideCausalClaims": [], @@ -43,11 +43,11 @@ "sourceLocalObservations": [ { "artifactIds": [ - "iis-supplemental-current" + "synthetic:artifact:sha256.v1:246edf20b542f4b024290629f7f018118897a361fa63b5be0a5b2de5009f44f0" ], "correlationEligible": false, "kind": "supplementalOnly", - "observationId": "iis-supplemental-current-supplemental" + "observationId": "synthetic:artifact:sha256.v1:246edf20b542f4b024290629f7f018118897a361fa63b5be0a5b2de5009f44f0-supplemental" } ], "supportState": "syntheticProfileOnly", @@ -60,7 +60,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:admin-service-01", + "endpointHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -73,7 +73,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:52e7facc0b9f7e93cc97bb8b6163b90cd97a62cbfe354404ade4e49d28dbcfd5", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "requestHandle": "cmtraceopen.request.sha256.v1:ef09fc0c6d411c6d2a544f212cff0f369028a8b5891aecf94c976180f974d144" }, "lastSuccessfulPhase": "recordOutcome", @@ -84,13 +84,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-iis-current", - "entryId": "admin-iis-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82", + "entryId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "admin-iis-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:1-1-01", "phase": "receive", "terminal": false }, @@ -98,13 +98,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-iis-current", - "entryId": "admin-iis-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82", + "entryId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "admin-iis-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -112,13 +112,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-iis-current", - "entryId": "admin-iis-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82", + "entryId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "admin-iis-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:3-3-03", "phase": "route", "terminal": false }, @@ -126,13 +126,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-iis-current", - "entryId": "admin-iis-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82", + "entryId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:4-4", "lineEnd": 4, "lineStart": 4 } ], - "observationId": "admin-iis-current:4-4-04", + "observationId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:4-4-04", "phase": "executeBackendOperation", "terminal": false }, @@ -140,13 +140,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-iis-current", - "entryId": "admin-iis-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82", + "entryId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:5-5", "lineEnd": 5, "lineStart": 5 } ], - "observationId": "admin-iis-current:5-5-05", + "observationId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:5-5-05", "phase": "respond", "terminal": false }, @@ -154,13 +154,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "admin-iis-current", - "entryId": "admin-iis-current:6-6", + "artifactId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82", + "entryId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:6-6", "lineEnd": 6, "lineStart": 6 } ], - "observationId": "admin-iis-current:6-6-06", + "observationId": "synthetic:artifact:sha256.v1:0f017faeb3a725e34daff506e48284b203942ce943659c084773ee7e8319eb82:6-6-06", "phase": "recordOutcome", "terminal": true } @@ -172,7 +172,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "adminService:cmtraceopen.request.sha256.v1:ef09fc0c6d411c6d2a544f212cff0f369028a8b5891aecf94c976180f974d144:cmtraceopen.operation.sha256.v1:52e7facc0b9f7e93cc97bb8b6163b90cd97a62cbfe354404ade4e49d28dbcfd5:synthetic:host:admin-service-01:synthetic:subject:admin-service-01" + "transactionId": "adminService:cmtraceopen.request.sha256.v1:ef09fc0c6d411c6d2a544f212cff0f369028a8b5891aecf94c976180f974d144:cmtraceopen.operation.sha256.v1:52e7facc0b9f7e93cc97bb8b6163b90cd97a62cbfe354404ade4e49d28dbcfd5:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/incomplete/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/incomplete/expected.json index 9d13617a7..b569febdb 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/incomplete/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/incomplete/expected.json @@ -2,7 +2,7 @@ "artifactRequests": [ { "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "request": { "logicalId": "adminService", @@ -10,18 +10,18 @@ "role": "adminService" }, "sourceVersion": "5.00.TEST", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "coverage": [ { - "artifactId": "incomplete-admin-current", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:1354d3c84d186d5eb16b6c5ee3fbb2c2e509fed42707508fd75fe8e69faf20e5", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "crossSideCausalClaims": [], @@ -34,13 +34,13 @@ "coverageGaps": [], "evidence": [ { - "artifactId": "incomplete-admin-current", - "entryId": "incomplete-admin-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1354d3c84d186d5eb16b6c5ee3fbb2c2e509fed42707508fd75fe8e69faf20e5", + "entryId": "synthetic:artifact:sha256.v1:1354d3c84d186d5eb16b6c5ee3fbb2c2e509fed42707508fd75fe8e69faf20e5:1-1", "lineEnd": 1, "lineStart": 1 } ], - "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:b6bc5a43cb150c072701da1e1c4e8ad0a39a0921d4dd10e46528c49390a50ea7", + "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:3a0440788042dfbc71f1b994f2e254b410dfa5d09e489f08ea4d6e5b8e03cf8f", "nextArtifacts": [ { "logicalId": "adminService", @@ -57,11 +57,11 @@ }, "lastSuccessfulPhase": "receive", "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", - "subjectId": "adminService:cmtraceopen.request.sha256.v1:97a6cea7f46fc765262ee2f57d2e7e016177284ba8374f913746cc43a87621ca:cmtraceopen.operation.sha256.v1:905a8c2e653f8e07d78f0f2dfeab1d71fe77fff7cb18f9f26cf7894b9a7f5fce:synthetic:host:admin-service-01:synthetic:subject:admin-service-01", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "subjectId": "adminService:cmtraceopen.request.sha256.v1:97a6cea7f46fc765262ee2f57d2e7e016177284ba8374f913746cc43a87621ca:cmtraceopen.operation.sha256.v1:905a8c2e653f8e07d78f0f2dfeab1d71fe77fff7cb18f9f26cf7894b9a7f5fce:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "profiles": [ @@ -93,7 +93,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:admin-service-01", + "endpointHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -106,7 +106,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:905a8c2e653f8e07d78f0f2dfeab1d71fe77fff7cb18f9f26cf7894b9a7f5fce", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "requestHandle": "cmtraceopen.request.sha256.v1:97a6cea7f46fc765262ee2f57d2e7e016177284ba8374f913746cc43a87621ca" }, "lastSuccessfulPhase": "receive", @@ -114,7 +114,7 @@ "nextArtifactRequests": [ { "layer": "adminService", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "request": { "logicalId": "adminService", @@ -122,7 +122,7 @@ "role": "adminService" }, "sourceVersion": "5.00.TEST", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "observations": [ @@ -130,13 +130,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "incomplete-admin-current", - "entryId": "incomplete-admin-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1354d3c84d186d5eb16b6c5ee3fbb2c2e509fed42707508fd75fe8e69faf20e5", + "entryId": "synthetic:artifact:sha256.v1:1354d3c84d186d5eb16b6c5ee3fbb2c2e509fed42707508fd75fe8e69faf20e5:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "incomplete-admin-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:1354d3c84d186d5eb16b6c5ee3fbb2c2e509fed42707508fd75fe8e69faf20e5:1-1-01", "phase": "receive", "terminal": false } @@ -148,7 +148,7 @@ "terminalEvidence": false, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "adminService:cmtraceopen.request.sha256.v1:97a6cea7f46fc765262ee2f57d2e7e016177284ba8374f913746cc43a87621ca:cmtraceopen.operation.sha256.v1:905a8c2e653f8e07d78f0f2dfeab1d71fe77fff7cb18f9f26cf7894b9a7f5fce:synthetic:host:admin-service-01:synthetic:subject:admin-service-01" + "transactionId": "adminService:cmtraceopen.request.sha256.v1:97a6cea7f46fc765262ee2f57d2e7e016177284ba8374f913746cc43a87621ca:cmtraceopen.operation.sha256.v1:905a8c2e653f8e07d78f0f2dfeab1d71fe77fff7cb18f9f26cf7894b9a7f5fce:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/privacy-redaction/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/privacy-redaction/expected.json index 839e71226..b43cd16e4 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/privacy-redaction/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/privacy-redaction/expected.json @@ -2,22 +2,22 @@ "artifactRequests": [], "coverage": [ { - "artifactId": "privacy-admin-current", - "producerHostHandle": "synthetic:host:admin-service-01", + "artifactId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "producerRole": "adminService", "sourceId": "server-admin-service", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:admin-service-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" }, { - "artifactId": "privacy-provider-current", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -59,19 +59,19 @@ "sourceLocalObservations": [ { "artifactIds": [ - "privacy-admin-current" + "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d" ], "correlationEligible": false, "kind": "privacyRedacted", - "observationId": "privacy-admin-current-privacy" + "observationId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d-privacy" }, { "artifactIds": [ - "privacy-provider-current" + "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a" ], "correlationEligible": false, "kind": "privacyRedacted", - "observationId": "privacy-provider-current-privacy" + "observationId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a-privacy" } ], "supportState": "syntheticProfileOnly", @@ -84,7 +84,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:admin-service-01", + "endpointHandle": "synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -97,7 +97,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:cca09a76facbad65ba2d339785030164782e745b293c0ffd7ab3f3606398e849", - "producerHostHandle": "synthetic:host:admin-service-01", + "producerHostHandle": "synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869", "requestHandle": "cmtraceopen.request.sha256.v1:c1bf4eb3ae2066274cdc69dc3e504be5d662971573db81b8b1c49076c7c64070" }, "lastSuccessfulPhase": "recordOutcome", @@ -108,13 +108,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-admin-current", - "entryId": "privacy-admin-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d", + "entryId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "privacy-admin-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:1-1-01", "phase": "receive", "terminal": false }, @@ -122,13 +122,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-admin-current", - "entryId": "privacy-admin-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d", + "entryId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "privacy-admin-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -136,13 +136,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-admin-current", - "entryId": "privacy-admin-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d", + "entryId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "privacy-admin-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:3-3-03", "phase": "route", "terminal": false }, @@ -150,13 +150,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-admin-current", - "entryId": "privacy-admin-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d", + "entryId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:4-4", "lineEnd": 4, "lineStart": 4 } ], - "observationId": "privacy-admin-current:4-4-04", + "observationId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:4-4-04", "phase": "executeBackendOperation", "terminal": false }, @@ -164,13 +164,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-admin-current", - "entryId": "privacy-admin-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d", + "entryId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:5-5", "lineEnd": 5, "lineStart": 5 } ], - "observationId": "privacy-admin-current:5-5-05", + "observationId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:5-5-05", "phase": "respond", "terminal": false }, @@ -178,13 +178,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-admin-current", - "entryId": "privacy-admin-current:6-6", + "artifactId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d", + "entryId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:6-6", "lineEnd": 6, "lineStart": 6 } ], - "observationId": "privacy-admin-current:6-6-06", + "observationId": "synthetic:artifact:sha256.v1:9f98beb1b9e48db8ae02fe0ad0aebceeef5dbc901ff195226c952f1c2c4c391d:6-6-06", "phase": "recordOutcome", "terminal": true } @@ -196,7 +196,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "adminService:cmtraceopen.request.sha256.v1:c1bf4eb3ae2066274cdc69dc3e504be5d662971573db81b8b1c49076c7c64070:cmtraceopen.operation.sha256.v1:cca09a76facbad65ba2d339785030164782e745b293c0ffd7ab3f3606398e849:synthetic:host:admin-service-01:synthetic:subject:admin-service-01" + "transactionId": "adminService:cmtraceopen.request.sha256.v1:c1bf4eb3ae2066274cdc69dc3e504be5d662971573db81b8b1c49076c7c64070:cmtraceopen.operation.sha256.v1:cca09a76facbad65ba2d339785030164782e745b293c0ffd7ab3f3606398e849:synthetic:host:sha256.v1:a22cee83cad2c0c3caf233629d88256529ecfacad2ffd5dab098007b230bd869:synthetic:subject:sha256.v1:97c5ee816ecb52c212d362d881f4255e44e44c32db93952f9e5ef40a2a7dd92a" }, { "classification": "success", @@ -206,7 +206,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:provider-01", + "endpointHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -219,7 +219,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:f7d06e2b60022b880d60cf2c32ed17af1c034dc976092b0974e746d30244fb82", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "requestHandle": "cmtraceopen.request.sha256.v1:c1bf4eb3ae2066274cdc69dc3e504be5d662971573db81b8b1c49076c7c64070" }, "lastSuccessfulPhase": "recordOutcome", @@ -230,13 +230,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-provider-current", - "entryId": "privacy-provider-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a", + "entryId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "privacy-provider-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a:1-1-01", "phase": "receive", "terminal": false }, @@ -244,13 +244,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-provider-current", - "entryId": "privacy-provider-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a", + "entryId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "privacy-provider-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -258,13 +258,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-provider-current", - "entryId": "privacy-provider-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a", + "entryId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "privacy-provider-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a:3-3-03", "phase": "executeProviderOperation", "terminal": false }, @@ -272,13 +272,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-provider-current", - "entryId": "privacy-provider-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a", + "entryId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a:4-4", "lineEnd": 4, "lineStart": 4 } ], - "observationId": "privacy-provider-current:4-4-04", + "observationId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a:4-4-04", "phase": "respond", "terminal": false }, @@ -286,13 +286,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "privacy-provider-current", - "entryId": "privacy-provider-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a", + "entryId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a:5-5", "lineEnd": 5, "lineStart": 5 } ], - "observationId": "privacy-provider-current:5-5-05", + "observationId": "synthetic:artifact:sha256.v1:f0b79ff4d5ef303d6509dc8f56b4ec7829090a795df23c8521eb20069b63b75a:5-5-05", "phase": "recordOutcome", "terminal": true } @@ -304,7 +304,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "provider:cmtraceopen.request.sha256.v1:c1bf4eb3ae2066274cdc69dc3e504be5d662971573db81b8b1c49076c7c64070:cmtraceopen.operation.sha256.v1:f7d06e2b60022b880d60cf2c32ed17af1c034dc976092b0974e746d30244fb82:synthetic:host:provider-01:synthetic:subject:provider-01" + "transactionId": "provider:cmtraceopen.request.sha256.v1:c1bf4eb3ae2066274cdc69dc3e504be5d662971573db81b8b1c49076c7c64070:cmtraceopen.operation.sha256.v1:f7d06e2b60022b880d60cf2c32ed17af1c034dc976092b0974e746d30244fb82:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-authz-denied/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-authz-denied/expected.json index 29f827351..84879c218 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-authz-denied/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-authz-denied/expected.json @@ -2,13 +2,13 @@ "artifactRequests": [], "coverage": [ { - "artifactId": "provider-authz-current", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -21,25 +21,25 @@ "coverageGaps": [], "evidence": [ { - "artifactId": "provider-authz-current", - "entryId": "provider-authz-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6", + "entryId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "provider-authz-current", - "entryId": "provider-authz-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6", + "entryId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "provider-authz-current", - "entryId": "provider-authz-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6", + "entryId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6:3-3", "lineEnd": 3, "lineStart": 3 } ], - "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:e1af0eb5f901188dbce4e55b928bcfcbb4d4c8d3e3643e7835bd6f67d6748fa6", + "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:d3faa64eb188ca2f25766bac96008197a912d062819891ccfecdbe1cf790f3cf", "nextArtifacts": [], "phase": "providerAndAdminService", "role": "provider", @@ -49,8 +49,8 @@ { "kind": "observedFailure", "reference": { - "artifactId": "provider-authz-current", - "entryId": "provider-authz-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6", + "entryId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6:3-3", "lineEnd": 3, "lineStart": 3 } @@ -60,11 +60,11 @@ }, "lastSuccessfulPhase": "receive", "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", - "subjectId": "provider:cmtraceopen.request.sha256.v1:77c30000cce4b8fc20b350b127be93e98a151350148532a13a87be969f87cf41:cmtraceopen.operation.sha256.v1:fcdca2da9eaae5be46be853e5b18b78ce63bca3aea9f92597badfc3a2f8143b2:synthetic:host:provider-01:synthetic:subject:provider-01", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "subjectId": "provider:cmtraceopen.request.sha256.v1:77c30000cce4b8fc20b350b127be93e98a151350148532a13a87be969f87cf41:cmtraceopen.operation.sha256.v1:fcdca2da9eaae5be46be853e5b18b78ce63bca3aea9f92597badfc3a2f8143b2:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "profiles": [ @@ -96,7 +96,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:provider-01", + "endpointHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -109,7 +109,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:fcdca2da9eaae5be46be853e5b18b78ce63bca3aea9f92597badfc3a2f8143b2", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "requestHandle": "cmtraceopen.request.sha256.v1:77c30000cce4b8fc20b350b127be93e98a151350148532a13a87be969f87cf41" }, "lastSuccessfulPhase": "receive", @@ -120,13 +120,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-authz-current", - "entryId": "provider-authz-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6", + "entryId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "provider-authz-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6:1-1-01", "phase": "receive", "terminal": false }, @@ -134,13 +134,13 @@ "disposition": "failed", "evidence": [ { - "artifactId": "provider-authz-current", - "entryId": "provider-authz-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6", + "entryId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "provider-authz-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -148,13 +148,13 @@ "disposition": "failed", "evidence": [ { - "artifactId": "provider-authz-current", - "entryId": "provider-authz-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6", + "entryId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "provider-authz-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:5788904154df684d7053bd6b249947dc475cef981613e10942bf3151fb826ca6:3-3-03", "phase": "recordOutcome", "terminal": true } @@ -166,7 +166,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "provider:cmtraceopen.request.sha256.v1:77c30000cce4b8fc20b350b127be93e98a151350148532a13a87be969f87cf41:cmtraceopen.operation.sha256.v1:fcdca2da9eaae5be46be853e5b18b78ce63bca3aea9f92597badfc3a2f8143b2:synthetic:host:provider-01:synthetic:subject:provider-01" + "transactionId": "provider:cmtraceopen.request.sha256.v1:77c30000cce4b8fc20b350b127be93e98a151350148532a13a87be969f87cf41:cmtraceopen.operation.sha256.v1:fcdca2da9eaae5be46be853e5b18b78ce63bca3aea9f92597badfc3a2f8143b2:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-query-failure/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-query-failure/expected.json index e72247fa9..b2b0f7db0 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-query-failure/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-query-failure/expected.json @@ -2,13 +2,13 @@ "artifactRequests": [], "coverage": [ { - "artifactId": "provider-query-current", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -21,31 +21,31 @@ "coverageGaps": [], "evidence": [ { - "artifactId": "provider-query-current", - "entryId": "provider-query-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8", + "entryId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "provider-query-current", - "entryId": "provider-query-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8", + "entryId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "provider-query-current", - "entryId": "provider-query-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8", + "entryId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:3-3", "lineEnd": 3, "lineStart": 3 }, { - "artifactId": "provider-query-current", - "entryId": "provider-query-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8", + "entryId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:4-4", "lineEnd": 4, "lineStart": 4 } ], - "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:0b4d32911441b1129ffb0ccc83596503ed18bfff0c884b79598a705cc24354d3", + "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:376e093ec1b038c62f9771834e2aa03a4ad3c1dec9b774c55911ebf3a35271d2", "nextArtifacts": [], "phase": "providerAndAdminService", "role": "provider", @@ -55,8 +55,8 @@ { "kind": "observedFailure", "reference": { - "artifactId": "provider-query-current", - "entryId": "provider-query-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8", + "entryId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:4-4", "lineEnd": 4, "lineStart": 4 } @@ -66,11 +66,11 @@ }, "lastSuccessfulPhase": "authenticateOrAuthorize", "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", - "subjectId": "provider:cmtraceopen.request.sha256.v1:618f1a429a91316d819f7a982e0efa06caa436f9d980f6fd2734650bf92fb8a7:cmtraceopen.operation.sha256.v1:f8531c63ceea45b588fb4ae3eb63e391a4f8bf6655d93cc2d66d4d4adc53935b:synthetic:host:provider-01:synthetic:subject:provider-01", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "subjectId": "provider:cmtraceopen.request.sha256.v1:618f1a429a91316d819f7a982e0efa06caa436f9d980f6fd2734650bf92fb8a7:cmtraceopen.operation.sha256.v1:f8531c63ceea45b588fb4ae3eb63e391a4f8bf6655d93cc2d66d4d4adc53935b:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "profiles": [ @@ -102,7 +102,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:provider-01", + "endpointHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -115,7 +115,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:f8531c63ceea45b588fb4ae3eb63e391a4f8bf6655d93cc2d66d4d4adc53935b", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "requestHandle": "cmtraceopen.request.sha256.v1:618f1a429a91316d819f7a982e0efa06caa436f9d980f6fd2734650bf92fb8a7" }, "lastSuccessfulPhase": "authenticateOrAuthorize", @@ -126,13 +126,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-query-current", - "entryId": "provider-query-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8", + "entryId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "provider-query-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:1-1-01", "phase": "receive", "terminal": false }, @@ -140,13 +140,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-query-current", - "entryId": "provider-query-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8", + "entryId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "provider-query-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -154,13 +154,13 @@ "disposition": "failed", "evidence": [ { - "artifactId": "provider-query-current", - "entryId": "provider-query-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8", + "entryId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "provider-query-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:3-3-03", "phase": "executeProviderOperation", "terminal": false }, @@ -168,13 +168,13 @@ "disposition": "failed", "evidence": [ { - "artifactId": "provider-query-current", - "entryId": "provider-query-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8", + "entryId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:4-4", "lineEnd": 4, "lineStart": 4 } ], - "observationId": "provider-query-current:4-4-04", + "observationId": "synthetic:artifact:sha256.v1:c9b7adb787a29a142403c1f32a45821587bf94ed0809e8713e011a8293a88ca8:4-4-04", "phase": "recordOutcome", "terminal": true } @@ -186,7 +186,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "provider:cmtraceopen.request.sha256.v1:618f1a429a91316d819f7a982e0efa06caa436f9d980f6fd2734650bf92fb8a7:cmtraceopen.operation.sha256.v1:f8531c63ceea45b588fb4ae3eb63e391a4f8bf6655d93cc2d66d4d4adc53935b:synthetic:host:provider-01:synthetic:subject:provider-01" + "transactionId": "provider:cmtraceopen.request.sha256.v1:618f1a429a91316d819f7a982e0efa06caa436f9d980f6fd2734650bf92fb8a7:cmtraceopen.operation.sha256.v1:f8531c63ceea45b588fb4ae3eb63e391a4f8bf6655d93cc2d66d4d4adc53935b:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-retry/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-retry/expected.json index 0af038662..8eac4e15d 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-retry/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-retry/expected.json @@ -2,13 +2,13 @@ "artifactRequests": [], "coverage": [ { - "artifactId": "provider-retry-current", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -21,43 +21,43 @@ "coverageGaps": [], "evidence": [ { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:3-3", "lineEnd": 3, "lineStart": 3 }, { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:4-4", "lineEnd": 4, "lineStart": 4 }, { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:5-5", "lineEnd": 5, "lineStart": 5 }, { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:6-6", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:6-6", "lineEnd": 6, "lineStart": 6 } ], - "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:0ba6ec760743d0091fa3a679aaff3c40e01009da41283646edebe2acbca49bb7", + "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:5e62dfcf737ed3276a00f7f38f035d56ea34cb79dc841158c7b26957144ec5a2", "nextArtifacts": [], "phase": "providerAndAdminService", "role": "provider", @@ -68,11 +68,11 @@ }, "lastSuccessfulPhase": "recordOutcome", "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", - "subjectId": "provider:cmtraceopen.request.sha256.v1:56eabbf71e1d01bf5bd805b2946dbf57d241c29f841155a98b372031c0778890:cmtraceopen.operation.sha256.v1:4a9ec7dbcf07d5b0bf06307983a0863ffaec89cd51e6d265342e9a733ccf28ef:synthetic:host:provider-01:synthetic:subject:provider-01", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "subjectId": "provider:cmtraceopen.request.sha256.v1:56eabbf71e1d01bf5bd805b2946dbf57d241c29f841155a98b372031c0778890:cmtraceopen.operation.sha256.v1:4a9ec7dbcf07d5b0bf06307983a0863ffaec89cd51e6d265342e9a733ccf28ef:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "profiles": [ @@ -104,7 +104,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:provider-01", + "endpointHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -117,7 +117,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:4a9ec7dbcf07d5b0bf06307983a0863ffaec89cd51e6d265342e9a733ccf28ef", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "requestHandle": "cmtraceopen.request.sha256.v1:56eabbf71e1d01bf5bd805b2946dbf57d241c29f841155a98b372031c0778890" }, "lastSuccessfulPhase": "recordOutcome", @@ -128,13 +128,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "provider-retry-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:1-1-01", "phase": "receive", "terminal": false }, @@ -142,13 +142,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "provider-retry-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -156,13 +156,13 @@ "disposition": "retryableFailure", "evidence": [ { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "provider-retry-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:3-3-03", "phase": "executeProviderOperation", "terminal": false }, @@ -170,13 +170,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:4-4", "lineEnd": 4, "lineStart": 4 } ], - "observationId": "provider-retry-current:4-4-04", + "observationId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:4-4-04", "phase": "executeProviderOperation", "terminal": false }, @@ -184,13 +184,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:5-5", "lineEnd": 5, "lineStart": 5 } ], - "observationId": "provider-retry-current:5-5-05", + "observationId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:5-5-05", "phase": "respond", "terminal": false }, @@ -198,13 +198,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-retry-current", - "entryId": "provider-retry-current:6-6", + "artifactId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2", + "entryId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:6-6", "lineEnd": 6, "lineStart": 6 } ], - "observationId": "provider-retry-current:6-6-06", + "observationId": "synthetic:artifact:sha256.v1:f993cb0337ba653fb37dc9a54623915b53c46322de12ac192343e516e2ac82a2:6-6-06", "phase": "recordOutcome", "terminal": true } @@ -216,7 +216,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "provider:cmtraceopen.request.sha256.v1:56eabbf71e1d01bf5bd805b2946dbf57d241c29f841155a98b372031c0778890:cmtraceopen.operation.sha256.v1:4a9ec7dbcf07d5b0bf06307983a0863ffaec89cd51e6d265342e9a733ccf28ef:synthetic:host:provider-01:synthetic:subject:provider-01" + "transactionId": "provider:cmtraceopen.request.sha256.v1:56eabbf71e1d01bf5bd805b2946dbf57d241c29f841155a98b372031c0778890:cmtraceopen.operation.sha256.v1:4a9ec7dbcf07d5b0bf06307983a0863ffaec89cd51e6d265342e9a733ccf28ef:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-absent/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-absent/expected.json index a5a70992c..1e2980fd3 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-absent/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-absent/expected.json @@ -2,7 +2,7 @@ "artifactRequests": [ { "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "request": { "logicalId": "smsprov", @@ -10,18 +10,18 @@ "role": "provider" }, "sourceVersion": null, - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "coverage": [ { - "artifactId": "coverage-provider-absent", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:164842f506419e46716997f7c7587e431c0ff1cb084c584187beb03d0dab03dc", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": null, "state": "absent", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -33,13 +33,13 @@ "correlationKeys": [], "coverageGaps": [ { - "artifactId": "coverage-provider-absent", + "artifactId": "synthetic:artifact:sha256.v1:164842f506419e46716997f7c7587e431c0ff1cb084c584187beb03d0dab03dc", "coverage": "absent", "role": "provider" } ], "evidence": [], - "findingId": "provider-admin-coverage:coverage-provider-absent", + "findingId": "provider-admin-coverage:synthetic:artifact:sha256.v1:164842f506419e46716997f7c7587e431c0ff1cb084c584187beb03d0dab03dc", "nextArtifacts": [ { "logicalId": "smsprov", @@ -56,11 +56,11 @@ }, "lastSuccessfulPhase": null, "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "sourceId": "server-provider", "sourceVersion": null, - "subjectId": "coverage-provider-absent", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "subjectId": "synthetic:artifact:sha256.v1:164842f506419e46716997f7c7587e431c0ff1cb084c584187beb03d0dab03dc", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "profiles": [ diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-capped/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-capped/expected.json index 120ee7dcf..b61f908c2 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-capped/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-capped/expected.json @@ -2,7 +2,7 @@ "artifactRequests": [ { "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "request": { "logicalId": "smsprov", @@ -10,18 +10,18 @@ "role": "provider" }, "sourceVersion": "5.00.TEST", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "coverage": [ { - "artifactId": "coverage-provider-capped", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:638136234bf972d2f880fec86e7bee7dbce1ab79486839130cf639c6b1a9ac99", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", "state": "capped", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -33,13 +33,13 @@ "correlationKeys": [], "coverageGaps": [ { - "artifactId": "coverage-provider-capped", + "artifactId": "synthetic:artifact:sha256.v1:638136234bf972d2f880fec86e7bee7dbce1ab79486839130cf639c6b1a9ac99", "coverage": "capped", "role": "provider" } ], "evidence": [], - "findingId": "provider-admin-coverage:coverage-provider-capped", + "findingId": "provider-admin-coverage:synthetic:artifact:sha256.v1:638136234bf972d2f880fec86e7bee7dbce1ab79486839130cf639c6b1a9ac99", "nextArtifacts": [ { "logicalId": "smsprov", @@ -56,11 +56,11 @@ }, "lastSuccessfulPhase": null, "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", - "subjectId": "coverage-provider-capped", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "subjectId": "synthetic:artifact:sha256.v1:638136234bf972d2f880fec86e7bee7dbce1ab79486839130cf639c6b1a9ac99", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "profiles": [ @@ -84,11 +84,11 @@ "sourceLocalObservations": [ { "artifactIds": [ - "coverage-provider-capped" + "synthetic:artifact:sha256.v1:638136234bf972d2f880fec86e7bee7dbce1ab79486839130cf639c6b1a9ac99" ], "correlationEligible": false, "kind": "rotationFragment", - "observationId": "coverage-provider-capped-rotation" + "observationId": "synthetic:artifact:sha256.v1:638136234bf972d2f880fec86e7bee7dbce1ab79486839130cf639c6b1a9ac99-rotation" } ], "supportState": "syntheticProfileOnly", diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-unsupported/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-unsupported/expected.json index e579fdb4e..afd3e6c71 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-unsupported/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-source-unsupported/expected.json @@ -2,7 +2,7 @@ "artifactRequests": [ { "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "request": { "logicalId": "smsprov", @@ -10,18 +10,18 @@ "role": "provider" }, "sourceVersion": null, - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "coverage": [ { - "artifactId": "coverage-provider-unsupported", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:334946c879872ad1443f7620279390f4a3c34b591eeaa4072e433eb812c2e556", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": null, "state": "unsupported", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -33,13 +33,13 @@ "correlationKeys": [], "coverageGaps": [ { - "artifactId": "coverage-provider-unsupported", + "artifactId": "synthetic:artifact:sha256.v1:334946c879872ad1443f7620279390f4a3c34b591eeaa4072e433eb812c2e556", "coverage": "unsupported", "role": "provider" } ], "evidence": [], - "findingId": "provider-admin-coverage:coverage-provider-unsupported", + "findingId": "provider-admin-coverage:synthetic:artifact:sha256.v1:334946c879872ad1443f7620279390f4a3c34b591eeaa4072e433eb812c2e556", "nextArtifacts": [ { "logicalId": "smsprov", @@ -56,11 +56,11 @@ }, "lastSuccessfulPhase": null, "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "sourceId": "server-provider", "sourceVersion": null, - "subjectId": "coverage-provider-unsupported", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "subjectId": "synthetic:artifact:sha256.v1:334946c879872ad1443f7620279390f4a3c34b591eeaa4072e433eb812c2e556", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "profiles": [ diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-success/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-success/expected.json index 45f5219f4..7f106eecc 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-success/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-success/expected.json @@ -2,13 +2,13 @@ "artifactRequests": [], "coverage": [ { - "artifactId": "provider-success-current", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -42,7 +42,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:provider-01", + "endpointHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -55,7 +55,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:d7887edd39e359767a86999e1312648ebc17a6c9813b172f03883914bc334a7f", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "requestHandle": "cmtraceopen.request.sha256.v1:8e30a49c634a05e538c508d53fe5699ab3e52ce078e500e64a5322c1593f40f4" }, "lastSuccessfulPhase": "recordOutcome", @@ -66,13 +66,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-success-current", - "entryId": "provider-success-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4", + "entryId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "provider-success-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4:1-1-01", "phase": "receive", "terminal": false }, @@ -80,13 +80,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-success-current", - "entryId": "provider-success-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4", + "entryId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "provider-success-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -94,13 +94,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-success-current", - "entryId": "provider-success-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4", + "entryId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "provider-success-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4:3-3-03", "phase": "executeProviderOperation", "terminal": false }, @@ -108,13 +108,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-success-current", - "entryId": "provider-success-current:4-4", + "artifactId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4", + "entryId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4:4-4", "lineEnd": 4, "lineStart": 4 } ], - "observationId": "provider-success-current:4-4-04", + "observationId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4:4-4-04", "phase": "respond", "terminal": false }, @@ -122,13 +122,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-success-current", - "entryId": "provider-success-current:5-5", + "artifactId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4", + "entryId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4:5-5", "lineEnd": 5, "lineStart": 5 } ], - "observationId": "provider-success-current:5-5-05", + "observationId": "synthetic:artifact:sha256.v1:1335ea801287b9d73389e0040b44dc84690aed29bcda27faaebfa79ea85eaea4:5-5-05", "phase": "recordOutcome", "terminal": true } @@ -140,7 +140,7 @@ "terminalEvidence": true, "timestampOrdering": "usable", "topologyCompatibility": "exact", - "transactionId": "provider:cmtraceopen.request.sha256.v1:8e30a49c634a05e538c508d53fe5699ab3e52ce078e500e64a5322c1593f40f4:cmtraceopen.operation.sha256.v1:d7887edd39e359767a86999e1312648ebc17a6c9813b172f03883914bc334a7f:synthetic:host:provider-01:synthetic:subject:provider-01" + "transactionId": "provider:cmtraceopen.request.sha256.v1:8e30a49c634a05e538c508d53fe5699ab3e52ce078e500e64a5322c1593f40f4:cmtraceopen.operation.sha256.v1:d7887edd39e359767a86999e1312648ebc17a6c9813b172f03883914bc334a7f:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-timeout/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-timeout/expected.json index 1c6e8ea87..e5df17946 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-timeout/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/provider-timeout/expected.json @@ -2,7 +2,7 @@ "artifactRequests": [ { "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "request": { "logicalId": "smsprov", @@ -10,18 +10,18 @@ "role": "provider" }, "sourceVersion": "5.00.TEST", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "coverage": [ { - "artifactId": "provider-timeout-current", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", "state": "captured", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -34,25 +34,25 @@ "coverageGaps": [], "evidence": [ { - "artifactId": "provider-timeout-current", - "entryId": "provider-timeout-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45", + "entryId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45:1-1", "lineEnd": 1, "lineStart": 1 }, { - "artifactId": "provider-timeout-current", - "entryId": "provider-timeout-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45", + "entryId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45:2-2", "lineEnd": 2, "lineStart": 2 }, { - "artifactId": "provider-timeout-current", - "entryId": "provider-timeout-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45", + "entryId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45:3-3", "lineEnd": 3, "lineStart": 3 } ], - "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:a905773c9e4bccf6937959c95f0a6b7e5f2d7d54466edcdf738787f65be7230e", + "findingId": "provider-admin-finding:cmtraceopen.finding.sha256.v1:64200bc7692b1112b73b8fdab1a81bad40ec802a9156e68e78c3b60d906f0f79", "nextArtifacts": [ { "logicalId": "smsprov", @@ -69,11 +69,11 @@ }, "lastSuccessfulPhase": null, "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "sourceId": "server-provider", "sourceVersion": "5.00.TEST", - "subjectId": "provider:cmtraceopen.request.sha256.v1:0cc4a44c3fed5ad67d93ffcf74331cf00b27aead47742bdcc118c0a268e52388:cmtraceopen.operation.sha256.v1:81b06444c4b09f92d8fbcf959a2aa771feb38d74be73dec8a8a333797d515fa1:synthetic:host:provider-01:synthetic:subject:provider-01", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "subjectId": "provider:cmtraceopen.request.sha256.v1:0cc4a44c3fed5ad67d93ffcf74331cf00b27aead47742bdcc118c0a268e52388:cmtraceopen.operation.sha256.v1:81b06444c4b09f92d8fbcf959a2aa771feb38d74be73dec8a8a333797d515fa1:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "profiles": [ @@ -105,7 +105,7 @@ "coverageGapArtifactIds": [], "key": { "confidence": "low", - "endpointHandle": "synthetic:subject:provider-01", + "endpointHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a", "extractionProfile": { "configmgrVersionPrefixes": [ "5.00.TEST" @@ -118,7 +118,7 @@ ] }, "operationHandle": "cmtraceopen.operation.sha256.v1:81b06444c4b09f92d8fbcf959a2aa771feb38d74be73dec8a8a333797d515fa1", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "requestHandle": "cmtraceopen.request.sha256.v1:0cc4a44c3fed5ad67d93ffcf74331cf00b27aead47742bdcc118c0a268e52388" }, "lastSuccessfulPhase": null, @@ -126,7 +126,7 @@ "nextArtifactRequests": [ { "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "request": { "logicalId": "smsprov", @@ -134,7 +134,7 @@ "role": "provider" }, "sourceVersion": "5.00.TEST", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "observations": [ @@ -142,13 +142,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-timeout-current", - "entryId": "provider-timeout-current:1-1", + "artifactId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45", + "entryId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45:1-1", "lineEnd": 1, "lineStart": 1 } ], - "observationId": "provider-timeout-current:1-1-01", + "observationId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45:1-1-01", "phase": "receive", "terminal": false }, @@ -156,13 +156,13 @@ "disposition": "succeeded", "evidence": [ { - "artifactId": "provider-timeout-current", - "entryId": "provider-timeout-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45", + "entryId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45:2-2", "lineEnd": 2, "lineStart": 2 } ], - "observationId": "provider-timeout-current:2-2-02", + "observationId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45:2-2-02", "phase": "authenticateOrAuthorize", "terminal": false }, @@ -170,13 +170,13 @@ "disposition": "pending", "evidence": [ { - "artifactId": "provider-timeout-current", - "entryId": "provider-timeout-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45", + "entryId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45:3-3", "lineEnd": 3, "lineStart": 3 } ], - "observationId": "provider-timeout-current:3-3-03", + "observationId": "synthetic:artifact:sha256.v1:2f1e766cdaf40aebacef9e034b5b9327c0454fac8c472415cfb9d02603163f45:3-3-03", "phase": "executeProviderOperation", "terminal": false } @@ -188,7 +188,7 @@ "terminalEvidence": false, "timestampOrdering": "unusable", "topologyCompatibility": "exact", - "transactionId": "provider:cmtraceopen.request.sha256.v1:0cc4a44c3fed5ad67d93ffcf74331cf00b27aead47742bdcc118c0a268e52388:cmtraceopen.operation.sha256.v1:81b06444c4b09f92d8fbcf959a2aa771feb38d74be73dec8a8a333797d515fa1:synthetic:host:provider-01:synthetic:subject:provider-01" + "transactionId": "provider:cmtraceopen.request.sha256.v1:0cc4a44c3fed5ad67d93ffcf74331cf00b27aead47742bdcc118c0a268e52388:cmtraceopen.operation.sha256.v1:81b06444c4b09f92d8fbcf959a2aa771feb38d74be73dec8a8a333797d515fa1:synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46:synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "workflow": "providerAndAdminService" diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/rotation-boundary/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/rotation-boundary/expected.json index 0fdae4b9f..595bd46ef 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/rotation-boundary/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/provider_and_admin_service/rotation-boundary/expected.json @@ -2,7 +2,7 @@ "artifactRequests": [ { "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "request": { "logicalId": "smsprov", @@ -10,27 +10,27 @@ "role": "provider" }, "sourceVersion": null, - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "coverage": [ { - "artifactId": "rotation-01-current", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:74c4dbd840d49599e5493974bb14d3ec6c1fa9a121cafab7acb68f27be982f66", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": null, "state": "parseFailed", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" }, { - "artifactId": "rotation-02-lo", - "producerHostHandle": "synthetic:host:provider-01", + "artifactId": "synthetic:artifact:sha256.v1:b755717f473fd02da03bfb215a0607120af5005a718980a342caaba72b7fab77", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "producerRole": "provider", "sourceId": "server-provider", "sourceVersion": null, "state": "parseFailed", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "crossSideCausalClaims": [], @@ -42,13 +42,13 @@ "correlationKeys": [], "coverageGaps": [ { - "artifactId": "rotation-01-current", + "artifactId": "synthetic:artifact:sha256.v1:74c4dbd840d49599e5493974bb14d3ec6c1fa9a121cafab7acb68f27be982f66", "coverage": "parseFailed", "role": "provider" } ], "evidence": [], - "findingId": "provider-admin-coverage:rotation-01-current", + "findingId": "provider-admin-coverage:synthetic:artifact:sha256.v1:74c4dbd840d49599e5493974bb14d3ec6c1fa9a121cafab7acb68f27be982f66", "nextArtifacts": [ { "logicalId": "smsprov", @@ -65,11 +65,11 @@ }, "lastSuccessfulPhase": null, "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "sourceId": "server-provider", "sourceVersion": null, - "subjectId": "rotation-01-current", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "subjectId": "synthetic:artifact:sha256.v1:74c4dbd840d49599e5493974bb14d3ec6c1fa9a121cafab7acb68f27be982f66", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" }, { "finding": { @@ -78,13 +78,13 @@ "correlationKeys": [], "coverageGaps": [ { - "artifactId": "rotation-02-lo", + "artifactId": "synthetic:artifact:sha256.v1:b755717f473fd02da03bfb215a0607120af5005a718980a342caaba72b7fab77", "coverage": "parseFailed", "role": "provider" } ], "evidence": [], - "findingId": "provider-admin-coverage:rotation-02-lo", + "findingId": "provider-admin-coverage:synthetic:artifact:sha256.v1:b755717f473fd02da03bfb215a0607120af5005a718980a342caaba72b7fab77", "nextArtifacts": [ { "logicalId": "smsprov", @@ -101,11 +101,11 @@ }, "lastSuccessfulPhase": null, "layer": "provider", - "producerHostHandle": "synthetic:host:provider-01", + "producerHostHandle": "synthetic:host:sha256.v1:4f6c00f9e19e174d139dcbaa26ba5fa995d9537ce2238e02b2f518bd55ebed46", "sourceId": "server-provider", "sourceVersion": null, - "subjectId": "rotation-02-lo", - "workflowSubjectHandle": "synthetic:subject:provider-01" + "subjectId": "synthetic:artifact:sha256.v1:b755717f473fd02da03bfb215a0607120af5005a718980a342caaba72b7fab77", + "workflowSubjectHandle": "synthetic:subject:sha256.v1:41cf7f39acc91e4fbb6bab3c5686739bc5829dc9c6812ec1eb5651c4bf94c98a" } ], "profiles": [ @@ -129,19 +129,19 @@ "sourceLocalObservations": [ { "artifactIds": [ - "rotation-01-current" + "synthetic:artifact:sha256.v1:74c4dbd840d49599e5493974bb14d3ec6c1fa9a121cafab7acb68f27be982f66" ], "correlationEligible": false, "kind": "rotationFragment", - "observationId": "rotation-01-current-rotation" + "observationId": "synthetic:artifact:sha256.v1:74c4dbd840d49599e5493974bb14d3ec6c1fa9a121cafab7acb68f27be982f66-rotation" }, { "artifactIds": [ - "rotation-02-lo" + "synthetic:artifact:sha256.v1:b755717f473fd02da03bfb215a0607120af5005a718980a342caaba72b7fab77" ], "correlationEligible": false, "kind": "rotationFragment", - "observationId": "rotation-02-lo-rotation" + "observationId": "synthetic:artifact:sha256.v1:b755717f473fd02da03bfb215a0607120af5005a718980a342caaba72b7fab77-rotation" } ], "supportState": "syntheticProfileOnly", diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/component-failure/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/component-failure/expected.json index 28545de8a..d1f1a5fa3 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/component-failure/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/component-failure/expected.json @@ -1,186 +1,200 @@ { - "schemaVersion": 1, - "workflow": "siteCore", - "profile": { - "id": "sccm-site-core", - "version": 1, - "stability": "experimental" - }, - "stateChain": [ - "componentStart", - "componentWork", - "inboxOrQueue", - "statusOrStateProcessing", - "healthyOrTerminal" - ], - "results": [ + "artifactRequests": [ { - "resultId": "site-core:result:v1:a3220d3e9eebc073daf7575a24654c9c3174140ad298b9b2d72b4ebfa95b957d", - "transactionKey": { - "profileId": "sccm-site-core", - "profileVersion": 1, - "siteHandle": "synthetic:site:lab", - "producerHostHandle": "synthetic:host:site-01", - "componentId": "SMS_EXECUTIVE", - "workItemId": "SC-COMPFAIL-001" - }, - "state": "terminalFailure", - "lastSuccessfulPhase": "componentWork", - "findingClass": "confirmedFailure", - "confidence": "high", - "confidenceCeiling": "high", - "evidence": [ - { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 - }, - { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:2-2", - "lineStart": 2, - "lineEnd": 2 - }, + "candidates": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", - "lineStart": 3, - "lineEnd": 3, - "terminal": true + "basename": "statmgr.log", + "rotation": "current" } ], - "coverageGapArtifactIds": ["z-site-status"], - "nextArtifacts": [] - } - ], - "unlinkedObservations": [ - { - "observationId": "site-core:observation:v1:3c9d38e20784d06345b49e9978c0ee0a106b87001ac62428d18c41115f72a2f0", - "state": "parseGap", - "findingClass": "insufficientEvidence", - "confidence": "none", - "evidence": [], - "coverageGapArtifactIds": ["z-site-status"], - "nextArtifacts": [ - { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "required-source-absent", - "candidates": [{ "basename": "statmgr.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "site-status-z" - } - } - ] + "logicalName": "server-status", + "maxArtifacts": 1, + "reasonCode": "required-source-absent", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:d69adee776032725b5bc1a2186ca41ef91956ab03ed4c1d25211004c808b5f75" + } } ], "coverageGaps": [ { - "artifactId": "z-site-status", - "sourceId": "server-status", - "state": "absent", + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "diagnosticMeaning": "coverageOnly", "reasonCode": "required-source-absent", - "diagnosticMeaning": "coverageOnly" + "sourceId": "server-status", + "state": "absent" } ], + "crossSideCorrelationPerformed": false, "findings": [ { - "findingId": "site-core:finding:v1:3904d5916025a996b54227f390835cf3a9417264aa9d80d592e59e58793fe0ee", "class": "insufficientEvidence", - "phase": "siteCoreCoverage", - "role": "siteServer", - "severity": "Warning", "confidence": "none", - "title": "Site core coverage gap", - "summary": "The source is incomplete and cannot establish a component outcome.", - "evidence": [], - "terminalEvidence": [], + "correlationKeys": [], "coverageGaps": [ { - "artifactId": "z-site-status", - "role": "siteServer", - "coverage": "absent" + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "coverage": "absent", + "role": "siteServer" } ], - "correlationKeys": [], + "evidence": [], + "findingId": "site-core:finding:v1:747d5d84fa5fa591bbc44f95acdcde504a3c92a65cd5907ddb039295a3ffaadd", + "lastSuccessfulPhase": null, "nextArtifacts": [ { "logicalId": "statmgr", - "role": "siteServer", - "reason": "Collect the complete statmgr.log file." + "reason": "Collect the complete statmgr.log file.", + "role": "siteServer" } ], - "subjectId": "site-core:observation:v1:3c9d38e20784d06345b49e9978c0ee0a106b87001ac62428d18c41115f72a2f0", - "lastSuccessfulPhase": null + "phase": "siteCoreCoverage", + "role": "siteServer", + "severity": "Warning", + "subjectId": "site-core:observation:v1:df2bfbabc8e96f041d97fc4e1531713675761879b2a9574b3e90c0baf02fc5f2", + "summary": "The source is incomplete and cannot establish a component outcome.", + "terminalEvidence": [], + "title": "Site core coverage gap" }, { - "findingId": "site-core:finding:v1:e8e0a9faadf8fc5d56fc8540208dd8e5dce0cb60ff0a27e4bee6cb36d1f36d3f", "class": "confirmedFailure", - "phase": "componentWork", - "role": "siteServer", - "severity": "Error", "confidence": "high", - "title": "Site component and status evidence", - "summary": "The last confirmed successful phase is componentWork; later phases are bounded to cited evidence.", + "correlationKeys": [], + "coverageGaps": [ + { + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "coverage": "absent", + "role": "siteServer" + } + ], "evidence": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:2-2", - "lineStart": 2, - "lineEnd": 2 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", - "lineStart": 3, - "lineEnd": 3 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, + "lineStart": 3 } ], + "findingId": "site-core:finding:v1:40c1024ef28cf0f884e9d41a8fd438030f373ba4d1b53a2895eb3b04b15d90b1", + "lastSuccessfulPhase": "componentWork", + "nextArtifacts": [], + "phase": "componentWork", + "role": "siteServer", + "severity": "Error", + "subjectId": "site-core:result:v1:ce830d306f2b82a870fa229e6a1cfea046b5b4d3697e5c775ee1ed4a40cb0d4b", + "summary": "The last confirmed successful phase is componentWork; later phases are bounded to cited evidence.", "terminalEvidence": [ { + "kind": "observedFailure", "reference": { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", - "lineStart": 3, - "lineEnd": 3 - }, - "kind": "observedFailure" + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, + "lineStart": 3 + } } ], - "coverageGaps": [ + "title": "Site component and status evidence" + } + ], + "profile": { + "id": "sccm-site-core", + "stability": "experimental", + "version": 1 + }, + "results": [ + { + "confidence": "high", + "confidenceCeiling": "high", + "coverageGapArtifactIds": [ + "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c" + ], + "evidence": [ { - "artifactId": "z-site-status", - "role": "siteServer", - "coverage": "absent" + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 + }, + { + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:2-2", + "lineEnd": 2, + "lineStart": 2 + }, + { + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, + "lineStart": 3, + "terminal": true } ], - "correlationKeys": [], + "findingClass": "confirmedFailure", + "lastSuccessfulPhase": "componentWork", "nextArtifacts": [], - "subjectId": "site-core:result:v1:a3220d3e9eebc073daf7575a24654c9c3174140ad298b9b2d72b4ebfa95b957d", - "lastSuccessfulPhase": "componentWork" + "resultId": "site-core:result:v1:ce830d306f2b82a870fa229e6a1cfea046b5b4d3697e5c775ee1ed4a40cb0d4b", + "state": "terminalFailure", + "transactionKey": { + "componentId": "SMS_EXECUTIVE", + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "profileId": "sccm-site-core", + "profileVersion": 1, + "siteHandle": "synthetic:site:lab", + "workItemId": "SC-COMPFAIL-001" + } } ], - "artifactRequests": [ + "schemaVersion": 1, + "stateChain": [ + "componentStart", + "componentWork", + "inboxOrQueue", + "statusOrStateProcessing", + "healthyOrTerminal" + ], + "unlinkedObservations": [ { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "required-source-absent", - "candidates": [{ "basename": "statmgr.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "site-status-z" - } + "confidence": "none", + "coverageGapArtifactIds": [ + "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c" + ], + "evidence": [], + "findingClass": "insufficientEvidence", + "nextArtifacts": [ + { + "candidates": [ + { + "basename": "statmgr.log", + "rotation": "current" + } + ], + "logicalName": "server-status", + "maxArtifacts": 1, + "reasonCode": "required-source-absent", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:d69adee776032725b5bc1a2186ca41ef91956ab03ed4c1d25211004c808b5f75" + } + } + ], + "observationId": "site-core:observation:v1:df2bfbabc8e96f041d97fc4e1531713675761879b2a9574b3e90c0baf02fc5f2", + "state": "parseGap" } ], - "crossSideCorrelationPerformed": false + "workflow": "siteCore" } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/contradictory/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/contradictory/expected.json index 14488c594..a499d7f41 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/contradictory/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/contradictory/expected.json @@ -1,159 +1,159 @@ { - "schemaVersion": 1, - "workflow": "siteCore", + "artifactRequests": [], + "coverageGaps": [], + "crossSideCorrelationPerformed": false, + "findings": [ + { + "class": "confirmedFailure", + "confidence": "high", + "correlationKeys": [], + "coverageGaps": [], + "evidence": [ + { + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 + }, + { + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:4-4", + "lineEnd": 4, + "lineStart": 4 + }, + { + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:6-6", + "lineEnd": 6, + "lineStart": 6 + } + ], + "findingId": "site-core:finding:v1:330125344900f74dc3879c7bccdc5ed2ab511e591750ed839b17d879a3726b96", + "lastSuccessfulPhase": "componentWork", + "nextArtifacts": [], + "phase": "componentWork", + "role": "siteServer", + "severity": "Error", + "subjectId": "site-core:result:v1:637fa91611388fc4a95ec886a6ea3b65f1c3030ff7bd9d96ff55bfbde0a1cb6f", + "summary": "The last confirmed successful phase is componentWork; later phases are bounded to cited evidence.", + "terminalEvidence": [ + { + "kind": "observedFailure", + "reference": { + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:6-6", + "lineEnd": 6, + "lineStart": 6 + } + } + ], + "title": "Site component and status evidence" + } + ], "profile": { "id": "sccm-site-core", - "version": 1, - "stability": "experimental" + "stability": "experimental", + "version": 1 }, - "stateChain": [ - "componentStart", - "componentWork", - "inboxOrQueue", - "statusOrStateProcessing", - "healthyOrTerminal" - ], "results": [ { - "resultId": "site-core:result:v1:17a3f55ffd5eb73fa686eb49ba0ee620d965de9a33ba240d7e87cba666952884", - "transactionKey": { - "profileId": "sccm-site-core", - "profileVersion": 1, - "siteHandle": "synthetic:site:lab", - "producerHostHandle": "synthetic:host:site-01", - "componentId": "SMS_EXECUTIVE", - "workItemId": "SC-CONTRA-EXEC-001" - }, - "state": "terminalFailure", - "lastSuccessfulPhase": "componentWork", - "findingClass": "confirmedFailure", "confidence": "high", "confidenceCeiling": "high", + "coverageGapArtifactIds": [], "evidence": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:4-4", - "lineStart": 4, - "lineEnd": 4 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:4-4", + "lineEnd": 4, + "lineStart": 4 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:6-6", - "lineStart": 6, + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:6-6", "lineEnd": 6, + "lineStart": 6, "terminal": true } ], - "coverageGapArtifactIds": [], - "nextArtifacts": [] - }, - { - "resultId": "site-core:result:v1:5d5fc621e38bc0572b168833e7bef6fa352cb2a35414e52a97bfd998a8a1c1b3", + "findingClass": "confirmedFailure", + "lastSuccessfulPhase": "componentWork", + "nextArtifacts": [], + "resultId": "site-core:result:v1:637fa91611388fc4a95ec886a6ea3b65f1c3030ff7bd9d96ff55bfbde0a1cb6f", + "state": "terminalFailure", "transactionKey": { + "componentId": "SMS_EXECUTIVE", + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", "profileId": "sccm-site-core", "profileVersion": 1, "siteHandle": "synthetic:site:lab", - "producerHostHandle": "synthetic:host:site-01", - "componentId": "SMS_DISTRIBUTION_MANAGER", - "workItemId": "SC-CONTRA-DIST-001" - }, - "state": "healthy", - "lastSuccessfulPhase": "healthyOrTerminal", - "findingClass": null, + "workItemId": "SC-CONTRA-EXEC-001" + } + }, + { "confidence": "high", "confidenceCeiling": "high", + "coverageGapArtifactIds": [], "evidence": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:2-2", - "lineStart": 2, - "lineEnd": 2 + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", - "lineStart": 3, - "lineEnd": 3 + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:5-5", - "lineStart": 5, - "lineEnd": 5 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, + "lineStart": 3 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:2-2", - "lineStart": 2, - "lineEnd": 2 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:5-5", + "lineEnd": 5, + "lineStart": 5 } ], - "coverageGapArtifactIds": [], - "nextArtifacts": [] - } - ], - "unlinkedObservations": [], - "coverageGaps": [], - "findings": [ - { - "findingId": "site-core:finding:v1:0dc933141f9f40354f35c580303bdb6c5b47f287e5829f055620a73e75277650", - "class": "confirmedFailure", - "phase": "componentWork", - "role": "siteServer", - "severity": "Error", - "confidence": "high", - "title": "Site component and status evidence", - "summary": "The last confirmed successful phase is componentWork; later phases are bounded to cited evidence.", - "evidence": [ - { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 - }, - { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:4-4", - "lineStart": 4, - "lineEnd": 4 - }, - { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:6-6", - "lineStart": 6, - "lineEnd": 6 - } - ], - "terminalEvidence": [ - { - "reference": { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:6-6", - "lineStart": 6, - "lineEnd": 6 - }, - "kind": "observedFailure" - } - ], - "coverageGaps": [], - "correlationKeys": [], + "findingClass": null, + "lastSuccessfulPhase": "healthyOrTerminal", "nextArtifacts": [], - "subjectId": "site-core:result:v1:17a3f55ffd5eb73fa686eb49ba0ee620d965de9a33ba240d7e87cba666952884", - "lastSuccessfulPhase": "componentWork" + "resultId": "site-core:result:v1:fdc88da8788713de6fa2533ba107330b10240e087e91c767480bec24d90382af", + "state": "healthy", + "transactionKey": { + "componentId": "SMS_DISTRIBUTION_MANAGER", + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "profileId": "sccm-site-core", + "profileVersion": 1, + "siteHandle": "synthetic:site:lab", + "workItemId": "SC-CONTRA-DIST-001" + } } ], - "artifactRequests": [], - "crossSideCorrelationPerformed": false + "schemaVersion": 1, + "stateChain": [ + "componentStart", + "componentWork", + "inboxOrQueue", + "statusOrStateProcessing", + "healthyOrTerminal" + ], + "unlinkedObservations": [], + "workflow": "siteCore" } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/healthy/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/healthy/expected.json index 9e1f6346d..141edb767 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/healthy/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/healthy/expected.json @@ -1,73 +1,73 @@ { - "schemaVersion": 1, - "workflow": "siteCore", + "artifactRequests": [], + "coverageGaps": [], + "crossSideCorrelationPerformed": false, + "findings": [], "profile": { "id": "sccm-site-core", - "version": 1, - "stability": "experimental" + "stability": "experimental", + "version": 1 }, - "stateChain": [ - "componentStart", - "componentWork", - "inboxOrQueue", - "statusOrStateProcessing", - "healthyOrTerminal" - ], "results": [ { - "resultId": "site-core:result:v1:4333cffa83f498b6a451e36269b164ae23717b1e790f4e0af31beb4821eece3b", - "transactionKey": { - "profileId": "sccm-site-core", - "profileVersion": 1, - "siteHandle": "synthetic:site:lab", - "producerHostHandle": "synthetic:host:site-01", - "componentId": "SMS_EXECUTIVE", - "workItemId": "SC-HEALTH-001" - }, - "state": "healthy", - "lastSuccessfulPhase": "healthyOrTerminal", - "findingClass": null, "confidence": "high", "confidenceCeiling": "high", + "coverageGapArtifactIds": [], "evidence": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:2-2", - "lineStart": 2, - "lineEnd": 2 + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", - "lineStart": 3, - "lineEnd": 3 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:2-2", - "lineStart": 2, - "lineEnd": 2 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, + "lineStart": 3 } ], - "coverageGapArtifactIds": [], - "nextArtifacts": [] + "findingClass": null, + "lastSuccessfulPhase": "healthyOrTerminal", + "nextArtifacts": [], + "resultId": "site-core:result:v1:7a74dac157c4c0ee29dd2702e45a4ab5389991390533543305d53adf7d684781", + "state": "healthy", + "transactionKey": { + "componentId": "SMS_EXECUTIVE", + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "profileId": "sccm-site-core", + "profileVersion": 1, + "siteHandle": "synthetic:site:lab", + "workItemId": "SC-HEALTH-001" + } } ], + "schemaVersion": 1, + "stateChain": [ + "componentStart", + "componentWork", + "inboxOrQueue", + "statusOrStateProcessing", + "healthyOrTerminal" + ], "unlinkedObservations": [], - "coverageGaps": [], - "findings": [], - "artifactRequests": [], - "crossSideCorrelationPerformed": false + "workflow": "siteCore" } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/inbox-backlog/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/inbox-backlog/expected.json index a42e67a60..8b6d910b7 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/inbox-backlog/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/inbox-backlog/expected.json @@ -1,213 +1,239 @@ { - "schemaVersion": 1, - "workflow": "siteCore", - "profile": { - "id": "sccm-site-core", - "version": 1, - "stability": "experimental" - }, - "stateChain": [ - "componentStart", - "componentWork", - "inboxOrQueue", - "statusOrStateProcessing", - "healthyOrTerminal" - ], - "results": [ + "artifactRequests": [ { - "resultId": "site-core:result:v1:8f00cd22916faa6850e60171e8392ee5dd7aa55efe883c7d76546a3c3d221f1f", - "transactionKey": { - "profileId": "sccm-site-core", - "profileVersion": 1, - "siteHandle": "synthetic:site:lab", - "producerHostHandle": "synthetic:host:site-01", - "componentId": "SMS_EXECUTIVE", - "workItemId": "SC-BACKLOG-001" - }, - "state": "blockedOrDeferred", - "lastSuccessfulPhase": "componentWork", - "findingClass": "blockedOrDeferred", - "confidence": "low", - "confidenceCeiling": "low", - "evidence": [ - { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 - }, + "candidates": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:2-2", - "lineStart": 2, - "lineEnd": 2 + "basename": "statmgr.log", + "rotation": "current" }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", - "lineStart": 3, - "lineEnd": 3, - "terminal": false + "basename": "statmgr.lo_", + "rotation": "loUnderscore" } ], - "coverageGapArtifactIds": ["z-site-status"], - "nextArtifacts": [ - { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "matching-status-terminal-evidence-missing", - "candidates": [ - { "basename": "statmgr.log", "rotation": "current" }, - { "basename": "statmgr.lo_", "rotation": "loUnderscore" } - ], - "maxArtifacts": 2, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "componentId": "SMS_EXECUTIVE", - "workItemId": "SC-BACKLOG-001" - } - } - ] - } - ], - "unlinkedObservations": [ + "logicalName": "server-status", + "maxArtifacts": 2, + "reasonCode": "matching-status-terminal-evidence-missing", + "role": "siteServer", + "scope": { + "componentId": "SMS_EXECUTIVE", + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "workItemId": "SC-BACKLOG-001" + } + }, { - "observationId": "site-core:observation:v1:3c9d38e20784d06345b49e9978c0ee0a106b87001ac62428d18c41115f72a2f0", - "state": "parseGap", - "findingClass": "insufficientEvidence", - "confidence": "none", - "evidence": [], - "coverageGapArtifactIds": ["z-site-status"], - "nextArtifacts": [ + "candidates": [ { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "required-source-absent", - "candidates": [{ "basename": "statmgr.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "site-status-z" - } + "basename": "statmgr.log", + "rotation": "current" } - ] + ], + "logicalName": "server-status", + "maxArtifacts": 1, + "reasonCode": "required-source-absent", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:d69adee776032725b5bc1a2186ca41ef91956ab03ed4c1d25211004c808b5f75" + } } ], "coverageGaps": [ { - "artifactId": "z-site-status", - "sourceId": "server-status", - "state": "absent", + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "diagnosticMeaning": "coverageOnly", "reasonCode": "required-source-absent", - "diagnosticMeaning": "coverageOnly" + "sourceId": "server-status", + "state": "absent" } ], + "crossSideCorrelationPerformed": false, "findings": [ { - "findingId": "site-core:finding:v1:3904d5916025a996b54227f390835cf3a9417264aa9d80d592e59e58793fe0ee", "class": "insufficientEvidence", + "confidence": "none", + "correlationKeys": [], + "coverageGaps": [ + { + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "coverage": "absent", + "role": "siteServer" + } + ], + "evidence": [], + "findingId": "site-core:finding:v1:747d5d84fa5fa591bbc44f95acdcde504a3c92a65cd5907ddb039295a3ffaadd", + "lastSuccessfulPhase": null, + "nextArtifacts": [ + { + "logicalId": "statmgr", + "reason": "Collect the complete statmgr.log file.", + "role": "siteServer" + } + ], "phase": "siteCoreCoverage", "role": "siteServer", "severity": "Warning", - "confidence": "none", - "title": "Site core coverage gap", + "subjectId": "site-core:observation:v1:df2bfbabc8e96f041d97fc4e1531713675761879b2a9574b3e90c0baf02fc5f2", "summary": "The source is incomplete and cannot establish a component outcome.", - "evidence": [], "terminalEvidence": [], + "title": "Site core coverage gap" + }, + { + "class": "blockedOrDeferred", + "confidence": "low", + "correlationKeys": [], "coverageGaps": [ { - "artifactId": "z-site-status", - "role": "siteServer", - "coverage": "absent" + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "coverage": "absent", + "role": "siteServer" } ], - "correlationKeys": [], + "evidence": [ + { + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 + }, + { + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:2-2", + "lineEnd": 2, + "lineStart": 2 + }, + { + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, + "lineStart": 3 + } + ], + "findingId": "site-core:finding:v1:130664429669a46eced5024681b8f6347056b0fcb2de33b58ec73d0a6b82ba22", + "lastSuccessfulPhase": "componentWork", "nextArtifacts": [ { "logicalId": "statmgr", - "role": "siteServer", - "reason": "Collect the complete statmgr.log file." + "reason": "Collect the complete statmgr.log file.", + "role": "siteServer" } ], - "subjectId": "site-core:observation:v1:3c9d38e20784d06345b49e9978c0ee0a106b87001ac62428d18c41115f72a2f0", - "lastSuccessfulPhase": null - }, - { - "findingId": "site-core:finding:v1:7f88716d8276aa14790bb220f91a66086fdc10d86f55a5aeb831f2aacf2944ef", - "class": "blockedOrDeferred", "phase": "componentWork", "role": "siteServer", "severity": "Warning", - "confidence": "low", - "title": "Site component and status evidence", + "subjectId": "site-core:result:v1:1960964987a595f17d2b6a3c223563160227b5fe614710ebfd6b4adf143692ce", "summary": "The last confirmed successful phase is componentWork; later phases are bounded to cited evidence.", + "terminalEvidence": [], + "title": "Site component and status evidence" + } + ], + "profile": { + "id": "sccm-site-core", + "stability": "experimental", + "version": 1 + }, + "results": [ + { + "confidence": "low", + "confidenceCeiling": "low", + "coverageGapArtifactIds": [ + "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c" + ], "evidence": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:2-2", - "lineStart": 2, - "lineEnd": 2 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, "lineStart": 3, - "lineEnd": 3 - } - ], - "terminalEvidence": [], - "coverageGaps": [ - { - "artifactId": "z-site-status", - "role": "siteServer", - "coverage": "absent" + "terminal": false } ], - "correlationKeys": [], + "findingClass": "blockedOrDeferred", + "lastSuccessfulPhase": "componentWork", "nextArtifacts": [ { - "logicalId": "statmgr", + "candidates": [ + { + "basename": "statmgr.log", + "rotation": "current" + }, + { + "basename": "statmgr.lo_", + "rotation": "loUnderscore" + } + ], + "logicalName": "server-status", + "maxArtifacts": 2, + "reasonCode": "matching-status-terminal-evidence-missing", "role": "siteServer", - "reason": "Collect the complete statmgr.log file." + "scope": { + "componentId": "SMS_EXECUTIVE", + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "workItemId": "SC-BACKLOG-001" + } } ], - "subjectId": "site-core:result:v1:8f00cd22916faa6850e60171e8392ee5dd7aa55efe883c7d76546a3c3d221f1f", - "lastSuccessfulPhase": "componentWork" - } - ], - "artifactRequests": [ - { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "matching-status-terminal-evidence-missing", - "candidates": [ - { "basename": "statmgr.log", "rotation": "current" }, - { "basename": "statmgr.lo_", "rotation": "loUnderscore" } - ], - "maxArtifacts": 2, - "scope": { - "producerHostHandle": "synthetic:host:site-01", + "resultId": "site-core:result:v1:1960964987a595f17d2b6a3c223563160227b5fe614710ebfd6b4adf143692ce", + "state": "blockedOrDeferred", + "transactionKey": { "componentId": "SMS_EXECUTIVE", + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "profileId": "sccm-site-core", + "profileVersion": 1, + "siteHandle": "synthetic:site:lab", "workItemId": "SC-BACKLOG-001" } - }, + } + ], + "schemaVersion": 1, + "stateChain": [ + "componentStart", + "componentWork", + "inboxOrQueue", + "statusOrStateProcessing", + "healthyOrTerminal" + ], + "unlinkedObservations": [ { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "required-source-absent", - "candidates": [{ "basename": "statmgr.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "site-status-z" - } + "confidence": "none", + "coverageGapArtifactIds": [ + "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c" + ], + "evidence": [], + "findingClass": "insufficientEvidence", + "nextArtifacts": [ + { + "candidates": [ + { + "basename": "statmgr.log", + "rotation": "current" + } + ], + "logicalName": "server-status", + "maxArtifacts": 1, + "reasonCode": "required-source-absent", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:d69adee776032725b5bc1a2186ca41ef91956ab03ed4c1d25211004c808b5f75" + } + } + ], + "observationId": "site-core:observation:v1:df2bfbabc8e96f041d97fc4e1531713675761879b2a9574b3e90c0baf02fc5f2", + "state": "parseGap" } ], - "crossSideCorrelationPerformed": false + "workflow": "siteCore" } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/incomplete/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/incomplete/expected.json index b72411f39..3d46e54ea 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/incomplete/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/incomplete/expected.json @@ -1,232 +1,268 @@ { - "schemaVersion": 1, - "workflow": "siteCore", - "profile": { - "id": "sccm-site-core", - "version": 1, - "stability": "experimental" - }, - "stateChain": [ - "componentStart", - "componentWork", - "inboxOrQueue", - "statusOrStateProcessing", - "healthyOrTerminal" - ], - "results": [], - "unlinkedObservations": [ + "artifactRequests": [ { - "observationId": "site-core:observation:v1:20750165151067511511fa5d55ec29a0891eba7992f4e1b23a4eafd132ca9879", - "state": "parseGap", - "findingClass": "insufficientEvidence", - "confidence": "none", - "evidence": [], - "coverageGapArtifactIds": ["sitecomp-current"], - "nextArtifacts": [ + "candidates": [ { - "logicalName": "server-sitecomp", - "role": "siteServer", - "reasonCode": "capped-before-next-phase", - "candidates": [{ "basename": "sitecomp.log", "rotation": "current" }], - "maxArtifacts": 1, - "maxBytesPerArtifact": 4096, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "sitecomp-lab" - } + "basename": "sitecomp.log", + "rotation": "current" } - ] + ], + "logicalName": "server-sitecomp", + "maxArtifacts": 1, + "maxBytesPerArtifact": 4096, + "reasonCode": "capped-before-next-phase", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:1cb1ba23d64805a34ef23b7b4561a7e7a60e74aed85185b4e2b8851a412e4d34" + } }, { - "observationId": "site-core:observation:v1:54d36c8102796161d9f08cf1b504631c3268a5d3d5617cfdece01908c2b4a8db", - "state": "parseGap", - "findingClass": "insufficientEvidence", - "confidence": "none", - "evidence": [], - "coverageGapArtifactIds": ["b-sitecomp"], - "nextArtifacts": [ + "candidates": [ { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "required-source-absent", - "candidates": [{ "basename": "statesys.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "sitecomp-a" - } + "basename": "statesys.log", + "rotation": "current" } - ] + ], + "logicalName": "server-status", + "maxArtifacts": 1, + "reasonCode": "required-source-absent", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:30b4ad9fe96ef8043b273334e1db6303517f9cd98ea1ddb9b4b433df8278e617" + } }, { - "observationId": "site-core:observation:v1:9edbdd94bfcb99682d8938a3eceb1122760ee2aadeb9b9fad5dca1a4d5544005", - "state": "parseGap", - "findingClass": "insufficientEvidence", - "confidence": "none", - "evidence": [], - "coverageGapArtifactIds": ["z-site-status"], - "nextArtifacts": [ + "candidates": [ { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "required-source-access-denied", - "candidates": [{ "basename": "statmgr.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "site-status-z" - } + "basename": "statmgr.log", + "rotation": "current" } - ] + ], + "logicalName": "server-status", + "maxArtifacts": 1, + "reasonCode": "required-source-access-denied", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:d69adee776032725b5bc1a2186ca41ef91956ab03ed4c1d25211004c808b5f75" + } } ], "coverageGaps": [ { - "artifactId": "b-sitecomp", + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "diagnosticMeaning": "coverageOnly", + "reasonCode": "required-source-access-denied", "sourceId": "server-status", - "state": "absent", - "reasonCode": "required-source-absent", - "diagnosticMeaning": "coverageOnly" + "state": "accessDenied" }, { - "artifactId": "sitecomp-current", - "sourceId": "server-sitecomp", - "state": "capped", - "reasonCode": "required-source-capped", - "diagnosticMeaning": "coverageOnly" + "artifactId": "synthetic:artifact:sha256.v1:930503e728322cd7bff72d0c239e9aa3db5178f8c77c3fa349fdeec1e3a7b96d", + "diagnosticMeaning": "coverageOnly", + "reasonCode": "required-source-absent", + "sourceId": "server-status", + "state": "absent" }, { - "artifactId": "z-site-status", - "sourceId": "server-status", - "state": "accessDenied", - "reasonCode": "required-source-access-denied", - "diagnosticMeaning": "coverageOnly" + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "diagnosticMeaning": "coverageOnly", + "reasonCode": "required-source-capped", + "sourceId": "server-sitecomp", + "state": "capped" } ], + "crossSideCorrelationPerformed": false, "findings": [ { - "findingId": "site-core:finding:v1:f128f013625df6f648e3bcbea04797dd865613144d069349b2094a760b0ae2c0", "class": "insufficientEvidence", - "phase": "siteCoreCoverage", - "role": "siteServer", - "severity": "Warning", "confidence": "none", - "title": "Site core coverage gap", - "summary": "The source is incomplete and cannot establish a component outcome.", - "evidence": [], - "terminalEvidence": [], + "correlationKeys": [], "coverageGaps": [ { - "artifactId": "sitecomp-current", - "role": "siteServer", - "coverage": "capped" + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "coverage": "capped", + "role": "siteServer" } ], - "correlationKeys": [], + "evidence": [], + "findingId": "site-core:finding:v1:02ba3baed7efbdf4b9d2613588860b3a0e6dcd3c657cf8800d68644db1964043", + "lastSuccessfulPhase": null, "nextArtifacts": [ { "logicalId": "sitecomp", - "role": "siteServer", - "reason": "Collect the complete sitecomp.log file." + "reason": "Collect the complete sitecomp.log file.", + "role": "siteServer" } ], - "subjectId": "site-core:observation:v1:20750165151067511511fa5d55ec29a0891eba7992f4e1b23a4eafd132ca9879", - "lastSuccessfulPhase": null - }, - { - "findingId": "site-core:finding:v1:044cb34792a9fc91e1f780871421b55859c60ee5dbbb1788ed0a87be772cedfe", - "class": "insufficientEvidence", "phase": "siteCoreCoverage", "role": "siteServer", "severity": "Warning", - "confidence": "none", - "title": "Site core coverage gap", + "subjectId": "site-core:observation:v1:512bd3de7fb2fb6aeb08433bd896e4dbb585c44c9e5a9f623475c6a3ba3749c1", "summary": "The source is incomplete and cannot establish a component outcome.", - "evidence": [], "terminalEvidence": [], + "title": "Site core coverage gap" + }, + { + "class": "insufficientEvidence", + "confidence": "none", + "correlationKeys": [], "coverageGaps": [ { - "artifactId": "b-sitecomp", - "role": "siteServer", - "coverage": "absent" + "artifactId": "synthetic:artifact:sha256.v1:930503e728322cd7bff72d0c239e9aa3db5178f8c77c3fa349fdeec1e3a7b96d", + "coverage": "absent", + "role": "siteServer" } ], - "correlationKeys": [], + "evidence": [], + "findingId": "site-core:finding:v1:5acbf927e77ac80de482a5797687ad554885123b4321b5c024a97adb5515f02d", + "lastSuccessfulPhase": null, "nextArtifacts": [ { "logicalId": "statesys", - "role": "siteServer", - "reason": "Collect the complete statesys.log file." + "reason": "Collect the complete statesys.log file.", + "role": "siteServer" } ], - "subjectId": "site-core:observation:v1:54d36c8102796161d9f08cf1b504631c3268a5d3d5617cfdece01908c2b4a8db", - "lastSuccessfulPhase": null - }, - { - "findingId": "site-core:finding:v1:e8826b8f7c9bcdfd45124cd11eed064bbf61b799edcaa022c7a3eff210ed8966", - "class": "insufficientEvidence", "phase": "siteCoreCoverage", "role": "siteServer", "severity": "Warning", - "confidence": "none", - "title": "Site core coverage gap", + "subjectId": "site-core:observation:v1:d70e1234b13f94e326e5d6036ea7032de27812993cbd5b84ce02a81a7073ae3d", "summary": "The source is incomplete and cannot establish a component outcome.", - "evidence": [], "terminalEvidence": [], + "title": "Site core coverage gap" + }, + { + "class": "insufficientEvidence", + "confidence": "none", + "correlationKeys": [], "coverageGaps": [ { - "artifactId": "z-site-status", - "role": "siteServer", - "coverage": "accessDenied" + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "coverage": "accessDenied", + "role": "siteServer" } ], - "correlationKeys": [], + "evidence": [], + "findingId": "site-core:finding:v1:dd6aee5461fcc19d328b9770c05d002fedb4cd6a76b0bea8d77a8f88335421c9", + "lastSuccessfulPhase": null, "nextArtifacts": [ { "logicalId": "statmgr", - "role": "siteServer", - "reason": "Collect the complete statmgr.log file." + "reason": "Collect the complete statmgr.log file.", + "role": "siteServer" } ], - "subjectId": "site-core:observation:v1:9edbdd94bfcb99682d8938a3eceb1122760ee2aadeb9b9fad5dca1a4d5544005", - "lastSuccessfulPhase": null + "phase": "siteCoreCoverage", + "role": "siteServer", + "severity": "Warning", + "subjectId": "site-core:observation:v1:f4d6064ccf787851aac9b97d1856a52049355e126978edc09b9b44504ead376e", + "summary": "The source is incomplete and cannot establish a component outcome.", + "terminalEvidence": [], + "title": "Site core coverage gap" } ], - "artifactRequests": [ + "profile": { + "id": "sccm-site-core", + "stability": "experimental", + "version": 1 + }, + "results": [], + "schemaVersion": 1, + "stateChain": [ + "componentStart", + "componentWork", + "inboxOrQueue", + "statusOrStateProcessing", + "healthyOrTerminal" + ], + "unlinkedObservations": [ { - "logicalName": "server-sitecomp", - "role": "siteServer", - "reasonCode": "capped-before-next-phase", - "candidates": [{ "basename": "sitecomp.log", "rotation": "current" }], - "maxArtifacts": 1, - "maxBytesPerArtifact": 4096, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "sitecomp-lab" - } + "confidence": "none", + "coverageGapArtifactIds": [ + "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff" + ], + "evidence": [], + "findingClass": "insufficientEvidence", + "nextArtifacts": [ + { + "candidates": [ + { + "basename": "sitecomp.log", + "rotation": "current" + } + ], + "logicalName": "server-sitecomp", + "maxArtifacts": 1, + "maxBytesPerArtifact": 4096, + "reasonCode": "capped-before-next-phase", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:1cb1ba23d64805a34ef23b7b4561a7e7a60e74aed85185b4e2b8851a412e4d34" + } + } + ], + "observationId": "site-core:observation:v1:512bd3de7fb2fb6aeb08433bd896e4dbb585c44c9e5a9f623475c6a3ba3749c1", + "state": "parseGap" }, { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "required-source-absent", - "candidates": [{ "basename": "statesys.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "sitecomp-a" - } + "confidence": "none", + "coverageGapArtifactIds": [ + "synthetic:artifact:sha256.v1:930503e728322cd7bff72d0c239e9aa3db5178f8c77c3fa349fdeec1e3a7b96d" + ], + "evidence": [], + "findingClass": "insufficientEvidence", + "nextArtifacts": [ + { + "candidates": [ + { + "basename": "statesys.log", + "rotation": "current" + } + ], + "logicalName": "server-status", + "maxArtifacts": 1, + "reasonCode": "required-source-absent", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:30b4ad9fe96ef8043b273334e1db6303517f9cd98ea1ddb9b4b433df8278e617" + } + } + ], + "observationId": "site-core:observation:v1:d70e1234b13f94e326e5d6036ea7032de27812993cbd5b84ce02a81a7073ae3d", + "state": "parseGap" }, { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "required-source-access-denied", - "candidates": [{ "basename": "statmgr.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "site-status-z" - } + "confidence": "none", + "coverageGapArtifactIds": [ + "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c" + ], + "evidence": [], + "findingClass": "insufficientEvidence", + "nextArtifacts": [ + { + "candidates": [ + { + "basename": "statmgr.log", + "rotation": "current" + } + ], + "logicalName": "server-status", + "maxArtifacts": 1, + "reasonCode": "required-source-access-denied", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:d69adee776032725b5bc1a2186ca41ef91956ab03ed4c1d25211004c808b5f75" + } + } + ], + "observationId": "site-core:observation:v1:f4d6064ccf787851aac9b97d1856a52049355e126978edc09b9b44504ead376e", + "state": "parseGap" } ], - "crossSideCorrelationPerformed": false + "workflow": "siteCore" } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/malformed/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/malformed/expected.json index c07c77a59..c244b838f 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/malformed/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/malformed/expected.json @@ -1,94 +1,106 @@ { - "schemaVersion": 1, - "workflow": "siteCore", - "profile": { - "id": "sccm-site-core", - "version": 1, - "stability": "experimental" - }, - "stateChain": [ - "componentStart", - "componentWork", - "inboxOrQueue", - "statusOrStateProcessing", - "healthyOrTerminal" - ], - "results": [], - "unlinkedObservations": [ + "artifactRequests": [ { - "observationId": "site-core:observation:v1:11120408c9126ff56585ab7f779a4fa8d13bb6867cf806f3674d16e4e1c9afd6", - "state": "parseGap", - "findingClass": "insufficientEvidence", - "confidence": "none", - "evidence": [], - "coverageGapArtifactIds": ["z-site-status"], - "nextArtifacts": [ + "candidates": [ { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "required-source-parse-failed", - "candidates": [{ "basename": "statmgr.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "site-status-z" - } + "basename": "statmgr.log", + "rotation": "current" } - ] + ], + "logicalName": "server-status", + "maxArtifacts": 1, + "reasonCode": "required-source-parse-failed", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:d69adee776032725b5bc1a2186ca41ef91956ab03ed4c1d25211004c808b5f75" + } } ], "coverageGaps": [ { - "artifactId": "z-site-status", - "sourceId": "server-status", - "state": "parseFailed", + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "diagnosticMeaning": "coverageOnly", "reasonCode": "required-source-parse-failed", - "diagnosticMeaning": "coverageOnly" + "sourceId": "server-status", + "state": "parseFailed" } ], + "crossSideCorrelationPerformed": false, "findings": [ { - "findingId": "site-core:finding:v1:59627c557b8120023694ee3f871c6a6c989d35cdeab47c081e435543283912f1", "class": "insufficientEvidence", - "phase": "siteCoreCoverage", - "role": "siteServer", - "severity": "Warning", "confidence": "none", - "title": "Site core coverage gap", - "summary": "The source is incomplete and cannot establish a component outcome.", - "evidence": [], - "terminalEvidence": [], + "correlationKeys": [], "coverageGaps": [ { - "artifactId": "z-site-status", - "role": "siteServer", - "coverage": "parseFailed" + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "coverage": "parseFailed", + "role": "siteServer" } ], - "correlationKeys": [], + "evidence": [], + "findingId": "site-core:finding:v1:458c5392273180da29e3bbd771c58a47b5f0035bacf8745d40b5aa0c10b7d17a", + "lastSuccessfulPhase": null, "nextArtifacts": [ { "logicalId": "statmgr", - "role": "siteServer", - "reason": "Collect the complete statmgr.log file." + "reason": "Collect the complete statmgr.log file.", + "role": "siteServer" } ], - "subjectId": "site-core:observation:v1:11120408c9126ff56585ab7f779a4fa8d13bb6867cf806f3674d16e4e1c9afd6", - "lastSuccessfulPhase": null + "phase": "siteCoreCoverage", + "role": "siteServer", + "severity": "Warning", + "subjectId": "site-core:observation:v1:5996a2c1296ff5c8408c0ce2b82512e3eba69a936acb8065b6f332d6cda0af5b", + "summary": "The source is incomplete and cannot establish a component outcome.", + "terminalEvidence": [], + "title": "Site core coverage gap" } ], - "artifactRequests": [ + "profile": { + "id": "sccm-site-core", + "stability": "experimental", + "version": 1 + }, + "results": [], + "schemaVersion": 1, + "stateChain": [ + "componentStart", + "componentWork", + "inboxOrQueue", + "statusOrStateProcessing", + "healthyOrTerminal" + ], + "unlinkedObservations": [ { - "logicalName": "server-status", - "role": "siteServer", - "reasonCode": "required-source-parse-failed", - "candidates": [{ "basename": "statmgr.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "site-status-z" - } + "confidence": "none", + "coverageGapArtifactIds": [ + "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c" + ], + "evidence": [], + "findingClass": "insufficientEvidence", + "nextArtifacts": [ + { + "candidates": [ + { + "basename": "statmgr.log", + "rotation": "current" + } + ], + "logicalName": "server-status", + "maxArtifacts": 1, + "reasonCode": "required-source-parse-failed", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:d69adee776032725b5bc1a2186ca41ef91956ab03ed4c1d25211004c808b5f75" + } + } + ], + "observationId": "site-core:observation:v1:5996a2c1296ff5c8408c0ce2b82512e3eba69a936acb8065b6f332d6cda0af5b", + "state": "parseGap" } ], - "crossSideCorrelationPerformed": false + "workflow": "siteCore" } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/recovery/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/recovery/expected.json index ad304a594..ee06943fb 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/recovery/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/recovery/expected.json @@ -1,125 +1,125 @@ { - "schemaVersion": 1, - "workflow": "siteCore", - "profile": { - "id": "sccm-site-core", - "version": 1, - "stability": "experimental" - }, - "stateChain": [ - "componentStart", - "componentWork", - "inboxOrQueue", - "statusOrStateProcessing", - "healthyOrTerminal" - ], - "results": [ + "artifactRequests": [], + "coverageGaps": [], + "crossSideCorrelationPerformed": false, + "findings": [ { - "resultId": "site-core:result:v1:6481f8fcb2dc2b2d95e759d00b6c5332fc83f74a8ce808c4079681340c0547a9", - "transactionKey": { - "profileId": "sccm-site-core", - "profileVersion": 1, - "siteHandle": "synthetic:site:lab", - "producerHostHandle": "synthetic:host:site-01", - "componentId": "SMS_EXECUTIVE", - "workItemId": "SC-RECOVER-001" - }, - "state": "recovered", - "lastSuccessfulPhase": "healthyOrTerminal", - "findingClass": "symptom", + "class": "symptom", "confidence": "high", - "confidenceCeiling": "high", + "correlationKeys": [], + "coverageGaps": [], "evidence": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:2-2", - "lineStart": 2, - "lineEnd": 2 + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", - "lineStart": 3, - "lineEnd": 3, - "terminal": true + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:2-2", - "lineStart": 2, - "lineEnd": 2, - "terminal": true, - "recovery": true + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, + "lineStart": 3 } ], - "coverageGapArtifactIds": [], - "nextArtifacts": [] - } - ], - "unlinkedObservations": [], - "coverageGaps": [], - "findings": [ - { - "findingId": "site-core:finding:v1:0dc72fd549b222924cd7a0207cae9a9e127f0ce27126a7091697d14cd8dfc0fe", - "class": "symptom", + "findingId": "site-core:finding:v1:ad02835debd9248d40858d945ea0aef91ebf3872c9a16828a839228a81760ffb", + "lastSuccessfulPhase": "healthyOrTerminal", + "nextArtifacts": [], "phase": "healthyOrTerminal", "role": "siteServer", "severity": "Warning", - "confidence": "high", - "title": "Site component and status evidence", + "subjectId": "site-core:result:v1:d2adf2b35a3b6e63fdd52267d7fc11fe5407209eeaf7621a91ca823e208f6501", "summary": "The last confirmed successful phase is healthyOrTerminal; later phases are bounded to cited evidence.", + "terminalEvidence": [], + "title": "Site component and status evidence" + } + ], + "profile": { + "id": "sccm-site-core", + "stability": "experimental", + "version": 1 + }, + "results": [ + { + "confidence": "high", + "confidenceCeiling": "high", + "coverageGapArtifactIds": [], "evidence": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:2-2", + "lineEnd": 2, "lineStart": 2, - "lineEnd": 2 + "recovery": true, + "terminal": true }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", - "lineStart": 3, - "lineEnd": 3 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:2-2", - "lineStart": 2, - "lineEnd": 2 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, + "lineStart": 3, + "terminal": true } ], - "terminalEvidence": [], - "coverageGaps": [], - "correlationKeys": [], + "findingClass": "symptom", + "lastSuccessfulPhase": "healthyOrTerminal", "nextArtifacts": [], - "subjectId": "site-core:result:v1:6481f8fcb2dc2b2d95e759d00b6c5332fc83f74a8ce808c4079681340c0547a9", - "lastSuccessfulPhase": "healthyOrTerminal" + "resultId": "site-core:result:v1:d2adf2b35a3b6e63fdd52267d7fc11fe5407209eeaf7621a91ca823e208f6501", + "state": "recovered", + "transactionKey": { + "componentId": "SMS_EXECUTIVE", + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "profileId": "sccm-site-core", + "profileVersion": 1, + "siteHandle": "synthetic:site:lab", + "workItemId": "SC-RECOVER-001" + } } ], - "artifactRequests": [], - "crossSideCorrelationPerformed": false + "schemaVersion": 1, + "stateChain": [ + "componentStart", + "componentWork", + "inboxOrQueue", + "statusOrStateProcessing", + "healthyOrTerminal" + ], + "unlinkedObservations": [], + "workflow": "siteCore" } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/rotation-boundary/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/rotation-boundary/expected.json index c41f5935c..66bf5431f 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/rotation-boundary/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/rotation-boundary/expected.json @@ -1,166 +1,186 @@ { - "schemaVersion": 1, - "workflow": "siteCore", - "profile": { - "id": "sccm-site-core", - "version": 1, - "stability": "experimental" - }, - "stateChain": [ - "componentStart", - "componentWork", - "inboxOrQueue", - "statusOrStateProcessing", - "healthyOrTerminal" - ], - "results": [], - "unlinkedObservations": [ + "artifactRequests": [ { - "observationId": "site-core:observation:v1:451100e2fecf411dab719c39efac17c4a413cc9159154cbf7b8e852b2d5e0d2e", - "state": "parseGap", - "findingClass": "insufficientEvidence", - "confidence": "none", - "evidence": [], - "coverageGapArtifactIds": ["b-sitecomp"], - "nextArtifacts": [ + "candidates": [ { - "logicalName": "server-sitecomp", - "role": "siteServer", - "reasonCode": "required-source-parse-failed", - "candidates": [ - { "basename": "sitecomp.lo_", "rotation": "loUnderscore" } - ], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "sitecomp-lab" - } + "basename": "sitecomp.log", + "rotation": "current" } - ] + ], + "logicalName": "server-sitecomp", + "maxArtifacts": 1, + "reasonCode": "required-source-parse-failed", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:1cb1ba23d64805a34ef23b7b4561a7e7a60e74aed85185b4e2b8851a412e4d34" + } }, { - "observationId": "site-core:observation:v1:e90f28bbfe6504368011dcfad219c8103b931bcaa8e8b599c96c0ea6a04196f1", - "state": "parseGap", - "findingClass": "insufficientEvidence", - "confidence": "none", - "evidence": [], - "coverageGapArtifactIds": ["sitecomp-current"], - "nextArtifacts": [ + "candidates": [ { - "logicalName": "server-sitecomp", - "role": "siteServer", - "reasonCode": "required-source-parse-failed", - "candidates": [{ "basename": "sitecomp.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "sitecomp-lab" - } + "basename": "sitecomp.lo_", + "rotation": "loUnderscore" } - ] + ], + "logicalName": "server-sitecomp", + "maxArtifacts": 1, + "reasonCode": "required-source-parse-failed", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:1cb1ba23d64805a34ef23b7b4561a7e7a60e74aed85185b4e2b8851a412e4d34" + } } ], "coverageGaps": [ { - "artifactId": "b-sitecomp", - "sourceId": "server-sitecomp", - "state": "parseFailed", + "artifactId": "synthetic:artifact:sha256.v1:930503e728322cd7bff72d0c239e9aa3db5178f8c77c3fa349fdeec1e3a7b96d", + "diagnosticMeaning": "coverageOnly", "reasonCode": "required-source-parse-failed", - "diagnosticMeaning": "coverageOnly" + "sourceId": "server-sitecomp", + "state": "parseFailed" }, { - "artifactId": "sitecomp-current", - "sourceId": "server-sitecomp", - "state": "parseFailed", + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "diagnosticMeaning": "coverageOnly", "reasonCode": "required-source-parse-failed", - "diagnosticMeaning": "coverageOnly" + "sourceId": "server-sitecomp", + "state": "parseFailed" } ], + "crossSideCorrelationPerformed": false, "findings": [ { - "findingId": "site-core:finding:v1:35ab0d0fc326af948cdbeaa4e8510e8dc467bbfeca4d9de9726a9324871b0812", "class": "insufficientEvidence", - "phase": "siteCoreCoverage", - "role": "siteServer", - "severity": "Warning", "confidence": "none", - "title": "Site core coverage gap", - "summary": "The source is incomplete and cannot establish a component outcome.", - "evidence": [], - "terminalEvidence": [], + "correlationKeys": [], "coverageGaps": [ { - "artifactId": "b-sitecomp", - "role": "siteServer", - "coverage": "parseFailed" + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "coverage": "parseFailed", + "role": "siteServer" } ], - "correlationKeys": [], + "evidence": [], + "findingId": "site-core:finding:v1:ea00bbac66cadddb333b1e48976c4371032766adc144dc35783defbd02293e88", + "lastSuccessfulPhase": null, "nextArtifacts": [ { "logicalId": "sitecomp", - "role": "siteServer", - "reason": "Collect the complete sitecomp.log file." + "reason": "Collect the complete sitecomp.log file.", + "role": "siteServer" } ], - "subjectId": "site-core:observation:v1:451100e2fecf411dab719c39efac17c4a413cc9159154cbf7b8e852b2d5e0d2e", - "lastSuccessfulPhase": null - }, - { - "findingId": "site-core:finding:v1:b526eeb6982092da44b2ade2f032b43f33dfb4910bb69b41c0b4c02f7c862a35", - "class": "insufficientEvidence", "phase": "siteCoreCoverage", "role": "siteServer", "severity": "Warning", - "confidence": "none", - "title": "Site core coverage gap", + "subjectId": "site-core:observation:v1:695cad0db1d7dd9d8ed9b5f32b8b4f90599e4a095b75a64ec3d09f1a4b737511", "summary": "The source is incomplete and cannot establish a component outcome.", - "evidence": [], "terminalEvidence": [], + "title": "Site core coverage gap" + }, + { + "class": "insufficientEvidence", + "confidence": "none", + "correlationKeys": [], "coverageGaps": [ { - "artifactId": "sitecomp-current", - "role": "siteServer", - "coverage": "parseFailed" + "artifactId": "synthetic:artifact:sha256.v1:930503e728322cd7bff72d0c239e9aa3db5178f8c77c3fa349fdeec1e3a7b96d", + "coverage": "parseFailed", + "role": "siteServer" } ], - "correlationKeys": [], + "evidence": [], + "findingId": "site-core:finding:v1:9ccd937176c833cbfad3685f827785de629884e1e7d7a302f2d9cb337cb9bf42", + "lastSuccessfulPhase": null, "nextArtifacts": [ { "logicalId": "sitecomp", - "role": "siteServer", - "reason": "Collect the complete sitecomp.log file." + "reason": "Collect the complete sitecomp.log file.", + "role": "siteServer" } ], - "subjectId": "site-core:observation:v1:e90f28bbfe6504368011dcfad219c8103b931bcaa8e8b599c96c0ea6a04196f1", - "lastSuccessfulPhase": null + "phase": "siteCoreCoverage", + "role": "siteServer", + "severity": "Warning", + "subjectId": "site-core:observation:v1:7f9d4edc325a5a39c272d645b7073c3d0733bc556ca194867d1415d7404ac0b9", + "summary": "The source is incomplete and cannot establish a component outcome.", + "terminalEvidence": [], + "title": "Site core coverage gap" } ], - "artifactRequests": [ + "profile": { + "id": "sccm-site-core", + "stability": "experimental", + "version": 1 + }, + "results": [], + "schemaVersion": 1, + "stateChain": [ + "componentStart", + "componentWork", + "inboxOrQueue", + "statusOrStateProcessing", + "healthyOrTerminal" + ], + "unlinkedObservations": [ { - "logicalName": "server-sitecomp", - "role": "siteServer", - "reasonCode": "required-source-parse-failed", - "candidates": [ - { "basename": "sitecomp.lo_", "rotation": "loUnderscore" } + "confidence": "none", + "coverageGapArtifactIds": [ + "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff" ], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "sitecomp-lab" - } + "evidence": [], + "findingClass": "insufficientEvidence", + "nextArtifacts": [ + { + "candidates": [ + { + "basename": "sitecomp.log", + "rotation": "current" + } + ], + "logicalName": "server-sitecomp", + "maxArtifacts": 1, + "reasonCode": "required-source-parse-failed", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:1cb1ba23d64805a34ef23b7b4561a7e7a60e74aed85185b4e2b8851a412e4d34" + } + } + ], + "observationId": "site-core:observation:v1:695cad0db1d7dd9d8ed9b5f32b8b4f90599e4a095b75a64ec3d09f1a4b737511", + "state": "parseGap" }, { - "logicalName": "server-sitecomp", - "role": "siteServer", - "reasonCode": "required-source-parse-failed", - "candidates": [{ "basename": "sitecomp.log", "rotation": "current" }], - "maxArtifacts": 1, - "scope": { - "producerHostHandle": "synthetic:host:site-01", - "rotationLineageHandle": "sitecomp-lab" - } + "confidence": "none", + "coverageGapArtifactIds": [ + "synthetic:artifact:sha256.v1:930503e728322cd7bff72d0c239e9aa3db5178f8c77c3fa349fdeec1e3a7b96d" + ], + "evidence": [], + "findingClass": "insufficientEvidence", + "nextArtifacts": [ + { + "candidates": [ + { + "basename": "sitecomp.lo_", + "rotation": "loUnderscore" + } + ], + "logicalName": "server-sitecomp", + "maxArtifacts": 1, + "reasonCode": "required-source-parse-failed", + "role": "siteServer", + "scope": { + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "rotationLineageHandle": "synthetic:lineage:sha256.v1:1cb1ba23d64805a34ef23b7b4561a7e7a60e74aed85185b4e2b8851a412e4d34" + } + } + ], + "observationId": "site-core:observation:v1:7f9d4edc325a5a39c272d645b7073c3d0733bc556ca194867d1415d7404ac0b9", + "state": "parseGap" } ], - "crossSideCorrelationPerformed": false + "workflow": "siteCore" } diff --git a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/status-processing-failure/expected.json b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/status-processing-failure/expected.json index 7421e5277..28f8d9e76 100644 --- a/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/status-processing-failure/expected.json +++ b/crates/cmtraceopen-parser/tests/fixtures/sccm/server/site_core/status-processing-failure/expected.json @@ -1,133 +1,133 @@ { - "schemaVersion": 1, - "workflow": "siteCore", - "profile": { - "id": "sccm-site-core", - "version": 1, - "stability": "experimental" - }, - "stateChain": [ - "componentStart", - "componentWork", - "inboxOrQueue", - "statusOrStateProcessing", - "healthyOrTerminal" - ], - "results": [ + "artifactRequests": [], + "coverageGaps": [], + "crossSideCorrelationPerformed": false, + "findings": [ { - "resultId": "site-core:result:v1:234575fad725c1b8673aaa8d9c02e5465aad0b919b0de5c4b52b4221098d0eb1", - "transactionKey": { - "profileId": "sccm-site-core", - "profileVersion": 1, - "siteHandle": "synthetic:site:lab", - "producerHostHandle": "synthetic:host:site-01", - "componentId": "SMS_EXECUTIVE", - "workItemId": "SC-STATUSFAIL-001" - }, - "state": "terminalFailure", - "lastSuccessfulPhase": "statusOrStateProcessing", - "findingClass": "confirmedFailure", + "class": "confirmedFailure", "confidence": "high", - "confidenceCeiling": "high", + "correlationKeys": [], + "coverageGaps": [], "evidence": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:2-2", - "lineStart": 2, - "lineEnd": 2 + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", - "lineStart": 3, - "lineEnd": 3 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:2-2", - "lineStart": 2, - "lineEnd": 2, - "terminal": true + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, + "lineStart": 3 } ], - "coverageGapArtifactIds": [], - "nextArtifacts": [] - } - ], - "unlinkedObservations": [], - "coverageGaps": [], - "findings": [ - { - "findingId": "site-core:finding:v1:853fbf3e3970fd2b5acba277229471609617eb1f25b7932e01e7c67e5308f93d", - "class": "confirmedFailure", + "findingId": "site-core:finding:v1:88b93c1cc1536ff4a44485b1745768487b181b2b6b19b39299ce7a2228d7d3f2", + "lastSuccessfulPhase": "statusOrStateProcessing", + "nextArtifacts": [], "phase": "statusOrStateProcessing", "role": "siteServer", "severity": "Error", - "confidence": "high", - "title": "Site component and status evidence", + "subjectId": "site-core:result:v1:c8a2d2c1d5c861df31e2c196dbc1732eaf15f08e2d292111527f3fd1a44e316f", "summary": "The last confirmed successful phase is statusOrStateProcessing; later phases are bounded to cited evidence.", + "terminalEvidence": [ + { + "kind": "observedFailure", + "reference": { + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:2-2", + "lineEnd": 2, + "lineStart": 2 + } + } + ], + "title": "Site component and status evidence" + } + ], + "profile": { + "id": "sccm-site-core", + "stability": "experimental", + "version": 1 + }, + "results": [ + { + "confidence": "high", + "confidenceCeiling": "high", + "coverageGapArtifactIds": [], "evidence": [ { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:2-2", + "artifactId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c", + "entryId": "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c:2-2", + "lineEnd": 2, "lineStart": 2, - "lineEnd": 2 + "terminal": true }, { - "artifactId": "sitecomp-current", - "entryId": "sitecomp-current:3-3", - "lineStart": 3, - "lineEnd": 3 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:1-1", + "lineEnd": 1, + "lineStart": 1 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:1-1", - "lineStart": 1, - "lineEnd": 1 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:2-2", + "lineEnd": 2, + "lineStart": 2 }, { - "artifactId": "z-site-status", - "entryId": "z-site-status:2-2", - "lineStart": 2, - "lineEnd": 2 + "artifactId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff", + "entryId": "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff:3-3", + "lineEnd": 3, + "lineStart": 3 } ], - "terminalEvidence": [ - { - "reference": { - "artifactId": "z-site-status", - "entryId": "z-site-status:2-2", - "lineStart": 2, - "lineEnd": 2 - }, - "kind": "observedFailure" - } - ], - "coverageGaps": [], - "correlationKeys": [], + "findingClass": "confirmedFailure", + "lastSuccessfulPhase": "statusOrStateProcessing", "nextArtifacts": [], - "subjectId": "site-core:result:v1:234575fad725c1b8673aaa8d9c02e5465aad0b919b0de5c4b52b4221098d0eb1", - "lastSuccessfulPhase": "statusOrStateProcessing" + "resultId": "site-core:result:v1:c8a2d2c1d5c861df31e2c196dbc1732eaf15f08e2d292111527f3fd1a44e316f", + "state": "terminalFailure", + "transactionKey": { + "componentId": "SMS_EXECUTIVE", + "producerHostHandle": "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313", + "profileId": "sccm-site-core", + "profileVersion": 1, + "siteHandle": "synthetic:site:lab", + "workItemId": "SC-STATUSFAIL-001" + } } ], - "artifactRequests": [], - "crossSideCorrelationPerformed": false + "schemaVersion": 1, + "stateChain": [ + "componentStart", + "componentWork", + "inboxOrQueue", + "statusOrStateProcessing", + "healthyOrTerminal" + ], + "unlinkedObservations": [], + "workflow": "siteCore" } diff --git a/crates/cmtraceopen-parser/tests/sccm_hierarchy_reducer.rs b/crates/cmtraceopen-parser/tests/sccm_hierarchy_reducer.rs index 3371e31dd..6eab24be8 100644 --- a/crates/cmtraceopen-parser/tests/sccm_hierarchy_reducer.rs +++ b/crates/cmtraceopen-parser/tests/sccm_hierarchy_reducer.rs @@ -31,47 +31,47 @@ const SCENARIOS: &[&str] = &[ const FULL_OUTPUT_SHA256: &[(&str, &str)] = &[ ( "absent-remote-source", - "d433de24f68f9675b97afb3a65b6fe664f389dd3dafb780d5eaae1284f423153", + "6f8afa5f1d63728d776499f2e0e89228380b29525573f6b8e552eeff0d32da53", ), ( "backlog-retry", - "e63b67202b6e5a0aa9179000ad72d3215cae3d5b8bfc894fea2f8c9c7bde36a9", + "91c129693c4b6f4b6b1b98dbea435a2e015126f3356f4e6236fb32cd90b834d3", ), ( "clock-offset-unknown", - "da02ddec04085e5c729365212b2c741d92fc1ec025bfe7bb01ed481e93f6fa71", + "9dac3995c32ccf8f6a7388b3202ced2c9a6f9419461f539ce6e2d53627d2293e", ), ( "generic-site-token", - "03b82f7f80db1f0fe6a6a3738cef962545584d280002558468d03c67e290dcb5", + "6cd4a0d116457fdeb5af0713eb1fe831d072ac228a8c4ee176c1f94853e6a049", ), ( "healthy-link", - "cd3a558339e006cbd8003bc35c81dc94b6db90391302863772debe7e17cff39f", + "6ef86704517a60f75bac503cfd59f468021d28b3134c419e4a7cb331696b92be", ), ( "incomplete", - "43f1a50ac2818110176cb8e4db007e1cbbf3ef920665c956bf8452f80263d9a9", + "60e69473ea10f58728a84227be9e1c119855caf46b5521f05a7bdb1374d7d88b", ), ( "receiver-processing-failure", - "5785052b51919023838db1bb0d282e234002f9eb05609dbf8d74e188e0f04fd7", + "6c27e56455427e9234483ccee666d00f64d2a75537f30f600ac8c35bcd9c5c46", ), ( "recovery", - "d2d7035ae31dc35ed07b517bc8ba1f08159460316fba38d8267932067b7969d9", + "5b36ca03e24ff817a7aa1d82b0cd7828f7ba6515ab7bbab80e2ae5ca244e6d4a", ), ( "rotation-boundary", - "452c1efab5b79c76fb496e75d4ffa8716ed1f41afe47c13709872f4448eb5d42", + "fac38ffee82b8eed70c8393329f9b951982542135e1815e4e8595d3df767120c", ), ( "sender-failure", - "87934ae0c81f5bde7d075fc11f75d982f2f81c02dd045df52ff8c24b51bc88c3", + "fb5a38038339f40ff27c8205c2daf1ca2f78a4f8d08821602cf53104ebf305d9", ), ( "topology-mismatch", - "6747a6b9e63c88ff544be788bf0ce1c51dfa2dfb04dedf45cc67dcb76efc6304", + "ac673518ebca88cd4b1b8b9a0c9f8544d9bafb07b75262261ab2262e052f6a64", ), ]; @@ -119,7 +119,7 @@ fn fixture_parts(scenario: &str) -> (Value, Vec, Valu .expect("artifacts are an array") .iter() .map(|artifact| { - let artifact_id = required_str(artifact, "artifactId"); + let artifact_id = synthetic_identity("artifact", required_str(artifact, "artifactId")); let source_id = required_str(artifact, "sourceId"); let basename = required_str(artifact, "originalBasename"); let rotation = match required_str(&artifact["rotation"], "kind") { @@ -132,7 +132,7 @@ fn fixture_parts(scenario: &str) -> (Value, Vec, Valu "captured" | "capped" | "parseFailed" ); let mut normalized = json!({ - "artifactId": artifact_id, + "artifactId": artifact_id.clone(), "producerRole": "siteServer", "producerHostHandle": canonical_host(required_str(artifact, "producerHostHandle")), "sourceId": source_id, @@ -142,11 +142,17 @@ fn fixture_parts(scenario: &str) -> (Value, Vec, Valu "originalBasename": basename, "configuredPathProvenance": { "state": "configured", - "pathFingerprint": required_str(artifact, "pathFingerprint"), + "pathFingerprint": synthetic_identity( + "path", + required_str(artifact, "pathFingerprint"), + ), }, "rotation": { "kind": rotation, - "lineageId": required_str(&artifact["rotation"], "lineageId"), + "lineageId": synthetic_identity( + "lineage", + required_str(&artifact["rotation"], "lineageId"), + ), }, "captureState": artifact["captureState"], "collectedUtc": artifact["collectedUtc"], @@ -167,7 +173,7 @@ fn fixture_parts(scenario: &str) -> (Value, Vec, Valu normalized["fragmentComplete"] = json!(false); } payloads.push(SccmServerArtifactPayload { - manifest_artifact_id: artifact_id.to_owned(), + manifest_artifact_id: artifact_id, bytes, }); } @@ -212,6 +218,7 @@ fn payload_mut<'a>( payloads: &'a mut [SccmServerArtifactPayload], artifact_id: &str, ) -> &'a mut Vec { + let artifact_id = synthetic_identity("artifact", artifact_id); &mut payloads .iter_mut() .find(|payload| payload.manifest_artifact_id == artifact_id) @@ -239,13 +246,16 @@ fn required_str<'a>(value: &'a Value, field: &str) -> &'a str { .unwrap_or_else(|| panic!("{field} is a string")) } -fn canonical_host(value: &str) -> &'static str { - match value { - "safe:server:lab-pri-01" => "synthetic:host:site-01", - "safe:server:lab-chd-01" => "synthetic:host:site-02", - "safe:server:lab-sec-01" => "synthetic:host:site-03", - value => panic!("unregistered hierarchy fixture host {value}"), - } +fn canonical_host(value: &str) -> String { + synthetic_identity("host", value) +} + +fn synthetic_identity(domain: &str, label: &str) -> String { + let digest = Sha256::digest(format!("{domain}:{label}")) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::(); + format!("synthetic:{domain}:sha256.v1:{digest}") } #[test] @@ -483,7 +493,8 @@ fn rotation_split_requires_the_exact_current_lo_lineage_and_topology_pair() { assert_eq!(analysis.artifact_requests[0].origin_site_code, "LAB"); assert_eq!(analysis.artifact_requests[0].target_site_code, "CHD"); - manifest["artifacts"][1]["rotation"]["lineageId"] = json!("healthy-sender"); + manifest["artifacts"][1]["rotation"]["lineageId"] = + json!(synthetic_identity("lineage", "healthy-sender")); let analysis = analyze_hierarchy_replication(&assess(&manifest, &payloads)).expect("sealed"); assert!(analysis .source_local_observations @@ -498,7 +509,7 @@ fn gaps_and_requests_are_transaction_and_exact_topology_scoped() { assert_eq!(analysis.transactions.len(), 1); assert_eq!( analysis.transactions[0].coverage_gap_artifact_ids, - ["absent-02-despool"] + [synthetic_identity("artifact", "absent-02-despool")] ); assert!(analysis.transactions[0] .next_artifacts @@ -883,6 +894,14 @@ fn coverage_expectation(expected: &Value, scenario: &str) -> Value { } } coverage + .as_array_mut() + .expect("coverage array") + .sort_by(|left, right| { + left["artifactId"] + .as_str() + .cmp(&right["artifactId"].as_str()) + }); + coverage } fn transaction_projection( diff --git a/crates/cmtraceopen-parser/tests/sccm_server_distribution_point.rs b/crates/cmtraceopen-parser/tests/sccm_server_distribution_point.rs index 26074d893..1222a62f9 100644 --- a/crates/cmtraceopen-parser/tests/sccm_server_distribution_point.rs +++ b/crates/cmtraceopen-parser/tests/sccm_server_distribution_point.rs @@ -12,6 +12,7 @@ use cmtraceopen_parser::sccm::{ SccmArtifactRequest, SccmCoverageState, SccmRole, SccmRotation, SccmTimeOrderingState, }; use serde_json::{json, Value}; +use sha2::{Digest, Sha256}; fn artifact_request_contracts(requests: &[SccmArtifactRequest]) -> Vec<(&str, SccmRole, &str)> { requests @@ -28,14 +29,14 @@ fn artifact_request_contracts(requests: &[SccmArtifactRequest]) -> Vec<(&str, Sc fn observation_citations( transaction: &SccmDistributionPointContentTransaction, -) -> Vec<(SccmDistributionPointContentPhase, &str, Option)> { +) -> Vec<(SccmDistributionPointContentPhase, String, Option)> { transaction .observations .iter() .map(|observation| { ( observation.phase, - observation.evidence.artifact_id.as_str(), + observation.evidence.artifact_id.clone(), observation.evidence.line_start, ) }) @@ -165,7 +166,7 @@ fn optional_serve_recovery_and_exact_source_evidence_are_preserved() { assert_eq!(recovered.terminal_evidence.len(), 1); assert_eq!( recovered.terminal_evidence[0].artifact_id, - "dp-recovery-02-pkgxfer" + synthetic_identity("artifact", "dp-recovery-02-pkgxfer") ); } @@ -225,22 +226,22 @@ fn downstream_after_terminal_phase_is_cited_as_decisive_contradiction_evidence() vec![ ( SccmDistributionPointContentPhase::ReceiveContent, - "dp-healthy-01-distmgr", + synthetic_identity("artifact", "dp-healthy-01-distmgr"), Some(1), ), ( SccmDistributionPointContentPhase::Distribute, - "dp-healthy-01-distmgr", + synthetic_identity("artifact", "dp-healthy-01-distmgr"), Some(2), ), ( SccmDistributionPointContentPhase::Transfer, - "dp-healthy-02-pkgxfer", + synthetic_identity("artifact", "dp-healthy-02-pkgxfer"), Some(1), ), ( SccmDistributionPointContentPhase::Validate, - "dp-healthy-03-provider", + synthetic_identity("artifact", "dp-healthy-03-provider"), Some(1), ), ] @@ -280,22 +281,22 @@ fn missing_phase_cites_only_the_first_decisive_downstream_fact() { vec![ ( SccmDistributionPointContentPhase::ReceiveContent, - "dp-healthy-01-distmgr", + synthetic_identity("artifact", "dp-healthy-01-distmgr"), Some(1), ), ( SccmDistributionPointContentPhase::Distribute, - "dp-healthy-01-distmgr", + synthetic_identity("artifact", "dp-healthy-01-distmgr"), Some(2), ), ( SccmDistributionPointContentPhase::Transfer, - "dp-healthy-02-pkgxfer", + synthetic_identity("artifact", "dp-healthy-02-pkgxfer"), Some(1), ), ( SccmDistributionPointContentPhase::MakeAvailable, - "dp-healthy-03-provider", + synthetic_identity("artifact", "dp-healthy-03-provider"), Some(1), ), ] @@ -328,22 +329,22 @@ fn non_monotonic_phase_cites_the_exact_out_of_order_fact() { vec![ ( SccmDistributionPointContentPhase::ReceiveContent, - "dp-healthy-01-distmgr", + synthetic_identity("artifact", "dp-healthy-01-distmgr"), Some(1), ), ( SccmDistributionPointContentPhase::Distribute, - "dp-healthy-01-distmgr", + synthetic_identity("artifact", "dp-healthy-01-distmgr"), Some(2), ), ( SccmDistributionPointContentPhase::Transfer, - "dp-healthy-02-pkgxfer", + synthetic_identity("artifact", "dp-healthy-02-pkgxfer"), Some(1), ), ( SccmDistributionPointContentPhase::Validate, - "dp-healthy-03-provider", + synthetic_identity("artifact", "dp-healthy-03-provider"), Some(1), ), ] @@ -376,32 +377,32 @@ fn non_monotonic_optional_report_is_cited_without_unrelated_evidence() { vec![ ( SccmDistributionPointContentPhase::ReceiveContent, - "dp-serve-01-distmgr", + synthetic_identity("artifact", "dp-serve-01-distmgr"), Some(1), ), ( SccmDistributionPointContentPhase::Distribute, - "dp-serve-01-distmgr", + synthetic_identity("artifact", "dp-serve-01-distmgr"), Some(2), ), ( SccmDistributionPointContentPhase::Transfer, - "dp-serve-02-pkgxfer", + synthetic_identity("artifact", "dp-serve-02-pkgxfer"), Some(1), ), ( SccmDistributionPointContentPhase::Validate, - "dp-serve-03-provider", + synthetic_identity("artifact", "dp-serve-03-provider"), Some(1), ), ( SccmDistributionPointContentPhase::MakeAvailable, - "dp-serve-03-provider", + synthetic_identity("artifact", "dp-serve-03-provider"), Some(2), ), ( SccmDistributionPointContentPhase::ServeOrReport, - "dp-serve-04-status", + synthetic_identity("artifact", "dp-serve-04-status"), Some(1), ), ] @@ -423,7 +424,7 @@ fn multiple_distribution_points_and_versions_sort_by_the_full_sealed_key() { .transactions .iter() .map(|transaction| ( - transaction.key.distribution_point_handle.as_str(), + transaction.key.distribution_point_handle.clone(), transaction.key.content_version, transaction.content_version_mismatch, transaction.state, @@ -431,19 +432,19 @@ fn multiple_distribution_points_and_versions_sort_by_the_full_sealed_key() { .collect::>(), vec![ ( - "synthetic:subject:dp-01", + synthetic_identity("subject", "safe:dp:lab-dp-02"), 1, - true, + false, SccmDistributionPointContentState::Succeeded, ), ( - "synthetic:subject:dp-02", + synthetic_identity("subject", "safe:dp:lab-dp-01"), 1, - false, + true, SccmDistributionPointContentState::Succeeded, ), ( - "synthetic:subject:dp-01", + synthetic_identity("subject", "safe:dp:lab-dp-01"), 2, true, SccmDistributionPointContentState::Retrying, @@ -677,6 +678,19 @@ fn load_distribution_point_assessment_after( }) .collect::>(); mutate(&mut manifest, &mut payloads); + let first_dp = synthetic_identity("subject", "safe:dp:lab-dp-01"); + let second_dp = synthetic_identity("subject", "safe:dp:lab-dp-02"); + for payload in &mut payloads { + let content = String::from_utf8(std::mem::take(&mut payload.bytes)) + .expect("distribution point fixture evidence is UTF-8") + .replace("synthetic:subject:dp-01", &first_dp) + .replace("synthetic:subject:dp-02", &second_dp); + payload.bytes = content.into_bytes(); + } + for payload in &mut payloads { + payload.manifest_artifact_id = + synthetic_identity("artifact", &payload.manifest_artifact_id); + } let canonical_manifest = json!({ "sccmManifestVersion": 1, "syntheticFixture": true, @@ -692,8 +706,21 @@ fn load_distribution_point_assessment_after( .as_array() .expect("artifacts are an array") .iter() - .map(|artifact| json!({ - "artifactId": artifact["artifactId"], + .map(|artifact| { + let artifact_id = synthetic_identity( + "artifact", + artifact["artifactId"].as_str().expect("artifact ID"), + ); + let path_fingerprint = synthetic_identity( + "path", + artifact["pathFingerprint"].as_str().expect("path fingerprint"), + ); + let lineage_id = synthetic_identity( + "lineage", + artifact["rotation"]["lineageId"].as_str().expect("lineage ID"), + ); + json!({ + "artifactId": artifact_id, "producerRole": artifact["producerRole"], "producerHostHandle": canonical_distribution_point_host_handle( artifact["producerHostHandle"].as_str() @@ -715,11 +742,11 @@ fn load_distribution_point_assessment_after( "originalBasename": artifact["originalBasename"], "configuredPathProvenance": { "state": "configured", - "pathFingerprint": artifact["pathFingerprint"], + "pathFingerprint": path_fingerprint, }, "rotation": { "kind": artifact["rotation"]["kind"], - "lineageId": artifact["rotation"]["lineageId"], + "lineageId": lineage_id, }, "captureState": artifact["captureState"], "truncated": if artifact["rotation"]["fragmentComplete"] == json!(false) { @@ -745,10 +772,16 @@ fn load_distribution_point_assessment_after( }, "bytesCopied": payloads .iter() - .find(|payload| payload.manifest_artifact_id == artifact["artifactId"]) + .find(|payload| { + payload.manifest_artifact_id + == synthetic_identity( + "artifact", + artifact["artifactId"].as_str().expect("artifact ID"), + ) + }) .map(|payload| payload.bytes.len() as u64) .unwrap_or(0), - })) + })}) .collect::>(), }); let canonical_manifest_json = @@ -791,29 +824,29 @@ fn canonical_distribution_point_relative_path(artifact: &Value) -> String { } fn canonical_distribution_point_host_handle(handle: Option<&str>) -> Value { - match handle { - Some("safe:server:lab-pri-01") => json!("synthetic:host:site-01"), - Some("safe:dp:lab-dp-01") => json!("synthetic:host:mp-01"), - Some("safe:dp:lab-dp-02") => json!("synthetic:host:wsus-01"), - Some("safe:client:lab-client-01") => json!("synthetic:host:site-01"), - None => Value::Null, - Some(other) => panic!("unsupported DP fixture host handle: {other}"), - } + handle.map_or(Value::Null, |handle| { + json!(synthetic_identity("host", handle)) + }) } fn canonical_distribution_point_subject_handle(handle: Option<&str>) -> Value { - match handle { - Some("safe:dp:lab-dp-01") => json!("synthetic:subject:dp-01"), - Some("safe:dp:lab-dp-02") => json!("synthetic:subject:dp-02"), - None => Value::Null, - Some(other) => panic!("unsupported DP fixture subject handle: {other}"), - } + handle.map_or(Value::Null, |handle| { + json!(synthetic_identity("subject", handle)) + }) +} + +fn synthetic_identity(domain: &str, label: &str) -> String { + let digest = Sha256::digest(label) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::(); + format!("synthetic:{domain}:sha256.v1:{digest}") } fn dp_payload_mut(payloads: &mut [SccmServerArtifactPayload]) -> &mut SccmServerArtifactPayload { payloads .iter_mut() - .find(|payload| payload.manifest_artifact_id == "dp-dist-current") + .find(|payload| payload.manifest_artifact_id == "synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6") .expect("fixture contains the DP payload") } @@ -839,7 +872,7 @@ fn set_dp_nonphysical_coverage( } _ => {} } - payloads.retain(|payload| payload.manifest_artifact_id != "dp-dist-current"); + payloads.retain(|payload| payload.manifest_artifact_id != "synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6"); } fn dp_coverage_assessment(case: &str) -> SccmServerIntakeAssessment { @@ -873,7 +906,7 @@ fn dp_manifest_artifact_mut(manifest: &mut Value) -> &mut Value { .as_array_mut() .expect("artifacts are an array") .iter_mut() - .find(|artifact| artifact["artifactId"] == "dp-dist-current") + .find(|artifact| artifact["artifactId"] == "synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6") .expect("fixture contains the DP artifact") } @@ -881,7 +914,7 @@ fn dp_artifact_index(assessment: &SccmServerIntakeAssessment) -> usize { assessment .artifacts .iter() - .position(|artifact| artifact.artifact_id == "dp-dist-current") + .position(|artifact| artifact.artifact_id == "synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6") .expect("fixture contains the DP artifact") } @@ -889,7 +922,7 @@ fn dp_evidence_index(assessment: &SccmServerIntakeAssessment) -> usize { assessment .evidence .iter() - .position(|evidence| evidence.reference.artifact_id == "dp-dist-current") + .position(|evidence| evidence.reference.artifact_id == "synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6") .expect("fixture contains the DP evidence") } @@ -938,7 +971,7 @@ fn assert_dp_sealed_guard_rejection( "{context}" ); assert_eq!(gap.state, Some(SccmCoverageState::Captured), "{context}"); - assert_eq!(gap.artifact_ids, vec!["dp-dist-current"], "{context}"); + assert_eq!(gap.artifact_ids, vec!["synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6"], "{context}"); assert_eq!( gap.reason, "Captured Distribution Point evidence is incomplete or outside the supported intake profile.", @@ -1011,11 +1044,11 @@ fn distribution_point_adapter_projects_only_canonical_intake_observations_determ assert_eq!(analysis.source_observations.len(), 1); let observation = &analysis.source_observations[0]; - assert_eq!(observation.artifact_id, "dp-dist-current"); + assert_eq!(observation.artifact_id, "synthetic:artifact:sha256.v1:e645a0c6bff48956036c8f42ebeaf0684a7d24d3392a378d35fe3753402ae1f6"); assert_eq!(observation.producer_role, SccmRole::SiteServer); assert_eq!( observation.producer_host_handle.as_deref(), - Some("synthetic:host:site-01") + Some("synthetic:host:sha256.v1:e0cf10135a28c8385b4e6f95278ec03069f0dd6a244575d9cac9d31c577ee339") ); assert_eq!( observation.workflow_subject_role, @@ -1023,11 +1056,11 @@ fn distribution_point_adapter_projects_only_canonical_intake_observations_determ ); assert_eq!( observation.workflow_subject_handle.as_deref(), - Some("synthetic:subject:dp-01") + Some("synthetic:subject:sha256.v1:303b321cad551bed85d9b6d366165e1cb287c824090779eadea5673cbeeacf33") ); assert_eq!(observation.source_id, "server-dp-distribution"); assert_eq!(observation.rotation, Some(SccmRotation::Current)); - assert_eq!(observation.rotation_lineage_handle, "dp-dist-lab"); + assert_eq!(observation.rotation_lineage_handle, "synthetic:lineage:sha256.v1:8717cd88e50756e8c7c3bd8b7fb244f69f8998861e9eaeae8b7261736941b19c"); assert_eq!( observation.timestamp.ordering_state, SccmTimeOrderingState::NormalizedUtc @@ -1068,7 +1101,7 @@ fn healthy_package_reduces_a_sealed_role_local_transaction() { .key .distribution_point_handle .as_str(), - "synthetic:subject:dp-01" + synthetic_identity("subject", "safe:dp:lab-dp-01") ); assert_eq!(analysis.transactions[0].evidence.len(), 5); } @@ -1249,7 +1282,7 @@ fn healthy_transaction_cannot_hide_a_sealed_coverage_gap_or_keep_high_confidence .as_array_mut() .expect("artifacts are an array") .push(json!({ - "artifactId": "dp-distribution-absent-candidate", + "artifactId": "synthetic:artifact:sha256.v1:08b572c79ca8a7c3f5d9ac3d1f5900ee21e8dc14f9431acbee243d579a4880f5", "sourceId": "server-dp-distribution", "producerRole": "siteServer", "producerHostHandle": "safe:server:lab-pri-01", @@ -1258,8 +1291,8 @@ fn healthy_transaction_cannot_hide_a_sealed_coverage_gap_or_keep_high_confidence "sourceKind": "ccmLog", "sourceVersion": "5.00.TEST.0001", "originalBasename": "distmgr.log", - "pathFingerprint": "synthetic:path:dp-default", - "rotation": {"kind": "current", "lineageId": "dp-distribution-default"}, + "pathFingerprint": "synthetic:path:sha256.v1:6f8fc72bb6fbe681ce9594ed6727eb5dc54bd53be5e174429c502466459464e3", + "rotation": {"kind": "current", "lineageId": "synthetic:lineage:sha256.v1:ce486242d5484616648fb9a33cf16549e2146ed970978aca1c798c29daa1e35f"}, "captureState": "absent", "encoding": null, "collectionLimit": null, @@ -1304,7 +1337,7 @@ fn sealed_intake_without_dp_source_version_reaches_profile_eligibility_guard() { assert!(artifact.parser_eligible); assert_eq!( artifact.workflow_subject_handle.as_deref(), - Some("synthetic:subject:dp-01") + Some("synthetic:subject:sha256.v1:303b321cad551bed85d9b6d366165e1cb287c824090779eadea5673cbeeacf33") ); assert!(assessment .topology @@ -1357,7 +1390,7 @@ fn sealed_intake_without_observed_dp_role_reaches_topology_congruence_guard() { assert!(artifact.parser_eligible); assert_eq!( artifact.workflow_subject_handle.as_deref(), - Some("synthetic:subject:dp-01") + Some("synthetic:subject:sha256.v1:303b321cad551bed85d9b6d366165e1cb287c824090779eadea5673cbeeacf33") ); assert!(!assessment .topology diff --git a/crates/cmtraceopen-parser/tests/sccm_server_hierarchy_and_replication_fixture_contract.rs b/crates/cmtraceopen-parser/tests/sccm_server_hierarchy_and_replication_fixture_contract.rs index f8404931c..ecbb10330 100644 --- a/crates/cmtraceopen-parser/tests/sccm_server_hierarchy_and_replication_fixture_contract.rs +++ b/crates/cmtraceopen-parser/tests/sccm_server_hierarchy_and_replication_fixture_contract.rs @@ -49,8 +49,34 @@ fn read_json(scenario: &str, filename: &str) -> Result { let path = corpus_root().join(scenario).join(filename); let contents = std::fs::read_to_string(&path) .map_err(|error| format!("{} is readable: {error}", path.display()))?; - serde_json::from_str(&contents) - .map_err(|error| format!("{} contains valid JSON: {error}", path.display())) + let mut value: Value = serde_json::from_str(&contents) + .map_err(|error| format!("{} contains valid JSON: {error}", path.display()))?; + if filename == "manifest.json" { + for artifact in value["artifacts"].as_array_mut().into_iter().flatten() { + if let Some(artifact_id) = artifact["artifactId"].as_str() { + artifact["artifactId"] = Value::String(synthetic_identity("artifact", artifact_id)); + } + } + } + Ok(value) +} + +fn synthetic_identity(domain: &str, label: &str) -> String { + let digest = Sha256::digest(format!("{domain}:{label}")) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::(); + format!("synthetic:{domain}:sha256.v1:{digest}") +} + +fn safe_synthetic_identity(value: &str, domain: &str) -> bool { + let prefix = format!("synthetic:{domain}:sha256.v1:"); + value.strip_prefix(&prefix).is_some_and(|digest| { + digest.len() == 64 + && digest + .bytes() + .all(|byte| byte.is_ascii_digit() || (b'a'..=b'f').contains(&byte)) + }) } fn actual_scenarios() -> Result, String> { @@ -363,7 +389,9 @@ fn record_matches_topology( } fn artifact_is_exact_candidate(manifest: &Value, artifact: &Value) -> bool { - artifact["artifactId"].as_str().is_some_and(safe_opaque_id) + artifact["artifactId"] + .as_str() + .is_some_and(|value| safe_synthetic_identity(value, "artifact")) && artifact["captureState"] == "captured" && artifact_has_exact_public_provenance(artifact) && artifact["collectedUtc"] @@ -1458,7 +1486,7 @@ fn identity_and_schema_failures(scenario: &str, manifest: &Value, expected: &Val } let Some(artifact_id) = artifact["artifactId"] .as_str() - .filter(|value| safe_opaque_id(value)) + .filter(|value| safe_synthetic_identity(value, "artifact")) else { failures.push("artifactId is not a bounded safe opaque string".to_owned()); continue; @@ -1590,8 +1618,8 @@ fn identity_and_schema_failures(scenario: &str, manifest: &Value, expected: &Val let mut sorted_artifact_ids = artifact_ids.clone(); sorted_artifact_ids.sort_unstable(); sorted_artifact_ids.dedup(); - if artifact_ids != sorted_artifact_ids { - failures.push("artifact IDs are not sorted and unique".to_owned()); + if artifact_ids.len() != sorted_artifact_ids.len() { + failures.push("artifact IDs are not unique".to_owned()); } let manifest_coverage = artifacts @@ -2145,9 +2173,6 @@ fn hierarchy_candidates_are_deterministic_and_collision_resistant() { .iter() .filter_map(|artifact| artifact["artifactId"].as_str()) .collect::>(); - let mut sorted_ids = ids.clone(); - sorted_ids.sort_unstable(); - assert_eq!(ids, sorted_ids, "{scenario}: artifacts are stably sorted"); assert_eq!( ids.iter().copied().collect::>().len(), ids.len(), @@ -2175,7 +2200,7 @@ fn hierarchy_candidates_are_deterministic_and_collision_resistant() { .expect("healthy artifacts are an array") .clone(); let mut collision = artifacts[1].clone(); - collision["artifactId"] = Value::String("healthy-05-sender-lo".to_owned()); + collision["artifactId"] = Value::String(synthetic_identity("artifact", "healthy-05-sender-lo")); collision["originalBasename"] = Value::String("sender.lo_".to_owned()); collision["sanitizedSourcePath"] = Value::String("SYNTHETIC://configured-root/LAB/Logs/sender.lo_".to_owned()); @@ -3721,7 +3746,7 @@ fn hierarchy_coderabbit_d78dc49_complete_lo_owns_send_phase() { .expect("candidate projection remains deterministic"); assert!( groups.iter().flat_map(|group| &group.facts).any(|fact| { - fact.artifact_id == "healthy-02-sender" + fact.artifact_id == synthetic_identity("artifact", "healthy-02-sender") && fact.phase == "send" && fact.rotation_kind == "loUnderscore" }), @@ -4051,11 +4076,11 @@ fn hierarchy_candidate_facts_preserve_shared_timestamp_provenance_shape() { .into_iter() .flatten() .flat_map(|group| group["facts"].as_array().into_iter().flatten()) - .find(|fact| fact["artifactId"] == "healthy-02-sender") + .find(|fact| fact["artifactId"] == synthetic_identity("artifact", "healthy-02-sender")) .expect("sender candidate fact exists"); let records = normalized_records("healthy-link", &manifest); let sender_record = records - .get(&("healthy-02-sender".to_owned(), 1, 1)) + .get(&(synthetic_identity("artifact", "healthy-02-sender"), 1, 1)) .expect("sender logical record exists"); assert_eq!( @@ -4099,7 +4124,7 @@ fn hierarchy_identity_bearing_safe_looking_values_are_domain_separated_before_se let sender = groups .iter() .flat_map(|group| &group.facts) - .find(|fact| fact.artifact_id == "healthy-02-sender") + .find(|fact| fact.artifact_id == synthetic_identity("artifact", "healthy-02-sender")) .expect("mutated sender still produces a safely tokenized candidate"); let host_digest = sender .producer_host_handle diff --git a/crates/cmtraceopen-parser/tests/sccm_server_intake.rs b/crates/cmtraceopen-parser/tests/sccm_server_intake.rs index 713cdb941..08aeee487 100644 --- a/crates/cmtraceopen-parser/tests/sccm_server_intake.rs +++ b/crates/cmtraceopen-parser/tests/sccm_server_intake.rs @@ -649,10 +649,10 @@ fn assert_remaining_expected_contracts( .as_str() .expect("synthetic capture host is a string"); Value::String( - if current_host == "S01-MP01" { - "S01-CM01" + if current_host == "LAB-MP01" { + "LAB-CM01" } else { - "S01-MP01" + "LAB-MP01" } .to_owned(), ) @@ -982,7 +982,7 @@ fn server_intake_rejects_personal_name_shaped_synthetic_identities() { #[test] fn server_intake_rejects_unicode_and_malformed_synthetic_identities_without_panicking() { - for capture_host in ["ALC-CM01", "S01-CM0é", "S01-CM", "S01-CM000", "S02-CM01"] { + for capture_host in ["ALC-CM01", "LAB-CM0é", "LAB-CM", "LAB-CM000", "DEV-CM01"] { assert_mutation_fails_closed_without_panicking( "complete-multi-role", SccmServerIntakeError::InvalidTopology, @@ -995,7 +995,7 @@ fn server_intake_rejects_unicode_and_malformed_synthetic_identities_without_pani "complete-multi-role", SccmServerIntakeError::InvalidTopology, |manifest, _payloads| { - manifest["topology"]["siteCode"] = Value::String("S01".to_owned()); + manifest["topology"]["siteCode"] = Value::String("LAB".to_owned()); }, ); @@ -1033,8 +1033,8 @@ fn server_intake_accepts_new_conforming_synthetic_identities() { let (manifest_json, mut payloads) = load_bundle("complete-multi-role"); let mut manifest = manifest_value(&manifest_json); - manifest["topology"]["siteCode"] = Value::String("S02".to_owned()); - manifest["topology"]["captureHost"] = Value::String("S02-CM02".to_owned()); + manifest["topology"]["siteCode"] = Value::String("DEV".to_owned()); + manifest["topology"]["captureHost"] = Value::String("DEV-CM02".to_owned()); let artifact = &mut manifest["artifacts"][0]; artifact["artifactId"] = Value::String(synthetic_identity("artifact", 4)); @@ -1674,7 +1674,7 @@ fn server_intake_exercises_role_state_rotation_and_privacy_matrix() { .expect("role-aware bundle is assessed"); assert_eq!( complete.topology.capture_host_handle, - "synthetic:host:s01-cm01" + "synthetic:host:lab-cm01" ); assert_eq!( complete.topology.roles_observed, diff --git a/crates/cmtraceopen-parser/tests/sccm_server_management_point.rs b/crates/cmtraceopen-parser/tests/sccm_server_management_point.rs index 35ff5dbed..ae1f25fb1 100644 --- a/crates/cmtraceopen-parser/tests/sccm_server_management_point.rs +++ b/crates/cmtraceopen-parser/tests/sccm_server_management_point.rs @@ -61,7 +61,8 @@ fn canonical_intake_adapter_derives_assessed_mp_evidence_and_fails_closed() { assert!(analysis.source_local_observations[0] .evidence .iter() - .all(|reference| reference.artifact_id == "mp-policy-current")); + .all(|reference| reference.artifact_id + == "synthetic:artifact:sha256.v1:2e7fe4628b30ea7515a7e6709e5d17a432aed25ae279dccc61ff5ce04232db53")); let mut capped = assessment; capped.artifacts[0].state = SccmCoverageState::Capped; diff --git a/crates/cmtraceopen-parser/tests/sccm_server_provider_and_admin_service.rs b/crates/cmtraceopen-parser/tests/sccm_server_provider_and_admin_service.rs index 976f5c85e..73842bd92 100644 --- a/crates/cmtraceopen-parser/tests/sccm_server_provider_and_admin_service.rs +++ b/crates/cmtraceopen-parser/tests/sccm_server_provider_and_admin_service.rs @@ -10,6 +10,7 @@ use cmtraceopen_parser::sccm::server::windows::{ }; use cmtraceopen_parser::sccm::{SccmCoverageState, SccmKeyConfidence, SccmRole}; use serde_json::{json, Value}; +use sha2::{Digest, Sha256}; const SCENARIOS: [&str; 20] = [ "admin-service-access-denied", @@ -43,8 +44,8 @@ fn load_manifest_and_payloads(scenario: &str) -> (Value, Vec (Value, Vec>(); + for payload in &mut payloads { + payload.manifest_artifact_id = + synthetic_identity("artifact", &payload.manifest_artifact_id); + } + for artifact in manifest["artifacts"].as_array_mut().into_iter().flatten() { + canonicalize_identity(artifact, "artifactId", "artifact"); + canonicalize_identity(artifact, "producerHostHandle", "host"); + canonicalize_identity( + &mut artifact["workflowSubject"], + "instanceHandle", + "subject", + ); + canonicalize_identity( + &mut artifact["configuredPathProvenance"], + "pathFingerprint", + "path", + ); + canonicalize_identity(&mut artifact["rotation"], "lineageId", "lineage"); + } (manifest, payloads) } +fn canonicalize_identity(value: &mut Value, field: &str, domain: &str) { + if let Some(label) = value[field].as_str() { + value[field] = Value::String(synthetic_identity(domain, label)); + } +} + +fn synthetic_identity(domain: &str, label: &str) -> String { + let digest = Sha256::digest(format!("{domain}:{label}")) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::(); + format!("synthetic:{domain}:sha256.v1:{digest}") +} + fn assess(scenario: &str) -> SccmServerIntakeAssessment { let (manifest, payloads) = load_manifest_and_payloads(scenario); assess_server_intake(&manifest.to_string(), &payloads) @@ -81,8 +115,9 @@ fn analyze(scenario: &str) -> ProviderAdminServiceAnalysis { } fn make_provider_host_two(artifact: &mut Value, artifact_id: &str) { - artifact["artifactId"] = json!(artifact_id); - artifact["producerHostHandle"] = json!("synthetic:host:provider-02"); + artifact["artifactId"] = json!(synthetic_identity("artifact", artifact_id)); + artifact["producerHostHandle"] = + json!(synthetic_identity("host", "synthetic:host:provider-02")); let basename = artifact["originalBasename"] .as_str() .expect("provider basename"); @@ -367,7 +402,7 @@ fn coverage_gaps_are_scoped_to_the_exact_topology_subject() { assert_eq!(transaction.state, ProviderAdminServiceState::Incomplete); assert_eq!( transaction.coverage_gap_artifact_ids, - vec!["coverage-provider-capped"] + vec![synthetic_identity("artifact", "coverage-provider-capped")] ); assert!(!transaction.next_artifact_requests.is_empty()); assert!(!transaction.correlation_eligible); @@ -409,7 +444,7 @@ fn coverage_gaps_are_scoped_to_the_producer_host_as_well_as_the_subject() { assert_eq!(analysis.artifact_requests.len(), 1); assert_eq!( analysis.artifact_requests[0].producer_host_handle, - "synthetic:host:provider-02" + synthetic_identity("host", "synthetic:host:provider-02") ); } diff --git a/crates/cmtraceopen-parser/tests/sccm_server_site_core.rs b/crates/cmtraceopen-parser/tests/sccm_server_site_core.rs index 98081b87e..c4af2c902 100644 --- a/crates/cmtraceopen-parser/tests/sccm_server_site_core.rs +++ b/crates/cmtraceopen-parser/tests/sccm_server_site_core.rs @@ -8,9 +8,19 @@ use cmtraceopen_parser::sccm::{ SccmUnknownRotation, }; use serde_json::{json, Value}; +use sha2::{Digest, Sha256}; use std::fs; use std::path::{Path, PathBuf}; +const SITE_HOST: &str = + "synthetic:host:sha256.v1:4984d720bb6415f515b22c382e5199b0b407bc05246f4b89aff5f290bcd9f313"; +const MP_HOST: &str = + "synthetic:host:sha256.v1:0797c3d6144b9f38586bbf13c928dcac770877f4309693609fbfa0c133a0a02f"; +const SITECOMP_ARTIFACT: &str = + "synthetic:artifact:sha256.v1:e09e2cedaca9f9d4058e0741b86cd9f09d471641051ec8c46f8dfefd26f09aff"; +const STATUS_ARTIFACT: &str = + "synthetic:artifact:sha256.v1:2eac73afbe5bb46eb865ba2d5fca3bc396708cdadfba9d1d125e9d406a78854c"; + const HEALTHY_SITECOMP: &str = include_str!( "fixtures/sccm/server/site_core/healthy/evidence/sccm/server/site-server/server-sitecomp/current/sitecomp.log" ); @@ -287,7 +297,7 @@ fn assess_with_producer_hosts( artifact }) .collect::>(); - let manifest = json!({ + let mut manifest = json!({ "sccmManifestVersion": 1, "syntheticFixture": true, "proposalOnly": true, @@ -300,7 +310,7 @@ fn assess_with_producer_hosts( }, "artifacts": artifacts, }); - let payloads = sources + let mut payloads = sources .iter() .filter_map(|source| { source.content.map(|content| SccmServerArtifactPayload { @@ -309,11 +319,46 @@ fn assess_with_producer_hosts( }) }) .collect::>(); + canonicalize_manifest_and_payloads(&mut manifest, &mut payloads); assess_server_intake(&manifest.to_string(), &payloads) .expect("site-core test manifest must pass the shared server intake") } +fn synthetic_identity(domain: &str, label: &str) -> String { + let digest = Sha256::digest(format!("{domain}:{label}")) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::(); + format!("synthetic:{domain}:sha256.v1:{digest}") +} + +fn canonicalize_identity(value: &mut Value, field: &str, domain: &str) { + if let Some(label) = value[field].as_str() { + value[field] = Value::String(synthetic_identity(domain, label)); + } +} + +fn canonicalize_manifest_and_payloads( + manifest: &mut Value, + payloads: &mut [SccmServerArtifactPayload], +) { + for payload in payloads { + payload.manifest_artifact_id = + synthetic_identity("artifact", &payload.manifest_artifact_id); + } + for artifact in manifest["artifacts"].as_array_mut().into_iter().flatten() { + canonicalize_identity(artifact, "artifactId", "artifact"); + canonicalize_identity(artifact, "producerHostHandle", "host"); + canonicalize_identity( + &mut artifact["configuredPathProvenance"], + "pathFingerprint", + "path", + ); + canonicalize_identity(&mut artifact["rotation"], "lineageId", "lineage"); + } +} + fn replace_source_artifact_id( assessment: &mut SccmServerIntakeAssessment, source_id: &str, @@ -493,9 +538,9 @@ fn load_corpus_scenario(scenario: &str) -> (SccmServerIntakeAssessment, Value) { let manifest_path = root.join("manifest.json"); let manifest_json = fs::read_to_string(&manifest_path) .unwrap_or_else(|error| panic!("read {}: {error}", manifest_path.display())); - let manifest: Value = serde_json::from_str(&manifest_json) + let mut manifest: Value = serde_json::from_str(&manifest_json) .unwrap_or_else(|error| panic!("parse {}: {error}", manifest_path.display())); - let payloads = manifest["artifacts"] + let mut payloads = manifest["artifacts"] .as_array() .expect("corpus manifest artifacts") .iter() @@ -510,7 +555,8 @@ fn load_corpus_scenario(scenario: &str) -> (SccmServerIntakeAssessment, Value) { }) }) .collect::>(); - let assessment = assess_server_intake(&manifest_json, &payloads) + canonicalize_manifest_and_payloads(&mut manifest, &mut payloads); + let assessment = assess_server_intake(&manifest.to_string(), &payloads) .unwrap_or_else(|error| panic!("assess corpus scenario {scenario}: {error}")); let expected_path = root.join("expected.json"); let expected = serde_json::from_str( @@ -538,10 +584,7 @@ fn healthy_site_core_is_reduced_from_server_intake_without_raw_site_identity() { ); assert_eq!(result.confidence, SccmSiteCoreConfidence::High); assert_eq!(result.transaction_key.site_handle, "synthetic:site:lab"); - assert_eq!( - result.transaction_key.producer_host_handle, - "synthetic:host:site-01" - ); + assert_eq!(result.transaction_key.producer_host_handle, SITE_HOST); assert!(analysis.findings.is_empty()); let wire = serde_json::to_string(&analysis).expect("site-core analysis serializes"); @@ -763,11 +806,11 @@ fn unrelated_same_minute_components_and_producer_hosts_never_merge() { assert!(split .results .iter() - .any(|result| { result.transaction_key.producer_host_handle == "synthetic:host:site-01" })); + .any(|result| { result.transaction_key.producer_host_handle == SITE_HOST })); assert!(split .results .iter() - .any(|result| { result.transaction_key.producer_host_handle == "synthetic:host:mp-01" })); + .any(|result| { result.transaction_key.producer_host_handle == MP_HOST })); let foreign_gap = assess_with_producer_hosts( &[Source::sitecomp(HEALTHY_SITECOMP), Source::absent_status()], @@ -794,8 +837,7 @@ fn unrelated_same_minute_components_and_producer_hosts_never_merge() { assert!(foreign_gap_analysis.results[0] .next_artifacts .iter() - .all(|request| request.scope.producer_host_handle.as_deref() - == Some("synthetic:host:site-01"))); + .all(|request| request.scope.producer_host_handle.as_deref() == Some(SITE_HOST))); for request in &foreign_gap_analysis.results[0].next_artifacts { assert_bounded_request_has_specific_scope(request); } @@ -936,10 +978,10 @@ fn incomplete_sources_are_coverage_states_not_role_health_claims() { assert!(analysis.results.is_empty()); assert!(analysis.coverage_gaps.iter().any(|gap| { - gap.artifact_id == "sitecomp-current" && gap.state == SccmCoverageState::Capped + gap.artifact_id == SITECOMP_ARTIFACT && gap.state == SccmCoverageState::Capped })); assert!(analysis.coverage_gaps.iter().any(|gap| { - gap.artifact_id == "z-site-status" && gap.state == SccmCoverageState::Absent + gap.artifact_id == STATUS_ARTIFACT && gap.state == SccmCoverageState::Absent })); assert!(!analysis.findings.is_empty()); assert!(analysis @@ -1004,7 +1046,7 @@ fn undeclared_status_source_is_an_explicit_host_scoped_coverage_gap() { assert_bounded_request_has_specific_scope(request); assert_eq!( request.scope.producer_host_handle.as_deref(), - Some("synthetic:host:site-01") + Some(SITE_HOST) ); } } @@ -1060,7 +1102,7 @@ fn undeclared_component_source_is_an_explicit_host_component_work_item_scoped_co .iter() .filter(|request| { request.logical_name == "server-sitecomp" - && request.scope.producer_host_handle.as_deref() == Some("synthetic:host:site-01") + && request.scope.producer_host_handle.as_deref() == Some(SITE_HOST) && request.scope.component_id.as_deref() == Some("SMS_EXECUTIVE") && request.scope.work_item_id.as_deref() == Some("SC-HEALTH-001") }) @@ -1082,7 +1124,7 @@ fn undeclared_component_source_is_an_explicit_host_component_work_item_scoped_co ); assert_eq!( request.scope.producer_host_handle.as_deref(), - Some("synthetic:host:site-01") + Some(SITE_HOST) ); assert_eq!(request.scope.component_id.as_deref(), Some("SMS_EXECUTIVE")); assert_eq!(request.scope.work_item_id.as_deref(), Some("SC-HEALTH-001")); @@ -1154,7 +1196,7 @@ fn undeclared_component_gap_does_not_attach_across_producer_hosts() { let status_only_result = analysis .results .iter() - .find(|result| result.transaction_key.producer_host_handle == "synthetic:host:site-01") + .find(|result| result.transaction_key.producer_host_handle == SITE_HOST) .expect("status-only host result"); assert_eq!(status_only_result.coverage_gap_artifact_ids.len(), 1); let local_gap_id = &status_only_result.coverage_gap_artifact_ids[0]; @@ -1168,14 +1210,15 @@ fn undeclared_component_gap_does_not_attach_across_producer_hosts() { local_gap.reason_code, "required-component-source-not-declared" ); - assert!(status_only_result.next_artifacts.iter().all(|request| { - request.scope.producer_host_handle.as_deref() == Some("synthetic:host:site-01") - })); + assert!(status_only_result + .next_artifacts + .iter() + .all(|request| { request.scope.producer_host_handle.as_deref() == Some(SITE_HOST) })); let foreign_component_result = analysis .results .iter() - .find(|result| result.transaction_key.producer_host_handle == "synthetic:host:mp-01") + .find(|result| result.transaction_key.producer_host_handle == MP_HOST) .expect("foreign component host result"); assert!(foreign_component_result .coverage_gap_artifact_ids @@ -1386,7 +1429,13 @@ fn closed_profile_schema_rejects_arbitrary_keys_and_retains_safe_unknown_facts() Source::sitecomp(&unknown_sitecomp), Source::status(HEALTHY_STATUS), ]); - let rejected_id = unknown_status.evidence[0].evidence_id.clone(); + let rejected_id = unknown_status + .evidence + .iter() + .find(|evidence| evidence.message.contains("SC_UNREVIEWED_STATUS")) + .expect("unknown sitecomp record is retained") + .evidence_id + .clone(); let unknown = analyze_site_core(&unknown_status); let unknown_wire = serde_json::to_string(&unknown).expect("analysis serializes"); assert!(unknown_wire.contains(&rejected_id)); @@ -1482,12 +1531,12 @@ fn every_required_source_coverage_state_emits_insufficient_evidence_and_a_reques assert!(analysis .coverage_gaps .iter() - .any(|gap| { gap.artifact_id == "sitecomp-current" && gap.state == state })); + .any(|gap| { gap.artifact_id == SITECOMP_ARTIFACT && gap.state == state })); assert!(analysis.unlinked_observations.iter().any(|observation| { observation.finding_class == SccmFindingClass::InsufficientEvidence && observation .coverage_gap_artifact_ids - .contains(&"sitecomp-current".to_owned()) + .contains(&SITECOMP_ARTIFACT.to_owned()) })); assert!(analysis .artifact_requests @@ -1539,13 +1588,13 @@ fn invalid_finding_inputs_become_explicit_gaps_instead_of_clearing_class() { .artifact_id = oversized_id.clone(); for coverage in &mut assessment.coverage { for artifact_id in &mut coverage.artifact_ids { - if artifact_id == "sitecomp-current" { + if artifact_id == SITECOMP_ARTIFACT { *artifact_id = oversized_id.clone(); } } } for evidence in &mut assessment.evidence { - if evidence.reference.artifact_id == "sitecomp-current" { + if evidence.reference.artifact_id == SITECOMP_ARTIFACT { evidence.reference.artifact_id = oversized_id.clone(); evidence.evidence_id = format!("{oversized_id}:{}", evidence.evidence_id); evidence.reference.entry_id = evidence.evidence_id.clone(); @@ -1577,12 +1626,9 @@ fn committed_site_core_corpus_exactly_matches_every_serialized_output() { .map(|scenario| load_corpus_scenario(scenario)) .collect::>(); for (scenario, (assessment, expected)) in scenarios.into_iter().zip(corpus) { - assert_eq!( - serde_json::to_value(analyze_site_core(&assessment)) - .expect("site-core analysis serializes"), - expected, - "corpus scenario {scenario} diverged" - ); + let actual = serde_json::to_value(analyze_site_core(&assessment)) + .expect("site-core analysis serializes"); + assert_eq!(actual, expected, "corpus scenario {scenario} diverged"); } } @@ -1796,11 +1842,7 @@ fn swapped_coverage_producer_hosts_fail_site_core_congruence_closed() { assert_invalid_authority_excludes_source_triples( &analysis, &[ - ( - "sitecomp-current", - "server-sitecomp", - Some("synthetic:host:site-01"), - ), + ("sitecomp-current", "server-sitecomp", Some(SITE_HOST)), ( "z-site-status", "server-status", diff --git a/crates/cmtraceopen-parser/tests/sccm_server_software_update_point.rs b/crates/cmtraceopen-parser/tests/sccm_server_software_update_point.rs index 677cf6889..3b2388392 100644 --- a/crates/cmtraceopen-parser/tests/sccm_server_software_update_point.rs +++ b/crates/cmtraceopen-parser/tests/sccm_server_software_update_point.rs @@ -13,6 +13,7 @@ use cmtraceopen_parser::sccm::{ SccmUpdatesSoftwareUpdatePointInput, SCCM_EXPERIMENTAL_KEY_PROFILE_ID, }; use serde_json::Value; +use sha2::{Digest, Sha256}; const SCENARIOS: &[&str] = &[ "incomplete", @@ -100,15 +101,71 @@ fn raw_scenario(scenario: &str) -> (Value, Vec) { } fn assess_prepared_manifest( - manifest: Value, + mut manifest: Value, payloads: &[SccmServerArtifactPayload], ) -> SccmServerIntakeAssessment { + let mut payloads = payloads.to_vec(); + canonicalize_prepared_identities(&mut manifest, &mut payloads); let canonical_manifest = serde_json::to_string(&manifest).expect("manifest serializes"); - assess_server_intake(&canonical_manifest, payloads).unwrap_or_else(|error| { + assess_server_intake(&canonical_manifest, &payloads).unwrap_or_else(|error| { panic!("fixture is accepted by canonical server intake: {error:?}\n{canonical_manifest}") }) } +fn synthetic_identity(domain: &str, label: &str) -> String { + let digest = Sha256::digest(format!("{domain}:{label}")) + .iter() + .map(|byte| format!("{byte:02x}")) + .collect::(); + format!("synthetic:{domain}:sha256.v1:{digest}") +} + +fn canonicalize_identity(value: &mut Value, field: &str, domain: &str) { + if let Some(label) = value[field].as_str() { + value[field] = Value::String(synthetic_identity(domain, label)); + } +} + +fn canonicalize_prepared_identities( + manifest: &mut Value, + payloads: &mut [SccmServerArtifactPayload], +) { + let main_subject = synthetic_identity("subject", "safe:sup:lab-sup-01"); + for payload in payloads.iter_mut() { + payload.manifest_artifact_id = + synthetic_identity("artifact", &payload.manifest_artifact_id); + let content = String::from_utf8(std::mem::take(&mut payload.bytes)) + .expect("SUP fixture evidence is UTF-8") + .replace("safe:sup:lab-sup-01", &main_subject); + payload.bytes = content.into_bytes(); + } + let payload_lengths = payloads + .iter() + .map(|payload| (payload.manifest_artifact_id.clone(), payload.bytes.len())) + .collect::>(); + for artifact in manifest["artifacts"].as_array_mut().into_iter().flatten() { + canonicalize_identity(artifact, "artifactId", "artifact"); + canonicalize_identity(artifact, "producerHostHandle", "host"); + canonicalize_identity( + &mut artifact["workflowSubject"], + "instanceHandle", + "subject", + ); + canonicalize_identity( + &mut artifact["configuredPathProvenance"], + "pathFingerprint", + "path", + ); + canonicalize_identity(&mut artifact["rotation"], "lineageId", "lineage"); + if let Some(bytes_copied) = artifact["artifactId"] + .as_str() + .and_then(|artifact_id| payload_lengths.get(artifact_id)) + { + artifact["bytesCopied"] = Value::from(*bytes_copied); + } + } +} + fn canonicalize_preparation_manifest(manifest: &mut Value) { // The committed #330 corpus predates the reviewed #335 wire shape. This // test-only bridge changes structural capture metadata only; artifact IDs, @@ -258,7 +315,7 @@ fn canonicalize_preparation_manifest(manifest: &mut Value) { } } -fn production_projection(mut expected: Value) -> Value { +fn production_projection(scenario: &str, mut expected: Value) -> Value { let object = expected .as_object_mut() .expect("expected output is an object"); @@ -276,11 +333,86 @@ fn production_projection(mut expected: Value) -> Value { .as_array_mut() .expect("artifact requests are an array") { - request["supHandle"] = Value::String("safe:sup:lab-sup-01".to_owned()); + request["supHandle"] = Value::String(synthetic_identity("subject", "safe:sup:lab-sup-01")); + } + let (manifest, _) = raw_scenario(scenario); + let mut replacements = manifest["artifacts"] + .as_array() + .into_iter() + .flatten() + .filter_map(|artifact| artifact["artifactId"].as_str()) + .map(|artifact_id| { + ( + artifact_id.to_owned(), + synthetic_identity("artifact", artifact_id), + ) + }) + .collect::>(); + replacements.push(( + "safe:sup:lab-sup-01".to_owned(), + synthetic_identity("subject", "safe:sup:lab-sup-01"), + )); + canonicalize_projection_strings(&mut expected, &replacements); + if let Some(coverage) = expected["coverage"].as_array_mut() { + coverage.sort_by(|left, right| { + left["artifactId"] + .as_str() + .cmp(&right["artifactId"].as_str()) + }); + } + for transaction in expected["transactions"] + .as_array_mut() + .into_iter() + .flatten() + { + if let Some(artifact_ids) = transaction["coverageGapArtifactIds"].as_array_mut() { + artifact_ids.sort_by(|left, right| left.as_str().cmp(&right.as_str())); + } + } + for observation in expected["sourceLocalObservations"] + .as_array_mut() + .into_iter() + .flatten() + { + let Some(artifact_id) = observation["artifactIds"] + .as_array() + .and_then(|artifact_ids| artifact_ids.first()) + .and_then(Value::as_str) + .map(str::to_owned) + else { + continue; + }; + let suffix = match observation["classification"].as_str() { + Some("rotationSplit") => "01-split", + Some("malformedEvidence") => "02-malformed", + _ => continue, + }; + observation["observationId"] = Value::String(format!("{artifact_id}-{suffix}")); } expected } +fn canonicalize_projection_strings(value: &mut Value, replacements: &[(String, String)]) { + match value { + Value::String(text) => { + for (raw, canonical) in replacements { + *text = text.replace(raw, canonical); + } + } + Value::Array(values) => { + for value in values { + canonicalize_projection_strings(value, replacements); + } + } + Value::Object(values) => { + for value in values.values_mut() { + canonicalize_projection_strings(value, replacements); + } + } + _ => {} + } +} + fn empty_client_updates_analysis() -> SccmClientUpdatesAnalysis { SccmClientUpdatesAnalysis { schema_version: 1, @@ -323,7 +455,7 @@ fn every_committed_scenario_runs_through_the_exported_production_analyzer() { assert_eq!( actual, - production_projection(expected), + production_projection(scenario, expected), "scenario {scenario}" ); } @@ -359,7 +491,13 @@ fn accepted_sup_rotation_split_triggers_the_typed_correlation_guard() { == SccmSoftwareUpdatePointSourceLocalClassification::RotationSplit }) .expect("accepted endpoint emits the typed rotation split"); - assert_eq!(split.observation_id, "sync-01-split"); + assert_eq!( + split.observation_id, + format!( + "{}-01-split", + synthetic_identity("artifact", "sync-success-01-wcm") + ) + ); assert!(!split.observation_id.contains("rotation")); let updates = empty_client_updates_analysis(); @@ -488,7 +626,7 @@ fn required_coverage_gap_overrides_retry_deferred_classification() { assert_eq!(transaction["confidence"], "low"); assert_eq!( transaction["coverageGapArtifactIds"], - serde_json::json!(["incomplete-02-wsync-denied"]) + serde_json::json!([synthetic_identity("artifact", "incomplete-02-wsync-denied")]) ); } @@ -520,7 +658,7 @@ fn coverage_gaps_and_requests_are_scoped_to_the_exact_sup_subject() { assert_eq!( serialized["artifactRequests"], serde_json::json!([{ - "supHandle": "synthetic:subject:sup-01", + "supHandle": synthetic_identity("subject", "synthetic:subject:sup-01"), "sourceId": "server-sup-sync", "reasonCode": "coverageAccessDenied", }]) diff --git a/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md b/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md index fdb4b1cc5..8185426b4 100644 --- a/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md +++ b/docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md @@ -4,7 +4,7 @@ **Goal:** Remove fixture-specific server-intake identity allowlists while keeping synthetic and production manifests privacy-safe and fail-closed. -**Architecture:** Keep declared source IDs owned by the server source catalog, rather than duplicating them in intake. Synthetic artifact, lineage, path, host, and subject identities use a domain-bound `synthetic::sha256.v1:<64 lowercase hex>` contract, so fixture labels cannot become public identities. Synthetic topology uses `S` site codes and SCCM role hosts such as `S01-CM01`; production remains opaque-handle-only. Malformed, Unicode, or identity-bearing strings are rejected before public projection. +**Architecture:** Keep declared source IDs owned by the server source catalog, rather than duplicating them in intake. Synthetic artifact, lineage, path, host, and subject identities use a domain-bound `synthetic::sha256.v1:<64 lowercase hex>` contract, so fixture labels cannot become public identities. Synthetic topology uses three-character uppercase site codes and SCCM role hosts such as `LAB-CM01`; the host validator proves ASCII and binds the host site to the declared site before parsing its role/ordinal. Production remains opaque-handle-only. Malformed, Unicode, or identity-bearing strings are rejected before public projection. **Tech Stack:** Rust, Serde, existing `cmtraceopen-parser` SCCM server catalog/intake modules, Cargo tests, Clippy, rustfmt. @@ -14,7 +14,10 @@ - `crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs` owns declared server source-ID membership. - `crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs` owns generic synthetic/opaque identity validation and topology normalization. +- `crates/cmtraceopen-parser/src/sccm/server/windows/hierarchy.rs` binds the synthetic hierarchy profile to reviewed payload digests rather than fixture artifact IDs. +- `crates/cmtraceopen-parser/src/sccm/server/windows/management_point.rs` accepts the new opaque synthetic host namespace without a fixture-host literal. - `crates/cmtraceopen-parser/tests/sccm_server_intake.rs` proves generic synthetic acceptance plus rejection of malformed and identity-bearing values. +- `crates/cmtraceopen-parser/tests/sccm_hierarchy_reducer.rs` proves the opaque fixture identities survive the downstream semantic adapter. ### Task 1: Prove generic synthetic identities and privacy rejection @@ -107,6 +110,8 @@ fn synthetic_identity(value: &str, domain: &str) -> bool { Use them for the identity-bearing fields and links. Keep `safe_original_path_marker`, opaque SHA-256 production handles, canonical role/source classification, payload binding, and path-collision checks unchanged. +Migrate committed intake identities and downstream canonical-intake builders to the same contract. Bind the reviewed hierarchy profile to payload digests only, so a new conforming fixture identity does not require a production allowlist edit. + - [x] **Step 3: Run focused tests** Run: `cargo test -p cmtraceopen-parser --test sccm_server_intake` @@ -117,18 +122,24 @@ Expected: PASS (66 tests), including accepted generic synthetic values, the four **Files:** - Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs` +- Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/distribution_point.rs` +- Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/hierarchy.rs` - Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs` +- Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/management_point.rs` +- Modify: `crates/cmtraceopen-parser/src/sccm/server/windows/site_core.rs` - Modify: `crates/cmtraceopen-parser/tests/sccm_server_intake.rs` +- Modify: downstream canonical-intake builders and exact fixture oracles under `crates/cmtraceopen-parser/tests/` - Modify: `docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md` -- Modify: `library.md` -- [ ] **Step 1: Format and run targeted verification** +- [x] **Step 1: Format and run targeted verification** Run: ```bash -rustfmt --check crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs crates/cmtraceopen-parser/tests/sccm_server_intake.rs +rustfmt --check $(git diff --name-only -- '*.rs') cargo test -p cmtraceopen-parser --test sccm_server_intake +cargo test -p cmtraceopen-parser --test sccm_hierarchy_reducer +cargo test -p cmtraceopen-parser --test issue_413_unicode_panics cargo test -p cmtraceopen-parser cargo clippy -p cmtraceopen-parser --all-targets -- -D warnings git diff --check origin/main...HEAD @@ -136,11 +147,11 @@ git diff --check origin/main...HEAD Expected: every command exits zero. -- [ ] **Step 2: Commit the isolated change** +- [x] **Step 2: Commit the isolated change** ```bash -git add library.md docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md crates/cmtraceopen-parser/src/sccm/server/windows/catalog.rs crates/cmtraceopen-parser/src/sccm/server/windows/intake.rs crates/cmtraceopen-parser/tests/sccm_server_intake.rs -git commit -m "fix(sccm): remove fixture identity allowlists from intake" +git add docs/superpowers/plans/2026-08-05-sccm-409-server-intake-identity-grammar.md crates/cmtraceopen-parser +git commit -m "fix(sccm): seal synthetic intake identities" ``` ## Self-review