Skip to main content

strontium_core/
api.rs

1pub mod runtime {
2    pub use crate::clock::Clock;
3    pub use crate::executor::{Reactor, TaskHandle};
4    pub use crate::futures::Interval;
5    pub use crate::rng::Rng;
6    pub use crate::runtime::{DeterministicControl, Runtime, RuntimeFuture, TaskFuture};
7}
8
9pub mod sim {
10    pub use crate::sim::{
11        AsyncFileSystem, DeserializeError, DispatchRegistry, LinkConfig, Network, NetworkClock,
12        NetworkDeliveryReport, PartitionId, ReproBundle, Rng, RouteOutcome, RoutedActorEvent,
13        SchedulerBench, TraceBuffer, TraceConfig, TraceEvent, TraceMetadata, Vfs, WriteFault,
14        dispatch_ready_actor_events,
15    };
16}
17
18pub mod artifacts {
19    pub use crate::artifacts::{
20        Config, DecisionTrace, DecisionTraceEntry, MetricsSnapshot, ReplayRecord, ReproBundle,
21        RunLimits, RunRecord, RunResult, TraceBuffer, TraceConfig, TraceEvent, TraceMetadata,
22        TraceSummary, legacy_run_result_from_record, run_record_from_legacy,
23    };
24}
25
26pub mod outcome {
27    pub use crate::outcome::{
28        Config, InvariantFailure, InvariantViolation, Outcome, RunConfig, RunOutcome, RunResult,
29    };
30}
31
32/// Compatibility surface retained during migration to layered facades.
33///
34/// New code should prefer `runtime`, `sim`, and `artifacts`.
35#[deprecated(note = "use strontium_core::api::{runtime, sim, artifacts} instead")]
36pub mod core {
37    pub use super::artifacts::{ReproBundle, TraceBuffer, TraceConfig, TraceEvent, TraceMetadata};
38    pub use super::runtime::{Clock, Interval, Reactor, Rng, TaskHandle};
39    pub use super::sim::{
40        AsyncFileSystem, DeserializeError, DispatchRegistry, LinkConfig, Network, NetworkClock,
41        NetworkDeliveryReport, PartitionId, RouteOutcome, RoutedActorEvent, SchedulerBench, Vfs,
42        WriteFault, dispatch_ready_actor_events,
43    };
44}
45
46/// Compatibility surface retained during assurance extraction.
47///
48/// New code should prefer `strontium_assurance::api`.
49#[deprecated(note = "use strontium_assurance::api instead")]
50pub mod assurance {
51    pub use crate::assurance::{
52        ActorLifecycleRecord, ActorMessageDisposition, ActorMessageRecord, AlloyContractMetadata,
53        AssertionResult, AssuranceCertificationStarterPackArtifact,
54        AssuranceCertificationStarterPackBuilder, CacheEventRecord, ChecklistBinding,
55        ContextServiceEvidence, ContextServiceEvidenceProducer, EvidenceChecklistItem,
56        EvidenceCollectionAudience, EvidenceCollectionPackage, EvidenceCollectionScenarioRecord,
57        EvidenceCollectionWorkflowArtifact, EvidenceCollectionWorkflowBuilder, EvidenceLevel,
58        FailureClassification, FlagshipChecklistAttachment, FlagshipReleaseEvidenceInput,
59        FlagshipReleaseEvidencePacket, FlagshipReleaseEvidencePacketBuilder,
60        FlagshipReleaseScenarioEvidence, IntegratedHarnessEvidenceArtifact,
61        IntegratedHarnessEvidenceBuilder, IntegratedHarnessEvidenceInput,
62        IntegratedHarnessScenarioRecord, IridiumContractReport, IridiumIntegratedHarnessReport,
63        IridiumRestartRequeryEvidenceV1, IridiumServiceCandidateReport,
64        IridiumServiceLifecycleReport, MetricSnapshot, OwnershipLane, PlexusValidateReport,
65        ProducerEvidence, PublishedScenarioPackEntry, PublishedScenarioPackPreview,
66        PublishedScenarioPackPreviewBuilder, ReleaseEvidenceLevel, ReleaseGateArtifact,
67        ReleaseGateBuilder, ReleaseGateDecision, ReleaseGateInput, ReleaseGateScenarioRecord,
68        ReplayBundle, ReplayBundleBuilder, RequiredArtifact, RhodiumCacheEvaluatorReport,
69        RhodiumCachePathReport, RhodiumCompiledPlanCacheReport, RhodiumQuicFaultReport,
70        RhodiumServiceCandidateArtifact, RhodiumServiceStatusReport, RichProducerEvidence,
71        ScenarioClass, ScenarioExecution, ScenarioManifest, ScenarioPack, ScenarioPackPreview,
72        ScenarioPackPreviewBuilder, ScenarioPackPreviewEntry, ScenarioPreconditions,
73        ScenarioResult, ServiceReleaseEvidenceRequirements,
74        ServiceReleaseEvidenceRequirementsBuilder, ServiceReleaseEvidenceScenario,
75        ShippedScenarioPackArtifact, ShippedScenarioPackBuilder, ShippedScenarioPackEntry,
76        StarterPackDocument, StorageOperationRecord, SupportingArtifact, TimelineEvent,
77        TopologyPacketReference, TraceSummary, ValidationError,
78    };
79}
80
81/// Compatibility surface retained during migration to neutral run outcomes.
82///
83/// New code should prefer `outcome`.
84#[deprecated(note = "use strontium_core::api::outcome instead")]
85pub mod run {
86    pub use super::outcome::{Config, InvariantViolation, Outcome, RunResult};
87}
88
89#[cfg(test)]
90#[allow(deprecated)]
91mod tests {
92    use super::{artifacts, assurance, core, outcome, run, runtime, sim};
93
94    #[test]
95    fn core_facade_exposes_cleaned_names() {
96        let _clock = core::Clock::new();
97        let _reactor = core::Reactor::new(7);
98        let _interval: Option<core::Interval> = None;
99        let _task_handle: Option<core::TaskHandle> = None;
100        let _network: core::Network<u64, u64> = core::Network::new(11);
101        let _vfs = core::Vfs::new();
102        let _rng = core::Rng::new(13);
103        let _bench = core::SchedulerBench::new();
104        let _network_clock = core::NetworkClock::new();
105        let _delivery_report = core::NetworkDeliveryReport::default();
106        let _deserialize_error = core::DeserializeError::InvalidPayload;
107        let _route_outcome = core::RouteOutcome::Delivered;
108    }
109
110    #[test]
111    fn run_facade_exposes_cleaned_names() {
112        let config = run::Config::default();
113        let outcome = run::Outcome::Ok;
114
115        let _result = run::RunResult {
116            seed: 0,
117            virtual_time_elapsed: config.max_virtual_time,
118            steps_executed: 0,
119            outcome,
120            trace: core::TraceBuffer::new(core::TraceConfig::default()),
121            decision_log: Vec::new(),
122            repro_bundle: None,
123        };
124    }
125
126    #[test]
127    fn assurance_facade_exposes_sprint_3_types() {
128        let _class = assurance::ScenarioClass::RestartRecovery;
129        let _level = assurance::EvidenceLevel::ReleaseBlocking;
130        let _result = assurance::ScenarioResult::Pass;
131        let _pack = assurance::ScenarioPack {
132            manifests: Vec::new(),
133        };
134        let _builder = assurance::ReplayBundleBuilder::new(
135            "artifact-1",
136            "strontium",
137            "deadbeef",
138            "2026-03-13T00:00:00Z",
139            "2026-03-13T00:00:01Z",
140        );
141    }
142
143    #[test]
144    fn runtime_facade_exposes_layered_contracts() {
145        let reactor = runtime::Reactor::new(19);
146        let _clock = runtime::Clock::new();
147        let _rng = runtime::Rng::new(23);
148        let _interval = runtime::Runtime::create_interval(&reactor, std::time::Duration::ZERO);
149        let _seed = runtime::DeterministicControl::seed(&reactor);
150        let _task_handle: Option<runtime::TaskHandle> = None;
151    }
152
153    #[test]
154    fn sim_facade_exposes_simulation_services() {
155        let _bench = sim::SchedulerBench::new();
156        let _vfs = sim::Vfs::new();
157        let _network = sim::Network::<u64, u64>::new(29);
158        let _rng = sim::Rng::new(31);
159        let _trace = sim::TraceBuffer::new(sim::TraceConfig::default());
160        let _network_clock = sim::NetworkClock::new();
161        let _delivery_report = sim::NetworkDeliveryReport::default();
162        let _deserialize_error = sim::DeserializeError::InvalidPayload;
163        let _route_outcome = sim::RouteOutcome::Delivered;
164    }
165
166    #[test]
167    fn artifacts_facade_exposes_neutral_aliases() {
168        let limits = artifacts::RunLimits::default();
169        let _config = artifacts::Config::default();
170        let _record = artifacts::RunRecord {
171            seed: 0,
172            virtual_time_elapsed: limits.max_virtual_time,
173            steps_executed: 0,
174            outcome: run::Outcome::Ok,
175            trace: artifacts::TraceBuffer::new(artifacts::TraceConfig::default()),
176            decision_log: Vec::new(),
177            repro_bundle: None,
178        };
179        let _replay: Option<artifacts::ReplayRecord> = None;
180        let _decision_trace: artifacts::DecisionTrace = vec![0];
181        let _decision: artifacts::DecisionTraceEntry = 0;
182        let _summary: Option<artifacts::TraceSummary> = None;
183        let _metrics: Option<artifacts::MetricsSnapshot> = None;
184        let _round_trip = artifacts::legacy_run_result_from_record(
185            artifacts::run_record_from_legacy(run::RunResult {
186                seed: 1,
187                virtual_time_elapsed: limits.max_virtual_time,
188                steps_executed: 2,
189                outcome: run::Outcome::Ok,
190                trace: artifacts::TraceBuffer::new(artifacts::TraceConfig::default()),
191                decision_log: vec![1, 2],
192                repro_bundle: None,
193            }),
194        );
195    }
196
197    #[test]
198    fn outcome_facade_exposes_neutral_result_names() {
199        let config = outcome::Config::default();
200        let _run_config = outcome::RunConfig::default();
201        let _outcome = outcome::RunOutcome::Ok;
202        let _legacy_outcome = outcome::Outcome::Ok;
203        let _run_result = outcome::RunResult {
204            seed: 0,
205            virtual_time_elapsed: config.max_virtual_time,
206            steps_executed: 0,
207            outcome: outcome::RunOutcome::Ok,
208            trace: artifacts::TraceBuffer::new(artifacts::TraceConfig::default()),
209            decision_log: Vec::new(),
210            repro_bundle: None,
211        };
212        let _failure = outcome::InvariantFailure::DuplicatePath {
213            engine_idx: 0,
214            path: "svc/a".to_string(),
215        };
216    }
217}