Files
Aether/apps/aether-gateway/tests/architecture/admin_observability.rs
T
AAEE86 3394a51278 ci(gateway): slim Test (Gateway) batch 1 — split architecture guards, pin build fingerprint
第一批减负(对应 docs/operations/gateway-ci-timeout-reduction-plan.md):

A1 架构守卫迁出
- 将 src/tests/architecture/**(208 项 / 约 1.5 万行字符串断言)迁至
  tests/architecture/,入口 tests/architecture_guard.rs
- 从 lib cfg(test) 巨型编译单元移除,压低 rustc 峰值与 OOM 风险
- 断言逻辑不变;helper 可见性改为 pub(crate)

A2 构建指纹统一
- test_gateway 的 mold RUSTFLAGS / RUST_MIN_STACK / sccache 上移至 job 级 env
- rust-ci.yml 全部 toolchain 钉住 1.95.0(与 rust-toolchain.toml、fmt/clippy 一致)
- Gateway 独立 cache key,避免 mold 指纹与无 mold job 互相污染

A4 补安全集成测试
- 新增 Test integration targets:cargo nextest run -p aether-gateway --tests
- 覆盖 architecture_guard + 此前未执行的 admin_unsigned_identity_headers

验证:architecture_guard + admin_unsigned 209 passed;
cargo check -p aether-gateway --lib --tests 通过;cargo fmt --check 通过。

不创建 PR,仅本地分支提交。
2026-09-23 17:51:45 +08:00

671 lines
26 KiB
Rust

use super::*;
#[test]
fn non_admin_handlers_do_not_depend_on_admin_stats_module() {
let handlers_mod = read_workspace_file("apps/aether-gateway/src/handlers/mod.rs");
assert!(
!handlers_mod.contains("pub(crate) use admin::{"),
"handlers/mod.rs should stay as pure module wiring after shared usage stats facade extraction"
);
for path in [
"apps/aether-gateway/src/handlers/public/support/user_me.rs",
"apps/aether-gateway/src/handlers/public/support/wallet/reads.rs",
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_store.rs",
] {
let file = read_workspace_file(path);
assert!(
!file.contains("handlers::admin::stats::"),
"{path} should not depend directly on admin::stats"
);
}
let admin_mod = read_workspace_file("apps/aether-gateway/src/handlers/admin/mod.rs");
assert!(
!admin_mod.contains("pub(crate) mod facade;"),
"handlers/admin/mod.rs should not keep admin facade after direct subdomain exposure"
);
let shared_mod = read_workspace_file("apps/aether-gateway/src/handlers/shared/mod.rs");
for pattern in [
"admin_stats_bad_request_response",
"parse_bounded_u32",
"round_to",
"AdminStatsTimeRange",
"AdminStatsUsageFilter",
] {
assert!(
shared_mod.contains(pattern),
"handlers/shared/mod.rs should expose shared usage stats helper {pattern}"
);
}
assert!(
!shared_mod.contains("list_usage_for_optional_range"),
"handlers/shared/mod.rs should not expose unbounded usage range helpers"
);
let admin_observability_mod =
read_workspace_file("apps/aether-gateway/src/handlers/admin/observability/mod.rs");
for pattern in [
"aggregate_usage_stats",
"match_admin_monitoring_route",
"AdminMonitoringRoute",
"ADMIN_MONITORING_REDIS_REQUIRED_DETAIL",
"test_support",
] {
assert!(
!admin_observability_mod.contains(pattern),
"handlers/admin/observability/mod.rs should not re-export {pattern}"
);
}
for pattern in [
"admin_stats_bad_request_response",
"parse_bounded_u32",
"round_to",
"AdminStatsTimeRange",
"AdminStatsUsageFilter",
] {
assert!(
admin_observability_mod.contains(pattern),
"handlers/admin/observability/mod.rs should expose admin stats facade helper {pattern}"
);
}
for pattern in ["list_usage_for_optional_range", "list_usage_for_range"] {
assert!(
!admin_observability_mod.contains(pattern),
"handlers/admin/observability/mod.rs should not re-export deprecated usage helper {pattern}"
);
}
let shared_usage_stats =
read_workspace_file("apps/aether-gateway/src/handlers/shared/usage_stats.rs");
assert!(
shared_usage_stats.contains("crate::admin_api::{"),
"handlers/shared/usage_stats.rs should depend on crate::admin_api facade directly"
);
}
#[test]
fn admin_monitoring_root_stays_thin() {
let monitoring_mod = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/mod.rs",
);
for pattern in [
"mod common;",
"use self::activity::{",
"use self::cache::{",
"use self::resilience::{",
"use self::trace::{",
"pub(crate) use self::routes::{",
"const ADMIN_MONITORING_",
] {
assert!(
!monitoring_mod.contains(pattern),
"handlers/admin/observability/monitoring/mod.rs should not act as a glue re-export layer for {pattern}"
);
}
assert!(
monitoring_mod.contains("routes::maybe_build_local_admin_monitoring_response"),
"handlers/admin/observability/monitoring/mod.rs should delegate through routes module"
);
assert!(
monitoring_mod.contains("mod cache_config;"),
"handlers/admin/observability/monitoring/mod.rs should register cache_config as a dedicated cache boundary"
);
assert!(
monitoring_mod.contains("mod cache_mutations;"),
"handlers/admin/observability/monitoring/mod.rs should register cache_mutations as a dedicated mutation boundary"
);
assert!(
!monitoring_mod.contains("mod responses;"),
"handlers/admin/observability/monitoring/mod.rs should not keep local monitoring responses after crate split"
);
assert!(
!workspace_file_exists(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/common.rs",
),
"handlers/admin/observability/monitoring/common.rs should stay removed after boundary split"
);
assert!(
!workspace_file_exists(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/responses.rs",
),
"handlers/admin/observability/monitoring/responses.rs should stay removed after crate split"
);
let monitoring_routes = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/routes.rs",
);
for pattern in [
"use aether_admin::observability::monitoring::{",
"match_admin_monitoring_route",
"AdminMonitoringRoute",
] {
assert!(
monitoring_routes.contains(pattern),
"handlers/admin/observability/monitoring/routes.rs should depend on crate-owned monitoring seam {pattern}"
);
}
for pattern in [
"pub(crate) enum AdminMonitoringRoute",
"pub(crate) fn match_admin_monitoring_route(",
] {
assert!(
!monitoring_routes.contains(pattern),
"handlers/admin/observability/monitoring/routes.rs should not keep local monitoring route matcher {pattern}"
);
}
}
#[test]
fn admin_stats_root_stays_thin() {
let stats_mod =
read_workspace_file("apps/aether-gateway/src/handlers/admin/observability/stats/mod.rs");
for pattern in [
"use self::leaderboard::{",
"enum AdminStatsComparisonType",
"enum AdminStatsGranularity",
"struct AdminStatsForecastPoint",
"struct AdminStatsLeaderboardItem",
"struct AdminStatsUserMetadata",
"struct AdminStatsTimeSeriesBucket",
"impl AdminStatsTimeRange {",
"pub(crate) fn round_to(",
"mod helpers;",
"mod responses;",
"mod timeseries;",
"pub(crate) use self::helpers::{round_to, AdminStatsTimeRange, AdminStatsUsageFilter};",
"pub(crate) use self::responses::admin_stats_bad_request_response;",
"pub(crate) use self::timeseries::aggregate_usage_stats;",
] {
assert!(
!stats_mod.contains(pattern),
"handlers/admin/observability/stats/mod.rs should not own stats helper implementation {pattern}"
);
}
for pattern in [
"pub(crate) use aether_admin::observability::stats::{",
"admin_stats_bad_request_response",
"aggregate_usage_stats",
"round_to",
"AdminStatsTimeRange",
"AdminStatsUsageFilter",
] {
assert!(
stats_mod.contains(pattern),
"handlers/admin/observability/stats/mod.rs should stay as a thin seam for {pattern}"
);
}
assert!(
stats_mod.contains("pub(crate) use self::range::{"),
"handlers/admin/observability/stats/mod.rs should re-export the split range seam"
);
let pattern = "parse_bounded_u32";
assert!(
stats_mod.contains(pattern),
"handlers/admin/observability/stats/mod.rs should keep range re-export {pattern}"
);
for pattern in ["list_usage_for_optional_range", "list_usage_for_range"] {
assert!(
!stats_mod.contains(pattern),
"handlers/admin/observability/stats/mod.rs should not re-export deprecated range helper {pattern}"
);
}
let analytics_routes = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/stats/analytics_routes.rs",
);
for pattern in [
"use aether_admin::observability::stats::{",
"AdminStatsComparisonType",
"build_admin_stats_comparison_response",
] {
assert!(
analytics_routes.contains(pattern),
"stats/analytics_routes.rs should depend on crate-owned stats helper {pattern}"
);
}
assert!(
!analytics_routes.contains("use super::helpers::{")
&& !analytics_routes.contains("use super::responses::{")
&& !analytics_routes.contains("use super::timeseries::{"),
"stats/analytics_routes.rs should no longer depend on local stats pure bridges"
);
assert!(
analytics_routes.contains("use super::range::{")
|| analytics_routes.contains("use super::range::build_comparison_range;"),
"stats/analytics_routes.rs should depend on the split stats range seam"
);
let cost_routes = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/stats/cost_routes.rs",
);
for pattern in [
"use super::range::{",
"use aether_admin::observability::stats::{",
"build_admin_stats_cost_forecast_response",
] {
assert!(
cost_routes.contains(pattern),
"stats/cost_routes.rs should depend on crate-owned stats helper {pattern}"
);
}
assert!(
!cost_routes.contains("use super::helpers::{")
&& !cost_routes.contains("use super::responses::{")
&& !cost_routes.contains("use super::timeseries::{"),
"stats/cost_routes.rs should no longer depend on local stats pure bridges"
);
let leaderboard_routes = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/stats/leaderboard_routes.rs",
);
for pattern in [
"use super::leaderboard::{",
"use super::range::{",
"use aether_admin::observability::stats::{",
"admin_stats_leaderboard_empty_response",
] {
assert!(
leaderboard_routes.contains(pattern),
"stats/leaderboard_routes.rs should depend on explicit local/crate owner {pattern}"
);
}
assert!(
!leaderboard_routes.contains("use super::helpers::{")
&& !leaderboard_routes.contains("use super::responses::{"),
"stats/leaderboard_routes.rs should no longer depend on local stats pure bridges"
);
let provider_quota_routes = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/stats/provider_quota_routes.rs",
);
assert!(
provider_quota_routes.contains("use aether_admin::observability::stats::{")
|| provider_quota_routes.contains(
"use aether_admin::observability::stats::admin_stats_provider_quota_usage_empty_response;",
),
"stats/provider_quota_routes.rs should depend on crate-owned responses directly"
);
}
#[test]
fn admin_monitoring_cache_mutations_are_split_from_reads() {
let monitoring_cache = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache.rs",
);
for pattern in [
"pub(super) async fn build_admin_monitoring_cache_users_delete_response(",
"pub(super) async fn build_admin_monitoring_cache_affinity_delete_response(",
"pub(super) async fn build_admin_monitoring_cache_flush_response(",
"pub(super) async fn build_admin_monitoring_cache_provider_delete_response(",
"pub(super) async fn build_admin_monitoring_model_mapping_delete_response(",
"pub(super) async fn build_admin_monitoring_model_mapping_delete_model_response(",
"pub(super) async fn build_admin_monitoring_model_mapping_delete_provider_response(",
"pub(super) async fn build_admin_monitoring_redis_keys_delete_response(",
] {
assert!(
!monitoring_cache.contains(pattern),
"monitoring/cache.rs should stay focused on read/report handlers, not {pattern}"
);
}
let monitoring_cache_mutations = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations/mod.rs",
);
for pattern in [
"mod users;",
"mod affinity;",
"mod flush;",
"mod provider;",
"mod model_mapping;",
"mod redis_keys;",
"pub(super) use users::build_admin_monitoring_cache_users_delete_response;",
"pub(super) use affinity::build_admin_monitoring_cache_affinity_delete_response;",
"pub(super) use flush::build_admin_monitoring_cache_flush_response;",
"pub(super) use provider::build_admin_monitoring_cache_provider_delete_response;",
"pub(super) use model_mapping::{",
"pub(super) use redis_keys::build_admin_monitoring_redis_keys_delete_response;",
] {
assert!(
monitoring_cache_mutations.contains(pattern),
"monitoring/cache_mutations/mod.rs should own {pattern}"
);
}
assert!(
!workspace_file_exists(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations.rs"
),
"monitoring/cache_mutations.rs should stay removed after directory split"
);
let monitoring_routes = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/routes.rs",
);
assert!(
monitoring_routes.contains("use super::cache_mutations::{"),
"monitoring/routes.rs should depend on cache_mutations directly for delete handlers"
);
assert!(
monitoring_routes.contains("use super::cache_affinity_reads::{"),
"monitoring/routes.rs should depend on cache_affinity_reads directly for affinity read handlers"
);
assert!(
monitoring_routes.contains("use super::cache_model_mapping::{"),
"monitoring/routes.rs should depend on cache_model_mapping directly for model-mapping read handlers"
);
let monitoring_mod = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/mod.rs",
);
for pattern in ["mod cache_affinity_reads;", "mod cache_model_mapping;"] {
assert!(
monitoring_mod.contains(pattern),
"monitoring/mod.rs should register split read module {pattern}"
);
}
let monitoring_affinity_reads = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_affinity_reads.rs",
);
for pattern in [
"pub(super) async fn build_admin_monitoring_cache_affinities_response(",
"pub(super) async fn build_admin_monitoring_cache_affinity_response(",
] {
assert!(
monitoring_affinity_reads.contains(pattern),
"monitoring/cache_affinity_reads.rs should own {pattern}"
);
}
let monitoring_model_mapping = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_model_mapping.rs",
);
for pattern in [
"pub(super) async fn build_admin_monitoring_model_mapping_stats_response(",
"pub(super) async fn build_admin_monitoring_redis_cache_categories_response(",
] {
assert!(
monitoring_model_mapping.contains(pattern),
"monitoring/cache_model_mapping.rs should own {pattern}"
);
}
}
#[test]
fn admin_monitoring_route_payloads_prefer_crate_owned_builders() {
for (path, pattern) in [
(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/activity.rs",
"build_admin_monitoring_system_status_payload_response",
),
(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/trace.rs",
"build_admin_monitoring_trace_provider_stats_payload_response",
),
(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience/history.rs",
"build_admin_monitoring_circuit_history_payload_response",
),
(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience/status.rs",
"build_admin_monitoring_resilience_status_payload_response",
),
(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience/reset.rs",
"build_admin_monitoring_reset_error_stats_payload_response",
),
(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations/flush.rs",
"build_admin_monitoring_cache_flush_success_response",
),
(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations/provider.rs",
"admin_monitoring_cache_provider_not_found_response",
),
(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations/model_mapping.rs",
"build_admin_monitoring_model_mapping_delete_success_response",
),
(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_mutations/redis_keys.rs",
"build_admin_monitoring_redis_keys_delete_success_response",
),
] {
let file = read_workspace_file(path);
assert!(
file.contains("use aether_admin::observability::monitoring::{")
|| file.contains("use aether_admin::observability::monitoring::"),
"{path} should depend on aether_admin::observability::monitoring"
);
assert!(
file.contains(pattern),
"{path} should route payload building through crate-owned helper {pattern}"
);
}
}
#[test]
fn admin_usage_root_stays_thin() {
let usage_mod =
read_workspace_file("apps/aether-gateway/src/handlers/admin/observability/usage/mod.rs");
for pattern in ["pub(crate) use analytics::{", "pub(crate) use helpers::{"] {
assert!(
!usage_mod.contains(pattern),
"handlers/admin/observability/usage/mod.rs should not re-export helper seam {pattern}"
);
}
for pattern in [
"mod analytics;",
"mod analytics_routes;",
"mod detail_routes;",
"mod replay;",
"mod summary_routes;",
"detail_routes::maybe_build_local_admin_usage_detail_response",
"summary_routes::maybe_build_local_admin_usage_summary_response",
"analytics_routes::maybe_build_local_admin_usage_analytics_response",
] {
assert!(
usage_mod.contains(pattern),
"handlers/admin/observability/usage/mod.rs should stay as a thin router for {pattern}"
);
}
let analytics_mod = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics/mod.rs",
);
for pattern in [
"mod aggregations;",
"mod cache_affinity;",
"mod filters;",
"pub(super) use aggregations::admin_usage_aggregation_by_user_json;",
"pub(super) use cache_affinity::list_usage_cache_affinity_intervals;",
"pub(super) use filters::admin_usage_provider_key_names;",
] {
assert!(
analytics_mod.contains(pattern),
"usage/analytics/mod.rs should keep explicit analytics owner seam {pattern}"
);
}
for pattern in [
"mod parse;",
"admin_usage_aggregation_by_model_json",
"admin_usage_parse_limit",
"admin_usage_matches_search",
] {
assert!(
!analytics_mod.contains(pattern),
"usage/analytics/mod.rs should not keep pure crate forwarders {pattern}"
);
}
assert!(
!workspace_file_exists(
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics.rs"
),
"usage/analytics.rs should be removed once analytics is directoryized"
);
let analytics_routes = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics_routes/mod.rs",
);
assert!(
analytics_routes.contains("mod aggregation;"),
"usage/analytics_routes/mod.rs should register aggregation owner"
);
assert!(
analytics_routes.contains("mod cache_affinity_hit_analysis;"),
"usage/analytics_routes/mod.rs should register cache_affinity_hit_analysis owner"
);
assert!(
analytics_routes.contains("mod cache_affinity_interval_timeline;"),
"usage/analytics_routes/mod.rs should register cache_affinity_interval_timeline owner"
);
assert!(
analytics_routes.contains("mod cache_affinity_ttl_analysis;"),
"usage/analytics_routes/mod.rs should register cache_affinity_ttl_analysis owner"
);
assert!(
analytics_routes.contains("mod heatmap;"),
"usage/analytics_routes/mod.rs should register heatmap owner"
);
assert!(
analytics_routes.contains("aggregation::build_admin_usage_aggregation_stats_response"),
"usage/analytics_routes/mod.rs should delegate aggregation handling to aggregation owner"
);
assert!(
!workspace_file_exists(
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics_routes.rs"
),
"usage/analytics_routes.rs should stay removed after directory split"
);
let summary_routes = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/usage/summary_routes.rs",
);
assert!(
summary_routes.contains("use super::analytics::admin_usage_provider_key_names;"),
"usage/summary_routes.rs should keep only the local stateful analytics lookup"
);
assert!(
summary_routes.contains("use aether_admin::observability::usage::{"),
"usage/summary_routes.rs should depend on crate-owned usage helpers directly"
);
let detail_routes = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/usage/detail_routes.rs",
);
assert!(
detail_routes.contains("use super::analytics::admin_usage_provider_key_names;"),
"usage/detail_routes.rs should keep only the local stateful analytics lookup"
);
assert!(
detail_routes.contains("use aether_admin::observability::usage::{"),
"usage/detail_routes.rs should depend on crate-owned usage helpers directly"
);
let replay =
read_workspace_file("apps/aether-gateway/src/handlers/admin/observability/usage/replay.rs");
assert!(
replay.contains("use aether_admin::observability::usage::{"),
"usage/replay.rs should depend on crate-owned usage helpers directly"
);
let analytics_aggregations = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics/aggregations.rs",
);
assert!(
analytics_aggregations
.contains("pub(in super::super) async fn admin_usage_aggregation_by_user_json("),
"usage/analytics/aggregations.rs should keep only the local user aggregation owner"
);
let analytics_cache_affinity = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics/cache_affinity.rs",
);
assert!(
analytics_cache_affinity
.contains("pub(in super::super) async fn list_usage_cache_affinity_intervals("),
"usage/analytics/cache_affinity.rs should own cache-affinity analytics helpers"
);
let analytics_filters = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics/filters.rs",
);
assert!(
analytics_filters.contains("pub(in super::super) async fn admin_usage_provider_key_names("),
"usage/analytics/filters.rs should keep only the local provider key lookup"
);
assert!(
!workspace_file_exists(
"apps/aether-gateway/src/handlers/admin/observability/usage/helpers.rs"
),
"usage/helpers.rs should stay removed after crate split"
);
assert!(
!workspace_file_exists(
"apps/aether-gateway/src/handlers/admin/observability/usage/analytics/parse.rs"
),
"usage/analytics/parse.rs should stay removed after crate split"
);
}
#[test]
fn admin_monitoring_snapshots_stay_app_local() {
let monitoring_cache_types = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/cache_types.rs",
);
for pattern in [
"pub(super) struct AdminMonitoringCacheSnapshot",
"pub(super) struct AdminMonitoringCacheAffinityRecord",
] {
assert!(
monitoring_cache_types.contains(pattern),
"monitoring/cache_types.rs should own {pattern}"
);
}
let monitoring_resilience = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience/mod.rs",
);
assert!(
monitoring_resilience.contains("mod history;"),
"monitoring/resilience/mod.rs should register history owner"
);
assert!(
monitoring_resilience.contains("mod snapshot;"),
"monitoring/resilience/mod.rs should register snapshot owner"
);
assert!(
monitoring_resilience.contains("mod status;"),
"monitoring/resilience/mod.rs should register status owner"
);
assert!(
monitoring_resilience.contains("mod reset;"),
"monitoring/resilience/mod.rs should register reset owner"
);
assert!(
!workspace_file_exists(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience.rs"
),
"monitoring/resilience.rs should stay removed after directory split"
);
let resilience_snapshot = read_workspace_file(
"apps/aether-gateway/src/handlers/admin/observability/monitoring/resilience/snapshot.rs",
);
assert!(
resilience_snapshot.contains("AdminMonitoringResilienceSnapshot"),
"monitoring/resilience/snapshot.rs should keep resilience snapshot ownership locally"
);
assert!(
resilience_snapshot.contains("pub(super) struct AdminMonitoringResilienceSnapshot"),
"monitoring/resilience/snapshot.rs should define AdminMonitoringResilienceSnapshot locally"
);
let data_system = read_workspace_file("crates/aether-data/runtime/src/repository/system.rs");
assert!(
!data_system.contains("AdminMonitoringCacheSnapshot")
&& !data_system.contains("AdminMonitoringResilienceSnapshot"),
"monitoring snapshots are admin view DTOs and should not move into aether-data"
);
}